12
votes

Mode utilisateur Transfert isochrone USB du périphérique à l'hôte

J'essaie actuellement d'interfacer avec un périphérique audio USB à partir de Terre de l'utilisateur. J'ai actuellement l'appareil entièrement énuméré et j'ai défini l'interface et définir l'interface alternative à l'interface interface interface interface alternative à bande passante-bande.

Tout d'abord, je dois dire que je ne peux pas utiliser quoi que ce soit comme librusb. Je dois faire cela via le système de fichiers de périphérique USB de Linux. P>

Aussi autant que je puisse dire que je suis prêt à commencer à recevoir des données isochrones. Cependant, je peux trouver très peu d'informations sur la manière de faire un transfert isochrone. P>

de ce que je peux dire, j'ai besoin de peupler une structure USBDEVFS_URB, mais je ne sais pas parfaitement à remplir cette structure. p>

En outre, une fois que j'ai rempli cette structure, je suis juste en pensant que je dois appeler ce qui suit: p> xxx pré>

et une fois soumis, je peux attendre pour la demande Pour compléter en utilisant P>

<7>[ 3184.243163] usb 1-1: usbfs: usb_submit_urb returned -28


5 commentaires

@Jim Clay Parce que la plate-forme spécifique en question est Android et j'ai déjà un descripteur de fichier ouvert et je ne peux pas, en raison des autorisations, ouvrez un périphérique utilisant libusb ...


Salut Goz, je tente actuellement de résoudre le même problème - celui des transferts isochrones sur Android, évitant la librose. Y a-t-il une façon de poster un échantillon de code de travail? Mon point de collage est actuellement des définitions de struct et des valeurs de demande. Où allez-vous les rechercher? Merci d'avance.


@Gusdor: c'est assez compliqué. Fondamentalement, j'ai tout travaillé de la documentation disponible à USB.org ... à un moment donné, je pourrais réellement se rendre à faire pour faire Une API de style Android pour les transferts isochrones qui collabore avec l'API USB Android. C'est beaucoup de travail, cependant, et je préférerais ne pas passer le temps à moins que je puisse demander à quelqu'un de payer pour cela;) j'ai une version de librusb qui m'a été transmise qui ne nécessite pas la racine si ...


Pas de soucis, @goz. J'ai commencé à brancher la spécification audio USB le week-end. Il lit plus fort que ce n'est donc sûr que je vais y arriver. Supprimer le pilote HID reste un "Pro Tip", merci!


@Goz J'ai encore une autre question que j'essaie toujours de craquer les transferts ISO. IOCTL définit errno sur '2'. Ceci n'est apparemment pas un code valide pour IOCTL, mais cela me fait suspecter que mon adresse de terminaison ou mon descripteur de fichier est incorrect. J'ai lu des choses intéressantes sur Marshalling FileDscriptor à utiliser dans le code natif, mais interrogé sur le numéro est compliqué par la classe FileDescriptor et l'API de colis. J'appelle USBConnection.getFileDeScriptor (): Int. Est-ce correct?


3 Réponses :


3
votes

Je comprends la seule raison pour laquelle vous n'utilisez pas libusb est que vous ne pouvez pas ouvrir le périphérique USB par vous-même, mais vous avez un descripteur de fichier pointant dessus.

Si tout est correct, pourquoi essayez-vous de ré-implémenter tout ce qu'il existe dans LibusB au lieu de simplement mettre en oeuvre la fonction USB_OPEN () qui prendrait un descripteur de fichier comme argument et votre structure USB_Device *. Vous pouvez prendre la majeure partie du code du code source libusb_open () et utiliser libusb pour le reste.


4 commentaires

Je ne comprends pas votre problème avec le LGPL, développez-vous un logiciel exclusif? Si tel est le cas, vous pouvez toujours le lier avec une bibliothèque LGPL, par opposition à une bibliothèque GPL. Si je me souviens bien, la seule obligation que je me souvienne correctement, si je me souviendrais de manière à fournir un moyen de relier une autre bibliothèque. Si vous distribuez un binaire lié dynamiquement, vous n'avez pas de problème. Si vous fournissez un binaire lié statiquement lié, vous devriez alors fournir le fichier d'objet de votre binaire afin que les gens puissent relier facilement quelque chose d'autre.


Hélas je ne comprends pas ce choix.


Comme cela se produit, j'ai expérimenté Libusb. J'ai enraciné mon appareil et je peux obtenir aussi loin que la soumission d'une demande ISOC. Alors ... devine quoi? errno = 28 :(


Le craqué. Consultez ma réponse si vous êtes intéressé à déterminer ce que le problème était!



5
votes

OK, il s'avère donc que le problème est dû au fait que le système d'exploitation Android a placé un pilote HID pour gérer les commandes de HID. Cela semble bloquer la bande passante. Détacher ces pilotes à partir des interfaces HID libère la bande passante permettant au transfert isochrone de procéder.

Vous détachez le pilote du noyau en procédant comme suit: xxx

sinon ce que j'ai fait est correct.


0 commentaires

1
votes

J'ai écrit une classe Java pour le mode utilisateur USB transfert isochrone USB: USBISO

Il utilise JNA pour accéder au USBFS API via des appels IOCTL.


0 commentaires