Dane wejściowe

Ikona interfejsu HAL wejścia na Androida

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 EventHubInputReader 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 EventHubInputReader 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 prefiksu KEY_ lub BTN_. 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ów REL_ lub ABS_. 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_RELEV_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 prefiksu SW_. Sterowniki wejścia jądra Linuxa zgłaszają zmiany stanu przełącznika jako zdarzenia EV_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 prefiksu KEYCODE_.

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_SHIFTKEYCODE_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 prefiksu AXIS_.

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 prefiksu META_.

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 prefiksu BUTTON_.

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

  1. Kody zdarzeń wejściowych Linuxa
  2. Protokół wielodotykowy Linuxa
  3. sterowniki urządzeń wejściowych w systemie Linux,
  4. Linux – opinie na temat siły
  5. informacje o HID, w tym tabele wykorzystania HID;