cdc_acmがDTRを開くのを防ぐ方法は?

cdc_acmがDTRを開くのを防ぐ方法は?

ドライバを使用してUSB経由でArduino Unoを接続しましたcdc_acm。で見つけることができます/dev/ttyACM0

Arduinoシリアルインタフェースの規則は、DTR統合シリアルUSBアダプタを使用するとき、またはRS-232ケーブルを使用するときにピン4または5などのリセット信号(DTR / RTS / DSR / CTS信号)を使用することです。 6または8)がRESETピンに接続されています。

このリセットアプローチの重要な利点は、そうでない場合本当に少なくともバンドの外では非常に近い-failsafeできる物理的に無効にすると(モデルに応じてコンデンサまたは抵抗をピンに接続してRESET)、これによりこの重要なキルスイッチと関連するすべてのユーティリティが完全に破壊されます。

残念ながら、そうだ、現在Linuxはプログラムが何らかの理由でACMデバイスに接続されたときに常にこのシグナルを送信します。Windowsとは異なり、)これらの事が発生するのを防ぐために、あいまいに知られている信頼できる方法さえ提供していません。

(現在-hupcl「最後のプロセスが tty を閉じたときに切断信号を送信します。」そして-clocal「モデム制御信号の無効化」するいいえこの信号が送信されないようにブロック毎回デバイスは開いている.)


/dev/ttyACM0tl;dr: DTR/RTS/DSR/CTS シグナルを送信せずに(ハードウェアレベルでシグナルをブロックすることを除く)、アクセス権を取得するにはどうすればよいですか。

ベストアンサー1

Linuxは、デフォルトでは、ユーザースペースプロセスがシリアルデバイス(/dev/ttyS0または)を開いたときに/dev/ttyACM0この行を生成し、閉じるとその行を削除します。DTR/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)を介したワイヤの使用を防ぎますTIOCMBICTIOCMBISacm_tty_tiocmset()acm_ops通常どおり、構造内でコールバックを待ちます。

同様のハッキングを他のドライバにも使用できます。私は個人的にPL2303USB - >シリアルドライバと一緒に使用しました。

[違いは情報を提供することです。サイトがタブとスペースを分割するため、直接適用されません。]

おすすめ記事