This is an old revision of the document!
Since Linux x.y.z, the kernel support arm device via a device tree. The idea is to make one kernel which supports all platform. The bootloader passes a device tree binary (DTB) to Linux, describing the platform. If the bootloader can't pass the DTB to the kernel, you need to append to it.
You need a toolchain for cross-compiling the kernel
| Distribution name | command to get mkimage command | toolchain triplet |
|---|---|---|
| Ubuntu 12.10 | sudo apt-get install arm-linux-gnueabi-gcc | arm-linux-gnueabi- |
Get the source from lacie-nas.org :
git-clone git://lacie-nas.org/linux-lacie.git
As DTB is not yet in mainstream for marvell platforms, you need to check out the DTB branch
cd linux-lacie git checkout -b remotes/origin/kirkwood/dtb-append
Next build your kernel with your toolchain ( here is for kirkwood ) :
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kirkwood_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
This will build kernel image, and dtb for all kirkwood platforms.
Now you have to append the DTB to kernel. DTB are in the arch/arm/boot/ directory. Choose the one corresponding to your device ( here this is a network space 2 lite ) :
cat arch/arm/boot/zImage arch/arm/boot/kirkwood-ns2lite.dtb > zImage+kirkwood-ns2lite.dtb
Now you need to add an header for u-boot loader. First get the “mkimage” command :
| Distribution name | command to get an arm toolchain |
|---|---|
| Ubuntu 12.10 | sudo apt-get install u-boot-tools |
Make uImage. This is the binary to be loaded by u-boot :
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Linux+dtb -d zImage+kirkwood-ns2lite.dtb uImage
You can now boot this image :
U-Boot 2012.10 (Dec 03 2012 - 12:59:10) NS v2 Lite
SoC: Kirkwood 88F6281_A1
DRAM: 128 MiB
WARNING: Caches not enabled
SF: Detected MX25L4005 with page size 64 KiB, total 512 KiB
In: nc
Out: nc
Err: nc
Net: egiga0
88E1318 Initialized on egiga0
Hit any key to stop autoboot: 0
ns2>
ns2> tftp uImage
Using egiga0 device
TFTP from server 192.168.1.19; our IP address is 192.168.1.65
Filename 'uImage'.
Load address: 0x800000
Loading: #################################################################
#################################################################
######################################################
done
Bytes transferred = 2689852 (290b3c hex)
ns2> bootm
## Booting kernel from Legacy Image at 00800000 ...
Image Name: Linux+dtb
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2689788 Bytes = 2.6 MiB
Load Address: 00008000
Entry Point: 00008000
Verifying Checksum ... OK
Loading Kernel Image ...