2008-10-08 13 views
4

La situation est la suivante: j'ai un périphérique USB (un périphérique personnalisé auquel j'essaie de parler) avec deux points de terminaison, l'un écrit sur l'appareil, l'autre sur l'appareil. Les deux sont des transferts en vrac. Chaque transaction de communication prend la forme de (1) Écrire une commande sur l'appareil (2) Lire la réponse. J'utilise libusb (version 0.1 plutôt que beta 1.0) pour effectuer les communications.Problème de lecture d'un périphérique avec libusb

Sur Windows, tout va bien. Je peux connecter l'appareil, revendiquer l'interface et communiquer avec bonheur. Cependant, dans Ubuntu (une installation standard de bureau Hardy), alors que je peux me connecter au périphérique et y écrire, toutes les opérations de lecture échouent avec l'erreur "erreur de soumission URB: argument invalide" rapporté de libusb (code d'erreur -22). Si je vérifie/var/log/messages, je vois un message d'avertissement enregistré en même temps que la tentative de lecture: "sysfs: nom de fichier dupliqué 'usbdev4.3_ep81' ne peut pas être créé" - qui correspond à l'appareil (C'est en effet sur ce bus et c'est le point final 81 que j'essaie de lire).

Alors ... quelqu'un a-t-il rencontré un problème similaire en utilisant libusb, ou avez-vous une idée de la façon de le résoudre?

Répondre

1

Je n'ai pas utilisé libusb depuis un certain temps - mais l'erreur sysfs indique qu'il s'agit vraisemblablement d'un problème de noyau plutôt que d'un problème de libusb, donc je commencerais par essayer de suivre celui-ci. (Il n'est pas très utile d'essayer de travailler avec libusb jusqu'à ce que vous soyez sûr que votre noyau communique correctement avec l'appareil).

Le correctif de http://kerneltrap.org/mailarchive/linux-usb-devel/2007/10/17/345922 s'applique-t-il à votre noyau? (Si oui, est-ce que cela résout le problème?)

+0

Je suis descendu dans le code, et il semble en effet être un problème au niveau du noyau (le code d'erreur se propage tout le long de l'appel ioctl qui devrait effectuer le transfert). Je vais jeter un coup d'oeil au patch et faire un rapport. À votre santé! – Throctukes

+0

Non, ne l'a pas réparé. J'ai appliqué le correctif et je vois toujours le même problème lors de l'utilisation du noyau corrigé.Ce qui est bizarre, car il semble que le correctif résout ce problème. – Throctukes

0

Vous pouvez essayer WinDriver c'est un outil commercial, mais avoir une évaluation complète de la fonction (en quelque sorte limitée dans le temps). Vous pouvez vérifier avec WinDriver et si le problème est reproductible, il peut s'agir d'un problème de périphérique ou de votre protocole. Vous n'avez pas donné suffisamment d'informations pour déterminer ou analyser.

+0

Je suis actuellement en train de sortir de WinDriver. Sur Windows, j'ai des communications sans problèmes en utilisant à la fois l'ancien code WinDriver et le nouveau code libusb. Je n'ai pas la version linux de WinDriver, et pour être honnête, ça va être une toute dernière étape pour l'obtenir. – Throctukes

1

J'ai dû faire un peu de piratage aux règles udev pour obtenir le périphérique créé avec les bonnes permissions pour que libusb fonctionne. Comme si:.

SUBSYSTEM=="usb" ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", \ 
       MODE="0666" SYMLINK+="missile_launcher" 

(C'était un lance-missiles USB je en train d'écrire un pilote pour

également cet extrait était nécessaire de ne pas entrer en conflit avec le noyau

if(LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP) 
{ 
    // Detach kernel driver (usbhid) from device interface. (Linux hack) 
    usb_detach_kernel_driver_np(launcher, 0); 
    usb_detach_kernel_driver_np(launcher, 1); 
} 

Je suis. Vous ne savez pas comment cela se rapporte à votre problème, mais au moins il y a deux points de défaillance possibles qui pourraient être impliqués:

+0

Ah, je vois que vous avez des permissions différentes pour le périphérique dans les règles udev (j'ai MODE = "660" mais aussi GROUP = "plugdev", ce qui devrait aboutir à la même chose ne devrait-il pas?). Où mettez-vous l'extrait par rapport au reste des appels? – Throctukes

+0

Devrait, tant que le programme est exécuté en tant que membre de plugdev. Mais alors encore "devrait" n'est pas exactement un fait fiable;) En ce qui concerne l'extrait, je l'ai juste après I usb_open() l'appareil avant de toucher à des configurations et des interfaces. –

+0

Essayé tous les deux, pas de joie. Je commence à me demander s'il y a peut-être un problème sur l'appareil qui est ignoré par Windows, mais que Linux boude. – Throctukes

2

Il s'avère que c'était une mauvaise configuration dans les descripteurs de l'appareil. lui-même. lsusb -v a montré une interface supplémentaire qui n'a jamais été utilisée, qui avait un seul point de terminaison isochrone 0x81. Comme cela n'a jamais été utilisé (et n'avait jamais été testé dans la mesure où je pouvais voir, donc très probablement même pas défini correctement) je l'ai enlevé des descripteurs de périphérique complètement (dans le firmware).

Et maintenant j'ai un périphérique entièrement fonctionnel. Pourquoi Linux a refusé de lire à partir de l'appareil, mais Windows a bien fonctionné, je ne sais pas, mais il m'a définitivement envoyé sur une chasse aux oies sauvage.