Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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