Published on

Développer un driver I2C pour Raspberry PI

Authors
  • Name
    Anthony Rabine

Le Raspberry PI offre un connecteur d'extension de 40 broches où se trouve les deux broches d'un bus I2C. Dans cet article, nous allons voir comment développer un pilote de périphérique au système Linux. Notre périphérique sera une jauge de batterie, le but étant de pouvoir afficher dans la barre du système un pourcentage de charge de notre batterie.

Pré-requis

Vous aurez donc besoin d'un Raspberry PI, au moins la version 3 car les versions précédentes ont des différences de répartition du bus I2C (au moins sur la première version de la carte dans tous les cas).

L'exemple présenté ici requiert un esclave I2C, plus précisément un MAX1726x (il existe plusieurs version de ce modèle, d'où le X). Cependant, les principes généraux sont valables pour d'autres types de périphérique de type jauge de batterie et fournit une bonne porte d'entrée pour n'importe quel esclave I2C en général.

Notez que généralement c'est le fondeur qui va fournir le pilote compatible Linux pour son composant facilitant ainsi son adoption. Au moment de l'écriture de cet article, on trouve un pilote sur Github mais encore rien en standard dans le kernel. Pour le sport et bien comprendre les mécanismes de Linux, nous allons coder quelque chose par nous même, mais en nous inspirant de l'existant.

Présentation rapide du bus I2C

Ce bus possède deux fils, SDA (les données) et SCL (le signal d'horloge) et parce que c'est un bus on peut venir y connecter plusieurs périphériques physiquement dessus. Il y a un maître (plus rarement plusieurs) et N esclave. Chaque esclave possède une adresse qui doit être connue à l'avance pour éviter les conflits. Certains périphériques possèdent cette adresse en dur, dans le silicium ou en logiciel, tandis que d'autres peuvent autoriser une petite variation grâce au positionnement de quelques broches.

Les débits sont anémiques, généralement 100Khz ou 400kHz avec un maximum de 1Mhz décrit dans la norme, initialement inventée par Philips. On rencontre d'ailleurs des nommages quelques-fois apparentés pour éviter de tomber sous le coups des liences ; on retrouve ainsi the TWI (Two Wires Interface) chez Atmel.

Dans un ordinateur de type PC, vous retrouvez l'I2C sous le nom de SMBus qui diffère par quelques caractéristiques électroniques (vitesses ...) et son généralement compatibles.

Présentation du MAX1726x

Outillage logiciel

i2c probe + compilateur

Au niveau du code source, ne partez pas les mains vides : le code source linux est lui-même une source inépuisable de savoir. Sur le dépôt Git du kernel, vous pouvez vous insipirer de tous les pilotes déjà existants. Ils sont plus ou moins complexes, commencez par les plus simples.

Premiers tests

Connexion + probe

Squelette d'un pilote et son makefile

Abstractions matérielles

Un des buts d'un système d'exploitation est d'exploiter efficacement le matériel : il fournit aux applications une interface standardisée quelque soit la marque des composants électroniques. Une des complexité d'un kernel vient de là et nous allons le découvrir. Pour cela, les concepteurs logiciels concoivent des interfaces logicielles, c'est à dire des fonctions et des structures qui ont toujours la même apparence (ou signature). Cela s'appelle l'abstraction, on rend générique ce qui est particulier. Ainsi, le bus I2C est abstrait au sein de Linux, les fonctions sont toujours les mêmes que le Kernel tourne sur un Raspberry PI ou un PC.

Il existe différents étages à abstraire : le processeur, les périphériques attachés à ce processeur et les composants électroniques reliés à ce bloc sur la carte électronique. Ainsi, une carte Raspberry PI offre un tout cohérent, toujours identique pour une carte donnée, et les personnes en charge de fournir une distribution (par exemple Raspberry OS) font en sorte de fournir tous les pilotes des composants soudés sur la carte.

Or, le Raspberry est ouvert au niveau de son connecteur d'extension : on peut donc étendre ses périphériques. Votre Raspberry PI OS ne le sait pas, il va donc falloir lui apprendre l'existence d'un éventuel nouveau périphérique attaché.

device tree et particularités de l'I2C

On parle ici d'overlay