J’ai récemment réalisé le Proof of Concept de projet d’un client utilisant Linux embarqué. Dans ce cadre, j’ai utilisé le bus I2C de mon nouveau Raspberry-Pi 4. Malheureusement le bus i2c n’était pas fonctionnel par défaut. Voici comment l’activer et l’utiliser avec Buildroot, la procédure est très similaire sous Raspbian :
Configurer le firmware du Raspberry-Pi 4 pour activer le bus i2c
Par défaut tous les bus non indispensables (i2c, SPI, etc) sont désactivés sur le Raspberry-Pi. Il faut donc commencer par configurer son firmware pour qu’il active le bus i2c-1 via le fichier config.txt
Ce fichier est présent sur la partition de boot de la carte SD, mais le plus efficace reste de l’activer directement dans le package rpi-firmware dans buildroot. Pour cela, éditez le fichier package/rpi-firmware/config.txt depuis le dossier de sources de Buildroot et ajoutez-y cette ligne.
dtparam=i2c1=on
Sur Raspbian, vous trouverez ce fichier directement dans /boot/config.txt. Vous pouvez simplement faire la modification, redémarrer puis passer à l’étape suivante.
Le fichier config.txt est l’équivalent du BIOS sur un PC. Il vous permet de configurer le système.
Maintenant il vous faut recompiler le package rpi-firmware :
make rpi-firmware-rebuild
Puis, vous devez générer votre l’image de la carte Micro-SD du Raspberry-pi :
make
Flashez le firmware sur la carte et démarrez le Raspberry-pi 4
Ajouter manuellement les modules manquants pour le activer le bus i2c du Raspberry-pi
Le Processeur du Raspberry-Pi 4 est un Broadcom 2711, il réutilise un certain nombre de modules qui étaient déjà présents dans des versions plus anciennes du SoC (Système on Chip, processeur multifonctions), dont le bcm2835. Pour cette raison vous pouvez charger les modules suivants. Par défaut les modules nécessaires sont présents sur le système donc il ne reste plus qu’à les démarrer manuellement:
modprobe i2c-bcm2835
modprobe i2c-dev
[ 37.740438] i2c /dev entries driver
Maintenant, vous devriez trouver le bus i2c-1 dans /dev :
ls -la /dev/i2c-1
crw------- 1 root root 89, 1 Jan 18 15:19 /dev/i2c-1
Le bus i2c-1 est maintenant utilisable, il dispose des fonctions nécessaires pour utiliser vos périphériques I2C, mais également pour SMBus (l’ancêtre d’i2C):
# i2cdetect -F 1
Functionalities implemented by bus #1
I2C yes
SMBus quick command yes
SMBus send byte yes
SMBus receive byte yes
SMBus write byte yes
SMBus read byte yes
SMBus write word yes
SMBus read word yes
SMBus process call yes
SMBus block write yes
SMBus block read no
SMBus block process call no
SMBus PEC yes
I2C block write yes
I2C block read yes