Donc après de nombreuses heures d’effort, de multiples tests
avec différents drivers et clavier, et de 2 cartes SD détériorées à force de
les rentrer et sortir des connecteurs, j’ai réussi à faire fonctionner un
clavier sur le port USB du Raspberry.
Au final, j’ai utilisé un driver USB écrit en langage C et
trouvé sur github à l’adresse :
Merci beaucoup au développeur de ces programmes. Pour celui
qui veut les utiliser, il faut télécharger tout le projet, le décompresser dans
un répertoire de votre pc puis recompiler ( par gcc) les dossiers lib et env
pour créer 2 librairies libuspi.a libuspienv.a. Remarque : la
documentation est très très succincte mais les fonctions fournies permettent de
gérer le clavier, la souris, une clé (je ne l’ai pas testé) et d’autres
périphériques.
Il faut auparavant modifier quelques paramètres comme
indiqué dans la brève documentation pour prendre en compte le type de Raspberry,
le type de clavier (français) etc. Je n’ai eu aucun problème pour compiler ces
projets.
Les 2 librairies seront recopiées dans le projet du Raspberry
et il faudra modifier le makefile pour que le linker les prenne en compte.
Dans notre nouveau projet, copié de nos précédents projets,
il faut modifier le fichier boot.s pour autoriser les interruptions FIQ et IRQ
(voir instruction ligne 69) puis dans le module kernel.s, ajouter une nouvelle
commande « clavier » qui effectuera le nouveau traitement.
En utilisant l’exemple en C donné par le projet uspi de
github, nous programmons l’appel aux fonctions d’initialisation de
l’environnement et du port USB. Nous testons si cela se passe bien puis nous
vérifions la bonne détection du clavier et de la souris. S’ils sont présents,
nous appelons une fonction d’enregistrement de notr procédure à appeler si une
touche a été enfoncée ou si un bouton de la souris a été cliqué.
Ici, pour le clavier, nous nous contentons d’enregistrer les
touches dans un buffer jusqu’à l’appui de la touche <enter> et nous
affichons ce buffer par notre fonction uart_send_string. Pour la souris, nous
nous contentons d’afficher le contenu des registres.
Cela nous permet de tester différents claviers et souris, de
vérifier les valeurs des touches etc. Par exemple j’ai essayé d’ajouter le
caractère € euro dans le fichier keymap_fr.h (dans le dossier lib) mais sans
résultat. Si vous modifiez ce fichier pour corriger des touches, il faut penser
à supprimer l’objet keymap.o pour forcer la compilation avec le nouveau fichier
keymap_fr, recompiler la librairie libuspi.a et la recopier dans votre projet.
Maintenant que tout cela fonctionne, il nous faut réécrire
le module kernel.s pour ne plus passer par la mini uart mais rendre au
raspberry toute son autonomie.
Il faut commencer par mettre en place un affichage des
lignes sur l’écran relié au raspberry en utilisant le framebuffer. Donc nous
ajoutons dans le module framebuffer.s les instructions pour afficher les lignes
successivement. Il faut aussi prévoir un décalage des lignes lorsque l’écran
est plein. Mais rien n’est prévu pour afficher les premières lignes lorsque
celles-ci n’apparaissent plus à l’écran.
Ensuite nous créons un module usb.s qui contiendra les
appels aux fonctions d’initialisation de la librairie uspi. ATTENTION, cette
librairie est écrite en C et certaines fonctions d’initialisation modifient la
gestion du cache, de la mémoire et des interruptions. Ceci peut avoir des
conséquences sue vos propres initialisations. Ici dans ce programme, j’ai
constaté un écrasement de la mémoire dans la partie .data. Je n’ai pas trouvé
la raison mais j’ai du ajouté dans le module framebuffer.s un décalage (label
bidon J )
et une recopie de la table des message pour la mailbox. Il faudrait donc
creuser un peu plus pour stabiliser ce fonctionnement !!. Dans ce module,
nous ajoutons une fonction de lecture des touches et une fonction de lecture de
chaine de caractères qui appellera la fonction précédente. Ces fonctions sont succinctes !!!
car il manque la gestion de toutes les touches de fonction.
Dans les autres modules, j’ai laissé les appels à l’affichage
par la miniuart. Si nécessaire, il faut modifier ces fonctions pour afficher
les résultats sur l’écran.
Au niveau des commandes, je n’ai laissé que les commandes
rep, lecture, affiche comme exemple. Il ne vous reste plus qu’à compléter
suivant vos besoins !!!
Tout le projet est ici. Il est abondamment commenté pour être
facilement modifiable.