Устройство node at/dev/tty * не создается для драйвера uart serial

Я написал простой последовательный драйвер 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,
};

Однако node создается в

./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

Как получить устройство node как /dev/ttyC2C?

Ответ 1

Вы смешиваете две вещи. Узлы sysfs, которые вы видите, действительно поддерживаются ядром на основе иерархии kobject. Однако узлы устройства полностью являются проблемой пользовательского пространства и могут существовать в любом месте (хотя по соглашению находятся под /dev ).

Таким образом, вы сначала найдете майор: младшие номера:

cat /sys/class/tty/ttyC2C0/dev

И затем:

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

Однако, как вы уже указали, вы используете fork для 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"

Хотя вам может понадобиться немного больше, чтобы обеспечить создание узлов устройств, созданных для каждого порта (младший номер?).

Ответ 2

Добавляет ли определенное правило mdev к вашему /etc/mdev.conf для ttyC2C решение вашей проблемы? Что-то вроде одного из следующих?

ttyC2C[0-9]+ root:tty 620

или

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