2011-08-19 29 views
8

こんにちは私はUSBネットワークにg_etherドライバを使用するUSB​​ポートを備えた組み込みLinuxデバイスに取り組んでいます。 USBケーブルがないメッセージがdmesgのに書き込まれていない抜かれた場合RNDISlinux usb接続/切断イベント

g_etherガジェット:フルスピードの設定#2のUSBプラグがdmesgの出力が接続されている

Cを使用する接続/切断イベントをどのように聞くことができますか?

組み込みLinux OSには特別な機能がありません。 dbusデーモンやホットプラグヘルパースクリプトはありません。これらが役に立つのかどうかはわかりません。

+0

少なくともudevはありますか? – Keith

+0

残念ながら私はしません。 udevなしでこのタイプのイベントをユーザーモードで聞くことは不可能ですか? –

+0

私はこれがカーネルイベントを取得する最良の方法だと考えています。もう一つの方法は、[linux-hotplug](http://linux-hotplug.sourceforge.net/)の古いusbdです。 – Keith

答えて

4

すべてのプロセスを1つのプロセスで実行するには、libudevを使用してudevdから、またはカーネルから直接イベントを取得する必要があります。

あなたのアプリケーションで(ドキュメントの欠如を?)libudevを使用するには問題があるかもしれないことを見て、代替udevadmプログラム、することができます使用することです:udevdによって処理された後

  • レポートデバイスイベントを(udevadm monitor --udev --property)、
  • レポートdevive直接カーネル(udevadm monitor --kernel --property)からのイベント、および現在のデバイスの
  • ダンプudevdのデータベース(ただし、カーネルの!)(udevadm info --query all --export-db

udevadmは、udevパッケージに含まれていますが、カーネルイベントの報告にのみ使用する場合は、udevdは必要ありません。あなたのプロセスがそれを生成し、その標準出力を解析することによってそれを使用することができます(ただし、stdbuf-o L経由で起動する必要があります)。

いずれにしても、おそらく多くの作業が必要になります。私は既に、USBデバイスの監視を含め、私のNCD programming languageでこれを多く実装しました。あなたはNCDを見たいかもしれません。これは多くの設定作業に役立ち、ホットプラグをうまく処理します。たとえば、このNCDプログラムは、標準出力にUSBデバイスのイベントを出力します:

process main { 
    sys.watch_usb() watcher; 
    println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id); 
    watcher->nextevent(); 
} 

これは、NCD(すでに差し込まれた任意のUSBデバイスの初期addedイベントで)そのようなプリントが何かになります:

added /dev/bus/usb/002/045 0409:0059 
added /dev/bus/usb/002/046 046d:c313 
added /dev/bus/usb/002/047 046d:c03e 
added /dev/bus/usb/002/048 0557:2008 
removed /dev/bus/usb/002/048 0557:2008 

また、このためにNCDを使用して、この標準出力を解析することもできます。これは、udevadmで直接操作するよりもはるかに簡単です。

NCD自体がudevadmを使用しており、になると、udevdが実行されている必要があります。とにかくそれはなぜ問題なのですか? (いくつかの作業でこの依存関係を取り除くことができます)

2

libudevを使用するか、udevadmの出力を@Ambroz Bizjakが示唆するように使用することができます。ただ、udevadmの出力を解析するだけで、追加のプロセス(stdbuf)と言語(NCD)を追加することをお勧めします。

単純なlibudevと解析出力の間のステップは、udevadmソースを変更しています。このソリューションは、必要なリソースを削減し、解析プロセスをスキップします。 udevパッケージを見ると、udevディレクトリにudevdとudevadmのソースがあります。

メインルーチンはudevadm.cで、udevadm monitorのソースはudevadm-monitor.cです。受け取ったすべてのイベントは、print_device()によって印刷されます。ここにコードを挿入します。あなたは、メモリ上のタイトなら

、あなたはcontrolinfosettletest-builtintesttriggerのため、不要なコードを除去することができます。私のシステム(Ubuntu 12.04)では、これによってudevadmのサイズが約75%減少します。

-3

残念ながら、接続/切断時にudevイベントが生成されないため、これらのイベントを監視することはほとんど不可能です。
カーネルメッセージを監視することができます(これは夢中です)。考えられるよりよい方法は、カーネルを変更することです。

更新:この回答が否定的な評価を得た理由はわかりません。
USBホスト部分(デバイスプラグ/抜き差しでUDEVイベントを生成する)とUSBデバイス/ガジェット部分(そのようなイベントを生成しないもの)が混在することがあります
LinuxコンピュータがガジェットいくつかのUSBホストに接続されています)、プラグ/アンプラグイベントを捕捉する良い方法はありません。

証明:message by Greg Kroah-Hartman

+0

ソース?推論と実装の開始位置について説明できますか? – bschlueter

+0

私は私の答えを編集してより詳しい説明をしました。カーネルメッセージを見ることを決定した場合は、dmesgソースで/ proc/kmsgを進める方法を見たり、swatchのようなsyslogデーモンPLUSログファイル監視プログラムを使うことができます。 – edo1

関連する問題