Raspberry Pi + Qt5 + Yocto - parte 1

Raspberry Pi usando Qt5
Este post faz parte da série Raspberry pi + Qt5 + Yocto. Leia também os outros posts da série:

Nesta série de artigos sobre o uso do Yocto Project veremos como criar uma distribuição Linux embarcado com o Qt5 para a Raspberry Pi usando seu acelerador gráfico VideoCore IV. Na segunda parte veremos como gerar um SDK e integrá-lo ao QtCreator para que possamos desenvolver e compilar aplicações para o nosso target. Se você ainda não teve contato com o Yocto, sugiro que faça o tutorial do Henrique Rossi sobre Beaglebone Black + Yocto.

 

Anteriormente foi publicada uma série  para a Beaglebone Black, porém usando a versão QtEmbedded (Qt4).

 

Umas das principais evoluções do Qt5 em relação ao Qt4 é o melhor uso da GPU, dentre outras características.

 

 

 

 

Preparando o Host

 

O Yocto Project suporta oficialmente as seguintes distribuições GNU/Linux como ambiente de construção:

  • Ubuntu 12.04, 13.10 e 14.04
  • Fedora 19 e 20 
  • CentOS 6.4 e 6.5
  • Debian 7.0, 7.1, 7.2, 7.3 e 7.4
  • openSUSE 12.2, 12.3 e 13.1

 

Para que ele execute no Host alguns pacotes necessitam ser instalados.

 

Ubuntu e Debian:

 

Fedora:

 

openSUSE:

 

CentOS:

 

 

Montando o Ambiente de construção

 

Vamos criar os diretórios e baixar os fontes necessários:

 

Note que estamos usando a versão "daisy" do Yocto Project. E baixamos também o layer meta-raspberrypi que possui o BSP (Board Support Package) com os fontes necessários (bootloader, kernel, bibliotecas para o acelerador gráfico, etc.) para rodar a nossa distribuição na Raspberry pi. Além disso iremos utilizar os layers meta-qt5 (que possuem as receitas para compilar o Qt5), meta-openembedded (com aplicativos adicionais) e o meta-embarcados (com as customizações necessárias para gerarmos a imagem de testes).

 

Agora vamos configurar o ambiente para gerarmos os artefatos de software:

 

Edite o arquivo ~/yocto/build-daisy/conf/bblayers.conf  para que fique da seguinte maneira:

 

O arquivo bblayers.conf configura quais serão as camadas a serem consideradas pelo sistema de build.

 

Adicione as seguintes variáveis no começo do arquivo ~/yocto/build-daisy/conf/local.conf

 

Note que configuramos nossa machine como sendo a raspberrypi (serve tanto para os modelos A, B e B+), mudamos o diretório de download para podermos reutilizar os fontes baixados em outros projetos e usaremos o gerenciador de pacotes ipk (ele é mais indicado para sistemas embarcados porque não exige muitos recursos para funcionar). Além disso configuramos a GPU para usar 128MB de memória RAM.

 

 

Gerando a imagem com Qt5

 

Depois de baixado os fontes e ter configurado o sistema de build , vamos gerar uma imagem com diversos aplicativos de demostração (qt5-image-demo) do Qt5 (no momento de escrita desse artigo a versão do Qt utilizada é a 5.3.2).

 

Esta é a configuração de build que foi utilizada:

 

 

Gravando a imagem

 

A camada meta-raspberrypi possui uma classe que implementa a construção da imagem do sistema a ser gravada diretamente em um SDcard.

 

O Yocto gerou a imagem do SDcard que está disponível em: ~/yocto/build-daisy/tmp/deploy/images/raspberrypi/. De posse desse arquivo podemos gravá-lo no SDcard.

 

Insira um SDcard card no computador PC ou notebook (sistema host) e descubra qual o device node criado pelo sistema operacional. Tente um dos seguintes comandos:

 

Caso, por exemplo, o device node criado seja /dev/sdb, use o seguinte comando:

 

 

Testando a imagem

 

Remova o SDcard do computador e insira-o na Rpi, conecte-a a uma TV por um cabo HDMI, e a um mouse através do conector USB da placa. Você precisará acessar o sistema via conexão serial. Para fazer a conexão entre o HOST e a Rpi siga os passos dessa wiki.

 

Abaixo segue o log da serial depois do boot do sistema:

 

 

Vamos rodar o Qt5 Cinematic Experience que é um exemplo bastante interessante que visa explorar diversos recursos usando aceleração gráfica por hardware. Para isso faça o login como root e execute o programa: 

 

Note que subimos o aplicativo com a opção "-platform eglfs", isso configura o Qt para utilizar o OpenGL através do pluging EGLFS.

 

A figura 1 mostra um screenshot do Qt5 Cinematic Experience.

 

Raspberry Pi usando Qt5
Figura 1 - Qt5 Cinematic Experience

 

Agora vamos rodar o exemplo do QtSmartHome:

 

A figura 2 mostra um screenshot do QtSmartHome:

 

Raspberry Pi usando Qt5
Figura 2 - QtSmartHome

 

Agora vamos rodar o exemplo Qt5EveryWhereDemo:

 

A figura 3 mostra um screenshot do Qt5EveryWhereDemo:

 

Raspberry Pi usando Qt5
Figura 3 - Qt5EveryWhereDemo

 

Aproveite para explorar os diversos exemplos presentes no caminho /usr/share/qt5 e lembre-se de sempre passar a opção "-platform eglfs" quando carregar os programas.

 

 

Dicas e Truques

 

Para remover o cursor piscante na tela rode o comando:

 

Para desabilitar o desligamento da saída de vídeo rode o comando:

 

 

O que vem por aí

 

Na próxima parte veremos como gerar uma toolchain com o Qt5 para ser integrada a IDE QtCreator para desenvolvimento e compilação das aplicações Qt.

 

 

Saiba mais

 

Embedded Linux Build Systems

Desvendando Yocto Project – Primeiros passos

Raspberrypi + Yocto

 

 

Outros artigos da série

Raspberry Pi + Qt5 + Yocto – parte 2 >>
Este post faz da série Raspberry pi + Qt5 + Yocto. Leia também os outros posts da série:

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Diego Sueiro
Formado em Engenharia de Controle e Automação pela UNIFEI e CEO do Embarcados, atualmente trabalho na Inglaterra com Desenvolvimento de Sistemas Linux Embarcado Real Time. Sou consultor e desenvolvedor de software para Sistemas Embarcados com vasta experiência em projetos com processadores de 8bits a 32bits, sistemas bare metal, RTOS, Linux Embarcado e Android Embarcado. Um apaixonado por Pink Floyd e Empreendedorismo.

59
Deixe um comentário

avatar
 
18 Comment threads
41 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
Vinicius MacielMichaeljoël maranhãoMarcelo AnjosFernando de França Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
trackback

[…] see excellentembarcados tutorial here […]

Vinicius Maciel
Visitante
vinifr

Ola Diego,

Construí uma imagem com a seguinte configuração:

MACHINE = "raspberrypi"
DISTRO = "poky"
DL_DIR = "/home/projs/extras/dl"
PACKAGE_CLASSES = "package_ipk"
DISTRO_FEATURES_remove = "x11 wayland"
IMAGE_FEATURES += "package-management"
IMAGE_INSTALL += "openssh"
# Set Rpi GPU Memory to 128MB
GPU_MEM = "128"

Compilou tudo ok e gravei a imagem no uSD, mas quando está dando boot, aparece o erro:
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

Você tem a ideia de qual seja o problema? Ocorreu isso comigo e com um amigo meu.

Vinicius Maciel
Visitante
vinifr

Essas instruções servem para Rasberry A+?

Diego Sueiro
Visitante
Diego Sueiro

Servem sim.

Michael
Visitante
Michael

I'm trying to run this tutorial, but I keep getting the following error:

ERROR: No recipes available for:
/home/MYHOME/yocto/poky/meta-embarcados/recipes-browser/chromium/chromium_%.bbappend

Summary: There was 1 ERROR message shown, returning a non-zero exit code.

Running nano /home/MYHOME/yocto/poky/meta-embarcados/recipes-browser/chromium/chromium_%.bbappend gives me this:
LDFLAGS += "-Wl,--no-keep-memory"
PARALLEL_MAKE = "-j 4"

Diego Sueiro
Visitante
Diego Sueiro

Michael,

You are not using daisy branch, right?

On daisy branch you are not going to have this problem.

But to bypass this put the following line on your conf/local.conf:
BBMASK = "meta-embarcados/recipes-browser/chromium/chromium_%.bbappend"

trackback

[…] Heavily inspired by this excellent tutorial for Raspberry Pi […]

trackback

[…] Raspberry pi + Qt5 + Yocto - parte 1 […]

trackback

[…] Raspberry pi + Qt5 + Yocto - parte 1 […]

joël maranhão
Visitante

quiz experimentar QtWebEngine com um exemplo muito simple tirado dessa pagina http://doc.qt.io/qt-5/qtwebengine-index.html

Sera que QtWebEngine faz parte de algum Qt licensing?

[email protected]:~# /usr/bin/qt5/qmlscene qb.qml -platform eglfs
file:///home/root/qb.qml:3 module "QtWebEngine" is not installed

Diego Sueiro
Visitante
Diego Sueiro

Você tem que adicionar o qtwebengine no IMAGE_INSTALL da receita da tua imagem.

joël maranhão
Visitante

Diego vc me ajudo demais, obrigado mesmo, aprendi bastante.

Eu achei outro erro, mas pra não abusar do seu tempo coloquei no stackoverflow, talvez alguém na comunidade ajude tambem. Acho que esse Unable to fetch URL from any source, cai um pouco fora do seu tutorial. Valeu!

http://stackoverflow.com/questions/30422646/how-do-i-install-qtwebengine-qtwebkit-on-sbc-using-yocto-unable-to-fetch-url

Diego Sueiro
Visitante
Diego Sueiro

Joel,

A receita do está apontando para um branch (1.0) que não existe. Provavelmente ele foi removido. O commit "21f6ce84ecca9a4ff2aa980b21d2e5174c78d14b" agora está no branch "5.5".

Crie um arquivo qtwebengine_%.bbappend com a seguinte variável:
QT_MODULE_BRANCH = "5.5"

Eu tive que fazer essa modificação para compilar o qtwebengine, porém como ainda não terminei todas as validações eu ainda não subi as modificações no meta-embarcados.

Prepare-se o qtwebengine demora séculos para compilar.

joël maranhão
Visitante

Qual seria o lugar recomendado para criar esse qtwebengine_%.bbappend, pode ser no folder meta-embarcados/meta-rpi/recipes-core/images/

... entre tanto, como estou bastante impatiente, acabei mexendo com o ../poky-dizzy/meta-qt5/recipes-qt/qt5/qtwebengine_5.3.2+git.bb QT_MODULE_BRANCH = "5.5" ... com certeza não é o certo, mas parece que esteja fazendo o do_fetch dessa vez e compilou ... mas continuo com o mesmo erro "QtWebEngine is not installed" quando quero experimentar meu QML.

Porem no RPi2 achei algo de novo
[email protected]:~# find / -name QtWeb*
/usr/lib/qt5/libexec/QtWebEngineProcess

fica na pasta *libexec*, eu esperava

/usr/lib/qt5/qml/QtWebEngine

joël maranhão
Visitante

UPDATE (so compartilhando caso seja de util a outros)

Para ter o QML plugins tambem tive que aditionar qtwebengine-qmlplugins

veja mais informação nessa thread http://stackoverflow.com/questions/30422646/how-to-install-run-qml-qtwebengine-qtwebkit-on-sbc-using-yocto-unable-to-f

Agora consigo lançar meu QtWebEngine QML, so que tenho que importar versão 0.9 (not 1.0) ... infelizmente estou com um novo problema, QtWebEngine não abre a pagina web

http://stackoverflow.com/questions/30682749/running-simple-qtwebengine-app-on-raspberry-pi-2-page-not-showing

Tempo para ler a Parte 2 do seu tutorial. Obrigado!!!

trackback

[…] am using Yocto to build a custom image for my Raspberry Pi2. Followed this tutorial in portuguese and this one in […]

joël maranhão
Visitante

Oi, Eu preciso acertar um parametros video no /boot/config.txt, na imagem que acabo de criar esse file não existe, eu adicionei pensando que a RPi2 iria simplemente ler o config.txt no boot, mas talvez o workflow seja differente.

no meu config.txt

hdmi_force_hotplug=1
# uncomment to force a specific HDMI mode (here we are forcing 800x480!)
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0
max_usb_current=1

algumas ideia de como se faz isso? existem recipes para o config.txt?

Diego Sueiro
Visitante
Diego Sueiro

Joel,

Tem algumas variáveis do config.txt que você consegue alterar no local.conf:
http://git.yoctoproject.org/cgit/cgit.cgi/meta-raspberrypi/about/

A receita que implementa isso é:
http://git.yoctoproject.org/cgit/cgit.cgi/meta-raspberrypi/tree/recipes-bcm/bootfiles/rpi-config_0.1.bb?id=14734e73a3e77ed66d21ab1fb734350478b08d54

Você pode criar um bbappend para adicionar as variáveis que você deseja e ainda adicionar a Rpi2 como compatível através dessa variável no bbappend também:
COMPATIBLE_MACHINE += "raspberrypi2"

Para que este arquivo esteja na imagem é preciso que você adicione no IMAGE_INSTALL o pacote rpi-config.

joël maranhão
Visitante

bem, eu tentei algo criei o archivo ./poky-dizzy/meta-embarcados/meta-rpi/recipes-core/images/rpi-config_%.bbappend com o seguinte COMPATIBLE_MACHINE += "raspberrypi2" IMAGE_INSTALL += " rpi-config " depois [email protected]:~/yocto/build-dizzy$ bitbake qt5-image-demo Loading cache: 100% Loaded 1952 entries from dependency cache. Parsing recipes: 100% Parsing of 1501 .bb files complete (1500 cached, 1 parsed). 1951 targets, 197 skipped, 0 masked, 0 errors. NOTE: Resolving any missing task queue dependencies ERROR: Nothing RPROVIDES 'rpi-config' (but /home/otto/yocto/build-dizzy/../poky-dizzy/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb RDEPENDS on or otherwise requires it) ERROR: rpi-config was skipped: incompatible with machine raspberrypi2 (not in COMPATIBLE_MACHINE) NOTE: Runtime target 'rpi-config' is unbuildable, removing... Missing or unbuildable dependency chain was: ['rpi-config'] ERROR: Required build… Leia mais »

Diego Sueiro
Visitante
Diego Sueiro

Joel,

Você misturou as configurações em uma receita só. Vamos por partes.

rpi-config:
"meta-embarcados/meta-rpi/recipes-bsp/bootfiles/rpi-config_git.bbappend" com o conteúdo:
COMPATIBLE_MACHINE += "raspberrypi2"
do_deploy[dirs]_remove = "${DEPLOYDIR}/bcm2835-bootfiles"

qt5-image-demo:
"meta-embarcados/meta-bbb/recipes-core/images/qt5-image-demo.bbappend":
IMAGE_INSTALL += "
packagegroup-qt5-machine-related
rpi-config
"

Veja se agora vai.
Mas note que as variáveis que você quer configurar não estão sendo consideradas na receita original "meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bb".
Para implementá-las você terá que no arquivo "meta-embarcados/meta-rpi/recipes-bsp/bootfiles/rpi-config_git.bbappend" criar a função abaixo e incluir as variáveis:
do_deploy_append() {
echo "hdmi_force_hotplug=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
echo "hdmi_group=2" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
echo "hdmi_mode=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
echo "hdmi_mode=87" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
echo "hdmi_cvt 800 480 60 6 0 0 0" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
echo "max_usb_current=1" >>${DEPLOYDIR}/bcm2835-bootfiles/config.txt
}

Eu não testei essas mudanças, portanto não tenho certeza se elas irão funcionar corretamente.

joël maranhão
Visitante

eu até não me importo colocar as variáveis depois manualmente, mas acho bem legal que se possa configurar com Yocto.

O que faz esse do_deploy[dirs]_remove? ele deu um ParseError, mas nao tou vendo o que esta errado?


ERROR: ParseError at /home/otto/yocto/build-dizzy/../poky-dizzy/meta-embarcados/recipes-bsp/bootfiles/rpi-config_git.bbappend:2: unparsed line: 'do_deploy[dirs]_remove = "${DEPLOYDIR}/bcm2835-bootfiles"' | ETA: --:--:--

Diego Sueiro
Visitante
Diego Sueiro

Remove essa linha e vê se vai.

joël maranhão
Visitante

Sim eu tentei isso logo que teve o erro, mas deu

ERROR: Nothing RPROVIDES 'rpi-config' (but /home/otto/yocto/build-dizzy/../poky-dizzy/meta-embarcados/recipes-core/images/qt5-image-demo.bb, /home/otto/yocto/build-dizzy/../poky-dizzy/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb RDEPENDS on or otherwise requires it)
ERROR: rpi-config was skipped: incompatible with machine raspberrypi2 (not in COMPATIBLE_MACHINE)
NOTE: Runtime target 'rpi-config' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['rpi-config']
ERROR: Required build target 'qt5-image-demo' has no buildable providers.
Missing or unbuildable dependency chain was: ['qt5-image-demo', 'rpi-config']

joël maranhão
Visitante

UPDATE

Entretanto consegui resolver meu showstopper com o config.txt (mas não resolvi o error ainda)

http://raspberrypi.stackexchange.com/questions/31842/how-do-i-generate-configure-config-txt-for-raspberry-pi2-using-yocto

Minha verdadeira dor de cabeça é fazer instalar QtWebEngine para QML no meu RPi2. Passando essa etapa terei resolvido o meu objetivo principal e.g. run Chromium layout engine on RPi2. Isso ainda não vi em nenhum tutorial.