ホットプラグドライバについてLDD3の第14章を読みました。ハードウェアを接続するとロードされるUSBマウスドライバを作成する必要があります。さて、実験をしてみると、プラグを抜くときに呼び出される「hid-generic」という名前のドライバーがあることがわかりました。
[ 6654.232046] usb 3-1: new low-speed USB device number 3 using uhci_hcd
[ 6654.462061] usb 3-1: New USB device found, idVendor=093a, idProduct=2510
[ 6654.462067] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 6654.462071] usb 3-1: Product: USB OPTICAL MOUSE
[ 6654.462074] usb 3-1: Manufacturer: PIXART
[ 6654.489316] input: PIXART USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input12
[ 6654.489445] hid-generic 0003:093A:2510.0004: input,hidraw0: USB HID v1.10 Mouse [PIXART USB OPTICAL MOUSE] on usb-0000:00:1d.1-1/input0
また、lsmodは、
Module Size Used by
hid_generic 12541 0
usbhid 47259 0
hid 105241 2 hid_generic,usbhid
psmouse 102541 0
私の疑問は次のとおりです、
1)このマウスが接続されたときにモジュールをロード(ホットプラグ)するには、カーネルでこれら3つのドライバーを無効にし、id_tableにベンダーとデバイスIDを持つドライバーでカーネル全体を構築する必要があります。正しい?
2)USBコアドライバーとUSBデバイスドライバーについても読みました。では、これらのHIDドライバーはコアドライバーまたはデバイスドライバーですか?
3)USBマウスの場合、コアドライバーとデバイスドライバーはどれですか?そして、カーネルソースのどこでそれらを見つけることができますか?
ありがとう、スニル。
私はあなたの質問に一つずつ答えようとします:
1)このマウスを接続したときにモジュールをロード(ホットプラグ)するには、カーネルでこれら3つのドライバーを無効にし、ベンダーと一緒にドライバーを使用してカーネル全体を構築する必要がありますおよびid_tableのデバイスID。そうですか?
はい。ただし、注意が必要な追加事項がいくつかあります。まず、特定のモジュール(ドライバー)がどのようにロードされるかを理解します。これの鍵はMODULE_DEVICE_TABLE(usb, &my_id_table);
です(make modules_install
を使用して)特定のモジュールが「インストール」されるたびに、MODULE_DEVICE_TABLE
で渡されたidテーブルに従って、エントリが/lib/modules/<your_kernel>/modules.usbmap
および/lib/modules/<your_kernel>/modules.dep
ファイルに作成されます(文字列「usbhid」を検索します) "ファイル内)。新しいUSBデバイスが検出されるたびに、カーネルはこれらのファイルを読み取って、一致するパラメーターを見つけます。見つかった場合、次のモジュールは、情報を保持する/lib/modules/<your_kernel>/modules.dep
にある対応するパスからロードされます。ドライバーが配置されているパスとその依存関係について。
そのため、カーネルから(rmmod)usbhid
をアンロードしても、マウスを再挿入すると再びロードされます。これを回避するには、これらのファイルを変更する必要があります。つまり、ファイルからエントリを削除します。これを行うには、usbhid
ドライバーを元のパス(通常は/lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko
にあります)から安全な場所に「移動」します。次に、依存関係ファイルからエントリが削除されるように依存関係を再構築します。
次に、ドライバーのエントリを作成する必要があります。ドライバーをインストールするだけで、準備完了です。
要約すると:
$ Sudo rmmod usbhid # Unload the usb mouse driver
$ cd /lib/modules/$(uname -r)/ # Move to your current kernel
$ vim modules.usbmap # Check for the "usbhid" string
$ vim modules.dep # Check for "usbhid.ko:" string
$ Sudo mv kernel/drivers/hid/usbhid/usbhid.ko ~/Desktop # Take backup of your current
usb mouse driver
$ Sudo depmod -a # Rebuild the dependency files
次に、依存関係ファイルで文字列「usbhid」をもう一度確認します。あるべきではありません!
$ cd /path/to/your/driver
$ Sudo make modules_install # Install your driver into /lib/modules/$(uname -r)/extra
$ Sudo depmod -a # Rebuild the dependency files
この手順の後、依存関係ファイルでモジュールに対応する文字列を検索すると、そこにあるはずです。この時点から、マウスを挿入するたびに(またはブート自体から)、元のドライバーではなくドライバーがロードされます。
ドライバでの再生が終了したら、元のusbhid
ファイルを元の宛先にコピーして戻し、依存関係ファイルを再構築できます(Sudo depmod -a
)
また、ベンダーとデバイスIDを使用してデバイスを一致させようとしていることもわかりました。この場合、ドライバーはyourマウス。推奨される方法は、クラスIDを使用することです。これにより、ドライバーはanyusbマウスで機能します。
2)USBコアドライバーとUSBデバイスドライバーについても読みました。したがって、これらのHIDドライバーはコアドライバーまたはデバイスドライバーですか?
usbhid
は基本的に「デバイスドライバー」です。ドライバーの分類は、コアドライバー、ホストコントローラードライバー、デバイスドライバーのように簡単に説明できます。
デバイスドライバ:これはデバイスを制御するために使用されるソフトウェアです。たとえば、usbマウス、pciベースのイーサネットカード、usbペンドライブ、i2cベースの加速度計。
ホストコントローラードライバー:これはバスコントローラーを制御するために作成されたソフトウェアです。たとえば、USBホストコントローラー(EHCI、UHCI、OHCIなど)、PCIホストコントローラー、I2Cマスターなど。
コアドライバー:これらは実際に上記のドライバーを接着します。例としては、USBコア、PCIコアなどがあります。コアドライバーは、デバイスとホストコントローラードライバーがそれらを利用できるようにヘルパールーチン(API)を提供します(モジュールスタッキングの概念!)。これらは、正しいデバイスをそのドライバーにバインドするものです。コアドライバーによって提供される他の多くのサービスがあります。
USBデバイスドライバーのサンプルコード:
http://lxr.free-electrons.com/source/drivers/hid/usbhid/usbmouse.c
USBホストコントローラドライバは次の場所にあります。
http://lxr.free-electrons.com/source/drivers/usb/Host/
USBコアはここにあります: http://lxr.free-electrons.com/source/drivers/usb/core/
これはあなたの3番目の質問にも答えると思います!
これがお役に立てば幸いです。
デバイスドライバーはusbhid
です。
デバイスに接続されないようにするには、HID_QUIRK_IGNORE
エントリをdrivers/hid/usbhid/hid-quirks.c
に追加するか、quirks
モジュールのusbhid
パラメータを使用します。