Узел устройства в /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 в структуру 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