我想/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 和/或有两个规则:
在第一条规则中,匹配“interface”设备并应用 ENV 属性:
ACTION!="remove", DEVTYPE=="usb_interface", \ ATTRS{idVendor}=="xx", ATTRS{idProduct}=="xx", \ ATTR{bInterfaceNumber}=="xx", ENV{devboard_link}="tty-CC1352P-2"
然后匹配“tty”设备并检查父设备是否具有该属性:
ACTION!="remove", SUBSYSTEM=="tty", \ ENVS{devboard_link}=="?*", IMPORT{parent}="devboard_link", TAG+="uaccess", SYMLINK+="$env{devboard_link}"
(示例未经测试。)