isi*_*or3 5 udev tty serial-port
我将 USB 蜂窝调制解调器连接到运行 voyage linux(基于 Debian Squeeze)的 ALIX 3d2 板。调制解调器将自己注册为 TTY 设备,因此默认情况下,udev 将在/dev
. 但是,可能还连接了其他 USB 转串口设备,我想知道有关调制解调器的参考。所以,我写了一个简单的 udev 规则来建立从调制解调器到的链接,/dev/ttyModem{0-3}
但是我能找到的自动处理编号的唯一方法是通过%n
udev 中的变量,/dev/ttyModem{4-7}
如果一个四端口 USB-to-在调制解调器之前枚举串行适配器。我%e
在旧的 udev 文档中找到了一些对变量的引用,它们可以满足我的需要,
幸运的是,每个 tty 设备都有一个可以从设备引用的端口号,所以我应该能够手动处理编号。我可以根据端口号创建链接,但是每当我尝试同时使用端口号和 USB vendorID+productID 时,就不再应用该规则。我怀疑我可能在某处违反了“单一父设备”规则,因为根据 ,这些属性在不同的设备中被识别udevadm info
,但据我所知,所有属性都应该来自一个设备及其父设备。
以下是我应用的规则:
这个规则是有效的,也是我开始使用的规则,但它生成的数字可能不是从 0 开始的。
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyUSBID%n"
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用四个规则来指定端口号,但是,这失败了,我认为这是因为它违反了“一个单一的父设备”规则。
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{port_number}=="0", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyFailingPort0"
Run Code Online (Sandbox Code Playgroud)
此规则的每个条件都应来自同一个节点,因此此规则(按您的预期工作)应该能够引用父节点。
SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{port_number}=="0", SYMLINK+="ttyPortNumberChild0"
Run Code Online (Sandbox Code Playgroud)
但是,这条规则失败了,我不知道为什么。
SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{idVendor}=="1199" ATTRS{port_number}=="0", SYMLINK+="ttyFailingPortNumber0
Run Code Online (Sandbox Code Playgroud)
这里是输出udevadm info --attribute-walk
的端口0,端口1,端口2,端口3。倒数第二个设备包含端口号,第四个设备包含识别 USB 信息。
我意识到这是一个XY 问题,所以如果您知道给调制解调器一个固定名称的更好方法,请随时将其作为您的答案发布。
我最终通过拆分多个规则之间的配置来解决“只有一个父级”的限制。对于那些感兴趣的人,这是我最终得到的代码:
ACTION!="add", GOTO="modem_rules_end"
SUBSYSTEM!="tty" GOTO="modem_rules_end"
#ModemType1
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", GOTO="type1_rules_begin"
GOTO="type1_rules_end"
LABEL="type1_rules_begin"
ATTRS{port_number}=="0", SYMLINK:="ttyType1_0"
ATTRS{port_number}=="1", SYMLINK:="ttyType1_1"
ATTRS{port_number}=="2", SYMLINK:="ttyType1_2"
ATTRS{port_number}=="3", SYMLINK:="ttyType1_3"
LABEL="type1_rules_end"
LABEL="modem_rules_end"
Run Code Online (Sandbox Code Playgroud)