在启动时将 USB 设备映射到静态地址

在启动时将 USB 设备映射到静态地址

我的计算机连接了几个 USB 设备:

  1. 基于 FT232 的 USB-UART 转换器:用于使用串行协议在微控制器和计算机之间发送和接收数据。
  2. 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"

问题:

  1. 即使触发udevadm重新加载规则后,启动后也不会更改地址。我用
sudo udevadm control --reload-rules
sudo udevadm trigger

重新加载规则。这应该加载规则,或者如果不能加载则抱怨,对吧?但是,当此替换不起作用时,它不会引发任何错误。它只是将 cp210x 设备指定为ttyUSB0,将 FTDI 设备指定为ttyUSB1。只有当我sudo dmesg | grep tty再次这样做时我才能知道这一点。

  1. 如何使用我写入的 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 规则的副本。

相关内容