Building the Wandboard boot loader

I've bee hacking away trying to set up Crochet-BSD to build boot images for Wandboard.  Wandboard uses Cortex A9 processor, so it's ARM.  The linux distros for it use U-Boot, so that seemed like a likely place to start for FreeBSD.

Looking at the Wandboard Wiki, there is an article on U-Boot which explains how to build U-Boot for Wandboard.   Firstly, download the October 2013 release of U-Boot here.  If you are building on FreeBSD, you'll need this patch to the Makefile to include libc.

Then, build U-Boot for wandboard:

make wandboard_quad_config
make

and copy the imx file to the sd card

sudo dd if=u-boot.imx of=/dev/mmcblk0 bs=1 seek=1024

This writes the imx file 1K into the disk; which is where the i.mx6 processor expects to find the U-boot image.  The processor manual is here.  It specifies offset 0x400 as the Program Image start on the SD card.  The U-boot startup looks like this:

CPU: Freescale i.MX6Q rev1.2 at 792 MHz
Reset cause: POR
Board: Wandboard
DRAM: 2 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: FEC [PRIME]
Hit any key to stop autoboot: 1 0 
mmc0 is current device
SD/MMC found on device 0

Keep in mind that the default serial protocol for Wandboard is 8n1 and 115200.

Once U-boot is started, you will need to boot the FreeBSD kernel.  My disk image is partitioned with a FAT partition on which I have kernel.bin, and a UFS partition which is the FreeBSD root file system.  kernel.bin is the raw kernel.  The partition table looks like this:

Disk: /dev/rdisk1 geometry: 3880/255/63 [62333952 sectors]
Signature: 0xAA55

Starting       Ending

#: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
*1: 0C    8   5   1 -   58  29  63 [     16443 -     102375] Win95 FAT32L
2: A5   58  30   1 -  992   1  63 [    118818 -    1881180] FreeBSD
3: 00    0   0   0 -    0   0   0 [         0 -          0] unused
4: 00    0   0   0 -    0   0   0 [         0 -          0] unused

You should notice that the FAT partition starts at 16443.  I've moved the start of the FAT partition further into the disk to accomodate u-boot at disk offset 0x400.

Once you've got an SD card with u-boot and kernel.bin on it, and you've booted to u-boot, you'll want to start the kernel.  At the u-boot console, load the kernel.bin into memory at address 0x12000000.

fatload mmc 0:1 12000000 kernel.bin

The address 0x1200000 is specified in the FreeBSD ARM configuration for Freescale.  Check here. Once the kernel is loaded, go ahead and start it:

go 12000000

This will start FreeBSD:

KDB: debugger backends: ddb
KDB: current backend: ddb
Copyright (c) 1992-2013 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 11.0-CURRENT #0 r259276: Thu Dec 12 17:20:23 MST 2013
 tom@bernice:/storage/home/tom/crochet/crochet-wandboard/crochet-freebsd/work/obj/arm.arm/storage/home/tom/crochet/src/FreeBSDHead/head/sys/WANDBOARD-QUAD arm
FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610
Preloaded elf kernel "kernel" at 0xc24afdac.
CPU: Cortex A9-r2 rev 10 (Cortex-A core)
 Supported features: ARM_ISA THUMB2 JAZELLE THUMBEE ARMv4 Security_Ext
 WB disabled EABT branch prediction enabled

In my case, I've run into a kernel crash starting the kernel, so I don't have a fully working system yet, but I do have a working boot loader.  The Crochet-BSD code to build an image file containing USB, a partitioned disk image, kernel.bin and the userland is here:

Leave a Reply