Difference between revisions of "MINI2440 embedded projects"
(→Compile kernel) |
(→Install kernel modules in the filesystem) |
||
Line 179: | Line 179: | ||
<pre> | <pre> | ||
cd ../kernel/mini2440/ | cd ../kernel/mini2440/ | ||
− | CROSS_COMPILE=arm-none-eabi- ARCH=arm make INSTALL_MOD_PATH=/home/ttts/mini2440/filesystem/grip/ modules_install | + | CROSS_COMPILE=arm-none-eabi- ARCH=arm make INSTALL_MOD_PATH=/home/ttts/mini2440/filesystem/grip/ O=../kernel-bin/ modules_install |
</pre> | </pre> | ||
+ | |||
=== Config the filesystem === | === Config the filesystem === | ||
<pre> | <pre> |
Revision as of 15:44, 19 January 2010
This page is currently under constructions, I'm doing this all over with the new versions of all the software
Contents
Toolchain
First of all, we need a toolchain containing some command-line tools for our ARM platform:
- C and C++ compilers
- assembler
- linker
- C and C++ runtime libraries
- GNU debugger
I'm going to use the Sourcery G++ Lite ARM that is available for free.
You can get the last version from http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3053
Downloading and unpacking
mkdir mini2440 cd mini2440 wget http://www.codesourcery.com/sgpp/lite/arm/portal/package5353/public/arm-none-eabi/arm-2009q3-68-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 tar jxf arm-2009q3-68-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 export PATH=/home/ttts/mini2440/arm-2009q3/bin:$PATH
The last line will add the bin directory the $PATH variable so that we can use the commands in that directory like normal commands.
Every time you open a terminal, you have to enter that last line. (or you can add it to your .bashrc file)
Uboot
Download uboot for mini2440
mkdir uboot cd uboot git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
Compile uboot
export CROSS_COMPILE=arm-none-eabi- cd mini2440 make mini2440_config make all
When I tried to compile uboot I got an error about some weak declarations in lib_arm/board.c and common/main.c
I'm using the 4.4.x gcc, and the 4.3.x does not cause that error. You can downgrade your gcc or remove the "weak" definitions in those files like I did
Compile upload tool
cd ~/mini2440 wget http://mini2440.googlecode.com/files/s3c2410_boot_usb-20060807.tar.bz2 tar jxf s3c2410_boot_usb-20060807.tar.bz2 cd s3c2410_boot_usb make
When make fails because he can not find the file "usb.h" install the ubuntu/debian package libusb-dev.
Upload the file
Open a terminal to the serial connection of the mini2440 board.
Put the NOR switch to NOR and power the board.
Now you get a "FriendlyARM BIOS"/supervivi menu, choose q to go to the supervivi shell.
In this shell you typ "load flash 0 232188 u"
Where "232188" is the size of the uboot.bin file you are going to send. (ls -la mini2240/uboot/mini2440 | grep u-boot.bin)
Send the file from your linux terminal:
./s3c2410_boot_usb ../uboot/u-boot.bin
Sometimes the upload tool says that the upload is failed, but don't trust it :P
The upload of uboot didn't work for me at first but just keep trying
Kernel
Download kernel
cd ~/mini2240 mkdir kernel cd kernel git clone git://repo.or.cz/linux-2.6/mini2440.git cd mini2440
Config kernel
mkdir ../kernel-bin CROSS_COMPILE=arm-none-eabi- ARCH=arm make O=../kernel-bin/ mini2440_defconfig CROSS_COMPILE=arm-none-eabi- ARCH=arm make O=../kernel-bin/ menuconfig
After the last command you will get a menu where you can select the kernel options you want.
I had a problem compiling my kernel in the next stap and found this solution:
Mail-archive.com solution
Quote from the website above:
Try this:
in Kernel config
-->"User Space Binary formats"
-->un-check "Kernel support for a.out and ECOFF binaries"
Compile kernel
CROSS_COMPILE=arm-none-eabi- ARCH=arm make O=../kernel-bin/
Make kernel image
Because uboot expects some headers you have to add some headers to your fresh compiled kernel.
cd ~/mini2240 ./uboot/mini2440/tools/mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d kernel/kernel-bin/arch/arm/boot/zImage linux-image
A => Architecture
O => Operating system
T => image typ
C => compression
a => load adres in hex
e => entry point
d => image data
Load the kernel in the board
All command are entered as root
DHCP server
Install DHCP server:
apt-get install dhcp3-server
Put your pc on a static IP, edit /etc/network/interfaces
auto eth1 iface eth1 inet static address 192.168.0.2 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1
I use a special setup with a subnet behind NAT
eth0 is connected directly to my lan, eth1 is connected to a router where the mini2440 is connected
You don't want to run a DHCP server on a LAN where there is already a DHCP server!!
Open /etc/dhcp3/dhcd.conf with your favorite editor and add the folow lines:
subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.10 192.168.0.240; option routers 192.168.0.1; option domain-name-servers 8.8.8.8; } host mini2440 { filename "linux"; server-name "192.168.0.2"; next-server 192.168.0.2; hardware ethernet 08:08:11:18:12:27; fixed-address 192.168.0.9; }
Change the hardware address to the MAC address of your board
If you don't known the MAC address of your board, you can find this in the uboot console during boot
You can change the IP addresses to fit your needs.
8.8.8.8 is the open DNS server from google
192.168.0.1 => router
192.168.0.2 => debian server
192.168.0.9 => mini2440
Reboot DHCP server:
invoke-rc.d dhcp3-server restart
TFTP server
Install tftp server and client (client for testing):
apt-get install tftpd tftp /etc/init.d/openbsd-inetd restart
Copy the linux-image to /srv/tftp/linux:
cp /home/ttts/mini2440/linux-image /srv/tftp/linux
Typ "dhcp" in the uboot console of the mini2440 board, normaly you should see the kernel loading.
Filesystem
All commands are entered as root
cd /home/ttts/mini2240 mkdir filesystem cd filesystem debootstrap --arch=armel --foreign lenny grip/ http://www.emdebian.org/grip/
Install kernel modules in the filesystem
cd ../kernel/mini2440/ CROSS_COMPILE=arm-none-eabi- ARCH=arm make INSTALL_MOD_PATH=/home/ttts/mini2440/filesystem/grip/ O=../kernel-bin/ modules_install
Config the filesystem
cd ../../filesystem/grip/ echo "proc /proc proc none 0 0" > etc/fstab echo "mini2440" > etc/hostname mknod dev/console c 5 1 mknod dev/ttySAC0 c 204 64 echo "deb http://www.emdebian.org/grip/ lenny main" > etc/apt/sources.list
NFS server
apt-get install nfs-kernel-server
edit /etc/exports and add the folow line:
/home/ttts/mini2440/filesystem/grip *(rw,no_root_squash,no_subtree_check,async)
Boot the system
The first time we boot the board we are not goining to load init but just sh that we get a shell to finish debootstrap
Open a serial console to the board, and power the board.
In the uboot console you enter this:
setenv bootargs console=ttySAC0,115200 noinitrd init=/bin/sh mini2440=0tb ip=dhcp root=/dev/nfs rw nfsroot=192.168.0.2:/home/ttts/mini2440/filesystem/grip dhcp bootm 0x32000000
mini2440=0tb for the 3,5" screen and =1tb for the 7" screen.
After entering the last command, the linux kernel will start booting and drop you in a shell
First see that the clock of the board is correct!
If the clock is not correct, the debootstrap command may fail.
Check and set the system clock and hardware clock.
date date -s "20 JAN 2010 15:20:00" hwclock -systohw
Finish the debootstrap install:
mount /proc /proc -t proc export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /debootstrap/debootstrap --second-stage