Ecran tactile I2C et driver
Bonjour à tous,
Je développe actuellement une application sur la plateforme mini6410 de friendlyARM équipée d'un ARM11 de Samsung et d'un écran 7" tactile, le tout tourne sur emdebian avec le framework Qt + QML :ccool:
Je souhaite changer la dalle tactile résistive actuelle par une dalle tactile capacitive projetée. La dalle actuellement est possède un driver développé par friendlyARM et je peux l'utiliser avec la tslib.
La dalle que je souhaite utilisée possède un chip atmel mXT pilotable en i2c. J'ai trouvé le driver ad-hoc dans le noyau linux 2.6.39 dans /drivers/input/touchscreen/atme_mxt_ts.c.
J'ai backporté ce driver dans mon noyau tuné 2.6.36 sous forme de module que j'ai pu charger avec insmod dans la cible. Jusque là, tout va bien ;)
Avec i2cdetect, j'ai bien trouvé ma dalle sur le bus i2C. :mouarf:
Mais maintenant, je ne sais plus quoi faire!!! Je pensais devoir faire un mknod afin de le linker sur la tslib, mais pas de trace de major/minor dans le driver qui semble utiliser le périphérique i2c (logique) mais je n'ai aucune idée de la procédure à faire ensuite :?
Si une bonne âme peut me donner quelques info sur la manière de procéder :oops:
J'ajoute que la dalle a aussi un contrôleur USB qui m'a permis de la tester sur Ubuntu avec succès, détection et utilisation au poil :D
Micro-tuto dalle tactile mxt224
Connecter la dalle tactile
Tester la liaison i2c (et surtout retrouver l'adresse de la dalle - normalement 0x4b ou 0x4c - à faire dalle déconnectée puis connecté)
Cross compiler i2c-tools et lancer un i2cdetect sur le bus i2c
A partir des sources du noyau 3.0, récupérer et coller dans voss sources les fichiers suivants:
/drivers/input/touchscreen/atmel_mxt_ts.c
/include/linux/i2c/atmel_mxt_ts.h
Ajouter les lignes suivantes au fichier /drivers/input/touchscreen/atmel/KConfig
Code:
1 2 3 4 5 6 7 8 9 10 11
| config TOUCHSCREEN_ATMEL_MXT
tristate "Atmel mXT I2C Touchscreen"
depends on I2C
help
Say Y here if you have Atmel mXT series I2C touchscreen,
such as AT42QT602240/ATMXT224, connected to your system.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called atmel_mxt_ts. |
Ajouter les lignes suivantes au fichier /drivers/input/touchscreen/atmel/Makefile
Code:
obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o
Editer votre fichier décrivant votre plateforme (mach-xxx.c)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| static struct mxt_platform_data mxt_platform_data __initdata = {
.config = NULL,
.config_length = 0,
.x_line = 18,
.y_line = 12,
.x_size = 800,
.y_size = 480,
.blen = 0x1,
.threshold = 0x28,
.voltage = 3300000,
.orient = MXT_DIAGONAL,
.irqflags = IRQF_TRIGGER_FALLING
};
static struct i2c_board_info i2c_devs0[] __initdata = {
[...]
{ I2C_BOARD_INFO("mXT224", 0x4b),
.platform_data = &mxt_platform_data,
.irq = IRQ_EINT(16),
},
[...] } |
Note: On suppose q'un bus i2c est déjà présent et configuré...
Ici l'id de l'irq câblée est 16... A adapter.
Lancer la configuration du noyau
Activer la compilation du driver en mode noyau:
Device Driver -> Input Device Support -> Touchscreen -> Atmel mXT I2C Touchscreen.
Désactiver les drivers de la dalle actuelle si nécessaire
Device Driver -> Input Device Support à Touchscreen -> Votre dalle
cross-compiler (ex avc un arm)
Code:
make CROSS_COMPILE=/chemin vers compilo/preefix_compil-
Reflasher le noyau puis démarrer
Un dmesg | grep mxt doit vous lister ce type de lignes (ici addr i2c = 0x4b)
Code:
1 2
| atmel_mxt_ts 0-004b: Family ID: 128 Variant ID: 1 Version: 22 Build: 171
atmel_mxt_ts 0-004b: Matrix X Size: 18 Matrix Y Size: 12 Object Num: 17 |
Ce qui signifie que le driver a bien détecté le mXT!
Tester le /dev/input/event0 à l’aide du programme evtest:
ou sur un event précis:
Code:
evtest /dev/input/event0
Récuperer et extraire la tslib
Pré-Configurer
Code:
1 2
| $cd tslib
$./autogen.sh |
Configurer (ex avec un arm11)
Code:
1 2 3 4 5
| ./configure \
--host=arm-linux --target=arm --prefix=/chemin_tslib/output \
CFLAGS="-march=armv6 -mtune=arm1176jzf-s -mfloat-abi=softfp" \
CXXFLAGS="-march=armv6 -mtune=arm1176jzf-s -mfloat-abi=softfp" \
--enable-static --enable-shared |
cross-Compiler et récupérer les libs dans --prefix
Tester le fonctionnement avec un ts_calibrate puis ts_test
Note: Après installation sur la cible, éditer ts.conf afin d’utiliser le module input:
module_raw input. Faire un fichier de conf de la tslib. ex:
Code:
1 2 3 4 5 6 7
| export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts |
Merci beaucoup pour le tuto
Bonjour,
Je vous adresse mes meilleurs voeux pour 2012. Je vous remercie pour le tuto, je pense que j'y serait encore sans cela.
Je pense que je suis confronté au même problème pour l'interruption.
"Pour l'IRQ il est fortement déconseillé de s'en passer !! Sinon tu es obligé de poller en permanence le mxt224, pas bon pour pleins de raisons...
Attention, j'ai patché le driver mxt224 afin de faire une petit lecture i2c d'un registre de temps en temps car parfois l'IRQ n'est pas relâché..."
Au démarrage la dalle génère une interruption qui n'est jamais traitée par le système, en déconnectant le signal d'interruption et en le reconnectant cela regénère le front descendant du coup cela débloque le système. Ensuite la dalle fonctionne correctement.
J'aissyé d'initialiser l'interruption le plus tard possible mais rien ne fonctionne.
Peux-tu m'indiquer les modifications que tu as effectuées dans le driver, j'utilise la version 2.6.39 ?