Table des matières

, , , ,

Installation d'uClinux via LTIB sur le module Freescale MCF5329 Fire Engine

English version here

Prélude

Ce document s'adresse aux personnes intéressées par la mise en œuvre, sous Ubuntu, du System-On-Module MCF5329 Fire Engine de chez Freescale/Logicpd. Sur cette carte (disponible chez Farnell), nous installerons uClinux via le générateur d'image fourni par Freescale : LTIB.

Les commandes et notions présentes dans ce tutoriel sont souvent “simples”, mais on peux perdre énormément de temps à les retrouver et à les utiliser correctement (surtout avec de petits Linux embarqués). La philosophie retenue, est donc ici, de les toutes les retranscrire (y compris celles pour le TFTP, NFS, … qui disposent déjà de tutoriel respectifs).

Beaucoup des commandes présentes dans ce tutoriel sont, vraisemblablement, exportables pour d'autres cartes de développement.

Note de l'auteur (_Val_) :

Ce document est une synthèse d'une nombre important d'informations, trucs et astuces, tutoriel, etc. trouvés sur le web. N'étant pas un expert Linux/Ubuntu, mais plutôt un “google boy”, certaines de ces commandes ne seront sans doutes pas optimales et/ou “propres”

Pré-requis

Pour mener à bien ce tutoriel, nous avons besoin de :

  1. Une machine de développement fonctionnant sous Ubuntu 9.04 "Jaunty Jackalope" 32 bits (100% à jour – 22 mai 2009).
  2. Le bundle de développement pour le System-On-Module Freescale MCF5329 Fire Engine.
  3. Le bootloader présent sur la carte est U-Boot 2008.10 (Dec 15 2008 – 11:03:39). Son installation est décrites dans la suite du document (Il n'est pas toujours présent d'origine sur la carte).
  4. Une connexion internet.

Conventions pour ce tutoriel

Documents de références

Installation LTIB

LTIB est notre générateur d'image uClinux pour la carte freescale.

  1. On extrait m53xxevb-20081215-ltib.iso (source : Linux BSP for Freescale M5329EVB )
    1. Clique-droit sur le fichier → Extraire ici
    2. Nous avons maintenant accès à la (très bonne !) documentation : /home/as/tuto/m53xxevb-20081215-ltib/START_HERE.htm
    3. (Dans cette documentation, se trouve le tutoriel pour installer U-Boot - nécessite une machine windows :-/)
  2. Installation de LTIB
    1. On se place avec un terminal dans le répertoire : /home/as/tuto/m53xxevb-20081215-ltib
    2. On lance la commande : sh ./install
    3. On répond yes partout
    4. On installe les fichiers dans : /home/as/ltib
  3. Installation des paquets nécessaires à LTIB
    1. Lancer dans un terminal : sudo apt-get install bison libncurses5-dev build-essential rpm tcl8.5 libghc6-zlib-dev
  4. Mise en place des autorisations pour LTIB
    1. On modifie le fichier visudo via la commande : sudo /usr/sbin/visudo
    2. On y ajoute la ligne : as ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
    3. On sauvegarde via [ctrl+o], puis [enter]
    4. Exit via [ctrl+x]
  5. Premier lancement de LTIB (il décompresse ses packages → long)
    1. On se place avec un terminal dans le répertoire : /home/as/ltib/ltib-cf_nommu-20081215
    2. On lance la commande : ./ltib
    3. Nous avons un bug (normal) (Exiting on error or interrupt)
    4. Pour le résoudre, on modifie les lignes 46, 47 et 48 du fichier /opt/freescale/pkgs/mtd-utils-20060302-cf-byteswap_h-1.patch
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead." 
+#endif

qui deviennent

+//#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
+//# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
+//#endif

6. Et on supprime le répertoire (et son contenu) : /opt/freescale/ltib/usr/src/rpm/BUILD/mtd

7. On re-lance la commande : ./ltib

8. Après ça, LTIB est installé ! (ouf ^_^)

Installation de Minicom

  1. On installe minicom. Pour ça on lance dans une console : sudo apt-get install minicom
  2. Pour le configurer, on lance dans un terminal : minicom -s
  3. Dans « configuration du port série », on veillera à avoir les valeurs suivantes
+--------------------------------------------------------------------------------+
| A - Port série : /dev/ttyUSB0                                                  |
| B - Emplacement du fichier de verrouillage : /var/lock                         |
| C - Programme d'appel intérieur :                                              |
| D - Programme d'appel extérieur :                                              |
| E - Débit/Parité/Bits : 115200 8N1                                             |
| F - Contrôle de flux matériel : Non                                            |
| G - Contrôle de flux logiciel : Non                                            |
|                                                                                |
| Changer quel réglage ?                                                         |
+--------------------------------------------------------------------------------+ 

4. Le lancement de minicom se fera par la commande suivante dans le terminal : minicom

Installation du serveur TFTP

On crée un répertoire tftpboot (via la console)

sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot

On installe les paquets suivants

sudo apt-get install xinetd tftpd tftp

On ouvre un éditeur de texte en mode « root »

sudo gedit

Dans cet éditeur, on insert le texte suivant

service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
}

(attention, il faut un [enter] après la dernière accolade !!)

Et on sauvegarde dans le répertoire /etc/xinet.d/ avec comme nom de fichier tftp

Toujours avec gedit en root, on ajoute les autorisations suivantes dans le fichier /etc/hosts.allow

portmap:192.168.0.254
nfsd:192.168.0.254
mountd:192.168.0.254

Et les lignes suivantes dans /etc/hosts.deny

portmap:ALL
nfsd:ALL
mountd:ALL

On recharge la configuration

sudo /etc/init.d/xinetd reload

On peut maintenant relancer le serveur tftp via la commande

sudo /etc/init.d/xinetd restart

On vérifie la configuration du service tftp via la commande cat /etc/xinetd.d/tftp qui doit retourner

as@as-desktop:~$ cat /etc/xinetd.d/tftp
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
}

Installation du serveur NFS

On crée un lien vers le répertoire rootfs de ltib (commande à lancer dans la console)

ln -s /home/as/ltib/ltib-cf_nommu-20081215/rootfs /tftpboot/ltib

On installe le paquets pour un serveur NFS

sudo apt-get install nfs-kernel-server

On ajoute la ligne suivante dans le fichier /etc/exports (avec un gedit en mode root) et on sauvegarde

/tftpboot/ltib 192.168.0.254/255.255.255.0(rw,no_root_squash,async)

On recharge le fichier de configuration via la commande (terminal)

sudo /etc/init.d/nfs-kernel-server reload

Et on relance le serveur via la commande

sudo /etc/init.d/nfs-kernel-server restart

Installation du compilateur C/C++

On télécharge Sourcery G++ Lite Edition for ColdFire (uClinux) à l'adresse suivante.

On lance l'installation via la commande (exécutée dans le répertoire ou se trouve le fichier téléchargé)

sh ./freescale-coldfire-4.3-45-m68k-uclinux.bin -i console

On laisse l'ensemble des options par défaut.

On ajoute les entrées suivantes dans le fichier .bashrc (/home/as/.bashrc) et on sauve

PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
export PATH

On peut tester le compilateur via la commande

m68k-uclinux-g++

Qui doit retourner

m68k-uclinux-g++: no input files

La compilation d'un fichier se fera maintenant via les commandes

m68k-uclinux-g++ -o hello helloworld.c

Fichier source en C++ - entrée : helloworld.c - sortie : hello

Et,

m68k-uclinux-gcc -o hello helloworld.c

Fichier source en C - entrée : helloworld.c - sortie : hello

Génération de l'image noyau

On lance LTIB (depuis /home/as/ltib/ltib-cf_nommu-20081215) via :

./ltib -c
  1. On coche l'option Configure the kernel
  2. Dans Target System Configuration → Options → Network setup, on décoche l'option get network parameters using dhcp et on modifie le nameserver IP address en 192.168.0.2.
  3. Dans Target Image Generation → Options → Choose your root filesystem image type, on choisi Target image: (NFS) et on décoche l'option read-only root filesystem
  4. On sort des menus et Do you wish to save your new configuration? → yes

Nous arrivons dans les options du noyau

  1. Dans General setup, on coche System V IPC
  2. Dans File systems → Miscellaneous filesystems, on décoche ROM file system support
  3. On sort des menus et Do you wish to save your new configuration? → yes

Notre image noyau est maintenant générée. Nous la préparons maintenant à être injecté sur la carte via les commandes (on est toujours dans le répertoire de LTIB !) :

sudo gzip -f -9 rootfs/boot/vmlinux.bin

Puis,

/opt/freescale/ltib/usr/bin/mkimage -A m68k -O linux -T kernel -C gzip -a 0x40020000 -e 0x40020000 -n "Linux Kernel Image" -d rootfs/boot/vmlinux.bin.gz uImage 

On place l'image générée dans le répertoire /tftpboot

cp uImage /tftpboot/

L'image noyau uImage, présente dans /tftpboot est prête à être injectée sur la carte.

Génération du répertoire racine en JFFS2

On re-lance LTIB (depuis /home/as/ltib/ltib-cf_nommu-20081215) via :

./ltib -c

Dans Target Image Generation → Options → Choose your root filesystem image type, on choisi Target image: (jffs2)

Toujours dans les options image :

  1. jffs2 erase block size in KB (NEW) = 16
  2. on décoche read-only root filesystem
  3. (/tmp /var) Place these dirs in writable RAM

On sort des menus et Do you wish to save your new configuration? → yes

l'image du répertoire racine est maintenant disponible (rootfs.jffs2). Nous la copions dans le répertoire boot partagé via la commande :

sudo cp rootfs.jffs2 /home/as/ltib/ltib-cf_nommu-20081215/rootfs/boot

Le répertoire racine est maintenant prêt à être implémenté sur la carte.

Installation de l'image noyau en RAM (et fonctionnement avec répertoire racine en NFS)

On branche le port série et Ethernet de la carte sur le PC.

Nous ouvrons minicom via la commande minicom dans un terminal (l'ensemble des commandes suivantes se lancent sur la carte via minicom)

On branche l'alimentation de la carte.

Nous observons la séquence de boot du bootloader sur le terminal (et nous interrompons avant la fin du compteur, si il y en a un)

Pour imprimer les paramètres du bootloader, on lance la commande printenv

Pour modifier un paramètre, c'est via les commandes

set paramètre 'valeur'
save

Exemple,

set serverip '192.168.0.2'
save

On vérifie (via printenv) de bien avoir les paramètres suivant (et sinon, on modifie)

gatewayip=192.168.0.1
netmask=255.255.255.0
ipaddr=192.168.0.254
serverip=192.168.0.2

On indique à l'OS ou se situe son répertoire racine (via un paramètre qui sera passé à l'OS au moment du boot par le bootloader)

set bootargs 'root=/dev/nfs rw nfsroot=192.168.0.2:/tftpboot/ltib ip=192.168.0.254:192.168.0.2:192.168.0.1:255.255.255.0::eth0:off'
save

(le répertoire racine est ici en nfs sur la machine de développement)

On charge le noyau en RAM via tftp

tftp 0x41000000 uImage

Et on boot (et ça marche ! ^^)

bootm 0x41000000

Implémentation du répertoire racine en flash NAND

Pour ce faire, sur le uClinux de la carte (donc via minicom), on exécute ceci :

/usr/bin/flash_eraseall /dev/mtd1
cd /boot
cp rootfs.jffs2 /dev/mtdblock1

Il nous reste à rebooter le système et a changer les options du bootloader (on indique que le répertoire racine se trouve sur la flash NAND)

set bootargs 'root=/dev/mtdblock1 rw rootfstype=jffs2'
save

Le répertoire racine est maintenant opérationnel depuis la carte.

Installation de l'image noyau en flash NOR

On lance la carte, et dans le bootloader (U-Boot), nous exécutons les commandes suivantes

On enlève la protection d'une partie de la mémoire Flash NOR et nous l'effaçons (nous sommes toujours sur la carte via minicom)

prot off 0x30000 0x1FFFFF
erase 0x30000 0x1FFFFF

On charge le noyau en ram et on le copie dans la flash NOR

tftp 0x40020000 uImage
cp.b 0x40020000 0x30000 ${filesize}

On indique au bootloader que l'on veut booter depuis cette flash NOR

set bootcmd bootm 0x30000
set bootdelay 3
save

Lorsqu'on reboot la carte, le noyau se lance automatiquement depuis la flash NOR et avec son répertoire racine en flash NAND. La carte est donc maintenant complètement indépendante du PC de développement :-D.

Divers (Bug)

Une fois sous uClinux (→ minicom) ET avec le noyau en flash NOR, il faut re-activer Ethernet une fois la séquence de boot finie

ifconfig eth0 hw ether 0008ee013f7c
ifconfig eth0 up

0008ee013f7c représente la MAC adresse de la carte (présente sur un autocollant collé sur le System-On-Module)

On vérifie alors via un ping vers la machine de développement

ping 192.168.0.2