2016-04-11 3 views
0

J'ai un périphérique USB HID qui peut fonctionner dans deux modes différents. La sélection des modes est basée sur la séquence des paquets d'énumération/initialisation USB qui lui sont envoyés. J'utilise un Raspbian Raspberry Pi 3 en cours d'exécution, mais je vois aussi le même problème si je compile mon code pour ma distribution Ubuntu de bureau. Le problème est que Linux reconnaît le périphérique USB en tant que périphérique HID et envoie ensuite la séquence de commandes qu'il juge nécessaire pour démarrer le périphérique, et cela fonctionne correctement et démarre le périphérique en mode 1.Comment empêcher Linux d'initialiser un périphérique HID USB?

Cependant, j'ai besoin de démarrer l'appareil en "Mode 2" et pour ce faire, j'ai besoin d'envoyer un ensemble légèrement différent de commandes d'énumération/initialisation.

Je suis nouveau sur Linux mais très expérimenté avec LibUSB et LibUSBDotNet sous windows et peux obtenir le comportement que je désire sous windows.

Windows a un comportement similaire à celui de Linux en ce qu'il va énumérer, reconnaître le périphérique comme un périphérique USB HID et l'initialiser comme il le souhaite, ce qui fait que le périphérique passe en "Mode 1". Pour empêcher Windows de faire cela, je peux créer un pilote de filtre LibUSB pour le périphérique, qui remplace ensuite le pilote par défaut, donc Windows va maintenant faire l'énumération initiale, réaliser que le VID et le PID du périphérique sont gérés par le pilote de filtre LibUSB que le pilote HID Windows), puis arrêter l'énumération/l'initialisation - cela permet à mon code de prendre le relais et de terminer l'initialisation en "Mode 2". Comment puis-je empêcher Linux de complètement énumérer/initialiser ce périphérique (comme je le fais avec Windows). Peut-être que j'ai besoin de faire quelque chose avec les règles d'udev ou quelque chose, mais je n'aurais aucune idée de ce que je suis nouveau à linux.

Toute aide grandement appréciée

+0

est-détacher du noyau et de faire votre propre magie à la fin d'un changement de mode 2? – dryman

Répondre

1

vous avez droit, vous devez jouer avec les règles udev.

Tout d'abord, vous devez identifier votre appareil. Trouvez l'idProduct et l'idVendor de votre appareil. Vous pouvez utiliser:

lsusb 

ensuite dans le dossier rules.d (/etc/udev/rules.d) créer un nouveau fichier avec le nom:

10-my-usb.rules 

Dans ce fichier, ajoutez cette ligne

SUBSYSTEM=="usb",ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", MODE="666", GROUP+="plugdev" 

Remplacer XXXX avec la valeur que vous obtenez avant

Ensuite, redémarrez vos règles udev:

sudo udevadm trigger 

; débranchez et rebranchez normalement vous pouvez l'utiliser