Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Ingresso

Icona HAL di input Android

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

Pipeline 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 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 integrati strettamente integrati nel sistema a un livello basso, come i touchscreen.

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 al di fuori del kernel non devono preoccuparsi dei dettagli come codici di scansione fisica, usi 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 eventi di input a InputDispatcher che li inoltra alla finestra appropriata.

Punti di controllo

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

Configurazione di driver e firmware

I driver del dispositivo di input configurano frequentemente il comportamento del dispositivo di input impostando i parametri nei registri o anche caricando il firmware stesso. Questo è particolarmente vero per i dispositivi incorporati come i touch screen, dove gran parte del processo di calibrazione comporta 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 differenti.

Questa documentazione tenta di descrivere la configurazione del driver o del firmware, ma offre una guida per la 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 che vengono utilizzate dal componente Android InputReader, come il posizionamento dei tasti 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 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 se la tastiera hardware è accessibile o nascosta.

  • config_lidNavigationAccessibility : specifica l'effetto dell'interruttore del coperchio se il trackpad è 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 in frameworks/base/core/res/res/values/config.xml per i dettagli su ciascuna opzione di configurazione.

Mappe chiave

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

Fare riferimento alle sezioni sulle 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 come il modo in cui 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 diversi 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 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, alle impostazioni locali correnti, 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 sono principalmente di interesse per le tastiere. Altri dispositivi tipicamente comunicano a un livello basso utilizzando pin GPIO, messaggi I2C o altri mezzi. Di conseguenza, i livelli superiori dello stack software si basano sui driver di 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 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 utilizzi HID interessano principalmente i produttori di periferiche.

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 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 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 asse relativo o assoluto di Linux

Un codice dell'asse relativo o assoluto di Linux è un identificatore standard per segnalare 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 degli assi 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 degli assi Linux e della fornitura di informazioni su di essi come parte degli eventi EV_REL e EV_ABS .

Codice switch Linux

Un codice switch Linux è un identificatore standard per segnalare lo stato di uno switch su un dispositivo, come 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 i cambiamenti di stato dello switch come eventi EV_SW .

Le applicazioni Android generalmente non ricevono eventi dagli interruttori, 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 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 carattere utilizzando un dispositivo e una mappa dei caratteri chiave specifica della locale. Ad esempio, quando i tasti identificati come KEYCODE_SHIFT e KEYCODE_A vengono 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 attivo.

Codice Axis Android

Un codice dell'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 degli assi Linux vengono mappati ai codici degli assi Android. È possibile utilizzare layout di tasti diversi a seconda del modello del dispositivo, della lingua, del paese, del layout o delle funzioni speciali.

Android Meta State

Un meta stato Android è un identificatore standard definito nell'API Android per indicare quali tasti di modifica 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 meta stati è codificata, ma il layout 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 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 di input di Linux
  2. Protocollo multi-touch Linux
  3. Driver di input Linux
  4. Feedback forzato su Linux
  5. Informazioni HID, comprese le tabelle di utilizzo HID