Accès aux GPIOs

Présentation générale

Depuis la version 4.8 du noyau Linux, les GPIOs (General Purpose Input Output) sont manipulables à travers l’interface de programmation Libgpiod.

Celle-ci est constituée d’une librairie en langage C et d’un ensemble d’outils en ligne de commande pour contrôler les GPIOs.

Elle permet l’accès aux broches d’entrée/sortie via le système de fichiers devtmpfs monté sur le répertoire /dev. On y trouve une entrée par contrôleur hardware de GPIO.

Illustration
pi@rpi:~ $ uname -a
Linux rpi-prof 6.6.31+rpt-rpi-v7 #1 SMP Raspbian 1:6.6.31-1+rpt1 (2024-05-29) armv7l GNU/Linux
pi@rpi:~ $ ls /dev/gpiochip* -l
crw-rw----+ 1 root gpio 254, 0 Sep 13 17:57 /dev/gpiochip0
crw-rw----+ 1 root gpio 254, 1 Sep 13 17:57 /dev/gpiochip1
  • Libgpiod est conçu pour remplacer l’ancienne interface sysfs pour GPIO, qui est désormais dépréciée

  • Un binding Python existe pour Libgpiod (→ python3-libgpiod)

  • Libgpiod et son binding Python sont installés par défaut dans Raspberry Pi OS version “Bookworm”

Outils en ligne de commande de Libgpiod

Lgpiod propose 6 outils en ligne de commande :

gpiodetect

Liste tous les contrôleurs hardware de GPIO présents sur la machine, affiche leur nom et le nombre de GPIOs qu’ils contrôlent

Exemple :
pi@rpi:~ $ gpiodetect
gpiochip0 [pinctrl-bcm2835] (54 lines) (1)
gpiochip1 [raspberrypi-exp-gpio] (8 lines) (1)
1 Sur la Raspberry Pi, il y a 2 contrôleurs — gpiochip0 et gpiochip1 — nommés “pinctrl-bcm2835” et “raspberrypi-exp-gpio”. Ceux-ci gérent respectivement 54 et 8 broches GPIO
gpioinfo

Affiche des informations sur les broches pilotées par un ou l’ensemble des contrôleurs GPIO

Exemple: Infos sur les broches pilotées par gpiochip0
pi@rpi:~ $ gpioinfo gpiochip0
gpiochip0 - 54 lines:
[...]
        line  26:     "GPIO26"       unused   input  active-high (1)
        line  27:     "GPIO27"     "foobar"  output  active-high [used] (2)
        line  28: "HDMI_HPD_N"        "hpd"   input   active-low [used]
        line  29: "STATUS_LED_G" "ACT" output active-high [used]
[...]
1 la broche 26, nommée “GPIO26”, est configurée en entrée (→ input), est active à l’état haut (→ active-high) mais n’est pas utilisée en ce moment (→ unused)
2 la broche 27, nommée “GPIO27”, est configurée en sortie (→ output), est active à l’état haut (→ active-high) et est actuellement utilisée (→ used) par un processus qui se fait appelé “foobar”.
gpioget

Lit l’état d’une broche GPIO

Exemple:
pi@rpi:~ $ gpioget gpiochip0 26 (1)
0 (2)
1 Lecture de l’état de la broche 26 de gpiochip0
2 Le niveau logique sur la broche est actuellement ‘0’
gpioset

Applique un niveau logique sur une broche et le maintient jusqu’à la fin d’exécution de la commande

Exemple:
pi@rpi:~ $ gpioset -m time -s 5 gpiochip0 27=1 (1)
1 Positionne la broche 27 au niveau logique 1 (→ 27=1) pendant 5s (→ -m time s 5)
gpiofind

Cherche le nom du contrôleur en charge du pilotage d’un signal ainsi que son offset/identifiant

Exemple
pi@rpi:~ $ gpiofind GPIO14 (1)
gpiochip0 14
1 Le signal nommé GPIO14 est piloté par le contrôleur gpiochip0 et son offset/identifiant est 14
gpiomon

Permet d’afficher ou d’attendre les événements (front montant ou descendant) se passant sur une ou plusieurs broches d’entrée.

pi@rpi:~ $ gpiomon -n 2 gpiochip0 22 (1)
event:  RISING EDGE offset: 22 timestamp: [   16923.047538775] (2)
event: FALLING EDGE offset: 22 timestamp: [   16926.439980109] (3)
1 Attend 2 évènements (→ -n 2) sur la broche 22 du contrôleur gpiochip0
2 Un front montant (→ _RISING EDGE`) se produit sur la broche 22 à environ 4h42'03" (→ 16923.047538775s) après le démarrage de la Raspberry Pi
3 Un front montant (→ _RISING EDGE`) se produit sur la broche 22 à environ 4h42'06" (→ 16926.439980109s) après le démarrage de la Raspberry Pi

🞄  🞄  🞄