# General Purpose Input/Output

Les ports GPIO (anglais : General Purpose Input/Output, littéralement Entrée-sortie à usage général) sont des ports d'entrées-sorties très utilisés dans le monde des microcontrôleurs, en particulier dans le domaine de l'électronique embarquée, qui ont fait leur apparition au début des années 1980. Elles sont placées sur un circuit électronique afin de communiquer avec des composants électroniques et circuits externes. Il peut s'agir de détecteurs ou senseurs pour capter des données, ou encore de contrôler des commandes.

## Utilisation

Un connecteur GPIO offre à une carte électronique la possibilité de communiquer avec d'autres circuits électroniques. Le GPIO est très présent dans les domaines de l'informatique, principalement embarquée, l'électronique, l'automatisme, la commande numérique, ou la robotique.
Dans les années 1980 il existait des cartes d'interfaces dédiées à ces ports.
* Carte GPIO du HP 82940A Series 80 (années 1980)
* Carte de contrôleur GPIO par ethernet
Elle est présente en tout premier lieu sur les cartes comportant des microcontrôleurs, comme l'Arduino et son Atmel AVR ou des cartes proches (PCDuino) ou certaines cartes d'essai à DSP comme les STM32 Nucleo de ST Microelectronics, également compatibles Arduino, ou encore les DSP eux-mêmes comme le TMS320C6474 de Texas Instruments, intègrent des connecteurs ou des instructions spécifiques pour le GPIO. Le Raspberry Pi dispose d'un connecteur GPIO depuis sa première version, lui permettant ainsi d'être utilisé à la fois en tant qu'ordinateur personnel, et à la fois en tant que carte contrôleur pour des applications purement électroniques, à l'image de Stellaris Launchpad.
Une grande partie des ordinateurs monocartes, orientées développement, comme les Arndale Board, Banana Pi, BeagleBoard, Cubieboard, Firefly, Odroid, OLinuXino, etc. intègrent elles aussi des séries de connecteurs GPIO.
Plus récemment, certaines cartes mère pour PC comme la carte Intel® NUC DE3815TYBE en comporte également.
* Connecteurs GPIO femelles d'une des cartes Arduino
* Le connecteur GPIO (broches) à gauche, sur un Raspberry Pi Modèle A
* Plan d'assignation des broches GPIO sur une carte Banana Pi
* Les broches sont en dessous, sur la Cubieboard pour l'insérer dans une carte ou une carte pour le développement.
* Carte d'extension de type Shield connecté directement sur les ports GPIO d'une Arduino.
* carte de développement compatible Arduino basée sur un STM32, des rangs de broches sont fournies, laissant choisir entre câbles mâles ou femelles selon les besoins.

## Programmation

Ces connecteurs sont gérés par les pilotes du noyau du système d'exploitation.
Linux reconnaît par exemple nativement les ports GPIO, une documentation complète est même disponible sur le site officiel du noyau et expose la façon de programmer des pilotes. Les ports sont également directement accessibles depuis leur export dans /sys/class/gpio/ via Sysfs, les rendant directement accessibles en ligne de commande shell.
Microsoft Windows intègre lui aussi des API de développement spécifiques pour la création de pilotes GPIO, la documentation MSDN donne des informations à ce sujet.

### Bibliothèques

En plus de la bibliothèque standard du noyau, il existe des bibliothèques spécialisées de plus haut niveau qui facilitent la programmation des connecteurs GPIO ou la gestion de périphériques standards. Certaines permettent également une portabilité sur des matériels au brochage compatible mais à l'architecture différente.
Le RaspberryPi, par exemple, dispose de WiringPi, une bibliothèque (en C) permettant de gérer les cartes d'extension les plus populaires de cette carte.
Comme sur les autres systèmes, il existe pour cette architecture des portages de l'API dans différents langages, comme RPi.GPIO pour le langage Python ou Pi4J pour le langage Java. Il est aussi envisageable pour certaines architectures d'utiliser directement les capacités du processeur.
Il est également possible de descendre d'un niveau dans les bibliothèques. Le système définit généralement une assignation générique aux connecteurs GPIO, les fonctions et noms de ses connecteurs sont définis par le pilote du contrôleur de ces connecteurs. On peut donc y accéder de façon générique, directement par l'API GPIO en utilisant le fichier d'entête (par exemple pour Linux : <linux/gpio.h>. Il est également possible dans certains cas de se baser sur les fichiers d'entête de registres spécifiques au contrôleur. Dans le cas par exemple d'un RaspberryPi utilisant un processeur Broadcom BCM 2835, où différents pilotes sont propriétaires et ne sont donc pas inclus dans le noyau, il s'agit de l'entête <bcm2835.h>. dans un code source en langage C.

## Capacités

Un connecteur GPIO peut être configuré pour jouer le rôle d'une entrée (réception d'un signal) ou d'une sortie (émission d'un signal). Lorsqu'il est configuré en tant que sortie, on peut écrire dans un registre interne afin de modifier l'état d'une sortie. Lorsqu'il est configuré en tant qu'entrée, on peut détecter son état en lisant le contenu d'un registre interne.
Un connecteur GPIO ne peut traiter que des signaux numériques, 1 ou 0, une connexion sur un support analogique nécessitera un CAN/CNA comme le MCP3008.
Les périphériques GPIO peuvent également produire des interruptions et des événements d'accès direct à la mémoire (EDMA).
Un connecteur GPIO est généralement alimenté en 3,3 Vcc et ne peut émettre que des courants de faible intensité, allant de 3 mA à 50 mA.