Kluczowe pliki układu

Pliki układu klawiszy (pliki .kl ) mapują kody klawiszy i kody osi systemu Linux na kody klawiszy i kody osi systemu Android oraz określają powiązane flagi zasad. Pliki układu klawiszy specyficzne dla urządzenia to:

  • Wymagane w przypadku wewnętrznych (wbudowanych) urządzeń wejściowych z klawiszami, w tym klawiszami specjalnymi, takimi jak klawisze głośności, zasilania i klawisze multimedialne zestawu słuchawkowego.
  • Opcjonalne dla innych urządzeń wejściowych, ale zalecane dla klawiatur i joysticków specjalnego przeznaczenia.

Jeśli nie jest dostępny żaden plik układu klawiszy specyficzny dla urządzenia, system wybiera zamiast tego plik domyślny.

Lokalizacja

Pliki kluczowych układów są lokalizowane według dostawcy USB, identyfikatora produktu (i opcjonalnie wersji) lub nazwy urządzenia wejściowego. W kolejności sprawdzane są następujące ścieżki:

  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /odm/usr/keylayout/DEVICE_NAME.kl
  • /vendor/usr/keylayout/DEVICE_NAME.kl
  • /system/usr/keylayout/DEVICE_NAME.kl
  • /data/system/devices/keylayout/DEVICE_NAME.kl
  • /odm/usr/keylayout/Generic.kl
  • /vendor/usr/keylayout/Generic.kl
  • /system/usr/keylayout/Generic.kl
  • /data/system/devices/keylayout/Generic.kl

Podczas konstruowania ścieżki pliku zawierającej nazwę urządzenia wszystkie znaki nazwy urządzenia inne niż „0”-„9”, „a”-„z”, „A”-„Z”, „-” lub „_” są zastępowane przez „_”.

Ogólny plik układu klucza

System udostępnia specjalny, wbudowany plik ogólnego układu klawiszy o nazwie Generic.kl . Ten układ klawiszy jest przeznaczony do obsługi różnych standardowych zewnętrznych klawiatur i joysticków. Nie modyfikuj ogólnego układu klawiszy!

Składnia

Plik układu klucza to zwykły plik tekstowy składający się z deklaracji klucza lub osi i flag.

Kluczowe deklaracje

Deklaracje kluczy składają się ze key kluczowego, po którym następuje numer kodowy klucza systemu Linux i nazwa kodowa klucza systemu Android, lub użycie słowa kluczowego, po którym następuje użycie HID i nazwa kodowa klucza systemu Android. Użycie HID jest reprezentowane jako 32-bitowa liczba całkowita, gdzie górne 16 bitów reprezentuje stronę użycia HID, a dolne 16 bitów reprezentuje identyfikator użycia HID. Po każdej deklaracji może nastąpić opcjonalny zestaw flag zasad rozdzielanych spacjami.

key 1     ESCAPE
key 114   VOLUME_DOWN
key 16    Q                 VIRTUAL
key usage 0x0c006F          BRIGHTNESS_UP

Rozpoznawane są następujące flagi zasad:

  • FUNCTION : Klawisz należy interpretować tak, jakby naciśnięto także klawisz FUNKCJA.
  • GESTURE : Klawisz generowany przez gest użytkownika, taki jak dotknięcie ekranu dotykowego dłonią.
  • VIRTUAL : Klawisz to wirtualny klawisz programowy (przycisk pojemnościowy) znajdujący się obok głównego ekranu dotykowego. Powoduje to włączenie specjalnej logiki odrzucania (patrz poniżej).

Deklaracje osi

Każda deklaracja osi składa się ze słowa kluczowego axis , po którym następuje numer kodu osi systemu Linux i kwalifikatory kontrolujące zachowanie osi, w tym co najmniej jedną nazwę kodową osi systemu Android.

Podstawowe osie

Oś podstawowa po prostu odwzorowuje kod osi systemu Linux na nazwę kodową osi systemu Android. Następująca deklaracja odwzorowuje ABS_X (wskazywany przez 0x00 ) na AXIS_X (wskazywany przez X ).

axis 0x00 X

W powyższym przykładzie, jeśli wartość ABS_X wynosi 5 , wówczas AXIS_X jest ustawiona na 5 .

Podziel osie

Podzielona oś odwzorowuje kod osi systemu Linux na dwie nazwy kodowe osi systemu Android, tak że wartości mniejsze lub większe od progu są podczas mapowania dzielone na dwie różne osie. To mapowanie jest przydatne, gdy pojedyncza oś fizyczna zgłaszana przez urządzenie koduje dwie różne, wzajemnie wykluczające się osie logiczne.

Poniższa deklaracja odwzorowuje wartości osi ABS_Y (wskazywane przez 0x01 ) na AXIS_GAS , gdy są mniejsze niż 0x7f lub na AXIS_BRAKE , gdy są większe niż 0x7f .

axis 0x01 split 0x7f GAS BRAKE

W powyższym przykładzie, jeśli wartość ABS_Y wynosi 0x7d , wówczas AXIS_GAS jest ustawione na 2 ( 0x7f - 0x7d ), a AXIS_BRAKE jest ustawione na 0 . I odwrotnie, jeśli wartość ABS_Y wynosi 0x83 , wówczas AXIS_GAS jest ustawione na 0 , a AXIS_BRAKE jest ustawione na 4 ( 0x83 - 0x7f ). Wreszcie, jeśli wartość ABS_Y jest równa wartości podzielonej 0x7f wówczas zarówno AXIS_GAS , jak i AXIS_BRAKE są ustawione na 0 .

Odwrócone osie

Odwrócona oś odwraca znak wartości osi. Następująca deklaracja odwzorowuje ABS_RZ (wskazywany przez 0x05 ) na AXIS_BRAKE (wskazywany przez BRAKE ) i odwraca wynik poprzez jego negację.

axis 0x05 invert BRAKE

W powyższym przykładzie, jeśli wartość ABS_RZ wynosi 2 , wówczas AXIS_BRAKE jest ustawiona na -2 .

Opcja mieszkania środkowego

Urządzenie typu joystick może raportować zdarzenia wejściowe nawet wtedy, gdy joystick nie jest używany ze względu na hałas. Hałas ten zazwyczaj pochodzi z lewego i/lub prawego drążka i powoduje, że sterownik zgłasza wartość pozycji bliską 0. Wartość „środkowe mieszkanie” określa ilość szumu, jakiego można się spodziewać po kontrolerze w stanie spoczynku.

Protokół wejściowy systemu Linux umożliwia sterownikom urządzeń wejściowych określenie środkowej płaskiej wartości osi joysticka, ale nie wszystkie sterowniki to zgłaszają, a niektóre z nich podają nieprawidłowe wartości. Aby rozwiązać ten problem, po deklaracji osi można zastosować opcję flat , która określa szerokość obszaru wokół środkowej pozycji osi, którą należy uznać za wyśrodkowaną.

Na przykład, jeśli sterownik urządzenia zgłasza wartości dla AXIS_X z zakresu od 0 do 100, wówczas 0 zostanie odwzorowane na -1, a 100 zostanie odwzorowane na 1 przez system wejściowy Android. Środek zakresu będzie wynosił 50 we współrzędnych nieskalowanych i 0 we współrzędnych skalowanych. Jeśli wartość płaska jest równa 10, programiści powinni założyć, że każda wartość AXIS_X zgłoszona w przedziale od -0,1 do 0,1 (od 40 do 60 we współrzędnych nieskalowanych) jest szumem i traktować te wartości pochodzące z joysticka jako zero.

Uwaga : podczas gdy plik układu klawiszy określa wartość przestrzeni współrzędnych sterownika, wartość zgłaszana przez funkcję android.view.InputDevice.MotionRange#getFlat() znajduje się w przestrzeni współrzędnych systemu Android.

axis 0x03 Z flat 4096

W powyższym przykładzie wartość środkowej płaszczyzny jest ustawiona na 4096 .

Uwagi

Linie komentarza zaczynają się od # i trwają do końca linii:

# A comment!

Puste linie są ignorowane.

Przykłady

Klawiatura

# This is an example of a key layout file for a keyboard.

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 12    MINUS
key 13    EQUALS
key 14    DEL

# etc...

Sterowanie systemem

# This is an example of a key layout file for basic system controls,
# such as volume and power keys which are typically implemented as GPIO pins
# the device decodes into key presses.

key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 116   POWER

Przyciski pojemnościowe

# This is an example of a key layout file for a touch device with capacitive buttons.

key 139    MENU           VIRTUAL
key 172    HOME           VIRTUAL
key 158    BACK           VIRTUAL
key 217    SEARCH         VIRTUAL

Sterowanie multimediami w gnieździe słuchawkowym

# This is an example of a key layout file for headset mounted media controls.
# A typical headset jack interface might have special control wires or detect known
# resistive loads as corresponding to media functions or volume controls.
# This file assumes that the driver decodes these signals and reports media
# controls as key presses.

key 163   MEDIA_NEXT
key 165   MEDIA_PREVIOUS
key 226   HEADSETHOOK

Drążek sterowy

# This is an example of a key layout file for a joystick.

# These are the buttons that the joystick supports, represented as keys.
key 304   BUTTON_A
key 305   BUTTON_B
key 307   BUTTON_X
key 308   BUTTON_Y
key 310   BUTTON_L1
key 311   BUTTON_R1
key 314   BUTTON_SELECT
key 315   BUTTON_START
key 316   BUTTON_MODE
key 317   BUTTON_THUMBL
key 318   BUTTON_THUMBR

# Left and right stick.
# The reported value for flat is 128 in a range of -32767 to 32768, which is absurd.
# This confuses applications that rely on the flat value because the joystick
# actually settles in a flat range of +/- 4096 or so. We override it here.
axis 0x00 X flat 4096
axis 0x01 Y flat 4096
axis 0x03 Z flat 4096
axis 0x04 RZ flat 4096

# Triggers.
axis 0x02 LTRIGGER
axis 0x05 RTRIGGER

# Hat.
axis 0x10 HAT_X
axis 0x11 HAT_Y

Wirtualne klawisze programowe

System wejściowy zapewnia specjalne funkcje do wdrażania wirtualnych klawiszy programowalnych w następujących przypadkach użycia:

  1. Jeśli wirtualne klawisze programowe są wyświetlane graficznie na ekranie (np. w Galaxy Nexusie), są one implementowane przez komponent paska nawigacji w pakiecie System UI. Ponieważ graficzne wirtualne klawisze programowe są zaimplementowane w wyższym warstwie systemu, pliki układu klawiszy nie są zaangażowane i poniższe informacje nie mają zastosowania.
  2. Jeśli wirtualne klawisze programowe są zaimplementowane jako rozszerzony obszar dotykowy będący częścią głównego ekranu dotykowego (np. w Nexusie One), system wejściowy wykorzystuje plik mapy wirtualnych klawiszy do translacji współrzędnych dotykowych X/Y na kody klawiszy systemu Linux, następnie używa pliku układu klawiszy do przetłumaczenia kodów klawiszy systemu Linux na kody klawiszy systemu Android (więcej informacji na temat plików wirtualnych map klawiszy można znaleźć w artykule Urządzenia dotykowe ). Plik układu klawiszy dla urządzenia wejściowego z ekranem dotykowym musi określać odpowiednie mapowanie klawiszy i zawierać flagę VIRTUAL dla każdego klawisza.
  3. Jeśli wirtualne klawisze programowe są zaimplementowane jako przyciski pojemnościowe oddzielne od głównego ekranu dotykowego (np. w Nexusie S), sterownik urządzenia jądra lub oprogramowanie sprzętowe jest odpowiedzialne za tłumaczenie dotknięć na kody klawiszy systemu Linux, które następnie system wejściowy tłumaczy na kody klawiszy Androida za pomocą pliku układu klucza. Plik układu klawiszy dla urządzenia wejściowego z przyciskiem pojemnościowym musi określać odpowiednie mapowanie klawiszy i zawierać flagę VIRTUAL dla każdego klawisza.

Gdy wirtualne klawisze programowe znajdują się na ekranie dotykowym lub w jego bliskiej odległości, użytkownicy mogą łatwo przypadkowo nacisnąć przycisk podczas dotykania dolnej części ekranu lub podczas przesuwania palca z góry na dół lub z dołu do u góry ekranu. Aby temu zapobiec, system wejściowy stosuje lekkie tłumienie, w wyniku czego naciśnięcia wirtualnych klawiszy programowych są ignorowane przez krótki okres czasu po ostatnim dotknięciu ekranu dotykowego (opóźnienie to nazywane jest czasem wyciszenia klawiszy wirtualnych ).

Aby włączyć odrzucanie wirtualnego klawisza programowego:

  1. Podaj plik układu klawiszy dla ekranu dotykowego lub urządzenia wejściowego z przyciskiem pojemnościowym z ustawioną flagą VIRTUAL dla każdego klawisza.
    key 139    MENU           VIRTUAL
    key 172    HOME           VIRTUAL
    key 158    BACK           VIRTUAL
    key 217    SEARCH         VIRTUAL
    
  2. Ustaw wartość czasu cichego klucza wirtualnego w nakładce zasobów dla zasobu config.xml platformy.
    <!-- Specifies the amount of time to disable virtual keys after the screen
    is touched to filter out accidental virtual key presses due to swiping gestures
    or taps near the edge of the display. May be 0 to disable the feature.
    It is recommended that this value be no more than 250 ms.
    This feature should be disabled for most devices. -->
    
    <integer name="config_virtualKeyQuietTimeMillis">250</integer>
    

Walidacja

Powinieneś sprawdzić pliki układu klawiszy za pomocą narzędzia Sprawdź poprawność map klawiszy .