Este é o primeiro post de uma série sobre o Desenvolvimento de Drivers para Linux (Linux Device Drivers Development, ou simplesmente, LDD) usando a Raspberry Pi. Particularmente, acho esse é um assunto que acho bastante interessante, por diversas razões.

Neste estudo estou usando como base o material gratuito da Free-electrons, que é uma empresa francesa que disponibiliza, dentre outros serviços, treinamento na área de Linux Embarcado. Se você der uma olhada no material, perceberá que o curso usa uma BeagleBone Black como target, como eu não tenho uma BBB e sou fã da Raspberry Pi, decidi “traduzir” as instruções do labs da Free-electrons para a Raspberry Pi. Essa “tradução” não será literal, e irá sendo postada aos poucos, a medida que eu for avançando no assunto.

O que é U-boot? Por que precisamos dele nessa série?

O Das U-boot (a.k.a U-boot) é um bootloader muito utilizado em sistemas embarcados. Em nossa jornada de desenvolvimento de drivers para Linux, ele será útil para bootarmos as diferentes versões da kernel que geraremos ao longo do caminho. Com ele, por exemplo, é possível bootarmos a kernel pela rede, o que evita de ficarmos tirando o SDCard toda a hora da Rpi.

Material Utilizado

Nosso target será uma Raspberry Pi model B rev. 2, a mais comum das Rpi. O nosso host é um Notebook x86_64 com Fedora 23.

Além do host e da target precisaremos ter acesso ao terminal serial da Rpi, para isso usamos um conversor TTL-Serial (UART-RS232) ou TTL-USB (geralmente baseado no C.I. FTDI FT232), facilmente encontrado em lojas especializadas em eletrônica.

Preparando o ambiente

Primeiro vamos instalar as ferramentas necessárias para cross-compuilar o U-boot. Abra uma janela do terminal e digite:

# dnf install gcc-arm-linux-gnu gcc-c++-arm-linux-gnu binutils-arm-linux-gnu

Com as ferramentas em mãos, vamos, agora, clonar o repositório do U-boot:

 $ git clone git://git.denx.de/u-boot.git 

Compilando…

Compilar o U-boot é muito simples. Antes de mais nada, precisamos setar a variável CROSS_COMPILE com o valor do prefixo das ferramentas de desenvolvimento que instalamos no primeiro passo apresentado:

$ export CROSS_COMPILE=arm-linux-gnu-

Em seguida, acesse a pasta u-boot, que foi criada com o comando clone do git. Dentro da pasta utilize o comando make para criar a configuração para a Raspberry Pi (v1 model B):

$ make rpi_defconfig

O comando acima cria um arquivo de configuração (.conf) no diretório do u-boot, com um preset para compilar o u-boot corretamente para a Raspberry Pi.

Agora, para compilar, digite make no terminal:

$ make

Após o processo, perceba que alguns arquivos foram criados, dentre eles o u-boot.bin, que o arquivo que usaremos para rodar o u-boot na Rpi.

No seu PC, monte a partição BOOT (a de menor tamanho, em torno de 105MB) do SDCard com o sistema operacional para a Rpi, como por exemplo, o Arch Linux ou o Raspbian. Mude o nome dos arquivos kernel.img e config.txt:

$ mv kernel.img kernel.img.old
$ mv config.txt config.txt.old

Agora, copie o arquivo u-boot.bin para a partição BOOT do SDCard:

$ cp u-boot.bin /mnt/boot/

Desmonte as partições do SDCard e insira-á na Rpi. Ligue o cabo de rede a um roteador ou a uma rede com DHCP, e ligue também os pinos UART a um conversor TTL-Serial ou TTL-USB. Abra um terminal serial e observe que o output:

U-Boot 2016.03-00394-gd085ecd (Mar 25 2016 - 17:11:41 -0300)

DRAM: 448 MiB
RPI Model B rev2 (0xe)
MMC: bcm2835_sdhci: 0
reading uboot.env

** Unable to read "uboot.env" from mmc0:1 **
Using default environment

In: serial
Out: lcd
Err: lcd
Net: Net Initialization Skipped
No ethernet found.
starting USB...
USB0: Core Release: 2.80a
scanning bus 0 for devices... 4 USB Device(s) found
 scanning usb for storage devices... 0 Storage Device(s) found
 scanning usb for ethernet devices... 1 Ethernet Device(s) found
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...

USB device 0: unknown device
Waiting for Ethernet connection... done.
BOOTP broadcast 1
DHCP client bound to address 10.42.0.159 (55 ms)
*** Warning: no boot file name; using '0A2A009F.img'
Using sms0 device
TFTP from server 10.42.0.1; our IP address is 10.42.0.159
Filename '0A2A009F.img'.
Load address: 0x200000
Loading: T T

Percebe-se que o processo de boot agora passa pelo U-boot, e não vai mais diretamente a kernel do Linux como anteriormente. Com esse recurso novo podemos carregar a kernel do Linux através da rede, via tftp, que é mais conveniente para o propósito de desenvolvimento de drivers para Linux. A montagem do servidor tftp será o assunto do próximo post.

Anúncios