libusb interruption de transfert
J'ai besoin de désosser un pilote personnalisés HID périphérique USB (certains boutons et des led sur un panneau de contrôle). Le pilote n'est disponible que sur Windows et nous avons besoin d'un *nix mise en œuvre.
L'appareil est apparemment un périphérique HID bien que n'étant pas d'une classe particulière. Il fournit deux interfaces, chacune avec une seule interruption de point de terminaison.
Mon installation comporte actuellement une VirtualBox exécuter Windows sur Ubuntu hôte pour capturer le trafic USB via Wireshark. Le protocole est assez simple et j'ai déjà acquis une assez bonne compréhension.
Je suis à l'aide de libusb-1.0 dans une simple console C++ programme pour le prototypage. J'ai déjà réussi à bascule LEDs par l'émission d'un SET_REPORT de contrôle de transfert, mais peinent à recevoir appuie sur un bouton via interruption des transferts.
En fait l'appel suivant bloque toujours:
unsigned char bytes[8] = { 0 };
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0);
Lors de l'inspection du résultant URB dans Wireshark il ressemble exactement à l'équivalent capturé lors de la session Windows. Pourtant, je n'obtiens jamais de réponse de l'appareil.
Je suis tombé je suis absent de certains paramètres. Notez que l'appareil est correctement ouvert et les deux interfaces fournies par le périphérique a été relevé revendiquée. Saisie de rapports par des moyens de contrôle des transferts venant de l'auge, même dans mon application linux.
Merci pour tout pointeur!
Arne
Addendum I:
Je me demande comment suis-je censé indiquer le rapport id je veux recevoir lors de l'utilisation de libusb_interrupt_transfer()
?
Addendum II:
Lorsque l'on compare les demandes formulées par le pilote windows à celui généré par le code ci-dessus dans Wireshark, je ne vois pas la différence (même valeurs dans URB). Mais encore, seulement lorsqu'il est émis par le pilote Windows de l'interruption de transfert de retours.
Lors de l'inspection du pilote Windows communication dans Wireshark je ne vois aucun contrôle des transferts d'autre que divers GET_DESCRIPTOR(...)
. Le plus important: pas de SET_INTERFACE
ou SET_CONFIGURATION
Donc je soupçonne que le problème est lié à la bibliothèque ou comment je l'utilise et il est pas liées à l'appareil.
Usage Buttons
.avez-vous essayé d'utiliser hidapi?
Je pensais moi-même que
libusb_interrupt_transfer
bloquaient tout jamais, même si j'avais fixé un délai pour 500ms. Mais quand mon pilote simple raccroché après j'ai commenté la ligne de production; Donc j'ai inséré quelques debug-prints ici et là et a trouvé que libusb_open
se bloque jamais, quel que soit l'appareil que j'ai émis. Zut, faut-il vraiment besoin d'être aussi dur pour obtenir int x,y,pressure,button_state;
numériques à partir d'un stylet de la tablette? Sérieusement, c'est exagéré 🙂OriginalL'auteur Arne | 2011-06-25
Vous devez vous connecter pour publier un commentaire.
Il y a un problème avec le code que vous avez posté. La syntaxe que vous avez écrit pour la définition de
bytes
n'entraînera pas un 8-tableau d'octets, mais vous demandez à ce que libusb écrire 8 octets à cette adresse afin que vous pouvez obtenir une erreur ou d'une corruption de la mémoire. Essayez plutôt ceci:Chaque HID rapport a son propre point de terminaison, afin de vous indiquer le rapport que vous souhaitez recevoir en spécifiant le point de terminaison correct. Vous avez spécifié le point de Terminaison 1 (0x81). Êtes-vous sûr que le point de terminaison est défini dans l'appareil de descripteurs? Peut-être que vous devriez obtenir les descripteurs (avec
lsusb -v
dans Ubuntu) et les poster ici afin que nous puissions les vérifier.unsigned char buffer[8]
. Merci pour l'astuce, de toute façon.OriginalL'auteur David Grayson