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 ...