Mini2440 – Memory layout e bootloader

- por Sergio Prado

Categorias: Mini2440 Tags: , , , , ,

Recentemente comprei o kit FriendlyARM Mini2440, e escrevi um post introdutório sobre ele aqui.

Minhas impressões iniciais são muito boas. Ele é possivelmente um dos melhores kits existentes (que conheço) para se aprender sobre Linux embarcado, por ser um hardware robusto, pelas ferramentas existentes e pela relação custo/benefício.

Vamos ver então com um pouco mais de detalhes a arquitetura da CPU, o layout de memória e o bootloader que vem instalado de fábrica.

CPU E O LAYOUT DE MEMÓRIA

O kit, com todas as suas interfaces de I/O e memória, pode ser visto na figura abaixo:

A CPU é um Samsung S3C2440 baseado no core ARM920T, RISC, arquitetura Harvard e voltado para aplicações de baixo consumo. O datasheet pode ser baixado aqui.

Tem capacidade de endereçamento de até 1GB, sendo 8 bancos de memória de 128M selecionáveis através de 8 chip select's (nGCS0…nGCS7).

A memória RAM de 64MB (2 x 32MB) está mapeada para o endereço físico 0x30000000 através do nGCS6.

Existem duas memórias de programa neste kit, o que acaba sendo um diferencial perante outros kits ARM voltados para aprendizado. O kit possui 2MB de memória flash do tipo NOR e 64MB de memória flash do tipo NAND.

Para quem não conhece, vale aqui uma explicação sobre as diferenças entre estes dois tipos de memória.

Ambas foram inventadas na década de 80 pela Toshiba. As primeiras memórias NOR foram vendidas pela Intel em 88. Com tempo de resposta para apagar e escrever muito grande, mas com a possibilidade de acesso à leitura em qualquer posição de memória, foi uma aplicação ideal para memórias do tipo ROM, para armazenar programas que dificilmente são alterados, como a BIOS de PCs  e firmware de equipamentos eletrônicos.

Já as memórias do tipo NAND possui um tempo de escrita bem menor, e uma maior densidade, ou seja, mais MB de dados pelo mesmo espaço se comparados com as memórias NOR. Por outro lado, não é possível acesso de leitura à qualquer posição de memória. A leitura e gravação é feita por blocos de memória (4kB por exemplo). Isso dá a ela a aplicação ideal para armazenamento de dados. Quando usada como memória de programa, é necessário ter um bootloader que carrega seu conteúdo em memória RAM para ser executado.

O kit mini2440 consegue fazer o boot pelas duas memórias através de uma chave (NAND <-> NOR) no canto inferior direito da imagem acima.

Ao fazer o boot pela NAND, a CPU possui uma região especial chamada de "Boot internal SRAM", onde são carregados e executados os primeiros 4KB da NAND. Estes primeiros 4K de programa serão os responsáveis por carregar o resto do programa da NAND para a RAM, e rodar a aplicação a partir de lá.

Ao fazer o boot pela NOR, é carregado o bootloader Supervivi, que vêm instalado de fábrica. Ele é baseado no bootloader open source vivi da Samsung. Vamos dar uma olhada nele com mais detalhes.

BOOTLOADER SUPERVIVI

Para acessar o bootloader ligue os cabos RS232 e USB e deixe a chave de seleção de memória na posição NOR. Você pode usar qualquer aplicação para consoles como o HyperTerminal para Windows ou o minicom para Linux. Este é o menu inicial do bootloader Supervivi:

A opção "q" oferece um shell para o bootloader e as outras opções automatizam determinada tarefa.

Apesar da manipulação do bootloader ser pela console (porta serial), a transferência de arquivos é pela USB. Você vai precisar de uma aplicação adicional para transferir arquivos e imagens: DNW for Windows ou Usb-push for LinuxNos nossos exemplos usaremos um PC com Linux, mas os procedimentos com Windows são similares, e mais informações podem ser encontradas no manual de usuário do kit aqui.

CARREGANDO UMA APLICAÇÃO STANDALONE

Para carregar uma aplicação standalone na flash NAND, basta usar a opção "a". Esta aplicação standalone pode ser qualquer binário pronto para execução. Pode ser uma simples aplicação para piscar leds ou uma aplicação mais completa com RTOS. Vamos carregar aqui o binário "myled.bin" na flash, que vem como exemplo junto com o kit:

Primeiro devemos preparar o bootloader para carregar o arquivo com a opção "a":

[a] Absolute User Application
Enter your selection: a
USB host is connected. Waiting a download.

Depois devemos disparar a transferência com a aplicação usb-push:

$ sudo ./usbpush /media/cdrom0/sample\ code\ without\ OS/myled.bin
csum = 0x83c6
send_file: addr = 0x30000000, len = 0x0000084c

O bootloader vai exibir o status da transferência:

Now, Downloading [ADDRESS:30000000h,TOTAL:2134]
RECEIVED FILE SIZE:    2134 (2KB/S, 1S)
Downloaded file at 0x30000000, size = 2124 bytes
Write to flash ok: skipped size = 0x0, size = 0x84c
Então é só mudar a chave para NAND e reiniciar o kit.
 
Vale aqui ressaltar um detalhe que já expliquei mais acima: como sua aplicação esta rodando pela NAND, o processador vai carregar os primeiros 4K para a SRAM interna e executar. Portanto, os primeiros 4K da sua aplicação deverá ter um código para copiar seu conteúdo para a RAM e então bootar a aplicação de lá.
 
CARREGANDO O LINUX
 
O bootloader divide a flash em 4 partições. Acesse o menu do bootloader com a opção "q" e digite o comando "part show"
 
Supervivi&gt; part show
Number of partitions: 4
name            :       offset          size            flag
------------------------------------------------------------
vivi            :       0x00000000      0x00040000      0
param           :       0x00040000      0x00020000      0
kernel          :       0x00060000      0x00500000      0
root            :       0x00560000      0x3fa80000      0
Na primeira partição está o próprio bootloader da NAND, a segunda é uma região para armazenar parâmetros e variáveis usadas pelo bootloader, na terceira está o kernel e na quarta o rootfs.

Esta forma de trabalho facilita o desenvolvimento, porque você pode fazer alterações no rootfs sem ter que alterar o kernel, por exemplo.

Para então carregar o linux, o processo é bem parecido com a aplicação standalone explicada acima. A diferença é que você vai precisar executar separadamente os comandos "v" para o bootloader, "k" para o kernel e "y" para o rootfs.

O QUE MAIS POSSO FAZER COM ESTE BOOTLOADER

Você pode ainda carregar um WINDOWS CE (opções "n", "l", "w"), carregar uma aplicação diretamente para a memória e rodar de lá (opção "d"), formatar a flash (opção "f") e até fazer backup/restore da NAND (opções "u" e "r"). 

A regra aqui é usar o bootloader Supervivi na memória NOR para manipular a flash NAND, e assim não correr o risco de travar o kit. Se você apagar o conteúdo da NOR, só com um JTAG para você carregar novamente o bootloader.

Este bootloader, apesar de ajudar inicialmente, tem algumas deficiências, como suportar apenas sistemas de arquivo yaffs. No próximo post vamos carregar o u-boot, um bootloader bem mais flexivel, e brincar um pouco com o Android. Até lá!

Um abraço,

Sergio Prado

Faça um Comentário

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