Création driver USB sous Linux

Salut à tous,

Je développe un petit driver USB sous Linux pour un circuit que j’ai réalisé autour d’un microcontrolleur PIC 18F4455.

Etant donné que mon problème semble venir du driver Linux, je pose mon problème dans ce forum et non dans le formum matos :stuck_out_tongue:

Bon je vous explique le tout.

Numéro d’ID de ma carte.
Je n’ai pas les sous pour déposer un ID USB et que je ne compte pas vendre mon prototype, j’ai pris un ID facile à mémoriser et non utilisé. J’ai donc choisi:
Vendor: ff07 (comme Final Fantasy 7 :stuck_out_tongue: )
Device: 0010 (comme… version 1.0)

Mon circuit semble marcher correctement, du moins en ce qui concerne la détection par l’ordinateur, car lorsque je le branche et que je fais un lsusb, j’obtiens:
Bus 001 Device 010: ID ff07 0010

Mon circuit passe successivement les états: ATTACHED_STATE, ADR_PENDING_STATE, ADDRESS_STATE, CONFIGURED_STATE. Donc ça semble marcher.

Pour le driver j’ai utilisé comme base usb-skeleton.c, fourni avec les sources du kernel.
J’ai juste modifié quelques détails, mais surtout les constantes VID et PID. Pour l’instant je ne m’attaque pas à la suite, je veux que mon driver détecte la connexion du device.
Je compile mon driver en suivant les instructions d’ICI.
Tout se passe bien aucune erreur à la création du module.

Je charge mon driver avec un insmod mondriver.ko. Ca marche, je le vois se charger quand je fais un dmesg.

Et enfin, normalement quand je branche mon device, la fonction probe devrait s’exécuter (d’après ce que j’ai compris) car l’USB core détecte que le driver correspond au device via les IDs (voir pages ~350 du PDF).

Seulement non, il semble ne pas se charger. Pour en être sûr j’ai mis un petit printk dans la fonction probe, et jamais il n’est lu (le texte du printk n’apparaît pas dans dmesg).

Je précise que c’est mon premier driver 2.6. J’oublie peut être quelque chose ou il y a quelque chose que je ne comprends pas.

Si il y des pros de l’USB et des drivers Linux qui peuvent m’aider ou orienter mes recherches, ça me serait bien utile car je bloque un peu là :stuck_out_tongue:

Je vous remercie, bye!

T’as d’autres périphériques USB ? C’est ptet un problème d’agent secret !

Tout d’abord merci, grâce à ton post je viens de m’apercevoir qu’il y avait une nouvelle édition de l’excellent Linux Device Drivers, et ça c’est bien car comme l’auteur le dit dans la préface, pas mal de choses ont changé avec le kernel 2.6. Ensuite, vraiment bien, car ils se basent sur le 2.6.10 et c’est celui que j’utilise aussi … :stuck_out_tongue:

Maintenant concernant ton driver, je ne peux pas t’aider vu que je développe personnellement un driver pour un capteur camera, donc rien à voir.

Par contre j’ai écrit un petit soft il n’y a pas longtemps qui utilisait un petit chip USB et j’avais utilisé pour les accès USB la libusb. Un paquet doit sûrement exister pour ta distribution, tu l’installes, tu passes l’option -lusb à la compilation de ton programme et c’est dans la poche.

Je sais pas si tu as absolument besoin d’un driver, en tous cas, jettes-y un coup d’oeil, c’est assez sympa. Mais j’espère quand même que tu pourras résoudre ton problème.

Merci de vos réponses, je cherche toujours :stuck_out_tongue:

Longfield > je ne connaissait pas cette librairie je vais me renseigner dessus.

Flyoc > j’ai essayé de faire en sorte que mon driver exécute sa fonction probe quand je relie une Webcam logitech (en mettant les ID de la webcam). Ca ne marche pas. C’est peut être dû au fait que Linux a déjà le driver de la Webcam (car quand je fais un lsmod ya un logitech machin).
Donc mon driver a un souci. Si vous voulez je vous l’envoie mais en gros c’est usb-skeleton.c + les ID changés + quelques printk pour debugger. Donc c’est pas très utile.

Je n’arrive pas à trouver de documentation intéressante quant à l’utilisation de libusb au sein de mon programme. Avez vous des sites qui pourraient m’aider?

Lorsque je viens de lancer Linux, et que je fais un insmod mon_module.ko pour la première fois, j’obtiens ça dans dmesg:

Ensuite je connecte mon device, j’obtiens alors ceci:

[quote][4294823.878000] usb 2-1: new full speed USB device using ohci_hcd and address 2
[4294823.999000] /home/bluelambda/documents/travail/midi_usb/driver/ifmidi.c: Could not find both bulk-in and bulk-out endpoints
[4294823.999000] skeleton: probe of 2-1:1.0 failed with error -12
[4294824.005000] ifmidi: registrationifmidi: dev registered<6>/home/bluelambda/documents/travail/midi_usb/driver/ifmidi.c: USB Skeleton device now attached to USBSkel-192
[4294824.449000] drivers/usb/class/cdc-acm.c: This device cannot do calls on its own. It is no modem.
[4294824.449000] cdc_acm: probe of 2-1:1.0 failed with error -16
[4294824.449000] usbcore: registered new driver cdc_acm
[4294824.449000] drivers/usb/class/cdc-acm.c: v0.23:USB Abstract Control Model driver for USB modems and ISDN adapters[/quote]
Il y a donc des erreurs que je vais tenter de corriger.
J’ai bien un point d’entrée dans /dev en tout cas.
Ce point d’entrée disparaît à la déconnexion du device.

Par la suite, si je fais un rmmod mon_module.ko, la commande semble marcher, mais après si je fais à nouveau un insmod mon_module.ko, dans le dmesg je m’aperçois que lorsque je reconnecte mon device, la fonction probe de mon module ne s’exécute plus. Et plus de point d’entrée dans /dev.

Je dois donc mal m’y prendre pour décharger le module puisque au second chargement il ne fonctionne plus.

Si vous avez des remarques à propos de ce problème ou à propos de mon dmesg, n’hésitez pas ça me servira sûrement car je suis un peu en terrain inconnu là :stuck_out_tongue:

EDIT: mon driver étant bien basé sur usb-skeleton, je n’ai pas changé le nom dans le code, donc dans le dmesg quand il y a écrit skeleton il s’agit bien de mon driver :stuck_out_tongue:

Bon, après expérience plus approfondie, le driver n’a aucun problème.

J’ai retrouvé un vieux balladeur MP3 dont Linux ne dispose pas du driver, j’ai rentré ses ID usb dans mon driver, celui-ci est bien “probé” et “déprobé” à chaque connexion / déconnexion du device.
Son point d’entrée dans /dev apparaît et disparaît comme il faut et je peux dialoguer avec il semblerai (commandes dd et echo).

Le souci vient donc de mon circuit.
D’après les erreurs obtenues dans le dmesg, le driver n’arrive pas à trouver sur quels endpoints IN et OUT communiquer avec ma carte. Je vais donc revoir le programme de mon microcontrôlleur…

Je n’ai pas encore essayé libusb car je ne trouve aucune doc intéressante pour s’en servir en programmation.
De plus le driver USB que je veux faire étant relativement simple, je pense que je devrais m’en sortir avec usb-skeleton comme base.