Raspberry Pi e a GPU

- por Sergio Prado

Categorias: Linux, Raspberry Pi Tags: ,

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

  • Henrique Ribeiro

    Mais um post de muita qualidade. Ainda não tive tempo de criar meu próprio SO para o Rasp, mas está na fila de atividades aqui. :-) Abraços!

  • Cara, teu blog é muito bom. Informações de primeira, difícil de ver até em blogs gringos. Você podia fazer um canal no YouTube. A divulgação por vídeos é mais rápida e o seu trabalho estaria aberto para clientes em potencial.

  • Parabens Sergio, muito bom seus artigos, depois que encontrei esse blog estou lendo tudo…hehehe.
    continue assim :)

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.