HIDデバイスドライバをカスタムドライバに置き換える

HIDデバイスドライバをカスタムドライバに置き換える

キーボードカーネルモジュールをカスタムモジュールに置き換える方法を探しています。私はこの目的のためのLogitech MK710キーボード+マウスセットとこの2つのコネクタを備えたUSBレシーバーを持っています。自動的にこのUSBレシーバーは、一部の情報とともにデフォルトまたはモジュールとして管理されます(注:usbレシーバーデバイス)。usbhidlogitech-hidpp-device1-2

ubuntu@ubuntu-VirtualBox:/sys/bus/usb/devices/1-2$ tree | grep driver
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
│   │   │   ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device
│   │   │   ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device
│   │   ├── driver -> ../../../../../../../bus/hid/drivers/logitech-djreceiver
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
├── driver -> ../../../../../bus/usb/drivers/usb

私が達成したいのは、基本ドライバではなくカーネルが選択する適切なモジュールを書くことです。適切なモジュールエイリアスを書くのは問題だと思いますが、まだ何も機能していないのでわかりません。私が試したことは次のとおりです。

  • 私のモジュールを/lib/modules/$(uname -r)/kernel/driversディレクトリに置きます(そこに独自のcustomサブディレクトリを作成し、そこに.koファイルを入れました)。

  • モジュールCコードの正しいエイリアスを使用して、以下にリストされているすべてのオプションを試しました(注:私が使用したマクロとその値は私の特定のデバイスに対して正しく設定されています)USB_VENDOR_IDUSB_PRODUCT_ID

    static struct hid_device_id mod_table [] = {
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID, USB_PRODUCT_ID) },
        { }                      /* Terminating entry */
    };
    MODULE_DEVICE_TABLE(hid, mod_table);
    

または

static struct hid_device_id mod_table [] = {
    { HID_USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(hid, mod_table);

そして

static struct usb_device_id mod_table [] = {
    { USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, mod_table);
  • ディレクトリから元の(デフォルト)HIDドライバ/lib/modules/$(uname -r)/kernel/drivers(上部で指定した3つ)を削除します。

しかし、カーネルはまだ私のモジュールの代わりに元のモジュールをロードすることを選択します。私のドライバーのエイリアスにのみベンダーと製品IDが指定されていることを確認しましたが(modules.aliasファイルで確認)、何も機能しませんでした。モジュールは、libusbライブラリを介して(関数を使用して)ユーザー空間からカーネルドライバを手動で分離し、自分のカスタムモジュールを再ロードすることを決定した場合にのみ機能し始めましたlibusb_detach_kernel_driver。その後、カーネルだけがデバイスを私のドライバに関連付けましたが、これは次のステップまで可能です。スタート。永久に、自動的に作りたいです。概念全体が理解しやすく、混乱しすぎないことを願っています。よろしくお願いします。

ベストアンサー1

initramfsに問題がある可能性が高いです。元のHIDドライバモジュールのコピーはインストール時に現在のカーネルに保存されており、モジュールを追加するときにinitramfsを再生成しない限り、カスタムドライバモジュールはそこに保存しないでください。

起動時にシステムがまだinitramfsで実行されていて、実際のルートファイルシステムがまだマウントされていない場合は、USBサポートモジュールが最初にロードされます。したがって、システムはまだ元のusbhid+モジュールの組み合わせを探してロードしていますlogitech-hidpp-device

Ubuntuを使用しているように見えるので、Debianスタイルのsudo update-initramfs -uコマンドで現在のモジュールセットやその他の設定ファイルを使用して現在のカーネルバージョンのinitramfsを再構築するのに十分である必要があります。

おすすめ記事