Ich versuche, ein Problem zu beheben:USB-Maus funktioniert nicht auf einem frisch installierten Linux.
Ich vermute, das Problem ist, dass es kein passendes Kernelmodul/Treiber für meine USB-Hardware gibt. Tatsächlich:
$ 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
...
Wie Sie sehen können, wird kein Kernel-Treiber für USB-Controller-Geräte gemeldet (ich nehme an, er sollte auf ähnliche Weise gemeldet werden wie Treiber, die für SATA-Controller gemeldet werden)
Also muss ich den Kernel mit einem Modul neu erstellen, das für mein Gerät geeignet wäre. Aber wie finde ich heraus, welches Modul ich bauen soll? Ich habe Informationen, die mein Gerät identifizieren:die Hersteller-ID und die Hardware-ID ([1b21:43b9]). Wie kann man anhand dieser Informationen den entsprechenden Kernelmodulnamen herausfinden?
Akzeptierte Antwort:
PCI ID 1022:43b9 ist ein Chipsatz USB 3.1 xHCI-Controller der AMD X370-Serie. Die PCI-Subsystem-ID 1b21:1142 deutet darauf hin, dass es sich tatsächlich um einen ASMedia ASM1042A USB 3-Controller handeln könnte, der möglicherweise in den AMD-Chipsatz integriert ist.
Für die meisten USB 3.x-Controller-Chips ist das passende Treibermodul xhci_pci
was vom Modul xhci_hcd
abhängt . Diese beiden Module sind Teil des Standard-Linux-Kernels und sollten daher in allen modernen Linux-Distributionen verfügbar sein. Die entsprechenden Kernel-Konfigurationsoptionen sind CONFIG_USB_XHCI_PCI
und CONFIG_USB_XHCI_HCD
.
Viele Distributionen enthalten die Kernel-Konfigurationsdatei als /boot/config-<kernel version number>
. Sie könnten also diesen Befehl ausführen:
$ grep XHCI /boot/config-$(uname -r)
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_PCI=m
# CONFIG_USB_XHCI_PLATFORM is not set
Hier sind sowohl xhci_hcd
und xhci_pci
sind so konfiguriert, dass sie als Module verfügbar sind. Wenn die Zeilen ...=y
sagen würden stattdessen würde die USB 3-Unterstützung in den Hauptkernel kompiliert.
PCI ID 1022:43b5, Subsystem ID 1b21:1062 ist ein AHCI SATA (oder eSATA) Controller, der bereits durch das Modul ahci
abgedeckt ist .
Sie können PCI-IDs im PCI-ID-Repository nachschlagen.
Wenn ein Treiber durch Hersteller-/Produkt-IDs angegeben wurde, können Sie /sbin/modprobe -c | grep '<vendor ID>.*<product ID>'
. Wenn Sie eine Zeile wie diese zurückbekommen, haben Sie eine Übereinstimmung gefunden:
alias pci:v0000<vendor ID>:d0000<product ID>sv... <module name>
Diese Informationen stammen aus /lib/modules/modules.alias[.bin]
, die vom depmod
generiert wird Befehl aus den Geräteunterstützungsinformationen, die in den Kernelmodulen selbst eingebettet sind (im Quellcode mit einem MODULE_DEVICE_TABLE
definiert). Makro). Sie können auch modinfo <module name> | grep alias
um die von einem bestimmten Modul beanspruchte Hardwareunterstützung anzuzeigen.
Allerdings sind nicht alle Module durch Anbieter-/Produkt-IDs spezifiziert. Einige Treiber decken eine ganze Klasse ab von Geräten; zum Beispiel xhci_pci
Das Modul beansprucht die Unterstützung der PCI-Basisklasse 0x0C, Unterklasse 0x03, Schnittstelle 0x30…, die jeweils auf „Serieller Bus-Controller“, „USB-Controller“ und „XHCI“ abgebildet wird. Dies wird ausgedrückt als
alias: pci:v*d*sv*sd*bc0Csc03i30*
Beachten Sie, dass Sie normalerweise keine dieser Suchen manuell durchführen müssen, es sei denn, Sie haben einige Module auf die schwarze Liste gesetzt oder die automatische Erkennung schlägt aus irgendeinem Grund fehl. Wenn der Linux-Kernel beispielsweise den USB 3-Controller des Originalposters erkennt, wird (das Äquivalent zu) der folgende Befehl ausgeführt:
modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30
die alle für das Gerät verfügbaren Hardwareanbieter-/Geräte-/Klassen-/Unterklassen-/Schnittstellen-IDs enthält. Wenn einer der Wildcard-Aliase in modprobe
eingetragen ist Konfiguration mit diesem String übereinstimmt, wird das entsprechende Modul automatisch geladen.
Für USB-Geräte (und in der Tat für alle autoprobeable Busse) gibt es ein ähnliches System von Modul-Aliasnamen und ein USB-ID-Repository.
Wenn Sie das entsprechende Modul nicht auf Ihrem System kompiliert haben, verwenden Sie am besten das PCI-ID-Repository, um das Gerät oder den darin verwendeten Chip zu identifizieren. Manchmal identifiziert der Repository-Eintrag das Linux-Kernel-Modul, das es unterstützen wird. Wenn diese Informationen nicht vorhanden sind, müssen Sie möglicherweise nach dem Geräte-/Chipmodell googeln; dies ermöglicht es Ihnen normalerweise, alternative/experimentelle Treibermodule zu finden, die (noch?) nicht in den Standardkernel aufgenommen wurden.