bsp: cvitek: use rttpkgtool for aarch64

Fixed  #9968

1.Using scripts in rttpkgtool to make firmware.
2.Deleted duplicate prebuild files.
3.Modify README.md

Signed-off-by: YunZhan Huang <1583267844@qq.com>
This commit is contained in:
jojoandgyc
2025-03-29 08:55:40 +08:00
committed by Rbb666
parent 1bb18f6e9e
commit 15ef367477
16 changed files with 36 additions and 948 deletions
+16 -2
View File
@@ -4,10 +4,11 @@ source ./tools.sh
function usage() {
echo "Usage:"
echo " ./build.sh [-h|-l|-b]"
echo " ./build.sh [-h|-l|-b|-a]"
echo " -h: display usage"
echo " -l: build c906L"
echo " -b: build c906B"
echo " -a: build Cortex-A53"
}
function build_c906b() {
@@ -28,7 +29,13 @@ function build_c906l() {
DPT_PATH_KERNEL=$BSP_PATH/../../ DPT_BOARD_TYPE=$BOARD_TYPE DPT_PATH_OUTPUT=$BSP_PATH/output ./rttpkgtool/script/mkpkg.sh -l
}
while getopts ":hbl" opt
function build_a53() {
echo "build_a53 for duo256m"
DPT_PATH_KERNEL=$BSP_PATH/../../ DPT_BOARD_TYPE=duo256m DPT_PATH_OUTPUT=$BSP_PATH/output DPT_ARCH=arm ./rttpkgtool/script/mkpkg.sh
}
while getopts ":hbla" opt
do
case $opt in
h)
@@ -40,6 +47,9 @@ do
l)
O_MAKE_LITTLE=y
;;
a)
O_MAKE_ARM=y
;;
?)
echo "Unrecognized parameter."
usage
@@ -66,3 +76,7 @@ if [ "$O_MAKE_LITTLE" = "y" ]; then
build_c906l
fi
if [ "$O_MAKE_ARM" = "y" ]; then
build_a53
fi
+19 -11
View File
@@ -48,11 +48,9 @@ export RTT_EXEC_PATH=/opt/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
## 2.3. 执行构建
首先确保 RISC-V 小核已经构建完成并生成了 `rtthread.bin` 和 `fip.bin`。Duo 256m 的小核是一个 RISC-V 的 core,对应的 bsp 是 `bsp/cvitek/c906_little`。具体构建的说明参考 [bsp cvitek 的 README.md 文件](../README.md)。
首先确保 RISC-V 小核已经构建完成并生成了 `rtthread.bin` 。Duo 256m 的小核是一个 RISC-V 的 core,对应的 bsp 是 `bsp/cvitek/c906_little`。具体构建的说明参考 [bsp cvitek 的 README.md 文件](../README.md)。构建过后会生成小核的内核镜像文件 `rtthread.bin`,在使用 `rttpkgtool` 制作ARM架构`fip.bin`固件时会使用到。
`fip.bin` 是一个打包后生成的 bin 文件,包含了 `fsbl`、`uboot` 以及小核的内核镜像文件 `rtthread.bin`。但注意 BSP `c906_little` 构建生成的 `fip.bin` 中的 `fsbl`、`uboot` 这些文件都是 RISC-V 的,所以我们并不能把 BSP `c906_little` 构建生成的 `fip.bin` 直接拿来用于引导启动 ARM 大核。我们这一步只是确保先基于 BSP `c906_little` 做出最新的小核版本 `rtthread.bin`。在下一步构建大核的过程中我们会重新打包更新并生成新的 `fip.bin`,而在重新打包过程中我们需要这个小核的 `rtthread.bin`。
这里我们主要关注如何构建 ARM 大核的 `rtthread.bin`。进入 `bsp/cvitek/cv18xx_aarch64` 目录下(记为当前工作目录 `$CWD`),依次执行以下步骤:
`rttpkgtool` 目录下有对应开发板和架构制作固件时所需使用的预编译文件,也可以在 `rttpkgtool` 目录下运行 `./prebuild.sh` 命令来重新制作预编译文件 参考[ rttpkgtool 的 README.md 文件](../rttpkgtool/README.md)。
### 2.3.1. 开发板选择
@@ -71,7 +69,7 @@ RT-Thread Kernel --->
[*] Enable RT-Thread Smart (microkernel on kernel/userland)
```
### 2.3.3. 编译大核固件 `boot.sd`
### 2.3.3. 编译固件
```shell
$ scons
@@ -80,16 +78,14 @@ $ scons
scons 会执行如下步骤的工作:
- 如果编译正确无误,在 `$CWD` 下会产生 `rtthread.bin` 文件。
- 通过运行 `combine.sh`,利用 BSP `cv18xx_aarch64` 下预先提供的、可以在 ARM 核上运行的 `fsbl`、`uboot` 等文件,加上基于 BSP `c906_little` 做出的 `rtthread.bin`,重新打包生成可供 ARM 大核解析和运行的 `fip.bin`。`fip.bin` 会生成在 `$CWD/../output/milkv-duo256m/` 下。
- 在 `$CWD/../output/milkv-duo256m/` 下生成 `boot.sd` 文件,`boot.sd` 中封装了 ARM 大核对应的 `rtthread.bin`。
如果您不关心小核的版本,BSP cv18xx_aarch64 也提供了一个 prebuild 的 `fip.bin`,在 `bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m` 下,直接烧录到 sd-card 中就可以使用。
- 通过运行 `../build.sh -a` ,利用 rttpkgtool 下提供的可以在 ARM 核上运行的 `fsbl`、`uboot` 等预编译文件,打包生成可供 ARM 大核解析和运行的 `fip.bin`。`fip.bin` 会生成在 `$CWD/../output/milkv-duo256m/` 下。
- 在 `$CWD/../output/milkv-duo256m/` 下生成 `fip.bin`和`boot.sd` 文件,`fip.bin`中封装了RISCv小核对应的`rtthread.bin`, `boot.sd` 中封装了 ARM 大核对应的 `Image` (与`rtthread.bin`等同)。
# 3. 运行
1. 将 SD 卡分为 2 个分区,第 1 个分区的分区格式为 `FAT32`,用于存放 `fip.bin` 和 `boot.sd` 文件,第 2 个分区可选,如果有可用于作为数据存储分区或者存放文件系统。
2. 将 `fip.bin` (自己打包生成的或者 prebuild 的) 和编译生成的 `boot.sd` 复制到 SD 卡第一个分区中。`fip.bin` 是小核启动固件,如果只关注 ARM 大核系统,后续只需更新大核的固件,即更新 `boot.sd` 文件即可。
2. 将 `fip.bin` 和 `boot.sd` 复制到 SD 卡第一个分区中。`fip.bin` 是小核启动固件,如果只关注 ARM 大核系统,后续只需更新大核的固件,即更新 `boot.sd` 文件即可。
3. Duo256M 的大核可以选择使用 RISC-V 或者 ARM,默认使用的是 RISC-V 核,所以这里需要通过短接物理引脚 35(Boot-Switch)和 GND 来切换到 ARM 核,如下图所示。具体参考 [Milk-V Duo 256M 的官方说明](https://milkv.io/zh/docs/duo/getting-started/duo256m#risc-v-%E4%B8%8E-arm-%E5%88%87%E6%8D%A2)。
@@ -97,7 +93,19 @@ scons 会执行如下步骤的工作:
4. 配置 **串口0** 参数: 115200 8N1 ,硬件和软件流控为关。
直接上电运行,uboot 会自动调用 bootcmd 解析 `boot.sd` 文件,然后加载 `rtthread.bin` 运行。
开发板上电运行后会先执行BL1 BootROM程序,这段程序是芯片厂烧写在芯片内部,它会加载我们制作的 Fip.bin 固件,也就是从BL2开始往后的代码,运行到BLCP代码段后加载小核的 `rtthread.bin` 运行,运行到 uboot 代码段后会自动调用 bootcmd 解析 `boot.sd` 文件,然后大核加载 `rtthread.bin`运行。
SOC双核启动流程如下:
```shell
BL1( BootROM )
↓
BL2( b12.bin ) → 加载BLCP → 初始化协处理器
| ↓
↓ BL3.2( empty.bin ) → 加载小核RT-Thread ( rtthread.bin )
BL3.1( OpenSBI )
↓
BL3.3( U-Boot ) → 加载大核RT-Thread ( Boot.sd )
```
## 3.1. RT-Thread 标准版的例子
-48
View File
@@ -1,48 +0,0 @@
#!/bin/bash
C906_LITTLE_BIN_PATH=../c906_little/rtthread.bin
GEN_FIP_PATH=../output/duo256m/
DEPENDS_FILE_PATH=./prebuild/duo256m
BLCP_IMG_RUNADDR=0x05200200
BLCP_PARAM_LOADADDR=0
NAND_INFO=00000000
NOR_INFO='FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
FIP_COMPRESS=lzma
CHIP_CONF_PATH=${DEPENDS_FILE_PATH}/chip_conf.bin
DDR_PARAM_TEST_PATH=${DEPENDS_FILE_PATH}/ddr_param.bin
BL2_PATH=${DEPENDS_FILE_PATH}/bl2.bin
BLCP_PATH=${DEPENDS_FILE_PATH}/empty.bin
MONITOR_PATH=${DEPENDS_FILE_PATH}/bl31.bin
LOADER_2ND_PATH=${DEPENDS_FILE_PATH}/u-boot-raw.bin
if [ -f "$C906_LITTLE_BIN_PATH" ]; then
echo "The file $C906_LITTLE_BIN_PATH exist."
BLCP_2ND_PATH=${C906_LITTLE_BIN_PATH}
else
echo "The file $C906_LITTLE_BIN_PATH does not exist. Execute scons to compile it."
exit
fi
mkdir -p $GEN_FIP_PATH
echo "Combining fip.bin..."
. ${DEPENDS_FILE_PATH}/blmacros.env && \
${DEPENDS_FILE_PATH}/fiptool.py -v genfip \
${GEN_FIP_PATH}/fip.bin \
--MONITOR_RUNADDR="${MONITOR_RUNADDR}" \
--BLCP_2ND_RUNADDR="${BLCP_2ND_RUNADDR}" \
--CHIP_CONF=${CHIP_CONF_PATH} \
--NOR_INFO=${NOR_INFO} \
--NAND_INFO=${NAND_INFO} \
--BL2=${BL2_PATH} \
--BLCP_IMG_RUNADDR=${BLCP_IMG_RUNADDR} \
--BLCP_PARAM_LOADADDR=${BLCP_PARAM_LOADADDR} \
--BLCP=${BLCP_PATH} \
--DDR_PARAM=${DDR_PARAM_TEST_PATH} \
--BLCP_2ND=${BLCP_2ND_PATH} \
--MONITOR=${MONITOR_PATH} \
--LOADER_2ND=${LOADER_2ND_PATH} \
--compress=${FIP_COMPRESS}
echo "Combining fip.bin done!"
@@ -1,56 +0,0 @@
/*
* U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs
*/
/dts-v1/;
/ {
description = "Various kernels, ramdisks and FDT blobs";
#address-cells = <2>;
images {
kernel-1 {
description = "cvitek kernel";
data = /incbin/("./Image.lzma");
type = "kernel";
arch = "arm64";
os = "linux";
compression = "lzma";
load = <0x0 0x80200000>;
entry = <0x0 0x80200000>;
hash-2 {
algo = "crc32";
};
};
/*FDT*/
fdt-sg2002_milkv_duo256m_arm_sd {
description = "cvitek device tree - sg2002_milkv_duo256m_arm_sd";
data = /incbin/("./sg2002_milkv_duo256m_arm_sd.dtb");
type = "flat_dt";
arch = "arm64";
compression = "none";
hash-1 {
algo = "sha256";
};
};
};
/*CFG*/
configurations {
config-sg2002_milkv_duo256m_arm_sd {
description = "boot cvitek system with board sg2002_milkv_duo256m_arm_sd";
kernel = "kernel-1";
fdt = "fdt-sg2002_milkv_duo256m_arm_sd";
};
};
};
-25
View File
@@ -1,25 +0,0 @@
#!/bin/bash
set -e
PROJECT_PATH=$1
IMAGE_NAME=$2
if [ -z "$PROJECT_PATH" ] || [ -z "$IMAGE_NAME" ]; then
echo "Usage: $0 <PROJECT_DIR> <IMAGE_NAME>"
exit 1
fi
ROOT_PATH=$PROJECT_PATH/..
source ${ROOT_PATH}/tools.sh
BOARD_TYPE=`get_board_type $PROJECT_PATH`
echo "start compress kernel..."
lzma -c -9 -f -k ${PROJECT_PATH}/${IMAGE_NAME} > ${PROJECT_PATH}/dtb/${BOARD_TYPE}/Image.lzma
mkdir -p ${ROOT_PATH}/output/${BOARD_TYPE}
mkimage -f ${PROJECT_PATH}/dtb/${BOARD_TYPE}/multi.its -r ${ROOT_PATH}/output/${BOARD_TYPE}/boot.sd
rm -rf ${PROJECT_PATH}/dtb/${BOARD_TYPE}/Image.lzma
Binary file not shown.
Binary file not shown.
@@ -1,2 +0,0 @@
MONITOR_RUNADDR=0x0000000080000000
BLCP_2ND_RUNADDR=0x000000008fe00000
Binary file not shown.
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -46,4 +46,4 @@ if PLATFORM == 'gcc':
DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n'
POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
POST_ACTION += OBJCPY + ' -O binary $TARGET Image \n' + SIZE + ' $TARGET \n'
POST_ACTION += './combine.sh && ./mksdimg.sh ' + os.getcwd() + ' Image \n'
POST_ACTION += 'cd .. && ./build.sh -a \n'