GPIO no Linux: conceitos fundamentais e evolução da interface de usuário
GPIO (General-Purpose Input/Output) é um dos recursos mais básicos — e ao mesmo tempo mais críticos — em sistemas Linux embarcados. LEDs, botões, relés, sensores digitais e sinais de controle em geral passam inevitavelmente por linhas de GPIO. Apesar de sua simplicidade elétrica, o modelo de software para GPIO no Linux evoluiu significativamente, especialmente para corrigir problemas de concorrência, robustez e segurança em espaço de usuário.
Internamente, o kernel Linux organiza GPIOs por meio do framework gpiolib, que implementa um modelo claro de produtores e consumidores. Os produtores são os drivers das controladoras de GPIO (internas ao SoC ou expansores externos via I²C/SPI), enquanto os consumidores são drivers de dispositivos ou aplicações que utilizam essas linhas. Essa separação é fundamental para permitir que o kernel gerencie conflitos, reservas e configurações elétricas das linhas de forma consistente .
Durante muitos anos, o acesso a GPIOs em espaço de usuário foi feito via sysfs, através do diretório /sys/class/gpio. Essa interface era simples e funcionava bem para protótipos e scripts rápidos, mas apresentava limitações sérias: o GPIO não ficava associado ao ciclo de vida de um processo, múltiplos processos podiam acessar a mesma linha simultaneamente, e não havia suporte adequado a eventos, estados elétricos ou acesso atômico a múltiplos pinos. Esses problemas se tornaram evidentes à medida que sistemas Linux embarcados passaram a operar como sistemas concorrentes reais, e não apenas como “Linux com LED piscando”.
A partir do kernel Linux 4.8, o sysfs foi oficialmente declarado obsoleto para GPIO, dando lugar a uma nova interface baseada em dispositivos de caractere (/dev/gpiochipX). Essa mudança não é apenas estética: ela traz um modelo de uso muito mais próximo da filosofia Unix moderna, no qual GPIOs são recursos de kernel associados a descritores de arquivo, com controle de posse, suporte a polling, eventos confiáveis, configuração elétrica e operações em lote. É essa nova interface que fundamenta todas as ferramentas modernas de manipulação de GPIO no Linux e que será o foco deste artigo .
Nos próximos tópicos, vamos sair da teoria e entrar na prática: primeiro utilizando ferramentas de shell baseadas na libgpiod, e depois avançando para controle programático em Python, sempre com exemplos claros, comparações com o modelo antigo e comentários sobre boas e más práticas em sistemas de produção.