1. 问题背景与现象分析
最近在调试一块基于沁恒CH344芯片的USB转4串口扩展板时,遇到了一个典型问题:在Linux系统下,设备会被默认加载cdc_acm驱动,导致无法正常使用原生功能。这个现象在嵌入式开发和工业控制领域相当常见,特别是使用多串口转换芯片时。
当我们将设备插入Ubuntu 20.04 LTS系统后,通过lsusb命令可以看到设备被识别:
code复制Bus 001 Device 005: ID 1a86:55d4 QinHeng Electronics CH344
但查看dmesg输出时,会发现这样的记录:
code复制usb 1-1.2: new full-speed USB device number 5 using xhci_hcd
usb 1-1.2: New USB device found, idVendor=1a86, idProduct=55d4
usb 1-1.2: Product: USB2.0-Ser
usb 1-1.2: Manufacturer: wch.cn
cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
此时设备被识别为/dev/ttyACM0,而不是我们期望的四个串口设备。这是因为Linux内核的CDC-ACM驱动会主动接管符合USB通信设备类标准的设备。
2. 技术原理深度解析
2.1 CH344芯片的工作模式
CH344是沁恒电子推出的一款USB转4串口芯片,支持以下工作模式:
- 原生多串口模式(默认VID/PID为1A86:55D4)
- CDC-ACM兼容模式
- 打印机模式(需硬件跳线)
芯片内部包含USB控制器和四个独立的UART控制器,每个UART可独立配置波特率(最高3Mbps)。在Windows系统下,安装官方驱动后会自动创建COM3-COM6四个端口。
2.2 Linux驱动加载机制
Linux内核通过以下匹配机制加载驱动:
- 首先检查设备ID是否在驱动程序的
id_table中 - 然后检查设备接口描述符的类/子类/协议码
- 最后尝试通用驱动(如cdc_acm)
CH344在默认模式下会声明为CDC类设备(Class=0x02),因此会被cdc_acm驱动优先捕获。这与P
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容