Input

Icona HAL di ingresso Android

Il sottosistema di input Android è nominalmente costituito da una pipeline di eventi che attraversa più livelli del sistema.

Conduttura di ingresso

Al livello più basso, il dispositivo di input fisico produce segnali che descrivono i cambiamenti di stato come la pressione dei tasti e i punti di contatto tattili. Il firmware del dispositivo codifica e trasmette questi segnali in qualche modo, ad esempio inviando report HID USB al sistema o producendo interruzioni su un bus I2C.

I segnali vengono quindi decodificati da un driver di dispositivo nel kernel Linux. Il kernel Linux fornisce i driver per molte periferiche standard, in particolare quelle che aderiscono al protocollo HID. Tuttavia, un OEM deve spesso fornire driver personalizzati per dispositivi embedded strettamente integrati nel sistema a basso livello, come i touch screen.

I driver del dispositivo di input sono responsabili della traduzione dei segnali specifici del dispositivo in un formato di eventi di input standard, tramite il protocollo di input di Linux. Il protocollo di input di Linux definisce un insieme standard di tipi di eventi e codici nel file di intestazione del kernel linux/input.h . In questo modo, i componenti esterni al kernel non devono preoccuparsi di dettagli come codici di scansione fisici, utilizzi HID, messaggi I2C, pin GPIO e simili.

Successivamente, il componente Android EventHub legge gli eventi di input dal kernel aprendo il driver evdev associato a ciascun dispositivo di input. Il componente Android InputReader decodifica quindi gli eventi di input in base alla classe del dispositivo e produce un flusso di eventi di input Android. Come parte di questo processo, i codici evento del protocollo di input Linux vengono tradotti in codici evento Android in base alla configurazione del dispositivo di input, ai file di layout della tastiera e alle varie tabelle di mappatura.

Infine, l' InputReader invia gli eventi di input all'InputDispatcher che li inoltra alla finestra appropriata.

Punti di controllo

Esistono diverse fasi nella pipeline di input che effettuano il controllo sul comportamento del dispositivo di input.

Configurazione driver e firmware

I driver del dispositivo di input spesso configurano il comportamento del dispositivo di input impostando i parametri nei registri o addirittura caricando il firmware stesso. Ciò è particolarmente vero per i dispositivi integrati come i touch screen in cui gran parte del processo di calibrazione prevede la regolazione di questi parametri o la correzione del firmware per fornire la precisione e la reattività desiderate e per sopprimere il rumore.

Le opzioni di configurazione del driver sono spesso specificate come parametri del modulo nel pacchetto di supporto della scheda kernel (BSP) in modo che lo stesso driver possa supportare più implementazioni hardware diverse.

Questa documentazione tenta di descrivere la configurazione del driver o del firmware, ma offre indicazioni sulla calibrazione del dispositivo in generale.

Proprietà di configurazione della scheda

Il pacchetto di supporto della scheda kernel (BSP) può esportare le proprietà di configurazione della scheda tramite SysFS utilizzate dal componente Android InputReader, come il posizionamento dei tasti virtuali su un touch screen.

Fare riferimento alle sezioni sulla classe del dispositivo per dettagli su come i diversi dispositivi utilizzano le proprietà di configurazione della scheda.

Sovrapposizioni di risorse

Alcuni comportamenti di input sono configurati tramite sovrapposizioni di risorse in config.xml come il funzionamento dell'interruttore del coperchio.

Ecco alcuni esempi:

  • config_lidKeyboardAccessibility : specifica l'effetto dell'interruttore del coperchio sul fatto che la tastiera hardware sia accessibile o nascosta.

  • config_lidNavigationAccessibility : specifica l'effetto dell'interruttore del coperchio sul fatto che il trackpad sia accessibile o nascosto.

  • config_longPressOnPowerBehavior : specifica cosa dovrebbe accadere quando l'utente tiene premuto il pulsante di accensione.

  • config_lidOpenRotation : specifica l'effetto dell'interruttore del coperchio sull'orientamento dello schermo.

Fare riferimento alla documentazione all'interno di frameworks/base/core/res/res/values/config.xml per i dettagli su ciascuna opzione di configurazione.

Mappe chiave

Le mappe dei tasti vengono utilizzate dai componenti Android EventHub e InputReader per configurare la mappatura dai codici evento Linux ai codici evento Android per tasti, pulsanti e assi del joystick. La mappatura può dipendere dal dispositivo o dalla lingua.

Fare riferimento alle sezioni sulla classe del dispositivo per dettagli su come i diversi dispositivi utilizzano le mappe dei tasti.

Immettere i file di configurazione del dispositivo

I file di configurazione del dispositivo di input vengono utilizzati dai componenti Android EventHub e InputReader per configurare caratteristiche speciali del dispositivo, ad esempio il modo in cui vengono segnalate le informazioni sulla dimensione del tocco.

Fare riferimento alle sezioni sulla classe del dispositivo per dettagli su come i diversi dispositivi utilizzano le mappe di configurazione del dispositivo di input.

Comprendere gli usi HID e i codici evento

Spesso vengono utilizzati diversi identificatori diversi per fare riferimento a un determinato tasto su una tastiera, pulsante su un controller di gioco, asse del joystick o altro controllo. Le relazioni tra questi identificatori non sono sempre le stesse: dipendono da una serie di tabelle di mappatura, alcune delle quali sono fisse e altre che variano in base alle caratteristiche del dispositivo, al driver del dispositivo, alla locale corrente, alla configurazione del sistema, preferenze dell'utente e altri fattori.

Codice di scansione fisica

Un codice di scansione fisico è un identificatore specifico del dispositivo associato a ciascun tasto, pulsante o altro controllo. Poiché i codici di scansione fisica spesso variano da un dispositivo all'altro, il firmware o il driver del dispositivo è responsabile della loro mappatura su identificatori standard come Usi HID o codici chiave Linux.

I codici di scansione interessano principalmente le tastiere. Altri dispositivi in ​​genere comunicano a basso livello utilizzando pin GPIO, messaggi I2C o altri mezzi. Di conseguenza, gli strati superiori dello stack software si affidano ai driver del dispositivo per dare un senso a ciò che sta accadendo.

Utilizzo HID

Un utilizzo HID è un identificatore standard utilizzato per segnalare lo stato di un controllo come un tasto della tastiera, un asse del joystick, un pulsante del mouse o un punto di contatto tattile. La maggior parte dei dispositivi di input USB e Bluetooth sono conformi alle specifiche HID, che consentono al sistema di interfacciarsi con essi in modo uniforme.

Il framework Android si basa sui driver HID del kernel Linux per tradurre i codici di utilizzo HID in codici chiave Linux e altri identificatori. Pertanto gli utilizzi HID interessano principalmente i produttori di periferiche.

Codice chiave Linux

Un codice chiave Linux è un identificatore standard per un tasto o un pulsante. I codici chiave di Linux sono definiti nel file di intestazione linux/input.h utilizzando costanti che iniziano con il prefisso KEY_ o BTN_ . I driver di input del kernel Linux sono responsabili della traduzione dei codici di scansione fisica, degli utilizzi HID e di altri segnali specifici del dispositivo in codici chiave Linux e della fornitura di informazioni su di essi come parte degli eventi EV_KEY .

L'API Android a volte fa riferimento al codice chiave Linux associato a una chiave come al suo "codice di scansione". Questo è tecnicamente errato ma aiuta a distinguere i codici chiave Linux dai codici chiave Android nell'API.

Codice dell'asse relativo o assoluto di Linux

Un codice asse relativo o assoluto Linux è un identificatore standard per segnalare movimenti relativi o posizioni assolute lungo un asse, come i movimenti relativi di un mouse lungo il suo asse X o la posizione assoluta di un joystick lungo il suo asse X. Il codice degli assi Linux è definito nel file header linux/input.h utilizzando costanti che iniziano con il prefisso REL_ o ABS_ . I driver di input del kernel Linux sono responsabili della traduzione degli utilizzi HID e di altri segnali specifici del dispositivo in codici degli assi Linux e della fornitura di informazioni su di essi come parte degli eventi EV_REL ed EV_ABS .

Codice di commutazione Linux

Un codice interruttore Linux è un identificatore standard per segnalare lo stato di un interruttore su un dispositivo, ad esempio un interruttore del coperchio. I codici degli switch Linux sono definiti nel file di intestazione linux/input.h utilizzando costanti che iniziano con il prefisso SW_ . I driver di input del kernel Linux segnalano le modifiche dello stato dello switch come eventi EV_SW .

Le applicazioni Android generalmente non ricevono eventi dagli switch, ma il sistema può utilizzarli internamente per controllare varie funzioni specifiche del dispositivo.

Codice chiave Android

Un codice chiave Android è un identificatore standard definito nell'API Android per indicare una chiave particolare come "HOME". I codici chiave Android sono definiti dalla classe android.view.KeyEvent come costanti che iniziano con il prefisso KEYCODE_ .

Il layout dei tasti specifica come i codici chiave Linux vengono mappati sui codici chiave Android. È possibile utilizzare layout di tasti diversi a seconda del modello di tastiera, della lingua, del paese, del layout o delle funzioni speciali.

Le combinazioni di codici chiave Android vengono trasformate in codici di caratteri utilizzando una mappa di caratteri chiave specifica del dispositivo e della locale. Ad esempio, quando i tasti identificati come KEYCODE_SHIFT e KEYCODE_A vengono premuti entrambi insieme, il sistema cerca la combinazione nella mappa dei caratteri dei tasti e trova la lettera maiuscola "A", che viene quindi inserita nel widget di testo attualmente focalizzato.

Codice dell'asse Android

Un codice asse Android è un identificatore standard definito nell'API Android per indicare un particolare asse del dispositivo. I codici degli assi Android sono definiti dalla classe android.view.MotionEvent come costanti che iniziano con il prefisso AXIS_ .

Il layout dei tasti specifica come i codici asse Linux vengono mappati sui codici asse Android. È possibile utilizzare layout diversi dei tasti a seconda del modello del dispositivo, della lingua, del paese, del layout o delle funzioni speciali.

Metastato Android

Un metastato Android è un identificatore standard definito nell'API Android per indicare quali tasti di modifica vengono premuti. I metastati Android sono definiti dalla classe android.view.KeyEvent come costanti che iniziano con il prefisso META_ .

Il metastato corrente è determinato dal componente Android InputReader che monitora quando i tasti modificatori come KEYCODE_SHIFT_LEFT vengono premuti/rilasciati e imposta/reimposta il flag di stato meta appropriato.

La relazione tra i tasti modificatori e i meta stati è codificata, ma la disposizione dei tasti può alterare il modo in cui vengono mappati i tasti modificatori stessi, il che a sua volta influisce sui meta stati.

Stato del pulsante Android

Lo stato di un pulsante Android è un identificatore standard definito nell'API Android per indicare quali pulsanti (su un mouse o su uno stilo) vengono premuti. Gli stati dei pulsanti Android sono definiti dalla classe android.view.MotionEvent come costanti che iniziano con il prefisso BUTTON_ .

Lo stato corrente del pulsante è determinato dal componente Android InputReader che monitora quando i pulsanti (su un mouse o uno stilo) vengono premuti/rilasciati e imposta/reimposta il flag di stato del pulsante appropriato.

La relazione tra i pulsanti e gli stati dei pulsanti è codificata.

Ulteriori letture

  1. Codici evento di input Linux
  2. Protocollo multitouch Linux
  3. Driver di input Linux
  4. Feedback di forza su Linux
  5. Informazioni HID, comprese le tabelle di utilizzo HID