Linux embarcado com o SAM9M10 da Atmel
- por Sergio Prado
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