Wejście

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Ikona HAL wprowadzania Androida

Podsystem wejściowy systemu Android 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 punkty styku dotykowego. Oprogramowanie układowe urządzenia koduje i przesyła te sygnały w pewien sposób, na przykład przez wysyłanie raportów USB HID do systemu lub przez tworzenie przerwań na magistrali I2C.

Sygnały są następnie dekodowane przez sterownik urządzenia w jądrze Linux. Jądro Linuksa dostarcza 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, takie 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 spoza jądra nie muszą dbać o szczegóły, takie jak fizyczne kody skanowania, wykorzystanie HID, komunikaty I2C, piny GPIO i tym podobne.

Następnie składnik Android EventHub odczytuje zdarzenia wejściowe z jądra, otwierając sterownik evdev skojarzony z każdym urządzeniem wejściowym. Składnik 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 InputDispatcher, który przekazuje je do odpowiedniego okna.

Punkty kontrolne

Istnieje kilka etapów w potoku wejściowym, które wpływają na kontrolę nad zachowaniem 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 wgrywając samo oprogramowanie układowe. Dotyczy to w szczególności urządzeń wbudowanych, takich jak ekrany dotykowe, gdzie duża część procesu kalibracji obejmuje dostrajanie tych parametrów lub naprawę oprogramowania układowego w celu zapewnienia pożądanej dokładności i szybkości reakcji oraz tł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.

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 jądra (BSP) może eksportować właściwości konfiguracji płyty za pośrednictwem SysFS, które są używane przez komponent Android InputReader, takie jak umieszczanie wirtualnych klawiszy na ekranie dotykowym.

Zapoznaj się z sekcjami dotyczącymi klasy urządzeń, aby uzyskać szczegółowe informacje o tym, jak różne urządzenia wykorzystują właściwości konfiguracyjne karty.

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 ma 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 z 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.

Zapoznaj się z sekcjami dotyczącymi klasy urządzeń, aby uzyskać szczegółowe informacje o tym, jak różne urządzenia korzystają z map klawiszy.

Pliki konfiguracyjne urządzenia wejściowego

Pliki konfiguracji urządzenia wejściowego są używane przez składniki Android EventHub i InputReader do konfigurowania specjalnych cech urządzenia, takich jak sposób raportowania informacji o rozmiarze dotyku.

Zapoznaj się z sekcjami dotyczącymi klasy urządzeń, aby uzyskać szczegółowe informacje o tym, jak różne urządzenia korzystają z map konfiguracji urządzeń wejściowych.

Zrozumienie zastosowań HID i kodów zdarzeń

Często istnieje kilka różnych identyfikatorów, które odnoszą 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: są one zależne od zestawu tabel mapowania, z których część jest stała, a część zmienia się w zależności od charakterystyki urządzenia, sterownika urządzenia, aktualnego ustawienia regionalnego, konfiguracji systemu, preferencje użytkownika i inne czynniki.

Fizyczny kod skanowania

Fizyczny kod skanowania to identyfikator urządzenia, 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 są odpowiedzialne za mapowanie ich na standardowe identyfikatory, takie jak użycie HID lub kody kluczy systemu Linux.

Kody skanowania są głównie interesujące dla klawiatur. Inne urządzenia zazwyczaj komunikują się na niskim poziomie za pomocą pinów GPIO, komunikatów I2C lub innych środków. W związku z tym górne warstwy stosu oprogramowania opierają się na sterownikach urządzeń, aby zrozumieć, co się dzieje.

Wykorzystanie HID

Użycie HID to standardowy identyfikator używany do zgłaszania stanu kontrolki, takiej jak klawisz klawiatury, oś joysticka, przycisk myszy lub punkt kontaktu dotykowego. Większość urządzeń wejściowych USB i Bluetooth jest zgodna ze specyfikacją HID, która umożliwia systemowi łączenie się z nimi w jednolity sposób.

System Android Framework opiera się na sterownikach HID jądra systemu Linux do tłumaczenia kodów użycia HID na kody kluczy systemu Linux i inne identyfikatory. Dlatego też zastosowania HID są interesujące głównie dla producentów urządzeń peryferyjnych.

Kluczowy kod Linuksa

Kod klucza Linuksa to standardowy identyfikator klawisza lub przycisku. Kody kluczy systemu Linux są zdefiniowane w pliku nagłówkowym linux/input.h przy użyciu stałych, które zaczynają 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 odnosi się do kodu klucza systemu Linux skojarzonego z kluczem jako „kodu skanowania”. Jest to technicznie niepoprawne, ale pomaga odróżnić kody kluczy Linuksa od kodów kluczy Androida w interfejsie API.

Względny lub absolutny kod osi Linuksa

Względny lub bezwzględny kod osi systemu Linux to standardowy identyfikator służący do raportowania ruchów względnych 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. Kody osi Linuksa są zdefiniowane w pliku nagłówkowym linux/input.h przy użyciu stałych, które zaczynają się od prefiksu 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 raportowania stanu przełącznika na urządzeniu, takim jak przełącznik pokrywy. Kody przełączników Linuksa są zdefiniowane w pliku nagłówkowym linux/input.h przy użyciu stałych, które zaczynają się od przedrostka SW_ . Sterowniki wejściowe jądra systemu Linux zgłaszają zmiany stanu przełącznika jako zdarzenia EV_SW .

Aplikacje na Androida na ogół 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 Androida to standardowy identyfikator zdefiniowany w interfejsie API Androida do wskazywania konkretnego klucza, takiego jak „HOME”. Kody kluczy systemu Android są definiowane przez klasę android.view.KeyEvent jako stałe, które zaczynają się od prefiksu KEYCODE_ .

Układ klawiszy określa, w jaki sposób kody kluczy systemu Linux są mapowane na kody kluczy 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 kluczy 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 klawisze zidentyfikowane jako KEYCODE_SHIFT i KEYCODE_A zostaną naciśnięte razem, system wyszukuje kombinację na mapie znaków klawisza i znajduje wielką 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 służący do wskazywania określonej osi urządzenia. Kody osi systemu Android są definiowane przez klasę android.view.MotionEvent jako stałe, które zaczynają się od prefiksu AXIS_ .

Układ klawiszy określa sposób mapowania kodów osi systemu Linux 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.

Stan meta w Androidzie

Stan meta systemu Android to standardowy identyfikator zdefiniowany w interfejsie API systemu Android służący do wskazywania, 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 składnik 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 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 (myszy lub rysika) są naciskane. Stany przycisków systemu Android są definiowane przez klasę android.view.MotionEvent jako stałe, które zaczynają się od prefiksu BUTTON_ .

Aktualny stan przycisku jest określany przez komponent Android InputReader, który monitoruje, kiedy przyciski (myszy lub rysika) są wciskane/zwalniane i ustawia/resetuje odpowiednią flagę stanu przycisku.

Relacja między przyciskami a stanami przycisków jest zakodowana na stałe.

Dalsza lektura

  1. Kody zdarzeń wejścia Linuksa
  2. Protokół wielodotykowy w systemie Linux
  3. Sterowniki wejściowe systemu Linux
  4. Wymuś sprzężenie zwrotne w systemie Linux
  5. Informacje o HID, w tym tabele użycia HID