Cette question est double:
Tout d'abord, comment détachez-vous manuellement un pilote d'un appareil USB et joignez-vous un autre? Par exemple, j'ai un périphérique que lorsqu'il est connecté utilise automatiquement le pilote de stockage USB.
Vendor Id: xxxx
Product Id: xxxx
...
Number of Interfaces: 2
Interface Number: 0
Name: usb-storage
Number of Endpoints: 2
...
Interface Number: 1
Name: (none)
Number of Endpoints: 2
...
Je ne veux pas utiliser le pilote de stockage USB, donc dans mon application, j'utilise la bibliothèque libusb
pour détacher le pilote de stockage USB, puis je revendique l'interface. Je peux alors envoyer des données à et à partir des applications exécutées sur mon périphérique USB et sur mon système d'hôte Linux.
Comment détachez-vous un conducteur manuellement en dehors d'une application?
Deuxièmement, comment attribuez-moi automatiquement le pilote à joindre sur le plugin de périphérique? J'ai actuellement une configuration de la règle UDev pour définir automatiquement les autorisations de périphérique:
SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"
Puis-je utiliser des règles UDev pour attribuer des pilotes à des interfaces spécifiques sur le périphérique USB? Par exemple, si je voulais que le module USBNET soit utilisé automatiquement sur l'interface 0 au lieu de stockage USB, est-ce possible à Udev?
Pour la première partie de la question, j'ai regardé et n'a pas pu trouver un meilleur moyen de détacher un conducteur USB que ce que vous faites déjà avec libusb.
Quant à la deuxième partie de la question, Udev peut réagir au chargement du conducteur, mais pas force Un pilote spécifique à affecter à un périphérique.
Chaque pilote du noyau Linux est responsable d'un ou plusieurs appareils. Le conducteur lui-même choisit les appareils qu'il soutient. Cela fait cela par programme, c'est-à-dire en vérifiant le fournisseur et l'ID de produit de l'appareil, ou si ceux-ci ne sont pas disponibles (par exemple un ancien périphérique), effectuant des contrôles de détection automatique et de vérification de la santé. Une fois que le conducteur est confiant, il est trouvé un périphérique qu'il supporte, il s'attache à celui-ci. En bref, vous ne pouvez souvent pas forcer un conducteur particulier à utiliser un appareil particulier. Parfois, cependant, un pilote de périphérique est généreux avec ce qu'il accepte et un périphérique peut fonctionner sur lequel il ne sait pas. Votre kilométrage variera! Dans le passé, j'ai dû ajouter manuellement des identifiants de périphérique/fournisseur bizarre aux pilotes qui devraient les soutenir, avec succès mixte et quelques accidents de noyau amusant.
Maintenant, dans le cas de modules, il y a une étape supplémentaire. Le chargeur de module est réveillé par le noyau lorsqu'un nouveau périphérique est détecté. Il est adopté une chaîne de modalias, qui identifie l'appareil et ressemble à quelque chose comme ceci pour les périphériques USB:
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
Cette chaîne contient la classe de périphérique (usb
) et des informations spécifiques à la classe (fournisseur/périphérique/numéro de série, classe de périphériques, etc.). Chaque pilote de noyau contient une ligne telle que:
MODULE_ALIAS("usb:...")
Qui doit correspondre aux USBALIAS (Wildcards sont utilisés pour correspondre à plusieurs périphériques). Si le modalias
correspond à celui de la prise en charge du pilote, ce pilote est chargé (ou notifié du nouveau périphérique, s'il y a déjà déjà).
Vous pouvez voir les périphériques supportés (par modalias) et leurs modules associés avec
less /lib/modules/`uname -r`/modules.alias
Si vous Grep pour le pilote de périphérique USB-Storage, vous verrez que cela dispose de périphériques spécifiques qu'il prend en charge par le fournisseur et l'ID de périphérique et tentera également de prendre en charge tout appareil avec la classe droite (stockage), quel que soit le fournisseur/périphérique. .
Vous pouvez influencer cela à l'aide de mécanismes d'espace utilisateur sur votre système d'exploitation (/etc/modprobe.d/
sur Debian et des amis). Vous pouvez les modules de liste noire ou vous pouvez spécifier des modules à charger par modalias, tout comme le modules.alias
Fichier (et en utilisant la même syntaxe). depmod -a
va ensuite régénérer les modèles du chargeur de module.
Cependant, même si vous pouvez mener ce cheval particulier à l'eau, mais vous ne pouvez pas le faire boire. Si le pilote n'a aucun support pour votre appareil, cela devrait l'ignorer.
C'est la théorie dans le cas général.
En pratique, et dans le cas de USB, je vois que votre appareil semble avoir deux interfaces, dont le stockage est un. Le noyau s'attachera au stockage interface de l'appareil global. Si l'autre interface a la bonne classe, le pilote usbnet
pourrait y fixer. Oui, vous pouvez avoir plusieurs pilotes attachés au même physique périphérique, car un périphérique USB exporte plusieurs interfaces (par exemple, mon clavier Logitech G15 exporte deux parce qu'il a Un périphérique de clavier et un LCD, chacun d'entre eux est traité par un pilote séparé).
Le fait que la deuxième interface de votre périphérique USB ne soit pas détectée témoigne d'un manque de soutien dans le noyau. Quoi qu'il en soit, vous pouvez répertorier les interfaces de périphérique/points d'extrémité dans les détails arscumains à l'aide de lsusb -v | less
, puis faites défiler jusqu'à votre périphérique particulier (vous pouvez limiter la sortie par périphérique: ID de fournisseur ou chemin USB si vous êtes tellement enclin).
Veuillez noter: Je suis trop simplifié ici en ce qui concerne la structure logique des périphériques USB. Blâmer le consortium USB. :)