Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Page development is in progress.

Dependencies for sdcard flashing.
1)bootloader:
               Bananapi r4 follows a atf(arm-trusted firmware) flow for device bootup, by default flash memory is present in the device (BL1), and bl1 is depended on bl2 address which flow is mentiond below.

draw.io Diagram
bordertrue
diagramNameBPIR4_Bootup_flow
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth121
height311
revision1

1)BL1: Bootloader one which will be part of flash memory of bpir4 , it will be holding address for bl2.
2)BL2: Bootloader two need to be generated and loaded in a specified sector so that bl1 can load bl2. 
3)fip: Firmware image Package which contains firmware components eg bl31.
4)Kernel: Layer which will be acting between hardware and OS.
5)RDKB : RDKB stack or RDKB OS for user interaction.

Bootloader file generation

For generated bl2.img and fip.bin i used below mentioned git repo.
1) https://github.com/frank-w/u-boot/tree/2024-04-bpi → for generating uboot.bin files .
2) https://github.com/frank-w/u-boot/tree/mtk-atf → for generating atf flow bootloader files (bl2.img and fip.bin)

At initial i cloned mentioned git code https://github.com/frank-w/u-boot/tree/2024-04-bpi , and made below mentioned changes in uboot env file to make bootloader to load kernel and rdkb rootfs at initial bootup itself.

Code Block
themeEclipse
titleBootloader changes wrt RDKB BPIR4 specific.
collapsetrue
heam@Dell-OptiPlex-9020:~/bootloader/u-boot$ git diff
diff --git a/build.conf b/build.conf
index 217679e5393..d1ebe634a3f 100644
--- a/build.conf
+++ b/build.conf
@@ -2,12 +2,12 @@ uploaduser=$USER
 uploadserver=r2
 uploaddir=/var/lib/tftp
 
-board=bpi-r2
+#board=bpi-r2
 #board=bpi-r64
 #board=bpi-r2pro
 #board=bpi-r3
 #board=bpi-r3mini
-#board=bpi-r4
+board=bpi-r4
 
 #device=emmc
 #device=spi-nand
diff --git a/uEnv_r4.txt b/uEnv_r4.txt
index dc60a382cd2..0ca9b61df4a 100644
--- a/uEnv_r4.txt
+++ b/uEnv_r4.txt
@@ -1,82 +1,19 @@
 board=bpi-r4
 device=mmc
-partition=0:5
+partition_boot=0:3
 bootenv=uEnv.txt
 bootdevice=sd
-
-fit=bpi-r4.itb
-#bootconf="#conf-2"
-#initrd=rootfs.cpio.zst
-
-loadaddr=0x46000000
-uaddr=0x41e00000
 kaddr=0x46000000
-rdaddr=0x48000000
-
-root=/dev/mmcblk0p6 rootfstype=ext4 rootwait
-console=ttyS0,115200n1 earlycon=uart8250,mmio32,0x11000000
-bootopts=debug=7 mem=3G
-
-#version=-v0
-wifi_en=0
-sata_en=0
-
-usb_part=0:1
-
-nvme_boot=0:1
-nvme_root=/dev/nvme0n1p2
-
-#netboot
-ipaddr=192.168.0.19
-netmask=255.255.255.0
-serverip=192.168.0.10
-
-lstftp=if tftp ${loadaddr} ${serverip}:r4-itbfiles.lst;then setexpr listend ${loadaddr} + ${filesize};mw.b ${listend} 00 2;strings ${loadaddr};else echo "tftp download failed";fi
-askkernel=askenv kernelinput "enter kernel-name:";
-askbootnetfit=run lstftp askkernel;if printenv kernelinput; then setenv bootfile "${kernelinput}"; run bootnetfit;fi
-
-askbootnvme=run usenvme; if test "$device" = "nvme"; then run askkernel;if printenv kernelinput; then setenv fit $kernelinput;run newboot;fi;fi
-
-bootnetfit=run buildargs;if tftp $kaddr ${bootfile}; then bootm $kaddr;fi
-bootfile=bpi-r4.itb
-
-checkenv=test -e ${device} ${partition} ${bootenv}
-loadenvfile=if fatload ${device} ${partition} ${loadaddr} ${bootenv};then env import -t ${loadaddr} ${filesize};else echo "fatload (${bootenv}) failed";fi
-loadenv=if run checkenv;then run loadenvfile;fi
-resetenv=env default -a;printenv;
-
-loadkernel=fatload $device $partition $kaddr ${kernel}
-buildargs=setenv bootargs "board=${board} console=${console} root=${root} ${bootopts}
-
-useusb=if usb info; then usb reset;else usb start;fi; if ls usb $usb_part $usb_path; then setenv device usb;setenv partition $usb_part;fi
-usenvme=pci enum; nvme scan;nvme info; if ls nvme $nvme_boot;then setenv device "nvme";setenv partition $nvme_boot;setenv root $nvme_root;else echo "nvme partition not found";fi
-
-useinitrd=setenv bootopts "${bootopts} initrd=${rdaddr},100M";
-checkrd=if printenv initrd;then if fatload ${device} ${partition} ${rdaddr} ${initrd};then run useinitrd;fi;fi
-
-newboot=run checkrd; run setbootconf; run buildargs;if printenv fit;then setenv kernel ${fit};if run loadkernel; then bootm ${kaddr}${bootconf}; fi;fi;
-bootnetfit=run checkrd; run setbootconf;run buildargs;if tftp $kaddr ${bootfile}; then bootm ${kaddr}${bootconf};fi
-
-checkmmc=if mmc partconf 0; then echo "emmc available";mmcdev="emmc";else echo "sd available";mmcdev="sd";fi
-checksata=if test -n "$sata_en" && test $sata_en -eq 1;then setenv satacfg "#sata"; fi
-checkwifi=if test -n "$wifi_en" && test $wifi_en -eq 1;then setenv wificfg "#wifi"; fi
-setbootconf=run checkmmc checksata checkwifi;setenv bootconf "#conf-$mmcdev$version$wificfg$satacfg";printenv bootconf
-
-wrspimnand=if printenv bl2file;then if fatload $device $partition $loadaddr $bl2file;then mtd erase spi-nand0 0x0 0x100000;mtd write spi-nand0 $loadaddr 0x0 0x100000;else echo "loading bl2 $bl2file failed";fi;else echo "bl2file not defined";fi;if printenv fipfile;then if fatload $device $partition $loadaddr $fipfile;then mtd erase spi-nand0 0x580000 0x200000;mtd write spi-nand0 $loadaddr 0x580000 0x200000;else echo "loading fip $fipfile failed";fi;else echo "fipfile not defined";fi
-wremmc=if printenv bl2file;then mmc partconf 0 1 1 1;if fatload $device $partition $loadaddr $bl2file;then mmc erase 0x0 0x400;mmc write ${loadaddr} 0x0 0x400;else echo "loading bl2 $bl2file failed";fi;else echo "bl2file not defined";fi;mmc partconf 0 1 1 0;if printenv fipfile;then if fatload $device $partition $loadaddr $fipfile;then mmc erase 0x3400 0x1000;mmc write ${loadaddr} 0x3400 0x1000;else echo "loading fip $fipfile failed";fi;else echo "fipfile not defined";fi
-
-bootdelay=0
-bootcmd=setenv bootdelay 3; run loadenv;bootmenu;
-
-lskernel=ls ${device} ${partition};
-askkernel=askenv kernelinput "enter kernel name:";
-
-boot0=run lskernel;run askkernel;if printenv kernelinput ;then setenv fit ${kernelinput}; run newboot; fi;
-
-bootmenu_0=1. Enter kernel-name to boot from SD/EMMC.=run boot0
-bootmenu_1=2. Boot kernel from TFTP.=run askbootnetfit
-bootmenu_2=3. Boot from SD/EMMC.=run newboot
-bootmenu_3=4. Boot kernel from NVME.=run askbootnvme
+loadaddr=0x60000000
+bootenv=uEnv.txt
+kernel=fitImage
+fit=mt7988a-bananapi-bpi-r4-sd.dtb
 
-bootmenu_default=2
+bootmenu_0=1. Load image from sdcard .=run rdkb_bpir4
+bootargs=earlycon console=ttyS0,115200 root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait  debug=7
+rdkb_bpir4=run rdkb-kernel ;run rdkb-dtb ;run rdkb-run
+rdkb-dtb=fatload mmc 0\:3 ${loadaddr} ${fit}
+rdkb-kernel=fatload mmc 0\:3 ${kaddr} ${kernel} 
+rdkb-run=bootm ${kaddr} - ${loadaddr}
 
+bootcmd=setenv bootdelay 3 ;bootmenu;

After making changes just executed build.sh file, after complete execution of this script file. We can see u-boot.* files will be generated in specific folder.

Code Block
titleFile after build.sh script execution
collapsetrue
heam@Dell-OptiPlex-9020:~/bootloader/u-boot$ ls
api    build.conf  common     doc      examples             include  Licenses     post       System.map  u-boot.bin      u-boot.lds        u-boot.srec     uEnv_r3.txt
arch   build.log   config.mk  drivers  files                Kbuild   MAINTAINERS  README     test        u-boot.cfg      u-boot.map        u-boot.sym      uEnv_r4.txt
board  build.sh    configs    dts      fs                   Kconfig  Makefile     README.md  tools       u-boot.dtb      u-boot-mtk.bin    uEnv_r2pro.txt  uEnv_r4.txt.old
boot   cmd         disk       env      generated_defconfig  lib      net          scripts    u-boot      u-boot-dtb.bin  u-boot-nodtb.bin  uEnv_r2.txt     uEnv_r64.txt


In other terminal clone https://github.com/frank-w/u-boot/tree/mtk-atf, and copy all u-boot.* files from existing generated folder to this specific folder and then execute build.sh script.
 


Build instructions for SD image for BPIR4.

...