Mainline Kernel Howto

This page describes how you can compile and use the Linux mainline kernel. For work done and a TODO list, read Linux mainlining effort.

Warning
Please note that this page might be outdated. Please refer to the Linux mainlining effort page for detailed status of mainlining effort and supported drivers. The upstream code does not support various drivers and lacks sound, display, 3D, 2D and media support.

If you simply want a more-or-less usable device for multimedia support, then use our own 3.4 branch.

Prerequisites

 * An initramfs image (for example generated using buildroot)
 * An ARM toolchain
 * U-Boot supporting device tree (if unsure, use a fresh build from the sunxi branch of u-boot-sunxi)

Supported boards
As of 3.12, the boards and SoC supported are:
 * A10
 * Cubieboard
 * Melee A1000
 * Mini X-plus
 * Hackberry
 * LinkSprite pcDuino
 * Inet 97f
 * A10-olinuxino-Lime


 * A10s
 * A10s-olinuxino


 * A13
 * A13-olinuxino
 * A13-olinuxino-Micro


 * A20
 * A20-olinuxino
 * Cubieboard2
 * Cubietruck


 * A31
 * A31 EVK

For boards using these SoCs, adding a new device tree should be trivial.

Stable releases
The stable releases are released by Linus Torvalds. Since Linux 3.8, the Allwinner support is added gradually. It is still quite sparse, but we are making good progress. This is probably what you should choose if you are looking for stability.

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Patches merged in the next stable release
There is also a sunxi-next branch maintained with all the inclusions that have been accepted, merged and will included in the next stable release. If you want to do some development, it's probably the best pick.

git clone git://github.com/mripard/linux.git -b sunxi-next

Patches not yet merged in the next release
You can find a sunxi-devel branch on linux-sunxi. This branch contains functional patches that are currently being reviewed on the kernel lists. If you want to do bleeding-edge mainline testing, this should probably be your pick. Please do not use this branch for development, as it is frequently rebased and the code is likely to change.

git clone git://github.com/linux-sunxi/linux-sunxi.git -b sunxi-devel

Configuration
ARCH=arm make sunxi_defconfig ARCH=arm make menuconfig

Once there, fill the option General Setup / Initramfs source file(s) with a path to your initramfs image.

Compilation
ARCH=arm CROSS_COMPILE= LOADADDR=0x40008000 make uImage dtbs

After the compilation ended, you should have generated both the uImage in arch/arm/boot, and a device tree blob in arch/arm/boot/dts.

This device tree blob (or simply dtb) gives to the kernel the description of the hardware it's currently running on. In its goal, it's pretty similar to the FEX scripts that Allwinner uses, yet far more generic. It allows to compile a single kernel image that will run on several platforms.

To identify the dtb file that you will use on your board, first look into arch/arm/boot/dts. You should see a whole bunch of them, most being irrelevant to us because targeting boards based on other ARM SoCs. All the sunxi dtb follow the pattern - - .dtb (for example sun5i-a13-olinuxino.dtb, refer to Allwinner SoC Family for an exhaustive list).

Kernel Loading
Now copy the relevant dtb and uImage somewhere that you can load it from on your board, like a tftp server, a SD Card, etc.

Once you get to the U-boot prompt, stop the autoboot, and load the kernel image and device tree into memory making sure the will not overlap.

Depending on where you store it, you will have something like fatload mmc 0 0x46000000 uImage fatload mmc 0 0x49000000 .dtb

Warning: Before giving control to the kernel the U-Boot will move the loaded binaries to some different addresses and ignore the fact, the kernel needs much more space for extracting itselt. This causes a dtb to be overwritten and failure to boot. This of course should be fixed in U-Boot but a workaround for now is to set fdt_high: env set fdt_high ffffffff Once it's loaded into memory, you only need to tell U-Boot to boot the kernel using bootm 0x 0x 0x if initramfs is built into the uImage, you just use "-" as a placeholder for its address. Taking all this into account your bootm might look like bootm 0x46000000 - 0x49000000

You might also need to modify kernel boot arguments to enable serial console:

setenv bootargs console=ttyS0,115200

The kernel should start booting up to a shell.

Have fun.

=See also=
 * Linux mainlining effort
 * Possible setups for hacking on mainline
 * Linux Kernel
 * Toolchain

=External Links=
 * Your new ARM SoC Linux support check-list! by Thomas Petazzoni of Free Electrons
 * Linux Kernel Upstreaming How-To (CNXSoft - Embedded Software Development)
 * Matt Porter's YouTube video talk on “Upstreaming 101" (LCA14-111)
 * Matt Porter's presentation slides for “Upstreaming 101" (LCA14-111)
 * Matt Porter's YouTube video talk on “Upstreaming 201" (LCA14-112)
 * Matt Porter's presentation slides for “Upstreaming 201" (LCA14-112)
 * How to Write and Submit a Linux Kernel Patch (CNXSoft - Embedded Software Development)
 * YouTube Video- Write and Submit your first Linux kernel Patch
 * Greg Kroah-­Hartman Kernel Tutorial Write and Submit your first Linux Kernel Patch
 * Linaro resources page from LCA (Linaro Connect Asia) 2014