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