Ingresso

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.
Icona HAL di ingresso Android

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

Pipeline di ingresso

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 USB HID 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 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 insieme 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 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, InputReader invia gli eventi di input a InputDispatcher che li inoltra alla finestra appropriata.

Punti di controllo

Ci sono 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 configurano spesso il comportamento del dispositivo di input impostando i parametri nei registri o persino caricando il firmware stesso. Questo è particolarmente vero per i dispositivi embedded come i touch screen in cui gran parte del processo di calibrazione prevede l'ottimizzazione 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 del 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 del kernel (BSP) può esportare le proprietà di configurazione della scheda tramite SysFS utilizzate dal componente InputReader di Android, come il posizionamento di chiavi virtuali su un touch screen.

Fare riferimento alle sezioni sulle 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 overlay di risorse in config.xml come l'operazione di lid switch.

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 chiavi, pulsanti del joystick e assi del joystick. La mappatura può dipendere dal dispositivo o dalla lingua.

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

Inserisci 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 come vengono riportate le informazioni sulla dimensione del tocco.

Fare riferimento alle sezioni sulle 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 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 fisici spesso variano da un dispositivo all'altro, il firmware o il driver del dispositivo è responsabile della mappatura degli identificatori standard come l'utilizzo HID o i 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 basano sui driver del 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 come un tasto della tastiera, l'asse del joystick, il pulsante del mouse o il punto di contatto tattile. 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.

Android Framework 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 periferici.

Codice chiave 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 fisici, 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 della chiave Linux associato a una chiave come "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 riportare i movimenti relativi o le 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 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 switch Linux è un identificatore standard per segnalare lo stato di uno switch su un dispositivo, ad esempio un interruttore del coperchio. I codici 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 allo stato di commutazione 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 della chiave specifica come i codici chiave Linux vengono mappati ai codici chiave 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 un dispositivo e una mappa dei caratteri chiave specifica per la locale. 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 chiave e trova la lettera maiuscola "A", che viene quindi inserita nel widget di testo attualmente attivo.

Codice 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 della chiave specifica come i codici degli assi Linux vengono mappati sui codici degli assi Android. È possibile utilizzare diversi layout dei tasti a seconda del modello del dispositivo, della lingua, del paese, del layout o delle funzioni speciali.

Meta stato Android

Un meta stato Android è un identificatore standard definito nell'API Android per indicare quali tasti modificatori vengono premuti. I meta stati 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 i tasti modificatori come KEYCODE_SHIFT_LEFT vengono premuti/rilasciati e imposta/reimposta il flag di meta stato appropriato.

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

Stato del pulsante Android

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

La relazione tra pulsanti e stati dei pulsanti è hardcoded.

Ulteriori letture

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