GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie finde ich das Kernel-Modul für ein bestimmtes Gerät?

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.

Verwandt:Was sind die Readline-Worttrennzeichen?

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.


Linux
  1. Linux:So finden Sie den für ein Gerät verwendeten Gerätetreiber

  2. Linux – Wie finde ich den Treiber (Modul), der mit einem Gerät unter Linux verbunden ist?

  3. Wie finde ich heraus, welcher serielle Port verwendet wird?

  4. Wie finde ich Dateien in einem bestimmten Sektor?

  5. So laden Sie das SELinux-Modul für Oracleasm

So laden oder entladen Sie ein Linux-Kernel-Modul

Linux – Wie lädt man ein Kernel-Modul richtig neu?

Wie finde ich die IP-Adresse für ein Gerät in einem Netzwerk?

Wie finde ich die Version eines kompilierten Kernelmoduls?

Wie kodiere ich ein Linux-Kernel-Modul?

Wie debugge ich ein Kernel-Modul, in dem ein NULL-Zeiger erscheint?