Serial-Port

如何防止為 cdc_acm 打開 DTR?

  • February 18, 2021

我有一個通過 USB 連接的 Arduino Uno,使用cdc_acm驅動程序。可在/dev/ttyACM0.

Arduino 串列介面的約定是DTR用於復位信號的信號——當使用集成串列到 USB 適配器時,DTR/RTS/DSR/CTS 信號;或者,當使用 RS-232 電纜時,引腳 4 或 5(可能還有 6 或 8)連接到RESET引腳。

這種重置途徑具有重要的優勢,即使不是真正的帶外,至少非常接近故障安全(由於通過始終帶外串列控制器與非正常使用者一起實現-可控的看門狗電路),雖然它可以被物理禁用(通過將電容器或電阻器連接到引腳,具體取決於型號RESET),這樣做完全破壞了這個重要的killswitch和所有相關的實用程序。

不幸的是,目前看來,當任何程序出於任何原因連接到 ACM 設備時,Linux 絕對總是發送此信號,並且(與 Windows 不同,)沒有提供甚至模糊已知的可靠方法來防止這種情況發生。

(目前-hupcl,*“在最後一個程序關閉 tty 時發送掛斷信號”*和-clocal禁用調製解調器控制信號”不會阻止每次**打開設備時發送此信號。)


/dev/ttyACM0tl;dr:在不發送 DTR/RTS/DSR/CTS 信號的情況下,我需要做什麼才能訪問(沒有在硬體級別阻塞信號)?

當使用者態程序打開類似/dev/ttyS0or的串列設備/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,

不會阻止您DTR/RTS通過串列 ioctl 使用這些行,如TIOCMSET, TIOCMBIC, TIOCMBIS,這將像往常一樣acm_tty_tiocmset()由結構中的 , 等回調處理。acm_ops

其他驅動程序也可以使用類似的技巧;我個人已經將它與PL2303usb -> 串列驅動程序一起使用。

$$ The diff is informative; it will not apply directly because this site mangles tabs and whitespaces $$

引用自:https://unix.stackexchange.com/questions/446088