Compilando Qt e aplicações gráficas em Linux embarcado

- por Sergio Prado

Categorias: Linux, Mini2440 Tags: , ,

Cada vez mais temos equipamentos embarcados com interfaces de vídeo disponíveis. Hoje é comum displays LCD embutidos no equipamento, alguns deles com interface touch screen. Em alguns casos temos disponível um controlador de vídeo, que pode ser VGA, DVI ou HDMI, e um conector para ligar um display externo.

E trabalhar com displays gráficos em Linux não é algo de outro mundo. Exige que você conheça alguns conceitos, sabia preparar seu kernel corretamente, escolher e cross-compilar uma biblioteca de interface gráfica (você não vai querer reinventar a roda, certo?), e aprender a usá-la.

Mas antes de colocar a mão na massa, vamos estudar alguns conceitos.

A ARQUITETURA

Se cada interface ou placa de vídeo tivesse seu driver e sua específica API, imagina o trabalho que seria para as aplicações ou bibliotecas que precisam acessar diretamente o vídeo, como media players ou bibliotecas de interface gráfica como Qt ou GTK. Elas precisariam implementar a API de acesso a cada placa de vídeo. Você poderia ver notícias do tipo: “Nova versão do MPlayer agora suporta NVidia GeForce 9800 GT!”.

Ainda bem que as coisas não são bem assim, porque existe em Linux o conceito de frame buffer, que é uma camada de abstração entre os drivers da placa de vídeo e as aplicações e bibliotecas que precisam acessá-la.


Se existe então um driver de frame buffer disponível para a sua placa de vídeo, é garantido que aplicações e bibliotecas compatíveis com frame buffer irão funcionar.

VÍDEO EM LINUX DESKTOP

Sistemas desktop possuem uma arquitetura mais complexa. Normalmente trabalham com o Servidor X (também chamado de X11 ou X Window System), que é uma camada de software para trabalhar com interfaces gráficas. O Servidor X pode acessar as placas de vídeo de 2 formas: através de frame buffers, ou acessando diretamente o driver da placa de vídeo. Em cima do Servidor X roda normalmente um gerenciador de janelas como o Gnome e o KDE.

Então a arquitetura fica mais ou menos assim: o gerenciador de janelas (Ex: Gnome ou KDE) acessa as bibliotecas disponibilizadas pelo Servidor X, que então acessa a interface de vídeo através de um frame buffer ou conversando diretamente com o driver da placa de vídeo.

Esta não é normalmente a arquitetura que temos em um equipamento com Linux embarcado, principalmente pelos recursos de memória e processamento que serão necessários para incluir todas as bibliotecas necessárias (pode chegar a consumir 100Mb de flash e 20Mb de RAM apenas para ter um Gnome embarcado no seu equipamento!).

Precisamos então de uma solução mais leve para equipamentos embarcados.

VÍDEO EM LINUX EMBARCADO

Todas as soluções para Linux embarcado são baseadas na arquitetura do frame buffer. Algumas bibliotecas fornecem funções de acesso direto ao frame buffer como a SDL e a OpenGL ES. Já outras bibliotecas, além do acesso ao frame buffer, possuem um sistema de janelas completo para o desenvolvimento de interface gráficas, como é o caso do GtkFB e do Qt.

O Qt, que será nosso foco a partir de agora, é um framework multiplataforma para o desenvolvimento de interfaces gráficas. Desenvolvido em C++, é a biblioteca usada pelo gerenciador de janelas KDE.

A plataforma Qt foi criada pela Trolltech em 1995. No ano de 2000, a Trolltech liberou uma versão do Qt para sistemas embarcados, chamada de Qtopia ou Qt/Embedded, que ajudou a disseminar seu uso em dispositivos móveis. Em 2008, a Trolltech foi adquirida pela Nokia, que criou a divisão Qt Development Frameworks para cuidar do desenvolvimento desta plataforma.

Ainda em 2008, o Qtopia virou Qt Extended, com um modelo voltado para PDAs e celulares, mas não durou muito. Em 2009, a Nokia descontinuou o Qt Extended, unificando suas principais funcionalidades dentro da biblioteca do Qt. Mas como o Qtopia era liberado sob a licença GPL, o comunidade Openmoko criou um fork do projeto, e chamou de Qt Extended Improved.

Que tal agora um pouco de ação? Utilizaremos aqui a última versão do Qt para Linux embarcado liberado pela Nokia. Vamos cross-compilar o Qt V4.7.1 e uma aplicação de exemplo para rodar no kit FriendlyARM mini2440.

 

CROSS-COMPILANDO O QT

Sua primeira tarefa é seguir os passos deste artigo aqui. Só que, antes de compilar, habilite também as opções abaixo:

Toolchain  --->
    [*] Build/install c++ compiler and libstdc++?
Package Selection for the target  --->
    Graphic libraries and applications (graphic/text)  --->
        [*] Qt  --->
            [*] Compile and install demos and examples (with code)
            Mouse drivers  --->
                [*] tslib

Depois de compilado, grave o kernel na flash seguindo os procedimentos deste artigo aqui, e monte um sistema de NFS conforme explique neste outro artigo aqui.

Para verificar se o Qt compilou corretamente, na console da mini2440 execute a aplicação abaixo:

$ /usr/share/qt/examples/qws/framebuffer/framebuffer

Você deverá ver 3 retângulos na tela (vermelho, verde e azul), conforme imagem abaixo. Se der algum problema, verifique se todos os procedimentos foram executados corretamente.

CONFIGURANDO E TESTANDO O TOUCH SCREEN

Antes de desenvolver sua primeira aplicação em Qt, vamos configurar e testar a interface touch screen.

Primeiro, altere o arquivo “/etc/ts.conf” e tire o comentário da linha “module_raw input“. Depois, coloque em um script de inicialização os comandos abaixo:

export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=tslib:/dev/input/event1

Agora, vamos calibrar o display. Execute o comando abaixo:

$ ts_calibrate

Você precisará tocar no cursor exibido na tela algumas vezes para calibrar corretamente o touch screen. Depois você pode testá-lo com o comando abaixo:

$ ts_test

Pronto, agora só falta sua aplicação!

CROSS-COMPILANDO UMA APLICAÇÃO

Nossa aplicação será um simples botão a ser exibido com a mensagem “Hello Embedded World!“. Salve o código abaixo em um arquivo chamado “hello.cpp“.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "QtGui"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    QPushButton hello("Hello Embedded World!");
    hello.resize(200, 60);
 
    hello.show();
 
    return app.exec();
}

Para compilar, vamos criar um shell script:

#!/bin/bash
 
QT_DIR=/opt/buildroot/buildroot-2010.11/output/build/qt-everywhere-opensource-src-4.7.1
 
QMAKE=$QT_DIR/bin/qmake
SPECS=$QT_DIR/mkspecs/qws/linux-arm-g++
 
$QMAKE -project -o hello.pro
$QMAKE -spec $SPECS -o Makefile hello.pro
make

Altere a variável QT_DIR para o diretório do seu ambiente do Buildroot. Execute o script, e você terá a aplicação “hello” em Qt pronta para ser executada na mini2440.

Copie a aplicação para o rootfs da mini2440, mas antes de executá-la, você precisa entender um conceito importante do Qt para Linux embarcado. Ele trabalha numa arquitetura cliente-servidor. É o servidor que trata os eventos e notifica as aplicações-cliente. Uma explicação mais completa sobre a arquitetura do Qt pode ser encontrada aqui.


Apenas um servidor pode estar rodando ao mesmo tempo, e qualquer aplicação pode ser o servidor. Para iniciar uma aplicação como servidor, basta passar o parâmetro “-qws“. Como nossa aplicação é a única aplicação Qt rodando, é o que faremos:

$ /usr/bin/hello -qws

Pronto! Eis sua primeira aplicação Qt rodando na mini2440:


Agora é só aprender sobre a rica e extensão API do Qt e usar sua imaginação!

Enquanto escrevia este artigo, o Thiago Costa, leitor do blog, me enviou um documento bem completo sobre a configuração do Qt na mini2440, só que com uma abordagem diferente da minha. Ele documentou o procedimento completo para pegar o kit com o Qtopia instalado e reconfigurá-lo para usar o Qt. Vale a pena dar uma olhada, o documento esta disponível aqui.

Um abraço e boa diversão!

Sergio Prado

  • Thiago

    Sempre me surpreendo como você consegue explicar isso tudo de uma maneira bem simples e didádica. Parabéns pelo Post!

  • Parabéns, esse blog é fantástico.

  • Renato

    Muito bom!
    Vou começar a desenvolver agora. Tentei algumas semanas atrás configurar o Qt Creator rodando em OpenSuse 11.3 com toolchain gerado pelo Buildroot mas não consegui, acabei deixando de lado. Você têm alguma idéia de como configurar este ambiente? Seria útil, tendo em conta a vasta API do Qt, uma ferramentas como "code completion" disponibilizada pelas IDEs por exemplo. Agradeço o artigo, muito didático como sempre. Como anda a pesquisa sobre o curso de sistemas embarcados? Obrigado mais uma vez.
     
    Abraço
     

    • Olá Renato,

      Brinquei um pouco com o QtCreator no Ubuntu, e não tive problemas para configurar, mas não cheguei a usá-lo para desenvolver algo para cross-compilar. Mas você pode usá-lo apenas como editor, e ter por trás um sistema de build como expliquei no artigo.

      Sobre a pesquisa do curso de Linux embarcado, obtive ótimos feedbacks. Estou agora montando um esqueleto da estrutura do curso. Mantenho vocês informados.

      Um abraço!

  • André Rairan

    simples e objetivo, outro excelente tópico!

  • Fellipe

    Amigo, existe este mini 2440 para compra aqui no Brasil? Porque de fora, corre o risco de pagar a robalheira da receita pelo imposto de 60% a mais… Obrigado.

  • Olá Fellipe,

    Não, infelizmente não existe. E mesmo lá fora, você corre o risco de não encontrar, já que o fabricante esta substituindo ela pela mini6410.

    Mas mesmo com os 60%, sai em conta. Um kit com PIC mais elaborado, por exemplo, sai quase o dobro da mini2440. Vale a pena.

    Um abraço!

  • juliano alvesde

    Parabens Sergio,
    O que eu fiquei quase 1 mes para descobrir voce publica em um artigo hehe..
     
    abraços e continue assim

  • Thiago

    Sergio,
     
    Esperei ansioso por esse seu artigo. Obrigado

  • Eduardo

    Grande Sérgio, mais um excelente post.
    Executei com sucesso todos os processos, porém estou com um problema para fazer com que os valores passados com o comando export permaneçam ativos.
    Vou explicar. Se entro os comandos abaixo manualmente, eles são mantidos e o ts_test e ts_calibrate funcionam.export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    ….

    Porém se coloco os comandos dentro de um Script eles são executados, mas assim
    que o script acaba os valores são retirados do export e nada funciona.

    Sei que são executados pois coloquei um echo para imprimir cada variável e ele de fato está
    passando os valores, porém acabado o script os valores não ficam mais no export.

    Tem idéia de como manter estas nomeações ativas.

    Obrigado e até logo

    • Olá Eduardo!

      Isso acontece porque o bash cria outro contexto para executar seu script. O que acontece lá, “morre” quando seu script termina. Dá uma lida nesta man page:

      http://ss64.com/bash/period.html

      Portanto, para executar seu script no contexto atual do shell, use um dos operadores “.” ou “source”. Assim:

      . ./script.sh
      source ./script.sh

      Um abraço!

  • Bruno F.

    Olá.
    Primeiramente, parabéns pela objetividade do artigo, assim como a qualidade de todos os outros disponíveis neste site.
    Gostaria de saber qual a versão do Buildroot que você utilizou para este exemplo.
    Tentei compilar o Buildroot 2011.02, porém faltou a opção do Toolchain adicionada neste artigo:
    Toolchain —> [*] Build/install c++ compiler and libstdc++?

    Além disso, ocorreram problemas com o gcc (Erro 2 em vários trechos da compilação)
    Tentei mudar para o Buildroot 2010.08 (visto que o artigo de referência para compilar o linux do início era datado de 26/09/2010, imaginei que você estivesse utilizando uma versão mais recente naquele momento), o que fez aparecer a opção que não havia sido mostrada, porém agora os exemplos do Qt não estão presentes:Package Selection for the target —>
    Graphic libraries and applications (graphic/text) —>
    [*] Qt —>
    [*] Compile and install demos and examples (with code)

    Os drivers do mouse estavam presentes normalmente.

    • Olá Bruno,

      Estou usando esta versão: buildroot-2010.11. O único erro que acontece na minha máquina é aquele do getline() que descrevi no artigo. Tente identificar o arquivo que esta dando erro. Normalmente os erros são fáceis de corrigir. Se tiver problemas, me mande um email com a mensagem de erro que tento te ajudar.

      Um abraço!

  • Bruno Carvalho

    Oi Sérgio, Sei que muita gente deve ter te perguntado isso, mas gostaria de saber se ainda tem como adquirir esse kit, e qual a maneira (site/fornecedor) mais fácil de adquiri-lo. 
    Obrigado.

    • Olá Bruno,

      No Brasil não conheço ninguem que venda este kit. Eu comprei pelo eBay. Se você procurar lá por mini2440 vai encontrar alguns vendedores. O vendedor que comprei já não esta mais vendendo.

      Um abraço!

  • Eduardo

    Obrigado pela resposta Sérgio,
    De fato executando o script com o source na linha de comando mantem as variáveis "vivas", porém estou com um outro problema.
    Coloquei o script na basta /etc/init.d para que o rcS chamasse-o na inicialização. Lendo o código do rcS vi que os scripts que terminam com ".sh" são executados com o comando "source".
    Foi o que fiz deixei meu script lá com terminação em ".sh" e pra garantir coloquei uma linha no final com "source [meuscript]".

    Ambos são executados corretamente, só que depois de logar como root as variáveis não estão lá.
    Acredito que haja outra mudança de contexto quando o login é feito e as variáveis se perdem.

    Como colocar esse script para rodar na inicialização e manter as variáveis "vivas" após logar?

    • Olá Eduardo!

      É isso mesmo o que acontece! Para o bash iniciar corretamente sua sessão com as variáveis de ambiente setadas, você pode usar um dos seguintes scripts: /etc/profile, ~/.bashrc ou ~/.bash_profile.

      Um abraço!

  • Tony

    http://www.dhgate.com/wholesale/friendlyarm.html#search
    Site confiavel, ja realizei algumas compras, o produto chega na porta da tua casa, unico problema eh q demora uns 60 dias.
     
    valeu

  • Caio Amalfi

    ola sergio,
     
    só um problema, eu compilei as imagens do linux como foram especificadas no seu post. 
    foram geradas a uImage e rootfs.jffs2 mas a rootfs simplesmente nao funciona. 
    aparece a tela para login e ao logar a tela da mini2440 se apaga, não consigo acessar nenhum arquivo via terminal.
     
    valew

    • Olá Caio,

      Você consegue o acesso via console? Me envia as mensagens de boot no meu email pessoal para ver se consigo te ajudar.

      Um abraço!

  • Jorge

    sérgio,
     
    seguinte, estas opçoes nao estão aparecendo pra mim:
     Toolchain —>
    [*] Build/install c++ compiler and libstdc++?
    Package Selection for the target —>
    Graphic libraries and applications (graphic/text) —>
    [*] Qt —>
    [*] Compile and install demos and examples (with code)
    Mouse drivers —>
    [*] tslib

    tenho que fazer algo para aparecer?

    Att
    Jorge

    • Olá Jorge,

      Deveria aparecer. Você esta usando a mesma versão do Buildroot que eu estou usando (2010.11)?

      Um abraço!

  • Jorge

    Olá Sérgio, estou usando esta versão mesmo.
    só esta parte nao achei agora, a outra achei:
     Tool­chain —>
    [*] Build/install c++ com­piler and lib­stdc++?
    E outra coisa, no linux que vem no kit ele montava automaticamente o cartao SD no caminho(/sdcard)
    , neste seu pacote nao consegui acessar o cartão SD, e tambem nao encontrei o driver do conversor A/D. Sabe como posso arrumar isto?
     
    Um Abraço.

    • Olá Jorge,

      Às vezes é necessário habilitar determinada opção para outra aparecer. Talvez este seja seu caso. Dá uma olhada de dentro da opção “Toolchain” não tem nada falando sobre isso. Não me lembro de cabeça.

      Com relação ao cartão SD, você pode inseri-lo e dar uma olhada nas mensagens do kernel (dmesg) para verificar o dispositivo identificado, e então montar manualmente. Já sobre o conversor A/D você vai ter que dar uma olhada no kernel. Não lembro se o driver é habilitado por padrão.

      Um abraço!

  • Klausenner

    Parabéns! Sergio esse artigo é fantástico.
    Você sabe dizer onde tenho que confirurar para usar um lcd de 7 polegadas? Pois eu tenho um kit mas o LCD é de 7 polegadas.
     
    Um abraço!

  • Olá Klausenner,

    Não muda quase nada. Se não me engano, você precisa apenas passar mais este argumento na linha de comando do kernel:

    mini2440=1tb

    Um abraço!

  • Jorge

    Sérgio, preciso de sua ajuda.
    Quando dou o comando ts_calibrate, ele da o seguinte erro.
    # ts_calibrate
    xres = 240, yres = 320
    tslib: Selected device is not a touchscreen (must support ABS and KEY event types)
    Took 9 samples…
    Top left : X = 1073752676 Y = 1651076143
    Took 9 samples…
    Top right : X = 1073754158 Y = 1073747936
    Took 9 samples…
    Bot right : X = 1073752676 Y = 1651076143
    Took 9 samples…
    Bot left : X = 1073754158 Y = 1073747936
    Took 9 samples…
    Center : X = 1073752676 Y = 1651076143
    -1.230940 2.049700 -1.549752
    -1.387748 1.173371 -0.887171
    Calibration constants: -80670 134329 -101564 -90947 76898 -58141 65536
     
     
    e outra, quando tento rodas os programas demos do QT digitando (./nomedoprograma) da a seguinte mensagem
     
    # ./borderlayout
    -sh: ./borderlayout: not found
     

    • Olá Jorge,

      Este erro do ts_calibrate parece que esta relacionado à configuração da tslib. Você fez as alterações necessárias no arquivo /etc/ts.conf e criou as variáveis de ambiente, conforme expliquei no artigo?

      Com relação ao erro ao executar ./borderlayout, deve ser porque você não esta executando-o dentro do diretório correto. Tente executar digitando o caminho completo, conforme fiz no meu artigo. Ex:

      $ /usr/share/qt/examples/qws/framebuffer/framebuffer

      Ou então entre no diretório onde se encontra a aplicação para executá-la, ou ainda coloque o diretório da aplicação no PATH.

      Um abraço.

  • Jorge

    esse é o unico exemplo q funciona que achei aki, o
    $ /usr/share/qt/examples/qws/framebuffer/framebuffer
    consegui mostrar os 3 quadrados, + os outros exemplos nao funcionam.
    compilei alguns arquivos e tambem nao roda nada.
    e outra, eu instalei a TSlib, mas nao tinha o pointercal, tive que pegar do linux q veio no kit e jogar na pasta, nao sei se foi por isso, simplesmente instalei o tslib e nao tem esse aquivo.

  • Marcelo Lopes

    Caro Sergio, obrigado pelo BLOG. É de grande ajuda para quem deseja iniciar nesse fantástico universo.

  • Jorge

    Sérgio,
    me desculpe, o erro de nao conseguir executar o QT foi a falta do parametro (-qws).
     
    O unico problema agora é a TSLIB, nao funciona a calibraçao do touch, continua dando aquela mensagem.
     
    a unica coisa diferente da sua é isto que nao tem no meu:Toolchain —>

    [*] Build/install c++ compiler and libstdc++?

    • Olá Jorge,

      Acho que não, porque se você conseguiu compilar o Qt, é porque gerou o compilador e as libs C++ corretamente. Mas é muito estranho este seu problema. Não achou nada no Google?

      Um abraço.

  • Diogo

    Olá Sergio,
     
    Excelente post. Muito esclarecedor!
    Estou fazendo um projeto da universidade  e rodo em minha mini2440 um browser baseado no webkit, o Arora. Mas o sistema fica muito lento quando abro a página do projeto, que é em JavaScript.
    Você acha que é possível rodar o browser em um PC (servidor) e utilizar o KIT apenas como um client gráfico (via internet), de forma análoga ao X rodando com SSH?
    Abraço!

    • Olá Diogo,

      Claro, porque não? Afinal, é Linux! Depois me diz se funcionou.

      Um abraço!

  • Jorge

    Sérgio,
    Eu nao consegui que os drivers do conversor AD, SDcard, nenhum dos drivers do mini2440 vieram junto.
    Tentei seguir seu conselho de colocar o paramentro (mini2440=1tb), mas vi que isso é o tamanho da tela, o meu ta certo é (mini2440=0tb) para 3.5 polegadas, já esta configurado.Tem alguma
     outra ideia para colcoar os drives do mini2440?
     
    Um Abraço

    • Olá Jorge,

      Descobri que o driver vem habilitado por padrão. Mas se você quiser dar uma olhada, no buildroot digite “make linux26-menuconfig”. Então você terá disponível a configuração do kernel. O driver do conversor A/D encontra-se em Device drivers -> Character Devices.

      Para verificar se o kernel iniciou corretamente o modulo do adc, basta executar o comando abaixo:

      $ dmesg | grep adc
      adc initialized

      Então você pode criar o arquivo de dispositivo do ADC com o comando abaixo:

      $ mknod /dev/adc c 10 62

      Por curiosidade, o driver do ADC no kernel fica em: drivers/char/mini2440_ad.c.

      Um abraço!

  • Jorge

    Sérgio,

    Vi que os drivers foram inicializados, tanto a do sdcard qndo adc, ele até monta com esse comando (mknod /dev/adc c 10 62) mas nao traz nenhuma informação. Gostaria de saber de onde tirou estas informaçoes (10 62). e se tem alguma outra ideia.
    Um Abraço.

  • Olá Jorge,

    Tirei estas informações dos fontes do device driver. Você tentou acessar o arquivo de dispositivo? Funcionou?

  • Jorge

    Sérgio,

    O cartão SD eu resolvi da seguinte forma:
    mknod /dev/mmcblk0p1 b 179 1
    mkdir /mnt/sdcard
    mount /dev/mmcblk0p1 /mnt/sdcard/

    mas o conversor AD ainda estou con dificuldades.

  • Thiago

    Ola Sergio.
    Instalei a QT, ta funcionando perfeitamente(assim como todos os passos anteriores). Vc tem alguma ideia de como eu consigo usar a camera que vem junto com o kit? tipo colocar ela pra funcionar mostrar no lcd alguma imagem…qualquer coisa pra eu iniciar. Pelo menos um tema, site, blog onde eu possa aprender isso!
    Obrigado

    Thiago

  • Thiago

    Ola Sergio,
     Sabe como manipular os timers na placa? timers sao ferramentas extramente uteis em qualquer projeto, se puder dar uma forca agradeceria. valeu

    • Olá Thiago,

      Da mesma forma que você manipularia um timer em um microcontrolador. Dê uma olhada no datasheet do processador. Se você for trabalhar com Linux, precisará abstrair a implementação através de um device driver.

      Um abraço.

  • Thiago

    mas será que nao existe já um device driver pro timer pronto na placa? quando abro a pasta /dev tem quase 50 arquivos, pra que será tudo aquilo?
     

    • Olá Thiago,

      O kernel usa os timers da CPU para suas próprias rotinas de timer, e esse processo é transparente para as aplicações user space. Não existe nenhum device driver exportando as funcionalidades dos timers da CPU. Se uma aplicação user space precisar usar alguma funcionalidade de timer, pode usar as rotinas da API do Linux como sleep(), alarm(), etc. Internamente, estas rotinas estarão usando os timers da CPU.

      Se for te ajudar, sei que existe um device driver para o RTC em /drivers/rtc/rtc‐s3c.c. E se você quiser se aventurar, pode desenvolver seu próprio device driver para gerenciar os timers. Mas em Linux o normal é usar suas APIs mesmo.

      Um abraço!

  • Thiago

    Sergio,

    Essas rotinas da API do linux parecem muito uteis, consegui com elas utilizar o timer inclusive com interrupcao(nao sei se eh o jeito certo de usar, mas deu certo). nao sabia da existencia desse monte de funcoes. Agora meu grande problema eh usar a camera mesmo. sera que tem como instalar o comando apt-get install? com isso daria pra fazer muita coisa! abraco
    valeu muito pelas dicas, de verdade.

  • Jorge

    Sérgio,
     
    Fianalmente consegui arrumar quaze tudo. usei o supervivi e a propria distribuição do linux fornecida pela friendlyARM, mas estou tendo um problema não consigo utilizar o touch screen com o QT, e quando clico na tela está interferindo na leitura do AD.
     
    Teria alguma dica ?
    Um Abraço.
    Jorge

    • Olá Jorge,

      Isso esta acontecendo porque a interface touch usa 4 canais A/D, dos 8 disponíveis. Veja um trecho do próprio manual da mini240, que diz como resolver este problema:

      “The Mini2440 has an 8‐channel 10 bit A/D converter with sample and hold. When a touchpad is used, 4 channels are dedicated to touch pad conversion. The other 4 are general purpose and are on connector 4, GPIO. Pins 5, 6, 7, 8 are AIN0, AIN1, AIN2, AIN3. AIN0 is connected to a pot on the PCB for testing. If you need AIN0, remove the pot or cut the trace from the pot center pin to pin5 of CON4. The trace is on the bottom of the PCB with quite a bit of free space around it.”

      Um abraço.

      • Jorge

        Sérgio,
        Voce teria o codigo ou algum site que mostre como fazer para acessar os 4 canais?

        Um Abraço.

  • Matheus Mendes

    Sergio,
    Você poderia me dizer qual versão do buildroot vc utilizou para gerar o kernel e o root para esta aplicação em Qt. Pois estou tentando gerar consigo gerar tudo certo, somente na hora de baixar o fakeroot fica tentanto conexão e não consegue baixar… ae ele pula essa etapa e gera os arquivos…
    Envio para o mini2440 dou o boot tudo certo mas na hora que chega na parte de networking setting no boot ele simplismente trava e não sai desta tela… 

    • Olá Matheus,

      Usei a ultima versão (2011.02). Você esta bootando por NFS?

      Abraços.

  • Matheus Mendes

    Boa Noite Sérgio,
    Estou estou usando tftp para enviar a imagem do kernel e root. Sempre o mesmo problema quando envio o comando boot… ele começa o boot mais quando chega em Starting Networking a tela fica parada nisso….. essa versão que você utilizou e na qual tentei utilizar não tem o Build/Install the C++ compiler and Libstdc++. Utilizei a versão 2010.11 pra gerar as imagens porque essa possui esta seleção.
    Um abraço.

  • Matheus Mendes

    Boa Noite,
    Então eu fiz a alteração pra console funcionar corretamente, porém surgiu a seguinte dúvida. Quando utilizo o minicom tenho que mudar o ttyS0 para ttyUSB0 pois utilizo um conversor USB/Serial pois meu note não tem saida serial. E na linha que tem que ser alterada ttyS0 por ttySAC0 eu deixo ela como? Deste jeito ttySAC0 ou ttyUSBAC0? Estou deixando conforme está no seu tutorial. Quando instalo as imagens do Emdebian que vc disponibilizou funciona, porém não aparece nada na tela do mini2440… mas quando eu gero as imagens não funciona…
    Na compilação está ocorrendo tudo de acordo com o seu tuto para gerar as imagens.
    Abraço.

    • Olá Matheus,

      Na sua máquina de desenvolvimento deve ser /dev/ttyUSB0, e na imagem do rootfs gerada pelo buildroot deve ser /dev/ttySAC0. Sugiro você instalar uma das imagens disponibilizadas no site da FriendlyARM para verificar se seu hardware esta OK.

      Um abraço.

  • Diogo

    Olá Sergio,
     
    Seguindo o teu artigo não tive problemas com o QT, apenas tive que trocar o event1 por event0 (lcd 7"). Porém agora estou tentando utilizar o Xorg (do buildroot mesmo) mas o touchscreen não esta funcionando. Com mouse USB funciona perfeitamente.
    Uma solução que tentei foi configurar o arquivo xorg.conf para utilizar o driver tslib, mas recebi esta mensagem: Failed to load module "tslib" (module does not exist, 0).
    Alguma ideia de como posso resolver isso?
     
    Abraço.

    • Olá Diogo,

      Infelizmente ainda não tenho muita experiência com o X.org. Mas acredito que o google te responde esta pergunta bem rápido. Depois posta o resultado aqui.

      Um abraço.

  • Matheus Mendes

    Sergio,
    Após muitas tentativas descobri que não estava baixando o fakeroot na hora de compilar pq o endereço para baixar o pacote estava errado. Agora finalizei e coloquei o kernel e o root no mini2440. Fui para o proximo passo que é executar o comando /usr/share/qt/examples/qws/framebuffer/framebuffer.
    Aparece varias configurações e diz que irá aparecer os 3 quadros de cores conforme o tutorial, mas não aparece nada e finaliza a execução do teste após um tempo. O que pode estar acontecendo? A tela fica ligada mas não aparece nada nela tipo quando fica em espera. 
    Quando da o boot deveria aparecer algo na tela do mini2440 ou somente no meu pc?

    • Olá Matheus,

      Sim, deveria aparecer no LCD pelo menos o prompt da linha de comando. Já tive um problema parecido e descobri que o cabo do display estava mal conectado.

      Abraços.

  • Matheus Mendes

    Em relação ao cabo do display está ok pois já verifiquei, e qdo está dando o boot
    é perceptível a tela dando uma piscada portanto acredito que esteja normal. Estou
    com a configuração abaixo do boot. Será que não é alguma configuração do drive do
    LCD, o meu é o X35 da Sony.

    MINI2440 # printenv
    bootdelay=3
    baudrate=115200
    ethaddr=08:08:11:18:12:27
    usbtty=cdc_acm
    bootargs_base=console=ttySAC0,115200 noinitrd
    bootargs_init=init=/sbin/init
    root_nand=root=/dev/mtdblock3 rootfstype=jffs2
    root_mmc=root=/dev/mmcblk0p2 rootdelay=2
    root_nfs=/mnt/nfs
    set_root_nfs=setenv root_nfs root=/dev/nfs rw nfsroot=${serverip}:${root_nfs}
    ifconfig_static=run setenv ifconfig ip=${ipaddr}:${serverip}::${netmask}:mini2440:eth0
    ifconfig_dhcp=run setenv ifconfig ip=dhcp
    ifconfig=ip=dhcp
    set_bootargs_mmc=setenv bootargs ${bootargs_base} ${bootargs_init} ${mini2440} ${root_mmc}
    set_bootargs_nand=setenv bootargs ${bootargs_base} ${bootargs_init} ${mini2440} ${root_nand}
    set_bootargs_nfs=run set_root_nfs; setenv bootargs ${bootargs_base} ${bootargs_init} ${mini2440} ${root_nfs} ${ifconfig}
    mtdids=nand0=mini2440-nand
    bootcmd=nboot.e kernel ; bootm
    mtdparts=mtdparts=mini2440-nand:256k@0(u-boot),128k(env),5m(kernel),-(root)
    bootfile=/tftpboot/uImage
    filesize=208C00
    fileaddr=31000000
    netmask=255.255.255.0
    ipaddr=192.168.0.100
    serverip=192.168.0.104
    bootargs=root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200
    partition=nand0,0
    mtddevnum=0
    mtddevname=u-boot
    mini2440=mini2440=0tb


    • Olá Matheus,

      Dependendo do kernel que você esta usando, precisa ter o parâmetro “mini2440=0tb” no bootargs para o kernel inicializar corretamente o display LDC.

      Um abraço.

  • Matheus Mendes

    Sergio,
    Consegui fazer funcionar o LCD… era problema no drive não estava configurado corretamente para o Sony X35. Fiz a parte do script de inicialização só que quando dou o comando ts_calibrate ele avisa que "não encontra o arquivo ou diretorio".
    Tem alguma idéia do pq?

    • Olá Matheus,

      Não me lembro deste erro. Você vai ter que debugar.

      Um abraço.

  • Diego Perez

    Olá Sergio,
    Como faz para copiar o aplicativo para o rootfs da mini2440. Eu não sei como fazer isso.
    Abraço.

  • Estou com um problema parecido com o Matheus Mendes ali acima. O mini2440 aqui possui o LCD da Sony (X35). Para fazê-lo funcionar, tive que usar o kernel lá do site do FriendlyARM. Consegui compilar tudo certo e passar pro kit. Quando tentava executar o ts_calibrate, ele me dava essa mensagem de "ts_open: No such file or directoty", mas era o problema do contexto e tal. Acabei resolvendo colocando os exports no /etc/profile. O problema agora é que ele não acha o dispositivo quando tento executar o ts_calibrate: "ts_open: No such device". Tentei executar o ts_finddev, mas ele não retorna nada. Tentei mudar manualmente no script entre o /dev/input/event0 até o input3, mas em nenhum deles obtive sucesso.
    Teria eu que fazer alguma configuração extra no Buildroot ou no kernel (2.6.32.2)?

  • O mais estranho é que quando eu tento dar um "cat /dev/input/eventX" (sendo x 0, 1, 2 ou 3), ele também acusa "No such device"…

  • Só pra registrar, consegui resolver. Por algum motivo, na configuração do kernel o Touchscreen estava com a opção errada selecionada. Se alguém estiver com o mesmo poblema, é só rodar 'make linux-menuconfig' e ativar a opção em Device Drivers->Input Device Support->Touchscreens->Samsung S3C2410 touchscreen input driver. E o meu touchscreen rodou em /dev/input/event0.

    • Boa Rafael!

      Tenho certeza que esta dica vai ajudar bastante gente!

      Um abraço.

  • Carlos Augusto B Costa

    Boa tarde! Preciso rodar o rdesktop no mini 2440. Descompactei ele dentro do mini mas não consegui instalar. Você pode me ajudar? Desde já agradeço.

  • Nilson Custódio Junior

    Olá Sérgio!
     
    Estou tendo problemas para compilar com o QT… Aparece a seguinte mensagem:
     
     
    linking ../../lib/libQtNetwork.so.4.7.4
    .obj/release-shared-emb-arm/qnativesocketengine_unix.o: In function `QNativeSocketEnginePrivate::nativeAccept()':
    qnativesocketengine_unix.cpp:(.text+0x930): undefined reference to `accept4'
    .obj/release-shared-emb-arm/qlocalserver_unix.o: In function `QLocalServerPrivate::_q_onNewConnection()':
    qlocalserver_unix.cpp:(.text+0x724): undefined reference to `accept4'
    collect2: ld returned 1 exit status
    make[2]: *** [../../lib/libQtNetwork.so.4.7.4] Error 1
    make[2]: Leaving directory `/home/nilsao/buildroot/output/build/qt-4.7.4/src/network'
    make[1]: *** [sub-network-make_default-ordered] Error 2
    make[1]: Leaving directory `/home/nilsao/buildroot/output/build/qt-4.7.4'
    make: *** [/home/nilsao/buildroot/output/build/qt-4.7.4/.stamp_built] Error 2
     
    Eu procurei em um monte de lugar e não achei…
     
    Agradeço muito se puder ajudar!
     

    • Olá Nilson,

      Acho que já tive este problema antes. Procure pela função accept4() nos fontes do Qt. Ela deve estar implementada dentro de um “#ifdef”, mas por algum motivo este “#define” não esta definido nos fontes. Remova o #ifdef da implementação da função que deve compilar.

      Um abraço.

  • Nilson Custódio Junior

    Olá Sergio!
    A dica que vc me passou funcionou. Porém agora estou com algum outro problema. Você disse que o kernel que está no CD não funciona e por isso deixou um kernel para download. O que você mudou no kernel?
    Acredito que isso seja a raiz do meu problema agora.
          Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
    Já que eu usei o kernel do CD. Antes eu não conseguia fazer aparecer o Tux na tela, mas agora eu consigo, porém dá a mensagem acima.
     
    Desde já muito Obrigado!

    • Olá Nilson,

      É bem provável que seja a tabela de partições da flash. Dá uma olhada no arquivo “arch/arm/mach-s3c2440/mach-mini2440.c” no kernel que disponibilizei. Lá dentro defino as partições da flash, que devem estar identicas às partições definidas no U-Boot.

      Um abraço.

  • Nilson Custódio Junior

    Olá Sergio! Mais uma vez foi pontual no problema…
    O meu problema é que o display não funcionava com o kernel fornecido aqui. Enquanto não achava o problema eu fiz o seguinte, que talvez possa ajudar alguém:
    Eu descompactei o kernel do linux que vc passou;
    Pelo console do linux, entrei na pasta do kernel que havia descompactado, digitei make menuconfig
    Depois disso, fui vasculhando todas as opções até achar uma que trata da parte de vídeo. Nela havia todas as opções de display para a placa Mini2440. Só alterei para o meu display A70 e compilei novamente usando o BuildRoot, conforme seu artigo.
    Desculpe se é até obvio, mas pode ajudar quem também está começando nesse mundo meio louco do Linux.
     
    Um abraço a todos!
    nilsao@gmail.com

  • Rafael

    Sérgio, Bom dia.

    Fiz todos os passos orientados por você e quando rodo o ts_calibrate, o mini2440 me retorna o seguinte erro:

    ts_config: No such file or directory

    Vc sabe aonde deve ir esse arquivo? Eu não acho ele em lugar nenhum.

    Grato, 

    Rafael

    • Olá Rafael,

      Confirme se no arquivo /etc/ts.conf a linha “module_raw input” esta mesmo sem nenhum comentario.

      Um abraço.

      • Rafael

        Sérgio,  
        Já tinha tirado o comentário da linha citada por você, mas mesmo assim continua não funcionando. 

        Talvez esteja faltando algum arquivo ou configuração, porém eu não sei aonde é e nem sei aonde procurar. Também não achei o ts_config no mini.

        Rafael

        • Olá Rafael, 

          Nunca vi este problema. Neste caso, acho que é mais fácil dar uma olhada no código fonte do ts_calibrate e da tslib para tentar identificar o problema.

          Um abraço.

  • Rodrigo

    Sérgio, Bom dia.

    Baixei o build root, porém alguns parâmetros de configuração não aparecem como citado por você. Você tem alguma dica?
    Ex:
    Toolchain —>
    [*] Build/install c++ compiler and libstdc++?
    Package Selection for the target —>
    Graphic libraries and applications (graphic/text) —>
    [*] Qt —>
    [*] Compile and install demos and examples (with code)
    Mouse drivers —>
    [*] tslib

    • Rodrigo

      Sérgio,
      Na verdade eu somente não acho a opção Build/install c++ …

      • Olá Rodrigo,

        Você selecionou para o Buildroot gerar o toolchain? Qual a versão do Buildroot você esta usando?

  • JoseLOrdonez

    Señor Sergio Prado
    Cordial Saludo

    Teniendo en cuenta la experiencia que tienes con la mini2440, quisiera saber si puedes ayudarme a cargar un programa(Aplicacion) que lo he hecho en Qt Creator y lo quiero ejecuatar o compilar en la mini2440.

    Quisiera saber que archivos que me genera el programa(Qt Creator) tengo que cargarlos a la mini2440 y en que carpetas.

    De antemano Muchas Gracias.

    • Olá Jose,

      Você só precisa carregar o binário da aplicação gerado pelo QtCreator para a mini2440. Você pode copiá-lo para qualquer diretório. Normalmente usa-se /usr/sbin.

      Um abraço,

      Sergio Prado

  • Gerson

    como copio o aplicativo para a mini2440, voce usa algum codigo no terminal? ou tem como copiar direto?

    • Olá Gerson,

      A resposta depende da localização do seu rootfs. Normalmente no desenvolvimento trabalhamos com NFS. Dá uma olhada no artigo abaixo:

      http://sergioprado.org/mini2440-montando-rootfs-no-linux-via-nfs/

      Se o seu rootfs estiver no cartão SD, você pode removê-lo do kit, colocar em um leitor na sua máquina de desenvolvimento e copiar.

      Se o rootfs estiver na flash, você pode usar o próprio cartão SD, um pendrive, ou então uma conexão de rede.

      Um abraço.

  • Sergio,

    Legal seu blog, tenho lido os artigos e gostando muito, embora eu seja inexperiente na plataforma. Parabéns pelo belo trabalho. 

    Tenho visto todas as “receitas” aqui e aparentemente usa Linux. Você sugere que eu instale uma partição com Linux no meu PC com Windows para seguir seus artigos ou tem alguma outra forma de fazer isso pelo Windows? Tenho um Mini2440 e estou tentando brincar um pouco com interfaces gráficas para controles remotos.

    Abraço

    JR

    • Olá JR,

      Você pode instalar o Ubuntu no seu Windows sem precisar particioná-lo usando o Windows Installer:

      http://www.ubuntu.com/download/desktop/windows-installer

      É rápido e bem fácil, e você terá um sistema dual boot.

    • Cleber

      Uma alternativa é utilizando o Oracle VirtualBox (gratuito) e funciona muito bem.
      Outra opção é o VMWare Workstation (versão free)…

  • Elifas Diego

    ola Sergio, com alguns tutoriais seus e outros da net consegui compilar e gravar um linux em uma placa com o processador sam9g45 da atmel, agora eu comecei a aprender a fazer algums programinhas com o gtk+3, ja da para testes, queria saber como compilar o meu programa para embarcar na placa da atmel, uso o debian wheezy. este vai ser meu tcc de eng. computacao – embarcar um linux criar um hardware externo e uma aplicaçao grafica para trabalhar com o dispositivo. ate obrigado

    • Olá Elifas,

      Não tenho nenhum tutorial pronto sobre este assunto. Procure por “cross-compiling GTK applications” no google.

  • Vinicius Pais Oliveira

    Olá Sergio Prado, tudo bem com você?

    Gostaria de sua ajuda para sanar algumas dúvidas… Tenho um kit FriendlyARM de 1GB e LCD 3,5″, eu nunca utilizei ele pois é muito hardware para meus projetinhos de hobby.

    Agora estou indo para o quarto ano de engenharia elétrica e gostaria de utilizar este kit em meu TCC. Lí todos os seus artigos sobre o mini2440 e este me chamou muito a atenção por se tratar de interface gráfica!

    Quero desenvolver um sistema de análise da qualidade da energia elétrica (exemplo: http://assets.fluke.com/manuals/F430-II_umpor0100.pdf), onde vou trabalhar com cálculos integrais, derivadas, limites, trigonometria, FFT e etc, resumindo, muitos cálculos e gráficos!

    É possível desenvolver no mini2440 utilizando Linux Embarcado e QT?
    Qual sua opnião, crítica ou sugestão sobre tudo isso?

    Desde já, agradeço sua ajuda!
    Parabéns pelos posts, tem me ajudado muito!
    Abraço.
    Vinícius Pais

    • Olá Vinicius, como vai?

      A resposta genérica é sim, é possível. Mas o resultado pode depender de vários fatores. A aplicação tem caracteristicas de tempo real? Que tipo de interfaces de hardware precisa para este projeto? A placa tem estas interfaces?

      • Vinicius Pais Oliveira

        Como se trata de um analisador de forma de onda elétrica (osciloscópio), acredito que necessite de tempo real, vou precisar de pelo menos 2 ADC’s de 3 canais (rede trifásica) com alta amostragem!
        Vi um vídeo onde o autor coloca RTOS junto com Linux embarcado e QT, o que é esse RTOS? Ele não tem interface gráfica?
        Abraço!

        • Um RTOS é um outro sistema operacional (Real-Time Operating System).

          No seu caso, você pode avaliar o uso dos patches de tempo real do Linux (PREEMPT_RT) ou mesmo a integração de um RTOS junto com o Linux (pesquise por Xenomai).

          E aí eu descartaria Java, pelo menos para as aplicações críticas.

  • Sebastião Ferreira

    Boa noite!
    Sergio, ainda estou em fase inicial nesse assunto, mas, tira-me uma dúvida, o Qt posso utilizar com a linguagem python? Posso ter o mesmo propósito que C++

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