如何为给定设备创建 `/dev/ttyACMx`

如何为给定设备创建 `/dev/ttyACMx`

我使用 cypress 的两个原型板:CY8CKIT-043 和 CY8CKIT-049。

当我将第一个插入 USB 端口时,/dev/ttyACM0会创建一个,我可以与该设备进行通信。

对于第二个,事情更复杂,似乎板上有一个USB串行设备,但没有安装任何东西。

第二个设备被视为温度计(如dmesg和 lsusb 报告)

我搜索了udev与每个设备相关的规则,但我只会更加困惑:

对于工作的人来说,在60-openocd.rules

# Cypress KitProg in KitProg mode
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="f139", MODE="660", GROUP="plugdev", TAG+="uaccess

对于另一个,我在 中找到了它77-mm-usb-serial-adapters-greylist.rules,我不确定,但如果我理解得好的话,该设备将无法正常使用(?)

ATTRS{idVendor}=="04B4", ATTRS{idProduct}=="0002", ENV{ID_MM_TTY_MANUAL_SCAN_ONLY}="1"

问题

  • 我是否试图让某些事情变得不可能?
  • 如果没有,我怎样才能告诉系统/dev/ttyACMx使用cdc_acmUSB 总线xxx设备的驱动程序创建文件yyy

我尝试过的 阅读https://www.linuxquestions.org/questions/linux-hardware-18/forcing-a-specific-driver-for-a-device-through-udev-836411/,我尝试创建一些 udev 规则,例如

ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="0002", RUN+="modprobe cdc_acm", NAME="ttytest"

但没有成功。


更多信息

043(工作设备)的 lsusb:

Bus 001 Device 029: ID 04b4:f139 Cypress Semiconductor Corp. Cypress KitProg
Device Descriptor:
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0         8
  idVendor           0x04b4 Cypress Semiconductor Corp.
  idProduct          0xf139 
  bcdDevice            2.15
  iManufacturer           1 Cypress Semiconductor
  iProduct                2 Cypress KitProg
...

043(工作设备)的 dmesg:

usb 1-2: New USB device found, idVendor=04b4, idProduct=f139, bcdDevice= 2.15
usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=128
usb 1-2: Product: Cypress KitProg
usb 1-2: Manufacturer: Cypress Semiconductor
usb 1-2: SerialNumber: 0B05091C02179400
hid-generic 0003:04B4:F139.000B: hiddev0,hidraw3: USB HID v1.11 Device [Cypress Semiconductor Cypress KitProg] on usb-0000:00:14.0-2/input0
cdc_acm 1-2:1.2: ttyACM0: USB ACM device

049 的 lsusb(不工作):

Bus 001 Device 011: ID 04b4:0002 Cypress Semiconductor Corp. CY7C63x0x Thermometer
Device Descriptor:
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x04b4 Cypress Semiconductor Corp.
  idProduct          0x0002 CY7C63x0x Thermometer
  bcdDevice            0.00
  iManufacturer           1 Cypress Semiconductor
  iProduct                2 USB-Serial (Single Channel)
...

049 的 dmes(不工作):

usb 1-2: New USB device found, idVendor=04b4, idProduct=0002, bcdDevice= 0.00
usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-2: Product: USB-Serial (Single Channel)
usb 1-2: Manufacturer: Cypress Semiconductor
cytherm 1-2:1.0: Cypress thermometer device now attached
cytherm 1-2:1.1: Cypress thermometer device now attached
cytherm 1-2:1.2: Cypress thermometer device now attached

答案1

由于某种原因,板 049 提供了与 CY7C63x0x 温度计关联的 USB 产品 ID,该温度计有自己的cytherm驱动程序。

由于cytherm驱动程序是通过供应商+产品 ID 进行匹配的,因此它被认为是比通过接口类、子类和协议进行的匹配(与驱动程序匹配)具有更高优先级的匹配cdc-acm

您可以cytherm通过添加此行来将驱动程序列入黑名单,例如/etc/modprobe.d/blacklist.conf

blacklist cytherm

然后modprobe -r cytherm卸载cytherm驱动程序(如果已加载)。

之后,如果您拔下并重新插入设备,cdc-acm驱动程序应该会声明它。

您似乎不是第一个遇到此问题的人:请参阅https://community.infineon.com/t5/USB-low-full-high-speed/USB-to-serial-bridge-recognized-as-Thermometer-04b4-0002-instead-of-as-a-serial/ td-p/350483

udev 规则ENV{ID_MM_TTY_MANUAL_SCAN_ONLY}="1"只是告诉 ModemManager 不要探测移动数据调制解调器等的结果 TTY 设备,除非管理员明确告诉它扫描该设备。对于任何类似 TTY 的非调制解调器设备来说,这实际上是一个好主意,因为探测尝试可能会导致设备出现错误或意外操作。

您可能还需要像这样的 udev 规则来指定设备的权限:

ACTION=="add", ATTRS{idVendor}=="04B4", ATTRS{idProduct}=="0002", MODE="660", GROUP="plugdev", TAG+="uaccess"

显然,也可以使用赛普拉斯编程工具来更改板的产品ID,以永久消除此冲突。如果您需要此板与多个 Linux 系统配合使用,这可能是一个不错的选择(请参阅上面的链接以获取更多信息)。

相关内容