Mini2440 – Instalando o Android
- por Sergio Prado
No último post sobre o kit FriendlyARM mini2440, instalamos o U-boot e a distribuição Emdebian. Se você ainda não leu e quiser der uma olhada, clique aqui.
Agora vamos (finalmente) rodar o sistema operacional Android nele.
Depois de muitas tentativas, não consegui rodá-lo a partir da flash. Em algum ponto do processo de inicialização, o script de boot trava e a interface gráfica não sobe. Depois de muita pesquisa, cheguei à conclusão de que o provável causador é a “baixa” quantidade de RAM (64M), pois o Android funcionou sem problemas configurando uma partição de SWAP no cartão SD.
O nosso trabalho aqui então será simples: formatar e copiar os arquivos para um cartão SD (1G no mínimo) e configurar o u-boot para iniciar o Android por este cartão SD. Para isso, você vai precisar do U-boot instalado na NAND. Se ainda não o tiver, execute os procedimentos descritos neste post.
Como sempre, utilizaremos uma máquina Linux para a execução dos procedimentos de instalação. Para facilitar o trabalho de todos, criei um pacote com os arquivos necessários para a instalação. Este arquivo pode ser baixado aqui (link não está mais disponível).
CONFIGURANDO O CARTÃO SD
O cartão SD deverá ser de no mínimo 1G. Vamos criar 3 partições:
- Partição 1 -> SWAP – 512M – Memória Swap
- Partição 2 -> EXT2 – 20M – Kernel
- Partição 3 -> EXT3 – Restante – Rootfs
Você pode usar qualquer ferramenta de particionamento de disco, como “fdisk”, “cfdisk” ou “sfdisk”. Eu usei o “gparted” que tem uma interface gráfica simples. Nosso cartão SD ficou assim:
Depois de formatado, é necessário copiar os arquivos para o cartão SD. Baixe e descompacte o arquivo que disponibilizei neste link (link não está mais disponível). Copie os arquivos da pasta “Partition2” para a partição 2 do cartão SD. Copie também os arquivos da pasta “Partition3” para a partição 3 do cartão SD.
CONFIGURANDO O U-BOOT
Para configurar o U-boot para carregar o Android do cartão SD, precisamos alterar as variáveis de ambiente “bootargs” e “bootcmd”, conforme abaixo:
MINI2440 # setenv bootargs 'console=ttySAC0,115200 root=/dev/mmcblk0p3 rootfstype=ext3 mini2440=0tb rootdelay=3 init=/linuxrc' MINI2440 # setenv bootcmd 'mmcinit ; ext2load mmc 0:2 0x31000000 uImage ; bootm 0x31000000' MINI2440 # saveenv |
A variável “bootargs” armazena os parâmetros que serão passados ao kernel. O detalhe aqui é o parâmetro “mini2440”, onde você deve usar o valor “0tb” para displays de 3.5″, e “1tb” para displays de 7″.
Na variável “bootcmd” temos os comandos usados pelo U-boot para iniciar o Android pelo cartão SD. Primeiro iniciamos o driver para a leitura do cartão SD com o comando “mmcinit”. Aqui o U-boot mostra o quanto ele é flexivel. Com o comando “ext2load mmc 0:2 0x31000000 uImage” conseguimos ler da segunda partição do cartão SD um sistema de arquivos ext2 e carregar o arquivo uImage para a RAM no endereço 0x31000000. E então iniciamos o Android pela RAM com o comando “bootm 0x31000000”.
E NÃO É QUE FUNCIONA?
O primeiro boot é um pouco demorado, então tenha paciência. Mas funciona! Veja abaixo algumas imagens do Android rodando no mini2440:
Confesso que esperava uma performance melhor. Não tive problemas de travamentos, mas a execução do Android ficou um pouco lenta. A imagem precisaria ser mais otimizada para ser embarcada em um produto final, mas já pode servir de base para estudarmos o sistema operacional.
No próximo post vamos aprender a usar o Buildroot para construir do zero um toolchain e uma distribuição Linux customizada para o mini2440. Até lá!
Um abraço,
Sergio Prado