Programando Raspberry Pi em baixo nível em C - Bibliotecas

Na postagem anterior detalhei como fazer acessos de entrada / saída na GPIO em baixo nível. Existem algumas bibliotecas na internet que facilitam este acesso e não deixam de ser um acesso em baixo nível trabalhando através de funções. Neste caso eu destaco duas, uma mais simples e outra mais completa, a do site Muddy Engineer e a mais famosa do Mike McCauley que curiosamente leva o nome do processador do RPi BCM2835.


Biblioteca Muddy Engineer

A primeira é bem mais simples e trabalha apenas definindo os pinos como entrada e saída. Ela possui apenas 4 funções bem intuitivas que vão de encontro a linguagem Wiring muito usada no Arduino.

As funções são:

void pioInit();
// Inicializa mapeando a memoria
void pinMode(const int pin, int function);
// Inicializa o pino em:
// entrada = 0
// saída = 1
// ALT's = 2-7
void digitalWrite(const int pin, int val);
// Coloca o pino em nível alto
int digitalRead(const int pin);
// Lê e retorna o valor do pino

No cabeçalho (arquivo.h) existe definições de endereço de memoria, pino e algumas macros para ajudar ainda mais.

Um simples programa que lê o valor no GPIO3 e escreve no GPIO18 ficaria assim:




Sendo a biblioteca chamada de gpio_driver e o arquivo principal de main, para compilar em linha de comando basta usar o código:

gcc -o main main.c gpio_driver.c

Para a execução use o sudo antes já que o usuário comum não tem acesso ao /dev/mem

Biblioteca Mike McCauley

A biblioteca do McCauley é bem mais completa e pode controlar até clock e pwm, apesar de ótima pelo tamanho acho que fica devendo em uma boa documentação.

A unica documentação que encontrei fica dentro do proprio arquivo de cabeçalho bcm2835.h. Este arquivo é uma boa fonte de estudos porque além das funções disponiveis comentadas ele possui varias definições de constantes de endereços de memoria que não são encontradas nem no proprio manual do processador BCM2835.

Para usar essa biblioteca existe pequenas particularidades, primeiro precisamos instalar ela. A instalação é bem simples e o processo está na pagina principal em instalation. Primeiro baixe a ultima versão, o link está logo no inicio do texto em "The version of the package that this documentation refers to can be downloaded from...".

Execute os comandos abaixo substituindo xx pelo numero da versão baixada que está no arquivo .tar.gz .

tar zxvf bcm2835-1.xx.tar.gz
cd bcm2835-1.xx
./configure
make
sudo make check
sudo make install

Abaixo segue um exemplo para piscar um LED no pino 7 (GPIO4), onde a definição RPI_GPIO_P1_07 indica o pino 7 que equivale a GPIO4. Já a definição BCM2835_GPIO_FSEL_OUTP indica que o pino será saída.



Neste outro exemplo é usado outras duas funções (set e clr) para fazer o mesmo trabalho que a write fez no exemplo anterior:




Para compilar vem a segunda particularidade, é necessário adicionar o argumento -lbcm2835 na linha de comando:

gcc -o main main.c -lbcm2835

Para a execução, novamente use o sudo antes já que o usuário comum não tem acesso ao /dev/mem

Da para ver que as possiblidades de uso dessa biblioteca são bem grandes e o ideal é vasculhar com calma as funções disponiveis pelo arquivo bcm2835.h, este arquivo está no pacote tar.gz na pasta scr.

Um livro que abrange bem essas funções é o Raspberry Pi IOT in C disponível gratuitamente para ser lido na web (link abaixo).

Referencias:
https://www.muddyengineer.com/2016/11/c-programming-raspberry-pi-2-gpio-driver/
https://www.iot-programmer.com/index.php/books/17-raspberry-pi-and-the-iot-in-c
https://www.amazon.com.br/Linux-Programming-Interface-System-Handbook/dp/1593272200

Comentários