web-dev-qa-db-ja.com

udevpciデバイスルールが機能していません

独自のドライバー(Linuxカーネルに統合されていない)を持つPCIデバイスがあります。 udevadmを使用してデバイス情報を収集しました。

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

Udevadm情報は、devpathで指定されたデバイスから始まり、親デバイスのチェーンをたどります。見つかったすべてのデバイスについて、udevルールキー形式のすべての可能な属性を出力します。

一致するルールは、デバイスの属性と1つの親デバイスの属性で構成できます。

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
qmor

ここにはいくつかの問題があります。

0。モジュールの読み込みで間違った方向に進んでいます。ルールを機能させることはできますが、それでも問題に対して間違ったツールです。 udevには、modaliasesやmodprobe.dなどのデバイスドライバーモジュールを自動ロードするための組み込みメソッドがすでにあります。それらはツリー内のドライバーのみに限定されません

1。シェルスクリプトはスクリプトではありません。_…/trunk/loaddrv_ファイルは実行可能としてマークされ(a + xに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。モジュールのロードでを間違った方向に進んでいます」に戻ります。

  • 各デバイスには、自動的に生成されたモジュールエイリアス(モダリア)があります。例えば:

    _$ 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("...")マクロが必要になります。)

2
user1686