Skip to content
Switch branches/tags
This branch is 20 commits ahead, 1948 commits behind mtk-openwrt:mtksoc.
Fetch upstream

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

ATF for Bananapi-R64


On a x86/x64-host you need cross compile tools for the arm64 architecture

(package list maybe incomplete)

sudo apt install gcc-aarch64-linux-gnu make gcc


  • change build.conf to match desired device (emmc/sd) and upload-settings
  • copy 64bit uboot.bin to this source directory
  • run ./

built binaries:

  • run ./ upload


new GPT with BPI-BOOT/BPI-ROOT (headless)

root@bpi-r64:~# gdisk /dev/mmcblk0

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            6143   2.0 MiB     8300  fip #BL31+uboot 0x800 (len 0x1000)
   2            6144            7167   512.0 KiB   8300  config #uboot-env 0x1800 (len 0x400), unused
   3            7168            8191   512.0 KiB   8300  rf #calibration data, unused
   4            8192          212991   100.0 MiB   0700  kernel #BPI_BOOT for kernel/dtb/FIT
   5          212992        15269854   7.2 GiB     8300  root #BPI-ROOT for rootfs

/dev/mmcblk0: PTUUID="2bd17853-102b-4500-aa1a-8a21d4d7984d" PTTYPE="gpt"
/dev/mmcblk0p1: PARTLABEL="fip" PARTUUID="18de6587-4f17-4e08-a6c9-d9d3d424f4c5"
/dev/mmcblk0p2: PARTLABEL="config" PARTUUID="19a4763a-6b19-4a4b-a0c4-8cc34f4c2ab9"
/dev/mmcblk0p3: PARTLABEL="rf" PARTUUID="8142c1b2-1697-41d9-b1bf-a88d76c7213f"
/dev/mmcblk0p4: PARTLABEL="kernel" PARTUUID="971f7556-ef1a-44cd-8b28-0cf8100b9c7e"
/dev/mmcblk0p5: PARTLABEL="root" PARTUUID="c0cb3022-76d5-42d6-a370-fd1c5594f2b2"


EMMC with upstream uboot

needs option CONFIG_SUPPORT_EMMC_BOOT=y in installed uboot (sdcard) for "mmc partconf"!

#flash bl2
setenv ipaddr
setenv serverip
setenv loadaddr 0x44000000
mmc dev 0
mmc partconf 0 1 1 1
if tftp ${loadaddr} ${serverip}:bl2_emmc.img;then mmc erase 0x0 0x400;mmc write ${loadaddr} 0x0 0x400;fi
mmc partconf 0 1 1 0
mmc dev 0
#mmc partconf 0 1 1 0
setenv loadaddr 0x44000000
setenv serverip
#write emmc_header
if tftp ${loadaddr} ${serverip}:header_emmc.bin ;then mmc erase 0x0 0x400;mmc write ${loadaddr} 0x0 0x1;fi
#write gpt
if tftp ${loadaddr} ${serverip}:bpi-r64_headless.gpt;then mmc write ${loadaddr} 0x1 0x3FF; fi
#write fip
if tftp ${loadaddr} ${serverip}:fip_emmc.bin;then mmc erase 0x800 0x1000;mmc write ${loadaddr} 0x800 0x1000;fi

SD via dd

build and install img

#backup old bootchain
sudo dd if=/dev/sdb of=atf-backup.img bs=512 count=6144
#build new one
./ rename
./ img
#install new bootchain
sudo dd if=bpi-r64_sdmmc.img of=/dev/sdb

manual install parts

sudo dd of=$target if=header_sdmmc.bin bs=512 seek=0
sudo dd of=$target if=bpi-r64_headless.gpt bs=512 seek=1
sudo dd of=$target if=./bl2_sdmmc.img bs=512 seek=1024
sudo dd of=$target if=./fip_sdmmc.bin bs=512 seek=2048

strip own gpt

without first 512 bytes (gpt only, like bpi-r64_headless.bin):

npart=4;sudo dd if=/dev/sdb of=bpi-r64_headless.gpt bs=1 skip=512 count=$(( $npart*128 +1024 ))

change npart to number of partitions in your GPT

booting linux kernel

booting fit-image

my kernel-repo creates for r64 (arch=arm64) also an FIT-Image (*.itb) which needs to be uploaded to tftp

setenv serverip
setenv loadaddr 0x44000000
tftp ${loadaddr} bpi-r64-5.4.77-main.itb
bootm ${loadaddr}

as there is no rootfs yet you need a initramfs to create filesystem on emmc

create filesystem from running system

root@bpi-r64:~# mkfs.vfat -n "BPI-BOOT" /dev/mmcblk0p4
root@bpi-r64:~# mkfs.ext4 -L "BPI-ROOT" /dev/mmcblk0p5

current u-boot binary supports variable "fit" in uEnv.txt, so put your itb in

bananapi/bpi-r64/linux/ of /dev/mmcblk0p4

and set this in this uEnv.txt: