Utilisation des commandes i2c-tools sous Linux pour l'embarqué

Dans l'écosystème Linux embarqué, notamment sur les architectures ARM, la suite logicielle i2c-tools est indispensable pour déboguer et interagir avec les périphériques connectés au bus I2C. Cet article détaille l'usage des principales commandes : i2cdetect, i2cdump, i2cget, i2cset et la commande plus récente i2ctransfer.

1. i2cdetect : Identificasion du bus et des périphériques

Cette commande permet de lister les bus I2C disponibles sur le système et de scanner les adresses des esclaves connectés.

Lister les adaptateurs I2C

# Lister tous les bus I2C actifs
i2cdetect -l

Exemple de sortie :

i2c-1   i2c             bcm2835 I2C adapter                     I2C adapter
i2c-2   i2c             i2c-gpio                                I2C adapter

Scanner un bus spécifique

Pour scanner le bus numéro 1 et identifier les adresses occupées (l'option -y désactive la confirmation interactive) :

i2cdetect -y 1

Dans la matrice résultante, UU indique qu'un pilote noyau utilise déjà ce périphérique, tandis qu'une valeur hexadécimale (ex: 48) indique un périphérique détecté mais libre d'accès manuel.

2. i2cdump : Lecture complète des registres

i2cdump est utilisé pour obtenir une vue d'ensemble de l'état d'un composant en affichant l'intégralité de sa carte des registres.

# Syntaxe : i2cdump [-f] [-y] BUS ADRESSE [MODE]
# Exemple : Dump du périphérique à l'adresse 0x50 sur le bus 1
i2cdump -y 1 0x50

L'affichage présente les données sous forme de tableau hexadécimal, ce qui facilite la vérification des configurations globales d'un capteur ou d'une EEPROM.

3. i2cget : Lecture ponctuelle d'un reigstre

Pour lire la valeur d'un registre spécifique, on utilise i2cget. C'est l'outil idéal pour vérifier l'état d'un flag ou la valeur d'une mesure.

# Lire le registre 0x05 du périphérique 0x48 sur le bus 1
i2cget -y 1 0x48 0x05

Il est possible de spécifier le mode de lecture (octet par défaut b, ou mot de 16 bits w) :

# Lecture d'un mot (16 bits)
i2cget -y 1 0x48 0x10 w

4. i2cset : Modification d'un registre

i2cset permet d'écrire une valeur dans un registre cible. Attention, une mauvaise manipulation peut perturber le fonctionnement du matériel.

# Écrire la valeur 0x01 dans le registre 0x0A du périphérique 0x48
i2cset -y 1 0x48 0x0A 0x01

Pour vérifier l'écriture, on enchaîne généralement avec une lecture :

# Vérification immédiate
i2cset -y 1 0x48 0x12 0xFF && i2cget -y 1 0x48 0x12

5. i2ctransfer : Transactions complexes et adressage 16 bits

Les commandes classiques (get/set) sont souvent limitées à des adresses de registres sur 8 bits. Pour les composants modernes comme certaines EEPROM ou capteurs complexes nécessitant des adresses sur 16 bits, i2ctransfer est requis.

Lecture avec adressage 16 bits

Pour lire 4 octets à partir de l'adresse de registre 0x2001 sur un composant d'adresse I2C 0x50 :

# w2 : écrire 2 octets (l'adresse du registre)
# r4 : lire 4 octets
i2ctransfer -y 1 w2@0x50 0x20 0x01 r4

Écriture multiple

Pour envoyer une séquence de données à un périphérique :

# Écrire 0xAA 0xBB à l'adresse mémoire 0x0010
i2ctransfer -y 1 w4@0x50 0x00 0x10 0xAA 0xBB

i2ctransfer est extrêmement puissant car il permet de combiner plusieurs messsages (lecture et écriture) au sein d'une même transaction I2C, garantissant ainsi l'atomicité de l'opération sur le bus.

Étiquettes: Linux I2C Embedded-Systems ARM Kernel

Publié le 11 juin à 20h23