Udev规则匹配多节点USB设备

Joa*_*cho 7 linux udev devices

我有一个 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"
Run Code Online (Sandbox Code Playgroud)

从这一点开始,所有节点都具有相同的信息。节点之间唯一不同的是 bInterfaceNumber 属性和设备路径。所以,我想通过开发路径写一个规则。

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

ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

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

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

ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

现在,/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"
Run Code Online (Sandbox Code Playgroud)

然而,什么也没有发生。我什至尝试了规则的精简版本。

ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

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

小智 5

你的规则都有语法错误:

  1. =用于赋值==是用于比较,因此您实际上并没有查看DEV等于什么,而是在赋值。
  2. 您需要,在所有语句之间,之前没有SYMLINK+=

拳法

ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

第二条规则

ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

第三条规则

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

第四条规则

ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"
Run Code Online (Sandbox Code Playgroud)

所有这些规则现在应该做你想做的(我个人会使用第一个)。


小智 5

虽然这个帖子是三年前问的,这可能没有解决答案,但我还是想在这里分享我的成功经验,以供日后参考。

根据 Jens Reimann 的使用 udev 识别 GSM 调制解调器设备,“设备属性“bInterfaceNumber”不在 tty 设备上,而是在父层次结构中的 USB 设备上”,因此我为我的 FTDI usb-to-4 创建了两个规则-端口串行适配器:

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

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="ttyUSB_FTDI_4_PORT_%E{.LOCAL_ifNum}"
Run Code Online (Sandbox Code Playgroud)

这将属性“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}属性以进一步限制枚举。

延斯·莱曼也acknowlegfed的贡献科坦帕特尔“s&&L的问题,调制解调器不工作udev规则文件,具有公认的答案derobert