Eingabe

Android-Eingabe-HAL-Symbol

Das Android-Eingabesubsystem besteht nominell aus einer Ereignispipeline, die mehrere Schichten des Systems durchquert.

Eingabepipeline

Auf der untersten Ebene erzeugt das physische Eingabegerät Signale, die Zustandsänderungen wie Tastendrücke und Berührungskontaktpunkte beschreiben. Die Geräte-Firmware kodiert und überträgt diese Signale auf irgendeine Weise, beispielsweise durch das Senden von USB-HID-Berichten an das System oder durch die Erzeugung von Interrupts auf einem I2C-Bus.

Die Signale werden dann von einem Gerätetreiber im Linux-Kernel dekodiert. Der Linux-Kernel stellt Treiber für viele Standardperipheriegeräte bereit, insbesondere für solche, die das HID-Protokoll unterstützen. Allerdings muss ein OEM häufig benutzerdefinierte Treiber für eingebettete Geräte bereitstellen, die auf niedriger Ebene eng in das System integriert sind, wie z. B. Touchscreens.

Die Eingabegerätetreiber sind dafür verantwortlich, gerätespezifische Signale über das Linux-Eingabeprotokoll in ein Standard-Eingabeereignisformat zu übersetzen. Das Linux-Eingabeprotokoll definiert einen Standardsatz von Ereignistypen und Codes in der Kernel-Header-Datei linux/input.h . Auf diese Weise müssen sich Komponenten außerhalb des Kernels nicht um Details wie physische Scancodes, HID-Verwendungen, I2C-Nachrichten, GPIO-Pins und dergleichen kümmern.

Als Nächstes liest die Android EventHub Komponente Eingabeereignisse aus dem Kernel, indem sie den evdev Treiber öffnet, der jedem Eingabegerät zugeordnet ist. Die Android InputReader-Komponente dekodiert dann die Eingabeereignisse entsprechend der Geräteklasse und erzeugt einen Stream von Android-Eingabeereignissen. Als Teil dieses Prozesses werden die Linux-Eingabeprotokoll-Ereigniscodes entsprechend der Eingabegerätekonfiguration, den Tastaturlayoutdateien und verschiedenen Zuordnungstabellen in Android-Ereigniscodes übersetzt.

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

Kontrollpunkte

Es gibt mehrere Stufen in der Eingabepipeline, die die Steuerung des Verhaltens des Eingabegeräts bewirken.

Treiber- und Firmware-Konfiguration

Eingabegerätetreiber konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern festlegen oder sogar die Firmware selbst hochladen. Dies ist insbesondere bei eingebetteten Geräten wie Touchscreens der Fall, bei denen ein großer Teil des Kalibrierungsprozesses die Abstimmung dieser Parameter oder die Korrektur der Firmware umfasst, um die gewünschte Genauigkeit und Reaktionsfähigkeit bereitzustellen und Rauschen zu unterdrücken.

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

Diese Dokumentation versucht zwar, die Treiber- oder Firmware-Konfiguration zu beschreiben, bietet jedoch Hinweise zur Gerätekalibrierung im Allgemeinen.

Eigenschaften der Platinenkonfiguration

Das Kernel-Board-Support-Paket (BSP) exportiert möglicherweise Board-Konfigurationseigenschaften über SysFS, die von der Android-InputReader-Komponente verwendet werden, beispielsweise die Platzierung virtueller Tasten auf einem Touchscreen.

Weitere Informationen dazu, wie verschiedene Geräte die Eigenschaften der Platinenkonfiguration verwenden, finden Sie in den Abschnitten zu den Geräteklassen.

Ressourcen-Overlays

Einige Eingabeverhalten werden über Ressourcen-Overlays in config.xml konfiguriert, beispielsweise die Bedienung des Deckelschalters.

Hier ein paar Beispiele:

  • config_lidKeyboardAccessibility : Gibt die Auswirkung des Deckelschalters darauf an, ob die Hardwaretastatur zugänglich oder ausgeblendet ist.

  • config_lidNavigationAccessibility : Gibt die Auswirkung des Deckelschalters darauf an, ob das Trackpad zugänglich oder ausgeblendet ist.

  • config_longPressOnPowerBehavior : Gibt an, was passieren soll, wenn der Benutzer den Netzschalter gedrückt hält.

  • config_lidOpenRotation : Gibt die Auswirkung des Deckelschalters auf die Bildschirmausrichtung an.

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

Schlüsselkarten

Tastenzuordnungen werden von den Android EventHub und InputReader Komponenten verwendet, um die Zuordnung von Linux-Ereigniscodes zu Android-Ereigniscodes für Tasten, Joystick-Tasten und Joystick-Achsen zu konfigurieren. Die Zuordnung kann geräte- oder sprachabhängig sein.

Weitere Informationen dazu, wie verschiedene Geräte Tastenzuordnungen verwenden, finden Sie in den Abschnitten zu Geräteklassen.

Konfigurationsdateien für Eingabegeräte

Konfigurationsdateien für Eingabegeräte werden von den Android EventHub und InputReader Komponenten verwendet, um spezielle Geräteeigenschaften zu konfigurieren, z. B. die Art und Weise, wie Informationen zur Berührungsgröße gemeldet werden.

Weitere Informationen dazu, wie verschiedene Geräte Eingabegeräte-Konfigurationszuordnungen verwenden, finden Sie in den Abschnitten zu Geräteklassen.

Verstehen Sie HID-Nutzungen und Ereigniscodes

Oft gibt es mehrere unterschiedliche Bezeichner, die sich auf eine bestimmte Taste auf einer Tastatur, eine Taste auf einem Gamecontroller, eine Joystick-Achse oder eine andere Steuerung beziehen. Die Beziehungen zwischen diesen Bezeichnern sind nicht immer gleich: Sie hängen von einer Reihe von Zuordnungstabellen ab, von denen einige fest sind und andere je nach Eigenschaften des Geräts, des Gerätetreibers, des aktuellen Gebietsschemas, der Systemkonfiguration usw. variieren. Benutzerpräferenzen und andere Faktoren.

Physischer Scancode

Ein physischer Scancode ist eine gerätespezifische Kennung, die jeder Taste, jedem Knopf oder jedem anderen Bedienelement zugeordnet ist. Da physische Scancodes häufig von Gerät zu Gerät unterschiedlich sind, ist die Firmware oder der Gerätetreiber dafür verantwortlich, sie Standardkennungen wie HID-Verwendungen oder Linux-Schlüsselcodes zuzuordnen.

Scancodes sind vor allem für Tastaturen interessant. Andere Geräte kommunizieren normalerweise auf niedriger Ebene über GPIO-Pins, I2C-Nachrichten oder andere Mittel. Folglich verlassen sich die oberen Schichten des Software-Stacks auf die Gerätetreiber, um zu verstehen, was vor sich geht.

HID-Nutzung

Eine HID-Verwendung ist eine Standardkennung, die verwendet wird, um den Status eines Steuerelements wie einer Tastaturtaste, einer Joystick-Achse, einer Maustaste oder eines Berührungskontaktpunkts zu melden. Die meisten USB- und Bluetooth-Eingabegeräte entsprechen der HID-Spezifikation, was eine einheitliche Kommunikation des Systems mit ihnen ermöglicht.

Das Android Framework basiert auf den HID-Treibern des Linux-Kernels, um HID-Nutzungscodes in Linux-Schlüsselcodes und andere Kennungen zu übersetzen. Daher sind HID-Anwendungen vor allem für Peripheriehersteller interessant.

Linux-Schlüsselcode

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

Die Android-API bezeichnet den mit einem Schlüssel verknüpften Linux-Schlüsselcode manchmal als „Scancode“. Dies ist zwar technisch falsch, hilft aber dabei, Linux-Schlüsselcodes von Android-Schlüsselcodes in der API zu unterscheiden.

Relativer oder absoluter Linux-Achsencode

Ein relativer oder absoluter Achsencode unter Linux ist eine Standardkennung für die Meldung relativer Bewegungen oder absoluter Positionen entlang einer Achse, beispielsweise der relativen Bewegungen einer Maus entlang ihrer X-Achse oder der absoluten Position eines Joysticks entlang ihrer X-Achse. Linux-Achsencode wird in der Header-Datei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix REL_ oder ABS_ beginnen. Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, HID-Nutzungen und andere gerätespezifische Signale in Linux-Achsencodes zu übersetzen und Informationen darüber als Teil von EV_REL und EV_ABS Ereignissen bereitzustellen.

Linux-Switch-Code

Ein Linux-Switch-Code ist eine Standardkennung zum Melden des Status eines Schalters an einem Gerät, beispielsweise eines Deckelschalters. Linux-Switch-Codes werden in der Header-Datei 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 empfangen im Allgemeinen 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 in der Android-API definierte Standardkennung zur Angabe einer bestimmten Taste, beispielsweise „HOME“. Android-Tastencodes werden von der Klasse android.view.KeyEvent als Konstanten definiert, die mit dem Präfix KEYCODE_ beginnen.

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

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

Android-Achsencode

Ein Android-Achsencode ist eine in der Android-API definierte Standardkennung zur Angabe einer bestimmten Geräteachse. Android-Achsencodes werden von der Klasse android.view.MotionEvent als Konstanten definiert, die mit dem Präfix AXIS_ beginnen.

Das Tastenlayout gibt an, wie Linux-Achsencodes Android-Achsencodes zugeordnet werden. Je nach Gerätemodell, Sprache, Land, Layout oder Sonderfunktionen können unterschiedliche Tastenlayouts verwendet werden.

Android-Metastatus

Ein Android-Metastatus ist eine in der Android-API definierte Standardkennung, die angibt, welche Zusatztasten gedrückt werden. Android-Metazustände werden von der Klasse android.view.KeyEvent als Konstanten definiert, die mit dem Präfix META_ beginnen.

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

Die Beziehung zwischen Modifikatortasten und Metazuständen ist fest codiert, aber das Tastenlayout kann die Zuordnung der Modifikatortasten selbst verändern, was sich wiederum auf die Metazustände auswirkt.

Status der Android-Schaltfläche

Ein Android-Schaltflächenstatus ist eine in der Android-API definierte Standardkennung, die angibt, welche Tasten (auf einer Maus oder einem Stift) gedrückt werden. Android-Schaltflächenzustände werden von der Klasse android.view.MotionEvent als Konstanten definiert, die mit dem Präfix BUTTON_ beginnen.

Der aktuelle Tastenstatus wird von der Android-InputReader-Komponente bestimmt, die überwacht, wann Tasten (auf einer Maus oder einem Stift) gedrückt/losgelassen werden, und das entsprechende Tastenstatus-Flag setzt/zurücksetzt.

Die Beziehung zwischen Schaltflächen und Schaltflächenzuständen ist fest codiert.

Weiterführende Literatur

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