Правило пристрою udev pci не працює


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пристрою, це означає, що правило файлу не працює. Що я зробив не так?

Відповіді:


2

Тут є кілька проблем:

0. З завантаженням модуля ви йдете неправильно . Правило можна змусити працювати, але це все ще неправильний інструмент для проблеми. udev вже має вбудовані методи для автоматичного завантаження драйверів пристроїв, таких як modaliases та modprobe.d; вони не обмежуються лише вбудованими драйверами.

1. Ваш скрипт оболонки не є сценарієм. …/trunk/loaddrvФайл повинен бути позначений як виконуваний файл (CHMOD його до + х), і він повинен мати #!заголовок повідомляючи ядру , що інтерпретатор , щоб використовувати його з - у вашому випадку, додайте #!/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("...")макрос.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.