IoT e Makers

22 jun, 2018

7 dicas para construir dispositivos de quiosque com Nerves e Buildroot

Publicidade

Há cerca de um ano estou trabalhando em uma máquina interessante. O primeiro desafio foi construir um dispositivo de quiosque. Durante o trabalho, fiz muita pesquisa e acabei chegando no Nerves.

O que é Nerves?

Crie e implante softwares incorporados à prova de balas no Elixir.

Você pode ler mais sobre este projeto aqui: https://nerves-project.org/

O Nerves é uma excelente ferramenta para ajudar você a envolver o software que você escreveu em um único firmware. Você pode gravá-lo em cartão SD, pen drive ou em uma unidade SD. Arquivo de firmware de arquivo único é uma grande vantagem. Você pode gravar algumas versões de firmware em vários pen drives e alterná-los facilmente.

O que precisamos alcançar?

Precisamos de um dispositivo de quiosque com duas telas. Os monitores devem nos mostrar um conteúdo da web servido pelo servidor local (sem conexão com a internet). O material de backend é escrito em Elixir, é claro. Todas as coisas estão rodando no X86_64 com o Radeon. O importante é que precisaremos do poder total da GPU.

Sobre o que é este artigo?

Não é um guia passo a passo para construir uma coisa dessas. Compartilharei com vocês algumas dicas aprendidas durante o trabalho com buildroot e nerves.

Começo!

Como bom começo, temos que gravar alguma coisa e ver o que vai acontecer.

O primeiro que eu tentei, foi esse aqui:

Bom começo, mas nada funciona. Por que? Porque não há drivers de radeon. Nós cuidaremos disso mais tarde.
Então, eu comecei a construir um novo nerves_system no topo de:

Cache do Buildroot

Eu passei muito tempo observando o sistema de nerves compilar. Para tornar as coisas mais rápidas, você pode ativar o cache. O Buildroot tem um build em solução. Tudo que você precisa fazer é adicionar uma única linha ao arquivo nerves_defconfig.

BR2_CCACHE=y

Agora sua próxima construção deve terminar muito mais rápido.

Radeon drivers

Como eu mencionei, o driver GPU é uma obrigação. Existem dois lugares. O primeiro é um kernel Linux, o segundo é uma configuração burildroot.

Eu adicionei essa linha no arquivo linux – *.config:

CONFIG_DRM_AMDGPU=y
CONFIG_DRM_AMDGPU_SI=y
CONFIG_DRM_AMDGPU_CIK=y
CONFIG_DRM_AMDGPU_USERPTR=y
BR2_PACKAGE_LINUX_FIRMWARE=y
BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y

Sim, nada de mais! Mas isso não é o suficiente; precisamos de algumas outras coisas. Para fazê-lo funcionar, precisaremos de pelo menos a versão 2018.05 do buildroot. Não se preocupe, o Nerves o suportam a partir de uma versão 1.2. Isso pode ser feito com a versão posterior, mas por que devemos nos preocupar com hacks sujos se podemos tornar isso mais fácil?

Precisamos dos drivers kernel e mesa3d!

BR2_PACKAGE_LINUX_FIRMWARE=y
BR2_PACKAGE_LINUX_FIRMWARE_AMDGPU=y
BR2_PACKAGE_MESA3D=y
BR2_PACKAGE_MESA3D_LLVM=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI=y
BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON=y
BR2_PACKAGE_MESA3D_OPENGL_EGL=y
BR2_PACKAGE_MESA3D_OPENGL_TEXTURE_FLOAT=y

As duas primeiras linhas instalarão o driver da GPU no sistema alvo, e em seguida, nós pedimos ao buildroot para instalar os drivers da mesa3d. A última linha é importante. Eu passei muito tempo tentando entender por que há muitas falhas na tela, a última linha resolve o problema completamente.

Faça as coisas mais rápido

Descobri que nosso aplicativo é muito mais lento em comparação com um aplicativo executado no Ubuntu. Não é sobre GPU. A carga da CPU foi duas vezes maior que no Ubuntu? Por que? Como sempre, muita pesquisa e uma solução muito fácil.

CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ_FULL_ALL=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_IRQ_TIME_ACCOUNTING=y
CONFIG_SCHED_SMT=y
CONFIG_PREEMPT=y
CONFIG_CPU_IDLE_GOV_MENU=y

Eu sei que parece estranho, mas esses switches do kernel irão melhorar o planejamento de tempo da CPU. Como eu descobri isso? Quando pensei no por quê da média de carga ser tão alta. Observei como o kernel do Ubuntu está configurado. Houve seção da CPU; depois de algumas consultas ao Google, ficou claro.

Otimização de compilação

O Buildroot otimizando o sistema de destino para o tamanho não é muito produtivo. Você pode mudar isso.

BR2_OPTIMIZE_3=y

É isso aí! Você pode tentar o BR2_OPTIMIZE_FAST, mas isso não funcionará para mim.

Mostre-me algo

Precisamos de um navegador da web! Durante um dos ElixirConf, os caras do Nerves nos convenceram a usar o QT5. QT é ótimo. É muito leve, tem um componente webengine e você pode criar um aplicativo com poucas linhas de código C ++ e QML. Como posso instalar isso? Você está aqui:

BR2_PACKAGE_QT5=y
BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM=y
BR2_PACKAGE_QT5BASE_LINUXFB=y
BR2_PACKAGE_QT5BASE_DEFAULT_QPA="eglfs"
BR2_PACKAGE_QT5BASE_GIF=y
BR2_PACKAGE_QT5BASE_PNG=y
BR2_PACKAGE_QT5MULTIMEDIA=y
BR2_PACKAGE_QT5WEBENGINE=y

Outra vantagem disso é que você não precisa se preocupar com a configuração do Xorg ou Wayland. Não é necessária. O QT possui seu próprio compositor e suporta o OpenGL também.

Configurando o WebEngine

É muito fácil configurar o WebEngine dentro do seu aplicativo. Tudo o que você precisa usar é a variável de ambiente QTWEBENGINE_CHROMIUM_FLAGS.

Passei muito tempo tentando descobrir como ativar o antialiasing no contexto do WebGL. Tentei adicionar switches, mas sempre no final dos parâmetros o QT adicionou alguns switches próprios que desabilitam o antialiasing. O switch –disable-embedded-switches fez o trabalho.

Espero que tenha sido útil para vocês. Obrigado pela leitura! Você gostou? Obrigado!

***

Michał Kalbarczyk faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://blog.fazibear.me/7-tips-building-kiosk-device-with-nerves-and-buildroot-9d6cbf089600