Udev规则匹配多节点USB设备

Udev规则匹配多节点USB设备

我有一个 3G/GPS 设备,它创建 5 个 tty 节点,尽管它只是一个物理 USB 连接。基本上是一个多端口 USB 串行适配器。

我正在尝试创建一些udev规则以确保这些节点始终具有相同的名称,或者至少具有指向它们的符号链接。

我确实可以在 找到该设备/sys/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/。里面是1-2.2:1.0/to 1-2.2:1.4/,它创建了 5 个节点。

我也可以在 找到它/sys/bus/usb/devices/1-2.2

设备的udev信息如下:

udevadm info -a -p /sys/bus/usb/devices/1-2.2/1-2.2\:1.0
looking at device '/bus/usb/devices/1-2.2/1-2.2:1.0':
KERNEL=="1-2.2:1.0"
SUBSYSTEM=="usb"
DRIVER=="option"
ATTR{bInterfaceNumber}=="00"
ATTR{bAlternateSetting}==" 0"
ATTR{bNumEndpoints}=="03"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="01"
ATTR{bInterfaceProtocol}=="01"
ATTR{modalias}=="usb:v12D1p1506d0000dc00dsc00dp00icFFisc01ip01"
ATTR{supports_autosuspend}=="0"

从此时起,所有节点都具有相同的信息。节点之间唯一不同的是 bInterfaceNumber 属性和设备路径。所以,我想到按开发路径编写规则。

现在,由于某种原因,所有这些节点都匹配以下规则。

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"

所以基本上,huawey0指向枚举的最后一个节点。设备创建了从ttyUSB2到6的节点,该链接指向USB6。

所以,我尝试通过内核节点:

ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"

现在,/dev 上什么也没有出现。

之后,我尝试使用 bInterfaceNumber 来分隔它们。我使用了以下规则

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]" ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

但仍然没有发生任何事情。我什至尝试了该规则的精简版本..

ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"

但仍然没有任何反应。为什么不匹配?

答案1

虽然这篇文章是三年前提出的,可能无法解答,但我还是想在这里分享我的成功经验,以供将来参考。

根据詹斯·雷曼 (Jens Reimann) 的说法使用 udev 识别 GSM 调制解调器设备,“设备属性“bInterfaceNumber”不在 tty 设备上,而是在父层次结构中的 USB 设备上”,因此我为 FTDI usb-to-4-port-serial 适配器创建了两条规则:

SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="ttyUSB_FTDI_4_PORT_%E{.LOCAL_ifNum}"

这会将属性“bInterfaceNumber”存储到环境变量“.LOCAL_ifNum”中(前缀点是临时或隐藏变量的表示法)。在第二条规则中,使用“%E”语法拉取相同的变量。较新的 udev 版本还支持“$env”而不是“%E”。
(延斯·雷曼)

ttyUSB_FTDI_4_PORT_符号链接名称在哪里。这两条规则将创建符号链接为ttyUSB_FTDI_4_PORT_00, ttyUSB_FTDI_4_PORT_01, ttyUSB_FTDI_4_PORT_02, ttyUSB_FTDI_4_PORT_03。您可以添加ATTRS{serial}属性来进一步限制枚举。

Jens Reimann 还承认了克坦·帕特尔的 U&L 问题,调制解调器的 Udev 规则文件不工作, 和接受的答案经过德罗伯特

答案2

您的规则都存在语法错误:

  1. =用于分配==是用于比较,因此您实际上并没有查看DEV等于什么,您正在分配它。
  2. 你需要,在所有的陈述之间,之前没有任何陈述SYMLINK+=

拳头规则

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"

第二条规则

ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"

第三条规则

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

第四条规则

ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"

所有这些规则现在都应该满足您的要求(我个人会使用第一个规则)。

答案3

除了 Alex 的评论之外,还有另一个问题。它似乎ATTR{bInterfaceNumber}出于某种原因不起作用。引用相关问题的答案,你应该使用类似的东西

SUBSYSTEM=="tty", ACTION=="add", \
    ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}="2303", \
    ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0"

相关内容