Criando uma imagem customizada para a BeagleBone Black com Buildroot

Beaglebone Black com Buildroot

Algumas ferramentas open-source de build para sistemas embarcados baseados em Linux automatizam a tarefa de construção de uma distribuição customizada de Linux Embarcado (bootloader, kernel e root file system). Entre elas estão incluídas, por exemplo, o Yocto e o Buildroot. O objetivo deste post é criar uma imagem para a Beaglebone Black com Buildroot.

 

Temos mostrado como gerar imagens para a placa BeagleBone Black com o projeto Yocto. Agora chegou a vez de detalhar como esse processo pode ser realizado usando uma das ferramentas mencionadas anteriormente, muito utilizada pelos desenvolvedores de Linux embarcado, o Buildroot. 

 

 

O que é o Buildroot?

 

Buildroot é uma ferramenta composta por um conjunto de makefiles e patches instalados num sistema host, capaz de gerar uma distribuição customizada de Linux para sistemas embarcados, fazendo uso de cross-compilação. Seus releases são feitos de três em três meses, em Fevereiro, Maio, Agosto e Novembro. E o código de cada um deles segue o formato YYYY.MM.

 

Para atingirmos esse resultado, o Buildroot é capaz de gerar o seu próprio cross-toolchain, o sistema de arquivos raiz (rootfs), a imagem do kernel Linux utilizado e o binário do bootloader desejado para o dispositivo target. E o interessante dessa ferramenta é que podemos executar cada uma dessas tarefas de forma individual, independente uma da outra.

 

Por exemplo, pode-se utilizar o Buildroot para a geração de um sistema de arquivos customizado, e utilizar os binários já compilados do kernel e do bootloader, e fazer uso de um cross-toolchain externo.

 

A sua documentação é muito boa, detalhando como funciona os seus internals. Além disso, recomendo o material disponibilizado pela Free Electrons e pelo Sergio Prado.

 

 

Instalação do Buildroot

 

Para a instalação do Buildroot num sistema host que utiliza a distribuição Ubuntu 14.04 64-bits, faz-se necessária a instalação de alguns pacotes como pré-requisitos:

  • build-essencial;
  • ncurses5;
  • bazaar;
  • cvs;
  • git;
  • mercurial;
  • rsync;
  • scp;
  • subversion.

 

Para a instalação desses pacotes no host, execute o seguinte comando no console:

 

Agora vamos criar a estrutura base de pastas e fazer o download do Buildroot:

 

Vamos entender como o Buildroot trabalha no processo de customização de uma distribuição Linux?

 

 

Processo de customização - Beaglebone Black com Buildroot

 

Já existe uma configuração para as placas da família beaglebone, descrita em configs/beaglebone_defconfig. Dado que existe um ponto de partida para a customização da imagem para a placa, a ideia é fazer algumas modificações em cima dessa configuração inicial. O primeiro passo é aplicar tal configuração:

 

O próximo passo é entender o que foi estabelecido pela configuração padrão beaglebone_defconfig e alterar alguns pontos de acordo com as nossas necessidades. Para isso execute o seguinte comando:

 

A seguinte tela é exibida: 

 

O processo de cri­ação/customização de um sis­tema baseado em Linux para sistemas embarcados necessita da atenção em cinco pontos básicos:

  • Especificação do target/plataforma;
  • Cross-toolchain;
  • Bootloader;
  • Kernel Linux;
  • Customização do sistema de arquivos raiz, o rootfs.

 

Vai ser utilizada a lista anterior como guia para entendimento do que precisa ser feito. Vamos então para o primeiro item da lista, a especificação do target.

 

 

Especificação do target/plataforma

 

Vaja abaixo as opções de Target aplicadas pela configuração padrão para a família de placas Beaglebone (White e Black):

 

Veja que foi selecionada a arquitetura ARM Cortex-A8 Little Endian e o set de instruções ARM. Vamos alterar este último para Thumb2.

 

Visto que o target está muito bem especificado, é interessante  nos preocuparmos com o próximo item do sistema, o Toolchain.

 

 

Escolha do Toolchain a ser utilizado

 

 

Não vamos utilizar o toolchain criado pelo próprio Buildroot, e sim um que é muito utilizado em sistemas embarcados, o oferecido pela Linaro. Para isso, altere a opção acima para External toolchain, como mostrado abaixo:

 

A versão 2016.02 do cross-toolchain da Linaro possui as seguintes especificações:

  • Linaro GCC 2016.02 (baseado no gcc 5.3);
  • Linaro GDB 2016.02 (baseado no GDB 7.10);
  • glibc 2.21;
  • Binutils 2015.10 (baseado na versão 2.25);
  • Otimizado para ARM Cortex-A9;
  • O código gerado usa o set de instruções Thumb 2;
  • Usa convensão de chamada hard floating point com instruções VFPv3-D16 FPU.

 

A próxima parte do sistema a ser configurada é o Bootloader.

 

 

Bootloader

 

A configuração do bootloader a ser  utilizado, o U-Boot, já está correta. Veja abaixo:

 

Não precisamos alterar nada nessa configuração. Vamos para a próxima? 

 

 

Kernel Linux

 

O BSP do Buildroot para a BeagleBone Black, por padrão, faz uso do kernel 3.12.10, obtido do repositório da TI. Mas vamos alterar essa configuração para usarmos o repositório da Beaglebone e kernel 4.4. O Buildroot gera os arquivos zImage e am335x-boneblack.dtb para boot da placa.

 

Vamos deixar as configurações do kernel da seguinte forma:

  • Repositório: https://github.com/beagleboard/linux.git
  • Kernel 4.4
  • defconfig: bb.org
  • arquivos de device tree: am335x-bone am335x-boneblack

 

 

 

Geração das imagens

 

Vamos configurar, primeiramente, o local para download dos pacotes necessários para o processo de build. Para isso, altere a seguinte configuração do Buildroot:

 

Dessa forma conseguimos reaproveitar esses arquivos caso seja criado um build-system para outra placa. O diretório $(TOPDIR)/../dl servirá como uma espécie de repositório de pacotes.

 

Em seguida, precisa-se indicar o tipo de sistema de arquivos a ser utilizado pelo rootfs. Como será utilizado um SD-Card pré-formatado com o sistema de arquivos EXT4, basta gerar um pacote tar do sistema de arquivo raiz criado, adicionando a seguinte opção no Buildroot:

 

Precisamos também configurar a porta serial de console. Por padrão é indicado o device /dev/ttyO0, mas atualmente a porta utilizada pelo driver OMAP de porta serial é /dev/ttyS0.

 

Pronto! Agora vamos executar o último passo. Para geração das imagens para gravação na placa BeagleBone Black, execute o seguinte comando:

 

Os seguintes arquivos são criados no diretório output/images, como listado abaixo:

  • rootfs.tar (rootfs – sistema de arquivos raiz);
  • MLO (bootloader de primeiro estágio);
  • u-boot.img (bootloader de segundo estágio - U-Boot);
  • zImage (kernel) e;
  • am335x-boneblack.dtb (Device Tree Binary).

 

Segue a listagem desse diretório após o build completo:

 

 

Gravação das imagens no microSD Card

 

Para a gravação dessas imagens no microSD card, este deve ser particionado e formatado de acordo o padrão aceito pelo placa. Para isso foi criado um script, que pode ser obtido com os seguintes comandos:

 

Insira um microSD 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:

 

Assim que o processo de particionamento e formatação terminar, duas partições no microSD card são criadas:

  • boot (FAT32);
  • rootfs (ext4).

 

Execute a “montagem” dessas duas partições no sistema de arquivos do sistema host. Caso esse faça uso da distribuição Ubuntu, basta remover e inserir novamente o dispositivo no seu conector. Dado que, por exemplo, os pontos de montagem criados sejam /media/boot e /media/rootfs, as imagens geradas anteriormente são copiadas da seguinte forma: 

 

É necessário, também, criar o arquivo de parametrização do bootlader U-Boot, uEnv.txt, na partição boot do microSD card. Foi disponibilizada uma versão desse arquivo no repositório de scripts mencionado anteriormente. Execute os seguintes comandos: 

 

Pronto! Agora é conectar o microSD card na Beaglebone Black e curtir! Para que a placa rode a imagem que está gravada no micro SD-Card ao invés da que estiver gravada na memória eMMC, alimente a placa (tanto por uma fonte de alimentação de 5V ou pela porta USB do conector P4) com o botão S2, próximo ao cartão, pressionado. A porta serial de debug (/dev/ttyS0) da placa é usada para o console do sistema operacional  e o conteúdo de sua saída é mostrado abaixo. Pode ser montado um cabo serial como mostrado no tutorial BeagleBone Black Serial.

 

 

Condiderações finais

 

O resultado final obtido foi o mesmo utilizando o Yocto, porém o processo é diferente. Tenho usado as duas ferramentas, cada uma com a sua finalidade. E vocês? Têm usado o Buildroot ou já aderiram 100% ao movimento Yocto?

 

 

Para aprender mais

 

Embedded Linux Build Systems

Cozinhando com o Yocto Project

Desvendando Yocto Project – Primeiros passos

BeagleBone Black + Yocto

Beaglebone Black + Yocto Daisy (Versão 1.6)

Desenvolvendo um Kiosk Interativo para a Beaglebone Black com Yocto – parte 1

Beaglebone Black + Qt Embedded + Yocto – parte 1

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.

Henrique Rossi
Engenheiro eletricista com ênfase em eletrônica e pós-graduado em Engenharia de Software. Comecei um mestrado, mas o interrompi. Especialista na área de sistemas embarcados, com mais de 12 anos de experiência em desenvolvimento de firmware (sistemas baremetal e baseados em RTOS) e Linux Embarcado. Atualmente sou administrador do site Embarcados, trabalho num fabricante de Set-Top Box e atuo como consultor/desenvolvedor na área de sistemas embarcados.

10
Deixe um comentário

avatar
 
5 Comment threads
5 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
6 Comment authors
Isac MarquesDiego SueiroEric HallGabriela BarbosaHenrique Rossi Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Isac Marques
Visitante
Isac Marques

Boa tarde henrique, desde já sou grato por este material , esta me ajudando e muito, no entanto eu tive um pequeno problema no momento de executar o script que formata o sdcard, ele me peporta alguns erros, qual é o formato que o cartao devera estar para eu executar este script ? estou utilizando a ultima versão do ubuntu com a versão mais recente do buildroot .Segue abaixo o log gereado pelo script ############inicio log ############################## umount: /dev/sdb1: nenhum ponto de montagem especificado. umount: /dev/sdb2: nenhum ponto de montagem especificado. DISK SIZE - bytes (standard_in) 1: syntax error CYLINDERS… Leia mais »

Jonathan Sperb
Visitante
Jonathan Sperb

Olá. Estou tentando seguir o processo usando a versão mais recente do buildroot, mas estou tendo problemas de compilação. Aguém tentou e conseguiu usando a versão do buildroot após 2015? O problema acontece quando mudo o toolchain para o linaro. Abraço.

Henrique Rossi
Visitante

Olá Jonathan,

Muito obrigado pelo feedback e teste na versão mais atual do Buildroot. Também encontrei problema na copilação do kernel com o GCC da Linaro. Mas isso aconteceu porque o kernel da TI na versão 3.12 não suportava compilação com GCC 5.x.

Acabei atualizando o artigo todo, para usar o buildroot 2016.08.1 e kernel 4.4 do repositório da Beaglebone.Também atualizei o arquivo uEnv.txt no meu repositório do Github.

Atualize todo o ambiente e vai conseguir gerar e rodar a imagem sem problemas.

Muito obrigado!!

trackback
Eric Hall
Visitante
Eric Hall

Meu módulo usb host não funciona seguindo passo a passo o tutorial.
Por isso não consigo interagir com a busybox, pois não consigo conectar um teclado usb na interface usb host da BeagleBone Black. Alguma ideia do que possa ser pro problema?
Não está indo tensão para a interface usb host.
Quando usando outra configuração, até mesmo o Angstrom, o usb funciona normalmente.

Diego Sueiro
Visitante
Diego Sueiro

Olá Eric,

É bem possível que o módulo do usb não esteja carregado.

Vamos ver primeiro se ele foi compilado. Rode o comando abaixo na placa:
zcat /proc/config.gz | grep USB_MUSB_AM335X_CHILD

Tem que aparecer:
USB_MUSB_AM335X_CHILD=y ou USB_MUSB_AM335X_CHILD=m

Se estiver USB_MUSB_AM335X_CHILD=m rode o comando:
modprobe musb_am335x

E depois conecte os periféricos USB e veja se funcionam.

Abraços.

Henrique Rossi
Visitante

Olá Eric,

O driver USB Host não foi compilado como built-in, e sim como módulo, como o Diego também disse. Portanto, para fazer uso da porta USB é necessário carregar os seus módulos:

$ modprobe musb_am335x
$ modprobe musb_dsps.ko

Agora você pode conectar um dispositivo USB e usá-lo!

Caso queira habilitar o driver como built-in, altere as seguintes entradas no menuconfig do kernel:

Enable support for AM335x devices
USB_MUSB_AM335X_CHILD=y

TI DSPS platforms
USB_MUSB_DSPS=y

Num próximo post pretendo mostrar esses passos e como usar a última versão disponível do kernel para a placa.

Abraços!

Eric Hall
Visitante
Eric Hall

Consegui aqui. Obrigado pela atenção.
Estava usando a buildroot para configuração, e usei o comando make linux-menuconfig para configurações do kernel.
Encontrei nos devices drives o Usb support, e setei esses parametros passados por vocês. Ótimo trabalho e tutorial.
Agradeço também ao Diego Sueiro. =D

Gabriela Barbosa
Visitante
Gabriela

Muito bom o tutorial Henrique!

Henrique Rossi
Visitante

Muito obrigado Gabriela!!

Abraços,
Henrique