额外创建的 /dev/ttyUSB 阻止使用自定义 udev 配置的 dev 文件

额外创建的 /dev/ttyUSB 阻止使用自定义 udev 配置的 dev 文件

我是一名潜水员,拥有 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”
    子系统==""
    司机==“”

相关内容