Como desenvolver um sistema Linux do zero para a Beaglebone Black
- por Sergio Prado
Neste artigo iremos criar um sistema Linux customizado para a Beaglebone Black.
Todo processo de criação de um sistema Linux customizado envolve o trabalho em quatro componentes diferentes:
- Toochain
- Bootloader
- Kernel
- Sistema de arquivos (rootfs)
Vamos começar preparando o ambiente, para depois trabalhar separadamente em cada um destes componentes.
PREPARANDO O TERRENO
Todos os testes foram realizados em uma máquina rodando o Ubuntu 12.04. Se você estiver usando outra distribuição Linux ou mesmo outra versão do Ubuntu, pode ser que precise adaptar algum comando deste artigo.
Primeiro defina um diretório de trabalho e armazene-o em uma variável de ambiente:
$ export BBB_PATH=~/bbb/ |
Usaremos esta variável de ambiente para referenciar o diretório de trabalho em alguns comandos durante este artigo. Não esqueça de definir esta variável sempre que abrir uma nova seção do shell.
Crie o diretório de trabalho e entre nele:
$ mkdir $BBB_PATH && cd $BBB_PATH |
TOOLCHAIN
Para facilitar o trabalho, utilizaremos o toolchain disponibilizado pela Linaro, que já esta empacotado no Ubuntu 12.04. Para instalar o toolchain, basta executar o comando abaixo:
$ sudo apt-get install gcc-arm-linux-gnueabi |
Verifique se o toolchain foi instalado com sucesso:
$ arm-linux-gnueabi-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gnueabi-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.7/lto-wrapper Target: arm-linux-gnueabi Configured with: [...] gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-1ubuntu1) |
BOOTLOADER
A Beaglebone Black tem suporte total no mainline do U-Boot. Portanto, é só baixar a última versão do site do projeto:
$ cd $BBB_PATH $ wget ftp://ftp.denx.de/pub/u-boot/u-boot-2013.07.tar.bz2 $ tar xjfv u-boot-2013.07.tar.bz2 $ cd u-boot-2013.07 |
Configure o U-Boot para a Beaglebone Black e compile:
$ make am335x_evm_config $ make CROSS_COMPILE=arm-linux-gnueabi- -j2 |
Ao final do processo de compilação, teremos as imagens do X-Loader (MLO) e do U-Boot (u-boot.bin) geradas no diretório principal do U-Boot. Mais adiante gravaremos estas imagens no cartão SD.
KERNEL
O kernel da Beaglebone Black esta disponível no github da Beagleboard.
Clone o repositório e aplique os patches da Beagleboard Black. O comando patch.sh abaixo vai clonar um repositório git do kernel, e pode demorar um pouco.
$ cd $BBB_PATH $ git clone git://github.com/beagleboard/kernel.git $ cd kernel $ git checkout 3.8 $ ./patch.sh |
Copie o arquivo de configuração da Beagleboard Black e o firmware do chip de gerenciamento de energia para o diretório do kernel:
$ cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig $ wget http://arago-project.org/git/projects/?p=am33x-cm3.git\;a=blob_plain\;f=bin/am335x-pm-firmware.bin\;hb=HEAD -O kernel/firmware/am335x-pm-firmware.bin |
Agora compile o kernel e o dtb (device tree):
$ cd kernel $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- beaglebone_defconfig -j2 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage dtbs -j2 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage-dtb.am335x-boneblack -j2 |
ROOTFS
Utilizaremos o Buildroot para gerar o rootfs.
Faça o download do Buildroot e descompacte-o:
$ cd $BBB_PATH $ wget http://buildroot.net/downloads/buildroot-2013.08.tar.bz2 $ tar xjfv buildroot-2013.08.tar.bz2 $ cd buildroot-2013.08 |
Abra o menu de configuração:
$ make menuconfig |
E faça as seguintes configurações:
Target Architecture (ARM (little endian)) Target Architecture Variant (cortex-A8) Toolchain ---> Toolchain type (External toolchain) Toolchain (Sourcery CodeBench ARM 2013.05) System configuration ---> /dev management (Dynamic using mdev) (ttyO0) Port to run a getty (login prompt) on |
Selecione em “Target packages” as bibliotecas e aplicações que deseja incluir no rootfs.
Agora é só compilar.
$ make |
Ao final do processo de compilação, a imagem do rootfs estará disponível no diretório abaixo:
$ ls output/images/ rootfs.tar |
GRAVANDO
Agora vamos gravar as imagens no cartão SD. Para isso, usaremos a ferramenta mediacreate.
Primeiro, baixe a ferramenta:
$ cd $BBB_PATH $ git clone https://github.com/sergioprado/mediacreate.git $ cd mediacreate/ |
Depois copie as imagens geradas para o diretório da ferramenta:
$ cp -av $BBB_PATH/u-boot-2013.07/MLO . $ cp -av $BBB_PATH/u-boot-2013.07/u-boot.img . $ cp -av $BBB_PATH/kernel/kernel/arch/arm/boot/uImage . $ cp -av $BBB_PATH/kernel/kernel/arch/arm/boot/dts/am335x-boneblack.dtb . $ cp -av $BBB_PATH/buildroot-2013.08/output/images/rootfs.tar . $ echo 'bootargs=console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait' > uEnv.txt $ echo 'uenvcmd=mmc dev ${mmcdev};load mmc ${mmcdev} ${loadaddr} uImage;load mmc ${mmcdev} ${fdtaddr} am335x-boneblack.dtb;bootm ${loadaddr} - ${fdtaddr}' >> uEnv.txt |
Por fim, execute o mediacreate. Substitua <device> no comando abaixo pelo nome do arquivo de dispositivo do cartão SD (ex: /dev/sdd).
$ sudo ./mediacreate -f -z -c configs/bbb_linux.cfg -d /dev/<device> |
Agora é só colocar o cartão SD na Beaglebone Black e testar!
Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.8.13-00720-gb6a69d1 (sprado@sprado-desktop) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-1ubuntu1) ) #1 SMP Tue Oct 15 21:19:32 BRT 2013 [ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=50c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: Generic AM33XX (Flattened Device Tree), model: TI AM335x BeagleBone [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.000000] AM335X ES1.0 (neon ) [ 0.000000] PERCPU: Embedded 8 pages/cpu @c0b26000 s9408 r8192 d15168 u32768 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 129792 [ 0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) ... [ 2.198388] tilcdc 4830e000.fb: fb0: frame buffer device [ 2.204063] tilcdc 4830e000.fb: registered panic notifier [ 2.209752] [drm] Initialized tilcdc 1.0.0 20121205 on minor 0 [ 2.265134] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6 [ 2.271552] davinci_mdio 4a101000.mdio: detected phy mask fffffffb [ 2.279137] libphy: 4a101000.mdio: probed [ 2.283401] davinci_mdio 4a101000.mdio: phy[2]: device 4a101000.mdio:02, driver SMSC LAN8710/LAN8720 [ 2.293242] Detected MACID = c8:a0:30:ac:29:fe [ 2.297895] cpsw 4a100000.ethernet: NAPI disabled [ 2.304641] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800) [ 2.321028] ALSA device list: [ 2.324180] #0: TI BeagleBone Black [ 2.470967] EXT4-fs (mmcblk0p2): recovery complete [ 2.476031] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 2.484536] VFS: Mounted root (ext4 filesystem) on device 179:2. [ 2.499985] devtmpfs: mounted [ 2.503358] Freeing init memory: 216K [ 2.703956] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered Starting logging: OK Starting mdev... Initializing random number generator... done. Starting network... Welcome to Buildroot buildroot login: root # |
SUPORTE NO MAINLINE DO BUILDROOT
Em breve a Beaglebone Black terá suporte nativo no Buildroot. Os patches enviados por Jason Kridner devem provavelmente entrar na próxima versão (2013.11). Isso significa que todo o processo de geração das imagens será resumido à dois comandos:
$ make beaglebone_defconfig $ make |
Enquanto isso, esse tutorial deve te ajudar a criar um sistema Linux customizado para a Beaglebone Black.
Bom divertimento!
Sergio Prado