我是一名潜水员,拥有 2 台潜水电脑。这两台电脑可以连接到 USB 端口,使用 Linus 的 SubSurface 潜水日志程序,我可以从它们导入潜水日志。一台是 Atomic Aquatics Cobalt,另一台是 Suunto D4i。现在我想用 udev 为它们每台电脑创建 dev 文件,这样我就可以将它们连接到任何 USB 端口,并且仍在日志软件中使用相同的 dev 文件。(例如 /dev/my_cobalt 和 /dev/my_d4i)
两者使用相同(类型)的配置。
对于 D4i,dev 文件的使用被自动创建的 /dev/ttyUSB0 阻止。
对于两台潜水电脑,dev 文件都会被创建,对于 Cobalt,一切按预期运行,但对于 D4i,却不行。
我可以使用 /dev/ttyUSB0,但不能使用 /dev/my_d4i。
不知何故(我不确定)这似乎是由它们向 USB 总线呈现的方式不同造成的。请参阅下面的 lsusb 输出。
如果有人能告诉我是什么原因导致了这种差异以及/或者如何解决这个问题,我将不胜感激。(为什么连接 d4i 时也会创建 ttyUSB dev 文件?)
以下是有关发现/设置的一些信息。
/etc/udev/rules.d/dive-computers.rules
# My Cobalt2 DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660"
# My Suunto D4i DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660"
连接 Cobalt 后的 dev-files
lrwxrwxrwx 1 root root 15 mei 16 23:13 my_cobalt -> bus/usb/003/007
# no ttyUSB0 created
连接 d4i 后的 dev-files
lrwxrwxrwx 1 root root 15 mei 16 23:15 my_d4i -> bus/usb/003/009
crw-rw---- 1 root dialout 188, 0 mei 16 23:15 ttyUSB0
lsusb -v -D /dev/bus/usb/003/007(钴)
设备:ID 0471:0888 Philips(或 NXP)Hantek DDS-3005 任意波形发生器 设备描述符: b长度 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 220 诊断 bDeviceSubClass 1 可重新编程诊断 bDeviceProtocol 1 USB2 兼容性 最大数据包大小0 16 idVendor 0x0471 飞利浦(或 NXP) idProduct 0x0888 Hantek DDS-3005 任意波形发生器 bcd设备 0.02 iManufacturer 1 原子水族 iProduct 2 钴 iSerial 3 123456789ABCDEF bNumConfigurations 1 配置描述符: b长度 9 bDescriptorType 2 w总长度 39 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 4 控制台 bmAttributes 0xe0 自供电 远程唤醒 最大功率500mA 接口描述符: b长度 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 bInterfaceClass 220 诊断 bInterfaceSubClass 160 bInterfaceProtocol 176 接口 0 端点描述符: b长度 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 输入 bmAttributes 2 传输类型 批量 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔 0 端点描述符: b长度 7 bDescriptorType 5 b端点地址 0x02 EP 2 输出 bmAttributes 2 传输类型 批量 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔 0 端点描述符: b长度 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 输入 bmAttributes 2 传输类型 批量 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔 0 设备状态:0x0101 自供电
lsusb -v -D /dev/bus/usb/003/009(D4i)
设备:ID 0403:6001 Future Technology Devices International, Ltd FT232 USB 串行 (UART) IC 设备描述符: b长度 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0(在接口级别定义) bDeviceSubClass 0 bDeviceProtocol 0 最大数据包大小0 8 idVendor 0x0403 未来技术设备国际有限公司 idProduct 0x6001 FT232 USB 串行 (UART) IC bcd设备 6.00 iManufacturer 1 智能接口 iProduct 2 USB 串行电缆 iSerial 3 DiYISDGK bNumConfigurations 1 配置描述符: b长度 9 bDescriptorType 2 w总长度 32 bNumInterfaces 1 bConfigurationValue 1 配置 0 bmAttributes 0xa0 (总线供电) 远程唤醒 最大功率500mA 接口描述符: b长度 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 供应商特定类 bInterfaceSubClass 255 供应商特定子类 bInterfaceProtocol 255 供应商特定协议 iInterface 2 USB 串行电缆 端点描述符: b长度 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 输入 bmAttributes 2 传输类型 批量 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔 0 端点描述符: b长度 7 bDescriptorType 5 b端点地址 0x02 EP 2 输出 bmAttributes 2 传输类型 批量 同步类型 无 使用类型数据 wMaxPacketSize 0x0040 1x 64 字节 b间隔 0 设备状态:0x0000 (总线供电)
软件日志记录(物有所值)
从 /dev/my_d4i 开始下载 启动线程 0 [0.000126] 错误:设备 (25) 的 ioctl 不适当 [在 ../../src/serial_posix.c:308 (dc_serial_open)] [0.000156] 错误:无法打开串行端口。[在 ../../src/suunto_d9.c:155 (suunto_d9_device_open) 中] 信息:dc_deveice_open 错误值为 -6 正在完成线程 无法打开 %s %s (%s) 次下载 0 从 /dev/ttyUSB0 开始下载 启动线程 0 信息:dc_deveice_open 错误值为 0 整理线程潜水下载0
答案1
所以 dirkt 的评论让我思考,我再次核实了一些事实。udevadm 监控器然后连接设备,我得到以下结果:
钴:
KERNEL[25393.161856] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
KERNEL[25393.165873] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[25393.165941] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV [25393.183044] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV [25393.185175] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV [25393.186958] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
D4i
KERNEL[24333.615580] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
KERNEL[24333.618406] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[24333.618444] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
KERNEL[24333.618615] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty)
KERNEL[24333.618644] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
KERNEL[24333.618685] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
KERNEL[24333.618729] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV [24333.637591] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
UDEV [24333.639773] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV [24333.641366] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
UDEV [24333.648159] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty)
UDEV [24333.648969] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial)
UDEV [24333.649799] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb)
UDEV [24333.650906] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb)
由此我猜测正确的 udev-subsystems 应该是:
- d4i-->tty
- 钴 --> USB
并且正如 dirkt 提到的那样,使用 ATTRS 而不是 ATTR 来匹配整个设备路径。因此我将 udev-rules 更改为:
# My Cobalt2 DiveComputer
SUBSYSTEM=="usb", ATTR{idVendor}=="0471", ATTR{idProduct}=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660"
# My Suunto D4i DiveComputer
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="DiYISDGK", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660"
重新启动 udev 并重新连接设备后,我得到:
ls -l /dev/tty_d4i
lrwxrwxrwx 1 root root 7 mei 22 00:43 tty_d4i -> ttyUSB0
这使得它按我想要的方式工作。我仍然不能 100% 确定原因,但我想这可能是我对 udev 的了解有限。我会继续调查 udev,但目前看来这个问题已经解决了。所以感谢 dirkt 的提示。
供参考的输出:
sudo udevadm 信息 -a -n /dev/ttyUSB0
udevadm info 从 devpath 指定的设备开始,然后 遍历父设备链。它会打印每个设备 找到 udev 规则键格式的所有可能的属性。 匹配规则,可以由设备的属性组成 以及来自单个父设备的属性。 查看设备'/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0/tty/ttyUSB0': 内核==“ttyUSB0” 子系统==“tty” 司机==“” 查看父设备'/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0': 内核==“ttyUSB0” 子系统==“usb-serial” 驱动程序==“ftdi_sio” ATTRS{latency_timer}=="16" ATTRS{端口号}=="0" 查看父设备'/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0': 内核==“3-7:1.0” 子系统==“usb” 驱动程序==“ftdi_sio” ATTRS{授权}=="1" ATTRS{bAlternateSetting}==" 0" ATTRS{bInterfaceClass}=="ff" ATTRS{bInterfaceNumber}=="00" ATTRS{bInterfaceProtocol}=="ff" ATTRS{bInterfaceSubClass}=="ff" ATTRS{bNumEndpoints}=="02" ATTRS{interface}=="USB 串行电缆" ATTRS{supports_autosuspend}=="1" 查看父设备'/devices/pci0000:00/0000:00:14.0/usb3/3-7': 内核==“3-7” 子系统==“usb” 驱动程序==“usb” ATTRS{授权}=="1" ATTRS{avoid_reset_quirk}=="0" ATTRS{bConfigurationValue}=="1" ATTRS{bDeviceClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bDeviceSubClass}=="00" ATTRS{bMaxPacketSize0}=="8" ATTRS{bMaxPower}=="500mA" ATTRS{bNumConfigurations}=="1" ATTRS{bNumInterfaces}==" 1" ATTRS{bcdDevice}=="0600" ATTRS{bmAttributes}=="a0" ATTRS{总线号}=="3" ATTRS{配置}=="" ATTRS{devnum}=="14" ATTRS{devpath}=="7" ATTRS{idProduct}=="6001" ATTRS{idVendor}=="0403" ATTRS{ltm_capable}=="否" ATTRS{制造商}=="智能接口" ATTRS{maxchild}=="0" ATTRS{product}=="USB 串行电缆" ATTRS{quirks}=="0x0" ATTRS{可移动}=="可移动" ATTRS{序列号}=="DiYISDGK" ATTRS{速度}=="12" ATTRS{urbnum}=="15" ATTRS{版本}==" 2.00" 查看父设备'/devices/pci0000:00/0000:00:14.0/usb3': 内核==“usb3” 子系统==“usb” 驱动程序==“usb” ATTRS{授权}=="1" ATTRS{authorized_default}=="1" ATTRS{avoid_reset_quirk}=="0" ATTRS{bConfigurationValue}=="1" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceProtocol}=="01" ATTRS{bDeviceSubClass}=="00" ATTRS{bMaxPacketSize0}=="64" ATTRS{bMaxPower}=="0mA" ATTRS{bNumConfigurations}=="1" ATTRS{bNumInterfaces}==" 1" ATTRS{bcdDevice}=="0415" ATTRS{bmAttributes}=="e0" ATTRS{总线号}=="3" ATTRS{配置}=="" ATTRS{devnum}=="1" ATTRS{devpath}=="0" ATTRS{idProduct}=="0002" ATTRS{idVendor}=="1d6b" ATTRS{interface_authorized_default}=="1" ATTRS{ltm_capable}=="否" ATTRS{制造商}=="Linux 4.15.0-20-通用 xhci-hcd" ATTRS{maxchild}=="15" ATTRS{product}=="xHCI 主机控制器" ATTRS{quirks}=="0x0" ATTRS{可移动}=="未知" ATTRS{序列号}=="0000:00:14.0" ATTRS{速度}=="480" ATTRS{urbnum}=="264" ATTRS{版本}==" 2.00" 查看父设备'/devices/pci0000:00/0000:00:14.0': 内核==“0000:00:14.0” 子系统==“pci” 驱动程序==“xhci_hcd” ATTRS{broken_parity_status}=="0" ATTRS{class}=="0x0c0330" ATTRS{consistent_dma_mask_bits}=="64" ATTRS{d3cold_allowed}=="1" ATTRS{dbc}=="已禁用" ATTRS{设备}=="0x8d31" ATTRS{dma_mask_bits}=="64" ATTRS{driver_override}=="(null)" ATTRS{启用}=="1" ATTRS{irq}=="19" ATTRS{local_cpulist}=="0-11" ATTRS{local_cpus}=="fff" ATTRS{msi_bus}=="1" ATTRS{numa_node}=="0" ATTRS{修订}=="0x05" ATTRS{子系统设备}=="0x7a54" ATTRS{子系统供应商}=="0x1462" ATTRS{供应商}=="0x8086" 查看父设备'/devices/pci0000:00': 内核==“pci0000:00” 子系统=="" 司机==“”