luckfox-pico-sdk/sysdrv/source/mcu/project/build.sh
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

465 lines
12 KiB
Bash
Executable File

#!/bin/bash
set -eE
export LC_ALL=C
export LD_LIBRARY_PATH=
function unset_env_config_rk()
{
local tmp_file=`mktemp`
env | grep -oh "^RK_.*=" > $tmp_file || true
source $tmp_file 2>/dev/null || true
rm -f $tmp_file
}
unset_env_config_rk
################################################################################
# Global Variable Configure
################################################################################
_FDS="\\ \n"
cmd=`realpath $0`
COMMON_DIR=`dirname $cmd`
PROJECT_TOP_DIR=$(realpath $COMMON_DIR/)
SDK_ROOT_DIR=$(realpath $COMMON_DIR/..)
export RK_JOBS=$((`getconf _NPROCESSORS_ONLN` / 2 + 1 ))
export RK_BUILD_VERSION_TYPE=RELEASE
export SDK_ROOT_DIR=$SDK_ROOT_DIR
export RK_PROJECT_OUTPUT=$SDK_ROOT_DIR/output/out
export RK_PROJECT_TOP_DIR=$PROJECT_TOP_DIR
export RK_PROJECT_OUTPUT_IMAGE=$SDK_ROOT_DIR/output/image
export TARGET_PRODUCT_DIR=$SDK_ROOT_DIR/rt-thread/bsp/rockchip/rv1106-mcu/
################################################################################
# Plubic Configure
################################################################################
C_BLACK="\e[30;1m"
C_RED="\e[31;1m"
C_GREEN="\e[32;1m"
C_YELLOW="\e[33;1m"
C_BLUE="\e[34;1m"
C_PURPLE="\e[35;1m"
C_CYAN="\e[36;1m"
C_WHITE="\e[37;1m"
C_NORMAL="\033[0m"
function msg_info()
{
echo -e "${C_GREEN}[$(basename $0):info] $1${C_NORMAL}"
}
function msg_warn()
{
echo -e "${C_YELLOW}[$(basename $0):warn] $1${C_NORMAL}"
}
function msg_error()
{
echo -e "${C_RED}[$(basename $0):error] $1${C_NORMAL}"
}
function choose_default_board
{
RK_TARGET_BOARD_ARRAYtmp=( $(cd ${TARGET_PRODUCT_DIR}/board;find -type d -name "*evb*"| sort) )
RK_TARGET_BOARD_ARRAY=( "${RK_TARGET_BOARD_ARRAYtmp[@]}" $(cd ${TARGET_PRODUCT_DIR}/board;find -type d -name "*-*-*" | grep -v "evb" | sort));
if [ -f "${TARGET_PRODUCT_DIR}/rtconfig.h" ]; then
CONFIGED_BOARD_NAME=$(cd ${TARGET_PRODUCT_DIR};cat rtconfig.h | grep RT_BOARD_NAME)
CONFIGED_BOARD_NAME=${CONFIGED_BOARD_NAME:23:0-1}
if [ -d "${TARGET_PRODUCT_DIR}/board/${CONFIGED_BOARD_NAME}" ]; then
echo "find configed board ${CONFIGED_BOARD_NAME}"
cd ${TARGET_PRODUCT_DIR}
cp board/${CONFIGED_BOARD_NAME}/defconfig .config
scons --useconfig=board/${CONFIGED_BOARD_NAME}/defconfig
cd ${SDK_ROOT_DIR}
return
fi
echo "not find configed board ${CONFIGED_BOARD_NAME},use default"
else
touch "${TARGET_PRODUCT_DIR}/rtconfig.h"
fi
cd ${TARGET_PRODUCT_DIR}
cp board/${RK_TARGET_BOARD_ARRAY[0]}/defconfig .config
scons --useconfig=board/${RK_TARGET_BOARD_ARRAY[0]}/defconfig
cd ${SDK_ROOT_DIR}
}
err_handler() {
ret=$?
[ "$ret" -eq 0 ] && return
msg_error "Running ${FUNCNAME[1]} failed!"
msg_error "exit code $ret from line ${BASH_LINENO[0]}:"
msg_info " $BASH_COMMAND"
exit $ret
}
function finish_build(){
msg_info "Running ${FUNCNAME[1]} succeeded."
cd $PROJECT_TOP_DIR
}
function check_config(){
unset missing
for var in $@; do
eval [ \$$var ] && continue
missing="$missing $var"
done
[ -z "$missing" ] && return 0
msg_info "Skipping ${FUNCNAME[1]} for missing configs: $missing."
return 1
}
function choose_target_board()
{
echo
echo "You're building on Linux"
echo "Lunch menu...pick a combo:"
echo "naming rules:[board]-[sensor]-[lightsensor]"
echo "命名规则:[板级]-[传感器型号]-[光敏类型]"
echo ""
count=0;
for item in ${RK_TARGET_BOARD_ARRAY[@]}
do
item=${item:2};
name=${item};
board=${item%%-*};
item=${item#*-};
sensor=${item%%-*};
lsensor=${item##*-};
echo "-----------------------------------------------------"
echo -e "\e[32;1m$count.${name} \033[0m"
echo " Board(板级) :${board}"
echo " Sensor(传感器) :${sensor}"
echo "LightSensor(光敏) :${lsensor}"
echo "-----------------------------------------------------"
echo ""
count=$[ $count+1 ];
done
local INDEX
cd ${TARGET_PRODUCT_DIR}
INDEX=0
if [ -n "$boardconfig_lunch_name" ]; then
for item in "${RK_TARGET_BOARD_ARRAY[@]}"; do
if echo $item |grep $(basename $boardconfig_lunch_name); then
break
fi
INDEX=$(( INDEX + 1 ))
done
if [ $INDEX -gt $(( count - 1 )) ];then
msg_error "Not found $boardconfig_lunch_name"
exit 1
fi
else
read -p "Which would you like? [0]: " INDEX
INDEX=$((${INDEX:-0}))
fi
if echo $INDEX | grep -vq [^0-9]; then
echo "Lunching for ${RK_TARGET_BOARD_ARRAY[$INDEX]:2}"
cp board/${RK_TARGET_BOARD_ARRAY[$INDEX]}/defconfig .config
if [ ! -f "${TARGET_PRODUCT_DIR}/rtconfig.h" ]; then
touch "${TARGET_PRODUCT_DIR}/rtconfig.h"
fi
scons --useconfig=board/${RK_TARGET_BOARD_ARRAY[$INDEX]}/defconfig
else
echo "Lunching for Default boards ${RK_TARGET_BOARD_ARRAY[0]:2}"
cp board/${RK_TARGET_BOARD_ARRAY[0]}/defconfig .config
scons --useconfig=board/${RK_TARGET_BOARD_ARRAY[0]}/defconfig
fi
cd ${SDK_ROOT_DIR}
exit 0
}
function build_select_board()
{
RK_TARGET_BOARD_ARRAYtmp=( $(cd ${TARGET_PRODUCT_DIR}/board;find -type d -name "*evb*"| sort) )
RK_TARGET_BOARD_ARRAY=( "${RK_TARGET_BOARD_ARRAYtmp[@]}" $(cd ${TARGET_PRODUCT_DIR}/board;find -type d -name "*-*-*" | grep -v "evb" | sort));
RK_TARGET_BOARD_ARRAY_LEN=${#RK_TARGET_BOARD_ARRAY[@]}
if [ $RK_TARGET_BOARD_ARRAY_LEN -eq 0 ]; then
msg_error "No available Board Config"
return
fi
if [ "$1" = "lunch" ];then
choose_target_board
elif [ "$1" = "info" ];then
local number=0
for item in "${RK_TARGET_BOARD_ARRAY[@]}"; do
echo "$number $(basename ${item})"
number=$(( number + 1 ))
done
fi
}
function unset_board_config_all()
{
local tmp_file=`mktemp`
grep -oh "^export.*RK_.*=" `find cfg -name "BoardConfig*.mk"` > $tmp_file
source $tmp_file
rm -f $tmp_file
}
function usage()
{
echo "Usage: build.sh [OPTIONS]"
echo "Available options:"
echo "lunch -Select Board Configure"
echo "tool -build tool"
echo "all -build rtthread.bin "
echo "allsave -build all & firmware & save"
echo "clean -clean all"
echo "menuconfig -menuconfig config RTThread"
echo "firmware -pack all the image we need to boot up system"
echo "save -save images, patches, commands used to debug"
echo "check -check the environment of building"
echo "info -see the current board building information"
echo ""
echo "Default option is 'allsave'."
finish_build
exit 0
}
function build_get_sdk_version(){
if [ -f ${SDK_ROOT_DIR}/.repo/manifest.xml ]; then
local sdk_ver=""
sdk_ver=`grep "include name" ${SDK_ROOT_DIR}/.repo/manifest.xml | awk -F\" '{print $2}'`
sdk_ver=`realpath ${SDK_ROOT_DIR}/.repo/manifests/${sdk_ver}`
echo "Build SDK version: `basename ${sdk_ver}`"
GLOBAL_SDK_VERSION="`basename ${sdk_ver}`"
else
echo "Not found ${SDK_ROOT_DIR}/.repo/manifest.xml [ignore] !!!"
GLOBAL_SDK_VERSION="NONE"
fi
}
function build_info(){
build_get_sdk_version
echo "Current Building Information:"
echo "Target Misc config:"
msg_info "Build ==> $BOARD_INFO"
echo "`env |grep "^RK_" | grep -v "=$" | sort`"
}
function build_tool(){
finish_build
}
function build_check(){
common_product_build_tools="${PROJECT_TOP_DIR}/scripts/build-depend-tools.txt"
cat $common_product_build_tools 2>/dev/null | while read chk_item
do
chk_item=${chk_item###*}
if [ -z "$chk_item" ]; then
continue
fi
dst=${chk_item%%,*}
src=${chk_item##*,}
echo "**************************************"
if eval $dst &>/dev/null;then
echo "Check [OK]: $dst"
else
echo "Please install ${dst%% *} first"
echo " sudo apt-get install $src"
fi
done
}
function build_all() {
echo "============================================"
choose_default_board
cd ${SDK_ROOT_DIR}
scons -C ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu -j${RK_JOBS}
local _opt
_opt=""
if [ -d "$1" ];then
_opt=$1
fi
build_firmware $_opt
finish_build
}
function build_menuconfig() {
scons -C ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu --menuconfig
}
function build_clean(){
choose_default_board
param="${1:-all}"
msg_info "clean ${param}"
case $param in
all)
scons -C ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu -c
rm -rf ${RK_PROJECT_OUTPUT_IMAGE} ${RK_PROJECT_OUTPUT}
;;
*)
msg_warn "clean [$1] not support, ignore"
;;
esac
finish_build
}
function build_mkimg()
{
finish_build
}
function build_firmware(){
mkdir -p ${RK_PROJECT_OUTPUT_IMAGE}
if [ -d "$1" ];then
cp -rfa ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu/rtthread.bin $1
fi
cp -rfa ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu/rtthread.bin ${RK_PROJECT_OUTPUT_IMAGE}
finish_build
}
function __GET_REPO_INFO()
{
local repo_tool _date _stub_path _stub_patch_path
_date=$1
_stub_path=$2
_stub_patch_path=$3
repo_tool="$SDK_ROOT_DIR/.repo/repo/repo"
test -f $repo_tool || (echo "Not found repo... skip" && return 0)
if ! $repo_tool version &>/dev/null; then
repo_tool="repo"
if ! $repo_tool version &>/dev/null; then
msg_warn "Not found repo tool, ignore"
return 0
fi
fi
#Generate patches
$repo_tool forall -c "$PROJECT_TOP_DIR/scripts/gen_patches_body.sh" || return 0
#Copy stubs
$repo_tool manifest -r -o $SDK_ROOT_DIR/manifest_${_date}.xml || return 0
local tmp_merge=`mktemp` tmp_merge_new=`mktemp` tmp_path tmp_commit
find $_stub_patch_path -name git-merge-base.txt > $tmp_merge_new
while read line
do
tmp_path="${line##*PATCHES/}"
tmp_path=$(dirname $tmp_path)
tmp_commit=$(grep -w "^commit" $line |awk -F ' ' '{print $2}')
echo "$tmp_path $tmp_commit" >> $tmp_merge
done < $tmp_merge_new
rm -f $tmp_merge_new
mv $SDK_ROOT_DIR/manifest_${_date}.xml $_stub_path/
while IFS=' ' read line_project line_commit;do
chkcmd="sed -i \"/\<path=\\\"${line_project//\//\\\/}\\\"/s/revision=\\\"\w\{40\}\\\" /revision=\\\"$line_commit\\\" /\" $_stub_path/manifest_${_date}.xml"
eval $chkcmd
done < $tmp_merge
rm $tmp_merge
}
function build_save(){
IMAGE_PATH=$RK_PROJECT_OUTPUT_IMAGE
DATE=$(date +%Y%m%d.%H%M)
STUB_PATH=Image/"${BOARD_INFO}_$DATE"_RELEASE_TEST
STUB_PATH="$(echo $STUB_PATH | tr '[:lower:]' '[:upper:]')"
export STUB_PATH=$SDK_ROOT_DIR/$STUB_PATH
export STUB_PATCH_PATH=$STUB_PATH/PATCHES
STUB_DEBUG_FILES_PATH="$STUB_PATH/DEBUG_FILES"
mkdir -p $STUB_PATH $STUB_PATCH_PATH $STUB_DEBUG_FILES_PATH
mkdir -p $STUB_PATH/IMAGES/
test -d $IMAGE_PATH && \
(cp $IMAGE_PATH/* $STUB_PATH/IMAGES/ || msg_warn "Not found images... ignore")
test -d ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu/ && \
(cd ${SDK_ROOT_DIR}/rt-thread/bsp/rockchip/rv1106-mcu/ && \
tar cjf $STUB_DEBUG_FILES_PATH/rtthread.tar.bz2 rtthread.elf rtthread.map)
__GET_REPO_INFO $DATE $STUB_PATH $STUB_PATCH_PATH
#Save build command info
echo "BUILD-ID: $(hostname):$(whoami)" >> $STUB_PATH/build_info.txt
build_info >> $STUB_PATH/build_info.txt
echo "save to $STUB_PATH"
finish_build
}
function build_allsave(){
# rm -rf ${RK_PROJECT_OUTPUT_IMAGE} ${RK_PROJECT_OUTPUT}
build_all
build_save
finish_build
}
#=========================
# build targets
#=========================
trap 'err_handler' ERR
cd $PROJECT_TOP_DIR
# unset_board_config_all
if [ "$1" = "lunch" ];then
if [ -n "$2" ];then
boardconfig_lunch_name=$2
fi
build_select_board $1
exit 0
elif [ "$1" = "info" ];then
build_select_board $1
exit 0
fi
if echo $@|grep -wqE "help|-h"; then
if [ -n "$2" -a "$(type -t usage$2)" == function ]; then
echo "###Current Configure [ $2 ] Build Command###"
eval usage$2
else
usage
fi
exit 0
fi
BOARD_INFO=$(cd ${TARGET_PRODUCT_DIR};cat rtconfig.h | grep RT_BOARD_NAME)
BOARD_INFO=${BOARD_INFO:23:0-1}
build_check
num=$#
option=""
while [ $# -ne 0 ]
do
case $1 in
DEBUG) export RK_BUILD_VERSION_TYPE=DEBUG;;
all) option="build_all $2";break ;;
save) option=build_save ;;
allsave) option=build_allsave ;;
check) option=build_check ;;
clean) option="build_clean $2";break;;
firmware) option=build_firmware ;;
info) option=build_info ;;
tool) option=build_tool ;;
menuconfig) option=build_menuconfig ;;
*) option=usage ;;
esac
if [ $((num)) -gt 0 ]; then
shift
fi
done
eval "${option:-build_allsave}"