2012-11-24 11 views
14

mdevルールのbusyboxを実行している組み込みLinuxにシンプルなUARTシリアルドライバを書きました。私は.dev_nameを私のドライバコードに "ttyC2C"として提供しました。デバイスノード/ dev/tty *がUARTシリアルドライバ用に作成されていません

static struct uart_driver serial_omap_reg = { 
    .owner  = THIS_MODULE, 
    .driver_name = "Omap-C2C-Serial", 
    .dev_name = "ttyC2C", 
    .nr  = OMAP_MAX_HSUART_PORTS, 
    .cons = NULL, 
}; 

ノードがttyのために

./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
./sys/class/tty/ttyC2C0 

/# ls -l ./sys/class/tty/ttyC2C0 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 ./sys/class/tty/ttyC2C0 -> ../../devices/platform/omap_c2c_uart.0/tty/ttyC2C0 

/# ls -l ./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0 
-r--r--r-- 1 root  0    4096 Jan 1 00:14 dev 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 device -> ../../../omap_c2c_uart.0 
drwxr-xr-x 2 root  0    0 Jan 1 00:14 power 
lrwxrwxrwx 1 root  0    0 Jan 1 00:14 subsystem -> ../../../../../class/tty 
-rw-r--r-- 1 root  0    4096 Jan 1 00:14 uevent 
/# 

MDEV規則で作成されたばかりしかし、次のとおりです。

tty 0:5 0666 
tty.* 0:0 0620 

どのよう/dev/ttyC2Cとしてデバイスノードを取得するには?

+0

、それは "構造体platform_driver" と "構造体uart_driver" でそのドライバ名が同じであることを述べています。私はコードを変更しましたが、まだ/ dev/ttyC2Cノードは実装されていません。 –

+0

構造体uart_driverに.majorと.minorを追加し、 "mknod"を使って手動でデバイスノードを作成すると、ドライバは正常に動作します。カーネル(3.4.0)が自動的にそれを作成できないのはなぜですか? –

答えて

8

あなたは2つのことを混乱させています。あなたが見ているsysfsノードは実際にはkobject階層に基づいてカーネルによって維持されています。しかし、デバイスノードは完全にユーザー空間の問題であり、どこにでも存在する可能性があります(慣習的には/ devの下にあります)。

だから、手で、あなたが最初の主要なを見つけるだろう:マイナー番号:その後、

cat /sys/class/tty/ttyC2C0/dev 

そして:あなたはすでにあなたに、MDEVをudevののフォークを使用している示されているようしかし

mknod /dev/ttyC2C0 c ${MAJOR} ${MINOR} 

デバイスノードのユーザー空間作成を処理します。しかし、一致するルールは私にとって奇妙に見えます。私はmdevがudevadmに相当するものを持っていると仮定します。

udevadm info -a -p /sys/class/tty/ttyUSB0 

そして私は、私が一致するために使用することができudevの属性のリストを見ることができます生成木を見て:たとえば、私のUSBのttyドライバは次のように照会することができます。だから私の場合:

KERNEL=="ttyUSB0", DRIVERS=="ftdi_sio", NAME="ttyUSB0" 

(私のディストリビューションにはダイナミックな設定に対処するためのより多くの複雑なマッチングルールがありますが)一致するには十分でしょうか。

私は推測しているが、私はあなたが欲しいマッピングルールがよりようになります疑い:あなたは、各ポート用に作成したデバイスノードを取得確保するためにもう少しを必要とするかもしれませんが

KERNEL=="ttyC2C", NAME="ttyC2C" 

(マイナー番号を?) 。

2

ttyC2Cの/etc/mdev.confに特定のmdevルールを追加しても問題は解決しますか? 次のようなものはありますか? "エッセンシャルLinuxデバイスドライバ" 本で

ttyC2C[0-9]+ root:tty 620

または

ttyC2C[0-9]+ root:tty 620 @/bin/ln -sf $MDEV ttyC2C

関連する問題