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 fully supports major functions (except NAND) on all the older Allwinner SoCs (A10/A10s/A13/A20/A23/A31/A31s) and has basic support for the more recent A33, A64, A80, A83T, H2+, H3, H5, and V3s(No MPI-DSI Lcd).

The next release will be v2019.01.

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

In Progress

 * A83T USB support (WiP: Chen-Yu Tsai (wens)) patch-rfc
 * A83T PSCI support (WiP: Timothy Pearson) patch-rfc
 * H2+/H3/A64 HDMI / Composite out support (WiP: Jernej Škrabec) git-repo
 * A20 SPI driver (WiP: Stephan van Schaik (Swabbles)) patch-rfc git-repo
 * A31/A80/A64 SPI driver (WiP: Philipp Tomsich) patch-v1
 * R40 Banana Pi M2 Ultra support (WiP: Chen-Yu Tsai (wens)) patch

Next Release (v2019.01)
Development branch

v2018.11
v2018.11 Release branch

v2018.09
v2018.09 Release branch
 * Boards
 * Pine64 SoPINE
 * Xunlong Orange Pi One Plus
 * PineH64

v2018.07
v2018.07 Release branch
 * Boards
 * Orange Pi R1
 * Libre Computer Board ALL-H3-CC‎, H2+ version
 * Libre Computer Board ALL-H3-CC‎, H5 version
 * Orange Pi Zero Plus
 * Banana Pi M2 Berry

v2018.05
v2018.05 Release branch
 * Boards
 * Olimex A20-SOM204-EVB
 * Olimex A20-SOM204-EVB with eMMC

v2018.03
v2018.03 Release branch
 * Boards
 * Libre Computer Board ALL-H3-CC‎, H3 version

v2018.01
v2018.01 Release branch
 * Boards
 * NanoPi NEO Plus 2
 * TBS A711

v2017.11
v2017.11 Release branch
 * Boards
 * Olimex A20-OLinuXino-Micro eMMC variant
 * FriendlyARM Nanopi M1 Plus
 * Sinovoip Banana Pi M2 Magic

v2017.09
v2017.09 Release branch
 * Boards
 * NanoPi A64
 * OLinuXino Lime2 (A20) with eMMC
 * OLinuXino A64

v2017.07
v2017.07 Release branch
 * Boards
 * Xunlong Orange Pi Win and Win Plus
 * Xunlong Orange Pi Prime
 * Xunlong Orange Pi Zero Plus 2

v2017.05
v2017.05 Release branch
 * A64 SPL support
 * H5 support (with SPL)
 * Boards
 * Xunlong Orange Pi PC 2
 * FriendlyARM NanoPi NEO Air

v2017.03
v2017.03 Release branch


 * enable H3 EMAC for the nanopi neo
 * add proper device tree for Orange Pi Zero boards
 * OrangePi Zero: defconfig: enable SPI flash
 * OrangePi Zero: add Ethernet node

v2017.01
v2017.01 Release branch


 * add support for Nintendo NES Classic Edition

v2016.11
v2016.11 Release branch


 * Hans de Goede and Ian Campbell step down as U-boot Sunxi maintainers


 * A80
 * Full SPL support


 * A64
 * USB support


 * H3
 * DRAM impedance calibration fixes


 * Boards
 * FriendlyARM NanoPi NEO
 * Sinlinx SinA33
 * USB host and OTG support
 * Cubietech Cubieboard4

v2016.09
v2016.09 Release branch


 * General
 * GPIO fixes
 * PSCI rewrite in C part 2
 * NAND controller driver
 * H3/A64 Ethernet (EMAC) support


 * Boards
 * Empire Electronix M712
 * Inet Q972
 * Olimex A33-OLinuXino
 * Xunlong Orange Pi PC Plus
 * Xunlong Orange Pi Plus 2E

v2016.07
v2016.07 Release branch


 * AXP809 PMIC support


 * PSCI rewrite in C part 1


 * Boards
 * Allwinner R16 EVB
 * Inet 86dz
 * Polaroid MID2407PXE03

v2016.05
v2016.05 Release branch


 * A23
 * Support new revisions


 * A64
 * 64-bit ARMv8 port, basic support (MMC, UART, no USB, no Ethernet)
 * (basic) EFI support (allows booting EFI applications (like grub) or kernels)


 * I2C support fix for families with separate reset control


 * SID e-fuse support for A83T and H3


 * Sync up dts files with Linux kernel
 * Update compatible strings for GPIO


 * Boards
 * colorfly e708 q1, Difrence DIT4350, Polaroid MID2809PXE4, Itead Ibox, icnova-a20-swac, yones toptech bs1078-v2, Dserve DSRV9703C,
 * Cubietech Cubietruck Plus
 * Sinlinx SinA31s
 * Xunlong Orange Pi 2
 * Pine64
 * LicheePi Zero

v2016.03
v2016.03 Release branch


 * PRCM i2c support


 * A83T
 * LPDDR3 support


 * H3
 * USB host support
 * PSCI (security switches included)
 * sy8106a i2c-based regulator support


 * AXP PMICs
 * Power off support


 * Boards
 * Banana Pi M3 (SinoVoip BPi-M3)

v2016.01
v2016.01 Release branch
 * sun8i-H3 support


 * Boards
 * Empire Electronix D709 tablet
 * A83T HomletV2 Board
 * Lamobo R1
 * Xunlong Orange Pi Plus
 * Xunlong Orange Pi PC
 * C.H.I.P.

v2015.10
v2015.10 Release branch


 * Console/display output
 * ANX9804 LCD-eDP bridge chip support
 * Composite video output support


 * NAND SPL driver


 * Boards
 * Olimex A20-SOM-EVB
 * A10s-Wobo-i5 (settop box)
 * Point of View pov protab2-ips9 tablet
 * Auxtek-T003 HDMI stick
 * A10 tablets based on the iNet-tek iNet-1 mainboard (e.g. Point of View Protab2 XXL, Cherry M1007)
 * A10 tablets based on the inet9f-rev03 mainboard (e.g. qware tb-g100 tablet)
 * A13 tablets based on on the inet98v_rev2 mainboard
 * A10 tablets based on the inet97fv2 mainboard
 * A23 tablets based on the gt90h-v4 mainboard

v2015.07
v2015.07 Release 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 reverted: Revert commit


 * 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 Board

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.

= Compile U-Boot =

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

Get the Device-tree Compiler
Depending on your desired U-Boot version, a sufficiently up-to-date dtc may be required. (The build process will error on an outdated dtc, and request you to upgrade it.) The installation of dtc is described in the Device tree article.

If you are going to build a Linux kernel alongside U-Boot, it might also be worth to examine the kernel sources - as they come with dtc included under.

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

Determine build target
Go to your u-boot tree and search in the directory configs/ for your board, the file name looks like _defconfig.

So, if your device is Cubieboard2 your build target is Cubieboard2_defconfig.

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

There is also menuconfig to play with settings if you feel like it: make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

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

or for A64:

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-

(When compiling natively, omit the CROSS_COMPILE=… )

When the build has completed, there will be u-boot-sunxi-with-spl.bin available in your u-boot tree. The installation step will instruct how to install this on the installation media (e.g. a SD card), but first U-Boot needs to be configured.

= Configure U-Boot =

This article provides a collection of various scenarios for booting with U-Boot.

Boot
For getting these bits loaded onto the hardware, please refer to the respective howto:
 * SD Card
 * NAND
 * SPI NOR Flash
 * USB OTG
 * Ethernet
 * Fastboot

Booting with boot.cmd
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 also want to use an initramfs, please refer to the Initial Ramdisk article for details.




 * Substitute zImage in place of uImage in the commands above, and then use the bootz command instead of bootm.

Booting with extlinux.conf
Mainline U-Boot also use syslinux/extlinux as payload.

You need to install the boot configuration file extlinux.conf in an ext2/3/4 partition of SD card and U-Boot will find and execute it. This is conceptually identical to creating a GRUB configuration file on a desktop PC.

Example extlinux.conf: TIMEOUT 100 DEFAULT default MENU TITLE Boot menu

LABEL default MENU LABEL Default LINUX /zImage FDT /sun4i-a10-marsboard.dtb APPEND root=/dev/sda1 rootwait console=tty0 console=ttyS0,115200n8

LABEL exit MENU LABEL Local boot script (boot.scr) LOCALBOOT 1

Setting u-boot environment variables
There is a difference in setting environment variables between the boot script and the U-Boot shell.

Inside the shell you would set, for instance: setenv root /dev/sda1

But in the script you would use: root=/dev/sda1

NAND
Example U-Boot environment, as found in  from a stock android U-Boot environment partition

bootdelay=0 bootcmd=run setargs boot_normal console=ttyS0,115200 nand_root=/dev/nandc mmc_root=/dev/mmcblk0p4 init=/init loglevel=8 setargs=setenv bootargs console=${console} root=${nand_root} init=${init} loglevel=${loglevel} boot_normal=nand read 40007800 boot;boota 40007800 boot_recovery=nand read 40007800 recovery;boota 40007800 boot_fastboot=fastboot

NFS
Recent version of U-Boot are able to boot from NFS as well as TFTP, but you have to get rid of the automatic setup of FTP. Check Ethernet for more information.

FB console
To get U-Boot output shown on the built-in framebuffer driver (currently, HDMI only at 1024x768), add the following to your boot.cmd: setenv stdout=serial,vga setenv stderr=serial,vga The default environment has these values set as well.

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

= Install U-Boot =


 * Convert the boot.cmd to boot.scr using mkimage:

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


 * Copy the bootloader to the installation media

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


 * copy kernel files to the first partition
 * For a 3.4 kernel you need uImage (linux kernel) and script.bin (binary representation of FEX).
 * For a device tree based kernel ("mainline", 4.x) you need the kernel image (uImage or zImage) and the device-specific .dtb file (the one referenced in the ${fdtfile} above) that is generated as part of your kernel compilation.

Look at Manual build howto for more details.

= Troubleshooting =

USB 1.x, USB keyboards (U-Boot < v2015.07)
U-Boot v2015.07 and later shouldn't have problems supporting mixed USB 1.x/2.0 devices. OHCI and EHCI no longer conflict with each other (after the switch to device model).

Previous U-Boot versions (v2015.04 and older) have a problem supporting both USB 1.x (OHCI) and USB 2.0 (EHCI) at the same time - the latter includes the SUNXI_EHCI driver 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.

U-Boot 2015.07+ won't start
If you're using a recent (device model based) U-Boot, and the SPL just hangs after initializing the DRAM ( or something similar), chances are that your main U-Boot binary may be missing DTB information / a proper device tree. Depending on the (possibly outdated) instructions you followed: double-check that you're not incorrectly using u-boot.bin instead of u-boot-dtb.bin, or u-boot.img instead of u-boot-dtb.img.

Legacy kernel won't start

 * If your 3.4.x kernel refuses to boot / gets stuck right after "Starting kernel ...":
 * Double-check that bootm_boot_mode is set to "sec"! (see above)
 * For U-Boot 2018.09-rc1 or later, set CONFIG_ARMV7_LPAE=n in .config or apply https://patchwork.ozlabs.org/patch/1058338/
 * If you don't have a serial console and only use VGA/HDMI/LCD, then it might be also the case of "Unrecognized/unsupported machine ID" (see below).

Unrecognized/unsupported machine ID
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 upgrade to a recent stage/sunxi-3.4 kernel (github branch) - or try to "Enable workarounds for booting old kernels" in U-Boot:
 * or, the option is located under "ARM architecture". (Make sure to rebuild your U-Boot after changing it.)

If upgrading to stage/sunxi-3.4 is not an option (i.e. using some old and very much diverged sunxi-3.4 fork is really necessary), then the following patches can be cherry-picked (= selectively merged as a set ): 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

ImportError: No module named _libfdt
If you see the following error when compiling on Arch Linux arm ImportError: No module named _libfdt

install dtc sudo pacman -S dtc

= 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

A more complete set of available Kconfig options and their descriptions can be found here: http://git.denx.de/?p=u-boot.git;a=blob;f=board/sunxi/Kconfig;h=e1d4ab148f0838d746889775cfbab5bed57838bf;hb=a705ebc81b7f91bbd0ef7c634284208342901149#l177

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.

= See also =
 * Mainline Kernel Howto