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...
