独自のドライバー(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
デバイスがありません。これは、ファイルルールが機能していないことを意味します。私は何を間違えましたか?
ここにはいくつかの問題があります。
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("...")
マクロが必要になります。)