[Tutoriel] Personnaliser le clavier physique

K

killy

Membre
Inscrit
25 Septembre 2011
Messages
55
Points
6
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
S'il vous plaît, Connexion ou S'inscrire pour voir le contenu ou les urls !
(à 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:
S'il vous plaît, Connexion ou S'inscrire to view codes content!


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:
S'il vous plaît, Connexion ou S'inscrire to view codes content!
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:
S'il vous plaît, Connexion ou S'inscrire to view codes content!
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
  • S'il vous plaît, Connexion ou S'inscrire pour voir le contenu ou les urls !
    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:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    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:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    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:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    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
    S'il vous plaît, Connexion ou S'inscrire pour voir le contenu ou les urls !
    )

    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
    S'il vous plaît, Connexion ou S'inscrire pour voir le contenu ou les urls !
    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:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    par
    Code:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    La touche devient :

  • Sauvegarder le fichier et le recompiler avec l’outil kcm.exe qui fait partie de la distribution kcm_utils.zip :
    Code:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
    Exécuter la commande suivante :
    Code:
    S'il vous plaît, Connexion ou S'inscrire to view codes content!
  • 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 :

S'il vous plaît, Connexion ou S'inscrire pour voir le contenu ou les urls !


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 )
 
G

gabriel59

Membre
Inscrit
14 Février 2011
Messages
20 481
Points
0
Merci à toi. Très très bon boulot :D
 
Rasta Man

Rasta Man

Membre
Inscrit
24 Juillet 2011
Messages
1 004
Points
0
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
 
FERRAGAMO

FERRAGAMO

Membre
Inscrit
22 Janvier 2013
Messages
1 957
Points
0
Bravo belle investisement ;)
 
G

gui78120

Membre
Inscrit
25 Décembre 2012
Messages
180
Points
16
Lien Megaupload mort.
 
Haut Bas