Podsystem wejściowy Androida nominalnie składa się z potoku zdarzeń, który przechodzi przez wiele warstw systemu.
Rurociąg wejściowy
W najniższej warstwie fizyczne urządzenie wejściowe wytwarza sygnały opisujące zmiany stanu, takie jak naciśnięcia klawiszy i punkty kontaktowe. Oprogramowanie sprzętowe urządzenia koduje i przesyła te sygnały w jakiś sposób, na przykład poprzez wysyłanie raportów USB HID do systemu lub wytwarzanie przerwań na magistrali I2C.
Sygnały są następnie dekodowane przez sterownik urządzenia w jądrze Linuksa. Jądro Linuksa zapewnia sterowniki dla wielu standardowych urządzeń peryferyjnych, zwłaszcza tych, które obsługują protokół HID. Jednak producent OEM często musi dostarczać niestandardowe sterowniki dla urządzeń wbudowanych, które są ściśle zintegrowane z systemem na niskim poziomie, takich jak ekrany dotykowe.
Sterowniki urządzeń wejściowych są odpowiedzialne za tłumaczenie sygnałów specyficznych dla urządzenia na standardowy format zdarzenia wejściowego za pomocą protokołu wejściowego systemu Linux. Protokół wejściowy Linuksa definiuje standardowy zestaw typów zdarzeń i kodów w pliku nagłówkowym jądra linux/input.h
. W ten sposób komponenty znajdujące się poza jądrem nie muszą przejmować się szczegółami, takimi jak fizyczne kody skanowania, użycie HID, komunikaty I2C, piny GPIO i tym podobne.
Następnie komponent Android EventHub
odczytuje zdarzenia wejściowe z jądra, otwierając sterownik evdev
powiązany z każdym urządzeniem wejściowym. Komponent Android InputReader następnie dekoduje zdarzenia wejściowe zgodnie z klasą urządzenia i generuje strumień zdarzeń wejściowych systemu Android. W ramach tego procesu kody zdarzeń protokołu wejściowego systemu Linux są tłumaczone na kody zdarzeń systemu Android zgodnie z konfiguracją urządzenia wejściowego, plikami układu klawiatury i różnymi tabelami mapowania.
Na koniec InputReader
wysyła zdarzenia wejściowe do obiektu InputDispatcher, który przekazuje je do odpowiedniego okna.
Punkty kontrolne
W potoku wejściowym istnieje kilka etapów, które wpływają na kontrolę zachowania urządzenia wejściowego.
Konfiguracja sterowników i oprogramowania sprzętowego
Sterowniki urządzeń wejściowych często konfigurują zachowanie urządzenia wejściowego, ustawiając parametry w rejestrach lub nawet przesyłając samo oprogramowanie sprzętowe. Dzieje się tak szczególnie w przypadku urządzeń wbudowanych, takich jak ekrany dotykowe, gdzie duża część procesu kalibracji obejmuje dostrojenie tych parametrów lub naprawę oprogramowania sprzętowego w celu zapewnienia pożądanej dokładności i szybkości reakcji oraz wytłumienia szumów.
Opcje konfiguracji sterownika są często określane jako parametry modułu w pakiecie obsługi płyty jądra (BSP), dzięki czemu ten sam sterownik może obsługiwać wiele różnych implementacji sprzętowych.
Niniejsza dokumentacja próbuje opisać konfigurację sterownika lub oprogramowania sprzętowego, ale zawiera ogólne wskazówki dotyczące kalibracji urządzenia.
Właściwości konfiguracji płytki
Pakiet obsługi płyty jądra (BSP) może eksportować właściwości konfiguracyjne płyty za pośrednictwem SysFS, które są używane przez komponent Android InputReader, takie jak rozmieszczenie klawiszy wirtualnych na ekranie dotykowym.
Szczegółowe informacje na temat sposobu, w jaki różne urządzenia wykorzystują właściwości konfiguracyjne płytki, można znaleźć w sekcjach poświęconych klasom urządzeń.
Nakładki zasobów
Kilka zachowań wejściowych jest konfigurowanych za pomocą nakładek zasobów w config.xml
, np. działanie przełącznika pokrywy.
Oto kilka przykładów:
config_lidKeyboardAccessibility
: Określa wpływ przełącznika pokrywy na to, czy klawiatura sprzętowa jest dostępna, czy ukryta.config_lidNavigationAccessibility
: Określa wpływ przełącznika pokrywy na to, czy gładzik jest dostępny, czy ukryty.config_longPressOnPowerBehavior
: Określa, co powinno się stać, gdy użytkownik przytrzyma przycisk zasilania.config_lidOpenRotation
: Określa wpływ przełącznika pokrywy na orientację ekranu.
Aby uzyskać szczegółowe informacje na temat każdej opcji konfiguracji, zapoznaj się z dokumentacją w frameworks/base/core/res/res/values/config.xml
.
Kluczowe mapy
Mapy klawiszy są używane przez komponenty Android EventHub
i InputReader
do konfigurowania mapowania kodów zdarzeń systemu Linux na kody zdarzeń systemu Android dla klawiszy, przycisków joysticka i osi joysticka. Mapowanie może zależeć od urządzenia lub języka.
Szczegółowe informacje na temat sposobu, w jaki różne urządzenia korzystają z map klawiszy, można znaleźć w sekcjach poświęconych klasom urządzeń.
Wprowadź pliki konfiguracyjne urządzenia
Pliki konfiguracyjne urządzenia wejściowego są używane przez składniki Android EventHub
i InputReader
do konfigurowania specjalnych właściwości urządzenia, na przykład sposobu raportowania informacji o rozmiarze dotyku.
Szczegółowe informacje na temat sposobu, w jaki różne urządzenia korzystają z map konfiguracji urządzeń wejściowych, można znaleźć w sekcjach poświęconych klasom urządzeń.
Zrozumienie zastosowań HID i kodów zdarzeń
Często istnieje kilka różnych identyfikatorów odnoszących się do dowolnego klawisza na klawiaturze, przycisku na kontrolerze gier, osi joysticka lub innego elementu sterującego. Relacje między tymi identyfikatorami nie zawsze są takie same: zależą one od zestawu tabel mapowania, z których niektóre są stałe, a inne różnią się w zależności od charakterystyki urządzenia, sterownika urządzenia, bieżących ustawień regionalnych, konfiguracji systemu, preferencje użytkownika i inne czynniki.
- Kod skanowania fizycznego
Fizyczny kod skanujący to identyfikator specyficzny dla urządzenia, powiązany z każdym klawiszem, przyciskiem lub innym elementem sterującym. Ponieważ fizyczne kody skanowania często różnią się w zależności od urządzenia, oprogramowanie sprzętowe lub sterownik urządzenia jest odpowiedzialny za mapowanie ich na standardowe identyfikatory, takie jak użycie HID lub kody kluczy systemu Linux.
Kody skanujące są interesujące głównie dla klawiatur. Inne urządzenia zazwyczaj komunikują się na niskim poziomie za pomocą pinów GPIO, komunikatów I2C lub w inny sposób. W rezultacie górne warstwy stosu oprogramowania polegają na sterownikach urządzeń, aby zrozumieć, co się dzieje.
- Użycie HID'a
Użycie HID to standardowy identyfikator używany do raportowania stanu elementu sterującego, takiego jak klawisz klawiatury, oś joysticka, przycisk myszy lub punkt kontaktowy. Większość urządzeń wejściowych USB i Bluetooth jest zgodna ze specyfikacją HID, co umożliwia systemowi łączenie się z nimi w jednolity sposób.
Android Framework opiera się na sterownikach HID jądra Linuksa do tłumaczenia kodów użycia HID na kody kluczy Linuksa i inne identyfikatory. Dlatego zastosowania HID interesują głównie producentów urządzeń peryferyjnych.
- Kod klucza Linuksa
Kod klucza systemu Linux to standardowy identyfikator klawisza lub przycisku. Kody klawiszy systemu Linux są zdefiniowane w pliku nagłówkowym
linux/input.h
przy użyciu stałych rozpoczynających się od przedrostkaKEY_
lubBTN_
. Sterowniki wejściowe jądra Linuksa są odpowiedzialne za tłumaczenie fizycznych kodów skanowania, użycia HID i innych sygnałów specyficznych dla urządzenia na kody kluczy Linuksa i dostarczanie informacji o nich w ramach zdarzeńEV_KEY
.Interfejs API systemu Android czasami określa kod klucza systemu Linux powiązany z kluczem jako „kod skanowania”. Jest to technicznie niepoprawne, ale pomaga odróżnić kody kluczy systemu Linux od kodów kluczy systemu Android w interfejsie API.
- Kod osi względnej lub bezwzględnej systemu Linux
Kod osi względnej lub bezwzględnej systemu Linux to standardowy identyfikator służący do raportowania względnych ruchów lub pozycji bezwzględnych wzdłuż osi, takich jak względne ruchy myszy wzdłuż osi X lub bezwzględne położenie joysticka wzdłuż osi X. Kod osi systemu Linux jest zdefiniowany w pliku nagłówkowym
linux/input.h
przy użyciu stałych rozpoczynających się od przedrostkaREL_
lubABS_
. Sterowniki wejściowe jądra Linuksa są odpowiedzialne za tłumaczenie zastosowań HID i innych sygnałów specyficznych dla urządzenia na kody osi Linuksa i dostarczanie informacji o nich w ramach zdarzeńEV_REL
iEV_ABS
.- Kod przełącznika Linuksa
Kod przełącznika systemu Linux to standardowy identyfikator służący do raportowania stanu przełącznika na urządzeniu, np. przełącznika pokrywy. Kody przełączników systemu Linux są zdefiniowane w pliku nagłówkowym
linux/input.h
przy użyciu stałych rozpoczynających się od przedrostkaSW_
. Sterowniki wejściowe jądra Linuksa zgłaszają zmiany stanu przełącznika jako zdarzeniaEV_SW
.Aplikacje na Androida zazwyczaj nie odbierają zdarzeń z przełączników, ale system może używać ich wewnętrznie do sterowania różnymi funkcjami specyficznymi dla urządzenia.
- Kod klucza Androida
Kod klucza systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android w celu wskazania konkretnego klucza, takiego jak „HOME”. Kody kluczy systemu Android są zdefiniowane przez klasę
android.view.KeyEvent
jako stałe rozpoczynające się od przedrostkaKEYCODE_
.Układ klawiszy określa, w jaki sposób kody klawiszy systemu Linux są mapowane na kody klawiszy systemu Android. Można stosować różne układy klawiszy w zależności od modelu klawiatury, języka, kraju, układu lub funkcji specjalnych.
Kombinacje kodów klawiszy Androida są przekształcane na kody znaków przy użyciu mapy znaków klawiszy specyficznej dla urządzenia i ustawień regionalnych. Na przykład, gdy klawisze zidentyfikowane jako
KEYCODE_SHIFT
iKEYCODE_A
zostaną naciśnięte razem, system wyszukuje kombinację na mapie znaków klawiszy i znajduje dużą literę „A”, która jest następnie wstawiana do aktualnie aktywnego widżetu tekstowego.- Kod osi Androida
Kod osi systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android w celu wskazania konkretnej osi urządzenia. Kody osi systemu Android są definiowane przez klasę
android.view.MotionEvent
jako stałe rozpoczynające się od przedrostkaAXIS_
.Układ klawiszy określa, w jaki sposób kody osi systemu Linux są mapowane na kody osi systemu Android. Można stosować różne układy klawiszy w zależności od modelu urządzenia, języka, kraju, układu lub funkcji specjalnych.
- Stan meta Androida
Metastan systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android w celu wskazania, które klawisze modyfikujące zostały naciśnięte. Stany meta systemu Android są definiowane przez klasę
android.view.KeyEvent
jako stałe rozpoczynające się od przedrostkaMETA_
.Bieżący stan meta jest określany przez komponent Android InputReader, który monitoruje naciśnięcie/zwolnienie klawiszy modyfikujących, takich jak
KEYCODE_SHIFT_LEFT
, i ustawia/resetuje odpowiednią flagę stanu meta.Relacja między klawiszami modyfikującymi a stanami meta jest zakodowana na stałe, ale układ klawiszy może zmieniać sposób mapowania samych klawiszy modyfikujących, co z kolei wpływa na stany meta.
- Stan przycisku Androida
Stan przycisku systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android w celu wskazania, które przyciski (myszy lub rysika) zostały naciśnięte. Stany przycisków systemu Android są definiowane przez klasę
android.view.MotionEvent
jako stałe rozpoczynające się od przedrostkaBUTTON_
.Bieżący stan przycisku jest określany przez komponent Android InputReader, który monitoruje naciśnięcie/zwolnienie przycisków (myszki lub rysika) i ustawia/resetuje odpowiednią flagę stanu przycisku.
Relacja między przyciskami i stanami przycisków jest zakodowana na stałe.
Dalsza lektura
- Kody zdarzeń wejściowych systemu Linux
- Protokół wielodotykowy systemu Linux
- Sterowniki wejściowe dla systemu Linux
- Wymuszone sprzężenie zwrotne w Linuksie
- Informacje HID, w tym tabele użycia HID