1

У меня есть устройство PCI с собственными драйверами (не интегрировано в ядро Linux). Я собрал информацию об устройстве с помощью udevadm .

udevadm info -a -p /sys/devices/pci0000:00/0000:00:1e.0/0000:0d:02.0

Информация Udevadm начинается с устройства, указанного devpath, а затем идет вверх по цепочке родительских устройств. Он печатает для каждого найденного устройства, все возможные атрибуты в формате ключей правил udev.

Правило для сопоставления может состоять из атрибутов устройства и атрибутов одного родительского устройства.

looking at device '/devices/pci0000:00/0000:00:1e.0/0000:0d:02.0':
KERNEL=="0000:0d:02.0"
SUBSYSTEM=="pci"
DRIVER==""
ATTR{irq}=="10"
ATTR{subsystem_vendor}=="0xe1c5"
ATTR{broken_parity_status}=="0"
ATTR{class}=="0x078000"
ATTR{driver_override}=="(null)"
ATTR{consistent_dma_mask_bits}=="32"
ATTR{dma_mask_bits}=="32"
ATTR{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,000000ff"
ATTR{device}=="0x9030"
ATTR{enable}=="0"
ATTR{msi_bus}==""
ATTR{local_cpulist}=="0-7"
ATTR{vendor}=="0x10b5"
ATTR{subsystem_device}=="0x0005"
ATTR{numa_node}=="-1"
ATTR{d3cold_allowed}=="1"

looking at parent device '/devices/pci0000:00/0000:00:1e.0':
KERNELS=="0000:00:1e.0"
SUBSYSTEMS=="pci"
DRIVERS==""
ATTRS{irq}=="0"
ATTRS{subsystem_vendor}=="0x103c"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x060401"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{dma_mask_bits}=="32"
ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,000000ff"
ATTRS{device}=="0x244e"
ATTRS{enable}=="1"
ATTRS{msi_bus}=="1"
ATTRS{local_cpulist}=="0-7"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x304b"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="0"

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""

Затем я создаю 99-elcus1553.rules в /etc/udev/rules.d/:

ACTION=="add",SUBSYSTEM=="pci",ATTR{vendor}=="0x10b5",ATTR{device}=="0x9030",RUN+="/home/qmor/elcus-1553driver-linux/trunk/loaddrv"

Который содержит:

/sbin/rmmod tmk1553b
rm /dev/tmk1553b
/sbin/insmod tmk1553b.ko d0=1 t0="TAI" misc=1 
chmod o+rwx /dev/tmk1553b

После перезагрузки у меня нет устройства /dev/tmk1553b , это означает, что правило файла не работает. Что я сделал не так?

1 ответ1

2

Здесь есть несколько проблем:

0. Вы идете не так с загрузкой модуля. Правило можно заставить работать, но оно все еще не подходит для решения проблемы. У udev уже есть встроенные методы для автоматической загрузки модулей драйверов устройств, такие как modaliases и modprobe.d; они не ограничены только встроенными драйверами.

1. Ваш сценарий оболочки не является сценарием. Файл …/trunk/loaddrv должен быть помечен как исполняемый (chmod - это +x), и он должен иметь #! заголовок, сообщающий ядру, с каким интерпретатором его использовать - в вашем случае добавьте #!/bin/sh в начало вашего скрипта.

2. Он не знает, где находится модуль. У вас есть insmod tmk1553b.ko . Но где он должен искать этот файл .ko? Поскольку вы не указали полный путь, он ищет в "текущем" каталоге - который всегда / для запущенных udev программ. Другими словами, правило не делает этого ...

cd /home/qmor/elcus-1553driver-linux/trunk
./loaddrv

... это делает это:

cd /
/home/qmor/elcus-1553driver-linux/trunk/loaddrv

Хорошо, вернемся к « 0.Вы идете не так с загрузкой модуля ".

  • Каждое устройство имеет автоматически сгенерированный псевдоним модуля (modalias). Например:

    $ cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/modalias
    pci:v00001002d000068E4sv00001043sd00001C92bc03sc00i00
    
  • И каждый модуль драйвера имеет список совпадающих псевдонимов, как показывает modinfo :

    filename:       /lib/modules/3.19.0/kernel/drivers/gpu/drm/radeon/radeon.ko.gz
    description:    ATI Radeon
    alias:          pci:v00001002d000068E4sv*sd*bc*sc*i*
    
  • Когда появляется устройство, udev сканирует /lib/modules для любого модуля, который имеет соответствующие модалии.

Поэтому для поставщика 0x10b5 модель 0x9030 это будет pci:v000010b5d00009030sv*sd*bc*sc*i* .

Добавьте их в свою конфигурацию modprobe (/etc/modprobe.d/tmk1553b.conf):

alias pci:v000010b5d00009030sv*sd*bc*sc*i* tmk1553b

options tmk1553b d0=1 t0=TAI misc=1

install tmk1553b /sbin/insmod /home/qmor/elcus-1553driver-linux/trunk/tmk1553b.ko

(Если вы пишете свой собственный модуль, вам понадобится MODULE_ALIAS("...") .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .