Comment utiliser l'interface de liaison / dissociation du pilote du noyau Linux pour les périphériques USB-HID?

26

Premier historique. Je développe un pilote pour les périphériques de console de jeu Logitech. C'est un clavier avec un écran dessus. Le pilote fonctionne bien mais par défaut, le périphérique est géré par HID. Afin d'empêcher HID de prendre le contrôle de l'appareil avant mon pilote, je peux le mettre sur liste noire dans hid-core.c. Cela fonctionne mais n'est pas la meilleure solution car je travaille avec plusieurs personnes et nous devons tous continuer à patcher notre module HID qui devient une corvée, d'autant plus qu'il implique souvent de reconstruire des initramfs et autres.

J'ai fait quelques recherches sur ce problème et j'ai trouvé ce message sur la liste de diffusion , qui m'a finalement conduit à cet article sur LWN . Ceci décrit un mécanisme pour lier des périphériques à des pilotes spécifiques lors de l'exécution. Cela semble être exactement ce dont j'ai besoin.

Alors je l'ai essayé. J'ai pu dissocier le clavier de HID. Cela a fonctionné et comme prévu, je ne pouvais plus taper dessus. Mais lorsque j'ai essayé de le lier à notre pilote, j'obtiens "erreur: aucun périphérique de ce type" et l'opération échoue.

Ma question est donc la suivante: comment utiliser les opérations de liaison / dissociation du noyau pour reproduire ce qui se passe lorsque vous mettez sur liste noire un périphérique HID dans hid-core et fournissez votre propre pilote? - c'est-à-dire - pour remplacer la nécessité de patcher hid-core.c tout le temps?

La source de notre pilote est ici: https://github.com/ali1234/lg4l

ali1234
la source

Réponses:

27

Ok, il s'avère que la réponse me fixait en face.

Premièrement, que vous utilisiez notre pilote personnalisé ou que vous utilisiez le pilote générique qui prend normalement le contrôle de l'appareil, tout est finalement contrôlé par HID, et non par USB.

Auparavant, j'ai essayé de le dissocier de HID, ce qui n'est pas la voie à suivre. HID a des sous-pilotes, celui qui prend en charge les périphériques sans pilote spécialisé est appelé generic-usb. C'est ce dont j'avais besoin pour me dissocier, avant de me lier à hid-g19. De plus, je devais utiliser l'adresse HID qui ressemble à "0003: 046d: c229.0036" et non l'adresse USB qui ressemble à "1-1.1: 1.1".

Donc, avant de relier, je verrais ceci sur dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Alors je fais:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

Et puis je vois sur dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Donc, comme je l'ai dit, me regarder en face, parce que les deux informations clés sont les deux premières choses sur la ligne lorsque l'appareil se lie ...

ali1234
la source
Avez-vous dû spécifier dans votre pilote que ce fournisseur / produit est compatible avec votre pilote? Ou est-ce que la "liaison" force simplement le problème. Je reçois «aucun appareil de ce type» pour un appareil qui a été mis sur liste noire, mais je veux le forcer à être lié, et j'imagine que la liste noire n'est pas seulement une pensée «empêcher la liaison automatique», mais une «empêcher la liaison nomatter quel "type de chose.
dmansfield
Bind le force, il n'est donc pas nécessaire de réclamer les ID dans la source du pilote. C'est si vous voulez qu'il se charge automatiquement cependant.
ali1234
Deux raisons pour lesquelles j'ai eu des problèmes: premièrement - le périphérique est répertorié dans la liste hid_ignore_list du noyau et il ne sera donc pas lié à "hid". J'ai dû ajouter "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" à la ligne de commande du noyau et redémarrer. L'indicateur 0x40000000 est "ne pas ignorer". Deuxièmement, la dernière partie de l'ID «0003: 046D: C229.0036» est «0036». Qu'est-ce que cela représente? Pas certain. La seule façon de le trouver (semble-t-il) est de l'avoir déjà lié, puis de le délier et de le relier.
dmansfield
Avez-vous trouvé un moyen de vous relier automatiquement?
Vladius
Ajout de ma propre solution de reliure automatique
Vladius