14

我在嵌入式 Linux 中编写了一个简单的 UART 串​​行驱动程序,使用 mdev 规则运行 busybox。我在我的驱动程序代码中提供.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

4

2 回答 2

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"

尽管您可能需要更多的时间来确保为每个端口(次要编号?)创建设备节点。

于 2012-11-28T11:51:02.527 回答
2

/etc/mdev.conf为您的 ttyC2C添加特定的 mdev 规则是否可以解决您的问题?类似于以下之一?

ttyC2C[0-9]+ root:tty 620

或者

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

于 2012-11-28T18:13:21.470 回答