linuxOS_AP06/device/rockchip/common/scripts/mk-amp.sh
2025-06-03 12:28:32 +08:00

280 lines
6.5 KiB
Bash
Executable File

#!/bin/bash -e
RK_RTOS_BSP_DIR=$RK_SDK_DIR/rtos/bsp/rockchip
ITS_FILE="$RK_CHIP_DIR/$RK_AMP_FIT_ITS"
RK_SCRIPTS_DIR="${RK_SCRIPTS_DIR:-$(dirname "$(realpath "$0")")}"
usage_hook()
{
usage_oneline "amp" "build and pack amp system"
}
amp_get_value()
{
echo "$1" | grep -owP "$2\s*=\s*<([^>]+)>" | awk -F'<|>' '{print $2}'
}
amp_get_string()
{
echo "$1" | grep -owP "$2\s*=.*\"([^>]+)\"" | awk -F'"' '{print $2}'
}
amp_get_node()
{
echo "$1" | \
awk -v node="$2" \
'$0 ~ node " {" {
in_block = 1;
block = $0;
next;
}
in_block {
block = block "\n" $0;
if (/}/) {
count_open = gsub(/{/, "&", block);
count_close = gsub(/}/, "&", block);
if (count_open == count_close) {
in_block = 0;
print block;
block = "";
}
}
}'
}
amp_touch_export()
{
if [ -n "$2" ]; then
DST=$2
else
DST=$1
fi
[ -n "${!1}" ] && export "$DST"="${!1}" || true
}
build_hal()
{
local append=
check_config "$1" || return 0
message "=========================================="
message " Building CPU $2: HAL-->${!1}"
message "=========================================="
cd "$RK_RTOS_BSP_DIR/common/hal/project/"${!1}"/GCC"
[ ! -n "$CC" ] || append=$CC
(
amp_touch_export FIRMWARE_CPU_BASE
amp_touch_export DRAM_SIZE
amp_touch_export SRAM_BASE
amp_touch_export SRAM_SIZE
amp_touch_export CUR_CPU
make clean > /dev/null
rm -rf $3.elf $3.bin
make $append -j$(nproc) > ${RK_SDK_DIR}/hal.log 2>&1
)
cp TestDemo.elf $3.elf
mv TestDemo.bin $3.bin
ln -rsf $3.bin $RK_OUTDIR/$3.bin
finish_build build_hal $@
}
build_rtthread()
{
local append=
check_config "$1" || return 0
message "=========================================="
message " Building CPU $2: RT-Thread-->${!1}"
message " Config-->$4"
message "=========================================="
cd "$RK_RTOS_BSP_DIR/${!1}"
export RTT_ROOT=$RK_RTOS_BSP_DIR/../../
amp_touch_export FIRMWARE_CPU_BASE RTT_PRMEM_BASE
amp_touch_export DRAM_SIZE RTT_PRMEM_SIZE
amp_touch_export SRAM_BASE RTT_SRAM_BASE
amp_touch_export SRAM_SIZE RTT_SRAM_SIZE
amp_touch_export SHMEM_BASE RTT_SHMEM_BASE
amp_touch_export SHMEM_SIZE RTT_SHMEM_SIZE
amp_touch_export CC RTT_EXEC_PATH
ROOT_PART_OFFSET=$(rk_partition_start root)
ROOT_PART_SIZE=$(rk_partition_size root)
if [ -f "$4" ] ;then
scons --useconfig="$4"
else
warning "Warning: Config $4 not exit!\n"
warning "Default config(.config) will be used!\n"
fi
scons -c > /dev/null
rm -rf gcc_arm.ld Image/rtt$2.elf Image/rtt$2.bin
scons -j$(nproc) > ${RK_SDK_DIR}/rtt.log 2>&1
cp rtthread.elf Image/rtt$2.elf
mv rtthread.bin Image/rtt$2.bin
ln -rsf Image/rtt$2.bin $RK_OUTDIR/$3.bin
if [ -n "$RK_AMP_RTT_ROOT_DATA" ] && [ -n "$ROOT_PART_SIZE" ] ;then
RTT_ROOT_USERDAT=$RK_RTOS_BSP_DIR/$RK_AMP_RTT_TARGET/$RK_AMP_RTT_ROOT_DATA
ROOT_SECTOR_SIZE=$(grep -r "CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE" "$4" | cut -d '=' -f 2)
if [ -z $ROOT_SECTOR_SIZE ];then
ROOT_SECTOR_SIZE=4096
fi
./mkroot.sh root $RTT_ROOT_USERDAT $RK_CHIP_DIR/$RK_PARAMETER $ROOT_SECTOR_SIZE $RK_FIRMWARE_DIR/root.img
fi
finish_build build_rtthread $@
}
clean_hook()
{
[ "$RK_AMP" ] || return 0
if [ "$RK_AMP_RTT_TARGET" ]; then
cd "$RK_RTOS_BSP_DIR/$RK_AMP_RTT_TARGET"
scons -c >/dev/null || true
fi
if [ "$RK_AMP_HAL_TARGET" ]; then
cd "$RK_RTOS_BSP_DIR/common/hal/project/$RK_AMP_HAL_TARGET/GCC"
make clean >/dev/null || true
fi
rm -rf "$RK_FIRMWARE_DIR/amp.img"
}
build_images()
{
for item in $1
do
ITS_IMAGE=$(amp_get_node "$(cat $ITS_FILE)" $item)
# update all parameters
FIRMWARE_CPU_BASE=$(amp_get_value "$ITS_IMAGE" load)
DRAM_SIZE=$(amp_get_value "$ITS_IMAGE" size)
SRAM_BASE=$(amp_get_value "$ITS_IMAGE" srambase)
SRAM_SIZE=$(amp_get_value "$ITS_IMAGE" sramsize)
CUR_CPU=$(amp_get_value "$ITS_IMAGE" cpu)
CPU_BIN=$(amp_get_string "$ITS_IMAGE" data)
if (( $CUR_CPU > 0xff )); then
CUR_CPU=$((CUR_CPU >> 8))
fi
CUR_CPU=$(($CUR_CPU))
echo Image info: $item
for p in FIRMWARE_CPU_BASE DRAM_SIZE SRAM_BASE SRAM_SIZE SHMEM_BASE \
SHMEM_SIZE LINUX_RPMSG_BASE LINUX_RPMSG_SIZE CUR_CPU
do
echo $(env | grep -w $p && true)
done
SYS=$(amp_get_string "$ITS_IMAGE" sys)
CORE=$(amp_get_string "$ITS_IMAGE" core)
# In RTT: 'CC' means the directory where the GCC tools are located.
# In HAL: 'CC' means the directory and the prefix of GCC.
CC=$(amp_get_string "$ITS_IMAGE" cc)
[ ! -n "$CC" ] || CC="${RK_SDK_DIR}/${CC}"
SYS="${SYS}${CORE:+_$CORE}"
case $SYS in
hal_mcu)
build_hal RK_AMP_MCU_HAL_TARGET mcu \
"$(basename -s .bin $CPU_BIN)"
;;
hal|hal_ap)
build_hal RK_AMP_HAL_TARGET $CUR_CPU \
"$(basename -s .bin $CPU_BIN)"
;;
rtt_mcu)
build_rtthread RK_AMP_MCU_RTT_TARGET mcu \
"$(basename -s .bin $CPU_BIN)" \
"$(amp_get_string "$ITS_IMAGE" rtt_config)"
;;
rtt|rtt_ap)
build_rtthread RK_AMP_RTT_TARGET $CUR_CPU \
"$(basename -s .bin $CPU_BIN)" \
"$(amp_get_string "$ITS_IMAGE" rtt_config)" \
;;
*)
break;;
esac
done
}
BUILD_CMDS="amp"
build_hook()
{
local i
check_config RK_AMP || false
message "=========================================="
message " Start building AMP"
message "=========================================="
"$RK_SCRIPTS_DIR/check-amp.sh"
export CROSS_COMPILE=$(get_toolchain AMP "$RK_AMP_ARCH" "" none)
[ "$CROSS_COMPILE" ] || exit 1
if [ -f "$RK_CHIP_DIR/$RK_AMP_CFG" ]; then
set -a
source $RK_CHIP_DIR/$RK_AMP_CFG
set +a
fi
CORE_NUMBERS=$(grep -wcE "amp[0-9]* {|mcu {" $ITS_FILE)
echo "CORE_NUMBERS=$CORE_NUMBERS"
EXT_SHARE=$(amp_get_node "$(cat $ITS_FILE)" share)
if [ "$EXT_SHARE" ]; then
SHMEM_BASE=$(amp_get_value "$EXT_SHARE" "shm_base")
if [ "$SHMEM_BASE" ]; then
export SHMEM_BASE
export SHMEM_SIZE=$(amp_get_value "$EXT_SHARE" "shm_size")
AMP_PRIMARY_CORE=$(amp_get_value "$EXT_SHARE" primary)
[ ! $AMP_PRIMARY_CORE ] || export AMP_PRIMARY_CORE=$(($AMP_PRIMARY_CORE))
fi
LINUX_RPMSG_BASE=$(amp_get_value "$EXT_SHARE" "rpmsg_base")
if [ "$LINUX_RPMSG_BASE" ]; then
export LINUX_RPMSG_BASE=$LINUX_RPMSG_BASE
export LINUX_RPMSG_SIZE=$(amp_get_value "$EXT_SHARE" "rpmsg_size")
fi
fi
ITS_IMAGES=$(grep -wE "amp[0-9]* {|mcu {" $ITS_FILE | grep -oE "amp[0-9]*|mcu")
build_images "$ITS_IMAGES"
cd "$RK_OUTDIR"
ln -rsf $ITS_FILE amp.its
sed -i '/share {/,/}/d' amp.its
sed -i '/compile {/,/}/d' amp.its
$RK_RTOS_BSP_DIR/tools/mkimage -f amp.its -E -p 0xe00 $RK_FIRMWARE_DIR/amp.img
finish_build amp $@
}
source "${RK_BUILD_HELPER:-$(dirname "$(realpath "$0")")/build-helper}"
build_hook $@