Je voulais me mettre au développement noyau, mais je ne savais pas par où commencer, alors un sage m’a dit: « pour apprendre rien de tel que de le faire: vous achetez un petit périphérique USB et vous en écrivez le driver. »
Ma réponse a été: « effectivement, je n’y avais pas pensé, en général on utilise la libusb pour ce genre de choses. »
Un périphérique USB
Et voila que quelques jours après, sans avoir trouvé de périphérique sympa je me suis dit, mais pourquoi pas le faire aussi ?
Comme je vous l’ai déjà raconté, j’ai déjà bricolé un périphérique USB: l’USBtinyISP, donc je suis allé rechercher le code original de usbtiny et je me suis monté un petit prototype avec 4 LED et 2 boutons:
Bon plutôt que d’utiliser un ATtiny, j’ai pris un ATmega8 histoire d’avoir un peu de place pour y ajouter du code plus tard 😉 (l’ATtiny2313 est déjà super plein pour l’USBtinyISP).
Et voila le schéma (en image, les sources gschem sont sous git dans le répertoire sch
):
Une fois le montage prêt, quelques lignes de code basées sur l’exemple de tinyusb et hop un firmware pour l’ATmega (à la racine du projet).
Qu’il a fallut tester, hop la première méthode évoquée plus haut, quelques lignes de code avec libusb, disponible dans le répertoire test
, m’ont permis de parfaire le firmware 😉
Voila, tout marche, on va pouvoir entrer dans le vif du sujet.
Le gestionnaire de périphérique Linux
En fait j’ai tout simplement suivi et adapté les tutoriels suivants:
- /dev/hello_world: A Simple Introduction to Device Drivers under Linux par Valerie Henson
- Writing a Simple USB Driver de Greg Kroah-Hartman
En regardant la version de usbled.c
présente dans les sources de Linux afin de mettre à jour les derniers détails.
Cela donne un driver qui ajoute les pseudo-fichiers leds
et keys
dans le répertoire du périphérique déjà créé dans /sys/bus/usb/
par le noyau Linux.
Voila ! Vous je sais pas mais moi j’ai appris plein de choses ! 😉
Tout le code est disponible sous GPL2 et GPL2+ sur mon gitweb: jvdg_usbgadget.git
Pour le nom un peu égocentrique, c’était surtout pour éviter tout risque de conflit, comme de toutes façons ceci n’a pas vocation à être intégré dans Linux (le périphérique utilise un ID USB réservé aux prototypes, donc inutilisable en grande série…)