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
qt - invalid ELF header when trying to use QtWebEngine QML plugin on ARM - CSS PHP

[…] see excellentembarcados tutorial here […]

Vinicius Maciel
Membro
Vinicius Maciel

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
Membro
Vinicius Maciel

Essas instruções servem para Rasberry A+?

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"

trackback
Building QtWebEngine for Raspberry Pi2 using Yocto Poky - vcos_platform_types.h: No such file or directory - DexPage

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

trackback
Desenvolvendo um Kiosk Interativo para a Beaglebone Black com Yocto - parte 3

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

trackback
Projeto de Kiosk Interativo para a Beaglebone Black com Yocto - parte 1

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

joël maranhão
Visitante
joël maranhão

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

joël maranhão
Visitante
joël maranhão

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

joël maranhão
Visitante
joël maranhão

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
joël maranhão

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
How do I generate/configure config.txt for raspberry Pi2 using Yocto? | DL-UAT

[…] 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
joël maranhão

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?

joël maranhão
Visitante
joël maranhão

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 target 'qt5-image-demo' has no buildable providers.
Missing or unbuildable dependency chain was: ['qt5-image-demo', 'bcm2835-bootfiles', 'rpi-config']
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

joël maranhão
Visitante
joël maranhão

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: --:--:--

joël maranhão
Visitante
joël maranhão

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
joël maranhão

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.