Carte ARM9 "Kameleon Fontaine"

La carte était initialement utilisée comme source de données Bluetooth par la société Kameleon Media (d'ou le nom "fontaine").

Cette activité étant aujourd'hui arrêtée, ces cartes ne sont plus utilisées et étaient vouées à un triste sort (> /dev/null).

Le processeur AT91RM9200? est produit par Atmel

(voir http://www.atmel.com/dyn/products/product_card.asp?part_id=2983). C'est un processeur désormais dépassé mais qui

reste très utilisable pour des tests ou des TP d'initiation à Linux embarqué. Les principales caractéristiques de la carte sont:

  • CPU AT91RM9200? à 180 Mhz
  • 16 Mo de RAM
  • Dataflash SPI de 4Mo contenant la distribution initiale (U-Boot 1.1.4, noyau Linux 2.6.14)
  • NAND flash de 128 Mo
  • 1 Ethernet
  • 2 USB host
  • 1 connecteur CF
  • 1 console "série" en TTL 3.3V (uniquement accessible en ouvrant le boitier)

Accès à la console

La console n'est pas directement en RS-232. Elle n'est pas accessible par un connecteur externe. On peut y voir accès en ouvrant le

boitier et en retirant la clé USB Bluetooth. Sur la photo ci-dessous, on peut voir le connecteur console (4 pins) en haut à gauche. Le brochage est le suivant, de bas en haut:

  • GND
  • TX
  • RX
  • Vcc

Pour utiliser la console, il est nécessaire d'avoir un adaptateur de niveau TTL/RS232. Il en existe des "prêts à l'emploi" sur:

http://www.sparkfun.com/commerce/product_info.php?products_id=133

Il existe également des adaptateur TTL/USB à base de FT232, exemple :

.php?products_id=718

Les courageux peuvent en construire un à partir d'un composant MAX233, voir:

http://www.compsys1.com/workbench/On_top_of_the_Bench/Max233_Adapter/max233_adapter.html

Une fois l'adaptateur connecté on doit utiliser un émulateur de terminal genre "minicom". Le port série est configuré

par défaut en 115200 bps, 8 bits, pas de parité, pas de contrôle de flux.

Démarrage de la carte

Une distribution Linux est déjà installée sur la carte (développée par OW à l'époque). Elle est basée sur un noyau 2.6.14 et

contient le logiciel applicatif Kameleon dont le but est d'envoyer des données Bluetooth aux téléphones mobiles proches.

Même si cela a peu d'intérêt, on peut se connecter à la distribution actuelle en utilisant le compte "root" et le mode de passe "Pom42plop".

Compilation et Installation de u-boot (optionnel)

REMARQUE: une version (ancienne) de U-Boot est déjà installée sur la carte, cette phase n'est donc pas obligatoire dans un premier temps.

U-boot est le bootloader permettant de démarrer la carte fontaine. Celui ci est démarré à la suite d'un premier bootloader, beaucoup plus simple permettant :

  • flasher une version de u-boot sur la carte
  • lire la flash de la carte
  • démarrer la version de u-Boot flashée
Pour compiler une version de u-boot, il faut récupérer le patch u-boot-2010.09.patch présent sur le git "fontaine-new" et l'appliquer sur la dernière version de u-boot 2010.09.

Il faut ensuite builder un toolchain pour crosscompiler u-boot, puis lancer les commandes :

$ export PATH=<path vers la toolchain>/bin:$PATH

$ make at91rm9200fontaine_config

$ make

Le résultat de la compilation est : u-boot.bin présent à la racine du projet.

Pour l'installation de u-boot sur la flash, il faut tout d'abord disposer d'un logiciel capable d'envoyer des fichiers en utilisant le protocole xmodem. Hyperterminal de windows en est capable, mais minicom présente des erreurs (inconnues) lors du transfert. Sous linux/unix, il est possible d'utiliser xmodem qui implémente le protocole xmodem à la façon hyperterminal.

Pour flasher u-boot, il suffit de :

  • se connecter sur la ligne série (en général :/dev/ttyUSB0 si l'on utilise un convertisseur série / USB).
  • démarrer la carte
  • appuyer sur entrée pour entrer dans le bootloader de base
  • taper "1 C0008000"
  • envoyer le fichier "u-boot.bin"

$ ./xmodem -p /dev/ttyUSB0 -i u-boot.bin

Compilation de la nouvelle distribution

La nouvelle distribution est basée sur un noyau 2.6.30 et utilise Buildroot-2010.02. Ce dernier a été modifié pour permettre l'intégration

de Xenomai. Pour compiler la distribution, on peut utiliser une chaîne de compilation uClibc (produite par Buildroot) ou bien un chaîne Glibc

externe (produite par Crosstool-NG). Dans le cas de Glibc, on part du principe que la chaîne croisée est installée sur $HOME/x-tools.

Le projet est hébergé sur le serveur Git Open Wide: ssh://git.projects.openwide.fr/gitroot/fontaine-new

Les patch sont également disponibles sur http://pficheux.free.fr/pub/linux/fontaine .

Les patch à appliquer à Buildroot sont dans le répertoire patches :

  • BR_2010.02_Fontaine_glibc_Xeno.patch
  • BR_2010.02_Fontaine_uClibc_Xeno.patch
Pour construire la distribution il suffit de faire :
$ cd buildroot-2010.02
$ patch -p1 < <_path_>/BR_2010.02_Fontaine_uClibc_Xeno.patch
$ make kameleon_fontaine_defconfig
$ make
ou bien:
$ patch -p1 < <_path_>/BR_2010.02_Fontaine_glibc_Xeno.patch
$ make kameleon_fontaine_glibc_defconfig
$ make

ATTENTION: Dans le cas de Glibc, et sur certaines distributions récentes (exemple: Fedora 13), il est nécessaire de commenter la

ligne suivante dans le fichier Makefile de Buildroot :

  $(TARGET_LDCONFIG) -r $(TARGET_DIR) 2> /dev/null 

A l'issue de la compilation (environ 25mn sur un PC Core 2 Duo), on doit avoir les images produites dans le répertoire output/images :

  • Le noyau uImage
  • Les archives du root-filesystem rootfs.arm.tar et roofs.arm.jffs2
  • L'image du bootloader U-Boot
Le fichier uImage est à copier sur le répertoire du serveur TFTP du poste de développement.

REMARQUE: l'image U-Boot produite n'est PAS UTILISABLE sur la carte. Elle est produite par défaut car le noyau doit être au format U-Boot uImage (et non pas zImage).

Test de la distribution en NFS-Root

Il est recommandé d'effectuer le premier test en utilisant NFS-Root. Pour cela on doit renseigner les variables U-Boot adéquates :

  • bootargs
  • serverip
  • ipaddr
  • rootpath
  • bootfile
Dans les versions récentes d'U-Boot, il est possible de définir la configuration sur le PC de développement puis de la charger en tant qu'image produite par la commande mkimage. Ce n'est malheureusement pas possible sur cette vieille version 1.1.4 et la configuration doit être effectuée sur la carte avec la commande setenv (ne pas oublier de sauver par saveenv à la fin !!), exemple :
Fontaine> setenv bootfile uImage  

On peut installer la distribution sur un répertoire utilisateur (exemple: /home/pierre/rootfs_fontaine). On doit effectuer cette opération

en tant que "root" à cause de la création des entrées dans /dev.

# tar -C /home/pierre/rootfs_fontaine output/images/rootfs.arm.tar

De même, il est nécessaire d'ajouter le répertoire au fichier /etc/exports :

/home/pierre/rootfs_fontaine *(rw,no_root_squash,no_all_squash,sync)

Concernant U-Boot, j'ai reproduit ci-dessous la liste des commandes à utiliser. Bien entendu certains paramètres sont à ajuster en fonction de votre environnement (ex: adresse IP, ...).

Fontaine> setenv rootpath /home/pierre/rootfs_fontaine
Fontaine> setenv bootfile uImage  # setenv gatewayip 192.168.3.1  
Fontaine> setenv netmask 255.255.255.0  
Fontaine> setenv ipaddr 192.168.3.143 
Fontaine> setenv serverip 192.168.3.109  
Fontaine> setenv nfsargs 'setenv bootargs console=ttyS0,115200 root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off mtdparts=${mtdparts}'

Une fois les variables/macros définies, on positionne le mode NFS-Root dans U-Boot puis on boote par :

Fontaine> run nfsargs
Fontaine> saveenv

REMARQUE: on peut utiliser la commande U-Boot dhcp si il existe un serveur DHCP sur le réseau.

Le démarrage doit s'effectuer comme suit :

[FONTAINE] Desactivate PHY powerdown                                            
[FONTAINE] dm9161_InitPhy Reset PHY                                             
[FONTAINE] GetLinkSpeed ... done                                                
stat2=8008                                                                      
TFTP from server 192.168.3.109; our IP address is 192.168.3.50                  
Filename 'uImage'.                                                              
Load address: 0x20d00000                                                        
Loading: #################################################################      
         #################################################################      
         #################################################################      
         #################################################################      
         #################################################################      
         #############                                                          
done                                                                            
Bytes transferred = 1727292 (1a5b3c hex)                                        
Automatic boot of image at addr 0x20D00000 ...                                  
## Booting image at 20d00000 ...                                                
   Image Name:   Linux-2.6.302.6.30-g104127f                                    
   Image Type:   ARM Linux Kernel Image (uncompressed)                          
   Data Size:    1727228 Bytes =  1.6 MB                                        
   Load Address: 20008000                                                       
   Entry Point:  20008000                                                       
   Verifying Checksum ... OK                                                    
OK                                                                              
                                                                                
Starting kernel ...                                                             
                                                                                
Uncompressing Linux.............................................................
................................................ done, booting the kernel.      
Linux version 2.6.302.6.30-g104127f (pierre@opti760pf.localdomain) (gcc version 
4.3.4 (Buildroot 2010.02) ) #4 Wed Sep 29 16:43:58 CEST 2010                    
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177                        
CPU: VIVT data cache, VIVT instruction cache                                    
Machine: Kameleon Fontaine
...

Initializing random number generator... done.                                   
Starting network...                                                             
ip: RTNETLINK answers: File exists                                              
                                                                                
Welcome to Fontaine AT91RM9200 board (uClibc)                                   
fontaine login:

On peut alors se loger en tant que "root", il n'y a pas de mot de passe.

fontaine login: root                                                            
# uname -a                                                                      
Linux fontaine 2.6.302.6.30-g104127f #4 Wed Sep 29 16:43:58 CEST 2010 armv4tl GN
U/Linux

Installation sur la mémoire flash

La carte dispose de 2 types de mémoire flash :

  • Une flash NOR de 4Mo sur le bus SPI
  • Une flash NAND (dataflash) de 128 Mo
Dans la version initiale de la distribution Linux, le système était installée uniquement sur la flash SPI. La structure de la flash est donnée ci-dessous:
0x000000000000-0x000000042000 : "bootloader"                                    
0x000000042000-0x00000014a000 : "kernel"                                        
0x00000014a000-0x000000420000 : "filesystem"

Dans la nouvelle version de la distribution, nous utilisons la flash SPI uniquement pour U-Boot et le noyau Linux, le reste de la distribution (root-filesystem) étant installé sur la flash NAND, qui dispose de 128 Mo. La version actuelle du bootloader U-Boot étant ancienne, ce dernier ne dispose pas des commandes nécessaires à la manipulation de la flash NAND et l'écriture de l'image du root-filesystem se fera depuis Linux en utilisant les commandes fournies par le paquet mtd-utils, soit flash_eraseall et nandwrite.

Le nouveau découpage de la flash SPI est donc le suivant :

0x000000000000-0x000000042000 : "U-Boot"                                        
0x000000042000-0x000000420000 : "Kernel"

La description de la structure de la flash est décrite par l'option mtdparts dans les paramètres du noyau. Dans notre cas nous devront donc ajouter la chaîne suivante à la variable bootargs.

mtdparts=AT45DB321B.spi0:0x42000(U-Boot)ro,-(Kernel)

La syntaxe indique que la flash identifiée par AT45DB321B?.spi0 contient une première "partition" de taille 0x42000 pour U-Boot (en read-only). Le reste de la flash est utilisée pour le noyau.

Installation du noyau

La commande flinfo sous U-Boot permet d'obtenir des informations concernant la flash SPI :

Fontaine> flinfo                                                                
DataFlash:AT45DB321                                                             
Nb pages:   8192                                                                
Page Size:    528                                                               
Size= 4325376 bytes                                                             
Logical address: 0xC0000000                                                     
Area 0: C0000000 to C0007FFF (RO)                                               
Area 1: C0008000 to C002FFFF (RO)                                               
Area 2: C0030000 to C00317FF                                                    
Area 3: C0031800 to C041FFFF

Le principe de l'installation est le suivant:

  1. Chargement en RAM de l'image du noyau (uImage) par TFTP
  2. Copie du noyau de la RAM vers la flash
L'adresse RAM de chargement est donné par la variable loadaddr qui dans notre cas vaut 0x20D00000.
Fontaine> pri loadaddr                                                          
loadaddr=0x20D00000

La noyau doit être chargé en mémoire en prenant soin de désactiver le démarrage automatique après chargement (variable autostart).

Fontaine> setenv autostart no                                                   
Fontaine> tftp                                                                  
[FONTAINE] Desactivate PHY powerdown                                            
[FONTAINE] dm9161_InitPhy Reset PHY                                             
[FONTAINE] GetLinkSpeed ... done                                                
stat2=8008                                                                      
TFTP from server 192.168.3.109; our IP address is 192.168.3.50                  
Filename 'uImage'.                                                    
Load address: 0x20d00000                                                        
Loading: #################################################################      
         #################################################################      
         #################################################################      
         #################################################################      
         #################################################################      
         ####                                                                   
done                                                                            
Bytes transferred = 1679568 (19a0d0 hex)

Une fois le noyau chargé en RAM, on doit l'écrire en flash en précisant l'adresse de début ainsi que la taille du fichier à écrire (définie dans la variable filesize). Nous avons défini la variable kflashaddr qui contient l'adresse d'écriture en flash en fonction du nouveau partitionnement.

Fontaine> pri kflashaddr                                                        
kflashaddr=0xC0042000

Pour copier le noyau en flash, on utilise donc la commande :

Fontaine> cp.b ${loadaddr} ${kflashaddr} ${filesize}                            
Copy to DataFlash... done

On peut également définir une macro U-Boot qui effectue l'opération en une seule fois en utilisant la commande run .

Fontaine> pri kflash                                                            
kflash=setenv autostart no; tftp ${loadaddr} ${bootfile}; cp.b ${loadaddr} ${kflashaddr} ${filesize}; setenv kflashlen ${filesize}
Fontaine> run kflash

Installation du root-filesystem

Comme nous l'avons dit précédemment, la version U-Boot actuellement disponible sur la carte ne permet pas de manipuler la flash NAND. Pour installer le root-filesystem, on doit donc démarrer la carte par réseau (TFTP+NFS) comme nous l'avons vu au début puis effectuer l'installation. L'image du root-filesystem est disponible dans le même répertoire que le noyau Linux, soit output/images . Ce fichier doit être copié sur le répertoire correspondant au root-filesystem NFS utilisé précédemment.

sudo cp output/images/rootfs.arm.jffs2 /home/pierre/rootfs_fontaine/root

Lorsque la carte est démarrée on peut voir la structure des flash en utilisant /proc/mtd.

# cat /proc/mtd                                                                 
dev:    size   erasesize  name                                                  
mtd0: 00420000 00000210 "AT45DB321B.spi0"                                       
mtd1: 00042000 00000210 "U-Boot"                                                
mtd2: 003de000 00000210 "Kernel"                                                
mtd3: 08000000 00020000 "NAND Partition 1"   

L'image du root-filesystem doit être installée sur la partition /dev/mtd3, pour cela on utilise la séquence suivante:

# flash_eraseall -j /dev/mtd3                                                   
Erasing 128 Kibyte @ 8000000 -- 100 % complete.Cleanmarker written at 7fe0000.  

# nandwrite -p /dev/mtd3 rootfs.arm.jffs2                                       
Writing data to block 0 at offset 0x0                                           
Writing data to block 1 at offset 0x20000                                       
Writing data to block 2 at offset 0x40000                                       
Writing data to block 3 at offset 0x60000                                       
Writing data to block 4 at offset 0x80000                                       
Writing data to block 5 at offset 0xa0000                                       
Writing data to block 6 at offset 0xc0000                                       
Writing data to block 7 at offset 0xe0000

On peut alors tester le montage de la partition :

# mount -t jffs2 /dev/mtdblock3 /mnt

Démarrage sur la flash

La flash SPI n'étant pas directement utilisable pour le démarrage du noyau sous U-Boot, on utilise la macro bootcmd pour copier la noyau de la flash vers la RAM puis booter en RAM par la commande bootm. Nous avons défini la variable kflashlen qui doit contenir la taille du noyau, stockée lors de l'écriture de ce dernier à partir du contenu de filesize.

Fontaine> pri bootcmd                                                           
bootcmd=cp.b ${kflashaddr} ${loadaddr} ${kflashlen}; bootm ${loadaddr}

Le contenu de bootcmd est exécuté lors de l'appel à la commande boot. Cette commande est appelée par défaut lors du démarrage de la carte. On remarque que le root-filesystem utilisé est alors de type JFFS2 et non plus NFS. Avant de démarrer, on doit également modifier la variable bootargs afin d'indiquer que l'on utilise la flash et non plus le réseau.

Fontaine> pri bootargs                                                          
bootargs=console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=AT45DB321B.spi0:0x42000(U-Boot)ro,-(Kernel)


Fontaine> boot                                                                  
## Booting image at 20d00000 ...                                                
   Image Name:   Linux-2.6.302.6.30-g3040a61-dirt                               
   Image Type:   ARM Linux Kernel Image (uncompressed)                          
   Data Size:    1679504 Bytes =  1.6 MB                                        
   Load Address: 20008000                                                       
   Entry Point:  20008000                                                       
   Verifying Checksum ... OK                                                    
OK                                                                              
                                                                                
Starting kernel ...                                                             
                                                                                
Uncompressing Linux.............................................................
............................................. done, booting the kernel.         
Linux version 2.6.302.6.30-g3040a61-dirty (pierre@dellpf) (gcc version 4.3.2 (cr
osstool-NG-1.7.0) ) #2 Tue Nov 23 16:43:37 CET 2010                             
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
...
Empty flash at 0x0020a368 ends at 0x0020a800                                    
VFS: Mounted root (jffs2 filesystem) on device 31:3.                            
Freeing init memory: 120K                                                       
Initializing random number generator... done.                                   
Starting network...                                                             
ip: RTNETLINK answers: File exists                                              
                                                                                
Welcome to Fontaine AT91RM9200 board (uClibc)                                    
fontaine login:

REMARQUE: Si l'on démarre sur la flash, l'adresse MAC de la carte n'est pas initialisée (sauf si c'est fait par U-Boot). On peut l'initialiser sous Linux par la commande :

# ifconfig eth0 hw ether 00:80:C2:00:01:93                                      
eth0: Setting MAC address to 00:80:c2:00:01:93

-- PierreFicheux - (pierre.ficheux@openwide.fr)

Topic revision: r10 - 09 Dec 2010 - 14:10:40 - TristanLelong
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback