我使用 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_acm
USB 总线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 系统配合使用,这可能是一个不错的选择(请参阅上面的链接以获取更多信息)。