Name Date Size #Lines LOC

..--

MAINTAINERSH A D05-Jun-20259.2 KiB381321

MakefileH A D05-Jun-2025487 198

README.nandH A D05-Jun-20252 KiB5440

README.sunxi64H A D05-Jun-20257.8 KiB166144

ahci.cH A D05-Jun-20252.9 KiB135111

board.cH A D05-Jun-202522.5 KiB817634

dram_sun4i_auto.cH A D05-Jun-2025673 3633

dram_sun5i_auto.cH A D05-Jun-2025783 3934

dram_timings_sun4i.hH A D05-Jun-20255.2 KiB206203

gmac.cH A D05-Jun-20252.6 KiB8371

mksunxi_fit_atf.shH A D05-Jun-20251.5 KiB8265

README.nand

1Allwinner NAND flashing
2=======================
3
4A lot of Allwinner devices, especially the older ones (pre-H3 era),
5comes with a NAND. NANDs storages are a pretty weak choice when it
6comes to the reliability, and it comes with a number of flaws like
7read and write disturbs, data retention issues, bloks becoming
8unusable, etc.
9
10In order to mitigate that, various strategies have been found to be
11able to recover from those issues like ECC, hardware randomization,
12and of course, redundancy for the critical parts.
13
14This is obviously something that we will take into account when
15creating our images. However, the BROM will use a quite weird pattern
16when accessing the NAND, and will access only at most 4kB per page,
17which means that we also have to split that binary accross several
18pages.
19
20In order to accomodate that, we create a tool that will generate an
21SPL image that is ready to be programmed directly embedding the ECCs,
22randomized, and with the necessary bits needed to reduce the number of
23bitflips. The U-Boot build system, when configured for the NAND will
24also generate the image sunxi-spl-with-ecc.bin that will have been
25generated by that tool.
26
27In order to flash your U-Boot image onto a board, assuming that the
28board is in FEL mode, you'll need the sunxi-tools that you can find at
29this repository: https://github.com/linux-sunxi/sunxi-tools
30
31Then, you'll need to first load an SPL to initialise the RAM:
32sunxi-fel spl spl/sunxi-spl.bin
33
34Load the binaries we'll flash into RAM:
35sunxi-fel write 0x4a000000 u-boot-dtb.bin
36sunxi-fel write 0x43000000 spl/sunxi-spl-with-ecc.bin
37
38And execute U-Boot
39sunxi-fel exe 0x4a000000
40
41On your board, you'll now have all the needed binaries into RAM, so
42you only need to erase the NAND...
43
44nand erase.chip
45
46Then write the SPL and its backup:
47
48nand write.raw.noverify 0x43000000 0 40
49nand write.raw.noverify 0x43000000 0x400000 40
50
51And finally write the U-Boot binary:
52nand write 0x4a000000 0x800000 0xc0000
53
54You can now reboot and enjoy your NAND.

README.sunxi64

1Allwinner 64-bit boards README
2==============================
3
4Newer Allwinner SoCs feature ARMv8 cores (ARM Cortex-A53) with support for
5both the 64-bit AArch64 mode and the ARMv7 compatible 32-bit AArch32 mode.
6Examples are the Allwinner A64 (used for instance on the Pine64 board) or
7the Allwinner H5 SoC (as used on the OrangePi PC 2).
8These SoCs are wired to start in AArch32 mode on reset and execute 32-bit
9code from the Boot ROM (BROM). As this has some implications on U-Boot, this
10file describes how to make full use of the 64-bit capabilities.
11
12Quick Start / Overview
13======================
14- Build the ARM Trusted Firmware binary (see "ARM Trusted Firmware (ATF)" below)
15- Build U-Boot (see "SPL/U-Boot" below)
16- Transfer to an uSD card (see "microSD card" below)
17- Boot and enjoy!
18
19Building the firmware
20=====================
21
22The Allwinner A64/H5 firmware consists of three parts: U-Boot's SPL, an
23ARM Trusted Firmware (ATF) build and the U-Boot proper.
24The SPL will load both ATF and U-Boot proper along with the right device
25tree blob (.dtb) and will pass execution to ATF (in EL3), which in turn will
26drop into the U-Boot proper (in EL2).
27As the ATF binary will become part of the U-Boot image file, you will need
28to build it first.
29
30 ARM Trusted Firmware (ATF)
31----------------------------
32Checkout the "allwinner" branch from the github repository [1] and build it:
33$ export CROSS_COMPILE=aarch64-linux-gnu-
34$ make PLAT=sun50iw1p1 DEBUG=1 bl31
35The resulting binary is build/sun50iw1p1/debug/bl31.bin. Either put the
36location of this file into the BL31 environment variable or copy this to
37the root of your U-Boot build directory (or create a symbolic link).
38$ export BL31=/src/arm-trusted-firmware/build/sun50iw1p1/debug/bl31.bin
39  (adjust the actual path accordingly)
40
41 SPL/U-Boot
42------------
43Both U-Boot proper and the SPL are using the 64-bit mode. As the boot ROM
44enters the SPL still in AArch32 secure SVC mode, there is some shim code to
45enter AArch64 very early. The rest of the SPL runs in AArch64 EL3.
46U-Boot proper runs in EL2 and can load any AArch64 code (using the "go"
47command), EFI applications (with "bootefi") or arm64 Linux kernel images
48(often named "Image"), using the "booti" command.
49
50$ make clean
51$ export CROSS_COMPILE=aarch64-linux-gnu-
52$ make pine64_plus_defconfig
53$ make
54
55This will build the SPL in spl/sunxi-spl.bin and a FIT image called u-boot.itb,
56which contains the rest of the firmware.
57
58
59Boot process
60============
61The on-die BROM code will try several methods to load and execute the firmware.
62On a typical board like the Pine64 this will result in the following boot order:
63
641) Reading 32KB from sector 16 (@8K) of the microSD card to SRAM A1. If the
65BROM finds the magic "eGON" header in the first bytes, it will execute that
66code. If not (no SD card at all or invalid magic), it will:
672) Try to read 32KB from sector 16 (@8K) of memory connected to the MMC2
68controller, typically an on-board eMMC chip. If there is no eMMC or it does
69not contain a valid boot header, it will:
703) Initialize the SPI0 controller and try to access a NOR flash connected to
71it (using the CS0 pin). If a flash chip is found, the BROM will load the
72first 32KB (from offset 0) into SRAM A1. Now it checks for the magic eGON
73header and checksum and will execute the code upon finding it. If not, it will:
744) Initialize the USB OTG controller and will wait for a host to connect to
75it, speaking the Allwinner proprietary (but deciphered) "FEL" USB protocol.
76
77
78To boot the Pine64 board, you can use U-Boot and any of the described methods.
79
80FEL boot (USB OTG)
81------------------
82FEL is the name of the Allwinner defined USB boot protocol built in the
83mask ROM of most Allwinner SoCs. It allows to bootstrap a board solely
84by using the USB-OTG interface and a host port on another computer.
85As the FEL mode is controlled by the boot ROM, it expects to be running in
86AArch32. For now the AArch64 SPL cannot properly return into FEL mode, so the
87feature is disabled in the configuration at the moment.
88
89microSD card
90------------
91Transfer the SPL and the U-Boot FIT image directly to an uSD card:
92# dd if=spl/sunxi-spl.bin of=/dev/sdx bs=8k seek=1
93# dd if=u-boot.itb of=/dev/sdx bs=8k seek=5
94# sync
95(replace /dev/sdx with you SD card device file name, which could be
96/dev/mmcblk[x] as well).
97
98Alternatively you can concatenate the SPL and the U-Boot FIT image into a
99single file and transfer that instead:
100$ cat spl/sunxi-spl.bin u-boot.itb > u-boot-sunxi-with-spl.bin
101# dd if=u-boot-sunxi-with-spl.bin of=/dev/sdx bs=8k seek=1
102
103You can partition the microSD card, but leave the first MB unallocated (most
104partitioning tools will do this anyway).
105
106NOR flash
107---------
108Some boards (like the SoPine, Pinebook or the OrangePi PC2) come with a
109soldered SPI NOR flash chip. On other boards like the Pine64 such a chip
110can be connected to the SPI0/CS0 pins on the PI-2 headers.
111Create the SPL and FIT image like described above for the SD card.
112Now connect either an "A to A" USB cable to the upper USB port on the Pine64
113or get an adaptor and use a regular A-microB cable connected to it. Other
114boards often have a proper micro-B USB socket connected to the USB OTB port.
115Remove a microSD card from the slot and power on the board.
116On your host computer download and build the sunxi-tools package[2], then
117use "sunxi-fel" to access the board:
118$ ./sunxi-fel ver -v -p
119This should give you an output starting with: AWUSBFEX soc=00001689(A64) ...
120Now use the sunxi-fel tool to write to the NOR flash:
121$ ./sunxi-fel spiflash-write 0 spl/sunxi-spl.bin
122$ ./sunxi-fel spiflash-write 32768 u-boot.itb
123Now boot the board without an SD card inserted and you should see the
124U-Boot prompt on the serial console.
125
126(Legacy) boot0 method
127---------------------
128boot0 is Allwiner's secondary program loader and it can be used as some kind
129of SPL replacement to get U-Boot up and running from an microSD card.
130For some time using boot0 was the only option to get the Pine64 booted.
131With working DRAM init code in U-Boot's SPL this is no longer necessary,
132but this method is described here for the sake of completeness.
133Please note that this method works only with the boot0 files shipped with
134A64 based boards, the H5 uses an incompatible layout which is not supported
135by this method.
136
137The boot0 binary is a 32 KByte blob and contained in the official Pine64 images
138distributed by Pine64 or Allwinner. It can be easily extracted from a micro
139SD card or an image file:
140# dd if=/dev/sd<x> of=boot0.bin bs=8k skip=1 count=4
141where /dev/sd<x> is the device name of the uSD card or the name of the image
142file. Apparently Allwinner allows re-distribution of this proprietary code
143"as-is".
144This boot0 blob takes care of DRAM initialisation and loads the remaining
145firmware parts, then switches the core into AArch64 mode.
146The original boot0 code looks for U-Boot at a certain place on an uSD card
147(at 19096 KB), also it expects a header with magic bytes and a checksum.
148There is a tool called boot0img[3] which takes a boot0.bin image and a compiled
149U-Boot binary (plus other binaries) and will populate that header accordingly.
150To make space for the magic header, the pine64_plus_defconfig will make sure
151there is sufficient space at the beginning of the U-Boot binary.
152boot0img will also take care of putting the different binaries at the right
153places on the uSD card and works around unused, but mandatory parts by using
154trampoline code. See the output of "boot0img -h" for more information.
155boot0img can also patch boot0 to avoid loading U-Boot from 19MB, instead
156fetching it from just behind the boot0 binary (-B option).
157$ ./boot0img -o firmware.img -B boot0.img -u u-boot-dtb.bin -e -s bl31.bin \
158-a 0x44008 -d trampoline64:0x44000
159Then write this image to a microSD card, replacing /dev/sdx with the right
160device file (see above):
161$ dd if=firmware.img of=/dev/sdx bs=8k seek=1
162
163[1] https://github.com/apritzel/arm-trusted-firmware.git
164[2] git://github.com/linux-sunxi/sunxi-tools.git
165[3] https://github.com/apritzel/pine64/
166