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 criação/customização de um sistema 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
Cozinhando com o Yocto Project
Desvendando Yocto Project – Primeiros passos
Beaglebone Black + Yocto Daisy (Versão 1.6)
Desenvolvendo um Kiosk Interativo para a Beaglebone Black com Yocto – parte 1







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 »
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.
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.
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!
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
Muito bom o tutorial Henrique!
Muito obrigado Gabriela!!
Abraços,
Henrique
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.
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!!