我使用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
,“禁用调制解调器控制信号”也没有阻止发送这个信号每次设备被打开。)
/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(如TIOCMSET
、TIOCMBIC
、 )使用线路,这些线路将像往常一样由结构中的 等回调TIOCMBIS
处理。acm_tty_tiocmset()
acm_ops
类似的黑客攻击也可用于其他驱动程序;我个人已经将其与PL2303
USB -> 串行驱动程序一起使用。
[差异信息丰富;它不会直接应用,因为该网站会破坏制表符和空格]
归档时间: |
|
查看次数: |
2141 次 |
最近记录: |