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.

Je ne peux pas poster le descripteur dès maintenant, parce que l'appareil réside dans mon bureau. De toute façon il y a certainement deux points de terminaison dans le descripteur de - un sur chacun des deux interfaces. Les deux interfaces fournir au moins un rapport de sortie contenant les états de bouton de l'appareil. Au moins ces rapports définissent 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