Wejście

Ikona HAL Androida

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 przedrostka KEY_ lub BTN_ . 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 przedrostka REL_ lub ABS_ . 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 i EV_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 przedrostka SW_ . Sterowniki wejściowe jądra systemu Linux zgłaszają zmiany stanu przełącznika jako zdarzenia EV_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 prefiksu KEYCODE_ .

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 i KEYCODE_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 przedrostka AXIS_ .

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

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

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

  1. Kody zdarzeń wejściowych systemu Linux
  2. Protokół wielodotyku w systemie Linux
  3. Sterowniki wejściowe systemu Linux
  4. Wymuszone sprzężenie zwrotne w Linuksie
  5. Informacje HID, w tym tabele użycia HID