Versions Compared

Key

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

Table of Contents
minLevel2
stylesquare

Dependencies for sdcard build

Bootloader

Bananapi r4 follows a atf (arm-trusted firmware) flow for device bootup, by default flash memory is present in the device which will be loaded with BL1  and BL1 will be having bl2 address to load bl2 and make device up.

Device bootup flow as mentioned below.

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

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

NOTE: Kernel and rdkb rootfs will be generated as part BPIR4 build instructions.

ATF files

Following git repositories used for generating bl2.img and fip.bin file.
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)

Changes in u-boot env file to make boot-loader compatible in  loading kernel and rdkb os at initial boot-up itself

Page development is in progress.

...

.

Code Block
themeRDarkEclipse
titleBPIR4 build instructios for generating sdcard image.Bootloader changes wrt RDKB BPIR4 specific (bl2.patch)
collapsetrue
repodiff init --ugit https://code.rdkcentral.com/r/manifests -b kirkstone -m rdkb-bpi-extsrc.xml
repo sync -j `nproc` --no-clone-bundle --no-tags
MACHINE=bananapi4-rdk-broadband source meta-cmf-bananapi/setup-environment-refboard-rdkb

#After giving machine command select the option based of your flashing mode.
# Option 1 to generate sdcard image.

jenkins@build-yocto-persistent-rdkm-hkumar343:~/jenkinsroot/workspace/Heam/BPIR4_SD$ MACHINE=bananapi4-rdk-broadband source meta-cmf-bananapi/setup-environment-refboard-rdkb
You had no conf/local.conf file. This configuration file has therefore been
created for you from /home/jenkins/jenkinsroot/workspace/Heam/BPIR4_SD/meta-rdk/conf/local.conf.sample
You may wish to edit it to, for example, select a different MACHINE (target
hardware). See conf/local.conf for more information as common configuration
options are commented.
You had no conf/bblayers.conf file. This configuration file has therefore been
created for you from /home/jenkins/jenkinsroot/workspace/Heam/BPIR4_SD/meta-rdk/conf/bblayers.conf.sample
To add additional metadata layers into your configuration please add entries
to conf/bblayers.conf.
The Yocto Project has extensive documentation about OE including a reference
manual which can be found at:
    https://docs.yoctoproject.org
For more information about OpenEmbedded see the website:
    https://www.openembedded.org/

Common targets are:
    core-image-minimal
    rdk-oss-image
    rdk-generic-hybrid-image
    rdk-generic-mediaclient-image
    rdk-generic-broadband-image
    rdk-generic-camera-image
    rdk-generic-broadband-tdk-image
    rdk-generic-broadband-dev-image
    rdk-generic-hybrid-dev-image
    rdk-generic-mediaclient-dev-image
You can also run generated qemu images with a command like 'runqemu qemuarm'
Configuration files have been created for the following configuration:
 DISTRO: rdkb
 MACHINE: bananapi4-rdk-broadband
Manifest Name = rdkb-bpi-extsrc.xml
kirkstone tune-cortexa53.inc
kirkstone whitelist.inc
#########################################################
### Which Format image you want to generate for BPIR4 ###
#########################################################
1) SD
2) EMMC
3) NOR
Choose image format(1-SD, 2-EMMC, 3-NOR): 1


bitbake rdk-generic-broadband-image

Image generating steps for BPIR4
-Execute script in build folder to generate final sdcard image.

Code Block
themeRDark
titleScript execution creating sdcard image.
collapsetrue
bananapi4-rdk-broadband$ ./bpir4_sd_image_creater.sh
create bpi-r4_sdmmc_rdk-broadband-image.img
run losetup to assign image bpi-r4_sdmmc_rdk-broadband-image.img to loopdev /dev/loop24 (loop24)
Creating new GPT entries in memory.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
Setting name!
partNum is 0
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
Setting name!
partNum is 1
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
Setting name!
partNum is 2
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
Setting name!
partNum is 3
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
480+1 records in
480+1 records out
246069 bytes (246 kB, 240 KiB) copied, 0.165271 s, 1.5 MB/s
562+1 records in
562+1 records out
288153 bytes (288 kB, 281 KiB) copied, 0.0626902 s, 4.6 MB/s
mkfs.fat 4.2 (2021-01-31)
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 1689600 4k blocks and 422656 inodes
Filesystem UUID: 2ec68480-e1a2-4c40-aadb-b739a3edf4af
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

539116+0 records in
539116+0 records out
276027392 bytes (276 MB, 263 MiB) copied, 2.14511 s, 129 MB/s
packing image...
heam@Dell-OptiPlex-9020:~/Downloads/BPIR4_latest_23_oct/bananapi4-rdk-broadband$ ls
atf
bpir4_sd_image_creater.sh
bpi-r4_sdmmc_rdk-broadband-image.img.gz
fitImage
fitImage-1-5.4.271+git0+feeb59687b_3fec063b05-r0-bananapi4-rdk-broadband-20241023065547.bin
fitImage-bananapi4-rdk-broadband.bin
fitImage-its-1-5.4.271+git0+feeb59687b_3fec063b05-r0-bananapi4-rdk-broadband-20241023065547.its
fitImage-its-bananapi4-rdk-broadband
fitImage-linux.bin-1-5.4.271+git0+feeb59687b_3fec063b05-r0-bananapi4-rdk-broadband-20241023065547.bin
fitImage-linux.bin-bananapi4-rdk-broadband
hash-summary
modules-1-5.4.271+git0+feeb59687b_3fec063b05-r0-bananapi4-rdk-broadband-20241023065547.tgz
modules-bananapi4-rdk-broadband.tgz
mt7988a-bananapi-bpi-r4-sd-1-5.4.271+git0+feeb59687b_3fec063b05-r0-bananapi4-rdk-broadband-20241023065547.dtb
mt7988a-bananapi-bpi-r4-sd-bananapi4-rdk-broadband.dtb
mt7988a-bananapi-bpi-r4-sd.dtb
rdkb-generic-broadband-image_rdk-next_20241023114221.bin.ext4
rdkb-generic-broadband-image_rdk-next_20241023114221.bin.manifest
rdkb-generic-broadband-image_rdk-next_20241023114221.bin.squashfs-xz
rdkb-generic-broadband-image_rdk-next_20241023114221.testdata.json
rdk-generic-broadband-image-bananapi4-rdk-broadband.ext4
rdk-generic-broadband-image-bananapi4-rdk-broadband.manifest
rdk-generic-broadband-image-bananapi4-rdk-broadband.squashfs-xz
rdk-generic-broadband-image-bananapi4-rdk-broadband-sysupgrade.bin
rdk-generic-broadband-image-bananapi4-rdk-broadband.testdata.json
heam@Dell-OptiPlex-9020:~/Downloads/BPIR4_latest_23_oct/bananapi4-rdk-broadband$ 

...

a/build.conf b/build.conf
index 217679e5393..7ee955fd48f 100644
--- a/build.conf
+++ b/build.conf
@@ -2,12 +2,11 @@ uploaduser=$USER
 uploadserver=r2
 uploaddir=/var/lib/tftp
 
-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;

Changes in ATF's build.sh script.

Code Block
themeEclipse
titleChanges in atf (fip.patch)
collapsetrue
diff --git a/build.sh b/build.sh
index 6939bd1ee87..8837ddf1517 100755
--- a/build.sh
+++ b/build.sh
@@ -3,9 +3,8 @@ export LANG=C
 export ARCH=arm64
 export CROSS_COMPILE=aarch64-linux-gnu-
 
-board="bpi-r3"
 #board="bpi-r64"
-#board="bpi-r4"
+board="bpi-r4"
 device="sdmmc"
 #device="emmc"
 #device="spim-nand"

Building bl2.img and fip.bin in case of not having access to artifactory repository

Build instruction to create bl2.img and fip.bin in local linux machine(Ubuntu 22.04).

Code Block
titleBuilding BL2 and FIP binaries in local machine (Ubuntu 22.04)
collapsetrue
### Prerequisite packages
$ sudo apt-get install gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu libc6-armhf-cross u-boot-tools make gcc swig python3-pyelftools flex

### Building u-boot binaries
$ mkdir BL2 && cd BL2
$ git clone https://github.com/frank-w/u-boot.git -b 2024-04-bpi
$ cd u-boot
$ git apply bl2.patch ## See above - patch content is provided in above block.
$ make mt7988a_bpir4_sd_defconfig
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ ./build.sh

### Building FIP binary
$ cd ../..
$ mkdir FIP && cd FIP
$ git clone https://github.com/frank-w/u-boot.git -b mtk-atf
$ cd u-boot
$ git apply fip.patch ## See above - patch content is provided in above block.

### Copy all u-boot.* files for creating fip.bin
$ cp ../../BL2/u-boot/u-boot.* .
$ ./build.sh


### Both bl2.img and fip.bin are present folder ./build/mt7988/release
$ cd ./build/mt7988/release
$ ls bl2.img fip.bin

### Renaming binaries as per Yocto's wks file
$ mv bl2.img bpi-r4_sdmmc_bl2.img
$ mv fip.bin bpi-r4_sdmmc_fip.bin

Bring bpi-r4_sdmmc_bl2.img and bpi-r4_sdmmc_fip.bin files under meta-cmf-bananapi/meta-rdk-mtk-bpir4/recipes-bsp/trusted-firmware-a/files directory.

In meta-cmf-bananapi/meta-rdk-mtk-bpir4/recipes-bsp/trusted-firmware-a/bootloader_prebuild.bb, comment SRC_URI lines with artifcatory repo and uncomment alternate SRC_URI to load bpi-r4_sdmmc_bl2.img and bpi-r4_sdmmc_fip.bin from meta-cmf-bananapi/meta-rdk-mtk-bpir4/recipes-bsp/trusted-firmware-a/files directory.

Generating SD card image for BPI-R4

Build instruction

Code Block
themeRDark
titleBPIR4 build instructios for generating sdcard image.
repo init -u https://code.rdkcentral.com/r/manifests -b kirkstone -m rdkb-bpi-extsrc.xml
repo sync -j `nproc` --no-clone-bundle --no-tags
MACHINE=bananapi4-rdk-broadband source meta-cmf-bananapi/setup-environment-refboard-rdkb
bitbake rdk-generic-broadband-image

Flashing steps

Generated SD card Image can be flashed directly to sdcard using bmaptool command or balenaEtcher.

Code Block
themeRDark
titleBPIR4 2nd time flashing instructions.
collapsetrue
1) bzip2 -d <Path to ImageName.wic.bz2>
2) sudo -E bmaptool copy --nobmap <Path to ImageName.wic> <Path to SD card device file>

...