Como desenvolver um sistema Linux do zero para a Beaglebone Black

- por Sergio Prado

Categorias: Beaglebone Black, Linux Tags: , ,

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

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.