(Added statement about NFS server)
(Booting from NFS)
Line 91: Line 91:
 
wget http://ftp.heanet.ie/mirrors/fedora-secondary/releases/19/Images/armhfp/Fedora-KDE-armhfp-19-1-sda.raw.xz
 
wget http://ftp.heanet.ie/mirrors/fedora-secondary/releases/19/Images/armhfp/Fedora-KDE-armhfp-19-1-sda.raw.xz
 
unxz Fedora-KDE-armhfp-19-1-sda.raw.xz
 
unxz Fedora-KDE-armhfp-19-1-sda.raw.xz
<PRE>
+
</PRE>
  
 
Then mount the filesystem.  
 
Then mount the filesystem.  

Revision as of 10:17, 27 July 2013

Compiling the BeagleBone Black Kernel

Prerequisites

ARM Cross Compiler

To compile the linux kernel for the BeagleBone Black, you must first have an ARM cross compiler installed. I use gcc-4.7-arm-linux-gnueabi-base that comes with Ubuntu 13.04. It is assumed the cross compiler has been added to your path.

uBoot mkimage

The bootloader used on the BeagleBone black is u-boot. u-boot has a special image format called uImage. It includes parameters such as descriptions, the machine/architecture type, compression type, load address, checksums etc. To make these images, you need to have a mkimage tool that comes part of the u-Boot distribution. Download u-boot, make and install the u-boot tools:

wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2
tar -xjf u-boot-latest.tar.bz2
cd into u-boot directory
make tools
sudo install tools/mkimage /usr/local/bin

Compiling the BeagleBone Black Kernel

git clone git://github.com/beagleboard/kernel.git
cd kernel
git checkout 3.8
./patch.sh
cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig
wget http://arago-project.org/git/projects/?p=am33x-cm3.git\;a=blob_plain\;f=bin/am335x-pm-firmware.bin\;hb=HEAD -O kernel/firmware/am335x-pm-firmware.bin
cd kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- beaglebone_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage dtbs
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage-dtb.am335x-boneblack
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/home/cpeacock/export/rootfs modules_install

Testing

TFTP Server

Rather than flashing your newly created kernel to find out it doesn't work or it is not quite configured correctly, a better way is to load the kernel into RAM and boot it from there. u-boot allows kernel images to be loaded via TFTP.

To speed up development, I create an 'export' directory. A TFTP server is then configured to use this directory as the TFTP root.

From the export directory, add symbolic links to the kernel images. This way, you can recompile the kernel and the new image is instantly available without having to move it.

ln -s /path to linux/arch/arm/boot/uImage-dtb.am335x-boneblack uImage-BBB-3.8.13

u-boot tftpboot

To test your kernel, bring up a serial console to the GuruPlug. First we will need to configure the IP addresses. The ipaddr variable contains the IP address for the GuruPlug, while the serverip variable is the address of the TFTP server containing the kernel image.

setenv ipaddr 192.168.0.250
setenv serverip 192.168.0.251

These variables can be saved to non-volatile memory to speed up development.

Next load the image into memory at 0x80200000:

tftpboot 0x80200000 uImage-BBB-3.8.13

Let's use the existing root filesystem, and send kernel messages to ttyO0:

setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait

And boot from the memory location:

bootm 0x80200000

The example shown is to use the filesystem already in place (i.e. ext4 on mmcblk0p2). The preferred option is to export a root NFS filesystem.

Booting from NFS

Booting from NFS has the added advantage that you can compile userland binaries on your development box, install them to the NFS export and have instant access to them on your target system.

This requires a root filesystem to be present on your development box with binaries that have been cross compiled for ARM. Various distributions exist to assist with this. It is assumed a NFS server is installed and configured to export this directory.

My preference is to use Fedora ARM. You can download the ARM distributions from FedoraARM Releases

Download and decompress the raw filesystem:

wget http://ftp.heanet.ie/mirrors/fedora-secondary/releases/19/Images/armhfp/Fedora-KDE-armhfp-19-1-sda.raw.xz
unxz Fedora-KDE-armhfp-19-1-sda.raw.xz

Then mount the filesystem.

sudo kpartx -av Fedora-KDE-armhfp-19-1-sda.raw 

This will give you two filesystems - one the rootfs and the other the boot filesystem containing kernels, initial RAM filesystems etc.

Copy the contents of the mounted root filesystem to the destination rootfs folder on your development box:

sudo cp -R * /home/cpeacock/export/rootfs/

At this point you will need to ensure your kernel modules are present. If not, run the following from your kernel folder:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/home/cpeacock/export/rootfs modules_install

In uBoot, you can now issue the following commands to load your kernel from TFTP and your rootfs over NFS:

setenv ipaddr 192.168.0.250
setenv serverip 192.168.0.251
tftpboot 0x80200000 uImage-BBB-3.8.13
setenv bootargs console=ttyO0,115200n8 root=/dev/nfs rw nfsroot=192.168.0.251:/home/cpeacock/export/rootfs ip=192.168.0.250:::::eth0
bootm 0x80200000