Dane wejściowe

Ikona Androida wejściowego HAL

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

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

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

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

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

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