Ceci est une ancienne révision du document !
Installation d'uClinux via LTIB sur le module Freescale MCF5329 Fire Engine
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).
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 :
- Une machine de développement fonctionnant sous Ubuntu 9.04 "Jaunty Jackalope" 32 bits (100% à jour – 22 mai 2009).
- Le bundle de développement pour le System-On-Module Freescale MCF5329 Fire Engine.
- 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).
- Une connexion internet.
Conventions pour ce tutoriel
- IP machine développement : 192.168.0.2
- OS : Ubuntu Desktop 9.04 (100% à jour – 22 mai 2009)
- User : as
- Pass : azerty
- Pass root : azerty
- IP carte Freescale : 192.168.0.254
- Passerelle : 192.168.0.1
- Masque : 255.255.255.0
- Bootloader présent sur le System-On-Module : U-Boot 2008.10 (Dec 15 2008 – 11:03:39)
- Ce document, ainsi que l'ensemble des fichiers téléchargés, se situent dans
/home/as/tuto
Documents de références
- « BSP Targeting the Freescale Coldfire M5239EVB User's Guide » (User_Manual_MCF5329.pdf)
- « Using MCF5329EVB NAND Flash to Host μClinux Root File System » (AN3757.pdf)
- « Building a Sample CGI Application » (AN3408.pdf)
Installation LTIB
LTIB est notre générateur d'image uClinux pour la carte freescale.
- On extrait m53xxevb-20081215-ltib.iso (source : Linux BSP for Freescale M5329EVB )
- Clique-droit sur le fichier → Extraire ici
- Nous avons maintenant accès à la (très bonne !) documentation :
/home/as/tuto/m53xxevb-20081215-ltib/START_HERE.htm
- (Dans cette documentation, se trouve le tutoriel pour installer U-Boot - nécessite une machine windows
)
- Installation de LTIB
- On se place avec un terminal dans le répertoire :
/home/as/tuto/m53xxevb-20081215-ltib
- On lance la commande :
sh ./install
- On répond yes partout
- On installe les fichiers dans :
/home/as/ltib
- Installation des paquets nécessaires à LTIB
- Lancer dans un terminal :
sudo apt-get install bison libncurses5-dev build-essential rpm tcl8.5 libghc6-zlib-dev
- Mise en place des autorisations pour LTIB
- On modifie le fichier visudo via la commande :
sudo /usr/sbin/visudo
- On y ajoute la ligne :
as ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
- On sauvegarde via [ctrl+o], puis [enter]
- Exit via [ctrl+x]
- Premier lancement de LTIB (il décompresse ses packages → long)
- On se place avec un terminal dans le répertoire :
/home/as/ltib/ltib-cf_nommu-20081215
- On lance la commande :
./ltib
- Nous avons un bug (normal) (Exiting on error or interrupt)
- 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
- On installe minicom. Pour ça on lance dans une console :
sudo apt-get install minicom
- Pour le configurer, on lance dans un terminal :
minicom -s
- 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
- On coche l'option
Configure the kernel
- Dans
Target System Configuration → Options → Network setup
, on décoche l'optionget network parameters using dhcp
et on modifie lenameserver IP address
en192.168.0.2
. - Dans
Target Image Generation → Options → Choose your root filesystem image type
, on choisiTarget image: (NFS)
et on décoche l'optionread-only root filesystem
- On sort des menus et
Do you wish to save your new configuration? → yes
Nous arrivons dans les options du noyau
- Dans
General setup
, on cocheSystem V IPC
- Dans
File systems → Miscellaneous filesystems
, on décocheROM file system support
- 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 :
jffs2 erase block size in KB (NEW)
= 16- on décoche
read-only root filesystem
(/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 dan 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 .
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