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