udev规则与几个父设备属性

6

我需要一个复杂而通用的udev规则来确定插入任何USB集线器特定端口的USB设备。因此,我必须组合不同层设备树的父属性...

我现在有这个:

$udevadm info --query=all --name=/dev/ttyUSB0 --attribute-walk

  looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

            . . .

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.4':
    KERNELS=="1-1.2.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
            ...

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{devpath}=="1.2"
    ATTRS{idVendor}=="0835"
            ...
    ATTRS{idProduct}=="8500"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="USB2.0 Hub"

            . . .

然后我构建了一个udev规则,类似于这样,来识别特定USB集线器的特定端口:

KERNEL=="ttyUSB[0-9]*", KERNELS=="1-1.2.4", ATTRS{idVendor}=="0835", ATTRS{idProduct}=="8500", SYMLINK+="port1"

但是,当我尝试使用来自不同父层的属性时,它并没有起作用。

我知道udev仅支持从一个特定的父设备获得其他属性。但我真的需要获取结合了我的设备的2个父节点属性的规则。

有人能提供解决方案吗?有没有什么技巧可以做到这一点?

2个回答

22

经历了许多不成功的尝试后,我找到了解决方案!

它的关键特性是设置环境变量:

  1. 在插入事件中,我们查找 vendor:id 对,并将其记忆在环境变量中。
  2. 在同一事件中,我们比较保存的变量和 USB 设备树节点 ID,以分配某个 USB 集线器的确切端口名称。

这篇文档帮助了我:http://www.reactivated.net/writing_udev_rules.html

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0610", ENV{USB_HUB_TYPE}="05e3:0610"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0835", ATTRS{idProduct}=="8500", ENV{USB_HUB_TYPE}="0835:8500"
#
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].4:1.0", SYMLINK+="port1"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].3:1.0", SYMLINK+="port2"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].2:1.0", SYMLINK+="port3"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.5:1.0", SYMLINK+="port4"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.2:1.0", SYMLINK+="port5"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.3:1.0", SYMLINK+="port6"
ENV{USB_HUB_TYPE}=="0835:8500", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].5.4:1.0", SYMLINK+="port7"
#
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.1:1.0" SYMLINK+="port1"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].2:1.0", SYMLINK+="port2"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.2:1.0", SYMLINK+="port3"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].3:1.0", SYMLINK+="port4"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.3:1.0", SYMLINK+="port5"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].4:1.0", SYMLINK+="port6"
ENV{USB_HUB_TYPE}=="05e3:0610", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.[2-3].1.4:1.0", SYMLINK+="port7"

也许对某些人会有用。


太棒了。工作做得非常好。我们必须跳过的那些障碍,是吧? - Rob Shepherd

0

在我的openhabian系统上完美运行。我有两个相同的usb/modbus适配器,现在我可以给它们不同的符号链接: 在我的/etc/udev/rules.d/99-com.rules中添加了这些行:

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ENV{USB_HUB_TYPE}="1a86:7523"
#
ENV{USB_HUB_TYPE}=="1a86:7523", KERNEL=="ttyUSB[0-9]*",SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="tty4800"
ENV{USB_HUB_TYPE}=="1a86:7523", KERNEL=="ttyUSB[0-9]*",SUBSYSTEM=="tty", KERNELS=="1-1.2:1.0", SYMLINK+="tty9600"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接