未为uart串行驱动程序创建/ dev / tty *的设备节点

时间:2012-11-24 08:29:07

标签: linux linux-kernel serial-port linux-device-driver uart

我在使用mdev规则运行busybox的嵌入式Linux中编写了一个简单的UART串行驱动程序。我在驱动程序代码中提供了.dev_namettyC2C”。

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

tty的mdev规则是:

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

如何将设备节点设为/dev/ttyC2C

2 个答案:

答案 0 :(得分:8)

你混淆了两件事。您看到的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"

虽然您可能需要更多一点来确保为每个端口创建设备节点(次要号码?)。

答案 1 :(得分:2)

为ttyC2C的/etc/mdev.conf添加特定的mdev规则是否可以解决您的问题? 像下列之一那样的东西?

ttyC2C[0-9]+ root:tty 620

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