GNU/Linux >> Linux Esercitazione >  >> Linux

Come trovare il modulo del kernel per un determinato dispositivo?

Sto cercando di risolvere un problema:il mouse USB non funziona su un Linux appena installato.

Sospetto che il problema sia che non esiste un modulo/driver del kernel adatto per il mio hardware USB. Infatti:

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

Come puoi vedere nessun driver del kernel è segnalato per il dispositivo controller USB (suppongo che dovrebbe essere segnalato in modo simile al driver riportato per controller SATA)

Quindi, ho bisogno di ricostruire il kernel con un modulo che sarebbe adatto al mio dispositivo. Ma come faccio a sapere quale modulo dovrei costruire? Ho informazioni che identificano il mio dispositivo:è l'ID fornitore e l'ID hardware ([1b21:43b9]). Come scoprire il nome del modulo del kernel corrispondente in base a queste informazioni?

Risposta accettata:

PCI ID 1022:43b9 è un controller xHCI USB 3.1 con chipset AMD serie X370. L'ID del sottosistema PCI 1b21:1142 suggerisce che potrebbe essere effettivamente un controller USB 3 ASMedia ASM1042A, possibilmente integrato nel chipset AMD.

Per la maggior parte dei chip controller USB 3.x, il modulo driver appropriato è xhci_pci che dipende dal modulo xhci_hcd . Entrambi questi moduli fanno parte del kernel Linux standard, quindi dovrebbero essere disponibili in tutte le moderne distribuzioni Linux. Le opzioni di configurazione del kernel corrispondenti sono CONFIG_USB_XHCI_PCI e CONFIG_USB_XHCI_HCD .

Molte distribuzioni includono il file di configurazione del kernel come /boot/config-<kernel version number> . Quindi, potresti eseguire questo comando:

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

Qui, entrambi xhci_hcd e xhci_pci sono configurati per essere disponibili come moduli. Se le righe dicessero ...=y invece, il supporto USB 3 verrebbe compilato nel kernel principale.

PCI ID 1022:43b5, subsystem ID 1b21:1062 è un controller AHCI SATA (o eSATA), che è già coperto dal modulo ahci .

Puoi cercare gli ID PCI in PCI ID Repository.

Se un driver è stato specificato dall'ID fornitore/prodotto, è possibile utilizzare /sbin/modprobe -c | grep '<vendor ID>.*<product ID>' . Se ricevi una riga come questa, hai trovato una corrispondenza:

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

Queste informazioni provengono da /lib/modules/modules.alias[.bin] , che è generato dal depmod comando dal dispositivo supporta le informazioni incorporate nei moduli del kernel stessi (definito nel codice sorgente con un MODULE_DEVICE_TABLE macro). Puoi anche usare modinfo <module name> | grep alias per visualizzare il supporto hardware richiesto da un particolare modulo.

Tuttavia, non tutti i moduli sono specificati dagli ID fornitore/prodotto. Alcuni autisti copriranno un'intera classe di dispositivi; ad esempio, il xhci_pci il modulo sostiene il supporto della classe base PCI 0x0C, sottoclasse 0x03, interfaccia 0x30... che corrisponde rispettivamente a "Serial bus controller", "USB controller" e "XHCI". Questo è espresso come

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

Nota che normalmente non dovresti aver bisogno di eseguire manualmente nessuna di queste ricerche a meno che tu non abbia inserito nella lista nera alcuni moduli o il rilevamento automatico non riesce per qualche motivo. Ad esempio, quando il kernel Linux rileva il controller USB 3 del poster originale, verrà eseguito (l'equivalente di) il seguente comando:

modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30

che contiene tutti gli ID fornitore/dispositivo/classe/sottoclasse/interfaccia hardware disponibili per il dispositivo. Se uno degli alias con caratteri jolly registrati in modprobe la configurazione corrisponde a questa stringa, il rispettivo modulo verrà caricato automaticamente.

Correlati:quali sono i separatori di parole readline?

Per i dispositivi USB (e in effetti per qualsiasi bus autoprobeable), esiste un sistema simile di alias dei moduli e un repository di ID USB.

Se non hai il modulo appropriato compilato sul tuo sistema, la soluzione migliore è utilizzare il repository ID PCI per identificare il dispositivo o il chip utilizzato al suo interno. A volte la voce del repository identifica il modulo del kernel Linux che fornirà supporto per esso. Se tali informazioni non sono presenti, potrebbe essere necessario cercare su Google utilizzando il modello del dispositivo/chip; questo di solito ti consentirà di trovare moduli driver alternativi/sperimentali che non sono (ancora?) inclusi nel kernel standard.


Linux
  1. Linux:come trovare il driver di dispositivo utilizzato per un dispositivo?

  2. Linux:come ricaricare correttamente un modulo del kernel?

  3. Linux:come trovare il driver (modulo) associato a un dispositivo su Linux?

  4. Come trovare file in un determinato settore?

  5. Come aggiungere i parametri del modulo del kernel?

Come caricare o scaricare un modulo del kernel Linux

Come trovare l'indirizzo IP di un dispositivo su una rete?

Come codificare un modulo del kernel Linux?

Come faccio a eseguire il debug di un modulo del kernel in cui appare un puntatore NULL?

Come visualizzare i parametri della riga di comando del kernel Linux forniti per l'avvio corrente?

Come trovare il driver (modulo) associato a un dispositivo su Linux?