通常のHIDドライバの代わりにカスタム文字デバイスドライバにマウスをバインドします。

通常のHIDドライバの代わりにカスタム文字デバイスドライバにマウスをバインドします。

簡単なLinux USBマウスドライバを作成しようとしていますが、実際にマウスからモジュールに情報を取得するのに問題があります。

これで、カーネルに正常にロードできるカーネルモジュールが作成されました。モジュールはファイルを介してアクセスできる文字デバイスであり/dev/mymodule、モジュールに書き込んで読み取ると、私が実装した関数が呼び出されます。

しかし、マウスからこのキャラクタードライバーにデータを供給する方法は理解できません。読み取り可能なマウス用の別々のファイルがあり/dev/input、マウスの項目を見ると、マウスがドライバーを/sys/bus/hid/devices/使用し、実際のマウスのように動作することがわかります。hid-generic

マウスで文字デバイスドライバを使用するにはどうすればよいですか? (私のコンピュータに接続されている他のマウスよりもこのマウスを好む。)私は基本的な内容を間違って理解したようです。

試したがうまくいかなかったもの:

  • MODULE_ALIAS(<content of /sys/bus/hid/devices/<mouse>/modalias>)モジュールソースに追加されました。
  • MODULE_DEVICE_TABLE以下を追加してください。
static struct hid_device_id mod_table [] = {
        {HID_USB_DEVICE(1532, 0043)},
        {}
};

MODULE_DEVICE_TABLE(hid, mod_table);

どちらの場合も、エイリアスはmodule.alias後ろに表示されますが、depmod何もしないようです。

私が試したもう一つのことはunbind汎用ドライバでしたが、マウスをキャラクタードライバにバインドする方法がわかりません。この状況で実装する必要がある他のものはありますか?

どんな助けでも大変感謝します。

ベストアンサー1

私も最近この問題に直面しました。struct usb_driverモジュールにドライバを登録したが、1つも登録していないようですhid_driver。編集:そうです、私はあなたが文字ドライバを書いていることを何とか見逃しました。

linux/drivers/hid/hid-generic.c(カスタムドライバの前に互換性を確認する)ドライバのソースコードを見ると、その機能からbus_for_each_drvマクロmatchを呼び出すことがわかります。これは、指定されたバス(hid_bus_typeこの場合)に登録hid_deviceされている各ドライバを繰り返し、最後に挿入されたデバイスを表す構造インスタンスがidドライバIDテーブル(対応するテーブル)hid_device_idのsと一致することを確認します。

ここで重要なのは、ドライバが登録されていない限り、追加のテーブルをhid_driver提供し、モジュールエイリアスを作成してもこのループに含まれないことです。hid_device_id同じマクロを呼び出し、ループを通過する各ドライバの文字列をbus_for_each_drv印刷するコールバック関数を渡す単純なカーネルモジュールを作成することで、それを直接確認できます。drv->name簡単な例は次のとおりです。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/hid.h>

MODULE_LICENSE("GPL");

static int __print_driver_name(struct device_driver *drv, void *data)
{
        printk("%s", drv->name);
        return 0;
}

static int __init init_list_hid_drivers(void)
{
        printk("list_hid_drivers module loaded. Drivers:\n");
        bus_for_each_drv(&hid_bus_type, NULL, NULL, __print_driver_name);

        return 0;
}

static void __exit exit_list_hid_drivers(void)
{
        printk("list_hid_drivers module unloaded");
}

module_init(init_list_hid_drivers);
module_exit(exit_list_hid_drivers);                                         

非常に簡単な実装のために、hid-generic.cドライバをテンプレートとして使用できますhid_driver

hid_device_probeの機能を簡単に見ると、HIDではなく一部のドライバ(たとえば、HIDデバイスにlinux/drivers/hid/hid-core.ca)を割り当てる唯一の方法は、特定のドライバをデバイスにバインドすることです。usb_driverしかし、私が間違っている可能性があります。

おすすめ記事