我在移动设备上使用带有 Ubuntu Mate 的 Raspberry Pi 3 Model B,连接到 IMU、GPS 和两个 LIDAR。
Ubuntu 16.04.2
内核版本 4.4.38-v7+
设备在通电后启动,然后启动驱动程序和程序来采样数据。这些程序必须预先分配设备的端口(ttyUSB* 或符号链接)。
每次启动时,USB 设备都会选择一个随机的 ttyUSB* 来配合。这对于 IMU 和 GPS 来说效果很好,因为它们具有唯一的串行 ID 等,但是,LIDAR 设备都使用相同的 UART 转 USB 芯片,彼此无法区分。
LSSB:
总线 001 设备 005:ID 0403:6014 Future Technology Devices International, Ltd FT232H 单 HS USB-UART/FIFO I2C
总线 001 设备 004:ID 06c2:0033 Phidgets Inc.(以前称为 GLAB)
总线 001 设备 007:ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART 桥接器 / myAVR mySmartUSB light
总线 001 设备 006:ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART 桥接器 / myAVR mySmartUSB light
总线 001 设备 003:ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 快速以太网适配器
总线 001 设备 002:ID 0424:9514 Standard Microsystems Corp. SMC9514 集线器
总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
我尝试比较设备信息,看看如何区分它们。
diff <(udevadm 信息 --name /dev/ttyUSB1) <(udevadm 信息 --name /dev/ttyUSB2)
1,2c1,2
- P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1
- N: ttyUSB1
---
+ P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB2/tty/ttyUSB2
+ N: ttyUSB24,7c4,7
- S: 串行/通过路径/平台-3f980000.usb-usb-0:1.2:1.0-port0
- E: DEVLINKS=/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0
- E: DEVNAME=/dev/ttyUSB1
- E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1 /1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1
---
+ S: 串行/按路径/平台-3f980000.usb-usb-0:1.3:1.0-port0
+ E: DEVLINKS=/dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0 /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
+ E: DEVNAME=/dev/ ttyUSB2
+ E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB2/tty/ttyUSB214,15c14,15
- E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0
- E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0
---
+ E: ID_PATH=platform-3f980000.usb-usb -0:1.3:1.0
+ E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_3_1_028c28
- E: 小数=1
---
+ E: 小数=231c31
- E: USEC_INITIALIZED=4706121921
---
+ E: USEC_INITIALIZED=4706424041
在这个阶段,我想做的是为 Raspberry Pi 上的每个物理 USB 端口分配一个持久名称,这样,只要设备插入正确的插座,它就可以工作。我尝试了很多规则但没有成功。许多组合:
内核==“ttyUSB *”,内核==“1-1.2”,名称=“ttyUSB0”,模式=“0666”内核==“ttyUSB *”,内核==“1-1.2:1.0”,名称=“ ttyUSB0",MODE="0666" 内核=="ttyUSB*",内核=="1-1.3",NAME="ttyUSB1",MODE="0666" 内核=="ttyUSB*",内核=="1- 1.3:1.0",名称="ttyUSB1",模式="0666"内核=="ttyUSB*",内核=="1-1.5",名称="ttyUSB2",模式="0666"内核=="ttyUSB* “,内核==”1-1.5:1.0”,名称=“ttyUSB2”,模式=“0666”
正如这里推荐的;https://askubuntu.com/questions/49910/how-to-distinguish- Between-identical-usb-to-serial-adapters
从 udevadm 信息来看,唯一的其他区别似乎是 MINOR 属性,但我还没有弄清楚如何使用此信息。到目前为止我最好的猜测是:
SUBSYSTEM==“tty”,ATTRS{idVendor}==“10c4”,ATTRS{idProduct}==“ea60”,ATTRS{次要}==“1”,SYMLINK + =“rplidar1”
SUBSYSTEM==“tty”,ATTRS {idVendor}==“10c4”,ATTRS {idProduct}==“ea60”,ATTRS {次要}==“2”,SYMLINK + =“rplidar2”
但这似乎也不起作用(我也尝试过MINOR和minor)。
答案1
我找到了解决方案。以下规则将符号链接分配给给定设备的相应 USB 端口。您也许可以摆脱 idVendor 和 idProduct 术语。
子系统==“tty”,内核==“1-1.2”,ATTRS {idVendor}==“10c4”,ATTRS {idProduct}==“ea60”,SYMLINK + =“rplidar1”
子系统==“tty”,内核= ="1-1.3",ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",SYMLINK+="rplidar2"