mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-10-02 14:23:19 +08:00
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:
+16
-2
@@ -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
|
||||
|
||||
|
||||
@@ -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 标准版的例子
|
||||
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
Binary file not shown.
@@ -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.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user