Raspberry Pi e a GPU
- por Sergio Prado
Nos últimos posts aprendemos sobre o processo de boot da Raspberry Pi, vimos como acessar sua console serial e desenvolvemos um sistema Linux do zero para ela.
Mas se você quiser desenvolver uma distribuição Linux customizada para a Raspberry Pi com suporte à vídeos HD, vai precisar compilar e instalar as bibliotecas de acesso à GPU. É o que faremos neste artigo!
Mas antes, um pouco de teoria.
A GPU
A GPU (Graphics Processing Unit ou Unidade Gráfica de Processamento) é uma CPU especializada em processar gráficos. Ela tem instruções específicas para trabalhar com gráficos que são muito mais eficientes que uma CPU comum. Sua capacidade de processamento é tão forte, principalmente quando falamos de instruções matemáticas, que é comum usá-la até para quebrar hashs de senhas!
Na Raspberry Pi temos o Soc BCM2835, que contém uma GPU VideoCore 4 da Broadcom, com aceleradores 2D (OpenVG) e 3D (OpenGL ES 2.0) integrados e capaz de codificar/decodificar vídeos H.264 em 1080p!
DRIVERS E BIBLIOTECAS
Como não temos o datasheet da GPU, precisamos do driver e das bibliotecas associadas para falar com ela. Até bem pouco tempo atrás, apenas o driver que roda em kernel space era liberado de forma open-source. Mas desde outubro as bibliotecas de acesso ao driver que rodam em user space foram liberadas de forma open source.
Nem toda comunidade FOSS ficou 100% satisfeita com isso, já que a inteligência da GPU esta no seu firmware (aquele arquivo start.elf da partição de boot), que ainda é fechado. De qualquer forma, já é uma boa conquista para um projeto que tem por trás um chip da Broadcom, conhecida historicamente por dificultar o trabalho da comunidade open source em seus chips Wi-Fi.
Este então é o stack gráfico completo fornecido pelo projeto da Raspberry Pi:
O driver da GPU já foi compilado de forma integrada à imagem do kernel. Só precisamos compilar as bibliotecas que conversam com o driver da GPU:
- Biblioteca OpenMAX para aplicações de áudio e vídeo.
- Biblioteca OpenGL ES para aplicações 3D.
- Biblioteca OpenVG para aplicações 2D.
- Biblioteca EGL para interface entre o kernel e as bibliotecas OpenGL e OpenVG.
Que tal agora um pouco de ação?
PREPARANDO O TERRENO
O primeiro passo é executar os procedimentos descritos no artigo “Como desenvolver um sistema Linux do zero para a Raspberry Pi“.
Você precisa também instalar o cmake (sistema de build de aplicação), utilizado para compilar as bibliotecas gráficas da Raspberry Pi:
$ sudo apt-get install cmake |
COMPILANDO AS BIBLIOTECAS
As bibliotecas estão disponíveis no repositório userland do projeto. Baixe e compile:
$ git clone https://github.com/raspberrypi/userland.git $ cd userland/ $ ./buildme |
Agora é só instalar na partição do rootfs da Raspberry Pi (troque o ponto de montagem se necessário):
$ sudo mkdir -p /media/ROOTFS/opt/vc $ sudo cp -a build/* /media/ROOTFS/opt/vc/ $ cd /media/ROOTFS/opt/vc/lib $ for f in $(ls *.so); do sudo ln -s ../opt/vc/lib/$f ../../../lib/$f; done |
APLICAÇÃO DE EXEMPLO
Vamos agora compilar uma aplicação de exemplo que usa a biblioteca OpenMAX para exibir um vídeo em 720p. Esta aplicação de exemplo esta disponível no repositório firmware do projeto.
Baixe o repositório e entre no diretório da aplicação de exemplo:
$ git clone git://github.com/raspberrypi/firmware.git $ cd firmware/hardfp/opt/vc/src/hello_pi |
Antes de compilar, no arquivo Makefile.include, adicione o parâmetro -lpthread na variável LDFLAGS:
LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lGLESv2 -lEGL -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -L../libs/ilclient -L../libs/vgfont -lpthread |
Agora compile (altere o parâmetro SDKSTAGE de acordo com o diretório que você clonou o repositório firmware):
$ make -C libs/ilclient CC=arm-linux-gnueabihf-gcc SDKSTAGE=/home/sprado/workspace/build/raspberrypi/firmware $ make -C hello_video CC=arm-linux-gnueabihf-gcc SDKSTAGE=/home/sprado/workspace/build/raspberrypi/firmware |
E copie a aplicação gerada e o vídeo de exemplo para a partição do rootfs da Raspberry Pi (mude o ponto de montagem se necessário):
$ sudo cp -a hello_video/hello_video.bin /media/ROOTFS/usr/sbin/ $ sudo cp -a hello_video/test.h264 /media/ROOTFS/root/ |
Antes de testar, verifique se você esta alocando memória suficiente para a GPU no arquivo config.txt que esta na partição de boot do cartão SD (128M deve ser suficiente):
gpu_mem=128 |
Agora é só iniciar a Raspberry Pi e testar o vídeo:
# hello_video.bin /root/test.h264 |
O vídeo de exemplo é o famoso desenho Big Buck Bunny! :)
Happy Big Buck Bunny!
Sergio Prado