Fonera i2c – pilote à jour pour Kamikaze 7.07

Le passage d’OpenWrt Kamikaze 7.06 à 7.07 apporte un grand nombre de changement dont le passage du kernel linux à la version 2.6.21.4. Le code de mon pilote i2c utilisant les GPIO du routeur La Fonera est donc mis à jour.

Le changement réside dans l’utilisation de la fonction i2c_del_adapter en lieu et place de i2c_bit_del_bus. En dehors de cela, j’ai constater un changement de comportement dans le chargement du pilote. A plusieurs reprises le chargement immédiatement après le boot ne fonctionnait pas :
i2c-algo-bit.o: (0) scl=0, sda=0
i2c-algo-bit.o: GPIO adapter seems to be busy.
Puis, après un tant d’attente de quelques minutes, les choses sont rentrées dans l’ordre :
i2c-algo-bit.o: (0) scl=128, sda=16
i2c-algo-bit.o: (1) scl=128, sda=0
i2c-algo-bit.o: (2) scl=128, sda=16
i2c-algo-bit.o: (3) scl=0, sda=16
i2c-algo-bit.o: (4) scl=128, sda=16
i2c-algo-bit.o: GPIO adapter passed test.
: hw routines registered.
I2C adapter driver [GPIO adapter] forgot to specify physical device
i2c_adapter i2c-0: adapter [GPIO adapter] registered
i2c-dev: adapter [GPIO adapter] registered as minor 0
gpio_i2c: module loaded
gpio_i2c: inverted outputs
La charge système est peut-être en cause. Je vais me pencher sur le problème au niveau logiciel (avec un udelay plus important, déjà à 600) et au niveau matériel (la présence de condensateurs et de résistances sur les GPIO forme clairement un réseau RC).

Les sources du pilotes sont là : http://www.lefinnois.net/fonerai2c/i2c-gpio-0.0.6.tar.gz

Et les paquets pour Kamikaze 7.07 sur La Fonera ici : http://www.lefinnois.net/fonerai2c/7.07/atheros-2.6/packages/

i2c pour La Fonera – le circuit

J’ai finalement décidé de faire un peu plus propre concernant le bus i2c pour le routeur La Fonera. Voici donc un typon correspondant au schéma déjà donné.

Tout est dans http://www.lefinnois.net/fonerai2c/. Source, binaires pour OpenWrt Kamikaze 7.06, schéma et typon. Le pilote i2c_gpio a été mis à jour (correction de typo, ajout du numéro de version, etc) ainsi que le paquet binaire correspondant.

Un bus i2c pour La Fonera

Comme je l’ai peut-être dit précédemment, le but des expérimentations sur les GPIO du routeur La Fonera était de pouvoir, à terme, utiliser un bus i2c. C’est finalement chose faite. En utilisant 4 lignes GPIO, un 74LS05 et quelques résistances de 10K Ohms mon routeur est maintenant capable de dialoguer avec un capteur de température DS75.

J’ai utilisé les quatre lignes les plus facilement accessibles. Celles qui se trouvent sur le connecteur SW1 à côté du connecteur Ethernet à l’arrière du routeur. Les pins 1 et 2 sont dédiées respectivement à l’envoi et la réception des signaux SDA et les pins 5 et 6 pour SCL.

Le 74LS05 est un sextuple inverseur TTL. Il doit également être possible d’utiliser un composant CMOS (74HC05). Le schémas de connexion est donné dans ce PDF. L’avantage du TTL est de considérer comme un 1 logique une tension supérieur à 2 Volts. Ceci nous permet de sécuriser un peu le montage en ajoutant des diodes 1N4148, juste pour être sûr que du 5 Volts ne risque pas de toucher une ligne en sortie.

Côté logiciel, comme le kernel Linux dispose déjà d’un support i2c, il suffisait de développer un pilote pour le nouveau bus en utilisant le bit-banging (tous les signaux sont gérés de manière logicielle). Les algorithmes sont supportés par le pilote i2c-algo-bit qu’il faudra donc activer, tout comme i2c-core, dans le nouveau kernel sous forme de module ou non. L’utilisation de modules est préférable car modulaire mais également parce que le pilote i2c-algo-bit peut prendre en argument des options de test et de débugage très intéressantes.

Mon pilote, nommé i2c_gpio, est disponible ici : http://www.lefinnois.net/fonerai2c/i2c_gpio.tar.gz. Tout est détaillé dans le fichier README présent dans l’archive.

Pour tester le nouveau bus, j’ai utilisé le programme i2cdetect du projet lm-sensors. Il permet de parcourir un bus i2c afin d’y trouver des composants. Une version légèrement adapté est disponible sous la forme d’une archive source pour OpenWRT ici : http://www.lefinnois.net/fonerai2c/i2cdetect.tar.gz.

L’archive contient également le programme ds75ioctl permettant de communiquer avec le capteur de température DS75. Exemple :
insmod i2c_algo_bit i2c_debug=3 bit_test=1
insmod i2c_gpio inverted=1
Dans les logs (dmesg) :
i2c-algo-bit.o: (0) scl=128, sda=16
i2c-algo-bit.o: (1) scl=128, sda=0
i2c-algo-bit.o: (2) scl=128, sda=16
i2c-algo-bit.o: (3) scl=0, sda=16
needed 1 jiffies
i2c-algo-bit.o: (4) scl=128, sda=16
i2c-algo-bit.o: GPIO adapter passed test.
: hw routines registered.
i2c_adapter i2c-0: adapter GPIO adapter registered
i2c-dev: adapter GPIO adapter registered as minor 0
gpio_i2c: module loaded
gpio_i2c: inverted outputs
On utilise ensuite i2cdetect et ds75ioctl :
root@OpenWrt:/# i2cdetect -l i2c-0 i2c GPIO adapter Algorithm unavailable
Notre bus est là. Scannons-le :
root@OpenWrt:/# i2cdetect 0 WARNING! This program can confuse your I2C bus,
cause data loss and worse!
I will probe file /dev/i2c-0. I will probe address range 0x03-0x77.
Continue? Y/n
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: XX XX XX XX XX XX XX XX XX XX XX XX XX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
40: XX XX XX XX XX XX XX XX 48 XX XX XX XX XX XX XX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
70: XX XX XX XX XX XX XX XX
Tiens, il y a quelque chose à l’adresse 0x48. Notre DS75 :
root@OpenWrt:/# i2cdetect -l
i2c-0 i2c GPIO adapter Algorithm unavailable
23,81°C, température de saison…