Eingang

Android Input HAL-Symbol

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

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 codiert und überträgt diese Signale auf irgendeine Weise, beispielsweise durch Senden von USB-HID-Berichten an das System oder durch Erzeugen von Interrupts auf einem I2C-Bus.

Die Signale werden dann von einem Gerätetreiber im Linux-Kernel dekodiert. Der Linux-Kernel bietet Treiber für viele Standard-Peripheriegeräte, insbesondere 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, 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 gemäß der Geräteklasse und erzeugt einen Stream von Android-Eingabeereignissen. Als Teil dieses Prozesses werden die Ereigniscodes des Linux-Eingabeprotokolls gemäß der Konfiguration des Eingabegeräts, 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 eine Steuerung des Verhaltens des Eingabegeräts bewirken.

Treiber- und Firmwarekonfiguration

Eingabegerättreiber konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern setzen oder sogar die Firmware selbst hochladen. Dies gilt insbesondere für eingebettete Geräte wie Touchscreens, bei denen ein großer Teil des Kalibrierungsprozesses das Einstellen dieser Parameter oder das Korrigieren 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 unterschiedliche Hardwareimplementierungen unterstützen kann.

Diese Dokumentation versucht zwar, die Treiber- oder Firmwarekonfiguration zu beschreiben, bietet jedoch eine Anleitung zur Gerätekalibrierung im Allgemeinen.

Board-Konfigurationseigenschaften

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

Einzelheiten dazu, wie verschiedene Geräte Board-Konfigurationseigenschaften verwenden, finden Sie in den Abschnitten zu den Geräteklassen.

Ressourcenüberlagerungen

Einige Eingabeverhalten werden über Ressourcen-Overlays in config.xml , z. B. der Betrieb des Deckelschalters.

Hier sind 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 in 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-Schaltflächen und Joystick-Achsen zu konfigurieren. Die Zuordnung kann geräte- oder sprachabhängig sein.

Einzelheiten dazu, wie verschiedene Geräte Tastenbelegungen verwenden, finden Sie in den Abschnitten zu den Geräteklassen.

Geben Sie Gerätekonfigurationsdateien ein

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 Berührungsgröße gemeldet werden.

Einzelheiten dazu, wie verschiedene Geräte Konfigurationszuordnungen für Eingabegeräte verwenden, finden Sie in den Abschnitten zu Geräteklassen.

Verstehen von HID-Verwendungen und Ereigniscodes

Es gibt oft verschiedene Identifikatoren, die verwendet werden, um sich auf eine bestimmte Taste auf einer Tastatur, eine Taste auf einem Gamecontroller, eine Joystick-Achse oder eine andere Steuerung zu beziehen. Die Beziehungen zwischen diesen Kennungen 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, Benutzerpräferenzen und andere Faktoren.

Physischer Scan-Code

Ein physischer Scancode ist eine gerätespezifische Kennung, die jeder Taste, Schaltfläche oder anderen Steuerung zugeordnet ist. Da physische Scancodes oft 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 hauptsächlich 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-Nutzung ist eine Standardkennung, die verwendet wird, um den Zustand 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, die es dem System ermöglicht, auf einheitliche Weise mit ihnen zu kommunizieren.

Das Android-Framework stützt sich auf die HID-Treiber des Linux-Kernels, um HID-Nutzungscodes in Linux-Schlüsselcodes und andere Kennungen zu übersetzen. Daher sind HID-Anwendungen hauptsächlich 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_ . Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, physische Scancodes, HID-Verwendungen und andere gerätespezifische Signale in Linux-Schlüsselcodes zu übersetzen und Informationen darüber als Teil von EV_KEY Ereignissen bereitzustellen.

Die Android-API bezeichnet manchmal den mit einem Schlüssel verknüpften Linux-Schlüsselcode als seinen "Scan-Code". Dies ist technisch falsch, aber es hilft, Linux-Tastencodes von Android-Tastencodes in der API zu unterscheiden.

Relativer oder absoluter Linux-Achsencode

Ein relativer oder absoluter Achsencode unter Linux ist eine Standardkennung zum Melden relativer Bewegungen oder absoluter Positionen entlang einer Achse, wie z. B. die relativen Bewegungen einer Maus entlang ihrer X-Achse oder die absolute Position eines Joysticks entlang ihrer X-Achse. Der Linux-Achsencode wird in der Headerdatei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix REL_ oder ABS_ . Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, HID-Verwendungen 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-Schaltercode ist eine Standardkennung zum Melden des Zustands eines Schalters auf einem Gerät, z. B. 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 Schalterzustandsänderungen als EV_SW Ereignisse.

Android-Anwendungen empfangen im Allgemeinen keine Ereignisse von Schaltern, aber das System kann sie intern verwenden, um verschiedene gerätespezifische Funktionen zu steuern.

Android-Schlüsselcode

Ein Android-Schlüsselcode ist eine Standardkennung, die in der Android-API definiert ist, um einen bestimmten Schlüssel wie „HOME“ anzugeben. 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 gebietsschemaspezifischen Tastenzeichentabelle in Zeichencodes umgewandelt. Wenn zum Beispiel die als KEYCODE_SHIFT und KEYCODE_A identifizierten Tasten beide zusammen gedrückt werden, sucht das System die 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 Standardkennung, die in der Android-API definiert ist, um eine bestimmte Geräteachse anzugeben. 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 Standardkennung, die in der Android-API definiert ist, um anzugeben, welche Modifikatortasten 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, wenn Zusatztasten wie KEYCODE_SHIFT_LEFT gedrückt / losgelassen werden, und das entsprechende Metastatus-Flag setzt / zurücksetzt.

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

Status der Android-Schaltfläche

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. Zustände 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 InputReader-Komponente bestimmt, die überwacht, wenn Schaltflächen (auf einer Maus oder einem Stift) gedrückt/losgelassen werden, und das entsprechende Schaltflächenstatus-Flag setzt/zurücksetzt.

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

Weiterführende Lektüre

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