如何防止為 cdc_acm 打開 DTR?
我有一個通過 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/ttyACM0
tl;dr:在不發送 DTR/RTS/DSR/CTS 信號的情況下,我需要做什麼才能訪問(沒有在硬體級別阻塞信號)?
當使用者態程序打開類似
/dev/ttyS0
or的串列設備/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
其他驅動程序也可以使用類似的技巧;我個人已經將它與
PL2303
usb -> 串列驅動程序一起使用。$$ The diff is informative; it will not apply directly because this site mangles tabs and whitespaces $$