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:
1 | $ 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:
1 2 3 4 5 6 7 | $ 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:
1 | $ 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:
1 | $ make menuconfig |
A seguinte tela é exibida:
1 2 3 4 5 6 7 8 9 10 | 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):
1 2 3 4 5 6 | 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.
1 | 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
1 2 | 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:
1 2 3 4 5 6 7 8 9 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [ ] 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [*] 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:
1 2 | 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:
1 2 3 | 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.
1 2 3 | 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:
1 | $ 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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:
1 2 | $ 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:
1 2 | $ dmesg $ sudo fdisk -l |
Caso, por exemplo, o device node criado seja /dev/sdb, use o seguinte comando:
1 2 3 | $ 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:
1 2 3 4 5 6 7 8 | $ 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:
1 2 3 | $ 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | 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
Beaglebone Black + Qt Embedded + Yocto – parte 1
Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.
Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
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 »
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!!
[…] [6] https://www.embarcados.com.br/beaglebone-black-buildroot/ […]
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