- — Quelle heure il est ?
- — l’heure d’t’acheter un MCP79400.
- — Rhaa, mais y a pas le driver pour Linux !
- — Tu sais ce qui te reste à faire…
Un MCP79400 est une RTC de chez microchip.
Une RTC est un composant qui permet de garder l’heure sur un système, même
quand celui-ci est éteint (on utilise généralement une pile bouton pour
alimenter le chip).
C’est un composant assez classique, qui d’habitude est bien reconnu par
Linux. Hélas pour
nous il se trouve que ce n’est pas le cas du MCP79400 dont nous avons besoin
pour un projet.
Bon c’est pas tellement dramatique, une RTC est un composant
relativement simpliste en général. C’est l’occasion de réveiller un peu ce
blog et de raconter un peu ma vie palpitante de développeur de pilotes pour
Linux 😉
Branchons le composant sur une AFP51Dev
La première étape dans le développement de driver consiste en général à réaliser un petit montage
électronique pour essayer de communiquer avec.
Le MCP79400 communique au moyen d’un bus i²c, manque de chance, la carte de
développement APF51Dev ne possède pas de connecteurs avec
l’i²c. On le trouve par contre sur le connecteur caméra CSI, il faut donc
faire un petit montage aérien pour extraire les deux signaux SDA et SCL du CSI
et les souder sur un plaque d’essais avec un MCP79400.
Premier contact avec le chip
Ok nous avons branché le mcp79400, nous allons maintenant essayer de voir
comment se comporte la bestiole sur le bus i²c.
Ce qui est bien avec le bus i²c c’est qu’il existe de nombreux outils permettant
de l’utiliser en mode utilisateur (userland) hérité du projet lm-sensors.
La carte étant démarrée, nous allons tout d’abord scanner le bus i²c numéro 1
sur lequel se trouve notre composant au moyen de la commande i2cdetect :
Welcome to the Armadeus development environment.
armadeus login: root
\# i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
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: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- UU -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6f
70: -- -- -- -- -- -- -- --
On voit qu’il y a plusieurs composants sur ce bus, un rapide coup d’œil dans
la datasheet de l’apf51dev
nous apprend qu’il s’agit de l’interface audio wolfson (WM8960) à l’adresse 0x1a,
du DVI à l’adresse 0x38 et du PMIC (wolfson) en 0x36. Les caractères UU signifient que le chip est utilisé par un driver, donc qu’il n’est pas possible d’y toucher avec des outils en userland.
Notre MCP79400 se retrouve bien en 0x6F comme donné dans la datasheet. On va
donc pouvoir commencer à essayer de lui parler.
La table des registres de la datasheet indique que le premier registre
(0x00) contient les secondes ainsi que la commande st pour débuter le
comptage. Lisons d’abord la valeur avec i2cget:
\# i2cget -y 1 0x6f 0x02 b
0x00
Maintenant si on écrit une valeur puis qu’on la relit:
\# i2cset -y 1 0x6f 0x00 0x02 b
\# i2cget 1 0x6f 0x00 b
0x02
Puisque nous arrivons à relire la valeur que nous venons d’écrire nous
pouvons confirmer que l’accès i²c est fonctionnel en lecture/écriture, ce qui
est déjà pas mal !
Voyons voir maintenant si le composant fonctionne en démarrant le comptage du
temps au moyen du bit de start st:
\# i2cset -y 1 0x6f 0x00 0x82 b
\# i2cget -y 1 0x6f 0x00 b
0x83
\# i2cget -y 1 0x6f 0x00 b
0x84
\# i2cget -y 1 0x6f 0x00 b
0x84
\# i2cget -y 1 0x6f 0x00 b
0x85
\# i2cget -y 1 0x6f 0x00 b
0x85
\# i2cget -y 1 0x6f 0x00 b
0x85
\# i2cget -y 1 0x6f 0x00 b
0x86
Bingo, notre composant semble bien compter les secondes correctement. Nous
allons donc pouvoir embrayer sur l’écriture du driver Linux à proprement
parler.