Manual

do

Maker

.

com

Como usar a libgpiod no Raspberry

Como usar a libgpiod no Raspberry

Gosto bastante de novidades, mas algumas mudanças não me deixam tão eufórico. Foi o caso do nome de interface de rede preditivo, que tinha a intenção de ser intuitivo. Só não sei intuitivo pra quem, porque o usuário precisa sempre digitar "ifconfig" para saber o nome da interface, que outrora fora eth0, wlan0 etc. Mas desde o kernel 4.8 o sysfs estava de sobreaviso, então nem dá pra lamentar tanto. A Adafruit anunciou isso em Novembro de 2018, então não se espante, não é uma novidade, e nesse artigo veremos como usar a libgpiod no Raspberry superficialmente.

O sysfs

O sysfs é um pseudo sistema de arquivos que faz ponte a informações de diversos subsistemas do kernel, dispositivos e drivers associados ao kernel, disponibilizando-os no chamado "user space".

Com o sysctl temos acesso a /proc/sys, onde podemos interagir com alguns parâmetros.

Ainda hoje podemos interagir com os GPIO através de shell script acessando /sys/class/gpio, como mostro intensamente em meu curso de Raspberry na Udemy. Um ponto negativo é que não temos controle sobre o pullup pelo shell, por exemplo, mas nada que desmereça o recurso por linha de comando. E não é realmente necessário que manipulemos diretamente desse modo, desde que haja um programa para interagir pelo shell.

libgpiod

A libgpiod, que substitui o acesso ao GPIO pelo sysfs, é o novo método para ler, escrever e monitor o GPIO de diversas placas Linux, substituindo os dois principais métodos que temos hoje; o sysfs e devmem.

O primeiro método é desajeito e incompleto, o segundo dá um trabalho extra no baixo nível. Tem a questão de segurança, uma vez que o processo precisa ser rodado como root.

Me perdoe a falta de empolgação, mas ainda precisarei me habituar.  Enfim, conforme o blog da Adafruit, o ganho em velocidade é bem maior usando a libgpiod em relação ao sysfs.

A partir de então, usaremos uma outra interface da qual não vou entrar em detalhes senão terei que explicar mostrando flags nos arquivos descritores do sistema e vai ficar bem chato o assunto. Basicamente, através do novo recurso (um dispositivo de caractere)  teremos acesso no espaço do usuário de uma forma mais segura, além de adicionar recursos que não estavam presentes no sysfs, como por exemplo polling ajuste de mútiplos valores por vez e controle de pullup/pulldown.

Essa é a documentação do kernel relacionada à libgpiod.

Hoje ( na verdade, desde o kernel 4.16)  já temos nos repositórios do Raspbian o pacote gpiod e libgpio-dev. O primeiro, para interação por linha de comando. Outra forma de instalá-lo é utilizando esse script da Adafruit, que faz a instalação do que for necessário:

wget -c wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/libgpiod.sh
chmod 700 libgpiod.sh
sudo ./libgpiod.sh

No final, teremos uma série de programas para interagir com o GPIO, como vemos a seguir.

Usando a libgpiod no Raspberry

Teremos a partir da instalação, os comandos:

gpiodetect

Lista todos os GPIO presentes no sistema, nomes, rótulos e númerode linha de GPIO.

libgpio-gpiodetect-300x95.webp

 

gpioinfo

Lista todas as linhas de GPIO, nomes, consumidores, direção, estado e flags adicionais. Já é um formato a lá "ps ax".

libgpiod-gpioinfo.webp

gpioget

Lê valores de uma linha especificada. Com o detect vimos os gpiochip0 e gpiochip1 do Raspberry. Para pegar valores únicos, múltiplos e/ou com estado "active low", usamos:

libgpio-gpioget.webp

gpioset

Com gpioset, bem; set...

"Futucando" os pinos 23 e 24:

libgpiod-gpioset-1.webp

Consultando com gpioinfo:

libgpiod-gpioset-2.webp

E para aguardar três bordas:

libgpio-event.webp

O legal é que assim podemos aguardar um evento.

libgpiod no Raspberry (bindings)

Temos APIs para C++ e Python3 (sysfs está de mãos dadas com o Python2.7). Se não tiver o pip instalado, comece por aí:

sudo apt-get install python3-pip
sudo pip3 install gpio-next trio-gpio

O trio-gpio depende da versão 3.6 do Python. Já o gpio_next podemos testar assim:

libgpiod-gpio_next-python.webp

 

Aqui você vê a apresentação usada por Bartosz Golaszewski.

Caso esteja impossibilitado de ler o material acima disposto, vou só pegar um código de exemplo utilizado na apresentação dele para comentar aqui:

struct gpiod_chip *chip;
struct gpiod_line *line;
int rv, value;
chip = gpiod_chip_open("/dev/gpiochip0");
if (!chip)
 return -1;
line = gpiod_chip_get_line(chip,3);
if (!line) {
 gpiod_chip_close(chip);
 return -1 
}
rv = gpiod_line_request_input(line, “foobar”);
if (rv) {
 gpiod_chip_close(chip);
 return -1;
}
value = gpiod_line_get_value(line);
gpiod_chip_close(chip)

Pra quem está habituado com Linux, já deve ter notado na chamada gpiod_chip_open  que o GPIO agora é um dispositivo de caractere, como pode ser visto a seguir de maneira mais simplificada:

libgpiod-char.webp

O documento tem montes de exemplo ricos em informação, baixe e leia quando possível.

Como mostrei alguns exemplos por linha de comando, acredito que tenha ajudado na compreensão do código em C, que basicamente necessita das mesmas informações. Logo mais faço uns artigos interessantes a respeito. Tem muito mais a falar sobre essa nova forma de usar GPIO, sobre drivers etc.

Pra finalizar, não há necessidade de alarde, não fiquemos em polvorosa também, porque acabou de sair um sistema e deve levar mais umas duas versões para não termos mais a API do sysfs. Mas é legal já ir se habituando com a nova API.

  Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.