U-Boot

Support for sunxi devices is increasingly available from upstream U-Boot. This page describes that support. We have a separate page for the 'legacy' sunxi branch of U-Boot.

= Status =

The current U-Boot release (v2015.04) fully supports major functions (except NAND) on all the older Allwinner SoCs (A10/A10s/A13/A20/A23/A31/A31s).

The next release (v2015.07) will include full support for A33, and basic support for A80.

See also: U-Boot Release Cycle and Release Schedule.

In Progress
Development branch

v2015.07 (planned)
v2015.07 Release candidate branch


 * Serial number support
 * Device model support
 * Ethernet
 * GPIO
 * sun8i (A33) support (including SPL)
 * sun9i (A80) basic support
 * UART
 * MMC
 * sun6i/sun8i
 * PSCI CPU hotplugging
 * SPL
 * NAND support


 * Boards:
 * Mixtile LOFT-Q
 * Ainol AW1
 * Yones Toptech BD1078
 * iNet 3W
 * iNet 3F
 * ET-Q8 A33
 * Ippo q8h v1.2 A33 1024x600
 * ga10h v1.1
 * Merrii A80 Optimus

v2015.04
v2015.04 Release branch


 * sun7i (A20) PSCI CPU hotplug
 * sun8i (A23) SPL
 * RSB
 * AXP223


 * sun9i (A80) basic support
 * Clocks
 * RSB


 * Console/display output
 * VGA via internal DAC
 * VGA via external DAC on LCD interface
 * LVDS
 * SSD2828 MIPI bridge
 * tl059wv5c0 LCD panel


 * USB OTG


 * Boards:
 * CSQ CS908
 * Merrii Hummingbird A31
 * Ippo q8h v1.2
 * MSI Primo81
 * MSI Primo73
 * LinkSprite pcDuino
 * LinkSprite pcDuino V2
 * LeMaker Banana Pro
 * Rikomagic mk802
 * Rikomagic mk802ii
 * Semitime g2 (See also Format_MK802 with A10s)
 * MarsBoard A10
 * Gemei G9
 * Chuwi V7 CW0825
 * Mele M5
 * Hyundai A7HD
 * LinkSprite pcDuino3 Nano
 * TZX-Q8-713B7
 * Inet 86vs
 * Ampe A76
 * Jesurun Q5
 * MK808C
 * Mele I7
 * Forfun Q88DB
 * Wits Pro A20 DKT
 * Xunlong Orange Pi
 * Xunlong Orange Pi Mini
 * Wexler TAB 7200

v2015.01
v2015.01 Release branch


 * sun6i (A31) processor support
 * P2WI
 * AXP221
 * SPL
 * GMAC
 * sun8i (A23) processor support (no SPL)
 * sun6i/sun8i reset support
 * Console/display output
 * HDMI only
 * simplefb


 * Boards:
 * Mele M3
 * Olimex A20-OLinuXino-Lime2
 * WITS Colombus Board
 * Mele M9

v2014.10
v2014.10 Release branch


 * AHCI (SATA)
 * sun4i (AKA A10) and sun5i (AKA A10s and A13) processors
 * EMAC Ethernet
 * AXP152 and AXP209 power controllers
 * EHCI USB
 * SMP support for sun7i via PSCI.


 * Boards:
 * LeMaker Banana Pi

v2014.07
v2014.07 Release branch
 * sun7i (AKA A20) processors
 * MMC
 * GMAC Ethernet
 * Boards:
 * Cubietech Cubietruck

= Supported Devices = Beware: some of the above might only be supported in the latest development version.

USB 1.x, USB keyboards
Current U-Boot (2015.04-rc4) has a problem supporting both USB 1.x (OHCI) and USB 2.0 (EHCI) at the same time - the latter includes the SUNXI_EHCI for Allwinner boards. Unfortunately, this also affects many USB HID / keyboard devices which would not be detected properly by U-Boot. The typical message in this case is "cannot reset port N!?", where N is whichever USB port those devices were attached to.

See: http://lists.denx.de/pipermail/u-boot/2015-January/200162.html.

= Compile U-Boot =

Get a toolchain
If you haven't done so before, get a suitable toolchain installed and added to your PATH.

Clone the repository
For u-boot version v2014.10-rc1 and later:

You can clone the u-boot repository by running: git clone git://git.denx.de/u-boot.git

Determine build target
For u-boot version v2014.10-rc1 and later:

Go to your u-boot tree and search in the directory configs/ for your board, the file name looks like _defconfig. So, Cubieboard2_defconfig for the Cubietech Cubieboard2.

Build
For u-boot version v2014.10-rc1 and later:

When you have determined what  you want to build, configure: make CROSS_COMPILE=arm-linux-gnueabihf- _defconfig

Then just build it: make CROSS_COMPILE=arm-linux-gnueabihf-

(When compiling natively, omit the CROSS_COMPILE=… )

Boot
When the build has completed, there will be u-boot-sunxi-with-spl.bin available in your u-boot tree.

For getting these bits loaded onto the hardware, please refer to the respective howto:
 * SD Card
 * USB

For booting from sd with mainline u-boot, the recommended way is:


 * create a file boot.cmd on the first partition (also check Kernel arguments for extra 'bootargs' options):

(If you're wondering why setting bootm_boot_mode might be necessary for older 3.4.x kernels, have a look at the details of PSCI.)


 * convert boot.cmd to boot.scr:

mkimage -C none -A arm -T script -d boot.cmd boot.scr


 * install U-Boot

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8


 * copy uImage (linux kernel) and script.bin (binary representation of FEX) to the first partition

Look at Manual build howto for more details.

Troubleshooting
The sunxi-3.4 kernel may fail to boot with one of the following error messages on the serial console (but this message is not visible on a HDMI monitor or a LCD display!): Error: unrecognized/unsupported machine ID (r1 = 0x10001008). Error: unrecognized/unsupported machine ID (r1 = 0x1000102a). Error: unrecognized/unsupported machine ID (r1 = 0x100010bb). In this case either try to "Enable workarounds for booting old kernels" in U-Boot menuconfig or upgrade to a recent stage/sunxi-3.4 kernel.

If upgrading to stage/sunxi-3.4 is not an option (using some old and very much diverged sunxi-3.4 fork is really necessary), then the following patches can be cherry-picked: wget https://github.com/linux-sunxi/linux-sunxi/commit/5052b83aa44dc16d6662d8d9d936166c139ad8c5.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/9a1cd034181af628d4145202289e1993c1687db6.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/c4c4664ed1a2f35e54a33ae4e65f517721ff43b5.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/ade08aa6e5249a9e75a97393e86c250b2bcb3ec8.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/16b25a95327f45a995f6efcf3e9d83a414231af9.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/dea62f21deb177053b84b15a519dff6c74d061d9.patch wget https://github.com/linux-sunxi/linux-sunxi/commit/d47d367036be38c5180632ec8a3ad169a4593a88.patch git am 5052b83aa44dc16d6662d8d9d936166c139ad8c5.patch git am 9a1cd034181af628d4145202289e1993c1687db6.patch git am c4c4664ed1a2f35e54a33ae4e65f517721ff43b5.patch git am ade08aa6e5249a9e75a97393e86c250b2bcb3ec8.patch git am 16b25a95327f45a995f6efcf3e9d83a414231af9.patch git am dea62f21deb177053b84b15a519dff6c74d061d9.patch git am d47d367036be38c5180632ec8a3ad169a4593a88.patch

= Configure U-Boot =

Please refer to our configuring U-Boot howto.

= Adding a new device to upstream U-Boot =

http://lists.denx.de/pipermail/u-boot/2014-December/199351.html

Failsafe DRAM settings, based on standard JEDEC timings
Each device has DRAM settings configured in its defconfig file in the U-Boot "configs" directory (here is an example for the Cubietruck board). The slow failsafe DRAM settings for an A10/A13/A20 device may look like:  +S:CONFIG_DRAM_CLK=360 +S:CONFIG_DRAM_ZQ=123 +S:CONFIG_DRAM_EMR1=4 +S:CONFIG_DRAM_TIMINGS_DDR3_800E_1066G_1333J=y

The settings from the Android firmware
Somewhat better settings can be retrieved by the meminfo tool from the stock Android or GNU/Linux system, provided by the device manufacturer. It still makes sense to test the reliability of the resulting DRAM configuration. Because some vendors are providing poor configuration for ZQ or EMR1, but nevertheless trying to optimistically set the DRAM clock speed too high.

Performance optimized DRAM settings
Tuning DRAM setting for each individual board can provide much better performance than the failsafe defaults. This involves trial and error testing of different settings using a tool until an optimal combination is found. The DRAM Controller page provides links to start researching this topic. This approach will be time consuming, so a satisfactory solution using one of the other approaches may be best to start with.

LCD Settings
There is a separate wiki page about configuring LCD in U-Boot.

= See also =
 * Mainline Kernel Howto