Beaglebone Black + Qt5 + Yocto – Parte 2

Beaglebone Black Qt Creator
Este post faz parte da série Beaglebone Black + Qt5 + Yocto. Leia também os outros posts da série:

Na primeira parte da série vimos como configurar o ambiente e gerar uma distribuição Linux Embarcado com Qt5 para Beaglebone Black usando aceleração gráfica por hardware com o Yocto Project.

 

Agora vamos aprender como gerar e configurar as ferramentas necessárias para o desenvolvimento de aplicações Qt que serão executadas no nosso target, a Beaglebone Black. Basicamente precisaremos de uma toolchain contendo os utilitários e bibliotecas para podermos "cross-compilar" as aplicações desenvolvidas através da IDE Qt Creator.

 

 

Gerando a Toolchain

 

É importante que você tenha realizado todos passos descritos no primeiro artigo da série.

Para gerarmos a toolchain devemos carregar as variáveis de ambiente do Yocto e instruí-lo a construir a toolchain para o Qt5.

cd ~/yocto
. poky-daisy/oe-init-build-env build-daisy
bitbake meta-toolchain-qt5

 

O instalador da toolchain gerado está disponível em:

 ~/yocto/build-daisy/tmp/deploy/sdk/ 

e serve tanto para construção de aplicações Qt5 quanto para aplicações Linux que não utilizam o Qt.

 

 

Instalando a Toolchain

 

Vamos executar o script com a opção de instalação no caminho padrão sugerido.

# Para Host Linux 64bits
~/yocto/build-daisy/tmp/deploy/sdk/poky-eglibc-x86_64-meta-toolchain-qt5-cortexa8t2hf-vfp-neon-toolchain-1.6.2.sh

# Para Host Linux 32bits
~/yocto/build-daisy/tmp/deploy/sdk/poky-eglibc-i686-meta-toolchain-qt5-cortexa8t2hf-vfp-neon-toolchain-1.6.2.sh

 

Após a instalação nossa toolchain estará disponível em: /opt/poky/1.6.2/ .

 

Instalando o Qt Creator

 

Vamos baixar a versão 3.2.2 e instala-lá utilizando as opções padrão sugeridas:

# Para Host Linux 64bits:
wget http://download.qt-project.org/official_releases/qtcreator/3.2/3.2.2/qt-creator-opensource-linux-x86_64-3.2.2.run -P ~/Downloads

# Para Host Linux 32bits:
wget http://download.qt-project.org/official_releases/qtcreator/3.2/3.2.2/qt-creator-opensource-linux-x86-3.2.2.run -P ~/Downloads

# Executando o Instalador
# Host 64bits
chmod +x ~/Downloads/qt-creator-opensource-linux-x86_64-3.2.2.run
~/Downloads/qt-creator-opensource-linux-x86_64-3.2.2.run

# Host 32bits
chmod +x ~/Downloads/qt-creator-opensource-linux-x86-3.2.2.run
~/Downloads/qt-creator-opensource-linux-x86-3.2.2.run

 

 

Configurando o Qt Creator

 

Vamos realizar as configurações necessárias para que o Qt Creator utilize a toolchain que geramos. Feche o programa caso ele esteja aberto.

 

A primeira coisa a ser feita é adicionar as variáveis de ambiente da toolchain no script de inicialização do Qt Creator. Para isso adicione o conteúdo abaixo na primeira linha do arquivo ~/qtcreator-3.2.2/bin/qtcreator.sh.

source /opt/poky/1.6.2/environment-setup-cortexa8t2hf-vfp-neon-poky-linux-gnueabi

 

O resultado final do arquivo ~/qtcreator-3.2.2/bin/qtcreator.sh. deve ser:

source /opt/poky/1.6.2/environment-setup-cortexa8t2hf-vfp-neon-poky-linux-gnueabi
#! /bin/sh

makeAbsolute() {
    case $1 in
        /*)
            # already absolute, return it
            echo "$1"
            ;;
        *)
            # relative, prepend $2 made absolute
            echo `makeAbsolute "$2" "$PWD"`/"$1" | sed 's,/\.$,,'
            ;;
    esac
}

me=`which "$0"` # Search $PATH if necessary
if test -L "$me"; then
    # Try readlink(1)
    readlink=`type readlink 2>/dev/null` || readlink=
    if test -n "$readlink"; then
        # We have readlink(1), so we can use it. Assuming GNU readlink (for -f).
        me=`readlink -nf "$me"`
    else
        # No readlink(1), so let's try ls -l
        me=`ls -l "$me" | sed 's/^.*-> //'`
        base=`dirname "$me"`
        me=`makeAbsolute "$me" "$base"`
    fi
fi

bindir=`dirname "$me"`
libdir=`cd "$bindir/../lib" ; pwd`
LD_LIBRARY_PATH=$libdir:$libdir/qtcreator${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
exec "$bindir/qtcreator" ${1+"[email protected]"}

 

Agora vamos executar o Qt Creator. É importante dizer que SEMPRE que formos abrir o programa utilizaremos o comando abaixo, caso contrário o Qt Creator não funcionará corretamente com a toolchain gerada:

~/qtcreator-3.2.2/bin/qtcreator.sh

 

A figura abaixo mostra a tela inicial do aplicativo:

 

Qt Creator 

 

 

Agora vamos criar um Kit contendo as informações do nosso target (Beaglebone Black) e da nossa toolchain. Siga os passos descritos abaixo:

1) Menu "Tools"-> Submenu "Options"

2) Opção "Build & Run" -> Aba "Compilers" ->Botão "Add" -> Opção "GCC"
	Name: Poky G++ -> Apply
	Compiler path: /opt/poky/1.6.2/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++
	Botão "Apply"


3) Opção "Build & Run" -> Aba "Debuggers" -> Botão "Add"
	Name: Poky GDB
	Path: /opt/poky/1.6.2/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb
	Botão "Apply"
	

4) Opção "Build & Run" -> Aba "Qt Versions" -> Botão "Add"
	Filename: /opt/poky/1.6.2/sysroots/x86_64-pokysdk-linux/usr/bin/qt5/qmake
	Version Name: Qt 5.3.2 (qt5)
	Botão "Apply"


5) Opção "Build & Run" -> Aba "Kits" -> Botão "Add"
	Name: BBB
	Device Type: Generic Linux Device
	Sysroot: /opt/poky/1.6.2/sysroots/cortexa8t2hf-vfp-neon-poky-linux-gnueabi/
	Compiler: Poky G++
	Debugger: Poky GDB
	Qt Version: Qt 5.3.2 (qt5)
	Botão "Make Default"
	Botão "OK"

 

Ao final desses procedimentos devemos ter a tela de configuração das opções "Build & Run" semelhante a essa:

 

Qt Creator

 

 

 

Compilando uma aplicação

 

Como não poderia deixar de ser, vamos criar uma aplicação "Hello World". Execute os seguintes comandos no shell:

mkdir ~/qt5-helloworld
echo -e 'TEMPLATE = app\nTARGET = hello\nDEPENDPATH += .\nINCLUDEPATH += .\n\nQT += widgets\n\nSOURCES += hello.cpp' > ~/qt5-helloworld/helloworld.pro
echo -e '#include <QApplication>\n#include <QLabel>\n\nint main(int argc, char *argv[])\n{\n    QApplication app(argc, argv);\n    QLabel *label = new QLabel("Hello Qt!");\n    label->show();\n    return app.exec();\n}
' > ~/qt5-helloworld/hello.cpp

 

 

Teremos um arquivo de projeto ~/qt5-helloworld/helloworld.pro:

TEMPLATE = app
TARGET = hello
DEPENDPATH += .
INCLUDEPATH += .

QT += widgets
SOURCES += hello.cpp

 

 

E um código fonte da aplicação ~/qt5-helloworld/hello.cpp:

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel *label = new QLabel("Hello Qt!");
    label->show();
    return app.exec();
}

 

Vamos importar nosso projeto para dentro do Qt Creator. Para isso, vá em "File" -> "Open File or Project", e selecione o arquivo ~/qt5-helloworld/helloworld.pro.

Na próxima tela aparecerá qual Kit deverá ser utilizado, se você marcou o Kit BBB como default ("Make Default") na seção anterior ele já estará selecionado. Para finalizar clique em "Configure Project".

 

 Agora vamos construir a aplicação em "Build" -> "Build Project helloworld"

 

 

Testando a aplicação 

 

Copie o binário gerado pelo Qt Creator em ~/qt5-helloworld/build-qt5-helloworld-BBB-Debug/hello para a raíz de um pendrive.

Insira o pendrive na BBB, plugue um cabo conversor USB Serial e abra uma conexão serial.

 

NOTA:

Se você tiver instalado algum outro sistema operacional no eMMC da BBB energize a placa pressionando a switch que fica próxima ao slot do microSD. Isso fará com que o processador busque o MLO e u-boot que estão contidos no microSD ao invés do eMMC.

 

Insira o microSD card gerado na primeira parte dessa série, conecte a BBB a uma TV através de uma cabo HDMI, conecte o pendrive com o binário gerado e energize a placa, logue como root e execute os seguintes comandos:

echo 0 > /sys/class/graphics/fbcon/cursor_blink #Para desabilitar o cursor piscante
mount /dev/sda1 /media
/media/hello -platform eglfs

Note que rodamos a aplicação com os parâmetros "-platform eglfs", isso indica ao Qt que ele deve rodar utilizando o plugin de plataforma EGLFS.

 

A TV ficará com a seguinte imagem:

 

 

 Qt Creator

 

Notem que está escrito no canto esquerdo da tela a frase: "Hello Qt!"

 

 

Conclusão

 

Com as partes 1 e 2 desse tutorial é possível gerar uma distribuição Linux embarcado customizado usando o com aceleração gráfica por hardware para a Beaglebone Black e desenvolver aplicações sem muitas complicações.

 

Se você é novato no mundo de programação Qt, sugiro que dê uma lida no material Qt for beginners.

 

 

Saiba mais

 

Cozinhando com o Yocto Project

Desvendando Yocto Project – Primeiros passos

BeagleBone Black + Yocto

 

 

 

Referências

 

https://qt-project.org/wiki/Category:Tools::QtCreator

http://elinux.org/Beagleboard:BeagleBone_Black_Serial

https://linuxlink.timesys.com/docs/gsg/beaglebone_black#SECTION00041000000000000000

http://qt-project.org/wiki/Qt_for_beginners

Outros artigos da série

<< Beaglebone Black + Qt5 + Yocto - Parte 1
Este post faz da série Beaglebone Black + 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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

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.

78
Deixe um comentário

avatar
 
23 Comment threads
55 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
12 Comment authors
Fábio Ricardo de OliveiraRenan FontelesGabriel HabibGrangsang Sotyaramadhanitridawg Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Fábio Ricardo de Oliveira
Membro

Boa tarde. Alguém poderia me ajudar?????
Consegui evoluir na criação do Tollchain, mas quando o computador está fazendo o parse ele desliga. Suspeito que ele não tem capacidade de processamento e deve desligar por excesso de temperatura no processador. É um notebook antigo que comprei só para usar o Linux, CPU DualCoreT4400 de 2.2Ghz e 4GBytes de memória, estou usando o UBUNTU 14.04.
Obrigado!

Fábio Ricardo de Oliveira
Membro

Diego, boa noite. ESTOU tentando entrar nesse mundo Linux mas tudo parece bem complicado!!!!Fiz os passos da parte 1 e parte 2, z porem, em ambos tive problemas ao utilizar o bitbake. Na parte 2, que será mais útil para mim - não sei por que cargas d'água - não consigo gerar o toolchain de forma nenhuma. Além de conferir linha por linha fiz tudo novamente desde a parte 1, exceto a imagem demo, passo a passo. Quando executo o comando $ .poky-daisy/oe-init-build-env build-daisy bitkake meta-toolchain-qt algumas coisas aparecem na tela informando sobre documentação do yocto, openembedded, etc, mas as… Leia mais »

Bruno Rodrigues Silva
Visitante
Bruno

como que carrega o módulo "spidev"?

Bruno Rodrigues Silva
Visitante
Bruno

Oi Diego,
Tentei usar a versão "krogoth" do Yocto, seguindo os passos certinho, só modificando a branch dos meta para krogoth.
Deu problema no "meta-embarcados" que, por enquanto, não tem a branch krogoth. Usei a fido e a dizzy, mas cada uma delas deu um problema diferente.
Pretendes fazer uma branch krogoth do meta-embarcados?
Sem o meta-embarcados, como ficaria a configuração do bblayers.conf para chegar ao mesmo resultado do qt5?

Bruno Rodrigues Silva
Visitante
Bruno

Eu fiz a instalação do pacote ssh apenas modificando o EXTRA_IMAGE_FEATURES.
EXTRA_IMAGE_FEATURES = "debug-tweaks tools-debug ssh-server-openssh"
Testei conexão e envio de arquivo via ssh e foi tudo ok, mas não sei dizer se pela IDE do Qt daria para fazer a depuração.
Antes, tentei fazer com o IMAGE_INSTALL, mas deu um erro na BBB
"Kernel panic - not syncing: No working init found. Try passing init= option to kernel."
Por isso fiz da forma citada no início.

Bruno Rodrigues Silva
Visitante
Bruno

Olá Diego,
Fiz a parte 1 e a parte 2 e deu tudo certo (impressionantemente)!
Porém, comigo, todas as vezes que inicia a placa (alimenta), é necessário segurar o botão mencionado na NOTA.
Seria possível configurar algum parâmetro para ele carregar o SD no lugar do SO no eMMC?
Tem como fazer ele carregar para o eMMC a imagem gerada pelo Yocto (a imagem com qt5)?
Parabéns e obrigado!

Renan Fonteles
Visitante
Renan Fonteles

Olá Diego, beleza? Cara, eu segui o seu tutorial e tudo funcionou muito bem. Agora eu preciso conectar o Yocto a internet. Eu estou tentando configurar o eth0 com dhcp, e tudo funciona bem na rede interna da universidade. Porém qualquer tentativar de ping externo (Ex: http://www.google.com.br) não funciona. Eu desconfiava que o problema poderia ser o servidor DNS , porém mesmo configurando o DNS corretamente com nameserver 8.8.8.8 no "resolv.conf " não funciona. Você teria alguma idéia do que poderia ser? Outro problema que eu estou tendo é que o meu computador não reconhece a usb da beaglebone black… Leia mais »

Diego Sueiro
Visitante
Diego Sueiro

Renan,

Tente ver como as rotas estão configuradas através do comando "route".

Para que a BBB seja vista como interface de rede, porta serial e usb mass storage você precisa adicionar na imagem os pacotes "gadget-init gadget-init-storage gadget-init-network gadget-init-udhcpd". Estes pacotes adicionam algumas configurações a serem passadas ao módulo g_multi do kernel.
Para isso você pode colocar o seguinte no arquivo local.conf:
IMAGE_INSTALL += ""gadget-init gadget-init-storage gadget-init-network gadget-init-udhcpd"

Gabriel Habib
Visitante
Gabriel Habib

Fiquei foi curioso como tu sabe de tanta coisa Sueiro, haja raca !! To levando tanta peia desse linux...... imagine se nao tivesse esse forum aqui, ja tinha era desistido da vida.

Diego Sueiro
Visitante
Diego Sueiro

Olá Gabriel,

Obrigado pelo apoio.
Muita coisa que aprendi foi com a ajuda da comunidade também.

Renan Fonteles
Visitante
Renan Fonteles

Olá Diego, Eu tentei alterar o IMAGE_INSTALL no arquivo local.conf , porém quando tentei cozinhei a imagem a placa não inicia, qualquer um dos init trava a placa. Na hora do boot, os LEDs da beagle começam a piscar normalmente e para em um LED ligado, como se tivesse parado o processo de boot. Tem alguma sugestão do que possa ser? A configuração da rede aparentemente está ok. Eu consigo da ifup eth0 e a beaglebone consegue ip e tudo. Porém eu não consigo pingar o servidor DNS 8.8.8.8 nem qualquer ip externo. Eu falei com um funcionário da infraestrutura… Leia mais »

Diego Sueiro
Visitante
Diego Sueiro

Renan,

Sobre o travamento no boot tente coletar os logs do terminal serial. Mande o log via http://pastebin.com/ .

Provavelmente o repositório de pacotes não esteja configurado na placa. Monte um setup de acordo com esse artigo que escrevi:

Criando um repositório de pacotes com o Yocto Project

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

Hi Diego,

I followed your tutorial part 1 and part 2.

But when I try to run my application on beaglebone.

It says "QtQuick 2.4 is not installed"

Could you help me about that?

Thank you so much.

Grangsang S.

Diego Sueiro
Visitante
Diego Sueiro

Hi Grangsang,

It seems that QtQuick is not installed on the image. You can add the following line to your local.conf file:
IMAGE_INSTALL +="qtquick1"

And regenerate qt5-image-demo.

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

Hi Diego,

I followed your instruction to add IMAGE_INSTALL +="qtquick1"

But I got another error. It says that "qtquick1" is unbuildable

Diego Sueiro
Visitante
Diego Sueiro

I'm sorry, but I don't have my build setup with me now.

Try to issue the following commands on terminal and see what happens:
bitbake qtquick1
bitbake qtquick

Send me (via pastebin) the complete error message.

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

Diego, thank you for replying my message.

I tried "bitbake qtquick1" and it seems that it need 'ruby-native' but I can't find it's location.

Here is the complete error message:

Diego Sueiro
Visitante
Diego Sueiro

Add the following line on bblayers.conf:

${TOPDIR}/../poky-daisy/meta-openembedded/meta-ruby

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

It seems that there is no any "ruby-native" inside meta-ruby.

I still get an error after adding meta-ruby layer

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

Dear Diego,

After several tries and errors. I am finally able to run my qt app.

Now, I am facing a new problem. Could you tell me how to activate another UART in BBB?
My qt app accessing serial port and it crashes while booting because of using same tty (in this case ttyO0). I hope the rest UART (ttyO1-O5) can be activated so the app won't crash anymore.

I need your help for this.

Thank you so much.

Diego Sueiro
Visitante
Diego Sueiro

Hi Grangsang,

Glad that it worked, cloud you please share with us how did you get it?

To add another serial ports on the system you will need to modify your dts file.

Basically you will have to modify the file:
http://git.ti.com/ti-linux-kernel/ti-linux-kernel/blobs/ti-linux-3.14.y/arch/arm/boot/dts/am335x-bone-common.dtsi

And create the entries for the other UART interfaces (take uart0 as a reference).

On Yocto side you will have to create a bbappend for linux-ti-staging_3.14.bb recipe and add patch to modify the am335x-bone-common.dtsi file.
Here you have a workflow for create and integrate the patch:
http://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html#using-a-quilt-workflow

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

Hi Diego,

Well, after trying with meta-ruby my qt app still not working. So I back to the first problem that said "QtQuick 2.4 is not installed" then I try to use earlier version of QtQuick. I tried with QtQuick 2.0 I used to use, and everthing is solved. My qt app working as I want. I think that's all I can share. Simple thing to say, I didn't do anything with image. Just changing QtQuick 2.4 to QtQuick 2.0.

And for adding UARTs to the system, I will try with your suggestion. Hope it will be success.

Thank you so much.

Grangsang Sotyaramadhani
Visitante
Grangsang Sotyaramadhani

And here is error message from "bitbake qtquick"

trackback

[…] Beaglebone Black + Qt5 + Yocto - parte 2 […]

trackback

[…] Beaglebone Black + Qt5 + Yocto - parte 2 […]