I recently had to flash a Hikey 970 from scratch. However, the official documentation does not appear to have been updated since 2018. Hence, this post documents the steps of how far I got. Unfortunately I was not able to get the whole thing working, but I will update this post if I do. If you found this post, and did get it working, please feel free to contact me so it can be updated.

I started by following the official “Getting Started” guide. I downloaded the Lebuntu For HiKey970 OS image, which was released on 2018/07/04. I tried to flash this image with fastboot, however when running sudo fastboot devices, my device did not appear.

Thus, according to the guide I had to reflash the firmware. The guide for reflashing the firmware is here.

I cloned the repositories:

git clone https://github.com/96boards-hikey/arm-trusted-firmware -b hikey970_v1.0
git clone https://github.com/96boards-hikey/edk2 -b hikey970_v1.0
git clone https://github.com/96boards-hikey/OpenPlatformPkg -b hikey970_v1.0
git clone https://github.com/96boards-hikey/l-loader -b hikey970_v1.0
git clone https://github.com/Mani-Sadhasivam/uefi-tools -b hikey970_v1.0
git clone https://github.com/96boards-hikey/tools-images-hikey970

and I prepared the shell script to build build_bootloader.sh. The first problem was that I had to link /usr/bin/python to /usr/bin/python2, since the build process was only defined for python2, and assumed that /usr/bin/python was Python 2.

Next, running the build failed with the following error:

GenVtf.c:1532:3: error: ‘strncpy’ output truncated before terminating nul copying 8 bytes from a string of the same length [-Werror=stringop-truncation]
 1532 |   strncpy ((CHAR8 *) &FitStartPtr->CompAddress, FIT_SIGNATURE, 8);  // "_FIT_   "
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GenVtf.c: In function ‘ConvertVersionInfo’:
GenVtf.c:132:7: error: ‘strncpy’ output truncated before terminating nul copying as many bytes from a string as its length [-Werror=stringop-truncation]
  132 |       strncpy (TemStr + 4 - Length, Str, Length);
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GenVtf.c:130:14: note: length computed here
  130 |     Length = strlen(Str);
      |              ^~~~~~~~~~~
cc1: all warnings being treated as errors

To fix this, I removed the -Wall and -Werror flags from the BUILD_CFLAGS of ./edk2/BaseTools/Source/C/Makefiles/header.makefile. Next, the build failed with aarch64-linux-gnu-gcc not found! Obviously, though it was not listed as a dependency in the guide, we need the cross-compiler for 64 bit Arm architectures installed. For Debian based distributions the required packages can be installed with sudo apt install gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu.

Rerunning build_bootloader.sh, the process got a lot further. However, building edk2 failed with:

GenFw: ERROR 3000: Invalid
  WriteSections64(): /tmp/hikey/edk2/Build/HiKey970/DEBUG_GCC5/AARCH64/ArmPlatformPkg/PrePi/PeiUniCore/DEBUG/ArmPlatformPrePiUniCore.dll AARCH64 small code model requires identical ELF and PE/COFF section offsets modulo 4 KB.
GenFw: ERROR 3000: Invalid
  WriteSections64(): /tmp/hikey/edk2/Build/HiKey970/DEBUG_GCC5/AARCH64/ArmPlatformPkg/PrePi/PeiUniCore/DEBUG/ArmPlatformPrePiUniCore.dll unsupported ELF EM_AARCH64 relocation 0x137.
GenFw: ERROR 3000: Invalid
  WriteSections64(): /tmp/hikey/edk2/Build/HiKey970/DEBUG_GCC5/AARCH64/ArmPlatformPkg/PrePi/PeiUniCore/DEBUG/ArmPlatformPrePiUniCore.dll unsupported ELF EM_AARCH64 relocation 0x138.
GenFw: ERROR 3000: Invalid
  WriteSections64(): /tmp/hikey/edk2/Build/HiKey970/DEBUG_GCC5/AARCH64/ArmPlatformPkg/PrePi/PeiUniCore/DEBUG/ArmPlatformPrePiUniCore.dll unsupported ELF EM_AARCH64 relocation 0x137.

I found this mailing list post about the issue, however the patch of adding -fno-asynchronous-unwind-tables to GCC_AARCH64_CC_FLAGS appears to already by present in upstream.

Therefore, beyond this point I’m not sure of the solution. Fortunately I had another Hikey available that did work, so I was able to continue with my work. As said at the start of this post, if you did manage to get it working, please get in touch so I can update this guide.