Ingresso

Icona HAL di input Android

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

Conduttura di input

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

I segnali vengono quindi decodificati da un driver di dispositivo nel kernel di Linux. Il kernel di 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 evento di input standard, tramite il protocollo di input di Linux. Il protocollo di input di Linux definisce un set standard di tipi di eventi e codici nel file di intestazione del kernel linux/input.h . In questo modo, i componenti al di fuori del kernel non devono preoccuparsi dei dettagli come i codici di scansione fisica, gli usi HID, i messaggi I2C, i 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 a varie tabelle di mappatura.

Infine, InputReader invia eventi di input a 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 persino caricando il firmware stesso. Questo è particolarmente vero per i dispositivi integrati come i touch screen, dove gran parte del processo di calibrazione comporta la messa a punto 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 generali sulla calibrazione del dispositivo.

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 di tasti virtuali su un touch screen.

Fare riferimento alle sezioni relative alle classi di dispositivi per i 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 , ad esempio l'operazione 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 il mapping dai codici evento Linux ai codici evento Android per chiavi, pulsanti del joystick e assi del joystick. La mappatura può dipendere dal dispositivo o dalla lingua.

Fare riferimento alle sezioni relative alle classi di dispositivi per i dettagli su come i diversi dispositivi utilizzano le mappe dei tasti.

File di configurazione del dispositivo di input

I file di configurazione del dispositivo di input vengono usati 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 relative alle classi di dispositivi per i dettagli su come i diversi dispositivi utilizzano le mappe di configurazione dei dispositivi di input.

Comprensione degli usi HID e dei codici evento

Ci sono spesso diversi identificatori usati per fare riferimento a un dato 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 un insieme di tabelle di mappatura, alcune delle quali sono fisse e altre che variano in base alle caratteristiche del dispositivo, al driver del dispositivo, alla localizzazione corrente, alla configurazione del sistema, preferenze dell'utente e altri fattori.

Codice di scansione fisica

Un codice di scansione fisica è 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 driver del firmware o del dispositivo è responsabile della loro mappatura a 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, i livelli superiori dello stack software si affidano ai driver di dispositivo per dare un senso a ciò che sta accadendo.

Utilizzo NASCOSTO

Un utilizzo HID è un identificatore standard utilizzato per segnalare lo stato di un controllo, ad esempio un tasto della tastiera, un asse del joystick, un pulsante del mouse o un punto di contatto touch. La maggior parte dei dispositivi di input USB e Bluetooth è conforme alla specifica HID, che consente 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 usi HID sono principalmente di interesse per i produttori di periferiche.

Codice chiave di Linux

Un codice chiave Linux è un identificatore standard per una chiave 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 usi 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 della 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 di asse relativo o assoluto di 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 dell'asse Linux è definito nel file di intestazione 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 usi HID e di altri segnali specifici del dispositivo in codici dell'asse Linux e della fornitura di informazioni su di essi come parte degli eventi EV_REL e EV_ABS .

Codice di commutazione Linux

Un codice switch Linux è un identificatore standard per segnalare lo stato di uno switch su un dispositivo, ad esempio un interruttore del coperchio. I codici switch di 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 allo stato dell'interruttore come eventi EV_SW .

Le applicazioni Android in genere non ricevono eventi dagli switch, ma il sistema potrebbe 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 dei tasti di Linux vengono mappati ai codici dei tasti di Android. È possibile utilizzare diversi layout dei tasti 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 carattere utilizzando una mappa dei caratteri chiave specifica del dispositivo e delle impostazioni locali. Ad esempio, quando i tasti identificati come KEYCODE_SHIFT e KEYCODE_A vengono entrambi premuti 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 dell'asse Linux vengono mappati ai codici dell'asse Android. È possibile utilizzare diversi layout dei tasti a seconda del modello del dispositivo, della lingua, del paese, del layout o delle funzioni speciali.

Metastato di Android

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

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

La relazione tra i tasti modificatori e i metastati è codificata, ma il layout dei tasti può alterare il modo in cui i tasti modificatori stessi sono mappati, il che a sua volta influisce sui metastati.

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 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/ripristina il flag di stato del pulsante appropriato.

La relazione tra pulsanti e stati dei pulsanti è codificata.

Ulteriori letture

  1. Codici evento input Linux
  2. Protocollo Linux multitouch
  3. Driver di input per Linux
  4. Risposta forzata di Linux
  5. Informazioni HID, comprese le tabelle di utilizzo HID