为具有多个 tty 设备的单元添加规则.d 规则时出现问题

为具有多个 tty 设备的单元添加规则.d 规则时出现问题

我想/etc/udev/rules.d为 Texas Instruments CC1352P-2 开发板添加一条规则。在我的 Ubuntu 服务器上,它创建了两个 ttyACM 设备:

crw-rw-rw- 1 root dialout 166, 1 Sep 28 10:37 /dev/ttyACM1
crw-rw-rw- 1 root dialout 166, 2 Sep 28 07:28 /dev/ttyACM2

我想创建一个到第一个设备的符号链接(ttyACM1在本例中)。但在使用时,usb-devices它只会为电路板创建一个部分,其中包含一组供应商 ID + 产品 ID:

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=0451 ProdID=bef3 Rev=01.00
S:  Manufacturer=Texas Instruments
S:  Product=XDS110 (03.00.00.15) Embed with CMSIS-DAP
S:  SerialNumber=L430037Y
C:  #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
I:  If#=0x3 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x4 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x5 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
I:  If#=0x6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)

然后我使用这些 ID 创建规则/etc/udev/rules.d/50-devboards.rules

# Texas Instruments CC1352P-2 development kit
KERNEL=="ttyACM*" ATTRS{idVendor}=="0451", ATTRS{idProduct}=="bef3", MODE="0666", SYMLINK+="tty-CC1352P-2"

这最终会创建一个指向 的符号链接ttyACM2,而不是ttyACM1.

lrwxrwxrwx 1 root root 7 Sep 28 07:28 /dev/tty-CC1352P-2 -> ttyACM2

问题:如果一个单元在 下创建多个 tty 设备,如何将规则定位到特定 tty 设备/dev

答案1

在“tty设备”和“USB设备”之间有一个中间层——“USB界面”。驱动程序并不作为一个整体连接到 USB 设备,但每个接口都有某个驱动程序的单独实例(可能是不同的驱动程序)。

(不幸的是 Ubuntu 不包括 usbutils'lsusb.py,使用该-i选项它将显示完整的 USB 层次结构,包括接口。)

您的 USB 设备有多个编号为 0x00 到 0x06 的接口,并且 ttyACM1 可能是通过接口 0 创建的,而 ttyACM2 是通过接口 3 创建的(但您可以使用它udevadm info /dev/ttyACM2来查找)。

使用接口编号作为匹配的一部分,例如ATTRS{bInterfaceNumber}=="00"


但是,单个规则中的所有 ATTRS(和 ENVS)匹配都会锁定到同一“父”级别,而您需要匹配来自两个不同级别的属性。因此,您可能需要使用 ENVS 和/或有两个规则:

  1. 在第一条规则中,匹配“interface”设备并应用 ENV 属性:

    ACTION!="remove", DEVTYPE=="usb_interface", \
      ATTRS{idVendor}=="xx", ATTRS{idProduct}=="xx", \
      ATTR{bInterfaceNumber}=="xx",
      ENV{devboard_link}="tty-CC1352P-2"
    
  2. 然后匹配“tty”设备并检查父设备是否具有该属性:

    ACTION!="remove", SUBSYSTEM=="tty", \
      ENVS{devboard_link}=="?*",
      IMPORT{parent}="devboard_link",
      TAG+="uaccess", SYMLINK+="$env{devboard_link}"
    

(示例未经测试。)

相关内容