Як використовувати інтерфейс прив'язки / відключення драйвера ядра Linux для пристроїв USB-HID?


26

Перший фон. Я розробляю драйвер для пристроїв ігрових панелей Logitech. Це клавіатура з екраном на ній. Драйвер працює добре, але за замовчуванням пристрій обробляється HID. Щоб запобігти захопленню HID пристрою перед моїм драйвером, я можу передати його в чорний список у hid-core.c. Це працює, але це не найкраще рішення, оскільки я працюю з кількома людьми, і всі ми повинні продовжувати виправляти наш HID-модуль, який стає справою, тим більше, що це часто передбачає перебудову initramfs і подібних.

Я провів деякі дослідження з цієї проблеми, і знайшов цей пост у списку розсилки , який врешті-решт відвів мене до цієї статті на LWN . Тут описаний механізм прив’язки пристроїв до конкретних драйверів під час виконання. Це здається саме тим, що мені потрібно.

Отже, я спробував це. Мені вдалося від’єднати клавіатуру від HID. Це спрацювало, і, як і слід було очікувати, я більше не міг надрукувати його. Але коли я намагався прив’язати його до нашого драйвера, я отримую "помилку: такого пристрою немає", і операція завершується невдаче.

Отож, моє запитання таке: як я можу використовувати операції зв’язування / від’єднання ядра для реплікації того, що відбувається, коли ви перекладаєте чорний список пристрою HID у сховане ядро ​​та постачаєте власний драйвер? - тобто - весь час замінювати необхідність виправлення hid-core.c?

Джерело нашого водія тут: https://github.com/ali1234/lg4l

Відповіді:


27

Гаразд, виявляється, відповідь дивилася мені в обличчя.

По-перше, будь то користування нашим користувальницьким драйвером, або використовуючи загальний, який зазвичай приймає пристрій, все одно в кінцевому підсумку контролюється HID, а не USB.

Раніше я намагався від’єднати його від HID, що це не шлях. HID має суб-драйвери, той, що приймає пристрої, які не мають спеціалізованого драйвера, називається generic-usb. Це те, що мені потрібно було відв’язати, перш ніж прив’язати до skri-g19. Крім того, мені потрібно було використовувати HID-адресу, яка виглядає як "0003: 046d: c229.0036", а не USB-адресу, яка виглядає "1-1,1: 1,1".

Тому перед перезавантаженням я побачив би це на dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Тоді я роблю:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

І тоді я бачу на dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Так, як я сказав, дивлячись мені в обличчя, тому що два ключових фрагменти інформації - це перші дві речі в рядку, коли пристрій зв’язується ...


Чи потрібно було вказувати у драйвері, що цей постачальник / товар сумісний з вашим драйвером? Або "прив'язка" просто змушує проблему. Я отримую "немає такого пристрою" для пристрою, який перебуває у чорному списку, але я хочу змусити його бути прив'язаним, і я маю уявлення, що чорний список не є просто думкою "запобігти автоматичній прив'язці", а "запобігти прив'язці" що "тип речі.
dmansfield

Bind примушує його, тому вимагати ідентифікаторів у джерелі драйвера не потрібно. Це якщо ви хочете, щоб він автоматично завантажувався.
ali1234

Дві причини, з якими у мене виникли проблеми: по-перше, - пристрій занесений до ядра hid_ignore_list ядра, і тому він не отримає "приховану" прив'язку числа. Мені довелося додати "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" до командного рядка ядра та перезавантажити. Прапор 0x40000000 - це "не ігнорувати". По-друге, остання частина id "0003: 046D: C229.0036" - "0036". Що це являє собою? Не впевнений. Єдиний спосіб його знайти (здається) - це вже зв'язати його, а потім розв'язати та повторно зв’язати.
dmansfield

Чи знайшли ви спосіб відновити автоматичне відновлення?
Владіус

Додано власне рішення для автоматичного відключення: unix.stackexchange.com/a/475277/96686
Владіус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.