Jądro Linux upuszcza niestandardowe kody skanowania klawiatury

16

Mam starą klawiaturę z kluczem IBM 122 model M, którą dostosowuję do użytku na nowoczesnym komputerze. Korzystam z Teensy 2.0 do kodowania i obsługi strony USB. Pożyczyłem oprogramowanie z projektu klawiatury Humble Hacker ( https://github.com/humblehacker/keyboard ) i dodałem dodatkowe klucze w konfiguracji kompilacji. Jak na razie dobrze.

Wszystkie „zwykłe” klucze działają, ale wydaje się, że jądro upuszcza dodatkowe klucze ( F13- F24, itp.).

Uruchomienie /lib/udev/keymap -i input/event0pokazuje kody skanowania wszystkich normalnych kluczy, ale nic dla dodatkowych kluczy.

Uruchomienie wiresharkprzechwytywania pakietów przez port USB pokazuje, że klawiatura wysyła kody skanowania, ale wygląda na to, że jądro po prostu je upuszcza.

Wydaje mi się, że jest to coś w sterownikach jądra, które po prostu nie dostarcza kodów skanowania, których się nie spodziewa.

Sądzę, że w jakimś .hpliku źródłowym jądra będzie jakaś „kluczowa” mapa kluczy , ale jak dotąd nie udało mi się jej znaleźć.

Warto podkreślić, że nie pytam o mapowanie dodatkowych kluczy w X, tak jak wielu innych przede mną. Jest to problem niskiego poziomu, prawdopodobnie związany z jądrem. Załóżmy na chwilę, że w ogóle nie będę używać X. Potrzebuję tylko, aby kody skanowania były wyświetlane po uruchomieniu /lib/udev/keymap -i, a resztę mogę zrobić stamtąd.

użytkownik2543941
źródło
Wiem, że to nie pomaga, ale: Dlaczego korzystasz z Teensy? Ta klawiatura powinna współpracować z prostym adapterem PS2 / USB.
goldilocks
Klawiatura pochodzi ze starego terminala IBM, nie używa protokołu zgodnego z PS / 2.
user2543941,
Łał. Może być tak, że kierowca nie przekazuje zdarzenia (spójrz na ostatnią część tutaj ). Możesz spróbować evtestzamiast /lib/udev/keymap -i, nie wiem, czy to wyjdzie inaczej.
goldilocks,
1
evtest również nie pokazuje niczego, gdy używane są dodatkowe klucze.
user2543941,
1
Wygląda na to, że jeśli chcesz użyć tych kluczy, twój projekt stał się trochę większy, lol. Najtrudniejszą rzeczą w napisaniu sterownika klawiatury jest nauka API, w przeciwnym razie nie wyglądają na tak skomplikowane. Od jakiegoś czasu nie robiłem żadnych rzeczy w jądrze, ale myślę , że: LDD3 nadal działa na 3.x, tak myślę.
goldilocks

Odpowiedzi:

1

Jądro widzi dziwne kody skanowania i upuszcza je. Spróbuję uzyskać te wartości kodów skanowania, a następnie zaktualizować indeks sprzętowej bazy danych. Krótko mówiąc, plan jest następujący:

  • pobierz kody z wyjścia dmesg - dmesg powinien wypisać coś takiego po naciśnięciu nieznanego kodu:

    Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0)
    

a0 będący wartością kodu.

  • utwórz niestandardowy plik odwzorowania kodu klucza. Przykłady i pomoc znajdują się w domyślnym pliku
    (w /usr/lib/udev/hwdb.d/60-keyboard.hwdbprzypadku Arch może być inny w innych dystrybucjach).

  • zaktualizuj i uruchom bazę danych sprzętu, uruchamiając polecenia:

    > udevadm hwdb --update
    > udevadm trigger /dev/input/eventXX
    

gdzie eventXXodpowiada twojej klawiaturze (możesz ją uzyskać uruchamiając evtest). Możesz także uruchomić ponownie zamiast wyzwalać.

Poszukaj bardziej szczegółowego opisu w Arch wiki i domyślnym pliku mapowania kodu klucza (lub w dokumentacji dystrybucyjnej, jeśli nie jest to Arch).

Jest to niezawodna i prosta metoda, która sprawia, że ​​mapowanie na poziomie jądra działa więc bez względu na serwer wyświetlania, DE itp.

xbob
źródło