udev pci regra do dispositivo não está funcionando

1

Eu tenho um dispositivo PCI que possui drivers próprios (não integrados ao kernel do Linux). Eu coletei informações do dispositivo usando udevadm .

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

A informação do Udevadm começa com o dispositivo especificado pelo devpath e depois percorre a cadeia de dispositivos pais. Imprime para todos os dispositivos encontrado, todos os atributos possíveis no formato de chave de regras do udev.

Uma regra a combinar, pode ser composta pelos atributos do dispositivo e os atributos de um único dispositivo pai.

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==""

Então eu criei 99-elcus1553.rules em /etc/udev/rules.d/ :

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

Que contém:

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

Após a reinicialização, não tenho /dev/tmk1553b device, o que significa que a regra de arquivo não está funcionando. O que eu fiz de errado?

    
por qmor 24.02.2015 / 14:31

1 resposta

1

Existem alguns problemas aqui:

0. Você está indo na direção errada com o carregamento do módulo. A regra pode funcionar, mas ainda é a ferramenta errada para o problema. O udev já possui métodos incorporados para carregar automaticamente módulos de drivers de dispositivos, como modaliases e modprobe.d; eles não estão limitados a drivers internos na árvore.

1. Seu script de shell não é um script. O arquivo …/trunk/loaddrv deve ser marcado como executável (chmod para a + x), e deve ter o cabeçalho #! informando ao kernel qual interpretador utilizá-lo - no seu caso, adicione #!/bin/sh ao topo do seu script.

2. Não sabe onde o módulo está. Você tem insmod tmk1553b.ko . Mas onde é que ele deve procurar esse arquivo .ko? Como você não especificou o caminho completo, ele está procurando no diretório "atual" - que é sempre / para programas iniciados pelo udev. Em outras palavras, a regra não faz isso ...

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

... faz isso:

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

Ok, volte para " 0. Você está indo na direção errada com o carregamento do módulo".

  • Cada dispositivo tem um por 24.02.2015 / 15:40