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.
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.