uBoot: "ARM, Levántate y anda"
u-boot es un bootloader libre para dispositivos empotrados de bajo poder computacional. Para los no versados en el tema, es algo así como elgrub de tu PDA o de tu navegador GPS, pero con notables diferencias, claro está. En ésta receta hablaré sobre como instalarlo y como usarlo para crear distintas particiones en la memoria Flash de tu handheld para, de este modo, poder instalar un sistema arrancable. Para ello, pondré como ejemplo la tarjeta mini2440 que compré hace unos días.
Introducción
Como he comentado anteriormente, u-boot es un bootloader totalmente libre para dispositivos empotrados de bajo poder computacional. Entre sus múltiples posibilidades, están las de particionar la memoría flash del dispostivo en el que se encuentre corriendo, asignar nombre a dichas particiones, cargar imágenes en RAM desde distintas fuentes, volcarlas a flash, y un largo etcétera.... Aquí hablaré de las opciones que a mi juicio pueden ser mas socorridas para la instalación de un Sistema Operativo en un dispositivo empotrado, en mi caso, tomando como ejemplo la tarjeta de desarrollo mini2440 comentada anteriormente, aunque como es de suponer, las mismas operaciones pueden ser realizadas en distintas plataformas hardware. Así pues vamos a lo divertido del asunto ¡¡Empezamos!!Instalando
El proceso de instalación de u-boot consiste básicamente en cargar una imagen de u-boot en la RAM de nuestrá máquina, bien a través de su propio bootloader, bien a través de un JTAG. Una vez cargado en RAM, se lanza y se le dice que se (auto)guarde en la flash de nuestra tarjeta. En este caso y dependiendo de nuestro hardware, puede sobreescribir a su bootloader original o bien coexistir con él. En cualquier caso, deberás consultar el manual de tu tarjeta para comprobarlo. Para el caso de la MINI2440, ésta viene con dos memorias Flash distintas: por un lado hay una flash NOR de 2MB en la que se encuentra almacenado el bootloader específico para los micros de Samsung (mirco de mi tarjeta de desarrollo): supervivi. Por otro lado, tenemos una memoria flash NAND de 128MB en la que se supone que irá nuestro sistema. En ésta memoria será en la que instalaremos u-boot, configurando posteriormente nuestra mini2440 para que arranque desde ahí (utilizando un conmutador que a tal efecto lleva instalado). Para comenzar, necesitaremos descargarnos tanto el código fuente de u-boot como el software necesario para poder comunicarnos con supervivi y un compilador cruzado para ARM: * u-boot:javieralso@rigoberto:~$ mkdir uboot; cd uboot
javierlaso@rigoberto:~$ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
javieralso@rigoberto:~$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package3696/public/arm-none-linux-gnueabi/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
javieralso@rigoberto:~$ unp arm-none-linux-gnueabi/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
javieralso@rigoberto:~$ export PATH=$PATH:/home/rigoberto/arm-2008q3/bin
javieralso@rigoberto:~$ wget http://www.kernelconcepts.de/~fuchs/micro2440/friendlyarm2440-package.tar.bz2
javieralso@rigoberto:~$ unp friendlyarm2440-package.tar.bz2
javieralso@rigoberto:~$ cd uboot/mini2440
javieralso@rigoberto:uboot/mini2440$ export CROSS_COMPILE=arm-none-linux-gnueabi-
javieralso@rigoberto:uboot/mini2440$ make mini2440_config; make
##### FriendlyARM BIOS for 2440 #####
[x] bon part 0 320k 2368k
[v] Download vivi
[k] Download linux kernel
[y] Download root_yaffs image
[c] Download root_cramfs image
[a] Absolute User Application
[n] Download Nboot
[e] Download Eboot
[i] Download WinCE NK.nb0
[w] Download WinCE NK.bin
[d] Download & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the nand flash
[p] Partition for Linux
[b] Boot the system
[s] Set the boot parameters
[t] Print the TOC struct of wince
[u] Backup NAND Flash to HOST through USB(upload)
[r] Restore NAND Flash from HOST through USB
[q] Goto shell of vivi
Enter your selection:
javieralso@rigoberto:friendlyarm2440-package$ ls -l
.......................
.......................
-rwxr-xr-x 1 javieralso javieralso 239016 oct 24 11:38 u-boot.bin
.......................
.......................
Enter your selection:q
Supervivi> load flash 0 239016 u
USB host is connected. Waiting a download.
javieralso@rigoberto: friendlyarm2440-package$ sudo ./s3c2410_boot_usb u-boot.bin
Now, Downloading [ADDRESS:30000000h,TOTAL:232706]
RECEIVED FILE SIZE: 239016 (28KB/S, 8S)
Downloaded file at 0x30000000, size = 232696 bytes
Found block size = 0x0003c000
Erasing... ... done
Writing... ... done
Written 239016 bytes
Supervivi>
Supervivi> go 0x30000000
U-Boot 1.3.2-mini2440 (May 15 2009 - 21:24:49)
I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: Bad block table not found for chip 0
Bad block table not found for chip 0
64 MiB
*** Warning - bad CRC or NAND, using default environment
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0
MINI2440 # nand scrub
NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
There is no reliable way to recover them.
Use this command only for testing purposes if you
are sure of what you are doing!
Really scrub this NAND flash? <y/N>
Erasing at 0x33d4000 -- 81% complete.
NAND 64MiB 3,3V 8-bit: MTD Erase failure: -5
Erasing at 0x3ffc000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
OK
MINI2440 #
MINI2440 # nand createbbt
Create BBT and erase everything ? <y/N>
Skipping bad block at 0x03410000
Skipping bad block at 0x03ff0000
Skipping bad block at 0x03ff4000
Skipping bad block at 0x03ff8000
Skipping bad block at 0x03ffc000
Creating BBT. Please wait ...Bad block table not found for chip 0
Bad block table not found for chip 0
Bad block table written to 0x03ffc000, version 0x01
Bad block table written to 0x03ff8000, version 0x01
MINI2440 # mmcinit
******** FIXME: Poner aquí la salida de mmcinit **************
MINI2440 # fatload mmc 0:1 0x32000000 u-boot.bin
******** FIXME: Poner aquí la salida de fatload **************
MINI2440 # nand write.e 0x32000000 0x0 0x38fc4
NAND write: device 0 offset 0x0, size 0x38fc4
Writing data at 0x38c00 -- 100% complete.
233412 bytes written: OK
En el futuro....
En próximas recetas, explicaré qué comandos básicos utilizar en u-boot para cargar imágenes en RAM o NAND, configurar el arranque automático desde distintas fuentes, particionar la NAND, configurar opciones de arranque para el S.O. que tengamos y alguna cosilla mas. Evito poner esa información aquí para no sobrecargar demasíado esta receta, que se supone que tienen que ser breves y concisas.Referencias
Muchas y muy variadas, aunque las mas importantes son éstas.- Wiki sobre mini2440
- Hosting para proyectos sobre mini2440 en GoogleCode
- Blog con algunos artículos y enlaces interesantes
- Buscando en Google puedes encontrar cantidad de información referente a esta tarjeta de desarrollo.
[ show comments ]
blog comments powered by Disqus