![Ikona interfejsu HAL wejścia na Androida](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=6&hl=pl)
Podsystem danych wejściowych Androida składa się nominalnie z kanału zdarzeń, który przechodzi przez wiele warstw systemu.
Potok wejściowy
Na najniższej warstwie fizyczne urządzenie wejściowe generuje sygnały opisujące zmiany stanu, takie jak naciśnięcia klawiszy i punkty styczności dotykowej. Firmware urządzenia koduje i przekazuje te sygnały w jakiś sposób, na przykład wysyłając do systemu raporty HID USB lub generując przerwania na magistrali I2C.
Sygnały są następnie dekodowane przez sterownik urządzenia w rdzeniu Linuksa. Jądro Linuksa udostępnia sterowniki wielu standardowych urządzeń peryferyjnych, w szczególności tych, które korzystają z protokołu HID. Jednak OEM często musi udostępniać niestandardowe sterowniki dla urządzeń wbudowanych, które są ściśle zintegrowane z systemem na niskim poziomie, np. ekrany dotykowe.
Sterowniki urządzeń wejściowych odpowiadają za przekształcanie sygnałów związanych z danym urządzeniem w standardowy format zdarzenia wejściowego za pomocą protokołu wejściowego Linuxa. Protokół wejściowy Linuxa definiuje standardowy zestaw typów i kodów zdarzeń w pliku nagłówka jądra linux/input.h
.
Dzięki temu komponenty spoza jądra nie muszą się martwić o szczegóły, takie jak kody skanowania fizycznego, użycia HID, komunikaty I2C czy piny GPIO.
Następnie komponent EventHub
Androida odczytuje zdarzenia wejścia 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 tworzy strumień zdarzeń wejściowych Androida. W ramach tego procesu kody zdarzeń protokołu wejściowego Linux są tłumaczone na kody zdarzeń Androida 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 modułu InputDispatcher, który przekazuje je do odpowiedniego okna.
Punkty kontrolne
W potoku danych wejściowych jest kilka etapów, które wpływają na działanie urządzenia wejściowego.
Konfiguracja sterownika i oprogramowania układowego
Sterowniki urządzeń wejściowych często konfigurują działanie urządzenia wejściowego przez ustawienie parametrów w rejestrach lub nawet przesłanie samego oprogramowania. Dotyczy to zwłaszcza urządzeń wbudowanych, takich jak ekrany dotykowe, w przypadku których duża część procesu kalibracji polega na dostosowaniu tych parametrów lub poprawie oprogramowania układowego w celu zapewnienia pożądanej dokładności i szybkości reakcji oraz redukcji szumu.
Opcje konfiguracji sterownika są często określane jako parametry modułu w pakiecie BSP (ang. Board Support Package), aby ten sam sterownik mógł obsługiwać wiele różnych implementacji sprzętowych.
W tej dokumentacji znajdziesz informacje o konfiguracji sterownika lub oprogramowania układowego, ale ogólnie omawiamy w niej kalibrację urządzenia.
Właściwości konfiguracji tablicy
Pakiet wsparcia dla jądra (BSP) może eksportować właściwości konfiguracji płyty za pomocą SysFS, które są używane przez komponent Android InputReader, na przykład położenie klawiszy wirtualnych na ekranie dotykowym.
Szczegółowe informacje o tym, jak różne urządzenia korzystają z właściwości konfiguracji płyty, znajdziesz w odpowiednich sekcjach dotyczących klasy urządzenia.
Nakładki zasobów
Niektóre zachowania wejścia są konfigurowane za pomocą nakładek zasobów w config.xml
, np. działanie przełącznika pokrywy.
Oto kilka przykładów:
-
config_lidKeyboardAccessibility
: określa efekt przełącznika pokrywy, który decyduje o tym, czy klawiatura sprzętowa jest dostępna, czy ukryta. -
config_lidNavigationAccessibility
: określa efekt przełącznika na pokrywie, który decyduje o tym, czy panel dotykowy jest widoczny, czy ukryty. -
config_longPressOnPowerBehavior
: określa, co powinno się stać, gdy użytkownik przytrzyma przycisk zasilania. -
config_lidOpenRotation
: określa wpływ przełącznika na pokrywie na orientację ekranu.
Szczegółowe informacje o każdej opcji konfiguracji znajdziesz w dokumentacji frameworks/base/core/res/res/values/config.xml
.
Mapy klawiszy
Mapy klawiszy są używane przez komponenty EventHub
i InputReader
na Androidzie do konfigurowania mapowania kodów zdarzeń Linuxa na kody zdarzeń Androida w przypadku klawiszy, przycisków joysticka i osi joysticka. Mapowanie może zależeć od urządzenia lub języka.
Szczegółowe informacje o tym, jak różne urządzenia korzystają z kluczowych map, znajdziesz w odpowiednich sekcjach dotyczących klas urządzeń.
Pliki konfiguracji urządzeń wejściowych
Pliki konfiguracji urządzenia wejściowego są używane przez komponenty EventHub
i InputReader
w Androidzie do konfigurowania specjalnych właściwości urządzenia, takich jak sposób raportowania informacji o rozmiarze dotykowym.
Szczegółowe informacje o tym, jak różne urządzenia korzystają z map konfiguracji urządzeń wejściowych, znajdziesz w odpowiednich sekcjach dotyczących klas urządzeń.
Zastosowanie i kody zdarzeń HID
Często do identyfikacji danego klawisza na klawiaturze, przycisku na kontrolerze do gier, osi joysticka lub innego elementu sterującego używa się kilku różnych identyfikatorów. Relacje między tymi identyfikatorami nie są zawsze takie same: zależą od zestawu tabel mapowania, z których niektóre są stałe, a inne zmieniają się w zależności od cech urządzenia, sterownika urządzenia, bieżącej lokalizacji, konfiguracji systemu, preferencji użytkownika i innych czynników.
- Kod skanowania fizycznego
-
Kod skanowania fizycznego to identyfikator powiązany z konkretnym urządzeniem, który jest powiązany z każdym klawiszem, przyciskiem lub innym elementem sterującym. Fizyczne kody skanowania często różnią się od siebie na różnych urządzeniach, dlatego za mapowanie ich na standardowe identyfikatory, takie jak kody HID Usages lub kody klawiszy Linux, odpowiada oprogramowanie układowe lub sterownik urządzenia.
Kody skanowania są głównie interesujące w przypadku klawiatur. Inne urządzenia komunikują się zazwyczaj na niskim poziomie za pomocą pinów GPIO, komunikatów I2C lub innych środków. W związku z tym górne warstwy oprogramowania oparte są na sterownikach urządzeń, które interpretują, co się dzieje.
- Użycie HID
-
Użycie HID to standardowy identyfikator, który służy do zgłaszania stanu elementu sterującego, np. klawisza klawiatury, osi joysticka, przycisku myszy lub punktu dotykowego. Większość urządzeń wejściowych USB i Bluetooth jest zgodna ze specyfikacją HID, co umożliwia systemowi na komunikację z nimi w jednolity sposób.
Platforma Android Framework korzysta z sterowników HID jądra Linuxa, aby przekształcać kody użycia HID w kody klawiszy i inne identyfikatory Linuxa. Dlatego zastosowania HID są interesujące głównie dla producentów urządzeń peryferyjnych.
- Kod klucza Linuksa
-
Kod klucza Linuxa to standardowy identyfikator klucza lub przycisku. Kody kluczy Linuksa są definiowane w pliku nagłówka
linux/input.h
za pomocą stałych, które zaczynają się od prefiksuKEY_
lubBTN_
. Sterowniki urządzeń wejściowych jądra Linuxa odpowiadają za tłumaczenie kodów skanowania, użycia HID i innych sygnałów związanych z urządzeniem na kody klawiszy Linuxa oraz dostarczanie informacji o tych kodach w ramach zdarzeńEV_KEY
.Interfejs API Androida czasami odnosi się do kodu klucza systemu Linux powiązanego z kluczem jako „kod skanowania”. Jest to technicznie nieprawidłowe, ale pomaga odróżnić kody kluczy Linuksa od kodów kluczy Androida w interfejsie API.
- Kod osi względnej lub bezwzględnej Linuksa
-
Kod osi względnej lub bezwzględnej systemu Linux to standardowy identyfikator do raportowania ruchów względnych lub pozycji bezwzględnych wzdłuż osi, np. ruchów względnych myszy wzdłuż osi X lub pozycji bezwzględnej drążka wzdłuż osi X. Kody osi Linuxa są zdefiniowane w pliku nagłówka
linux/input.h
za pomocą stałych, które zaczynają się od prefiksówREL_
lubABS_
. Sterowniki wejścia jądra Linuxa odpowiadają za tłumaczenie zastosowań HID i innych sygnałów dotyczących urządzenia na kody osi Linuxa oraz dostarczanie informacji o tych sygnałach w ramach zdarzeńEV_REL
iEV_ABS
. - Kod przełączania systemu Linux
-
Kod przełącznika systemu Linux to standardowy identyfikator do zgłaszania stanu przełącznika na urządzeniu, np. przełącznika pokrywy. Kody przełączników systemu Linux są definiowane w pliku nagłówka
linux/input.h
za pomocą stałych, które zaczynają się od prefiksuSW_
. Sterowniki wejścia jądra Linuxa zgłaszają zmiany stanu przełącznika jako zdarzeniaEV_SW
.Aplikacje na Androida zwykle nie otrzymują zdarzeń z przełączników, ale system może używać ich wewnętrznie do sterowania różnymi funkcjami urządzenia.
- Kod klucza Androida
-
Kod klucza Androida to standardowy identyfikator zdefiniowany w interfejsie API Androida, który wskazuje konkretny klucz, np. „HOME”. Kody klawiszy Androida są definiowane przez klasę
android.view.KeyEvent
jako stałe, które zaczynają się od prefiksuKEYCODE_
.Układ klawiszy określa, jak kody klawiszy Linux są mapowane na kody klawiszy Androida. W zależności od modelu klawiatury, języka, kraju, układu lub funkcji specjalnych można używać różnych układów klawiszy.
Kombinacje kodów klawiszy Androida są przekształcane w kody znaków za pomocą mapy znaków klawiszy specyficznej dla urządzenia i ustawień regionalnych. Jeśli na przykład wciśniesz jednocześnie klawisze
KEYCODE_SHIFT
iKEYCODE_A
, system wyszuka tę kombinację w mapie znaków i znaleziona zostanie wielka litera „A”, która zostanie wstawiona do obecnie aktywnego widgetu tekstowego. - Android Axis Code
-
Kod osi Androida to standardowy identyfikator zdefiniowany w interfejsie API Androida, który wskazuje określoną oś urządzenia. Kody osi Androida są definiowane przez klasę
android.view.MotionEvent
jako stałe, które zaczynają się od prefiksuAXIS_
.Układ klawiszy określa, jak kody osi Linuksa są mapowane na kody osi Androida. W zależności od modelu urządzenia, języka, kraju, układu lub funkcji specjalnych można używać różnych układów klawiszy.
- Stan meta Androida
-
Metastan Androida to standardowy identyfikator zdefiniowany w interfejsie API Androida, który wskazuje, które klawisze modyfikujące są wciśnięte. Metastany Androida 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 wciśnięto lub zwolniono klawisze modyfikujące, takie jak
KEYCODE_SHIFT_LEFT
, oraz ustawia lub resetuje odpowiedni znacznik stanu meta.Związek między klawiszami modyfikatorami a stanami meta jest zakodowany na stałe, ale układ klawiszy może zmieniać sposób mapowania klawiszy modyfikatorów, co z kolei wpływa na stany meta.
- Stan przycisku w Androidzie
-
Stan przycisku Androida to standardowy identyfikator zdefiniowany w interfejsie API Androida, który wskazuje, które przyciski (na myszy lub rysikiem) są wciśnięte. Stany przycisku Androida są definiowane przez klasę
android.view.MotionEvent
jako stałe zaczynające się od prefiksuBUTTON_
.Bieżący stan przycisku jest określany przez komponent Android InputReader, który monitoruje, kiedy przyciski (na myszce lub rysi) są naciskane / zwalniane, oraz ustawia / resetuje odpowiedni flagę stanu przycisku.
Związek między przyciskami a ich stanami jest zakodowany na stałe.
Więcej materiałów
- Kody zdarzeń wejściowych Linuxa
- Protokół wielodotykowy Linuxa
- sterowniki urządzeń wejściowych w systemie Linux,
- Linux – opinie na temat siły
- informacje o HID, w tym tabele wykorzystania HID;