私はUbunut 14.04システムでSensoray独自のPCIカードを使用しています(まもなく18.04にアップグレードする予定です)。カードには、ドライバのソースコードとドライバの構築とインストールのためのMakefileが付属しています。 Makefileのドライバ関連部分は次の場所にあります。
######################################################################
# for kernel modeule level driver:
# Kernel directory
KDIR := /lib/modules/$(shell uname -r)/build
# Module directory
MODDIR := /lib/modules/$(shell uname -r)/kernel/drivers/sensoray
# System values
PWD := $(shell pwd)
KERNEL_24 := $(if $(wildcard $(KDIR)/Rules.make),1,0)
# Target file
obj-m := s626.o
# Source files
ifeq ($(KERNEL_24),0) # > 2.4
s626-objs := s626drv.o
else # <= 2.4
s626-objs := s626drv.o
endif
.PHONY: all clean modules_install
ifeq ($(KERNEL_24),0) # > 2.4
ifeq ($(KERNELRELEASE),)
all:
$(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD)
clean modules_install:
$(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD) $@
endif # KERNELRELEASE
else # <= 2.4
ifneq ($(KERNELRELEASE),)
include $(KDIR)/Rules.make
s626.o: $(s626-objs)
$(Q)$(LD) $(LD_RFLAG) -r -o $@ $(s626-objs)
else
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -f *.ko *.o .*.cmd .*.o.flags *.mod.c
endif # KERNELRELEASE
endif # KERNEL_24
ifeq ($(KERNEL_24),1) # <= 2.4
install: s626.o
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*;\
fi
@if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
fi
su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.o $(MODDIR);depmod -a"
else
install: s626.ko
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*; \
fi
@if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
fi
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers/s626.*;\
fi
su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.ko $(MODDIR);install -m 444 s626.ko $(MODDIR);depmod -a"
endif # KERNEL > 2.4
Makefileの終わりには、ファイルが作成された後にディレクトリ.ko
に簡単にコピーされるように見えます。/lib/modules/$(shell uname -r)/kernel/drivers/sensoray
デバイスファイルを生成するために実行されるカスタムMAKEDEVシェルスクリプトもあります。スクリプトは次のとおりです。
#!/bin/bash
function makedev () {
for dev in 0 1 2 3; do
echo "/dev/$1$dev: char $2 $dev"
rm -f /dev/$1$dev
mknod /dev/$1$dev c $2 $dev
chmod 666 /dev/$1$dev
done
# symlink for default device
rm -f /dev/$1
ln -s /dev/${1}0 /dev/$1
}
makedev s626a 146
問題は、システムが再起動されるたびに発生します。ドライバが正しくロードされているようですが、デバイスファイルが/dev
消えました。私はドライバの開発についてはよくわかりませんが、この問題について多くの研究を行っており、起動時にこれらのデバイスファイルを生成する方法について矛盾する情報が見つかりました。 udevルールを作成するのが最善だと言う人もいますが、udevルールを使用して欠落しているデバイスファイルを作成してはいけないか、udevが新しいdevtempfsを参照するデバイスファイルの作成に責任を負わないと言います。私の質問は:この問題を解決する正しい方法は何ですか?私は本質的にSensorayからカスタムMAKEDEVスクリプトを呼び出すudevルールアプローチを試しましたが、これは私のルールがpciカードの特定のプロパティを参照していない場合にのみ機能します。たとえば、次のルールが有効です。
ACTION=="add", SUBSYSTEM=="pci", RUN+="/home/kpopek/MAKEDEV"
このルールはそうではありません。
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1131", RUN+="/home/kpopek/MAKEDEV"
起動時にuevent
Sensoray PCIカードと一致するものがないようです。これは、欠落しているデバイスファイルのソースである可能性があります。uevents
これを確認するために開始にログオンする方法が見つかりませんでした。 udevルールが正しいアプローチであればuevent
他のデバイスで発生するため、スクリプトを実行する一般的なルールよりもカード固有のルールが大好きです。
答え1
カスタムドライバは必須のudevイベントを生成しないようです(これを確認するにはドライバを見てください)。
だから適切解決策は、イベントを生成するようにドライバを変更することです。最も単純な場合、コードは次のようになります。これ。より複雑な場合は、追加のudevルールを使用してより複雑な操作を実行できます。
カーネルモジュールを変更できない場合、または変更したくない場合は、すべての可能な解決策が許可されます。 IMHO。理想的には、モジュールがロードされたときにデバイスを作成し、モジュールがアンロードされたときにデバイスを削除する依存関係を持ちたいのですが、udevイベントが必要です(上記を参照)。したがって、次善策は起動時に作成することです。つまり、init.dまたはsystemdスクリプトを追加するだけです。
ハードウェアの既存のudevイベントをハイジャックできる場合は、それも良いでしょう。でも試してみましたが見つかりませんでした。