Linux下如何阻止CDC-ACM驱动加载设备以适配WebUSB连接串口设备?
我来帮你拆解这个问题,分两部分给出具体的解决方案和分析:
方法一:无需修改桌面设置,阻止CDC-ACM驱动绑定目标设备
如果不想动桌面环境设置,你可以通过临时解绑驱动或者永久udev规则两种方式让CDC-ACM不抢占你的设备:
临时解绑(单次生效,重启后恢复)
- 先通过
lsusb找到设备的VID和PID,比如假设是1234:5678 - 定位到CDC-ACM驱动的绑定目录:
cd /sys/bus/usb/drivers/cdc_acm/ - 找到对应设备的节点(格式通常是
usbX:Y.Z,也可以直接匹配VID:PID对应的路径),执行解绑:
解绑后CDC-ACM就不再占用这个设备,此时Chrome的WebUSB应该能正常声明接口。echo "1-1.2" > unbind # 替换成你的设备实际路径
永久生效(通过udev规则)
这种方式无需修改桌面设置,系统启动时会自动阻止CDC-ACM绑定目标设备:
- 创建udev规则文件:
sudo touch /etc/udev/rules.d/99-block-cdc-acm.rules - 编辑文件并写入规则(替换成你的设备VID和PID):
这条规则会让udev不为该设备生成驱动匹配的alias,从而阻止CDC-ACM自动加载。SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", ENV{MODALIAS}="" - 重新加载udev规则生效:
之后重新插拔设备,CDC-ACM就不会再绑定这个设备了。sudo udevadm control --reload-rules sudo udevadm trigger
方法二:修改USB描述符的可行性
完全可行!而且这是从根源上解决冲突的方法:
CDC-ACM驱动是针对USB设备类为0x02(通信类)、子类0x02(ACM)的设备自动加载的。如果你在设备固件里修改USB描述符,把接口类改成自定义类(0xFF),或者把ACM子类改成其他非标准值,Linux内核就不会识别它为CDC-ACM设备,自然不会加载对应的驱动。
另外,为了让WebUSB能正常访问这个设备,你还需要在描述符里添加WebUSB扩展属性:
- 设备描述符设置
bDeviceClass=0xFF(自定义类) - 新增WebUSB扩展描述符,指定允许访问的域名(调试阶段可以用
0允许所有域名)
修改描述符后,设备插入Linux时系统不会自动加载CDC-ACM,WebUSB可以直接声明接口,不需要任何系统层面的设置修改。
内容的提问来源于stack exchange,提问作者Mascarpone
相关产品推荐
相关产品推荐

