3

Linux ドライバーのソース コードを調べたい特定の USB デバイスがあります。私の理解では、USB ドライバーが実行する最初のステップは、特定のベンダー ID と製品 ID を持つデバイスを処理できるように自身を登録することです。私の場合、ベンダー ID は0BDAで、製品 ID は8187です。この情報が与えられた場合、このデバイスを処理できると登録しているソース ファイルを見つけて、ドライバの詳細を実際に実装している他のソース ファイルを見つける方法はありますか?

参考までに、私はカーネルを使用しています3.2.0-26。を試してみましたgrep -rl 8187 /usr/srcが、これには多数のファイルがリストされており、どこから始めればよいかわかりません。

4

1 に答える 1

5

ベンダーと製品 ID 以外にも、どのドライバーが選択されるかに影響を与えるパラメーターが多数あります。バージョン番号、デバイス クラス、サブクラス、およびプロトコルと、インターフェイス クラス、サブクラス、およびプロトコルがあります。カーネルはデバイスからそれらすべてを読み取り、次のようなすべてを含む文字列を作成します (例は私のデバイスであり、あなたのデバイスではありません)。

usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF

次に、その文字列が modprobe に渡され、モジュール自体で見つかった文字列 (ワイルドカードを使用) と照合されます。特定のモジュールで実行すると、そのモジュールの一致ルールのリストを表示できますmodinfo。これらのルールに対応するソース コード構造はMODULE_DEVICE_TABLE. デバイス テーブルの個々のエントリは、通常、USB_DEVICEマクロを使用して構築されるためUSB_DEVICE.*8187、単に絞り込むのではなくgrep を実行する8187必要があります。

デバイスが接続されていて動作している場合は、その sysfs エントリを調べることで、関連付けられているドライバーを見つけることができます。

ls -l /sys/bus/usb/devices/*/driver

これらのデバイス記述子文字列の 1 つを作成できる場合は、次のようにして、実際にドライバーをロードせずにドライバーを検索するように modprobe に依頼できます (ここでも例として私のデバイスを使用します)。

modprobe -v -n 'usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF'

すべての数値は、lsusb -v取得できる場合の出力で使用できます。そうでない場合は、ゼロを試してみてください。ワイルドカードの一致が得られる可能性があります。16 進数には大文字を使用し、それ以外には小文字を使用してください。これは、ドライバーが存在する場合にのみ機能する/lib/modulesため、カーネル コンパイルから除外されたドライバーを見つけるのには適していません。

他のすべてが失敗した場合、ローテクなアプローチは、人間が読めるデバイス名を から取得しlsusb、それに「Linux」という単語を加えてグーグルで検索することです。

上記の方法のいくつかを使用して、デバイスのドライバーが rtl8187 と呼ばれ、ベンダー ID と製品 ID が から登録されていることがわかりましたdrivers/net/wireless/rtl818x/rtl8187/dev.c

于 2012-07-26T03:42:48.493 に答える