🛠 Activer I2C, SPI et UART sur le BPI-CM4 : env.txt ou armbianEnv.txt
Objectifs
Sur le BPI-CM4, les bus du header 26 broches ne sont pas tous actifs par défaut, et le mécanisme dépend de l'image : les images vendor (BSP 4.9) utilisent /boot/env.txt avec une ligne overlays="..." et des .dtbo dans /boot/overlays/, tandis qu'Armbian (noyau mainline ≥ 6.4) utilise /boot/armbianEnv.txt et armbian-config. Vous allez activer I2C1 (GPIOX_17/18), SPI_A (GPIOX_8 à 11) et UART_B (GPIOX_6/7), puis vérifier chaque bus. Attention : le fork WiringPi/RPi.GPIO du vendor ne fonctionne que sur le BSP ; sur mainline, on travaille avec i2c-tools, spidev et libgpiod.
Matériel
- BPI-CM4 + carrier BPI-CM4IO
- Image vendor Debian 10 / Ubuntu 20.04 ou Armbian bananapicm4io
- Optionnel : convertisseur de niveau — le rail VDDIO_C des banques GPIOX est configuré en 1,8 V ou 3,3 V selon le montage, le wiki ne garantit jamais du 5 V
Code complet
# --- Image vendor BSP (noyau 4.9) ---
sudo sed -i 's/^overlays=.*/overlays="i2c2 spi0 uart1 wifi_bt_rtl8822cs"/' /boot/env.txt
ls /boot/overlays/ # vérifier les noms de .dtbo disponibles
sudo reboot
# --- Armbian (mainline) ---
grep -E '^(overlay_prefix|overlays)' /boot/armbianEnv.txt
sudo armbian-config # System > Hardware > cocher i2c / spi / uart
sudo reboot
# --- Vérification des trois bus ---
sudo apt install -y i2c-tools gpiod
i2cdetect -l # lister les contrôleurs
ls -l /sys/class/i2c-dev/ | cat # mapper /dev/i2c-N -> nom du contrôleur
ls /dev/spidev* 2>/dev/null
gpioinfo | grep -i -e spi -e uart # broches revendiquées par un pilote
Vérification attendue
Après reboot : un /dev/i2c-N de plus correspondant au contrôleur du header (sur mainline, le contrôleur &i2c2 des broches GPIOX_17/18 n'a pas d'alias — son numéro dépend de l'énumération, d'où la lecture de /sys/class/i2c-dev/), un /dev/spidevX.Y pour SPI_A, et UART_B disponible sur un ttyAMLx/ttySx. Les broches utilisées par un bus apparaissent « used » dans gpioinfo.
Erreurs fréquentes
- Modifier /boot/config.txt comme sur un Raspberry Pi : ça n'existe pas ici, c'est env.txt (vendor) ou armbianEnv.txt (Armbian).
- Compter sur le WiringPi Dangku sous Armbian : il exige le noyau 4.9 BSP et échoue sur mainline.
- Durcir le numéro /dev/i2c-2 dans un script : sur mainline le bus du header n'est pas aliasé, le numéro peut bouger — toujours le résoudre via /sys/class/i2c-dev/.
- Confondre avec les bus internes du carrier : l'alias i2c0 pointe vers le contrôleur caméra, i2c1 vers le bus tactile DSI — pas vers le header.
- Brancher un module 5 V sans vérifier le niveau réel de la banque GPIOX (rail VDDIO_C 1,8/3,3 V).
Autres tutoriels pour cette carte
- Monter le module BPI-CM4 sur son carrier et réussir le premier boot
- Apprivoiser les LED et la touche ADC du carrier CM4IO
- Mesurer le stockage du BPI-CM4 : eMMC, microSD et le palier NVMe
- Brancher un capteur BME280 sur l'I2C1 du carrier (GPIOX_17/18)
- Déplacer le rootfs sur un SSD NVMe via le port mini-PCIe
- Exploiter le NPU 5 TOPS de l'A311D pour l'inférence embarquée
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash