
Podsystem wejściowy Androida nominalnie składa się z potoku zdarzeń, który przechodzi przez wiele warstw systemu.
Potok wejściowy
W najniższej warstwie fizyczne urządzenie wejściowe generuje sygnały opisujące zmiany stanu, takie jak naciśnięcia klawiszy i dotykowe punkty kontaktowe. Oprogramowanie układowe urządzenia koduje i przesyła te sygnały w jakiś sposób, na przykład wysyłając raporty USB HID do systemu lub wytwarzając przerwania na szynie 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, szczególnie tych, które są zgodne z protokołem 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 translację sygnałów specyficznych dla urządzenia na standardowy format zdarzeń wejściowych za pośrednictwem protokołu wejściowego systemu Linux. Protokół wejściowy systemu Linux definiuje standardowy zestaw typów zdarzeń i kodów w pliku nagłówkowym jądra linux/input.h
. W ten sposób komponenty 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. Następnie komponent Android InputReader 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 InputDispatcher, który przekazuje je do odpowiedniego okna.
Punkty kontrolne
Istnieje kilka etapów w potoku wejściowym, które wpływają na kontrolę zachowania urządzenia wejściowego.
Konfiguracja sterowników i oprogramowania układowego
Sterowniki urządzeń wejściowych często konfigurują zachowanie urządzenia wejściowego, ustawiając parametry w rejestrach lub nawet ładując samo oprogramowanie układowe. Dotyczy to w szczególności urządzeń wbudowanych, takich jak ekrany dotykowe, gdzie znaczna część procesu kalibracji obejmuje dostrajanie tych parametrów lub poprawianie oprogramowania układowego w celu zapewnienia pożądanej dokładności i czasu reakcji oraz tłumienia szumów.
Opcje konfiguracji sterownika są często określane jako parametry modułu w pakiecie obsługi płyty głównej (BSP), dzięki czemu ten sam sterownik może obsługiwać wiele różnych implementacji sprzętowych.
Ta dokumentacja próbuje opisać konfigurację sterownika lub oprogramowania układowego, ale zawiera ogólne wskazówki dotyczące kalibracji urządzenia.
Właściwości konfiguracji płytki
Pakiet wsparcia płyty głównej (BSP) może eksportować właściwości konfiguracji płyty przez SysFS, które są używane przez komponent Android InputReader, takie jak rozmieszczenie klawiszy wirtualnych na ekranie dotykowym.
Szczegółowe informacje o tym, jak różne urządzenia wykorzystują właściwości konfiguracji karty, znajdują się w sekcjach dotyczących klas urządzeń.
Nakładki zasobów
Kilka zachowań wejściowych jest konfigurowanych za pomocą nakładek zasobów w config.xml
, takich jak 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.
Zapoznaj się z dokumentacją w frameworks/base/core/res/res/values/config.xml
aby uzyskać szczegółowe informacje na temat każdej opcji konfiguracji.
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 być zależne od urządzenia lub języka.
Szczegółowe informacje o tym, jak różne urządzenia używają map klawiszy, można znaleźć w sekcjach dotyczących klas urządzeń.
Wprowadź pliki konfiguracyjne urządzenia
Pliki konfiguracyjne urządzeń wejściowych są używane przez komponenty Android EventHub
i InputReader
do konfigurowania specjalnych właściwości urządzeń, takich jak sposób zgłaszania informacji o rozmiarze dotyku.
Szczegółowe informacje o tym, jak różne urządzenia używają map konfiguracji urządzeń wejściowych, można znaleźć w sekcjach dotyczących klas urządzeń.
Zrozumienie zastosowań HID i kodów zdarzeń
Często istnieje kilka różnych identyfikatorów używanych w odniesieniu do danego klawisza na klawiaturze, przycisku na kontrolerze do gier, osi joysticka lub innego elementu sterującego. Relacje między tymi identyfikatorami nie zawsze są takie same: są zależne od zestawu tabel mapowania, z których niektóre są stałe, a niektóre różnią się w zależności od charakterystyki urządzenia, sterownika urządzenia, bieżącej lokalizacji, konfiguracji systemu, preferencje użytkownika i inne czynniki.
- Fizyczny kod skanowania
Fizyczny kod skanu to specyficzny dla urządzenia identyfikator, który jest 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 układowe lub sterownik urządzenia jest odpowiedzialny za mapowanie ich na standardowe identyfikatory, takie jak HID Usages lub kody klucza systemu Linux.
Kody skanowania są interesujące głównie dla klawiatur. Inne urządzenia zwykle komunikują się na niskim poziomie za pomocą pinów GPIO, komunikatów I2C lub innych środków. W związku z tym wyższe warstwy stosu oprogramowania polegają na sterownikach urządzeń, aby zrozumieć, co się dzieje.
- Użycie HID
Użycie HID to standardowy identyfikator używany do zgłaszania 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żytkowania HID na kody kluczy Linuksa i inne identyfikatory. Dlatego zastosowania HID są głównie przedmiotem zainteresowania producentów urządzeń peryferyjnych.
- Kod klucza Linuksa
Kod klucza systemu Linux jest standardowym identyfikatorem klawisza lub przycisku. Kody kluczy 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 translację 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 klucza Linuksa od kodów klucza Androida w interfejsie API.
- Linuksowy względny lub bezwzględny kod osi
Kod osi względnej lub bezwzględnej systemu Linux jest standardowym identyfikatorem służącym do zgłaszania ruchów względnych lub pozycji bezwzględnych wzdłuż osi, takich jak względne ruchy myszy wzdłuż osi X lub położenie bezwzględne joysticka wzdłuż osi X. Kod osi systemu Linux jest zdefiniowany w pliku nagłówkowym
linux/input.h
przy użyciu stałych zaczynających się od przedrostkaREL_
lubABS_
. Sterowniki wejściowe jądra Linuksa są odpowiedzialne za tłumaczenie użycia 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 zgłaszania stanu przełącznika na urządzeniu, takim jak przełącznik pokrywy. Kody przełączników systemu Linux są definiowane w pliku nagłówkowym
linux/input.h
przy użyciu stałych zaczynających się od przedrostkaSW_
. Sterowniki wejściowe jądra systemu Linux zgłaszają zmiany stanu przełącznika jako zdarzeniaEV_SW
.Aplikacje systemu Android zasadniczo nie odbierają zdarzeń z przełączników, ale system może je wykorzystywać 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 służący do wskazywania określonego klucza, na przykład „HOME”. Kody klawiszy systemu Android są definiowane przez klasę
android.view.KeyEvent
jako stałe rozpoczynające się od prefiksuKEYCODE_
.Układ klawiszy określa, w jaki sposób kody klucza systemu Linux są mapowane na kody klucza systemu Android. W zależności od modelu klawiatury, języka, kraju, układu lub funkcji specjalnych mogą być używane różne układy klawiszy.
Kombinacje kodów klawiszy systemu Android są przekształcane w kody znaków przy użyciu mapy znaków klucza specyficznej dla urządzenia i lokalizacji. Na przykład, gdy oba klawisze oznaczone jako
KEYCODE_SHIFT
iKEYCODE_A
zostaną naciśnięte razem, system wyszukuje kombinację na mapie znaków klawiszy i znajduje wielką literę „A”, która jest następnie wstawiana do aktualnie zaznaczonego widżetu tekstowego.- Kod osi Androida
Kod osi systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android służący do wskazywania określonej osi urządzenia. Kody osi systemu Android są definiowane przez klasę
android.view.MotionEvent
jako stałe zaczynające się od przedrostkaAXIS_
.Układ klawiszy określa, w jaki sposób kody osi systemu Linux są mapowane na kody osi systemu Android. W zależności od modelu urządzenia, języka, kraju, układu lub funkcji specjalnych mogą być używane różne układy klawiszy.
- Metastan Androida
Stan meta systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android, który wskazuje, które klawisze modyfikujące zostały naciśnięte. Stany meta systemu Android są definiowane przez klasę
android.view.KeyEvent
jako stałe, które zaczynają się od prefiksuMETA_
.Bieżący stan meta jest określany przez komponent Android InputReader, który monitoruje, kiedy klawisze modyfikujące, takie jak
KEYCODE_SHIFT_LEFT
, są naciśnięte/zwolone 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 zmienić 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 służący do wskazywania, które przyciski (na myszy lub rysiku) zostały naciśnięte. Stany przycisków systemu Android są definiowane przez klasę
android.view.MotionEvent
jako stałe rozpoczynające się od prefiksuBUTTON_
.Bieżący stan przycisku jest określany przez komponent Android InputReader, który monitoruje, kiedy przyciski (na myszy lub rysiku) są wciskane/zwalniane 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ół wielodotyku w systemie Linux
- Sterowniki wejściowe systemu Linux
- Wymuszone sprzężenie zwrotne w Linuksie
- Informacje HID, w tym tabele użycia HID