10 Comentários

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

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

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Beaglebone Black » Criando uma imagem customizada para a BeagleBone Black com Buildroot
Comentários:
Notificações
Notificar
guest
10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Isac Marques
Isac Marques
14/11/2018 13:14

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 »

Eric Hall
Eric Hall
15/09/2014 16:17

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
Diego Sueiro
Reply to  Eric Hall
15/09/2014 20:24

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
Reply to  Eric Hall
15/09/2014 21:41

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
Eric Hall
Reply to  Henrique Persico Rossi
16/09/2014 14:59

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
Gabriela
12/09/2014 21:37

Muito bom o tutorial Henrique!

Henrique Rossi
Reply to  Gabriela
12/09/2014 23:45

Muito obrigado Gabriela!!

Abraços,
Henrique

Jonathan Sperb
Jonathan Sperb
26/10/2016 13:17

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
Reply to  Jonathan Sperb
05/11/2016 15:43

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!!

Talvez você goste:

Séries

Menu

WEBINAR
 
Porque o RTOS não faz o que eu quero?

Data: 28/10 às 19:30h - Apoio: Mouser Electronics
 
INSCREVA-SE AGORA »



 
close-link