如何防止 cdc_acm 打开时出现 DTR?

Jam*_*ude 6 serial-port ioctl

我使用cdc_acm驱动程序通过 USB 连接了一个 Arduino Uno 。它可以在/dev/ttyACM0

Arduino 串行接口的约定是用于DTR复位信号的信号——当使用集成串行转 USB 适配器时,DTR/RTS/DSR/CTS 信号;或者,当使用 RS-232 电缆时,引脚 4 或 5(可能还有 6 或 8)连接到RESET引脚。

这种复位途径具有重要的优势,即使不是真正的带外,至少也非常接近故障安全(由于通过始终带外串行控制器与非正常用户一起实现) -可控看门狗电路),虽然它可以被物理禁用(通过将电容器或电阻器连接到RESET引脚,取决于型号),这样做会完全破坏这个重要的终止开关和所有相关的实用程序。

不幸的是,目前,当任何程序出于任何原因连接到 ACM 设备时,Linux似乎总是发送此信号,并且(与 Windows 不同)没有提供甚至模糊已知的可靠方法来防止这种情况发生。

(目前两种-hupcl“当最后一个进程关闭TTY发送挂起信号”-clocal“禁用调制解调器控制信号”没有阻止发送这个信号每次设备被打开。)


tl; dr:我需要做什么才能在/dev/ttyACM0不向其发送 DTR/RTS/DSR/CTS 信号的情况下访问(在硬件级别阻止信号)?

小智 6

当用户态进程打开串行设备(如/dev/ttyS0或 )时/dev/ttyACM0,linuxDTR/RTS默认会升高这些行,并在关闭它时丢弃它们。

它通过调用dtr_rts驱动程序定义的回调来实现这一点。

不幸的是,还没有任何 sysctl 或类似的东西允许禁用这种烦人的行为(现在很少用),所以唯一有效的方法是从驱动程序结构中删除该回调tty_port_operations,并重新编译驱动程序模块。

cdc-acm您可以通过注释掉这一行来为驱动程序执行此操作:

--- drivers/usb/class/cdc-acm.c~
+++ drivers/usb/class/cdc-acm.c
@@ -1063,7 +1063,7 @@
 }

 static const struct tty_port_operations acm_port_ops = {
-       .dtr_rts = acm_port_dtr_rts,
+       /* .dtr_rts = acm_port_dtr_rts, */
        .shutdown = acm_port_shutdown,
        .activate = acm_port_activate,
        .destruct = acm_port_destruct,
Run Code Online (Sandbox Code Playgroud)

这不会阻止DTR/RTS您通过串行 ioctl(如TIOCMSETTIOCMBIC、 )使用线路,这些线路将像往常一样由结构中的 等回调TIOCMBIS处理。acm_tty_tiocmset()acm_ops

类似的黑客攻击也可用于其他驱动程序;我个人已经将其与PL2303USB -> 串行驱动程序一起使用。

[差异信息丰富;它不会直接应用,因为该网站会破坏制表符和空格]