|
Candidate for Deletion |
Freescale 5329 And uClinux (with LTIB)
Version française ici
Introduction
The purpose of this document is the implementation, under Ubuntu, of the System-On-Module MCF5329 Fire Engine (from Freescale/Logicpd). On this system (available from Farnell), we are going to install uClinux via the image generator provided by Freescale : LTIB.
Commands and concepts present in this tutorial are often "simple", but it possible to waste a lot of time to find them and to use them correctly (especially with small embedded Linux). Therefore, in this tutorial, we retranscribe all of these (including these for TFTP, NFS,...).
Many commands present in this tutorial are, probably, exportable to other development boards.
Note of the author (Val) : This document is a synthesis of a lot of information, forums, tutorial, etc. found on the Web. I'm not a Linux/Ubuntu expert, that's why, some of these commands are not optimal and/or "clean".
Requirement
- Host computer IP : 192.168.0.2
- Host computer OS : Ubuntu Desktop 9.04 (32 bits - Update 100% OK - 22 may 2009)
- User account : as
- System-On-Module IP (Freescale Coldfire) : 192.168.0.254
- Gateway address : 192.168.0.1
- Mask : 255.255.255.0
- System-On-Module bootloader : U-Boot 2008.10 (Dec 15 2008 - 11:03:39)
- This document and all the downloaded files are in /home/as/tuto directory
Reference documents
- « 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)
LTIB installation
LTIB is the uClinux image generator for the System-On-Module.
Extract the m53xxevb-20081215-ltib.iso file (source : Linux BSP for Freescale M5329EVB )
Right-click on the file -> Extract here
Now, we have, in this directory, a very good documentation
/home/as/tuto/m53xxevb-20081215-ltib/START_HERE.htm
- (In this documentation, there is a U-Boot installation tutorial !)
LTIB installation
- In a terminal, go to the iso directory :
cd /home/as/tuto/m53xxevb-20081215-ltib
- Execute the install scipt :
sh ./install
- Answer the default choice for all options
- Install it in :
/home/as/ltib
Required packages installation (for LTIB)
- In a terminal, execute this command :
sudo apt-get install bison libncurses5-dev build-essential rpm tcl8.5 libghc6-zlib-dev
LTIB authorizations
- In a terminal, modify the visudo file with this command :
sudo /usr/sbin/visudo
- In this file, add the following line :
as ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
- Save this file ([ctrl+o] shortcut)
- Quit the editor ([ctrl+x] shortcut)
LTIB first launch
- In a terminal, go to the LTIB directory :
cd /home/as/ltib/ltib-cf_nommu-20081215
- Execute LTIB :
./ltib
We have a bug (Exiting on error or interrupt)
- To solve it, modify the lines 46, 47 and 48 of this file :
/opt/freescale/pkgs/mtd-utils-20060302-cf-byteswap_h-1.patch
- before
+#if !defined _BYTESWAP_H && !defined _NETINET_IN_H +# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead." +#endif
- after
+//#if !defined _BYTESWAP_H && !defined _NETINET_IN_H +//# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead." +//#endif
- and delete the directory :
/opt/freescale/ltib/usr/src/rpm/BUILD/mtd
Re-execute LTIB :
./ltib
and it works !
Minicom installation
In a terminal, install Minicom :
sudo apt-get install minicom
To configure it, execute :
minicom -s
In Serial port configuration, verify these options and save them :
Serial device : your serial device, for me, it is ttyUSB0 Bps/Par/Bits : 115200 8N1 Hardware Flow Control : No Software Flow Control : No
To launch Minicom, execute this command in a terminal :
minicom
TFTP server installation
In a terminal, create a tftpboot directory :
sudo mkdir /tftpboot sudo chmod -R 777 /tftpboot sudo chown -R nobody /tftpboot
and install these packages :
sudo apt-get install xinetd tftpd tftp
Open a text editor (root user) :
sudo gedit
Write these lines :
service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = /tftpboot disable = no }
(! there is a [enter] after the last brace !)
And save in /etc/xinet.d/tftp file (create it if necessary).
Then, with this text editor (root user), add these lines in the /etc/hosts.allow file :
portmap:192.168.0.254 nfsd:192.168.0.254 mountd:192.168.0.254
And these lines in the /etc/hosts.deny file :
portmap:ALL nfsd:ALL mountd:ALL
After, reload the configuration file :
sudo /etc/init.d/xinetd reload
And restart the TFTP server :
sudo /etc/init.d/xinetd restart
We check the TFTP server configuration :
cat /etc/xinetd.d/tftp
This command should return :
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 }
NFS server installation
In a terminal, create a link to the rootfs directory (directory in the LTIB directory) :
ln -s /home/as/ltib/ltib-cf_nommu-20081215/rootfs /tftpboot/ltib
Install the NFS package :
sudo apt-get install nfs-kernel-server
Add this line in the /etc/exports file (with a text editor in root mode) :
/tftpboot/ltib 192.168.0.254/255.255.255.0(rw,no_root_squash,async)
Reload the configuration :
sudo /etc/init.d/nfs-kernel-server reload
And restart the NFS server :
sudo /etc/init.d/nfs-kernel-server restart
C/C++ compiler installation
Download Sourcery G++ Lite Edition for ColdFire (uClinux) (here).
In a terminal, go to the download directory and launch the installation script :
sh ./freescale-coldfire-4.3-45-m68k-uclinux.bin -i console
Let the default choice for all options.
Add these lines into the .bashrc (/home/as/.bashrc) file :
PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH export PATH
Test the compiler :
m68k-uclinux-g++
This command should return :
m68k-uclinux-g++: no input files
To compile, execute this command :
m68k-uclinux-g++ -o hello helloworld.c
C++ source file - input : helloworld.c - output : hello
and,
m68k-uclinux-gcc -o hello helloworld.c
C source file - input : helloworld.c - output : hello
Kernel image generation
In a terminal, launche LTIB :
cd /home/as/ltib/ltib-cf_nommu-20081215 ./ltib -c
- Tick "Configure the kernel".
- In "Target System Configuration → Options → Network setup", unmark "get network parameters using dhcp" and change "IP address" to "192.168.0.2".
- In " Target Image Generation → Options → Choose your root filesystem image type", choose "Target image: (NFS)" and unmark "read-only root filesystem".
- Quit these menus "Do you wish to save your new configuration? → yes".
We arrive in the kernel options.
- In "General setup" menu, tick "System V IPC".
- In "File systems → Miscellaneous filesystems", unmark "ROM file system support".
- Quit these menus "Do you wish to save your new configuration? → yes".
The kernel image is generated. Now, prepare it to be injected in the System-On-Module (we are in LTIB directory) :
sudo gzip -f -9 rootfs/boot/vmlinux.bin /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 cp uImage /tftpboot/
uImage kernel image, in /tftpboot, is ready to be injected in the System-On-Module.
Root directory (in JFFS2) generation
In a terminal, launche LTIB :
cd /home/as/ltib/ltib-cf_nommu-20081215 ./ltib -c
- In "Image Generation → Options → Choose your root filesystem image type" :
choose "Target image: (jffs2)"
- unmark "read-only root filesystem"
- "jffs2 erase block size in KB (NEW) = 16"
- "(/tmp /var) Place these dirs in writable RAM"
Quit these menus "Do you wish to save your new configuration? → yes".
Now, the root directory image is available (rootfs.jffs2). Copy it in the boot directory (terminal in the LTIB directory) :
sudo cp rootfs.jffs2 /home/as/ltib/ltib-cf_nommu-20081215/rootfs/boot
The root directory is ready to be implemented in the System-On-Module.
Kernel image installation (in RAM, with root directory in NFS)
Connect the serial and Ethernet ports, form the System-On-Module to the computer.
In a terminal, launch Minicom (following commands are launched in Minicom).
Connect the supply to the System-On-Module and observe the boot sequence with Minicom. If a counter is present, interrupt it (Now, we are in bootloader menu).
To print (on the screen) the bootloader settings, execute this command :
printenv
To modify a setting, it is :
set setting 'value' save
Example :
set serverip '192.168.0.2' save
Check (through printenv) the configuration (and modify if necessary) :
gatewayip=192.168.0.1 netmask=255.255.255.0 ipaddr=192.168.0.254 serverip=192.168.0.2
Indicate to the OS where is the root directory (through a setting in the 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
(the root directory is in NFS on the development computer)
Load in RAM the kernel image :
tftp 0x41000000 uImage
And boot uClinux :
bootm 0x41000000
Root directory installation (in NAND Flash - JFFS2)
Here, we are in uClinux !
Execute these commands :
/usr/bin/flash_eraseall /dev/mtd1 cd /boot cp rootfs.jffs2 /dev/mtdblock1
Reboot the System-On-Module and change this bootloader setting
set bootargs 'root=/dev/mtdblock1 rw rootfstype=jffs2' save
Now, the root directory is operational from the System-On-Module
Kernel image installation (in NOR Flash)
Launch the System-On-Module and in the bootloader (U-Boot), Execute these commands
Remove a part of the NOR Flash memory protection, and erase it :
prot off 0x30000 0x1FFFFF erase 0x30000 0x1FFFFF
Load the kernel in the RAM, and copy it to the NOR Flash
tftp 0x40020000 uImage cp.b 0x40020000 0x30000 ${filesize}
Change the boot settings (bootloader option)
set bootcmd bootm 0x30000 set bootdelay 3 save
Now, the kernel boot from the NOR Flash, and the root directory is in NAND Flash. We have finished, the uClinux is fully functional from the System-On-Module !
Bug
Under uClinux AND with the kernel image in the NOR Flash, we have a bug : Ethernet is down.
To re-activate Ethernet, execute these commands (under uClinux) :
ip link set eth0 addr 00:08:ee:01:3f:7c ip link set eth0 up
(0008ee013f7c is MY System-On-Module MAC address. Modify this value for your System-On-Module (Sticker on the card))
Check Ethernet with a simple ping :
ping 192.168.0.2