Niedawno kupiłem klawiaturę USB. Ma 12 dodatkowych przycisków, ale działa tylko 5 z nich. W dziennikach nie ma komunikatów „nieznany scancode”. Evtest nie może ich wykryć, nie może nawet wykryć działającej 5 (tylko zwykłe klucze). Xev wykrywa działające 5, ale nie pozostałe. „cat /dev/input/by-path/pci-0000:00:02.0-usb-0:4:1.0-event-kbd” jest taki sam jak evtest z brzydszymi danymi wyjściowymi. W rzeczywistości jedynym sposobem, w jaki udało mi się wykryć pozostałe 7 kluczy, jest wąchanie USB za pomocą Wiresharka. Więc moja klawiatura nie jest uszkodzona.
Używam Gentoo Linux z jądrem gentoo-sources-2.6.30-r4, xorg-server-1.6.2-r1 i sterownikiem xf86-input-evdev w wersji 1.6.2-r1. Oto odpowiednia sekcja xorg.conf:
Section "InputDevice"
Identifier "Keyboard0"
Driver "evdev"
Option "Device" "/dev/input/by-path/pci-0000:00:02.0-usb-0:4:1.0-event-kbd"
Option "XkbLayout" "hu"
EndSection
Próbowałem dowiedzieć się więcej o opcjach takich jak XkbModel, ale strony podręcznika nie są zbyt pomocne. Szukałem tutaj każdego pytania z [klawiaturą], ale znalazłem tylko coś podobnego w systemie Windows.
Co mogę zrobić, aby klucze działały? Jeśli to błąd, gdzie powinienem to zgłosić?
Aktualizacja: Oto wynik działania klawiszy showkeys. Serwer X nie działał, kiedy to robiłem.
kb mode was UNICODE
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]
press any key (program terminates 10s after last keypress)...
0xe0 0x22
0xe0 0xa2
0xe0 0x24
0xe0 0xa4
0xe0 0x20
0xe0 0xa0
0xe0 0x32
0xe0 0xb2
0xe0 0x6c
0xe0 0xec
Nacisnąłem dodatkowe klawisze od lewej do prawej. Każdy klawisz ma 2 linie (chyba naciśnij i puść) i wykrywane są tylko działające 5.
Aktualizacja: Wymyśliłem naprawdę zły sposób na zrobienie tego. Mogę uruchomić tshark (interfejs wiersza poleceń wireshark) w tle, analizując dane wyjściowe i uruchamiając dowolne programy na odpowiednich pakietach USB. Istnieje poważny problem z bezpieczeństwem: każdy użytkownik, który może korzystać z dodatkowych kluczy, będzie mógł zobaczyć każdy ruch USB i sieciowy. Jedyną zaletą tego podejścia jest to, że działa. Po oczyszczeniu opublikuję pełny program do tego.
Odpowiedzi:
Ok, więc mój program działał przez noc i nadal działa, więc wysyłam kod. Jest trochę niezręcznie, ale działa. Napiszę też o tym, jak to zrobiłem, ponieważ będzie to przydatne dla osób, które nie mają mojej klawiatury. Program potrzebuje najnowszej wersji libpcap i wireshark. Debugfs musi zostać zamontowany (mount -t debugfs none_debugs / sys / kernel / debug) i załadowany moduł usbmon (modprobe -v usbmon).
To jest program działający w tle:
Jak widać, istnieje duża tablica poleceń zindeksowana danymi aplikacji z pakietów USB. Wartościami są wydane polecenia. Używam DBus do robienia tego, co należy zrobić, ale możesz użyć xvkbd do wygenerowania prawdziwych zdarzeń naciśnięcia klawisza (znalazłem xvkbd bardzo wolno, aby wysłać prostą kombinację klawiszy). tshark-wrapper to proste opakowanie dookoła tshark, które wykonuje tshark jako root i wyłącza stderr.
Jest problem. Użytkownik potrzebuje uprawnień do wykonania tshark jako root bez hasła. To naprawdę bardzo zła rzecz. Ryzyko można zmniejszyć, umieszczając więcej argumentów w opakowaniu, a mniej w skrypcie Pythona i umożliwiając użytkownikom wykonanie opakowania jako root.
Teraz o procesie robienia tego z innymi klawiaturami. Nie wiem prawie nic o USB i wciąż nie było to takie trudne. Większość mojego czasu spędziłem na zastanawianiu się, jak zrobić odczyt niebuforowany z potoku. Z wyjścia lsusb wiedziałem, że moja klawiatura jest na drugim interfejsie USB. Zacząłem więc przechwytywać za pomocą wireshark na usbmon2. Mysz i inne oprogramowanie sprzętowe generują dużo hałasu, więc odłącz je od zasilania lub przynajmniej nie poruszaj myszą.
Pierwszą rzeczą, którą zauważyłem, było to, że dodatkowe klucze mają identyfikator punktu końcowego 0x82, a normalne klucze mają identyfikator punktu końcowego 0x81. Na początku było kilka pakietów z 0x80. To dobrze, że można go łatwo przefiltrować:
Normalne naciśnięcie klawisza:
Dodatkowe naciśnięcie klawisza:
Łatwo było zauważyć, że naciśnięcie klawisza generuje 4 pakiety USB: 2 dla prasy, 2 dla wydania. W każdej parze pierwszy pakiet był wysyłany przez klawiaturę do komputera, a drugi był na odwrót. Wydawało się, że ACK-y z TCP. „ACK” to URB-SUBMIT, a normalny pakiet to URB-COMPLETE. Postanowiłem więc odfiltrować „ACK” i wyświetlać tylko normalne pakiety:
„ACK” USB:
Teraz były tylko 2 pakiety na naciśnięcie klawisza. Każda sekunda miała zerowe pole wartości aplikacji, a wszystko inne miało inne wartości. Więc odfiltrowałem zera i użyłem innych wartości do identyfikacji kluczy.
Dodatkowe wydanie klucza:
Moja klawiatura to Slimstar 220 (mam nadzieję, że nie kwalifikuje się to jako spam. Jeśli to zrobię, usunę ją.) Jeśli masz takie same szanse, to niezmodyfikowany program będzie działał. W przeciwnym razie myślę, że przynajmniej wartość aplikacji będzie inna.
Jeśli ktoś ma ochotę napisać prawdziwy sterownik na podstawie tych danych, proszę dać mi znać. Nie podoba mi się mój brzydki hack.
Aktualizacja: Mam nadzieję, że kod jest teraz odporny na ponowne uruchomienie.
źródło
Zwykle jeśli nie otrzymujesz żadnych wiadomości z jądra LUB danych wejściowych do X, oznacza to, że jądro odrzuca klucze. Nie jestem pewien, co mogę polecić oprócz debugowania printk w jądrze (co może być nieco przesadzone).
źródło
Używam lineakd do mapowania dowolnego klucza, który generuje kod klucza
xev (1)
. Na obecnej klawiaturze mam około połowy przycisków generujących kody, inne nie. Nie znalazłem rozwiązania dla kluczy, których X nie rozpoznaje jako generujących kod klucza.I napisał o tym jakiś czas temu , ale nie zaktualizowane stanowisko ze szczegółami korzystania xev uzupełnienie dostarczonych keycodes.
źródło