MCU & FPGA SBC Manipulação de GPIO no Linux Embarcado: Shell e Python com libgpiod

Manipulação de GPIO no Linux Embarcado: Shell e Python com libgpiod


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.

Related Post