我在使用mdev规则运行busybox的嵌入式Linux中编写了一个简单的UART串行驱动程序。我在驱动程序代码中提供了.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
/ #
tty的mdev规则是:
tty 0:5 0666
tty.* 0:0 0620
如何将设备节点设为/dev/ttyC2C
?
答案 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