GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo encontrar el módulo del kernel para un dispositivo dado?

Estoy tratando de solucionar un problema:el mouse USB no funciona en un Linux recién instalado.

Sospecho que el problema es que no hay un módulo/controlador de núcleo adecuado para mi hardware USB. De hecho:

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

Como puede ver, no se informa ningún controlador del kernel para el dispositivo del controlador USB (supongo que debería informarse de manera similar al controlador informado para el controlador SATA)

Entonces, necesito reconstruir el kernel con un módulo que sea adecuado para mi dispositivo. Pero, ¿cómo puedo saber qué módulo debo construir? Tengo información que identifica mi dispositivo:es la identificación del proveedor y la identificación del hardware ([1b21:43b9]). ¿Cómo averiguar el nombre del módulo del kernel correspondiente dada esta información?

Respuesta aceptada:

PCI ID 1022:43b9 es un controlador xHCI USB 3.1 de chipset de la serie AMD X370. El ID del subsistema PCI 1b21:1142 sugeriría que en realidad podría ser un controlador ASMedia ASM1042A USB 3, posiblemente integrado en el chipset AMD.

Para la mayoría de los chips controladores USB 3.x, el módulo controlador adecuado es xhci_pci que depende del módulo xhci_hcd . Ambos módulos son parte del kernel estándar de Linux, por lo que deberían estar disponibles en todas las distribuciones modernas de Linux. Las opciones de configuración del kernel correspondientes son CONFIG_USB_XHCI_PCI y CONFIG_USB_XHCI_HCD .

Muchas distribuciones incluyen el archivo de configuración del kernel como /boot/config-<kernel version number> . Entonces, podrías ejecutar este comando:

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

Aquí, ambos xhci_hcd y xhci_pci están configurados para estar disponibles como módulos. Si las líneas dijeran ...=y en cambio, la compatibilidad con USB 3 se compilaría en el kernel principal.

PCI ID 1022:43b5, subsistema ID 1b21:1062 es un controlador AHCI SATA (o eSATA), que ya está cubierto por el módulo ahci .

Puede buscar ID de PCI en el Repositorio de ID de PCI.

Si un controlador ha sido especificado por ID de proveedor/producto, podría usar /sbin/modprobe -c | grep '<vendor ID>.*<product ID>' . Si obtiene una línea como esta, ha encontrado una coincidencia:

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

Esta información proviene de /lib/modules/modules.alias[.bin] , que es generado por depmod comando de la información de soporte del dispositivo incrustada en los propios módulos del kernel (definido en el código fuente con un MODULE_DEVICE_TABLE macro). También puede usar modinfo <module name> | grep alias para ver el soporte de hardware reclamado por un módulo en particular.

Sin embargo, no todos los módulos están especificados por ID de proveedor/producto. Algunos conductores cubrirán una clase completa de dispositivos; por ejemplo, el xhci_pci El módulo afirma que admite la clase base PCI 0x0C, subclase 0x03, interfaz 0x30... que se asigna a "Controlador de bus serie", "Controlador USB" y "XHCI", respectivamente. Esto se expresa como

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

Tenga en cuenta que normalmente no debería necesitar realizar ninguna de estas búsquedas manualmente a menos que haya incluido en la lista negra algunos módulos o que la detección automática falle por algún motivo. Por ejemplo, cuando el kernel de Linux detecta el controlador USB 3 del póster original, hará que se ejecute (el equivalente a) el siguiente comando:

modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30

que contiene todos los identificadores de proveedor/dispositivo/clase/subclase/interfaz de hardware disponibles para el dispositivo. Si uno de los alias con comodines registrados en modprobe la configuración coincide con esta cadena, el módulo respectivo se cargará automáticamente.

Relacionado:¿Cuáles son los separadores de palabras readline?

Para dispositivos USB (y, de hecho, para cualquier bus autoprobable), existe un sistema similar de alias de módulo y un depósito de ID USB.

Si no tiene el módulo apropiado compilado en su sistema, lo mejor que puede hacer es usar el repositorio de PCI ID para identificar el dispositivo o el chip que se usa en él. A veces, la entrada del repositorio identifica el módulo del kernel de Linux que le brindará soporte. Si esa información no está presente, es posible que deba buscar en Google usando el modelo de dispositivo/chip; esto generalmente le permitirá encontrar cualquier módulo de controlador alternativo/experimental que no se haya incluido (¿todavía?) en el kernel estándar.


Linux
  1. Linux:¿cómo encontrar el controlador (módulo) asociado con un dispositivo en Linux?

  2. ¿Cómo agregar parámetros del módulo del kernel?

  3. ¿Cómo uso ioctl() para manipular mi módulo kernel?

  4. ¿Cómo codificar un módulo del kernel de Linux?

  5. cómo encontrar la ruta del módulo Linux

Cómo cargar o descargar un módulo del kernel de Linux

¿Cómo encontrar la dirección IP de un dispositivo en una red?

Cómo cargar el módulo SELinux para Oracleasm

¿Cómo encontrar la versión de un módulo kernel compilado?

Dado un hash de confirmación de git, ¿cómo saber qué versión del kernel lo contiene?

¿Cómo mostrar los parámetros de la línea de comandos del kernel de Linux dados para el arranque actual?