vendredi 4 janvier 2019

Chapitre 53 : Baremetal utilisation d'un clavier, autonomie du Raspberry


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.