LINUX.ORG.RU

Как изменить приоритет выбора драйвера для usb устройства?


0

1

Пишу драйвер для геймпада, и столкнулся с тем что драйвером для него назначается usbhid вместо моего. И при отключении геймпада в мой драйвер наконецто приходит оповещение о устройстве и тут-же уведомляет что оно отключено.
Как можно установить приоритет драйвера для определенного устройства?

★★
Ответ на: комментарий от Deneb

Rmod старый драйвер, modprobe новый?

Так старого нету, он определяется как стандартный геймпад. Или мне usbhid отлючить чтоб клава с мышкой отпали?
Загружаю драйвер через insmod. На сколько я знаю modprobe его и использует для загрузки, или я ошибаюсь?

V1KT0P ★★
() автор топика

В udev, вероятно, прописать приоритет нужно. Но я в этой области плаваю.

Adonai ★★★
()

а что мешает твоему драйверу через hid работать? берешь любой пример из drivers/hid и реализуешь свой соответственно

ananas ★★★★★
()
Ответ на: комментарий от ananas

а что мешает твоему драйверу через hid работать? берешь любой пример из drivers/hid и реализуешь свой соответственно

Да это вроде хорошая идея, вот только как правильно вклиниться в этот hid? Пытаюсь зарегестироваться, все проходит успешно, но мой драйвер не вызывается ни при подключении геймпада ни при отключении.

V1KT0P ★★
() автор топика
Ответ на: комментарий от V1KT0P

Примеры смотри. Привязка к конкретным устройствам выполняется через макрос, параметром коьорому передается структура с vendor id/device id поддерживаемых драйвером железяк

ananas ★★★★★
()
Ответ на: комментарий от ananas

Примеры смотри. Привязка к конкретным устройствам выполняется через макрос, параметром коьорому передается структура с vendor id/device id поддерживаемых драйвером железяк

Все согласно примерам:

#define PRODUCT_ID     0x4745 // INNEX GENESIS Controller USB
#define VENDOR_ID      0x1292 // Innomedia

static const struct hid_device_id genesis_devices[] = {
    { HID_USB_DEVICE(VENDOR_ID, PRODUCT_ID)},
    { }
};

static struct hid_driver genesis_driver = {
    .name = "genesis-usb",
    .id_table = genesis_devices,
    .probe = genesis_probe,
    .remove = genesis_remove
};

MODULE_DEVICE_TABLE(hid, genesis_devices);


static int genesis_init(void)
{
    int result;
    result = hid_register_driver(&genesis_driver);
    if (result) {
        printk(KERN_ALERT "fail register driver\n");
    } else {
        printk(KERN_ALERT "success register driver\n");
    }
    return result;
}

static void genesis_exit(void)
{
    hid_unregister_driver(&genesis_driver);
    printk(KERN_ALERT "deregister driver\n");
}

module_init(genesis_init);
module_exit(genesis_exit);

V1KT0P ★★
() автор топика
Ответ на: комментарий от ananas

ну и где genesis_probe/genesis_remove? да и остальные операции хотя бы заглушками с printk?

Я показал только самое важное, естественно в genesis_probe/genesis_remove printk есть, как и в нескольких других функциях hid_driver, оно бы без них даже не скомплилилось.

V1KT0P ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.