Eingabe

Symbol für Android Input HAL

Das Android-Eingabe-Subsystem besteht normalerweise aus einer Ereignispipeline, die mehrere Schichten des Systems durchläuft.

Eingabepipeline

Auf der untersten Schicht erzeugt das physische Eingabegerät Signale, die Statusänderungen wie Tastendrücke und Berührungspunkte beschreiben. Die Gerätefirmware codiert und überträgt diese Signale auf eine bestimmte Weise, z. B. durch Senden von USB-HID-Berichten an das System oder durch Auslösen von Unterbrechungen auf einem I2C-Bus.

Die Signale werden dann von einem Gerätetreiber im Linux-Kernel decodiert. Der Linux-Kernel bietet Treiber für viele Standardperipheriegeräte, insbesondere für solche, die dem HID-Protokoll entsprechen. Ein OEM muss jedoch häufig benutzerdefinierte Treiber für eingebettete Geräte bereitstellen, die auf niedriger Ebene fest in das System integriert sind, z. B. Touchscreens.

Die Eingabegerätetreiber sind dafür verantwortlich, gerätespezifische Signale über das Linux-Eingabeprotokoll in ein standardmäßiges Eingabeereignisformat umzuwandeln. Das Linux-Eingabeprotokoll definiert einen Standardsatz von Ereignistypen und ‑codes in der linux/input.h-Kernel-Headerdatei. So müssen sich Komponenten außerhalb des Kernels nicht um Details wie physische Scancodes, HID-Nutzungen, I2C-Nachrichten, GPIO-Pins usw. kümmern.

Als Nächstes liest die Android-EventHub-Komponente Eingabeereignisse aus dem Kernel, indem der evdev-Treiber geöffnet wird, der mit jedem Eingabegerät verknüpft ist. Die Android InputReader-Komponente decodiert dann die Eingabeereignisse entsprechend der Geräteklasse und generiert einen Stream von Android-Eingabeereignissen. Dabei werden die Ereigniscodes des Linux-Eingabeprotokolls gemäß der Konfiguration des Eingabegeräts, der Tastaturlayoutdateien und verschiedener Zuordnungstabellen in Android-Ereigniscodes umgewandelt.

Schließlich sendet die InputReader Eingabeereignisse an den InputDispatcher, der sie an das entsprechende Fenster weiterleitet.

Kontrollpunkte

Es gibt mehrere Phasen in der Eingabepipeline, die das Verhalten des Eingabegeräts beeinflussen.

Treiber- und Firmwarekonfiguration

Treiber für Eingabegeräte konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern festlegen oder sogar die Firmware selbst hochladen. Das gilt insbesondere für eingebettete Geräte wie Touchscreens, bei denen ein großer Teil der Kalibrierung darin besteht, diese Parameter zu optimieren oder die Firmware zu korrigieren, um die gewünschte Genauigkeit und Reaktionsfähigkeit zu erzielen und Rauschen zu unterdrücken.

Treiberkonfigurationsoptionen werden häufig als Modulparameter im Kernel Board Support Package (BSP) angegeben, damit derselbe Treiber mehrere unterschiedliche Hardwareimplementierungen unterstützen kann.

In dieser Dokumentation wird versucht, die Treiber- oder Firmwarekonfiguration zu beschreiben, aber es werden auch allgemeine Hinweise zur Gerätekalibrierung gegeben.

Konfigurationseigenschaften des Boards

Das Kernel Board Support Package (BSP) kann Eigenschaften der Boardkonfiguration über SysFS exportieren, die von der Android-Komponente „InputReader“ verwendet werden, z. B. die Platzierung virtueller Tasten auf einem Touchscreen.

In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte die Eigenschaften der Boardkonfiguration verwenden.

Ressourcen-Overlays

Einige Eingaben werden in config.xml über Ressourcen-Overlays konfiguriert, z. B. die Funktion des Deckelschalters.

Hier einige Beispiele:

  • config_lidKeyboardAccessibility: Gibt an, ob die Hardwaretastatur durch den Deckelschalter zugänglich oder ausgeblendet ist.

  • config_lidNavigationAccessibility: Gibt an, ob das Touchpad durch den Deckelschalter zugänglich oder ausgeblendet ist.

  • config_longPressOnPowerBehavior: Gibt an, was passieren soll, wenn der Nutzer die Ein/Aus-Taste gedrückt hält.

  • config_lidOpenRotation: Gibt die Wirkung des Deckelsperrers auf die Bildschirmausrichtung an.

Weitere Informationen zu den einzelnen Konfigurationsoptionen finden Sie in der Dokumentation zu frameworks/base/core/res/res/values/config.xml.

Tastenbelegungen

Mithilfe von Tastenzuordnungen werden in den Android-Komponenten EventHub und InputReader die Zuordnungen von Linux-Ereigniscodes zu Android-Ereigniscodes für Tasten, Joysticktasten und Joystickachsen konfiguriert. Die Zuordnung kann geräte- oder sprachabhängig sein.

In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Tastenkarten verwenden.

Konfigurationsdateien für Eingabegeräte

Konfigurationsdateien für Eingabegeräte werden von den Android-Komponenten EventHub und InputReader verwendet, um spezielle Gerätemerkmale zu konfigurieren, z. B. wie Informationen zur Größe des Touchbildschirms gemeldet werden.

In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Konfigurationskarten für Eingabegeräte verwenden.

HID-Nutzungen und Ereigniscodes

Oft werden mehrere verschiedene IDs verwendet, um auf eine bestimmte Taste auf einer Tastatur, eine Schaltfläche auf einem Gamecontroller, eine Joystickachse oder eine andere Steuervorrichtung zu verweisen. Die Beziehungen zwischen diesen IDs sind nicht immer gleich: Sie hängen von einer Reihe von Zuordnungstabellen ab, von denen einige fix sind und andere je nach Eigenschaften des Geräts, des Gerätetreibers, der aktuellen Sprache, der Systemkonfiguration, den Nutzereinstellungen und anderen Faktoren variieren.

Scancode

Ein physischer Scancode ist eine gerätespezifische Kennung, die jeder Taste, Schaltfläche oder einem anderen Steuerelement zugeordnet ist. Da physische Scancodes oft von Gerät zu Gerät variieren, ist die Firmware oder der Gerätetreiber dafür verantwortlich, sie Standard-IDs wie HID-Nutzungen oder Linux-Schlüsselcodes zuzuordnen.

Scancodes sind hauptsächlich für Tastaturen von Interesse. Andere Geräte kommunizieren in der Regel auf niedriger Ebene über GPIO-Pins, I2C-Nachrichten oder andere Mittel. Daher sind die oberen Schichten des Softwarestacks auf die Gerätetreiber angewiesen, um die Vorgänge zu verstehen.

HID-Nutzung

Eine HID-Nutzung ist eine Standard-ID, mit der der Status eines Steuerelements wie einer Tastaturtaste, einer Joystickachse, einer Maustaste oder eines Touch-Kontaktpunkts gemeldet wird. Die meisten USB- und Bluetooth-Eingabegeräte entsprechen der HID-Spezifikation, sodass das System mit ihnen einheitlich kommunizieren kann.

Das Android-Framework verwendet die HID-Treiber des Linux-Kernels, um HID-Nutzungscodes in Linux-Schlüsselcodes und andere Kennungen umzuwandeln. Daher sind HID-Nutzungen hauptsächlich für Peripheriegerätehersteller von Interesse.

Linux-Schlüsselcode

Ein Linux-Tastencode ist eine Standardkennung für eine Taste oder Schaltfläche. Linux-Tastencodes werden in der linux/input.h-Headerdatei mit Konstanten definiert, die mit dem Präfix KEY_ oder BTN_ beginnen. Die Linux-Eingabetreiber des Kernels sind dafür verantwortlich, physische Scancodes, HID-Nutzungen und andere gerätespezifische Signale in Linux-Tastencodes umzuwandeln und Informationen dazu im Rahmen von EV_KEY-Ereignissen bereitzustellen.

In der Android API wird der Linux-Schlüsselcode, der einem Schlüssel zugeordnet ist, manchmal als „Scancode“ bezeichnet. Technisch gesehen ist das nicht korrekt, aber es hilft, Linux-Schlüsselcodes von Android-Schlüsselcodes in der API zu unterscheiden.

Relativer oder absoluter Achsencode unter Linux

Ein relativer oder absoluter Linux-Achsencode ist eine Standardkennzeichnung für die Meldung relativer Bewegungen oder absoluter Positionen entlang einer Achse, z. B. die relativen Bewegungen einer Maus entlang ihrer X-Achse oder die absolute Position eines Joysticks entlang seiner X-Achse. Der Linux-Achsencode wird in der linux/input.h-Headerdatei mit Konstanten definiert, die mit dem Präfix REL_ oder ABS_ beginnen. Die Linux-Eingabetreiber des Kernels sind dafür verantwortlich, HID-Nutzungen und andere gerätespezifische Signale in Linux-Achsencodes umzuwandeln und Informationen dazu als Teil von EV_REL- und EV_ABS-Ereignissen bereitzustellen.

Linux-Umschaltcode

Ein Linux-Schaltercode ist eine Standardkennung, um den Status eines Schalters auf einem Gerät zu melden, z. B. eines Deckelschalters. Linux-Schaltercodes werden in der Headerdatei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix SW_ beginnen. Die Eingabetreiber des Linux-Kernels melden Änderungen des Schalterstatus als EV_SW-Ereignisse.

Android-Anwendungen erhalten in der Regel keine Ereignisse von Schaltern. Das System kann sie jedoch intern verwenden, um verschiedene gerätespezifische Funktionen zu steuern.

Android-Schlüsselcode

Ein Android-Tastencode ist eine Standardkennung, die in der Android API für einen bestimmten Tastendruck wie „START“ definiert ist. Android-Schlüsselcodes werden von der Klasse android.view.KeyEvent als Konstanten definiert, die mit dem Präfix KEYCODE_ beginnen.

Das Tastaturlayout gibt an, wie Linux-Tastencodes Android-Tastencodes zugeordnet werden. Je nach Tastaturmodell, Sprache, Land, Layout oder speziellen Funktionen können unterschiedliche Tastenlayouts verwendet werden.

Kombinationen von Android-Tastencodes werden mithilfe einer geräte- und länderspezifischen Tastenbelegung in Zeichencodes umgewandelt. Wenn beispielsweise die Tasten KEYCODE_SHIFT und KEYCODE_A gleichzeitig gedrückt werden, sucht das System in der Tastenbelegung nach der Kombination und findet den Großbuchstaben „A“, der dann in das aktuell fokussierte Text-Widget eingefügt wird.

Android-Achsencode

Ein Android-Achsencode ist eine Standardkennung, die in der Android API für eine bestimmte Geräteachse definiert ist. Android-Achsencodes werden von der Klasse android.view.MotionEvent als Konstanten definiert, die mit dem Präfix AXIS_ beginnen.

Im Schlüssellayout wird angegeben, wie Linux-Achsencodes Android-Achsencodes zugeordnet werden. Je nach Gerätemodell, Sprache, Land, Layout oder speziellen Funktionen können unterschiedliche Tastenlayouts verwendet werden.

Android-Metastatus

Ein Android-Metastatus ist eine Standard-ID, die in der Android API definiert ist und angibt, welche Modifikatortasten gedrückt werden. Android-Metastatus werden von der Klasse android.view.KeyEvent als Konstanten definiert, die mit dem Präfix META_ beginnen.

Der aktuelle Metastatus wird von der Android-Komponente „InputReader“ bestimmt, die überwacht, wann Modifikatortasten wie KEYCODE_SHIFT_LEFT gedrückt oder losgelassen werden, und das entsprechende Metastatus-Flag setzt oder zurücksetzt.

Die Beziehung zwischen Modifikatortasten und Metastatus ist hartcodiert. Das Tastenlayout kann jedoch die Zuordnung der Modifikatortasten selbst ändern, was sich wiederum auf die Metastatus auswirkt.

Android-Schaltflächenstatus

Ein Android-Schaltflächenstatus ist eine Standardkennung, die in der Android API definiert ist, um anzugeben, welche Schaltflächen (auf einer Maus oder einem Eingabestift) gedrückt werden. Die Status von Android-Schaltflächen werden von der Klasse android.view.MotionEvent als Konstanten definiert, die mit dem Präfix BUTTON_ beginnen.

Der aktuelle Schaltflächenstatus wird von der Android-Komponente „InputReader“ bestimmt, die überwacht, wann Schaltflächen (auf einer Maus oder einem Eingabestift) gedrückt oder losgelassen werden, und das entsprechende Flag für den Schaltflächenstatus setzt oder zurücksetzt.

Die Beziehung zwischen Schaltflächen und Schaltflächenstatus ist hartcodiert.

Weitere Informationen

  1. Linux-Eingabeereigniscodes
  2. Linux Multitouch-Protokoll
  3. Linux-Eingabetreiber
  4. Force Feedback unter Linux
  5. HID-Informationen, einschließlich HID-Nutzungstabellen