[Tutoriel] Personnaliser le clavier physique

K

killy

Membre
Inscrit
25 Septembre 2011
Messages
55
Points
6
#1
Bonjour à tous.
Dans ce tutoriel nous allons voir comment personnaliser (customiser) le clavier physique du Galaxy 551.
Attention, le tutoriel n'est pas 100% pas-à-pas et suppose une connaissance minimale du système Android, même s'il n'est pas demandé d'être développeur !

Merci d'indiquez vos remarques en réponse au tutoriel.

/!\ AVERTISSEMENT: Comme n'importe quelle modification d'Android, cette procédure peut potentiellement "briquer" votre téléphone. A vos risques et périls.

I. Pré-requis
Il faut que le téléphone soit « rooté » et que busybox soit installé (généralement busybox est installé lors de la procédure de « rootage/rooting »)

Si vous ne savez pas ce que tout celà veut dire, merci de consulter les autres fils de discussion sur ce sujet plutôt que de continuer.


II. Explications
Le clavier physique du Galaxy 551 correspond à un périphérique interne d’entrée (input device) qui envoie des événements (events) qui sont convertis en caractères.

Cette conversion est faite avec les fameux fichiers keylayout et keychars de la façon suivante, grosso-merdo :



Avant toute chose, il convient d’identifier le périphérique. En effet suivant la ROMs que vous avez, le périphérique n’a pas le même nom.
Pour se faire nous allons utiliser un émulateur de terminal, par exemple
Vous n'avez pas la permission de voir ce lien Connectez-vous ou inscrivez-vous dès maintenant.
(à installer donc, mais si vous avec l’Android SDK installé c’est encore plus simple avec adb) et une fois sous root, utiliser la commande getevent avec le flag -p qui signifie « possible events » :

Code:
# su
# getevent -p
getevent -p
add device 1: /dev/input/event4
  name:     "accelerometer_sensor"
  events:
    SYN (0000): 0000  0002
    REL (0002): 0000  0001  0002
add device 2: /dev/input/event3
  name:     "magnetic_sensor"
  events:
    SYN (0000): 0000  0003
    ABS (0003): 0000  value 0, min -131072, max 131072, fuzz 0 flat 0
                0001  value 0, min -131072, max 131072, fuzz 0 flat 0
                0002  value 0, min -131072, max 131072, fuzz 0 flat 0
                0003  value 0, min 0, max 65536, fuzz 0 flat 0
                0004  value 0, min -32768, max 32768, fuzz 0 flat 0
                0005  value 0, min -16384, max 16384, fuzz 0 flat 0
                0007  value 0, min 0, max 3, fuzz 0 flat 0
                0008  value 0, min 0, max 3, fuzz 0 flat 0
                0009  value 0, min 0, max 3, fuzz 0 flat 0
                000a  value 0, min -131072, max 131072, fuzz 0 flat 0
                0010  value 0, min -131072, max 131072, fuzz 0 flat 0
                0011  value 0, min -131072, max 131072, fuzz 0 flat 0
                0019  value 0, min -3, max 3, fuzz 0 flat 0
add device 3: /dev/input/event2
  name:     "sec_keypad"
  events:
    SYN (0000): 0000  0001  0005
    KEY (0001): 000e  0010  0011  0012  0013  0014  0015  0016
                0017  0018  0019  001c  001e  001f  0020  0021
                0022  0023  0024  0025  0026  002a  002c  002d
                002e  002f  0030  0031  0032  0033  0034  0038
                0039  0066  0067  0069  006a  006b  006c  0072
                0073  008b  009b  009e  00d4  00d6  00d9  00df
                00e7  0160
    SW  (0005): 0000
add device 4: /dev/input/event1
  name:     "sec_touchscreen"
  events:
    SYN (0000): 0000  0001  0003
    ABS (0003): 0030  value 0, min 0, max 255, fuzz 0 flat 0
                0032  value 0, min 0, max 15, fuzz 0 flat 0
                0035  value 0, min 0, max 240, fuzz 0 flat 0
                0036  value 0, min 0, max 400, fuzz 0 flat 0
add device 5: /dev/input/event0
  name:     "sec_jack"
  events:
    SYN (0000): 0000  0001
    KEY (0001): 00e2


On retrouve (dans mon cas) donc les périphériques d’entrée avec les noms suivants:
  • accelerometer_sensor = accéléromètre; envoie des événements en continu lorsque qu’on bouge le terminal (Galaxy 551). Utilisé en particulier pour l’auto-rotation en mode portrait/paysage et également par certains jeux [en dehors des applications n’est utilisé que si la rotation automatique est activée]
  • magnetic_sensor = « boussole »; envoie des événements lorsque la position du Nord magnétique change par rapport au terminal [n’est utilisé/activé que pour les applications de type compas/boussole ou de localisation]
  • sec_keypad = touches physique ; envoie des événements lorsqu’on appuie ou relache une touche (clavier physique extractible + les autres touches physiques telles que celles de contrôle du volume sonore)
  • sec_touchscreen = écran tactile ; envoie des événements lorsqu’on touche l’écran capacitif
  • sec_jack = prise jack ; envoie des événements lorsqu’on branche un casque/micro ou qu’on le débranche
Dans mon example, le périphérique d’entrée « clavier » a pour nom sec_keypad, mais il peut également prendre d’autre noms.
Android "mappe" les événements clavier à des caractères à travers 2 fichiers de conversion:

1. Mapping événement → touche clavier à travers des mnémoniques (« keycode ») : keylayout
2. Mapping touche clavier (mnémonique/keycode) → caractère : keychars

Ce sont ces 2 mappings que l’on peut modifier pour personnaliser le clavier.

III. Modification du keylayout

La modification du keylayout permet principalement d’inverser des touches du clavier physique.
C’est par exemple la méthode à priori la plus simple pour passer d’un clavier QWERTY à un clavier AZERTY, néanmoins ça ne prend pas en compte les « modificateurs » (alt et (shift)).
Ainsi on peut inverser :

et


Néanmoins l’énorme défaut c’est que les « modificateurs » viennent avec…
Par conséquent utiliser simplement cette méthode va conduire à avoir la touche [1] qui se retrouve en 2ème ligne ! Pas bon du tout…

Le fichier de mapping est le fichier texte suivant:
/system/usr/keylayout/<input device name>.kl
avec <input device name> correspondant à ce que vous avez trouvé dans 3.
Dans mon cas :
/system/usr/keylayout/sec_keypad.kl
Le syntaxe est :
key <scancode> <keycode> <flags>
  • scancode: est le numéro de l’événement généré par le pilote lors de l’appui/relâchement d’une touche en décimal
  • keycode: est le mnémonique de la touche dont la définition est donné dans le fichier de mapping keychars (ne pas mettre n’importe quoi donc si le fichier keychars n’est pas lui même modifié)
  • flags : indique si les modificateurs alt et (shirt) sont basculés ou verrouillés ainsi que l’effet si l’appareil (le Galaxy 551) est verrouillé, i.e. soit la touche est ignorée complètement, soit la touche dévérouille l’appareil et est ignorée, soit la touche dévérouille l’appareil et est prise en compte (valeurs possible « RIEN », SHIFT, ALT, CAPS, WAKE, WAKE_DROPPED)
Exemple extrait:
Code:
(…)
key 102   HOME              WAKE
(…)
key 16    A
(…)
La touche dont l’événement est 102 est interprété comme étant la touche « HOME » (et à la fois le système Android et les applications vont l’interpréter comme telle) et en plus permet de déverrouiller le téléphone.
La touche dont l’événement est 16 est la touche « A ».

Simplement en éditant ce fichier texte, on peut ainsi échanger complètement des touches.
Vu que qu’on mappe les scancode vers un keycode (mnémonique touche), il faut à priori connaitre les scancodes. A priori ce n’est pas grandement nécessaire car le fichier original est relativement clair (vu qu’il est déjà rempli), néanmoins si nécessaire on peut tout simplement intercepter les événements avec la commande getevent depuis l’émulateur de terminal :
Il suffit de mettre en paramètre le pseudo-fichier correspondant au périphérique d’entrée, i.e. dans mon cas /dev/input/event2 et ensuite d’appuyer sur les touches pour voir le code :
Code:
# su
# getevent /dev/input/event2
getevent /dev/input/event2
0005 0000 00000000
0000 0000 00000000
0001 0038 00000001
0001 0038 00000000
0001 0038 00000001
0001 0038 00000000
0001 0013 00000001
(…)
^C
#
Le format est le suivant pour la commande getevent, pour chaque ligne:
<type> <code> <value>
Plus précisément, pour les touches physiques (donc ce qui nous intéresse ; la signification est différente pour l’accéléromètre) :
<type> <scancode> < état de la touche (0 ou 1)>
  • type :
    0 : sync
    1 : touche (clavier physique et autres touches)
    5 : clavier physique (ouverture/fermeture)
  • scancode : le numéro de l’événement généré par le pilote lors de l’appui/relâchement d’une touche en hexadécimal
  • état :
    0 (00000000) : touche relâchée
    1 (00000001) : touche appuyée
Ainsi en appuyant sur les touches lors de la capture, on peut obtenir les scancodes.
/!\ Les scancodes retournés par getevent sont en hexadécimal alors que dans le fichier keylayout elles sont en décimal

IV. Modification du keychars mapping (kcm)
5.1. Pré-requis :
  • Télécharger et installer les .kcm <-> .kcm.bin (pour Windows) : et extraire le contenu du zip sur le PC
  • Vous n'avez pas la permission de voir ce lien Connectez-vous ou inscrivez-vous dès maintenant.
    et installer Python pour Windows si vous ne l’avez pas déjà.
5.2. Procédure :

La modification du mapping des scancodes vers les caractères réels se fait à travers le fichier suivant :
/system/usr/keychars/<input device name>.kcm.bin
avec <input device name> correspondant à ce que vous avez trouvé dans le paragraphe "III".
Dans mon cas :
/system/usr/keychars/sec_keypad.kcm.bin

Le problème c’est que c’est un fichier binaire (compilé/converti à partir d’un fichier texte) et qu’à moins d’utiliser un éditeur hexadécimal il va falloir faire cette conversion. Vous pouvez procéder comme suit :
  • Tout d’abord, télécharger le fichier xxx.kcm.bin sur l’ordinateur (par exemple en copiant le fichier sur la SD Card avec « root explorer » et en le rapatriant par l’USB en mode USB Mass Storage (UMS)) [avec adb : « adb pull /system/usr/keychars/sec_keypad.kcm.bin »]
  • Ensuite le convertir en format texte (ASCII) avec le script python unkvm que vous avec téléchargé avec les outils de conversion :

    Syntaxe :
    Code:
    usage: kcm [INPUT] [OUTPUT]
    
            INPUT   compiled keycharmap file, - for STDIN
            OUTPUT  keycharmap file, - for STDOUT
    Exécuter la commande suivante dans l'interpréteur de commande Windows (cmd.exe) (en l’adaptant en fonction de vos fichiers ; il n’est pas forcément nécessaire de mettre le <répertoire… >):
    Code:
    C:> "<répertoire où Python est installé>\python.exe" unkcm sec_keypad.kcm.bin sec_keypad.kcm
    Voilà, maintenant vous avez le fichier de mapping keychars en texte que vous pouvez éditer (sec_keypad.kcm dans mon cas):

    Le fichier se présente comme suit :
    Code:
    [type=QWERTY]
    # keycode      Display   Number    Base      Shift     Alt       Shift+Alt
    0              '0'       '0'       '0'       ')'       ')'       ')'
    1              '1'       '1'       '1'       '!'       '!'       '!'
    2              '2'       '2'       '2'       '@'       '@'       '@'
    3              '3'       '3'       '3'       '#'       '#'       '#'
    (...)
    Chaque ligne correspond à une touche avec les 7 colonnes suivantes :
    keycode : le mnémonique de la touche tel que décrit dans le fichier keylayout (donc doit y être référencé)
    Display : ?
    Number : ?
    Base : caractère sans modificateur
    Shift : caractère obtenu en le modifiant avec la touche (shift)
    Alt : caractère obtenu en le modifiant avec la touche alt
    Shift+Alt : caractère obtenu en le modifiant avec la touche (shift) + alt

    Le caractères sont à indiquer en ASCII entre « ' » et « ' » (j’ai bien dit en ASCII et non pas en Latin 1, donc pas de caractère accentué !) ou le code unicode sous la forme 0x<hexadecimal unicode> (pour les codes unicodes, voir
    Vous n'avez pas la permission de voir ce lien Connectez-vous ou inscrivez-vous dès maintenant.
    )

    Par exemple la combinaison SHIT + ALT + « N » est associé au caractère 0x303 (771 en décimal) qui devrait s’écrire logiquement U+0303. Une recherche le caractère est décrit dans
    Vous n'avez pas la permission de voir ce lien Connectez-vous ou inscrivez-vous dès maintenant.
    et indique qu’il correspond au « combining tilde » « ~ ». C’est bien ça !

    A noter que le « type » (au début du fichier) correspond au type de clavier (i.e. alphanumérique (=QWERTY), numérique(=NUMERIC) etc…)


    A titre d’example, comme vous le savez, il manque le signe « = » sur le clavier physique, et à titre d’exercice nous allons l’ajouter.

    La touche suivante est la cible (identique au PC, et rien alloué pour SHIFT+ALT) :

    Remplacer la ligne suivante:
    Code:
    W              'W'       '+'       'w'       'W'       '+'       0x0
    par
    Code:
    W              'W'       '+'       'w'       'W'       '+'       '='
    La touche devient :

  • Sauvegarder le fichier et le recompiler avec l’outil kcm.exe qui fait partie de la distribution kcm_utils.zip :
    Code:
    Syntaxe :
    usage: kcm INPUT OUTPUT
    
    INPUT   keycharmap file
    OUTPUT  compiled keycharmap file
    Exécuter la commande suivante :
    Code:
    C:> kcm sec_keypad.kcm sec_keypad.kcm.bin
  • Remplacer le fichier sur le telephone en le recopiant par exemple sur carte SD en UMS, puis en le copiant avec root explorer dans /system/usr/keychars (bien sauvegarder le fichier original avant) [avec adb : « adb push sec_keypad.kcm.bin /system/usr/keychars/» - bien modifier les ownerships et permissions ensuite]
    /!\ Pour éviter tout problème, fermer le clavier physique et éviter d’utiliser tout bouton physique pendant la manipulation
  • Rebooter
[/list][/list]
Après vérification on a bien le signe “=” accessible avec [] +[alt] + [W]

V. Conclusion et addendum

Vous venez de voir avec ce tutoriel qu'on peut facilement personnaliser le clavier physique du Galaxy 551.
Notez néanmoins que les popup des symboles (appui long sur une touche) n'ont rien à voir avec cette procédure.

Pour pourrez trouver davantage de détails avec les liens suivants :

Enfin, pour information, voici le clavier physique tel qu'il est par défaut en QWERTY :

Vous n'avez pas la permission de voir ce lien Connectez-vous ou inscrivez-vous dès maintenant.


Et voici le fichier tel qu'expliqué dans la section précédente avec l'ajout du signe "=" (à combiner donc avec le fichier keylayout de )
 
Rasta Man

Rasta Man

Membre
Inscrit
24 Juillet 2011
Messages
1 004
Points
0
#3
Bravo! Super tutot smile
J avais une question par rapport aux claviers non-physique du telephone gt i5510!
Voila, je possede aussi un xperia x8 que j ai bien évidemment installé avec la rom gingerDX qui est une rom custom cyanogene absolument GENIALE ; cette rom comporte un calvier d un HTC ( en non THC coool looool n je dec ) et j ai récuperé l application .apk de ce clavier grace a un explorateur de fichier.
Serait-il possible d installer ce clavier sur mon gt i5510 ? car pour l instant, l applicaton est intallée mais je n arrive pas a le lancé ( il m indique qu il rencontre une erreur est qu il doit fermer )

Clem
 

Haut Bas