Linux embarcado com o SAM9M10 da Atmel

- por Sergio Prado

Categorias: Hardware, Linux Tags: , ,

Nem só de Beagleboard e FriendlyARM vive o mercado de soluções para sistemas embarcados com Linux. Existem outras opções de fabricantes como NXP, Freescale e Atmel.

Nas últimas semanas, tive a oportunidade de trabalhar com o kit AT91SAM9M10-G45-EK da Atmel. E como não existe muita documentação na Internet sobre este kit e também sobre o uso de produtos da Atmel com Linux embarcado, resolvi documentar minhas impressões neste post, e quem sabe ajudar outras pessoas com as mesmas necessidades.


Não é um kit que recomendo para quem quer estudar Linux embarcado. No momento que escrevo este post, você pode comprar o kit pela “bagatela” de 750 dolares (FOB). Mas é uma opção interessante para avaliar a CPU em projetos comerciais, e para quem esta acostumado a trabalhar com produtos da Atmel.

HARDWARE

O AT91SAM9M10-G45-EK é uma plataforma de avaliação para a CPU AT91SAM9M10 da Atmel, um ARM9 de 400MHz. É uma CPU voltada à aplicações multimedia que combina interfaces de conectividade com playback de vídeo. A CPU possui um decodificador de vídeo por hardware com suporte à H.264, MPEG-4, MPEG-2, VC-1 e H.263.

O kit tem 128M de RAM DDR2 e 256M de flash NAND (o uso de flash NOR é opcional). Vem com um display LCD TFT touch de 4.3″, e possui diversas interfaces como USB device/host, Ethernet, UART, cartão SD/MMC, composite video, áudio, câmera, botões, leds, etc.


Mais informações sobre o kit você pode encontrar no site da Atmel.

PROCESSO DE BOOT

Sempre que começo a trabalhar com uma nova plataforma de hardware, procuro entender o processo de boot da CPU.

Este kit é capaz de trabalhar com 4 diferentes dispositivos de boot:

  • NAND Flash
  • SDCard
  • DataFlash® 
  • Serial DataFlash

E a sequência de boot acontece em algumas etapas:


A CPU possui um código em ROM que é executado no boot do equipamento. Este código verifica o pino de entrada BMS. Se não estiver setado, tentar bootar pela flash NOR. Se estiver setado, verifica a disponibilidade das interfaces SDCard, flash NAND e Dataflash, nesta ordem. Se encontrar uma destas interfaces disponíveis, carrega os primeiros 4KB para a SRAM e executa. Se não encontrar, cai em um código de boot chamado SAM-BA. Este é um software de recovery, que você pode usar para se comunicar com seu PC via USB para escrever na flash.

O uso do SAM-BA é uma estratégia interessante, já que você não tem uma flash NOR com um bootloader para gravar o U-Boot na NAND. Você pode então usar o SAM-BA para gravar o U-Boot na flash NAND, e a partir daí usar o U-Boot para gravar o kernel e o rootfs.

Portanto, se você apagar “acidentalmente” o bootloader da NAND, vai precisar do SAM-BA. A documentação do procedimento de recuperação usando o SAM-BA pode ser acessado aqui. E se você tiver problemas em usar a aplicação SAM-BA para Linux, como eu tive, dá uma lida neste application note da Atmel.

Uma vez que a CPU identificou a disponibilidade de um dos dispositivos de boot, a sequência continua conforme a imagem abaixo:


Os 4KB de código que o ROM code da CPU carregou para a SRAM no boot é o AT91BootStrap, um bootloader da Atmel. Sua responsabilidade é basicamente inicializar a CPU e a SDRAM, e carregar um bootloader de 3o. nível, que no nosso caso é o U-Boot. A partir daí, o processo é o mesmo de qualquer sistema com Linux embarcado, sendo o U-Boot o responsável por carregar o kernel do Linux para a memória e executá-lo.

SUPORTE AO LINUX

O kit vem com uma versão demo da distribuição Angstrom, que pode ser baixada aqui.

Toda a documentação sobre o uso de Linux neste kit pode ser encontrada no site da Atmel. É um ponto de partida para quem esta iniciando os trabalhos com Linux nesta plataforma. Mas como não é uma plataforma muito difundida entre hobbystas e entusiastas Linux (quando comparamos com a Beagleboard, por exemplo) existem poucos fóruns e sites com informações à respeito.

Foi utilizada a versão 1.3.4 do U-Boot para o port, bastando aplicar os patches disponíveis aqui. A versão 2.6.30 do kernel do Linux foi utilizada para desenvolver o BSP para esta plataforma, e os patches estão disponíveis aqui.

GERANDO UMA DISTRIBUIÇÃO LINUX DO ZERO

Com o Buildroot, é possível gerar uma distribuição Linux embarcada do zero para este kit em menos de 1 hora.

GRAVANDO O LINUX NA FLASH NAND

Como o U-Boot não tem suporte à interface SD/MMC, a única forma dele carregar o kernel e o rootfs é via interface Ethernet.

Portanto, podemos usar o TFTP para transferir as imagens para o U-Boot para gravá-las na flash.

Você vai precisar do servidor TFTP configurado na sua máquina de desenvolvimento. Se não tiver, este artigo da Timesys explica como fazer.

Com o TFTP configurado, copie as imagens do kernel (uImage) e do rootfs (rootfs.jffs2) para o diretório do TFTP, coloque o kit em rede com a máquina de desenvolvimento, ligue-o e entre no menu do U-Boot.

Primeiro, configure a rede (altere os endereços IP conforme a configuração da sua rede):

# setenv ipaddr 192.168.0.100
# setenv serverip 192.168.0.1
# saveenv

Você pode verificar se a rede esta configurando através do comando ping:

# ping 192.168.0.1

Para gravar o o kernel:

# tftp 0x72200000 uImage
# nand erase 0x00200000 0x00200000
# nand write.e 0x72200000 0x00200000 0x00200000

Para gravar o rootfs:

# tftp 0x72200000 rootfs.jffs2
# nand erase 0x00400000 0x03C00000
# nand write.jffs2 0x72200000 0x00400000 0x180000

Por último, configure o U-Boot para iniciar o Linux pela flash NAND:

# setenv bootargs 'mem=64M console=ttyS0,115200 mtdparts=atmel_nand:4M(bootstrap/uboot/kernel)ro,60M(rootfs),-(data) root=/dev/mtdblock1 rw rootfstype=jffs2'
# setenv bootcmd 'nand read.e 0x72200000 0x00200000 0x1ad8f0; bootm 0x72200000'
# saveenv

Dica final: sempre que possível, nunca se prenda a soluções fechadas/proprietárias.

A Atmel fornece a ferramenta SAM-BA, que além de poder ser usada como ferramenta para recuperar o bootloader da NAND, pode também ser usada para gravar o kernel e o rootfs na flash ou no cartão SD.

Mas eu prefiro soluções padronizadas e abertas como o TFTP e o U-Boot. Por quê? Porque quando eu migrar para produtos de outros fabricantes como a Texas, a Freescale, ou a NXP, já terei o caminho das pedras na cabeça. Suporte soluções open source. Sempre!

Um abraço,

Sergio Prado

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