English version here
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”
Pour mener à bien ce tutoriel, nous avons besoin de :
/home/as/tuto
LTIB est notre générateur d'image uClinux pour la carte freescale.
/home/as/tuto/m53xxevb-20081215-ltib/START_HERE.htm
/home/as/tuto/m53xxevb-20081215-ltib
sh ./install
/home/as/ltib
sudo apt-get install bison libncurses5-dev build-essential rpm tcl8.5 libghc6-zlib-dev
sudo /usr/sbin/visudo
as ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
/home/as/ltib/ltib-cf_nommu-20081215
./ltib
/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 )
sudo apt-get install minicom
minicom -s
+--------------------------------------------------------------------------------+ | 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
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 }
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
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
On lance LTIB (depuis /home/as/ltib/ltib-cf_nommu-20081215
) via :
./ltib -c
Configure the kernel
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
.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
Do you wish to save your new configuration? → yes
Nous arrivons dans les options du noyau
General setup
, on coche System V IPC
File systems → Miscellaneous filesystems
, on décoche ROM file system support
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.
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)
= 16read-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.
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
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.
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 .
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