File di layout delle chiavi

I file di layout delle chiavi (file .kl) mappano i codici chiave e i codici asse di Linux ai codici chiave e ai codici asse di Android e specificano i flag delle norme associati. I file di layout dei tasti specifici del dispositivo sono:

  • Obbligatorio per i dispositivi di input interni (incorporati) con tasti, inclusi i tasti speciali come il volume, il tasto di accensione e i tasti multimediali delle cuffie.
  • Facoltativo per altri dispositivi di input, ma consigliato per tastiere e joystick per uso speciale.

Se non è disponibile un file di layout delle chiavi specifico del dispositivo, il sistema sceglie un valore predefinito.

Posizione

I file di layout delle chiavi vengono individuati in base all'ID fornitore USB, all'ID prodotto (e facoltativamente alla versione) o al nome del dispositivo di input. I seguenti percorsi vengono consultati in ordine:

  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /odm/usr/keylayout/DEVICE_NAME.kl
  • /vendor/usr/keylayout/DEVICE_NAME.kl
  • /system/usr/keylayout/DEVICE_NAME.kl
  • /data/system/devices/keylayout/DEVICE_NAME.kl
  • /odm/usr/keylayout/Generic.kl
  • /vendor/usr/keylayout/Generic.kl
  • /system/usr/keylayout/Generic.kl
  • /data/system/devices/keylayout/Generic.kl

Quando viene creato un percorso file che contiene il nome del dispositivo, tutti i caratteri nel nome del dispositivo diversi da "0"-"9", "a"-"z", "A"-"Z", "-" o "_" vengono sostituiti da "_".

File di layout della chiave generica

Il sistema fornisce un file di layout della chiave generica integrato speciale chiamato Generic.kl. Questo layout dei tasti è progettato per supportare una serie di tastiere e joystick esterni standard. Non modificare il layout della chiave generica.

Sintassi

Un file di layout delle chiavi è un file di testo costituito da dichiarazioni e flag di chiavi o assi.

Dichiarazioni chiave

Le dichiarazioni delle chiavi sono costituite dalla parola chiave key seguita da un numero di codice chiave Linux e dal nome del codice chiave Android oppure dall'utilizzo della parola chiave seguito da un utilizzo HID e dal nome del codice chiave Android. L'utilizzo HID è rappresentato come un numero intero di 32 bit, dove i 16 bit più alti rappresentano la pagina di utilizzo HID e i 16 bit più bassi rappresentano l'ID utilizzo HID. Entrambe le dichiarazioni possono essere seguite da un insieme facoltativo di indicatori di norme delimitati da spazi.

key 1     ESCAPE
key 114   VOLUME_DOWN
key 16    Q                 VIRTUAL
key usage 0x0c006F          BRIGHTNESS_UP

Sono riconosciuti i seguenti flag dei criteri:

  • FUNCTION: il tasto deve essere interpretato come se fosse stato premuto anche il tasto FUNCTION.
  • GESTURE: la chiave generata da un gesto dell'utente, ad esempio il tocco con il palmo sul touchscreen.
  • VIRTUAL: il tasto è un tasto virtuale (pulsante capacitivo) adiacente allo schermo touch principale. In questo modo viene attivata una logica di debouncing speciale (vedi di seguito).

Dichiarazioni dell'asse

Le dichiarazioni dell'asse consistono ciascuna nella parola chiave axis seguita da un numero di codice dell'asse Linux e da qualificatori che controllano il comportamento dell'asse, incluso almeno un nome di codice dell'asse Android.

Assi di base

Un asse di base mappa semplicemente un codice asse Linux a un nome di codice asse Android. La dichiarazione seguente mappa ABS_X (indicato da 0x00) a AXIS_X (indicato da X).

axis 0x00 X

Nell'esempio precedente, se il valore di ABS_X è 5, AXIS_X viene impostato su 5.

Assi suddivisi

Un asse diviso mappa un codice asse Linux a due nomi di codice asse Android, in modo che i valori inferiori o superiori a una soglia vengano suddivisi in due assi diversi quando vengono mappati. Questa mappatura è utile quando un singolo asse fisico segnalato dal dispositivo codifica due assi logici diversi e mutuamente esclusivi.

La seguente dichiarazione mappa i valori dell'asse ABS_Y (indicato da 0x01) a AXIS_GAS se minore di 0x7f o a AXIS_BRAKE se maggiore di 0x7f.

axis 0x01 split 0x7f GAS BRAKE

Nell'esempio precedente, se il valore di ABS_Y è 0x7d,AXIS_GAS viene impostato su 2 (0x7f - 0x7d) e AXIS_BRAKE su 0. Al contrario, se il valore di ABS_Y è 0x83, AXIS_GAS viene impostato su 0 e AXIS_BRAKE su 4 (0x83 - 0x7f). Infine, se il valore di ABS_Y è uguale al valore di suddivisione di 0x7f, sia AXIS_GAS sia AXIS_BRAKE vengono impostati su 0.

Assi invertiti

Un asse invertito inverte il segno del valore dell'asse. La dichiarazione seguente mappa ABS_RZ (indicato da 0x05) a AXIS_BRAKE (indicato da BRAKE) e inverte l'output negandolo.

axis 0x05 invert BRAKE

Nell'esempio precedente, se il valore di ABS_RZ è 2, AXIS_BRAKE viene impostato su -2.

Opzione stanza virtuale semplice al centro

Un dispositivo con joystick potrebbe segnalare eventi di input anche quando il joystick non è in uso, a causa del rumore. Questo rumore proviene in genere dai joystick sinistro e/o destro e fa sì che il driver registri un valore di posizione vicino a 0. Il valore "center flat" specifica la quantità di rumore da prevedere dal controller a riposo.

Il protocollo di input di Linux consente ai driver dei dispositivi di input di specificare il valore piatto del centro degli assi del joystick, ma non tutti i driver lo segnalano e alcuni forniscono valori errati. Per risolvere il problema, una dichiarazione dell'asse può essere seguita da un'opzione flat che specifica la larghezza della regione intorno alla posizione centrale dell'asse che deve essere considerata centrata.

Ad esempio, se un driver del dispositivo riporta valori per AXIS_X compresi tra 0 e 100, poi 0 verrà mappato a -1 e 100 a 1 dal sistema di input di Android. Il centro dell'intervallo sarà 50 nelle coordinate non scalate e 0 nelle coordinate scalate. Se un valore piatto è uguale a 10, gli sviluppatori devono presumere che qualsiasi valore AXIS_X registrato tra -0,1 e 0,1 (tra 40 e 60 in coordinate non scalate) sia rumore e trattare questi valori provenienti dal joystick come zero.

Nota: mentre il file di layout delle chiavi specifica il valore per lo spazio di coordinate del driver, il valore riportato da android.view.InputDevice.MotionRange#getFlat() si trova nello spazio di coordinate di Android.

axis 0x03 Z flat 4096

Nell'esempio precedente, il valore piatto centrale è impostato su 4096.

Commenti

Le righe di commento iniziano con # e continuano fino alla fine della riga:

# A comment!

Le righe vuote vengono ignorate.

Esempi

Tastiera

# This is an example of a key layout file for a keyboard.

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 12    MINUS
key 13    EQUALS
key 14    DEL

# etc...

Controlli di sistema

# This is an example of a key layout file for basic system controls,
# such as volume and power keys which are typically implemented as GPIO pins
# the device decodes into key presses.

key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 116   POWER

Pulsanti capacitivi

# This is an example of a key layout file for a touch device with capacitive buttons.

key 139    MENU           VIRTUAL
key 172    HOME           VIRTUAL
key 158    BACK           VIRTUAL
key 217    SEARCH         VIRTUAL

Controlli multimediali del jack per cuffie

# This is an example of a key layout file for headset mounted media controls.
# A typical headset jack interface might have special control wires or detect known
# resistive loads as corresponding to media functions or volume controls.
# This file assumes that the driver decodes these signals and reports media
# controls as key presses.

key 163   MEDIA_NEXT
key 165   MEDIA_PREVIOUS
key 226   HEADSETHOOK

Joystick

# This is an example of a key layout file for a joystick.

# These are the buttons that the joystick supports, represented as keys.
key 304   BUTTON_A
key 305   BUTTON_B
key 307   BUTTON_X
key 308   BUTTON_Y
key 310   BUTTON_L1
key 311   BUTTON_R1
key 314   BUTTON_SELECT
key 315   BUTTON_START
key 316   BUTTON_MODE
key 317   BUTTON_THUMBL
key 318   BUTTON_THUMBR

# Left and right stick.
# The reported value for flat is 128 in a range of -32767 to 32768, which is absurd.
# This confuses applications that rely on the flat value because the joystick
# actually settles in a flat range of +/- 4096 or so. We override it here.
axis 0x00 X flat 4096
axis 0x01 Y flat 4096
axis 0x03 Z flat 4096
axis 0x04 RZ flat 4096

# Triggers.
axis 0x02 LTRIGGER
axis 0x05 RTRIGGER

# Hat.
axis 0x10 HAT_X
axis 0x11 HAT_Y

Tasti virtuali soft

Il sistema di immissione fornisce funzionalità speciali per l'implementazione di tasti virtuali nei seguenti casi d'uso:

  1. Se i tasti virtuali vengono visualizzati graficamente sullo schermo (ad esempio sul Galaxy Nexus), vengono implementati dal componente Barra di navigazione nel pacchetto UI del sistema. Poiché i tasti virtuali grafici sono implementati a un livello elevato del sistema, i file di layout dei tasti non sono coinvolti e le seguenti informazioni non si applicano.
  2. Se i tasti virtuali sono implementati come una regione tocabile estesa che fa parte del touchscreen principale (ad esempio su Nexus One), il sistema di immissione utilizza un file di mappatura dei tasti virtuali per tradurre le coordinate tocco X/Y in codici tasti Linux, quindi utilizza il file di layout dei tasti per tradurre i codici tasti Linux in codici tasti Android (per informazioni dettagliate sui file di mappatura dei tasti virtuali, consulta Dispositivi touch). Il file del layout dei tasti per il dispositivo di input touchscreen deve specificare la mappatura dei tasti appropriata e includere il flag VIRTUAL per ogni tasto.
  3. Se i tasti virtuali sono implementati come pulsanti capacitivi separati dal touchscreen principale (ad esempio su Nexus S), il driver del dispositivo del kernel o il firmware è responsabile della traduzione dei tocchi in codici tasti Linux, che il sistema di immissione poi traduce in codici tasti Android utilizzando il file di layout dei tasti. Il file di layout dei tasti per il dispositivo di input con pulsanti capacitivi deve specificare la mappatura dei tasti appropriata e includere il flag VIRTUAL per ogni tasto.

Quando i tasti virtuali si trovano all'interno o nelle immediate vicinanze fisiche del touchscreen, è facile per gli utenti premere accidentalmente un pulsante quando toccano vicino alla parte inferiore dello schermo o quando fanno scorrere un dito dall'alto verso il basso o dal basso verso l'alto sullo schermo. Per evitare questo problema, il sistema di immissione applica un breve antirimbalzo in modo che le pressioni dei tasti virtuali vengano ignorate per un breve periodo di tempo dopo il tocco più recente sul touchscreen (questo ritardo è chiamato tempo di riposo dei tasti virtuali).

Per attivare il debouncing dei tasti virtuali:

  1. Fornisci un file di layout dei tasti per il dispositivo di input con touchscreen o pulsante capacitivo con il flag VIRTUAL impostato per ogni tasto.
    key 139    MENU           VIRTUAL
    key 172    HOME           VIRTUAL
    key 158    BACK           VIRTUAL
    key 217    SEARCH         VIRTUAL
    
  2. Imposta il valore del tempo di riposo della chiave virtuale in un overlay della risorsa per la risorsa config.xml del framework.
    <!-- Specifies the amount of time to disable virtual keys after the screen
    is touched to filter out accidental virtual key presses due to swiping gestures
    or taps near the edge of the display. May be 0 to disable the feature.
    It is recommended that this value be no more than 250 ms.
    This feature should be disabled for most devices. -->
    
    <integer name="config_virtualKeyQuietTimeMillis">250</integer>
    

Convalida

Devi convalidare i file di layout delle tasti utilizzando lo strumento Convalida mappa tasti.