7

cdc_acmドライバーを使用して予期しない文字がUSBポートに送信されるのに問題があります。これをさらに厄介なものにしているのは、コードがUbuntu 12.04(3.2カーネル)では正常に実行されるが、Centos 6(3.6カーネル)では失敗する(この質問の主題)ことです。

USBデバイスはBluegigaBLED112BluetoothSmartドングルです。埋め込まれたマイクロコントローラーは、USBインターフェイスの予期しない入力でいつでもリセットされます。

テストコードはポートを開き、4バイト(helloメッセージ)を書き込み、応答を読み取ることを期待します。予期しない文字によってデバイスがリセットされ、ハブがデバイスをドロップして再列挙するため、読み取りが完了しません。

トラブルシューティングのために、これが私がしたことです:

  • cdc_acmドライバーのソースコードをダウンロードしました。何が起こっているかを追跡するために、一連のprintkデバッグメッセージとstack_dumpsを追加しました。
  • 「ストック」cdc_acmをrmmodし、インストルメントされたモジュールをinsmodしました。すべてのデバイスの列挙が機能し、適切なドライバーが接続されているなど。
  • コードはUbuntu12.04/ Linux 3.2で動作するため、3.2 cdc_acmコードを取得し、そのモジュールをCentos 6 /Linux3.6プラットフォームでコンパイルしました。3.6モジュールの代わりにその3.2モジュールを使用しても、違いはありませんでした。3.6モジュールに戻しました。
  • usbmonでデバッグファイルシステムをオンにし、USBトラフィックを監視しました。USBインターフェースで余分な文字が送信されていることがわかります。
  • 何が起こっているかを監視するために、cdc_acmモジュールのprintkに加えて、usb monの出力(cat / sys / kernel / debug / usb / usbmon / 3u | logger)とテストアプリケーションの出力(cat / sys / kernel / debug / usb / usbmon / 3u | logger)をマージしました。 scan_example / dev / ttyACM0 | logger -s)なので、時間相関のあるデバッグトレイルの単一ストリームがあります。
  • USBエンドポイントで送信される偽の文字はx5Ex40x5E x40 x5E x40 x5E x40 x41(ASCIIでは^ @ ^ @ ^ @ ^ @ A)であり、モデムの注意を引くための何らかの調査または試みのように見えます。アプリケーションのwrite()によって4つのhelloバイトがエンドポイントに送信された直後に送信されます。
  • cdc_acmデバイスはモデムであると想定されているため、cdc_acm.cのusb_device_id acm_ids []にこれを追加して、モデム制御をオフにしようとしました。

    /* bluegiga BLED112*/
    { USB_DEVICE(0x2458, 0x0001),
    .driver_info = NOT_A_MODEM,
    },
    
  • 再コンパイルしてinsmodし、syslogは、これが認識されたことを示しています(quirksは8です)が、機能に変更はありません。

NetowrkManagerもmodem-managerも実行されていませんが、どこかで何らかのモデム制御機能が実行されているのではないかと思います。どこにあるのかわかりません。

これが注釈付きのデバッグログです(MDVはcdc_acmに追加したprintkのプレフィックスです)

Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_bulk
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_done

これがアプリケーションによって送信された4バイトです000000 01

Feb 13 18:14:32 localhost cpcenter: df046a80 3672670191 C Bi:3:006:4 0 4 = 00000001
Feb 13 18:14:32 localhost cpcenter: 1360797272.669690 write: data2: len=0 contains:

...そしてこれらの追加の文字が予期せず表示されます5e405e 40 5e40...。

Feb 13 18:14:32 localhost cpcenter: df046a80 3672670232 S Bi:3:006:4 -115 128 <
Feb 13 18:14:32 localhost cpcenter: f3cc5740 3672670297 S Bo:3:006:4 -115 1 = 5e
Feb 13 18:14:32 localhost cpcenter: df2e1300 3672670332 S Bo:3:006:4 -115 1 = 40
Feb 13 18:14:32 localhost cpcenter: f3cc5740 3672670347 C Bo:3:006:4 0 1 >
Feb 13 18:14:32 localhost cpcenter: f3cc5740 3672670392 S Bo:3:006:4 -115 1 = 5e
Feb 13 18:14:32 localhost cpcenter: df2e1180 3672670426 S Bo:3:006:4 -115 1 = 40
Feb 13 18:14:32 localhost cpcenter: df2e1c00 3672670461 S Bo:3:006:4 -115 1 = 5e
Feb 13 18:14:32 localhost cpcenter: df2e1840 3672670496 S Bo:3:006:4 -115 1 = 40
Feb 13 18:14:32 localhost cpcenter: df2e1300 3672670591 C Bo:3:006:4 0 1 >

この時点で、自発的に切断されます。

Feb 13 18:14:32 localhost kernel: usb 3-1: USB disconnect, device number 6
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_bulk
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_done
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm read_bulk_callback
Feb 13 18:14:32 localhost kernel: MDV 1 acm_read_bulk_callback - urb 1, len 0
Feb 13 18:14:32 localhost kernel: MDV 3 acm_read_bulk_callback - non-zero urb status: -71
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_bulk
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_done
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm read_bulk_callback
Feb 13 18:14:32 localhost kernel: MDV 1 acm_read_bulk_callback - urb 1, len 0
Feb 13 18:14:32 localhost kernel: MDV 3 acm_read_bulk_callback - non-zero urb status: -71
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_bulk
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_done
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm read_bulk_callback
Feb 13 18:14:32 localhost kernel: MDV 1 acm_read_bulk_callback - urb 2, len 0
Feb 13 18:14:32 localhost cpcenter: df2e1d80 3672670629 S Bo:3:006:4 -115 1 = 5e
Feb 13 18:14:32 localhost kernel: MDV 3 acm_read_bulk_callback - non-zero urb status: -71
Feb 13 18:14:32 localhost cpcenter: df2e1300 3672670677 S Bo:3:006:4 -115 1 = 41
Feb 13 18:14:32 localhost cpcenter: f3cc5740 3672670802 C Bo:3:006:4 0 1 >
Feb 13 18:14:32 localhost cpcenter: df2e1180 3672671019 C Bo:3:006:4 0 1 >
Feb 13 18:14:32 localhost cpcenter: df2e1c00 3672671237 C Bo:3:006:4 0 1 >
Feb 13 18:14:32 localhost cpcenter: dfbf8c00 3672673193 C Ii:3:001:1 0:2048 1 = 02
Feb 13 18:14:32 localhost cpcenter: dfbf8c00 3672673207 S Ii:3:001:1 -115:2048 4 <
Feb 13 18:14:32 localhost cpcenter: f3c26c00 3672673221 S Ci:3:001:0 s a3 00 0000 0001 0004 4 <
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_disconnect
Feb 13 18:14:32 localhost kernel: Pid: 29, comm: khubd Tainted: G           O 3.5.3-1.el6.elrepo.i686 #1

切断時のスタックトレース

Feb 13 18:14:32 localhost kernel: Call Trace:
Feb 13 18:14:32 localhost kernel: [<f82dabc5>] acm_disconnect+0x35/0x1f0 [cdc_acm]
Feb 13 18:14:32 localhost kernel: [<c13835db>] usb_unbind_interface+0x4b/0x180
Feb 13 18:14:32 localhost cpcenter: f3c26c00 3672673239 C Ci:3:001:0 0 4 = 00010100
Feb 13 18:14:32 localhost kernel: [<c1318bfb>] __device_release_driver+0x5b/0xb0
Feb 13 18:14:32 localhost kernel: [<c1318d05>] device_release_driver+0x25/0x40
Feb 13 18:14:32 localhost kernel: [<c1317f0c>] bus_remove_device+0xcc/0x130
Feb 13 18:14:32 localhost kernel: [<c131612f>] ? device_remove_attrs+0x2f/0x90
Feb 13 18:14:32 localhost kernel: [<c1316275>] device_del+0xe5/0x180
Feb 13 18:14:32 localhost kernel: [<c1380326>] usb_disable_device+0x96/0x240    Feb 13 18:14:32 localhost kernel: [<c1379f91>] usb_disconnect+0x91/0x130
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_bulk
Feb 13 18:14:32 localhost kernel: [<c137a2c0>] hub_port_connect_change+0xb0/0xa60
Feb 13 18:14:32 localhost kernel: [<c1380f4e>] ? usb_control_msg+0xce/0xe0
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm acm_write_done
Feb 13 18:14:32 localhost kernel: [<c137b296>] hub_events+0x536/0x810
Feb 13 18:14:32 localhost cpcenter: f3c26c00 3672673243 S Co:3:001:0 s 23 01 0010 0001 0000 0
Feb 13 18:14:32 localhost cpcenter: f3c26c00 3672673250 C Co:3:001:0 0 0
Feb 13 18:14:32 localhost kernel: [<c1065bdf>] ? finish_wait+0x4f/0x70
Feb 13 18:14:32 localhost kernel: [<c137b5aa>] hub_thread+0x3a/0x1d0
Feb 13 18:14:32 localhost cpcenter: df2e1840 3672673260 C Bo:3:006:4 -71 0
Feb 13 18:14:32 localhost kernel: [<c1065a70>] ? wake_up_bit+0x30/0x30
Feb 13 18:14:32 localhost kernel: [<c137b570>] ? hub_events+0x810/0x810
Feb 13 18:14:32 localhost kernel: [<c106564c>] kthread+0x7c/0x90
Feb 13 18:14:32 localhost cpcenter: f3c16c80 3672673292 C Bi:3:006:4 -71 0
Feb 13 18:14:32 localhost cpcenter: df2e1d80 3672673453 C Bo:3:006:4 -71 0
Feb 13 18:14:32 localhost cpcenter: f3c16d40 3672673553 C Bi:3:006:4 -71 0
Feb 13 18:14:32 localhost kernel: [<c10655d0>] ? kthread_freezable_should_stop+0x60/0x60
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm read_bulk_callback
Feb 13 18:14:32 localhost kernel: [<c14dedbe>] kernel_thread_helper+0x6/0x10
Feb 13 18:14:32 localhost kernel: MDV 1 acm_read_bulk_callback - urb 3, len 0
Feb 13 18:14:32 localhost kernel: MDV:cdc-acm stop_data_traffic
Feb 13 18:14:32 localhost cpcenter: f3d19500 3672674474 C Ii:3:006:2 -108:64 0
Feb 13 18:14:32 localhost kernel: MDV 2 acm_read_bulk_callback - disconnected
Feb 13 18:14:32 localhost cpcenter: df2e1300 3672674636 C Bo:3:006:4 -71 0
Feb 13 18:14:32 localhost cpcenter: f3c16140 3672674753 C Bi:3:006:4 -71 0
4

1 に答える 1

6

デバイスに送信される^@^@^@^A文字列は、デバイスからの着信バイトに応答してカーネル内の端末サブシステムによって実行されたエコーの結果です。

ログの次の行:

Feb 13 18:14:32 localhost cpcenter: df046a80 3672670191 C Bi:3:006:4 0 4 = 00000001

実際には、デバイスが4バイトをコンピューターに送信したことを意味します(Bi「バルクエンドポイント、入力」を意味します)。デフォルトでは、すべての端末デバイスでエコーが有効になっているため、カーネルはそれらのバイトをデバイスにエコーバックしますが、これらのバイトは制御文字範囲内にあるため、エスケープされた形式でエコーされます^@^@^@^A。これらのエコーされたバイトは、個別の1バイトの書き込み呼び出しでも送信されます。これは、後続のログの1バイトのバルクアウトURBに対応します。

デバイスとの通信を試みる前に、エコーやその他のtty処理がオフになるようにテストプログラムを修正する必要があります。テストプログラムがC/C ++の場合、このcfmakeraw()関数を使用できます。

テストプログラムの前に他のプログラムがポートに接触し、ポート設定を変更してエコーをオフにしたという理由だけで、プログラムがUbuntuで機能している可能性があります。

于 2013-03-31T19:32:01.840 に答える