Manipulando GPIOs no Linux via Shell com libgpiod
Com a introdução da nova interface de GPIO baseada em character devices, o uso direto de comandos como echo e cat deixou de ser adequado. Para preencher essa lacuna — especialmente para depuração, testes e automação — surgiu o conjunto de ferramentas de linha de comando da libgpiod, que permite interagir com GPIOs de forma segura, robusta e alinhada ao modelo moderno do kernel Linux .
O primeiro passo ao trabalhar com GPIOs nesse modelo é identificar as controladoras disponíveis no sistema. Cada controladora é exposta como um dispositivo /dev/gpiochipX. Para isso, utilizamos o comando:
gpiodetect
Esse comando lista todas as controladoras de GPIO registradas no kernel, exibindo seu nome lógico e a quantidade de linhas disponíveis. Em sistemas embarcados, é comum ver múltiplos gpiochips, correspondendo a diferentes bancos internos do SoC ou a expansores externos conectados via I²C ou SPI. Essa identificação por chip elimina a fragilidade dos números globais de GPIO usados no sysfs antigo.
Uma vez identificado o gpiochip de interesse, o próximo passo é inspecionar suas linhas individualmente. Isso é feito com o comando:
gpioinfo gpiochip0
O gpioinfo fornece uma visão extremamente rica: cada linha é listada com seu índice local, nome simbólico (se existir), direção (entrada ou saída), polaridade elétrica (active-high ou active-low) e estado de uso. Essa informação é fundamental para evitar conflitos, pois permite saber se uma linha já está sendo utilizada por outro driver ou aplicação — algo que simplesmente não era confiável no modelo sysfs.
Para acionar um GPIO como saída, utilizamos o comando gpioset. Por exemplo, para ligar a linha 0 do gpiochip7, fazemos:
gpioset gpiochip7 0=1
Aqui há dois pontos importantes. Primeiro, o GPIO fica associado ao processo que executa o comando; quando o processo termina, o kernel automaticamente libera a linha. Segundo, o gpioset permite configurar múltiplas linhas de uma só vez, garantindo operações atômicas — algo essencial em aplicações que controlam barramentos ou sinais correlacionados.
Para ler o estado de um GPIO configurado como entrada, usamos o comando complementar:
gpioget gpiochip7 0
Esse comando retorna 0 ou 1, respeitando a polaridade configurada da linha. Diferente do sysfs, essa leitura é feita através de uma chamada única ao kernel, sem a sobrecarga de múltiplos acessos a arquivos virtuais.
Quando o objetivo é monitorar eventos, como bordas de subida ou descida (interrupções), a ferramenta correta é o gpiomon. Por exemplo:
gpiomon gpiochip0 7
Nesse modo, o processo entra em espera bloqueante e recebe notificações confiáveis sempre que o estado da linha muda. O kernel garante que os eventos não sejam perdidos, resolvendo um dos maiores problemas históricos do uso de GPIO via polling no sysfs. Essa abordagem é ideal para botões, sensores digitais e sinais de sincronismo.
Do ponto de vista de engenharia de software embarcado, essas ferramentas cumprem dois papéis essenciais. Primeiro, servem como instrumentos de diagnóstico e validação elétrica do hardware. Segundo, funcionam como um modelo conceitual direto para o que será implementado em código C, C++ ou Python, já que todas essas ferramentas são apenas wrappers da API da libgpiod .
Na próxima seção, vamos sair do terminal e entrar no código, demonstrando como controlar GPIOs em Python, utilizando os bindings oficiais da libgpiod, com exemplos claros e estruturados para aplicações reais em Linux embarcado.