Jak korzystać z interfejsu wiązania / odblokowywania sterownika jądra Linux dla urządzeń USB-HID?

26

Pierwsze tło. Rozwijam sterownik dla urządzeń z panelami gier Logitech. To klawiatura z ekranem. Sterownik działa dobrze, ale domyślnie urządzenie obsługuje HID. Aby zapobiec przejęciu urządzenia przez HID przed moim sterownikiem, mogę umieścić go na czarnej liście w hid-core.c. Działa to, ale nie jest to najlepsze rozwiązanie, ponieważ pracuję z kilkoma osobami i wszyscy musimy ciągle łatać nasz moduł HID, który staje się uciążliwy, szczególnie, że często wymaga przebudowania initramfs i tym podobnych.

Przeprowadziłem badania tego problemu i znalazłem ten post na liście mailowej , który ostatecznie zabrał mnie do tego artykułu na LWN . Opisuje mechanizm wiązania urządzeń z określonymi sterownikami w czasie wykonywania. To wydaje się dokładnie tym, czego potrzebuję.

Więc spróbowałem. Udało mi się odłączyć klawiaturę od HID. To zadziałało i zgodnie z oczekiwaniami nie mogłem już pisać. Ale kiedy próbowałem powiązać go z naszym sterownikiem, pojawia się „błąd: brak takiego urządzenia” i operacja kończy się niepowodzeniem.

Więc moje pytanie brzmi: jak korzystać z operacji wiązania / cofania wiązania jądra, aby replikować to, co dzieje się, gdy umieścisz na czarnej liście urządzenie HID w hid-core i dostarczysz własny sterownik? - to znaczy - aby przez cały czas zastępować potrzebę łatania hid-core.c?

Źródło naszego sterownika znajduje się tutaj: https://github.com/ali1234/lg4l

ali1234
źródło

Odpowiedzi:

27

Ok, okazuje się, że odpowiedź patrzyła mi w twarz.

Po pierwsze, niezależnie od tego, czy używasz naszego niestandardowego sterownika, czy też ogólnego, który zwykle przejmuje urządzenie, nadal jest ostatecznie kontrolowany przez HID, a nie USB.

Wcześniej próbowałem usunąć powiązanie z HID, co nie jest właściwą drogą. HID ma sterowniki podrzędne, które przejmują urządzenia, które nie mają wyspecjalizowanego sterownika, nazywane są standard-usb. Właśnie z tego musiałem się wycofać, zanim powiążę z hid-g19. Musiałem także użyć adresu HID, który wygląda jak „0003: 046d: c229.0036”, a nie adresu USB, który wygląda jak „1-1.1: 1.1”.

Więc przed ponownym wiązaniem chciałbym to zobaczyć na 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

Następnie robię:

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

A potem widzę na 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

Tak jak powiedziałem, wpatrując się we mnie w twarz, ponieważ dwie kluczowe informacje to pierwsze dwie rzeczy na linii, gdy urządzenie się łączy ...

ali1234
źródło
Czy musiałeś określić w sterowniku, że ten dostawca / produkt jest zgodny z twoim sterownikiem? Czy też „wiązanie” po prostu wymusza problem. Dostaję „brak takiego urządzenia” dla urządzenia, które znalazło się na czarnej liście, ale chcę zmusić je do związania, i obrazuję, że czarna lista nie jest tylko „zapobieganiem automatycznemu wiązaniu”, ale „zapobieganiem wiązaniu jaki „rodzaj rzeczy.
dmansfield
Powiązanie wymusza to, więc nie jest wymagane zgłaszanie identyfikatorów w źródle sterownika. Jednak jeśli chcesz, aby ładował się automatycznie.
ali1234
Dwa powody, dla których miałem problemy: po pierwsze - urządzenie znajduje się na liście hid_ignore_list jądra i dlatego nie zostanie „ukryte” powiązane. Musiałem dodać „usbhid.quirks = 0x0b0e: 0x0412: 0x40000000” do wiersza poleceń jądra i zrestartować komputer. Flaga 0x40000000 to „nie ignoruj”. Po drugie, ostatnia część identyfikatora „0003: 046D: C229.0036” to „0036”. Co to oznacza? Niepewny. Jedynym sposobem, aby go znaleźć (wydaje się), jest związanie go, a następnie rozwinięcie i ponowne związanie.
dmansfield
Czy znalazłeś sposób na automatyczne ponowne powiązanie?
Vladius
Dodano własne rozwiązanie automatycznego ponownego wiązania: unix.stackexchange.com/a/475277/96686
Vladius