#1 Le 18/10/2006, à 19:38
- pierrito
Compilation de ati_remote pour assignation de nouveaux keycodes
Je possède une télécommande RF ATI WONDER I
Chaque touche de la télécommande correspond à un keycode, comme n'importe quelle touche d'un clavier
Le soucis, c'est que les keycodes affectés sont ceux d'un clavier américain
par exemple la touche 1 correspond à la touche & comme sur un clavier américain
Pas facile de zapper les chaine sur TvTime ;-)
Pour resoudre ce petit probleme, je propose de recompiler le driver en assignant directement les keycodes qui vont bien
J'ai seulement tester sous Dapper
dans un premier temps il faut récupérer les sources du driver et les utilitaires pour compiler le module
sudo apt-get install linux-source
sudo apt-get install build-essential
sudo apt-get install linux-headers-`uname -r`
extraire les sources du driver : le fichier ati_remote.c
tar -xjvf /usr/src/linux-source-2.6.15.tar.bz2 linux-source-2.6.15/drivers/usb/input/ati_remote.c
Attention la version du noyau peut être différente selon les config, dans ce cas le nom du répertoire est différent.
voici la partie intéressante du code dans le ficher ati_remote.c
les keycodes sont placés dans l'avant dernière colonne
/* Directional control pad axes */
{KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */
{KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */
{KIND_ACCEL, 0x37, 0x72, EV_REL, REL_Y, -1}, /* up */
{KIND_ACCEL, 0x38, 0x73, EV_REL, REL_Y, 1}, /* down */
/* Directional control pad diagonals */
{KIND_LU, 0x39, 0x74, EV_REL, 0, 0}, /* left up */
{KIND_RU, 0x3a, 0x75, EV_REL, 0, 0}, /* right up */
{KIND_LD, 0x3c, 0x77, EV_REL, 0, 0}, /* left down */
{KIND_RD, 0x3b, 0x76, EV_REL, 0, 0}, /* right down */
/* "Mouse button" buttons */
{KIND_LITERAL, 0x3d, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */
{KIND_LITERAL, 0x3e, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */
{KIND_LITERAL, 0x41, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */
{KIND_LITERAL, 0x42, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */
/* Artificial "doubleclick" events are generated by the hardware.
* They are mapped to the "side" and "extra" mouse buttons here. */
{KIND_FILTERED, 0x3f, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */
{KIND_FILTERED, 0x43, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */
/* keyboard. */
{KIND_FILTERED, 0xd2, 0x0d, EV_KEY, KEY_KP1, 1},
{KIND_FILTERED, 0xd3, 0x0e, EV_KEY, KEY_KP2, 1},
{KIND_FILTERED, 0xd4, 0x0f, EV_KEY, KEY_KP3, 1},
{KIND_FILTERED, 0xd5, 0x10, EV_KEY, KEY_KP4, 1},
{KIND_FILTERED, 0xd6, 0x11, EV_KEY, KEY_KP5, 1},
{KIND_FILTERED, 0xd7, 0x12, EV_KEY, KEY_KP6, 1},
{KIND_FILTERED, 0xd8, 0x13, EV_KEY, KEY_KP7, 1},
{KIND_FILTERED, 0xd9, 0x14, EV_KEY, KEY_KP8, 1},
{KIND_FILTERED, 0xda, 0x15, EV_KEY, KEY_KP9, 1},
{KIND_FILTERED, 0xdc, 0x17, EV_KEY, KEY_KP0, 1},
{KIND_FILTERED, 0xc5, 0x00, EV_KEY, KEY_Q, 1},
{KIND_FILTERED, 0xc6, 0x01, EV_KEY, KEY_B, 1},
{KIND_FILTERED, 0xde, 0x19, EV_KEY, KEY_C, 1},
{KIND_FILTERED, 0xe0, 0x1b, EV_KEY, KEY_D, 1},
{KIND_FILTERED, 0xe6, 0x21, EV_KEY, KEY_E, 1},
{KIND_FILTERED, 0xe8, 0x23, EV_KEY, KEY_F, 1},
/* "special" keys */
{KIND_FILTERED, 0xdd, 0x18, EV_KEY, KEY_KPENTER, 1}, /* "check" */
{KIND_FILTERED, 0xdb, 0x16, EV_KEY, KEY_MENU, 1}, /* "menu" */
{KIND_FILTERED, 0xc7, 0x02, EV_KEY, KEY_POWER, 1}, /* Power */
{KIND_FILTERED, 0xc8, 0x03, EV_KEY, KEY_TV, 1}, /* TV */
{KIND_FILTERED, 0xc9, 0x04, EV_KEY, KEY_DVD, 1}, /* DVD */
{KIND_FILTERED, 0xca, 0x05, EV_KEY, KEY_WWW, 1}, /* WEB */
{KIND_FILTERED, 0xcb, 0x06, EV_KEY, KEY_BOOKMARKS, 1}, /* "book" */
{KIND_FILTERED, 0xcc, 0x07, EV_KEY, KEY_EDIT, 1}, /* "hand" */
{KIND_FILTERED, 0xe1, 0x1c, EV_KEY, KEY_COFFEE, 1}, /* "timer" */
{KIND_FILTERED, 0xe5, 0x20, EV_KEY, KEY_FRONT, 1}, /* "max" */
{KIND_FILTERED, 0xe2, 0x1d, EV_KEY, KEY_LEFT, 1}, /* left */
{KIND_FILTERED, 0xe4, 0x1f, EV_KEY, KEY_RIGHT, 1}, /* right */
{KIND_FILTERED, 0xe7, 0x22, EV_KEY, KEY_DOWN, 1}, /* down */
{KIND_FILTERED, 0xdf, 0x1a, EV_KEY, KEY_UP, 1}, /* up */
{KIND_FILTERED, 0xe3, 0x1e, EV_KEY, KEY_OK, 1}, /* "OK" */
{KIND_FILTERED, 0xce, 0x09, EV_KEY, KEY_VOLUMEDOWN, 1}, /* VOL + */
{KIND_FILTERED, 0xcd, 0x08, EV_KEY, KEY_VOLUMEUP, 1}, /* VOL - */
{KIND_FILTERED, 0xcf, 0x0a, EV_KEY, KEY_MUTE, 1}, /* MUTE */
{KIND_FILTERED, 0xd0, 0x0b, EV_KEY, KEY_CHANNELUP, 1}, /* CH + */
{KIND_FILTERED, 0xd1, 0x0c, EV_KEY, KEY_CHANNELDOWN, 1},/* CH - */
{KIND_FILTERED, 0xec, 0x27, EV_KEY, KEY_RECORD, 1}, /* ( o) red */
{KIND_FILTERED, 0xea, 0x25, EV_KEY, KEY_PLAY, 1}, /* ( >) */
{KIND_FILTERED, 0xe9, 0x24, EV_KEY, KEY_REWIND, 1}, /* (<<) */
{KIND_FILTERED, 0xeb, 0x26, EV_KEY, KEY_FORWARD, 1}, /* (>>) */
{KIND_FILTERED, 0xed, 0x28, EV_KEY, KEY_STOP, 1}, /* ([]) */
{KIND_FILTERED, 0xee, 0x29, EV_KEY, KEY_PAUSE, 1}, /* ('') */
{KIND_FILTERED, 0xf0, 0x2b, EV_KEY, KEY_PREVIOUS, 1}, /* (<-) */
{KIND_FILTERED, 0xef, 0x2a, EV_KEY, KEY_NEXT, 1}, /* (>+) */
{KIND_FILTERED, 0xf2, 0x2D, EV_KEY, KEY_INFO, 1}, /* PLAYING */
{KIND_FILTERED, 0xf3, 0x2E, EV_KEY, KEY_HOME, 1}, /* TOP */
{KIND_FILTERED, 0xf4, 0x2F, EV_KEY, KEY_END, 1}, /* END */
{KIND_FILTERED, 0xf5, 0x30, EV_KEY, KEY_SELECT, 1}, /* SELECT */
{KIND_END, 0x00, 0x00, EV_MAX + 1, 0, 0}
Pour ma part j'ai changé les touche 0 à 9 par les touches du pavé numérique
et la touche A par la touche Q
ex KEY_1 par KEY_KP1
pour optenir les codes attribués à chaque touche
gedit /usr/src/linux-headers-`uname -r`/include/linux/input.h
une fois le fichier modifié, il n'y a plus qu'à compiler le driver
voici le Makefile
ifneq ($(KERNELRELEASE),)
#
# Make rules for use from within 2.6 kbuild system
#
obj-m += ati_remote.o
else # We were called from command line
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
install: all
$(MAKE) KERNELRELEASE=$(shell uname -r) -C $(KDIR) M=$(PWD) modules_install
clean:
rm -f *.mod.c *.ko *.o *~ core *.i
endif
enregistrer ce fichier sous le nom de Makefile dans le même répertoire que ati_remote.c
pour compiler taper dans la console
sudo make
si tout se passe bien on doit avoir quelque chose de la sorte :
pierre@richard:~/ati_remote_wonder/ati_remote$ sudo make
Password:
make -C /lib/modules/2.6.15-27-386/build M=/home/pierre/ati_remote_wonder/ati_remote modules
make[1]: entrant dans le répertoire « /usr/src/linux-headers-2.6.15-27-386 »
CC [M] /home/pierre/ati_remote_wonder/ati_remote/ati_remote.o
Building modules, stage 2.
MODPOST
CC /home/pierre/ati_remote_wonder/ati_remote/ati_remote.mod.o
LD [M] /home/pierre/ati_remote_wonder/ati_remote/ati_remote.ko
make[1]: quittant le répertoire « /usr/src/linux-headers-2.6.15-27-386 »
le driver compilé est le fichier ati_remote.ko
Pour le tester dans un premier temps:
- enlever le driver actuel déjà chargé
sudo rmmod ati_remote
la télécommande ne répond plus à présent
- charger le nouveau module compilé
sudo insmod ./ati_remote.ko
la commande se fait toujours dans le repertoire ou se situe le fichier ati_remote.ko
normalement la télécommande réagit avec les nouvelles touches assignées
Maintenant pour l'installer définitivement
sudo cp ./ati_remote.ko /lib/modules/`uname -r`/kernel/drivers/usb/input/ati_remote.ko
Cette methode n'est pas très elegante puisqu'elle écrase le module actuel
Mais elle évite tout conflict avec l'ancien driver puisqu'il n'extite plus
de plus le driver est chargé directement au démarrage
Si ecraser le fichier vous fait hériser les poils, il est possible de faire un backup du fichier avant de l'écraser
Faire un pas en arrière, c'est regarder le monde autrement.
Hors ligne