我的计算机连接了几个 USB 设备:
- 基于 FT232 的 USB-UART 转换器:用于使用串行协议在微控制器和计算机之间发送和接收数据。
- YDLidar TG15:用于绘制环境图。产品页面
我在 NUC 上运行 Lubuntu 22.04 LTS。
我希望能够在每次计算机启动时将基于 FT232 的设备分配给dev/ttyUSB0
,并将使用 cp210x 串行转换器的 YDLidar 分配给 。dev/ttyUSB1
我想要的配置如下所示:
$ sudo dmesg | grep tty
[ 0.095479] printk: console [tty0] enabled
[ 6.046918] usb 1-3: FTDI USB Serial Device converter now attached to ttyUSB0
[ 57.282034] usb 1-4: cp210x converter now attached to ttyUSB1
我能够在线关注一些资源,例如这个,这个, 和这个,这帮助我为我的用例编写了自定义规则,如下所示。
$ cat /etc/udev/rules.d/34-usb-serial.rules
# Assign FTDI chips to /dev/ttyFTDI
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK="ttyUSB0"
# Assign Silicon Labs UART converters to /dev/ttyUSB1
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK="ttyUSB1"
问题:
- 即使触发
udevadm
重新加载规则后,启动后也不会更改地址。我用
sudo udevadm control --reload-rules
sudo udevadm trigger
重新加载规则。这应该加载规则,或者如果不能加载则抱怨,对吧?但是,当此替换不起作用时,它不会引发任何错误。它只是将 cp210x 设备指定为ttyUSB0
,将 FTDI 设备指定为ttyUSB1
。只有当我sudo dmesg | grep tty
再次这样做时我才能知道这一点。
- 如何使用我写入的 udev 规则适当地在启动时为这些设备分配适当的 ID?
附:如果在这种情况下什么被视为“适当”有任何歧义,我只想要一些能够以稳健的方式工作的东西,同时尽可能严格地遵循编辑这些文件时遵循的“最佳实践”。
提前致谢!
答案1
您可能无法使用SYMLINK="ttyUSB0"
或 ,SYMLINK="ttyUSB1"
因为它们会与 USB 串行转换器设备的标准名称重叠。
通过现代udev
实施,您不能覆盖标准名称,但您将能够创建额外的符号链接。
您应该根据自定义设备节点的用途来命名它们:
# FTDI serial converter for microcontroller
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="ttyUSBmc"
# Silicon Labs serial converter for LIDAR
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="ttyUSBlidar"
根据这些规则,串行转换器将获取实际的设备名称/dev/ttyUSB0
以及/dev/ttyUSB1
每次启动时检测到的顺序,但/dev/ttyUSBmc
将是始终指向 FTDI 串行转换器的符号链接,并且/dev/ttyUSBlidar
始终指向 Silicon Labs 串行转换器。
另外,创建这些 udev 规则后,您应该重建 initramfs 文件。 USB 串行转换器的驱动程序可能会在启动过程的早期加载,然后再挂载真正的根文件系统。
通过更新 initramfs,您将确保即使在加载最早的驱动程序时也会存在您添加的 udev 规则的副本。