280 lines
6.5 KiB
Bash
Executable File
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 $@
|