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:

$ sudo apt-get install build-essential libncurses5-dev bzr cvs git mercurial rsync subversion

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

$ mkdir -p ~/work/dl
$ mkdir -p ~/work/buildroot/dl
$ cd ~/work/dl
$ wget https://buildroot.org/downloads/buildroot-2016.08.1.tar.bz2
$ cd ~/work/buildroot/
$ tar xjvf ~/work/dl/buildroot-2016.08.1.tar.bz2
$ cd buildroot-2016.08.1

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:

$ make beaglebone_defconfig

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:

$ make menuconfig

A seguinte tela é exibida: 

Target options  --->
Build options  --->
Toolchain  --->
System configuration  --->
Kernel  --->
Target packages  --->
Filesystem images  --->
Bootloaders  --->
Host utilities  --->
Legacy config options  --->

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):

Target options  --->
    Target Architecture (ARM (little endian))  --->
    Target Architecture Variant (cortex-A8)  --->
    Target ABI (EABIhf)  --->
    Floating point strategy (VFPv3-D16)  --->
    ARM instruction set (ARM)  --->

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

ARM instruction set (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

Toolchain  --->
    Toolchain type (Buildroot toolchain)  --->

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:

Toolchain type (External toolchain)  --->
Toolchain (Linaro ARM 2016.02)  --->
Toolchain origin (Toolchain to be downloaded and installed)  --->
[*] Copy gdb server to the Target
[ ] Copy gconv libraries (NEW)
[*] Enable MMU support
() Target Optimizations
() Target linker options
[ ] Register toolchain within Eclipse Buildroot plug-in

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:

[ ] afboot-stm32
[ ] Barebox
[ ] mxs-bootlets
[ ] s500-bootloader
[ ] ts4800-mbrboot
[*] U-Boot
      Build system (Legacy)  --->
(am335x_evm) U-Boot board name
      U-Boot Version (Custom version)  --->
(2016.05) U-Boot version
()    Custom U-Boot patches
[ ]   U-Boot needs dtc
      U-Boot binary format (u-boot.img)  --->
[*]   Install U-Boot SPL binary image
(MLO)   U-Boot SPL binary image name
[ ]     CRC SPL image for Altera SoC FPGA
[ ]   Environment image  ----
[ ] X-loader

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
[*] Linux Kernel
      Kernel version (Custom Git repository)  --->
(https://github.com/beagleboard/linux.git) URL of custom repository
(4.4) Custom repository version
()    Custom kernel patches
      Kernel configuration (Using an in-tree defconfig file)  --->
(bb.org) Defconfig name
()    Additional configuration fragment files
      Kernel binary format (zImage)  --->
      Kernel compression format (gzip compression)  --->
[*]   Build a Device Tree Blob (DTB)
        Device tree source (Use a device tree present in the kernel.)  --->
(am335x-bone am335x-boneblack) Device Tree Source file names
[ ]   Install kernel image to /boot in target
      Linux Kernel Extensions  --->
      Linux Kernel Tools  --->

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:

Build options  --->
    ($(TOPDIR)/../dl) Download dir

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:

Filesystem images  --->
    [*] tar the root filesystem
        Compression method (no compression)  --->

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.

System configuration  --->
    [*] Run a getty (login prompt) after boot  --->
        (ttyS0) TTY port

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

$ make

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:

henrique@henrique-550P5C-550P7C:~/work/boards/beaglebone-black/buildroot-2016.08.1/output/images$ ll
total 253316
drwxr-xr-x 2 henrique henrique      4096 Nov  5 16:28 ./
drwxr-xr-x 6 henrique henrique      4096 Nov  5 16:01 ../
-rw-r--r-- 1 henrique henrique     62069 Nov  5 16:27 am335x-boneblack.dtb
-rw-r--r-- 1 henrique henrique     59200 Nov  5 16:27 am335x-bone.dtb
-rw-r--r-- 1 henrique henrique  16777216 Nov  5 16:28 boot.vfat
-rw-r--r-- 1 henrique henrique     71280 Nov  5 16:08 MLO
-rw-r--r-- 1 henrique henrique  84810752 Nov  5 16:28 rootfs.ext2
lrwxrwxrwx 1 henrique henrique        11 Nov  5 16:28 rootfs.ext4 -> rootfs.ext2
-rw-r--r-- 1 henrique henrique  70236160 Nov  5 16:28 rootfs.tar
-rw-r--r-- 1 henrique henrique 101588480 Nov  5 16:28 sdcard.img
-rw-r--r-- 1 henrique henrique    417676 Nov  5 16:08 u-boot.img
-rw-r--r-- 1 henrique henrique        96 Nov  5 16:28 uEnv.txt
-rw-r--r-- 1 henrique henrique   7849096 Nov  5 16:27 zImage

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:

$ cd ~/work
$ git clone https://github.com/henriqueprossi/beaglebone-black.git

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:

$ dmesg
$ sudo fdisk -l

Caso, por exemplo, o device node criado seja /dev/sdb, use o seguinte comando:

$ cd ~/work/beaglebone-black/scripts
$ chmod +x format_sd_card.sh
$ sudo ./format_sd_card.sh /dev/sdb

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: 

$ cd ~/work/buildroot/buildroot-2016.08.1/output/images
$ cp MLO /media/boot
$ cp u-boot.img /media/boot
$ cp zImage /media/boot
$ mkdir /media/boot/dtbs
$ cp am335x-boneblack.dtb /media/boot/dtbs/
$ sudo tar xvf rootfs.tar -C /media/rootfs
$ sync

É 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: 

$ cd ~/work/beaglebone-black/scripts
$ cp uEnv.txt /media/boot
$ sync

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.

U-Boot SPL 2016.05 (Nov 05 2016 - 16:08:05)
Trying to boot from MMC1
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
reading u-boot.img


U-Boot 2016.05 (Nov 05 2016 - 16:08:05 -0200)

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Error - No Valid Environment Area found
*** Warning - bad CRC, using default environment

Net:   <ethaddr> not set. Validating first E-fuse MAC
cpsw, usb_ether
Press SPACE to abort autoboot in 2 seconds
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
reading boot.scr
** Unable to read file boot.scr **
reading uEnv.txt
602 bytes read in 5 ms (117.2 KiB/s)
Loaded env from uEnv.txt
Importing environment from mmc0 ...
Running uenvcmd ...
reading zImage
7849096 bytes read in 448 ms (16.7 MiB/s)
reading /dtbs/am335x-boneblack.dtb
62069 bytes read in 14 ms (4.2 MiB/s)
Kernel image @ 0x80007fc0 [ 0x000000 - 0x77c488 ]
## Flattened Device Tree blob at 80f80000
   Booting using the fdt blob at 0x80f80000
   Loading Device Tree to 8ffed000, end 8ffff274 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.30 (henrique@henrique-550P5C-550P7C) (gcc version 5.3.1 20160113 (Linaro GCC 5.3-2016.02) ) #1 SMP PREEMPT RT Sat Nov 5 16:17:46 BRST 2016
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: TI AM335x BeagleBone Black
[    0.000000] cma: Reserved 48 MiB at 0x9c800000
[    0.000000] Memory policy: Data cache writeback
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] AM335X ES2.1 (sgx neon )
[    0.000000] PERCPU: Embedded 14 pages/cpu @df8ff000 s25792 r8192 d23360 u57344
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 129408
[    0.000000] Kernel command line: console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 449264K/522240K available (11525K kernel code, 940K rwdata, 3828K rodata, 708K init, 962K bss, 23824K reserved, 49152K cma-reserved, 0K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xe0800000 - 0xff800000   ( 496 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0xc0008000 - 0xc0f069a0   (15355 kB)
[    0.000000]       .init : 0xc0f07000 - 0xc0fb8000   ( 708 kB)
[    0.000000]       .data : 0xc0fb8000 - 0xc10a328c   ( 941 kB)
[    0.000000]        .bss : 0xc10a6000 - 0xc1196960   ( 963 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000]  Build-time adjustment of leaf fanout to 32.
[    0.000000]  RCU restricting CPUs from NR_CPUS=2 to nr_cpu_ids=1.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=1
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[    0.000000] OMAP clockevent source: timer2 at 24000000 Hz
[    0.000017] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
[    0.000030] clocksource: timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000039] OMAP clocksource: timer1 at 24000000 Hz
[    0.001330] clocksource_probe: no matching clocksources found
[    0.001553] Console: colour dummy device 80x30
[    0.046734] Calibrating delay loop... 995.32 BogoMIPS (lpj=1990656)
[    0.046757] pid_max: default: 32768 minimum: 301
[    0.046918] Security Framework initialized
[    0.046926] Yama: becoming mindful.
[    0.046964] AppArmor: AppArmor disabled by boot time parameter
[    0.047147] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.047156] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.048149] Initializing cgroup subsys io
[    0.048174] Initializing cgroup subsys memory
[    0.048220] Initializing cgroup subsys devices
[    0.048236] Initializing cgroup subsys freezer
[    0.048250] Initializing cgroup subsys net_cls
[    0.048262] Initializing cgroup subsys perf_event
[    0.048275] Initializing cgroup subsys net_prio
[    0.048300] Initializing cgroup subsys pids
[    0.048430] CPU: Testing write buffer coherency: ok
[    0.048439] ftrace: allocating 34439 entries in 101 pages
[    0.153440] CPU0: thread -1, cpu 0, socket -1, mpidr 0
[    0.153632] Setting up static identity map for 0x80008280 - 0x800082d8
[    0.186905] Brought up 1 CPUs
[    0.186936] SMP: Total of 1 processors activated (995.32 BogoMIPS).
[    0.186948] CPU: All CPU(s) started in SVC mode.
[    0.188671] devtmpfs: initialized
[    0.219040] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3
[    0.245309] omap_hwmod: debugss: _wait_target_disable failed
[    0.299965] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.306400] xor: measuring software checksum speed
[    0.342880]    arm4regs  :  1218.000 MB/sec
[    0.382773]    8regs     :   956.000 MB/sec
[    0.422765]    32regs    :  1088.000 MB/sec
[    0.462766]    neon      :  1641.000 MB/sec
[    0.462779] xor: using function: neon (1641.000 MB/sec)
[    0.462833] pinctrl core: initialized pinctrl subsystem
[    0.465396] NET: Registered protocol family 16
[    0.470470] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.482837] cpuidle: using governor ladder
[    0.494807] cpuidle: using governor menu
[    0.502321] OMAP GPIO hardware version 0.1
[    0.518920] No ATAGs?
[    0.518965] hw-breakpoint: debug architecture 0x4 unsupported.
[    0.519716] omap4_sram_init:Unable to allocate sram needed to handle errata I688
[    0.519739] omap4_sram_init:Unable to get sram pool needed to handle errata I688
[    0.630906] raid6: int32x1  gen()   251 MB/s
[    0.698814] raid6: int32x1  xor()   215 MB/s
[    0.766844] raid6: int32x2  gen()   330 MB/s
[    0.834803] raid6: int32x2  xor()   262 MB/s
[    0.902931] raid6: int32x4  gen()   307 MB/s
[    0.970853] raid6: int32x4  xor()   248 MB/s
[    1.038911] raid6: int32x8  gen()   300 MB/s
[    1.106896] raid6: int32x8  xor()   201 MB/s
[    1.174783] raid6: neonx1   gen()  1451 MB/s
[    1.242779] raid6: neonx1   xor()   843 MB/s
[    1.310768] raid6: neonx2   gen()  1896 MB/s
[    1.378788] raid6: neonx2   xor()  1168 MB/s
[    1.446781] raid6: neonx4   gen()  1963 MB/s
[    1.514783] raid6: neonx4   xor()  1208 MB/s
[    1.582815] raid6: neonx8   gen()  1097 MB/s
[    1.650798] raid6: neonx8   xor()   796 MB/s
[    1.650810] raid6: using algorithm neonx4 gen() 1963 MB/s
[    1.650821] raid6: .... xor() 1208 MB/s, rmw enabled
[    1.650831] raid6: using intx1 recovery algorithm
[    1.663720] edma 49000000.edma: TI EDMA DMA engine driver
[    1.669626] SCSI subsystem initialized
[    1.671447] usbcore: registered new interface driver usbfs
[    1.671549] usbcore: registered new interface driver hub
[    1.671689] usbcore: registered new device driver usb
[    1.672516] omap_i2c 44e0b000.i2c: could not find pctldev for node /ocp/l4_wkup@44c00000/scm@210000/pinmux@800/pinmux_i2c0_pins, deferring probe
[    1.672581] omap_i2c 4819c000.i2c: could not find pctldev for node /ocp/l4_wkup@44c00000/scm@210000/pinmux@800/pinmux_i2c2_pins, deferring probe
[    1.672735] media: Linux media interface: v0.10
[    1.672820] Linux video capture interface: v2.00
[    1.672948] pps_core: LinuxPPS API ver. 1 registered
[    1.672958] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    1.673010] PTP clock support registered
[    1.674169] omap-mailbox 480c8000.mailbox: omap mailbox rev 0x400
[    1.676128] NetLabel: Initializing
[    1.676149] NetLabel:  domain hash size = 128
[    1.676158] NetLabel:  protocols = UNLABELED CIPSOv4
[    1.676233] NetLabel:  unlabeled traffic allowed by default
[    1.676661] clocksource: Switched to clocksource timer1
[    1.858765] NET: Registered protocol family 2
[    1.859826] TCP established hash table entries: 4096 (order: 2, 16384 bytes)
[    1.859901] TCP bind hash table entries: 4096 (order: 4, 114688 bytes)
[    1.860107] TCP: Hash tables configured (established 4096 bind 4096)
[    1.860203] UDP hash table entries: 256 (order: 2, 16384 bytes)
[    1.860249] UDP-Lite hash table entries: 256 (order: 2, 16384 bytes)
[    1.860600] NET: Registered protocol family 1
[    1.865643] RPC: Registered named UNIX socket transport module.
[    1.865668] RPC: Registered udp transport module.
[    1.865678] RPC: Registered tcp transport module.
[    1.865687] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.866847] hw perfevents: enabled with armv7_cortex_a8 PMU driver, 5 counters available
[    1.870399] futex hash table entries: 256 (order: 2, 16384 bytes)
[    1.870546] audit: initializing netlink subsys (disabled)
[    1.870638] audit: type=2000 audit(1.796:1): initialized
[    1.888854] zbud: loaded
[    1.889761] VFS: Disk quotas dquot_6.6.0
[    1.890103] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    1.898095] NFS: Registering the id_resolver key type
[    1.898179] Key type id_resolver registered
[    1.898191] Key type id_legacy registered
[    1.898231] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    1.898694] fuse init (API version 7.23)
[    1.899568] SGI XFS with ACLs, security attributes, realtime, no debug enabled
[    1.919606] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 249)
[    1.923991] io scheduler noop registered
[    1.924018] io scheduler deadline registered
[    1.924114] io scheduler cfq registered (default)
[    1.926075] pinctrl-single 44e10800.pinmux: 142 pins at pa f9e10800 size 568
[    1.929244] wkup_m3_ipc 44e11324.wkup_m3_ipc: could not get rproc handle
[    1.931140] Serial: 8250/16550 driver, 6 ports, IRQ sharing disabled
[    1.935658] console [ttyS0] disabled
[    1.935784] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 158, base_baud = 3000000) is a 8250
[    2.796697] console [ttyS0] enabled
[    2.802156] [drm] Initialized drm 1.1.0 20060810
[    2.860691] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6
[    2.866843] davinci_mdio 4a101000.mdio: detected phy mask fffffffe
[    2.873449] davinci_mdio: dt: updated phy_id[0] from phy_mask[fffffffe]
[    2.885802] libphy: 4a101000.mdio: probed
[    2.890034] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver SMSC LAN8710/LAN8720
[    2.900174] cpsw 4a100000.ethernet: Detected MACID = 1c:ba:8c:e5:41:46
[    2.907045] cpsw 4a100000.ethernet: cpts: overflow check period 2125
[    2.915674] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    2.922311] ehci-platform: EHCI generic platform driver
[    2.927838] ehci-omap: OMAP-EHCI Host Controller driver
[    2.933656] usbcore: registered new interface driver usb-storage
[    2.942350] 47401300.usb-phy supply vcc not found, using dummy regulator
[    2.965855] 47401b00.usb-phy supply vcc not found, using dummy regulator
[    2.987727] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[    2.993590] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 1
[    3.001791] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    3.008659] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.015919] usb usb1: Product: MUSB HDRC host driver
[    3.020911] usb usb1: Manufacturer: Linux 4.4.30 musb-hcd
[    3.026339] usb usb1: SerialNumber: musb-hdrc.1.auto
[    3.032523] hub 1-0:1.0: USB hub found
[    3.036440] hub 1-0:1.0: 1 port detected
[    3.064842] mousedev: PS/2 mouse device common for all mice
[    3.073369] omap_rtc 44e3e000.rtc: already running
[    3.078759] omap_rtc 44e3e000.rtc: rtc core: registered 44e3e000.rtc as rtc0
[    3.087522] i2c /dev entries driver
[    3.093192] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec
[    3.100775] cpuidle: enable-method property 'ti,am3352' found operations
[    3.108413] omap_hsmmc 48060000.mmc: Got CD GPIO
[    3.178667] hidraw: raw HID events driver (C) Jiri Kosina
[    3.180838] mmc0: host does not support reading read-only switch, assuming write-enable
[    3.182948] mmc0: new high speed SDHC card at address 0007
[    3.197144] mmcblk0: mmc0:0007 SD4GB 3.68 GiB 
[    3.199736]  mmcblk0: p1 p2
[    3.216173] usbcore: registered new interface driver usbhid
[    3.221782] usbhid: USB HID core driver
[    3.226018] ashmem: initialized
[    3.230728]  remoteproc0: wkup_m3 is available
[    3.235213]  remoteproc0: Note: remoteproc is still under development and considered experimental.
[    3.242960] mmc1: MAN_BKOPS_EN bit is not set
[    3.246865] mmc1: new high speed MMC card at address 0001
[    3.254709]  remoteproc0: THE BINARY FORMAT IS NOT YET FINALIZED, and backward compatibility isn't yet guaranteed.
[    3.261166] mmcblk1: mmc1:0001 MMC04G 3.66 GiB 
[    3.269056] mmcblk1boot0: mmc1:0001 MMC04G partition 1 1.00 MiB
[    3.277076] mmcblk1boot1: mmc1:0001 MMC04G partition 2 1.00 MiB
[    3.279365]  mmcblk1: p1 p2
[    3.299286] NET: Registered protocol family 10
[    3.309799] mip6: Mobile IPv6
[    3.312862] NET: Registered protocol family 17
[    3.317526] Key type dns_resolver registered
[    3.321832] mpls_gso: MPLS GSO support
[    3.325845] omap_voltage_late_init: Voltage driver support not added
[    3.333795] PM: Cannot get wkup_m3_ipc handle
[    3.338317] ThumbEE CPU extension supported.
[    3.342644] Registering SWP/SWPB emulation handler
[    3.348869] registered taskstats version 1
[    3.353215] zswap: loaded using pool lzo/zbud
[    3.366232] Btrfs loaded
[    3.371110] Key type encrypted registered
[    3.383034] input: tps65217_pwr_but as /devices/platform/ocp/44e0b000.i2c/i2c-0/0-0024/input/input0
[    3.419574] tps65217 0-0024: TPS65217 ID 0xe version 1.2
[    3.425673] at24 0-0050: 32768 byte 24c256 EEPROM, writable, 1 bytes/write
[    3.432963] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz
[    3.440913] at24 2-0054: 32768 byte 24c256 EEPROM, writable, 1 bytes/write
[    3.448426] at24 2-0055: 32768 byte 24c256 EEPROM, writable, 1 bytes/write
[    3.455897] at24 2-0056: 32768 byte 24c256 EEPROM, writable, 1 bytes/write
[    3.463354] at24 2-0057: 32768 byte 24c256 EEPROM, writable, 1 bytes/write
[    3.470322] omap_i2c 4819c000.i2c: bus 2 rev0.11 at 100 kHz
[    3.477900]  remoteproc0: powering up wkup_m3
[    3.482310]  remoteproc0: Booting fw image am335x-pm-firmware.elf, size 217148
[    3.483885] bone_capemgr bone_capemgr: Baseboard: 'A335BNLT,000C,2414BBBK2850'
[    3.483908] bone_capemgr bone_capemgr: compatible-baseboard=ti,beaglebone-black - #slots=4
[    3.505381]  remoteproc0: remote processor wkup_m3 is now up
[    3.505423] wkup_m3_ipc 44e11324.wkup_m3_ipc: CM3 Firmware Version = 0x192
[    3.520761] bone_capemgr bone_capemgr: slot #0: No cape found
[    3.564670] bone_capemgr bone_capemgr: slot #1: No cape found
[    3.608668] bone_capemgr bone_capemgr: slot #2: No cape found
[    3.652665] bone_capemgr bone_capemgr: slot #3: No cape found
[    3.658575] bone_capemgr bone_capemgr: initialized OK.
[    3.666641] PM: bootloader does not support rtc-only!
[    3.673150] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:48 UTC (946684848)
[    3.681864] of_cfs_init
[    3.684490] of_cfs_init: OK
[    7.729014] EXT4-fs (mmcblk0p2): recovery complete
[    7.738763] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    7.747032] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    7.756825] devtmpfs: mounted
[    7.761188] Freeing unused kernel memory: 708K (c0f07000 - c0fb8000)
Starting logging: OK
Initializing random number generator... [    8.099173] random: dd: uninitialized urandom read (512 bytes read, 10 bits of entropy available)
done.
Starting network: OK
/etc/init.d/S93-am335x-pm-firmware-load: line 4: can't create /sys/devices/ocp.2/44d00000.wkup_m3/firmware/am335x-pm-firmware.bin/loading: nonexistent directory
/etc/init.d/S93-am335x-pm-firmware-load: line 5: can't create /sys/devices/ocp.2/44d00000.wkup_m3/firmware/am335x-pm-firmware.bin/data: nonexistent directory
/etc/init.d/S93-am335x-pm-firmware-load: line 6: can't create /sys/devices/ocp.2/44d00000.wkup_m3/firmware/am335x-pm-firmware.bin/loading: nonexistent directory

Welcome to Buildroot
beaglebone login: root
# uname -a
Linux beaglebone 4.4.30 #1 SMP PREEMPT RT Sat Nov 5 16:17:46 BRST 2016 armv7l GNU/Linux
#

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.
Comentários:
Notificações
Notificar
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 Persico 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
Gabriela
12/09/2014 21:37

Muito bom o tutorial Henrique!

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

Home » Beaglebone Black » Criando uma imagem customizada para a BeagleBone Black com Buildroot

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: