mini2440. Séance 2 : compilation et programmation du bootloader u-boot

Salut.

Pour cette séance 2 de mise en oeuvre de la carte mini2440, nous allons voir comment compiler et installer le bootloader u-boot en mémoire NAND Flash de la carte.

u-boot est un moniteur spécialisé pour Linux embarqué qui possède, outre les fonctionnalités d'un moniteur classique, les capacités de récupérer un noyau Linux généralement stocké en mémoire Flash et passer des arguments au noyau Linux avant de le lancer. Le système de fichiers root peut être en mémoire Flash, sur carte SD, en mémoire RAM ou bien monté par NFS via le réseau...

On installera les sources d'u-boot pour la carte mini2440  : 

$ cd mini2440
$ mkdir u-boot
$ cd u-boot $ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
$ mv mini2440/* .
$ mv mini2440/.* .
$ rmdir mini2440

Le fichier shell script go suivant permet d'automatiser la procédure de compilation :

$ cat go
make mini2440_config
make

La compilation croisée d'u-boot se fera par :

$ ./go

J'utiliserai par la suite pour les séances suivantes le principe des shell scripts goxxx pour automatiser un peu les choses :

  • goclean : script de nettoyage
  • goconfig : script de configuration
  • go : script de compilation croisée
  • goinstall : script d'installation

Après compilation croisée, on récupère le fichier binaire u-boot.bin à programmer dans la mémoire NAND Flash.


La procédure d’installation est décrite dans le document HOWTO: Compiling and Flashing U-Boot onto Mini2440.
Le fichier u-boot.bin généré ne s’exécute pas correctement directement en mémoire RAM et on appliquera le contournement décrit dans le document en le programmant une première fois en mémoire NAND Flash pour partitionner la mémoire NAND Flash et détecter les bad blocs puis en le reprogrammant une deuxième fois :

  • 1. Switch the system to NOR and boot with supervivi
  • 2. hit v in supervivi
  • 3. i uploaded the u-boot.bin file
  • 4. switch the system to NAND and boot up with u-boot. You'll get some errors
  • 5. Run nand scrubs and createbbt
  • 6. switch back to NOR
  • 7. hit v again and upload U-boot since you just erased it
  • 8. switch back to nand and it should boot up with minimal errors using u-boot
  • 9. run the dynpart and dynenv and saveenv as mentioned above


On suit donc la procédure. La carte mini2440 est en position NOR. On fait un reset de la carte.
On accède au moniteur supervivi préprogrammé en mémoire NOR Flash que l’on conservera et que l’on n’effacera pas en utilisant l’outil minicom configuré en 115200,8,N,1. L’outil minicom permet d’accéder au port série de la carte mini2440 :
Le paramètre 239636 correspond à la taille du fichier u-boot.bin :

$ su
# minicom
##### FriendlyARM BIOS 2.0 for 2440 #####
[x] format NAND FLASH for Linux
[v] Download vivi
[k] Download linux kernel
[y] Download root_yaffs image
[a] Absolute User Application
[n] Download Nboot for WinCE
[l] Download WinCE boot-logo
[w] Download WinCE NK.bin
[d] Download & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the nand flash
[b] Boot the system
[s] Set the boot parameters
[u] Backup NAND Flash to HOST through USB(upload)
[r] Restore NAND Flash from HOST through USB
[q] Goto shell of vivi
[i] Version: 1026-2K
Enter your selection: v
Supervivi> load flash 0 239636 u
USB host is connected. Waiting a download.
Now, Downloading [ADDRESS:30000000h,TOTAL:239646]

RECEIVED FILE SIZE:  239646 (234KB/S, 1S)
Downloaded file at 0x30000000, size = 239636 bytes
Found block size = 0x00040000
Erasing...    ... done
Writing...    ... done
Written 239636 bytes
Supervivi>


On connecte ensuite un câble USB entre le port device de la carte mini2440 et le PC de développement. Dans une autre fenêtre, on lance l'outil s3c2410_boot_usb disponible ici pour télécharger le fichier u-boot.bin :

$ cd u-boot
$ su
# ./s3c2410_boot_usb u-boot.bin
csum = 0xf15c
send_file: addr = 0x33f80000, len = 0x0003a814
Sending Chunks...........................................................
Sent: 239636 bytes
Downloading complete, no errors


Le bootloader Linux u-boot est programmé en mémoire NAND Flash. La carte mini2440 est en position NAND Flash. On fait un reset de la carte. On boote la carte mini2440 avec u-boot. On appuie sur une touche puis on effectue les opérations suivantes :

MINI2440 # nand info
MINI2440 # nand  erase clean
MINI2440 # nand  nand protect off
MINI2440 # nand  scrub
MINI2440 # nand  createbbt
MINI2440 # dynpart
mtdparts mtdparts=mini2440-nand:0x00040000(u-boot),0x00020000(u-boot_env),0x005)
MINI2440 # dynenv set u-boot_env
MINI2440 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
MINI2440 #


L’opération createbbt de création de la table des bad blocs prend 15 minutes avec la mémoire NAND Flash de 1Go. Il convient d’attendre la fin de l’opération patiemment…
Ces opérations ont effacé u-boot de la mémoire NAND Flash qu’il convient ensuite de reprogrammer une deuxième fois comme précédemment.
Une fois cette deuxième programmation d’u-boot réalisée, le bootloader Linux est définitivement installé sur la carte mini2440. On recommencera l'opération (dynpart, dynenv, saveenv) pour éviter l'erreur de CRC. Il ne reste plus qu’à configurer correctement u-boot comme on le verra plus tard…


La carte mini2440 est en position NAND. On fait un reset de la carte. On doit accéder au prompt d’u-boot :

U-Boot 1.3.2-mini2440 (Jun 23 2011 - 17:58:29)

I2C:   ready
DRAM:  64 MB
NOR Flash not found. Use hardware switch and 'flinit'
Flash:  0 kB
NAND:  1024 MiB
Found Environment offset in OOB..
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 # dynpart
mtdparts mtdparts=mini2440-nand:0x00040000(u-boot),0x00020000(u-boot_env),0x005)
MINI2440 # dynenv set u-boot_env
MINI2440 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
MINI2440 #
MINI2440 # mtdparts

device nand0 <mini2440-nand>, # parts = 4
 #: name                size            offset          mask_flags
 0: u-boot              0x00040000      0x00000000      0
 1: env                 0x00020000      0x00040000      0
 2: kernel              0x00500000      0x00060000      0
 3: root                0x3faa0000      0x00560000      0

active partition: nand0,0 - (u-boot) 0x00040000 @ 0x00000000

defaults:
mtdids  : nand0=mini2440-nand
mtdparts: <NULL>


Des partitions MTD ont été créées par défaut dans la mémoire NAND Flash :

  • Partition MTD 0 : contient u-boot
  • Partition MTD 1 : contient les paramètres de configuration d’u-boot
  • Partition MTD 2 : pourra accueillir le noyau Linux
  • Partition MTD 3 : pourra accueillir un système de fichiers root utilisant le système de fichiers JFFS2


On installera donc le noyau Linux dans la partition MTD 2. Le système de fichiers root pourra être installé dans la partition MTD 3 ou bien être installé sur la carte SD. Le choix se fera en configurant correctement u-boot comme présenté plus tard dans une autre séance…

A partir de maintenant, la carte mini2440 reste en position NAND Flash. Nous avons maintenant un bootloader u-boot sur la carte mini2440 parfaitement opérationnel !

Prochaine séance : création d'un système de fichiers root minimal...

++

Sources :

Vus : 3806
Publié par Eddy33 : 81