Galileo + Yocto - Como construir sua própria distribuição Linux Embarcado

O lançamento da Intel Galileo causou um grande alvoroço na comunidade maker. Em partes pelo fato da placa ser compatível com as shields Arduino e com isso os projetos ganham um maior poder de fogo com emprego do SoC Quark da Intel.

 

O intuito dessa plataforma é de viabilizar aplicações focadas em IoT (Internet das Coisas) e recentemente ela ganhou mais fama devido a uma ação promocional promovida pela Microsoft, onde você preenchia alguns formulários para ganhar uma placa sem custos. No momento de escrita deste post tivemos alguns relatos no Facebook de algumas pessoas já estarem recebendo suas placas.

 

Aprenda mais sobre Linux Embarcado e Yocto Project com os vídeos das palestras do "Seminário Linux Embarcado 2015"

 

 

Conheça os detalhes de hardware e funcionalidades da Galileo neste review escrito por Thiago Lima.

 

Neste post ensinaremos como criar uma distribuição Linux Embarcado com o Yocto Project para a Galileo. Para conhecer melhor sobre o Yocto é recomendada a leitura da seção "O que é o Yocto?" do post BeagleBone Black + Yocto escrito por Henrique Persico Rossi.

 

 

Preparando o Host

 

Usaremos como Host uma máquina Ubuntu 14.04 64bits.

 

Vamos baixar IDE Arduino para a Galileo. Esta IDE, que não é 100% compatível com a IDE Arduino padrão, será necessária para enviarmos os sketches desenvolvidos bem como o atualizar o firmware da Galileo. A atualização do firmware da Galileo é recomendada a ser feita para uma placa nova, dessa maneira tem-se a certeza de que a placa irá funcionar corretamente com a IDE Arduino.

 

Faça o download e descompacte a IDE em sua máquina host através do link: https://communities.intel.com/docs/DOC-22226

 

 

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 para Galileo Yocto

 

Após instalar os pacotes para o Host, vamos criar os diretórios e baixar os fontes necessários:

 

Diferentemente dos outros tutoriais do Embarcados sobre a construção de distribuições Linux Embarcado com o Yocto, o repositório baixado já possui as camadas e configurações necessárias para a construção das imagens para a Galileo. O repositório "meta-intel-iot-devkit" já possui o core do Openembedded, a camada da distribuição "iot-devkit", a camada de BSP "meta-quark-bsp" que traz o suporte para a Galileo, dentre outras.

 

A versão base utilizada neste tutorial é a Daisy (1.6.1).

 

Nota: Na data de escrita desse post há um bug na receita do pacote xdk-daemon, onde o valor do MD5 da licença do pacote está errado. Foi enviado um patch para a correção mas ainda não foi integrado ao repositório oficial. Para contornarmos esse problema iremos executar o comando abaixo:

 

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

 

Adicione a seguinte variável no arquivo ~/yocto/build-iot-devkit-daisy-1.6.1/conf/local.conf: 

 

O ajuste da variável "DL_DIR" é feito para reaproveitarmos todos os fontes baixados em outros projetos com o Yocto. Dê uma olhada no arquivo local.conf e veja quais as configurações realizadas.

 

 

Construindo a imagem Galileo Yocto

 

Vamos gerar uma imagem (iot-devkit-image) com o comando "bitbake iot-devkit-image", mas antes temos que carregar as variáveis de ambiente para construção:

 

Toda vez que um novo terminal de comando for aberto você precisará rodar o comando abaixo antes de chamar o bitbake:

 

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

 

 

Testando a imagem

 

Como dito anteriormente, é recomendado que se atualize o firmware da Galileo. Para isso, execute a IDE Arduino para a Galileo e siga os passos descritos nesse link: https://learn.sparkfun.com/tutorials/galileo-getting-started-guide/updating-firmware

 

Um dos maiores contratempos da Galileo com certeza é a interface serial de debug do sistema. Além dos sinais da serial serem em RS-232 eles estão disponíveis através do conector 3.5mm (ao lado do conector RJ45), o que não é muito usual. Caso deseje ter acesso a essa interface de comunicação, você pode seguir esse tutorial.

 

Abaixo segue uma imagem de referência sobre como deve ser a conexão do cabo:

 

Galileo Yocto - Cabo de console serial para a placa Galileo da Intel
Figura 1 - Cabo de console serial para a placa Galileo da Intel. Referência: https://communities.intel.com/message/208514#208514

 

Vamos usar o sistema instalado em um cartão microSD e para isso vamos formatá-lo em uma partição do tipo FAT. Conecte o microSD em seu computador e identifique qual device node ele pertence. Rode o comando abaixo:

 

Nesse caso o microSD foi populado em /dev/sdc e a primeira partição está em /dev/sdc1. Vamos agora formatá-la como FAT: 

 

Remova e insira o cartão novamente e verifique onde ele foi montado no sistema: 

 

Aqui constatamos que o cartão está disponível em: /media/GALILEO. Vamos copiar os artefatos de software gerados pelo Yocto que estão disponípiveis em: ~/yocto/build-iot-devkit-daisy-1.6.1/tmp/deploy/images/quark/

 

Edite o arquivo /media/GALILEO/boot/grub/grub.conf para que fique com o seguinte conteúdo: 

 

Notem que configuramos o GRUB para utilizar o initramfs (core-image-minimal-initramfs-quark.cpio.gz), o kernel (bzImage) e sistema de arquivos gerados (rootimage=iot-devkit-image-quark.ext3) pelo Yocto.

 

Remova o microSD e insira na Galileo.

 

 

Conectando a Galileo via Rede

 

Configure sua máquina Host para trabalhar como servidor DHCP na porta de rede ethernet, faça a conexão com a Galileo e energize a placa.

 

Espere uns 30 segundos e verifique qual IP que foi atribuído a Galileo:

 

Neste caso foi atribuído o IP 10.42.0.72. Vamos conectar via ssh na placa: 

 

Pronto. Agora já temos um meio de comunicação para exploração da Galileo.

 

Como referência, abaixo segue o log do boot na interface serial de debug: