Възелът на устройството в /dev/tty* не се създава за сериен драйвер на uart

Написах прост UART сериен драйвер във вграден Linux, работещ с busybox с mdev правила. Предоставих .dev_name като "ttyC2C" в моя код на драйвера.

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,
};

Но възелът се създава в

./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 са:

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

Как да получа възел на устройството като /dev/ttyC2C?


person manav m-n    schedule 24.11.2012    source източник
comment
В книгата Essential Linux Device Drivers се казва, че името на драйвера в struct platform_driver и struct uart_driver трябва да е едно и също. Модифицирах кода според, но все още възелът /dev/ttyC2C не се попълва.   -  person manav m-n    schedule 26.11.2012
comment
Когато добавя .major и .minor към struct uart_driver и създам възела на устройството ръчно с помощта на mknod, драйверът работи добре. Защо ядрото (3.4.0) не може да го създаде автоматично?   -  person manav m-n    schedule 28.11.2012


Отговори (2)


Бъркаш две неща. Sysfs възлите, които виждате, наистина се поддържат от ядрото въз основа на йерархията на kobject. Но възлите на устройството са изцяло проблем на потребителското пространство и могат да съществуват навсякъде (въпреки че по конвенция са под /dev).

Така че на ръка първо бихте намерили главните:малките числа:

cat /sys/class/tty/ttyC2C0/dev

И тогава:

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

Въпреки това, както вече посочихте, вие използвате разклонението на udev, mdev, за да управлявате създаването на потребителско пространство на възли на устройства. Правилата за съвпадение обаче ми изглеждат странни. Предполагам, че mdev има еквивалента на udevadm, което трябва да ви помогне да напишете правилата за съвпадение. Например моят USB tty драйвер може да бъде поискан по следния начин:

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

И гледайки създаденото дърво, мога да видя списък с udev атрибути, които мога да използвам за съпоставяне. Така че в моя случай:

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

Би било достатъчно за съпоставяне (въпреки че моята дистрибуция има много по-сложни правила за съвпадение, за да се справи с динамични настройки).

Предполагам, но подозирам, че правилото за картографиране, което искате, ще изглежда по-скоро като:

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

Въпреки че може да се нуждаете от малко повече, за да сте сигурни, че ще създадете възли на устройства за всеки порт (малък номер?).

person stsquad    schedule 28.11.2012

Добавянето на конкретно mdev правило към вашия /etc/mdev.conf за ttyC2C решава ли проблема ви? Нещо като едно от следните?

ttyC2C[0-9]+ root:tty 620

or

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

person Appleman1234    schedule 28.11.2012