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