GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trouver le module du noyau pour un appareil donné ?

J'essaie de résoudre un problème :la souris USB ne fonctionne pas sur un Linux fraîchement installé.

Je soupçonne que le problème est qu'il n'y a pas de module/pilote de noyau approprié pour mon matériel USB. En effet :

$ lspci -knn
...
01:00.0 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Device [1022:43b9] (rev 02)
        Subsystem: ASMedia Technology Inc. Device [1b21:1142]
01:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] Device [1022:43b5] (rev 02)
        Subsystem: ASMedia Technology Inc. Device [1b21:1062]
        Kernel driver in use: ahci
...

Comme vous pouvez le voir, aucun pilote de noyau n'est signalé pour le périphérique de contrôleur USB (je suppose qu'il devrait être signalé d'une manière similaire au pilote signalé pour le contrôleur SATA)

Donc, j'ai besoin de reconstruire le noyau avec un module qui conviendrait à mon appareil. Mais comment puis-je savoir quel module dois-je construire ? J'ai des informations qui identifient mon appareil :il s'agit de l'identifiant du fournisseur et de l'identifiant du matériel ([1b21:43b9]). Comment trouver le nom du module noyau correspondant à partir de ces informations ?

Réponse acceptée :

L'ID PCI 1022:43b9 est un contrôleur xHCI USB 3.1 à chipset AMD X370 Series. L'ID de sous-système PCI 1b21:1142 suggère qu'il pourrait en fait s'agir d'un contrôleur ASMedia ASM1042A USB 3, éventuellement intégré au chipset AMD.

Pour la plupart des puces de contrôleur USB 3.x, le module de pilote approprié est xhci_pci qui dépend du module xhci_hcd . Ces deux modules font partie du noyau Linux standard, ils devraient donc être disponibles dans toutes les distributions Linux modernes. Les options de configuration du noyau correspondantes sont CONFIG_USB_XHCI_PCI et CONFIG_USB_XHCI_HCD .

De nombreuses distributions incluent le fichier de configuration du noyau sous la forme /boot/config-<kernel version number> . Ainsi, vous pouvez exécuter cette commande :

$ grep XHCI /boot/config-$(uname -r)
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_PCI=m
# CONFIG_USB_XHCI_PLATFORM is not set

Ici, les deux xhci_hcd et xhci_pci sont configurés pour être disponibles sous forme de modules. Si les lignes disaient ...=y à la place, le support USB 3 serait compilé dans le noyau principal.

PCI ID 1022:43b5, subsystem ID 1b21:1062 est un contrôleur AHCI SATA (ou eSATA), qui est déjà couvert par le module ahci .

Vous pouvez rechercher des ID PCI dans le référentiel d'ID PCI.

Si un pilote a été spécifié par des ID de fournisseur/produit, vous pouvez utiliser /sbin/modprobe -c | grep '<vendor ID>.*<product ID>' . Si vous récupérez une ligne comme celle-ci, vous avez trouvé une correspondance :

alias pci:v0000<vendor ID>:d0000<product ID>sv... <module name>

Ces informations proviennent de /lib/modules/modules.alias[.bin] , qui est généré par le depmod commande à partir des informations de support de périphérique intégrées dans les modules du noyau eux-mêmes (définis dans le code source avec un MODULE_DEVICE_TABLE macro). Vous pouvez également utiliser modinfo <module name> | grep alias pour afficher le support matériel réclamé par un module particulier.

Cependant, tous les modules ne sont pas spécifiés par des ID de fournisseur/produit. Certains pilotes couvriront une classe entière d'appareils ; par exemple, le xhci_pci Le module revendique la prise en charge de la classe de base PCI 0x0C, de la sous-classe 0x03, de l'interface 0x30… qui correspond respectivement au "contrôleur de bus série", "contrôleur USB" et "XHCI". Ceci est exprimé par

alias:          pci:v*d*sv*sd*bc0Csc03i30*

Notez que vous ne devriez normalement pas avoir besoin d'effectuer ces recherches manuellement, sauf si vous avez mis certains modules sur liste noire ou si la détection automatique échoue pour une raison quelconque. Par exemple, lorsque le noyau Linux détecte le contrôleur USB 3 de l'affiche d'origine, il provoque (l'équivalent de) l'exécution de la commande suivante :

modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30

qui contient tous les ID de fournisseur de matériel/périphérique/classe/sous-classe/interface disponibles pour le périphérique. Si l'un des alias génériques enregistrés dans modprobe configuration correspond à cette chaîne, le module respectif sera chargé automatiquement.

Connexe :Quels sont les séparateurs de mots readline ?

Pour les périphériques USB (et en fait pour tous les bus à détection automatique), il existe un système similaire d'alias de module et un référentiel d'ID USB.

Si vous n'avez pas le module approprié compilé sur votre système, votre meilleur pari est d'utiliser le référentiel d'ID PCI pour identifier le périphérique ou la puce utilisée à l'intérieur. Parfois, l'entrée du référentiel identifie le module du noyau Linux qui en assurera la prise en charge. Si ces informations ne sont pas présentes, vous devrez peut-être rechercher sur Google en utilisant le modèle d'appareil/de puce ; cela vous permettra généralement de trouver des modules de pilotes alternatifs/expérimentaux qui n'ont pas (encore ?) été inclus dans le noyau standard.


Linux
  1. Comment trouver des fichiers dans un secteur donné ?

  2. Comment ajouter des paramètres de module noyau ?

  3. Comment configurer le module CWP pour WHMCS

  4. Comment charger le module SELinux pour Oracleasm

  5. Comment utiliser ioctl() pour manipuler mon module noyau ?

Comment charger ou décharger un module du noyau Linux

Linux :Comment trouver le pilote de périphérique utilisé pour un périphérique ?

Linux - Comment recharger correctement un module du noyau ?

Comment trouver l'adresse IP d'un appareil sur un réseau ?

Étant donné un hachage de validation git, comment savoir quelle version du noyau le contient ?

Comment trouver le fichier .pid pour un processus donné