Booting a recent kernel on the APQ8060 Qualcomm DragonBoard

My DragonBoard

Background

I got this board from some Qualcomm guys at the Embedded Systems Conference "Design West" in San Jose in april 2012. Here is some idiomatic terminology you need:

Preparations

This board only talks the fastboot boot protocol. (No U-Boot or such.) So you need to get this tool. On Fedora, simply:

yum install android-tools

This will get you the command-line tool fastboot.

To get the board into fastboot mode so that a new kernel (or image, or whatever) can be uploaded to it, remove the battery connector and DC plug so that the board is completely unpowered, then press and hold down the 5 key on the keypad while inserting the DC plug. At this point the board is in the state where you can run the fastboot command line.

Split the supplied boot image and boot the parts

There are various tools for peeling apart the supplied boot.img into its constituents. The one that finally worked for me was named unpackbootimg, and produced a number of files, most notably the kernel zImage and the ramdisk. When you have these parts the following magic boots it:

fastboot -b 40200000 -c "console=ttyHSL0,115200,n8 androidboot.hardware=qcom" -p 2048 boot boot.img-zImage boot.img-ramdisk.gz

Boot a mainline Linux kernel

With some hands-on a mainline Linux kernel can actually boot to prompt on the Dragonboard since v3.14-rc1. Some bugs were introduced with the switch to mach-qcom in kernel v3.15 but should be fixed in kernel v3.17.

On my Dragonboard there is a problem with the ATAGs passed to the kernel: these indicate that the first memory area is at 0x40200000-0x42dfffff but Linux needs to boot from an even memory boundary, 0x40200000 will not work. For this reason you need to apply this ugly patch (older version for mach-msm)that adjusts the first ATAG to claim memory 0x40000000-0x42dfffff instead. I don't know if newer little kernels (the thing that runs fastboot) are fixed in this regard.

To compile a fresh APQ8060 DragonBoard kernel you first need a cross compiler such as the Linaro GCC toolchain. Then you can use my makefile and my rootfs CPIO image (in case you're interested that was generated using this script) in the main Linux source tree (with the mentioned patch) like this:

linux$ make -f apq8060.mak config && make -f apq8060.mak build

Here are pre-compiled images that you can use and test if you like:

So to boot a mainline kernel all you need is to replace the boot.img-zImage with something freshly compiled. However the TTY name is also changed in mainline from ttyHSL to ttyMSM so the parameter needs changing. Actually, with a mainline zImage kernel all you need is:

fastboot -b 40200000 -c "console=ttyMSM0,115200,n8" boot zImage

After this your board should boot to prompt on the serial port.

Building all of Android or just the stock kernel

This is pretty painful.

Links