2344 lines
70 KiB
Bash
Executable File
2344 lines
70 KiB
Bash
Executable File
function hmm() {
|
||
cat <<EOF
|
||
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
|
||
|
||
== before all ==
|
||
- lunch: lunch <product_name>-<build_variant>
|
||
|
||
== build project ==
|
||
- m: Make from the top of the tree.
|
||
- mm: Build package in the current directory, but not their dependencies.
|
||
- mma: Build package in the current directory, and their dependencies.
|
||
- mmb: Clean and build package in the current directory, but not their dependencies.
|
||
- p: Pack from the top of the tree.
|
||
- pd: Pack card0 from the top of the tree.
|
||
- mp: Make and pack from the top of the tree
|
||
- mpd: Make and pack card0 from the top of the tree
|
||
- mboot: Build boot0 and uboot, including uboot for nor.
|
||
- mboot0: Just build boot0.
|
||
- muboot: Build uboot, including uboot for nor.
|
||
- muboot_nor: Just build uboot for nor.
|
||
- mkernel: Build kernel.
|
||
- mlibc: Build c library.
|
||
|
||
== jump directory ==
|
||
- croot: Jump to the top of the tree.
|
||
- cboot: Jump to uboot.
|
||
- cboot0: Jump to boot0.
|
||
- cdts: Jump to device tree.
|
||
- cbin: Jump to uboot/boot0 bin directory.
|
||
- ckernel: Jump to kernel.
|
||
- cdevice: Jump to target.
|
||
- ccommon: Jump to platform common.
|
||
- cconfigs: Jump to configs of target.
|
||
- cout: Jump to out directory of target.
|
||
- ctarget: Jump to target of compile directory.
|
||
- crootfs: Jump to rootfs of compile directory.
|
||
- ctoolchain: Jump to toolchain directory.
|
||
- callwinnerpk: Jump to package allwinner directory.
|
||
- ctinatest: Jump to tinateset directory.
|
||
- godir: Go to the directory containing a file.
|
||
|
||
== grep file ==
|
||
- cgrep: Greps on all local C/C++ files.
|
||
|
||
Look at the source to view more functions. The complete list is:
|
||
EOF
|
||
T=$(gettop)
|
||
local A
|
||
A=""
|
||
for i in `cat $T/build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
|
||
A="$A $i"
|
||
done
|
||
echo $A
|
||
}
|
||
|
||
function gettop
|
||
{
|
||
local TOPFILE=build/envsetup.sh
|
||
if [ -n "$TINA_TOP" -a -f "$TINA_TOP/$TOPFILE" ] ; then
|
||
# The following circumlocution ensures we remove symlinks from TOP.
|
||
(\cd $TINA_TOP; pwd)
|
||
else
|
||
if [ -f $TOPFILE ] ; then
|
||
# The following circumlocution (repeated below as well) ensures
|
||
# that we record the true directory name and not one that is
|
||
# faked up with symlink names.
|
||
(pwd)
|
||
else
|
||
local here="$(pwd)"
|
||
while [ "${here}" != "/" ]; do
|
||
if [ -f "${here}/${TOPFILE}" ]; then
|
||
(\cd ${here}; pwd)
|
||
break
|
||
fi
|
||
here="$(dirname ${here})"
|
||
done
|
||
fi
|
||
fi
|
||
}
|
||
|
||
function add_lunch_combo()
|
||
{
|
||
local c
|
||
for c in ${LUNCH_MENU_CHOICES[@]} ; do
|
||
if [ "$1" = "$c" ] ; then
|
||
return
|
||
fi
|
||
done
|
||
LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $1)
|
||
}
|
||
|
||
function print_lunch_menu()
|
||
{
|
||
local uname=$(uname)
|
||
echo
|
||
echo "You're building on" $uname
|
||
echo
|
||
echo "Lunch menu... pick a combo:"
|
||
|
||
local i=1
|
||
local choice
|
||
for choice in ${LUNCH_MENU_CHOICES[@]}
|
||
do
|
||
echo " $i. $choice"
|
||
i=$(($i+1))
|
||
done
|
||
echo
|
||
}
|
||
|
||
# check to see if the supplied product is one we can build
|
||
function check_platform()
|
||
{
|
||
local T=$(gettop)
|
||
[ -d "$T/target/allwinner" ] || return 1
|
||
|
||
local v
|
||
for v in ${PLATFORM_CHOICES}
|
||
do
|
||
[ "$v" = "$1" ] && return 0
|
||
done
|
||
return 1
|
||
}
|
||
|
||
function check_product()
|
||
{
|
||
T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
TARGET_PRODUCT=$1 \
|
||
TARGET_BUILD_VARIANT= \
|
||
TARGET_BUILD_TYPE= \
|
||
TARGET_BUILD_APPS= \
|
||
get_build_var TARGET_DEVICE > /dev/null
|
||
}
|
||
|
||
# check to see if the supplied variant is valid
|
||
function check_variant()
|
||
{
|
||
for v in ${VARIANT_CHOICES}
|
||
do
|
||
[ "$v" = "$1" ] && return 0
|
||
done
|
||
return 1
|
||
}
|
||
|
||
# check whether parameters of platform is missing.
|
||
function check_parameters()
|
||
{
|
||
chip=${TARGET_CHIP}
|
||
if [ "x$chip" = "x" ]; then
|
||
echo "platform($TARGET_PLATFORM) not support"
|
||
echo "Please check whether device is missing!"
|
||
return 1
|
||
fi
|
||
return 0
|
||
}
|
||
|
||
# Get the exact value of a build variable.
|
||
function get_build_var()
|
||
{
|
||
T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
(\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build \
|
||
command make --no-print-directory -f build/config.mk dumpvar-$1)
|
||
}
|
||
|
||
function get_chip
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return -1
|
||
[ -z "${TARGET_PLATFORM}" ] && return -1
|
||
[ -z "${TARGET_KERNEL_VERSION}" ] && return -1
|
||
|
||
local longan_kernel_config=$T/target/allwinner/${TARGET_BOARD}/config-${TARGET_KERNEL_VERSION}
|
||
local tina_kernel_config=$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_BOARD##*-}/linux/config-${TARGET_KERNEL_VERSION}
|
||
local tina_new_kernel_config=$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_BOARD##*-}/linux-${TARGET_KERNEL_VERSION}/config-${TARGET_KERNEL_VERSION}
|
||
|
||
[ -e "${longan_kernel_config}" ] && awk -F'[_=]' '/CONFIG_ARCH_SUN.*P.*=y/{print tolower($3)}' "${longan_kernel_config}" | head -n 1 && return
|
||
[ -e "${tina_new_kernel_config}" ] && awk -F'[_=]' '/CONFIG_ARCH_SUN.*W.*=y/{print tolower($3"p1")}' "${tina_new_kernel_config}" | head -n 1 && return
|
||
[ -e "${tina_kernel_config}" ] && awk -F'[_=]' '/CONFIG_ARCH_SUN.*P.*=y/{print tolower($3)}' "${tina_kernel_config}" | head -n 1 && return
|
||
|
||
return -1
|
||
}
|
||
|
||
function get_uboot
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return -1
|
||
[ -z "${TARGET_PRODUCT}" ] && return -1
|
||
local f="$T/target/allwinner/${TARGET_PRODUCT/_/-}/Makefile"
|
||
[ -f "$f" ] || return -1
|
||
|
||
awk -F":=" '/UBOOT_PATCHVER/{print $2}' $f
|
||
}
|
||
|
||
function get_kernel
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return -1
|
||
[ -z "${TARGET_PRODUCT}" ] && return -1
|
||
local f="$T/target/allwinner/${TARGET_PRODUCT/_/-}/Makefile"
|
||
[ -f "$f" ] || return -1
|
||
|
||
awk -F":=" '/KERNEL_PATCHVER/{print $2}' $f
|
||
}
|
||
|
||
function get_kernel_defconfig
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return -1
|
||
[ -z "${TARGET_PLATFORM}" ] && return -1
|
||
[ -z "${TARGET_PLAN}" ] && return -1
|
||
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/BoardConfig.mk"
|
||
|
||
awk -F":=" '/LICHEE_KERN_DEFCONF:=/{print $2}' $f
|
||
}
|
||
|
||
function save_menuconfig
|
||
{
|
||
cp ${TINA_BUILD_TOP}/.config ${TINA_BUILD_TOP}/target/allwinner/${TARGET_BOARD}/defconfig
|
||
|
||
cp ${TINA_BUILD_TOP}/lichee/linux-4.9/.config ${TINA_BUILD_TOP}/lichee/linux-4.9/arch/arm/configs/${TARGET_KERNEL_DEFCONFIG}
|
||
}
|
||
|
||
function clean_backup_copy_file
|
||
{
|
||
echo "Clean dl..."
|
||
if [ -d $TINA_TOP/dl ];then
|
||
rm $TINA_TOP/dl -rf
|
||
fi
|
||
echo "Clean tools..."
|
||
if [ -d $TINA_TOP/tools ];then
|
||
rm $TINA_TOP/tools -rf
|
||
fi
|
||
echo "Clean prebuild..."
|
||
if [ -d $TINA_TOP/prebuilt ];then
|
||
rm $TINA_TOP/prebuilt -rf
|
||
fi
|
||
echo "Clean toolchain..."
|
||
if [ -d $TINA_TOP/toolchain ];then
|
||
rm $TINA_TOP/toolchain -rf
|
||
fi
|
||
echo "Clean xr806/tools..."
|
||
if [ -d $TINA_TOP/lichee/xr806/tools/ ];then
|
||
rm $TINA_TOP/lichee/xr806/tools/ -rf
|
||
fi
|
||
echo "Clean melis-v3.0/toolchain..."
|
||
if [ -d $TINA_TOP/lichee/melis-v3.0/toolchain/ ];then
|
||
rm $TINA_TOP/lichee/melis-v3.0/toolchain/ -rf
|
||
fi
|
||
echo "Clean melis-v3.0/tools..."
|
||
if [ -d $TINA_TOP/lichee/melis-v3.0/tools/ ];then
|
||
rm $TINA_TOP/lichee/melis-v3.0/tools/ -rf
|
||
fi
|
||
echo "Clean brandy-2.0/tools..."
|
||
if [ -d $TINA_TOP/lichee/brandy-2.0/tools/ ];then
|
||
rm $TINA_TOP/lichee/brandy-2.0/tools/ -rf
|
||
fi
|
||
echo "Clean sample..."
|
||
if [ -d $TINA_TOP/external/eyesee-mpp/middleware/sun8iw21/sample/ ];then
|
||
rm $TINA_TOP/external/eyesee-mpp/middleware/sun8iw21/sample/ -rf
|
||
fi
|
||
echo "Clean civetweb..."
|
||
if [ -d $TINA_TOP/external/eyesee-mpp/external/civetweb/ ];then
|
||
rm $TINA_TOP/external/eyesee-mpp/external/civetweb/ -rf
|
||
fi
|
||
echo "Clean package..."
|
||
if [ -d $TINA_TOP/package/ ];then
|
||
rm $TINA_TOP/package/ -rf
|
||
fi
|
||
sync
|
||
}
|
||
|
||
function get_arch
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return -1
|
||
[ -z "${TARGET_PRODUCT}" ] && return -1
|
||
local f="$T/target/allwinner/${TARGET_PRODUCT/_/-}/Makefile"
|
||
[ -f "$f" ] || return -1
|
||
|
||
awk -F":=" '/ARCH/{print $2}' $f
|
||
}
|
||
|
||
function parse_boardconfig()
|
||
{
|
||
local special_config="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/BoardConfig.mk"
|
||
local default_config="$T/device/config/chips/${TARGET_PLATFORM}/configs/default/BoardConfig.mk"
|
||
local default_config_nor="$T/device/config/chips/${TARGET_PLATFORM}/configs/default/BoardConfig_nor.mk"
|
||
local config_list=""
|
||
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/sys_config.fex"
|
||
local B="$( awk -F"=" '/^storage_type/{print $2}' $f | sed 's/^[ \t]*//g' )"
|
||
if [ x"$B" = x"3" ]; then
|
||
config_list=($default_config_nor $special_config)
|
||
else
|
||
config_list=($default_config $special_config)
|
||
fi
|
||
|
||
local fetch_list=""
|
||
local fpare_list=""
|
||
for f in ${config_list[@]}; do
|
||
if [ -f $f ]; then
|
||
fetch_list=(${fetch_list[@]} $f)
|
||
fpare_list="$fpare_list -f $f"
|
||
fi
|
||
done
|
||
|
||
local cfgkeylist=(
|
||
LICHEE_BUSSINESS
|
||
LICHEE_BRANDY_DEFCONF
|
||
LICHEE_BRANDY_SPL
|
||
LICHEE_BOARD
|
||
LICHEE_REDUNDANT_ENV_SIZE
|
||
)
|
||
|
||
local cfgkey=""
|
||
local cfgval=""
|
||
for cfgkey in ${cfgkeylist[@]}; do
|
||
#don't use current value in env
|
||
export $cfgkey=""
|
||
if [ -n "$fpare_list" ]; then
|
||
cfgval="$(echo '__unique:;@echo ${'"$cfgkey"'}' | command make -f - $fpare_list --no-print-directory __unique)"
|
||
else
|
||
cfgval=""
|
||
fi
|
||
export $cfgkey=$cfgval
|
||
done
|
||
|
||
}
|
||
|
||
function fix_after_lunch
|
||
{
|
||
local T="$(gettop)"
|
||
cd $T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}
|
||
[ -e linux-${TARGET_KERNEL_VERSION}/board.dts ] && {
|
||
rm -f board.dts
|
||
ln -s linux-${TARGET_KERNEL_VERSION}/board.dts board.dts
|
||
}
|
||
[ -L linux ] && rm -f linux
|
||
[ -e linux ] || {
|
||
ln -s linux-${TARGET_KERNEL_VERSION} linux
|
||
}
|
||
}
|
||
|
||
function lunch
|
||
{
|
||
# get last platfrom as default platform
|
||
local T="$(gettop)"
|
||
local last
|
||
if [ -f "$T/.config" ]; then
|
||
#last="$(awk -F[=_] '/CONFIG_TARGET_[a-z_0-9]*[^_]=y/{print $3 "_" $4; exit}' ${T}/.config)"
|
||
last="$(sed -n -r '/CONFIG_TARGET_[a-zA-Z_0-9]*[^_]=y/{s/CONFIG_TARGET_([a-zA-Z_0-9]*[^_])=y/\1/;p;q}' ${T}/.config)"
|
||
local last_chip="$(sed -n -r '/CONFIG_PLATFORM_[a-zA-Z_0-9].*[^_]=y/{s/CONFIG_PLATFORM_([a-zA-Z_0-9].*[^_])=y/\1/;p;q}' ${T}/.config)"
|
||
if [[ ${last_chip} =~ "-" ]]; then
|
||
last=${last/_/-}
|
||
fi
|
||
fi
|
||
|
||
# select platform
|
||
local select
|
||
if [ "$1" ] ; then
|
||
select=$1
|
||
else
|
||
print_lunch_menu
|
||
echo -n "Which would you like?"
|
||
[ -n "${last}" ] && echo -n " [Default ${last}]"
|
||
echo -n ": "
|
||
read select
|
||
fi
|
||
if [ -z "${select}" ]; then
|
||
select="${last}-tina"
|
||
elif (echo -n $select | grep -q -e "^[0-9][0-9]*$"); then
|
||
[ $select -le ${#LUNCH_MENU_CHOICES[@]} ] \
|
||
&& select=${LUNCH_MENU_CHOICES[$(($select-1))]}
|
||
elif (echo -n $select | grep -q -e "^[^\-][^\-]*-[^\-][^\-]"); then
|
||
select="$select"
|
||
else
|
||
echo
|
||
echo "Invalid lunch combo: $select" >&2
|
||
return 1
|
||
fi
|
||
|
||
# check platform
|
||
local platform=$(echo -n $select | sed -e "s/_.*$//")
|
||
check_platform ${platform}
|
||
if [ $? -ne 0 ]; then
|
||
echo
|
||
echo "** Don't have a platform spec for: '$platform'" >&2
|
||
echo "** Must be one of ${PLATFORM_CHOICES}" >&2
|
||
echo "** Do you have the right repo manifest?" >&2
|
||
platform=
|
||
fi
|
||
|
||
# check product
|
||
local product=$(echo -n $select | sed -e "s/-$VARIANT_CHOICES//")
|
||
check_product $product
|
||
if [ $? -ne 0 ]
|
||
then
|
||
echo
|
||
echo "** Don't have a product spec for: '$product'" >&2
|
||
echo "** Do you have the right repo manifest?" >&2
|
||
product=
|
||
fi
|
||
|
||
local variant
|
||
echo -n $select | grep "\-$VARIANT_CHOICES" > /dev/null
|
||
if [ $? = 0 ]; then
|
||
variant=$VARIANT_CHOICES
|
||
fi
|
||
check_variant $variant
|
||
if [ $? -ne 0 ]
|
||
then
|
||
echo
|
||
echo "** Invalid variant: '$variant'" >&2
|
||
echo "** Must be one of ${VARIANT_CHOICES}" >&2
|
||
variant=
|
||
fi
|
||
|
||
[ -z "$product" -o -z "$variant" -o -z "$platform" ] && return 1
|
||
|
||
export TARGET_PRODUCT=$product
|
||
export TARGET_PLATFORM=$platform
|
||
export TARGET_BOARD=$(get_build_var TARGET_DEVICE)
|
||
export TARGET_PLAN=${TARGET_BOARD#$TARGET_PLATFORM-}
|
||
export TARGET_BUILD_VARIANT=$variant
|
||
export TARGET_BUILD_TYPE=release
|
||
export TARGET_KERNEL_VERSION=$(get_kernel)
|
||
export TARGET_UBOOT=u-boot-$(get_uboot)
|
||
export TARGET_CHIP=$(get_chip)
|
||
export TINA_TARGET_ARCH=$(get_arch)
|
||
export TINA_BUILD_TOP=$(gettop)
|
||
|
||
export LICHEE_ARISC_PATH=${TINA_BUILD_TOP}/lichee/arisc
|
||
export LICHEE_CHIP_CONFIG_DIR=${TINA_BUILD_TOP}/device/config/chips/${TARGET_PLATFORM}
|
||
export LICHEE_BOARD_CONFIG_DIR=${LICHEE_CHIP_CONFIG_DIR}/configs/${TARGET_PLAN}
|
||
|
||
#for plat_config.sh
|
||
parse_boardconfig
|
||
export LICHEE_PACK_OUT_DIR=${TINA_BUILD_TOP}/out/${TARGET_BOARD}/image
|
||
export LICHEE_PLAT_OUT=${TINA_BUILD_TOP}/out/${TARGET_BOARD}
|
||
echo "============================================"
|
||
echo "TINA_BUILD_TOP=${TINA_BUILD_TOP}"
|
||
echo "TINA_TARGET_ARCH=${TINA_TARGET_ARCH}"
|
||
echo "TARGET_PRODUCT=${TARGET_PRODUCT}"
|
||
echo "TARGET_PLATFORM=${TARGET_PLATFORM}"
|
||
echo "TARGET_BOARD=${TARGET_BOARD}"
|
||
echo "TARGET_PLAN=${TARGET_PLAN}"
|
||
echo "TARGET_BUILD_VARIANT=${TARGET_BUILD_VARIANT}"
|
||
echo "TARGET_BUILD_TYPE=${TARGET_BUILD_TYPE}"
|
||
echo "TARGET_KERNEL_VERSION=${TARGET_KERNEL_VERSION}"
|
||
echo "TARGET_UBOOT=${TARGET_UBOOT}"
|
||
echo "TARGET_CHIP=${TARGET_CHIP}"
|
||
echo "============================================"
|
||
echo "Please [make menuconfig] "
|
||
|
||
export BUILD_ENV_SEQUENCE_NUMBER=10
|
||
# With this environment variable new GCC can apply colors to warnings/errors
|
||
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
||
|
||
rm -rf tmp
|
||
|
||
[ -e $T/target/allwinner/${TARGET_BOARD}/${TARGET_PRODUCT}-setup.sh ] \
|
||
&& source $T/target/allwinner/${TARGET_BOARD}/${TARGET_PRODUCT}-setup.sh
|
||
|
||
check_parameters
|
||
|
||
(fix_after_lunch)
|
||
|
||
# after lunch other platform, restart buildserver
|
||
clbuildserver
|
||
prepare_buildserver
|
||
|
||
|
||
#cp ${TARGET_BOARD}/
|
||
#cp
|
||
|
||
#echo ${TINA_BUILD_TOP}/target/allwinner/${TARGET_BOARD}/defconfig
|
||
#echo ${TINA_BUILD_TOP}/lichee/linux-4.9/arch/arm/configs/hichs_sl100_defconfig
|
||
#echo $(awk -F":=" '/LICHEE_KERN_DEFCONF:=/{print $2}' ${TINA_BUILD_TOP}/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/BoardConfig.mk)
|
||
|
||
#cp ${TINA_BUILD_TOP}/target/allwinner/${TARGET_BOARD}/defconfig
|
||
|
||
|
||
echo -n "Would you like to cover the .config?(yes|no)"
|
||
echo -n ": "
|
||
read select
|
||
echo "your choice: $select"
|
||
|
||
export TARGET_KERNEL_DEFCONFIG=$(get_kernel_defconfig)
|
||
|
||
if [ "$select" = "yes" ]; then
|
||
cp ${TINA_BUILD_TOP}/target/allwinner/${TARGET_BOARD}/defconfig ${TINA_BUILD_TOP}/.config
|
||
|
||
cp ${TINA_BUILD_TOP}/lichee/linux-4.9/arch/arm/configs/${TARGET_KERNEL_DEFCONFIG} ${TINA_BUILD_TOP}/lichee/linux-4.9/.config
|
||
fi
|
||
}
|
||
|
||
# Tab completion for lunch.
|
||
function _lunch
|
||
{
|
||
local cur prev
|
||
COMPREPLY=()
|
||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||
|
||
COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) )
|
||
return 0
|
||
}
|
||
|
||
# Tab completion for m.
|
||
function _m
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] && return
|
||
[ -f "$T/build/toplevel.mk" ] || return
|
||
|
||
local cur prev list
|
||
COMPREPLY=()
|
||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||
list="$(grep "[^\.].*config:" $T/build/toplevel.mk | awk -F: '{print $1}')"
|
||
COMPREPLY=( $(compgen -W "${list}" -- ${cur}) )
|
||
}
|
||
|
||
function envsetup
|
||
{
|
||
if [ "x$SHELL" != "x/bin/bash" ]; then
|
||
case `ps -o command -p $$` in
|
||
*bash*)
|
||
;;
|
||
*)
|
||
echo -n "WARNING: Only bash is supported, "
|
||
echo "use of other shell would lead to erroneous results"
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
# check top of SDK
|
||
if [ ! -f "$(pwd)/build/envsetup.sh" ]; then
|
||
echo "ERROR: Please source envsetup.sh in the root of SDK"
|
||
return -1
|
||
else
|
||
export TINA_TOP="$(pwd)"
|
||
fi
|
||
|
||
export TINA_VERBOSE="V=s"
|
||
# reset these variables.
|
||
# LUNCH_MENU_CHOICES will be built up again when the vendorsetup.sh are included
|
||
unset LUNCH_MENU_CHOICES
|
||
export LUNCH_MENU_CHOICES
|
||
export VARIANT_CHOICES=tina
|
||
export PLATFORM_CHOICES="$(ls $(gettop)/target/allwinner 2>/dev/null \
|
||
| grep common | sort | uniq | sed 's/-common//g')"
|
||
|
||
# Execute the contents of any vendorsetup.sh files we can find.
|
||
local vendors vendor awchips
|
||
if [ -d "$(pwd)/device/config/chips" ]; then
|
||
# only show platfroms with chip configuration.
|
||
awchips="$(ls $(pwd)/device/config/chips | awk '{print " -e "$1"-"}')"
|
||
if [ $? -eq 0 ]; then
|
||
verdors="$(find -L target -maxdepth 4 -name 'vendorsetup.sh' | grep ${awchips} 2>/dev/null | sort)"
|
||
else
|
||
verdors="$(find -L target -maxdepth 4 -name 'vendorsetup.sh' 2>/dev/null | sort)"
|
||
fi
|
||
else
|
||
verdors="$(find -L target -maxdepth 4 -name 'vendorsetup.sh' 2>/dev/null | sort)"
|
||
fi
|
||
for verdor in ${verdors}
|
||
do
|
||
source ${verdor}
|
||
done
|
||
echo "Setup env done!"
|
||
|
||
# completion
|
||
complete -F _lunch lunch
|
||
complete -F _m m
|
||
echo "Copy files now ...! Please wait."
|
||
# if [ ! -d $TINA_TOP/lichee/linux-4.9 ];then
|
||
# tar xzvf $TINA_TOP/lichee/lichee.tar.gz -C $TINA_TOP/lichee/
|
||
# sync
|
||
# fi
|
||
echo "Copy dl..."
|
||
if [ ! -d $TINA_TOP/dl ];then
|
||
cp /home/share/sl100/dl $TINA_TOP/ -rf
|
||
fi
|
||
echo "Copy tools..."
|
||
if [ ! -d $TINA_TOP/tools ];then
|
||
cp /home/share/sl100/tools $TINA_TOP/ -rf
|
||
fi
|
||
echo "Copy prebuild..."
|
||
if [ ! -d $TINA_TOP/prebuilt ];then
|
||
cp /home/share/sl100/prebuilt $TINA_TOP/ -rf
|
||
fi
|
||
echo "Copy toolchain..."
|
||
if [ ! -d $TINA_TOP/toolchain ];then
|
||
cp /home/share/sl100/toolchain $TINA_TOP/ -rf
|
||
fi
|
||
echo "Copy xr806/tools..."
|
||
if [ ! -d $TINA_TOP/lichee/xr806/tools/ ];then
|
||
cp /home/share/sl100/lichee/xr806/tools/ $TINA_TOP/lichee/xr806/ -rf
|
||
fi
|
||
echo "Copy melis-v3.0/toolchain..."
|
||
if [ ! -d $TINA_TOP/lichee/melis-v3.0/toolchain/ ];then
|
||
cp /home/share/sl100/lichee/melis-v3.0/toolchain/ $TINA_TOP/lichee/melis-v3.0/ -rf
|
||
fi
|
||
echo "Copy melis-v3.0/tools..."
|
||
if [ ! -d $TINA_TOP/lichee/melis-v3.0/tools/ ];then
|
||
cp /home/share/sl100/lichee/melis-v3.0/tools/ $TINA_TOP/lichee/melis-v3.0/ -rf
|
||
fi
|
||
echo "Copy brandy-2.0/tools..."
|
||
if [ ! -d $TINA_TOP/lichee/brandy-2.0/tools/ ];then
|
||
cp /home/share/sl100/lichee/brandy-2.0/tools/ $TINA_TOP/lichee/brandy-2.0/ -rf
|
||
fi
|
||
echo "Copy sample..."
|
||
if [ ! -d $TINA_TOP/external/eyesee-mpp/middleware/sun8iw21/sample/ ];then
|
||
cp /home/share/sl100/external/eyesee-mpp/middleware/sun8iw21/sample/ $TINA_TOP/external/eyesee-mpp/middleware/sun8iw21/ -rf
|
||
fi
|
||
echo "Copy civetweb..."
|
||
if [ ! -d $TINA_TOP/external/eyesee-mpp/external/civetweb/ ];then
|
||
cp /home/share/sl100/external/eyesee-mpp/external/civetweb/ $TINA_TOP/external/eyesee-mpp/external/ -rf
|
||
fi
|
||
echo "Copy package..."
|
||
if [ ! -d $TINA_TOP/package/ ];then
|
||
cp /home/share/sl100/package $TINA_TOP/ -rf
|
||
fi
|
||
|
||
sync
|
||
|
||
echo "Please run lunch next."
|
||
|
||
}
|
||
|
||
function m
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
(\cd $T && make $@)
|
||
}
|
||
|
||
function mm
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
$T/scripts/mm.sh $T $*
|
||
}
|
||
|
||
function mma
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
$T/scripts/mma.sh $T $*
|
||
}
|
||
|
||
function mmb
|
||
{
|
||
mm -B
|
||
}
|
||
|
||
function p
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
(\cd $T && pack $@)
|
||
}
|
||
|
||
function pd
|
||
{
|
||
p -d
|
||
}
|
||
|
||
function mp
|
||
{
|
||
m $@ && p
|
||
}
|
||
|
||
function mpd
|
||
{
|
||
m $@ && pd
|
||
}
|
||
|
||
# Build brandy(uboot,boot0,fes) if you want.
|
||
function build_boot()
|
||
{
|
||
local T=$(gettop)
|
||
local chip=${TARGET_CHIP}
|
||
local cmd=$1
|
||
local o_option=$2
|
||
local platform
|
||
local bin_dir
|
||
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/sys_config.fex"
|
||
local B="$( awk -F"=" '/^storage_type/{print $2}' $f | sed 's/^[ \t]*//g' )"
|
||
if [ x"$B" = x"3" ]; then
|
||
export LICHEE_FLASH="nor"
|
||
else
|
||
export LICHEE_FLASH="default"
|
||
fi
|
||
|
||
echo $TARGET_PRODUCT $TARGET_PLATFORM $TARGET_BOARD
|
||
if [ -z "$TARGET_BOARD" -o -z "$TARGET_PLATFORM" ]; then
|
||
echo "Please use lunch to select a target board before build boot."
|
||
return 1
|
||
fi
|
||
|
||
if [ "x$chip" = "x" ]; then
|
||
echo "platform($TARGET_PLATFORM) not support"
|
||
return 1
|
||
fi
|
||
|
||
platform=${chip}
|
||
|
||
bin_dir="device/config/chips/${TARGET_PLATFORM}/bin"
|
||
if [ "${TARGET_UBOOT}" = "u-boot-2018" ]; then
|
||
\cd $T/lichee/brandy-2.0/
|
||
[ x"$o_option" = x"uboot" -a -f "u-boot-2018/configs/${chip}_tina_defconfig" ] && {
|
||
platform=${chip}_tina
|
||
}
|
||
[ x"$o_option" = x"uboot" -a -f "u-boot-2018/configs/${TARGET_BOARD}_defconfig" ] && {
|
||
platform=${TARGET_BOARD}
|
||
bin_dir="device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_BOARD#*-}/bin"
|
||
mkdir -p $T/${bin_dir}
|
||
}
|
||
[ x"$o_option" = x"uboot" -a -f "$T/device/config/chips/${TARGET_PLATFORM}/configs/default/BoardConfig.mk" ] && {
|
||
if [ x"${LICHEE_BRANDY_DEFCONF}" != "x" ]; then
|
||
platform=${LICHEE_BRANDY_DEFCONF%%_def*}
|
||
fi
|
||
}
|
||
[ x"$o_option" = x"uboot" -a -f "$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/BoardConfig.mk" ] && {
|
||
if [ x"${LICHEE_BRANDY_DEFCONF}" != "x" ]; then
|
||
platform=${LICHEE_BRANDY_DEFCONF%%_def*}
|
||
fi
|
||
}
|
||
if [ x"$o_option" == "xboot0" ]; then
|
||
if [ x"${LICHEE_BRANDY_SPL}" != x ]; then
|
||
o_option=${LICHEE_BRANDY_SPL}
|
||
else
|
||
o_option=spl
|
||
fi
|
||
|
||
if [ ! -f "spl-pub/Makefile" ]; then
|
||
o_option=spl
|
||
fi
|
||
|
||
if [ ! -f "spl/Makefile" ]; then
|
||
o_option=spl-pub
|
||
fi
|
||
fi
|
||
else
|
||
\cd $T/lichee/brandy/
|
||
fi
|
||
echo "build_boot platform:$platform o_option:$o_option"
|
||
if [ x"$o_option" != "x" ] && [ "${TARGET_UBOOT}" = "u-boot-2018" ]; then
|
||
TARGET_BIN_DIR=${bin_dir} ./build.sh -p $platform -o $o_option -b ${TARGET_PLATFORM}
|
||
elif [ x"$o_option" != "x" ]; then
|
||
TARGET_BIN_DIR=${bin_dir} ./build.sh -p $platform -o $o_option
|
||
else
|
||
TARGET_BIN_DIR=${bin_dir} ./build.sh -p $platform
|
||
fi
|
||
if [ $? -ne 0 ]; then
|
||
echo "$cmd stop for build error in brandy, Please check!"
|
||
\cd - 1>/dev/null
|
||
return 1
|
||
fi
|
||
\cd - 1>/dev/null
|
||
echo "$cmd success!"
|
||
|
||
return 0
|
||
}
|
||
|
||
function mkarisc
|
||
{
|
||
echo "=== Start build scp.bin ==="
|
||
|
||
local arisc_cfg;
|
||
|
||
if [ x"mr813" != x${TARGET_PLATFORM} -a x"r818" != x${TARGET_PLATFORM} ];
|
||
then echo "Platform ${TARGET_PLATFORM} Skip marisc." && return 0
|
||
fi
|
||
|
||
if [ -f ${LICHEE_BOARD_CONFIG_DIR}/../default/arisc.config ]
|
||
then
|
||
arisc_cfg=${LICHEE_BOARD_CONFIG_DIR}/../default/arisc.config
|
||
fi
|
||
|
||
if [ -f ${LICHEE_CHIP_CONFIG_DIR}/tools/arisc_config_parse.sh ]
|
||
then
|
||
${LICHEE_CHIP_CONFIG_DIR}/tools/arisc_config_parse.sh
|
||
fi
|
||
|
||
if [ -f ${LICHEE_BOARD_CONFIG_DIR}/arisc.config ]
|
||
then
|
||
arisc_cfg=${LICHEE_BOARD_CONFIG_DIR}/arisc.config
|
||
fi
|
||
|
||
if [ ! -e ${arisc_cfg} ]
|
||
then
|
||
return 1;
|
||
fi
|
||
|
||
if [ ! -d ${LICHEE_ARISC_PATH} ];
|
||
then
|
||
echo "arisc project lost, use repo sync to get it"
|
||
return 1;
|
||
fi
|
||
|
||
cp ${arisc_cfg} ${LICHEE_ARISC_PATH}/.config
|
||
command make -C ${LICHEE_ARISC_PATH}
|
||
|
||
[ $? -ne 0 ] && print_red "Error to build scp.bin" && return 1
|
||
|
||
[ ! -e ${LICHEE_CHIP_CONFIG_DIR}/bin ] && print_red "Error Not exist bin dir." && return 1
|
||
echo "cp ${LICHEE_ARISC_PATH}/ar100s/scp.bin to ${LICHEE_CHIP_CONFIG_DIR}/bin/scp.bin"
|
||
cp ${LICHEE_ARISC_PATH}/ar100s/scp.bin ${LICHEE_CHIP_CONFIG_DIR}/bin/scp.bin
|
||
[ $? -ne 0 ] && print_red 'Error to cp scp.bin' && return 1
|
||
|
||
echo "make arisc success!"
|
||
return 0
|
||
}
|
||
|
||
function muboot
|
||
{
|
||
(build_boot muboot uboot)
|
||
}
|
||
|
||
function mboot
|
||
{
|
||
(build_boot muboot uboot)
|
||
if [ $? -ne 0 ]; then
|
||
return 1
|
||
fi
|
||
(build_boot mboot0 boot0)
|
||
}
|
||
|
||
function mboot0
|
||
{
|
||
(build_boot mboot0 boot0)
|
||
}
|
||
|
||
function muboot_nor
|
||
{
|
||
(build_boot muboot_nor uboot_nor)
|
||
}
|
||
|
||
function mkernel
|
||
{
|
||
m target/allwinner/install $@
|
||
}
|
||
|
||
function mlibc() {
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
$T/scripts/mlibc.sh $T $*
|
||
}
|
||
|
||
function make_img_md5(){
|
||
#$1: target image
|
||
md5sum $1 | awk '{print $1}' > $1.md5
|
||
}
|
||
|
||
function ota_save_files()
|
||
{
|
||
[ $# -lt 1 ] && echo "usage:ota_save_files file_dir" && return 1
|
||
local target_dir=$1
|
||
echo target_dir:"$target_dir"
|
||
[ ! -d "$target_dir" ] && echo target_dir:"$target_dir" not exit!! && return 1
|
||
|
||
local T=$(gettop)
|
||
local BIN_DIR=$T/out/${TARGET_BOARD}
|
||
local boot_img="$(readlink -f "$BIN_DIR"/image/boot.fex)"
|
||
local rootfs_img="$(readlink -f "$BIN_DIR"/image/rootfs.fex)"
|
||
local recovery_img="$(readlink -f "$BIN_DIR"/image/recovery.fex)"
|
||
#uboot and boot0
|
||
local boot_package_img="$(readlink -f "$BIN_DIR"/image/boot_package.fex)"
|
||
local boot0_nand_img="$(readlink -f "$BIN_DIR"/image/boot0_nand.fex)"
|
||
local boot0_sdcard_img="$(readlink -f "$BIN_DIR"/image/boot0_sdcard.fex)"
|
||
|
||
rm -f "$target_dir"/*.img "$target_dir"/*.md5 "$target_dir"/*.signature
|
||
[ -f "$boot_img" ] \
|
||
&& cp "$boot_img" "$target_dir"/boot.img \
|
||
&& make_img_md5 "$target_dir"/boot.img
|
||
[ -f "$rootfs_img" ] \
|
||
&& cp "$rootfs_img" "$target_dir"/rootfs.img \
|
||
&& make_img_md5 "$target_dir"/rootfs.img
|
||
[ -f "$recovery_img" ] \
|
||
&& cp "$recovery_img" "$target_dir"/recovery.img \
|
||
&& make_img_md5 "$target_dir"/recovery.img
|
||
[ -f "$boot_package_img" ] \
|
||
&& cp "$boot_package_img" "$target_dir"/boot_package.img \
|
||
&& make_img_md5 "$target_dir"/boot_package.img
|
||
[ -f "$boot0_nand_img" ] \
|
||
&& cp "$boot0_nand_img" "$target_dir"/boot0_nand.img \
|
||
&& make_img_md5 "$target_dir"/boot0_nand.img
|
||
[ -f "$boot0_sdcard_img" ] \
|
||
&& cp "$boot0_sdcard_img" "$target_dir"/boot0_sdcard.img \
|
||
&& make_img_md5 "$target_dir"/boot0_sdcard.img
|
||
ls -l "$target_dir"
|
||
}
|
||
|
||
function make_ota_image(){
|
||
local T=$(gettop)
|
||
local chip=sunxi
|
||
local need_usr=0
|
||
local make_ota_fail=0
|
||
[ x$CHIP = x"sun5i" ] && chip=sun5i
|
||
local BIN_DIR=$T/out/${TARGET_BOARD}
|
||
local OTA_DIR=$BIN_DIR/ota
|
||
mkdir -p $OTA_DIR
|
||
print_red "build ota package"
|
||
grep "CONFIG_SUNXI_SMALL_STORAGE_OTA=y" $T/target/allwinner/${TARGET_BOARD}/defconfig \
|
||
&& need_usr=1
|
||
#target image
|
||
target_list="$BIN_DIR/boot.img $BIN_DIR/rootfs.img $BIN_DIR/usr.img"
|
||
if [ $need_usr -eq 0 ];then
|
||
target_list="$BIN_DIR/boot.img $BIN_DIR/rootfs.img"
|
||
fi
|
||
[ -n "$1" ] && [ x"$1" = x"--force" ] && rm -rf $target_list
|
||
for i in $target_list; do
|
||
if [ ! -f "$i" ]; then
|
||
img=${i##*/}
|
||
print_red "$i is not exsit! rebuild the image."
|
||
make -j16
|
||
if [ $? -ne 0 ]
|
||
then
|
||
print_red "make $img file! make_ota_image fail!"
|
||
make_ota_fail=1
|
||
fi
|
||
break
|
||
fi
|
||
done
|
||
|
||
rm -rf $OTA_DIR/target_sys
|
||
mkdir -p $OTA_DIR/target_sys
|
||
dd if=$BIN_DIR/boot.img of=$OTA_DIR/target_sys/boot.img
|
||
make_img_md5 $OTA_DIR/target_sys/boot.img
|
||
dd if=$BIN_DIR/rootfs.img of=$OTA_DIR/target_sys/rootfs.img
|
||
make_img_md5 $OTA_DIR/target_sys/rootfs.img
|
||
|
||
local storage_type_nor=0
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/sys_config.fex"
|
||
local B="$( awk -F"=" '/^storage_type/{print $2}' $f | sed 's/^[ \t]*//g' )"
|
||
case $B in
|
||
*-1)
|
||
print_red "###storage type error###"
|
||
print_red "###cannot choose boot0, please config storage_type in sys_config ###"
|
||
;;
|
||
*0 | *5)
|
||
local boot0_img=boot0_nand.fex
|
||
;;
|
||
*1 | *2 | *4)
|
||
local boot0_img=boot0_sdcard.fex
|
||
;;
|
||
3)
|
||
local boot0_img=boot0_spinor.fex
|
||
storage_type_nor=1
|
||
;;
|
||
*)
|
||
print_red "###storage type error###"
|
||
print_red "###cannot choose boot0, please config storage_type in sys_config ###"
|
||
;;
|
||
esac
|
||
rm -rf $OTA_DIR/boot0_sys
|
||
[ -n "$boot0_img" ] && {
|
||
mkdir -p $OTA_DIR/boot0_sys
|
||
dd if=$BIN_DIR/image/$boot0_img of=$OTA_DIR/boot0_sys/boot0.img
|
||
make_img_md5 $OTA_DIR/boot0_sys/boot0.img
|
||
}
|
||
local U="$(get_uboot)"
|
||
if [[ "$U" =~ "2011" ]]; then
|
||
local uboot_img=u-boot.fex
|
||
else
|
||
if [ x"$storage_type_nor" = x"1" ]; then
|
||
local uboot_img=boot_package_nor.fex
|
||
else
|
||
local uboot_img=boot_package.fex
|
||
fi
|
||
fi
|
||
rm -rf $OTA_DIR/uboot_sys
|
||
mkdir -p $OTA_DIR/uboot_sys
|
||
dd if=$BIN_DIR/image/$uboot_img of=$OTA_DIR/uboot_sys/uboot.img
|
||
make_img_md5 $OTA_DIR/uboot_sys/uboot.img
|
||
|
||
if [ $need_usr -eq 1 ];then
|
||
rm -rf $OTA_DIR/usr_sys
|
||
mkdir -p $OTA_DIR/usr_sys
|
||
dd if=$BIN_DIR/usr.img of=$OTA_DIR/usr_sys/usr.img
|
||
make_img_md5 $OTA_DIR/usr_sys/usr.img
|
||
fi
|
||
|
||
grep -v -e CONFIG_TARGET_ROOTFS_INITRAMFS \
|
||
$T/target/allwinner/${TARGET_BOARD}/defconfig_ota > .config_ota
|
||
echo 'CONFIG_TARGET_ROOTFS_INITRAMFS=y' >> .config_ota
|
||
echo 'CONFIG_TARGET_AW_OTA_INITRAMFS=y' >> .config_ota
|
||
echo 'CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ=y' >> .config_ota
|
||
|
||
make ${TINA_VERBOSE} -j16 TARGET_CONFIG=.config_ota
|
||
if [ $? -ne 0 ]
|
||
then
|
||
print_red "make_ota_image fail!"
|
||
make_ota_fail=1
|
||
fi
|
||
|
||
rm -rf $OTA_DIR/ramdisk_sys
|
||
mkdir -p $OTA_DIR/ramdisk_sys
|
||
|
||
local recovery_img_source="boot_initramfs.img"
|
||
local recovery_img_dest="boot_initramfs.img"
|
||
if grep -q CONFIG_SUNXI_BOOT_IMAGE_NAME_SUFFIX_RECOVERY=y .config_ota; then
|
||
echo "have CONFIG_SUNXI_BOOT_IMAGE_NAME_SUFFIX_RECOVERY"
|
||
echo "use boot_initramfs_recovery.img"
|
||
recovery_img_source="boot_initramfs_recovery.img"
|
||
fi
|
||
|
||
dd if=$BIN_DIR/$recovery_img_source of=$OTA_DIR/ramdisk_sys/$recovery_img_dest
|
||
make_img_md5 $OTA_DIR/ramdisk_sys/$recovery_img_dest
|
||
|
||
###########################################################
|
||
rm -rf $OTA_DIR/package_sys
|
||
mkdir -p $OTA_DIR/package_sys
|
||
|
||
dd if=$OTA_DIR/ramdisk_sys/$recovery_img_dest of=$OTA_DIR/package_sys/recovery.img
|
||
make_img_md5 $OTA_DIR/package_sys/recovery.img
|
||
dd if=$OTA_DIR/target_sys/boot.img of=$OTA_DIR/package_sys/boot.img
|
||
make_img_md5 $OTA_DIR/package_sys/boot.img
|
||
dd if=$OTA_DIR/target_sys/rootfs.img of=$OTA_DIR/package_sys/rootfs.img
|
||
make_img_md5 $OTA_DIR/package_sys/rootfs.img
|
||
|
||
dd if=$OTA_DIR/boot0_sys/boot0.img of=$OTA_DIR/package_sys/boot0.img
|
||
make_img_md5 $OTA_DIR/package_sys/boot0.img
|
||
dd if=$OTA_DIR/uboot_sys/uboot.img of=$OTA_DIR/package_sys/uboot.img
|
||
make_img_md5 $OTA_DIR/package_sys/uboot.img
|
||
if [ -f $BIN_DIR/image/bootlogo.fex ]; then
|
||
dd if=$BIN_DIR/image/bootlogo.fex of=$OTA_DIR/package_sys/bootlogo.img
|
||
make_img_md5 $OTA_DIR/package_sys/bootlogo.img
|
||
fi
|
||
|
||
ota_tar="ota"$1".tar"
|
||
echo "#####${ota_tar}#####"
|
||
cd $OTA_DIR/package_sys/ && \
|
||
tar -rvf ${ota_tar} boot.img && \
|
||
tar -rvf ${ota_tar} boot.img.md5 && \
|
||
tar -rvf ${ota_tar} rootfs.img && \
|
||
tar -rvf ${ota_tar} rootfs.img.md5 && \
|
||
tar -rvf ${ota_tar} recovery.img && \
|
||
tar -rvf ${ota_tar} recovery.img.md5 && \
|
||
tar -rvf ${ota_tar} boot0.img && \
|
||
tar -rvf ${ota_tar} boot0.img.md5 && \
|
||
tar -rvf ${ota_tar} uboot.img && \
|
||
tar -rvf ${ota_tar} uboot.img.md5 && \
|
||
if [ -f bootlogo.img ]; then
|
||
tar -rvf ${ota_tar} bootlogo.img
|
||
tar -rvf ${ota_tar} bootlogo.img.md5
|
||
fi
|
||
\cd $T
|
||
##############################################################
|
||
|
||
if [ $need_usr -eq 1 ];then
|
||
\cd $OTA_DIR && \
|
||
tar -zcvf target_sys.tar.gz target_sys && \
|
||
tar -zcvf ramdisk_sys.tar.gz ramdisk_sys && \
|
||
tar -zcvf boot0_sys.tar.gz boot0_sys && \
|
||
tar -zcvf uboot_sys.tar.gz uboot_sys && \
|
||
tar -zcvf usr_sys.tar.gz usr_sys && \
|
||
\cd $T
|
||
else
|
||
\cd $OTA_DIR && \
|
||
tar -zcvf target_sys.tar.gz target_sys && \
|
||
tar -zcvf ramdisk_sys.tar.gz ramdisk_sys && \
|
||
tar -zcvf boot0_sys.tar.gz boot0_sys && \
|
||
tar -zcvf uboot_sys.tar.gz uboot_sys && \
|
||
\cd $T
|
||
fi
|
||
|
||
if [ $make_ota_fail -ne 0 ];then
|
||
print_red "build ota package fail!"
|
||
else
|
||
print_green "build ota package finish!"
|
||
fi
|
||
}
|
||
|
||
function make_ota_package_for_dual_app
|
||
{
|
||
local T=$(gettop)
|
||
local BIN_DIR=$T/out/${TARGET_BOARD}
|
||
local OTA_DIR=$BIN_DIR/ota_dual_app
|
||
local make_fail=0
|
||
local ota_package=app_ota.tar
|
||
mkdir -p "$OTA_DIR"
|
||
\cd "$OTA_DIR"
|
||
rm -f $ota_package $ota_package.md5
|
||
target_list="$BIN_DIR/image/app.fex"
|
||
for i in $target_list; do
|
||
img=${i##*/}
|
||
if [ ! -f "$i" ]; then
|
||
print_red "$i not exsit!"
|
||
make_fail=1
|
||
break
|
||
fi
|
||
dd if="$i" of="$img" bs=512 conv=sync
|
||
make_img_md5 "$img"
|
||
tar -rvf "$ota_package" "$img"
|
||
tar -rvf "$ota_package" "$img.md5"
|
||
done
|
||
if [ x$make_fail = x"1" ]; then
|
||
print_red "make fail"
|
||
rm -f $ota_package
|
||
else
|
||
make_img_md5 "$ota_package"
|
||
print_red "$OTA_DIR/$ota_package"
|
||
fi
|
||
\cd - > /dev/null
|
||
}
|
||
|
||
function swupdate_init_key() {
|
||
T=$(gettop)
|
||
local password="swupdate"
|
||
local SWUPDATE_CONFIG_DIR="$T/target/allwinner/${TARGET_BOARD}/swupdate"
|
||
local BUSYBOX_BASEFILE_DIR="$T/target/allwinner/${TARGET_BOARD}/busybox-init-base-files"
|
||
local PROCD_BASEFILE_DIR="$T/target/allwinner/${TARGET_BOARD}/base-files"
|
||
local KEY_DIR="etc"
|
||
mkdir -p $SWUPDATE_CONFIG_DIR
|
||
\cd $SWUPDATE_CONFIG_DIR
|
||
echo "-------------------- init password --------------------"
|
||
if [ "$1" ] ; then
|
||
password="$1"
|
||
fi
|
||
echo "$password" > swupdate_priv.password
|
||
echo "-------------------- init priv key --------------------"
|
||
openssl genrsa -aes256 -passout file:swupdate_priv.password -out swupdate_priv.pem
|
||
echo "-------------------- init public key --------------------"
|
||
openssl rsa -in swupdate_priv.pem -passin file:swupdate_priv.password -out swupdate_public.pem -outform PEM -pubout
|
||
mkdir -p "$PROCD_BASEFILE_DIR/$KEY_DIR"
|
||
cp swupdate_public.pem "$PROCD_BASEFILE_DIR/$KEY_DIR"
|
||
mkdir -p "$BUSYBOX_BASEFILE_DIR/$KEY_DIR"
|
||
cp swupdate_public.pem "$BUSYBOX_BASEFILE_DIR/$KEY_DIR"
|
||
echo "-------------------- out files --------------------"
|
||
echo "password:$(pwd)/swupdate_priv.password"
|
||
echo "private key:$(pwd)/swupdate_priv.pem"
|
||
echo "public key:$(pwd)/swupdate_public.pem"
|
||
echo "public key:$PROCD_BASEFILE_DIR/$KEY_DIR/swupdate_public.pem"
|
||
echo "public key:$BUSYBOX_BASEFILE_DIR/$KEY_DIR/swupdate_public.pem"
|
||
|
||
\cd -
|
||
}
|
||
|
||
function make_recovery_img() {
|
||
|
||
T=$(gettop)
|
||
\cd $T
|
||
local recovery_img_config="$T/target/allwinner/${TARGET_BOARD}/defconfig_ota"
|
||
|
||
#do some check
|
||
if grep -q CONFIG_SUNXI_BOOT_IMAGE_NAME_SUFFIX_RECOVERY=y "$recovery_img_config"; then
|
||
echo "have CONFIG_SUNXI_BOOT_IMAGE_NAME_SUFFIX_RECOVERY"
|
||
else
|
||
print_red "warning: no CONFIG_SUNXI_BOOT_IMAGE_NAME_SUFFIX_RECOVERY"
|
||
echo -e "make ota_menuconfig"
|
||
echo -e "\t---> Target Images"
|
||
echo -e "\t\t---> [*] customize image name"
|
||
echo -e "\t\t\t---> Boot Image(kernel) name suffix (boot_recovery.img/boot_initramfs_recovery.img)"
|
||
fi
|
||
if grep -q CONFIG_TARGET_ROOTFS_INITRAMFS=y "$recovery_img_config"; then
|
||
echo "have CONFIG_TARGET_ROOTFS_INITRAMFS"
|
||
else
|
||
print_red "warning: no CONFIG_TARGET_ROOTFS_INITRAMFS"
|
||
echo -e "make ota_menuconfig"
|
||
echo -e "\t---> Target Images"
|
||
echo -e "\t\t---> [*] ramdisk"
|
||
echo -e "\t\t\t---> Compression (xz)"
|
||
fi
|
||
|
||
#call make
|
||
make ${TINA_VERBOSE} TARGET_CONFIG="$recovery_img_config" $@
|
||
if [ $? -ne 0 ]; then
|
||
print_red "make recovery img fail!"
|
||
fi
|
||
\cd - > /dev/null
|
||
|
||
}
|
||
|
||
|
||
function swupdate_make_recovery_img() {
|
||
make_recovery_img "$@"
|
||
}
|
||
|
||
function swupdate_pack_swu() {
|
||
|
||
T=$(gettop)
|
||
\cd $T
|
||
local BIN_DIR=$T/out/${TARGET_BOARD}
|
||
local SWU_DIR=$BIN_DIR/swupdate
|
||
local SWUPDATE_CONFIG_DIR="$T/target/allwinner/${TARGET_BOARD}/swupdate"
|
||
local SWUPDATE_COMMON_CONFIG_DIR="$T/target/allwinner/${TARGET_COMMON}/swupdate"
|
||
local SWUPDATE_GENERIC_CONFIG_DIR="$T/target/allwinner/generic/swupdate"
|
||
mkdir -p $SWUPDATE_CONFIG_DIR
|
||
local TARGET_COMMON="$(awk -F "-" '{print $1}' <<< ${TARGET_BOARD})-common"
|
||
local CFG="sw-subimgs$1.cfg"
|
||
mkdir -p "$SWU_DIR"
|
||
local storage_type_nor=0
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/sys_config.fex"
|
||
local B="$( awk -F"=" '/^storage_type/{print $2}' $f | sed 's/^[ \t]*//g' )"
|
||
case $B in
|
||
-1)
|
||
print_red "###storage type error###"
|
||
print_red "###cannot choose boot0, please config storage_type in sys_config ###"
|
||
;;
|
||
*0 | *5)
|
||
local boot0_img=boot0_nand.fex
|
||
;;
|
||
*1 | *2 | *4)
|
||
local boot0_img=boot0_sdcard.fex
|
||
;;
|
||
3)
|
||
local boot0_img=boot0_spinor.fex
|
||
storage_type_nor=1
|
||
;;
|
||
*)
|
||
print_red "###storage type error###"
|
||
print_red "###cannot choose boot0, please config storage_type in sys_config ###"
|
||
;;
|
||
esac
|
||
[ -n "$boot0_img" ] && {
|
||
rm -rf $BIN_DIR/boot0.img
|
||
dd if=$BIN_DIR/image/$boot0_img of=$BIN_DIR/boot0.img
|
||
}
|
||
local U="$(get_uboot)"
|
||
if [[ "$U" =~ "2011" ]]; then
|
||
local uboot_img=u-boot.fex
|
||
else
|
||
if [ x"$storage_type_nor" = x"1" ]; then
|
||
local uboot_img=boot_package_nor.fex
|
||
else
|
||
local uboot_img=boot_package.fex
|
||
fi
|
||
fi
|
||
rm -rf $BIN_DIR/uboot.img
|
||
dd if=$BIN_DIR/image/$uboot_img of=$BIN_DIR/uboot.img
|
||
|
||
if [ -e $SWUPDATE_CONFIG_DIR/$CFG ]; then
|
||
local SWUPDATE_SUBIMGS="$SWUPDATE_CONFIG_DIR/$CFG"
|
||
elif [ -e $SWUPDATE_COMMON_CONFIG_DIR/$CFG ]; then
|
||
local SWUPDATE_SUBIMGS="$SWUPDATE_COMMON_CONFIG_DIR/$CFG"
|
||
else
|
||
local SWUPDATE_SUBIMGS="$SWUPDATE_GENERIC_CONFIG_DIR/$CFG"
|
||
fi
|
||
|
||
unset swota_file_list
|
||
unset swota_copy_file_list
|
||
|
||
echo "####$SWUPDATE_SUBIMGS####"
|
||
. $SWUPDATE_SUBIMGS
|
||
|
||
echo ${swota_file_list[@]} | sed 's/ /\n/g'
|
||
echo ${swota_copy_file_list[@]} | sed 's/ /\n/g'
|
||
|
||
[ ! -f "$SWUPDATE_SUBIMGS" ] && print_red "$SWUPDATE_SUBIMGS not exist!!" && return 1
|
||
|
||
echo "-------------------- config --------------------"
|
||
echo "subimgs config by: $SWUPDATE_SUBIMGS"
|
||
echo "out dir: $SWU_DIR"
|
||
|
||
echo "-------------------- do copy --------------------"
|
||
cp "$SWUPDATE_SUBIMGS" "$SWU_DIR"
|
||
rm -f "$SWU_DIR/sw-subimgs-fix.cfg"
|
||
|
||
# files pack into swu
|
||
for line in ${swota_file_list[@]} ; do
|
||
ori_file=$(echo $line | awk -F: '{print $1}')
|
||
base_name=$(basename "$line")
|
||
fix_name=${base_name#*:}
|
||
[ ! -f "$ori_file" ] && print_red "$ori_file not exist!!" && return 1
|
||
cp $ori_file $SWU_DIR/$fix_name
|
||
echo $fix_name >> "$SWU_DIR/sw-subimgs-fix.cfg"
|
||
done
|
||
|
||
# files only copy but not pack into swu
|
||
for line in ${swota_copy_file_list[@]} ; do
|
||
ori_file=$(echo $line | awk -F: '{print $1}')
|
||
base_name=$(basename "$line")
|
||
fix_name=${base_name#*:}
|
||
[ ! -f "$ori_file" ] && print_red "$ori_file not exist!!" && return 1
|
||
cp $ori_file $SWU_DIR/$fix_name
|
||
echo $fix_name >> "$SWU_DIR/sw-subimgs-copy.cfg"
|
||
done
|
||
\cd - > /dev/null
|
||
\cd "$SWU_DIR"
|
||
|
||
echo "-------------------- do sha256 --------------------"
|
||
cp sw-description sw-description.bk
|
||
[ -f $SWU_DIR/sw-subimgs-fix.cfg ] && {
|
||
while IFS= read -r line
|
||
do
|
||
item="$line"
|
||
if grep -q -E "sha256 = \"@$item\"" sw-description ; then
|
||
echo "sha256 $item"
|
||
item_hash=$(sha256sum "$item" | awk '{print $1}')
|
||
item_size=$(du -b "$item" | awk '{print $1}')
|
||
sed -i "s/\(.*\)\(sha256 = \"@$item\"\)/\1sha256 = \"$item_hash\"/g" sw-description
|
||
sed -i "s/\(.*\)\(size = \"@$item\"\)/\1size = \"$item_size\"/g" sw-description
|
||
fi
|
||
done < "$SWU_DIR/sw-subimgs-fix.cfg"
|
||
}
|
||
|
||
[ -f $SWU_DIR/sw-subimgs-copy.cfg ] && {
|
||
while IFS= read -r line
|
||
do
|
||
item="$line"
|
||
if grep -q -E "sha256 = \"@$item\"" sw-description ; then
|
||
echo "sha256 $item"
|
||
item_hash=$(sha256sum "$item" | awk '{print $1}')
|
||
item_size=$(du -b "$item" | awk '{print $1}')
|
||
sed -i "s/\(.*\)\(sha256 = \"@$item\"\)/\1sha256 = \"$item_hash\"/g" sw-description
|
||
sed -i "s/\(.*\)\(size = \"@$item\"\)/\1size = \"$item_size\"/g" sw-description
|
||
fi
|
||
done < "$SWU_DIR/sw-subimgs-copy.cfg"
|
||
}
|
||
|
||
diff sw-description.bk sw-description
|
||
|
||
echo "-------------------- do sign --------------------"
|
||
|
||
local swupdate_need_sign=""
|
||
grep "CONFIG_SWUPDATE_CONFIG_SIGNED_IMAGES=y" "$T/target/allwinner/${TARGET_BOARD}/defconfig" && {
|
||
swupdate_need_sign=1
|
||
echo "need do sign"
|
||
}
|
||
|
||
local swupdate_sign_method=""
|
||
local password_para=""
|
||
#for rsa
|
||
local priv_key_file="$SWUPDATE_CONFIG_DIR/swupdate_priv.pem"
|
||
local password_file="$SWUPDATE_CONFIG_DIR/swupdate_priv.password"
|
||
#for cms
|
||
local cert_cert_file="$SWUPDATE_CONFIG_DIR/swupdate_cert.cert.pem"
|
||
local cert_key_file="$SWUPDATE_CONFIG_DIR/swupdate_cert.key.pem"
|
||
|
||
[ x$swupdate_need_sign = x"1" ] && {
|
||
echo "add sw-description.sig to sw-subimgs-fix.cfg"
|
||
sed '1 asw-description.sig' -i sw-subimgs-fix.cfg
|
||
grep "CONFIG_SWUPDATE_CONFIG_SIGALG_RAWRSA=y" "$T/target/allwinner/${TARGET_BOARD}/defconfig" && swupdate_sign_method="RSA"
|
||
grep "CONFIG_SWUPDATE_CONFIG_SIGALG_CMS=y" "$T/target/allwinner/${TARGET_BOARD}/defconfig" && swupdate_sign_method="CMS"
|
||
[ -e "$password_file" ] && {
|
||
echo "password file exist"
|
||
password_para="-passin file:$password_file"
|
||
}
|
||
|
||
if [ x"$swupdate_sign_method" = x"RSA" ]; then
|
||
echo "generate sw-description.sig with rsa"
|
||
openssl dgst -sha256 -sign "$priv_key_file" $password_para "$SWU_DIR/sw-description" > "$SWU_DIR/sw-description.sig"
|
||
elif [ x"$swupdate_sign_method" = x"CMS" ]; then
|
||
echo "generate sw-description.sig with cms"
|
||
openssl cms -sign -in "$SWU_DIR/sw-description" -out "$SWU_DIR/sw-description.sig" -signer "$cert_cert_file" \
|
||
-inkey "$cert_key_file" -outform DER -nosmimecap -binary
|
||
fi
|
||
}
|
||
|
||
echo "-------------------- do md5sum --------------------"
|
||
local md5_file="cpio_item_md5"
|
||
rm -f $md5_file
|
||
while IFS= read -r line
|
||
do
|
||
md5sum "$line" >> $md5_file
|
||
done < "$SWU_DIR/sw-subimgs-fix.cfg"
|
||
echo "$md5_file" >> sw-subimgs-fix.cfg
|
||
cat $md5_file
|
||
|
||
echo "-------------------- do cpio --------------------"
|
||
while IFS= read -r line
|
||
do
|
||
echo "$line"
|
||
done < "$SWU_DIR/sw-subimgs-fix.cfg" | cpio -ov -H crc > "$SWU_DIR/tina-${TARGET_BOARD}$1.swu"
|
||
|
||
echo "-------------------- out file in --------------------"
|
||
echo ""
|
||
print_red "$SWU_DIR/tina-${TARGET_BOARD}$1.swu"
|
||
du -sh "$SWU_DIR/tina-${TARGET_BOARD}$1.swu"
|
||
echo ""
|
||
|
||
\cd - > /dev/null
|
||
}
|
||
|
||
function swupdate_make_delta()
|
||
{
|
||
[ $# -lt 2 ] && print_red "usage:swupdate_make_delta base_swu new_swu [output_dir]" && return 1
|
||
|
||
local BIN_DIR=$T/out/${TARGET_BOARD}
|
||
local SWU_DIR=$BIN_DIR/swupdate
|
||
local base_swu=$(readlink -f "$1")
|
||
local new_swu=$(readlink -f "$2")
|
||
local delta_dir="$SWU_DIR/swupdate_delta"
|
||
[ -n "$3" ] && delta_dir="$3/swupdate_delta"
|
||
|
||
echo "base_swu : $base_swu"
|
||
echo "new_swu : $new_swu"
|
||
echo "delta_dir : $delta_dir"
|
||
|
||
rm -rf "$delta_dir"
|
||
mkdir -p "$delta_dir/base"
|
||
mkdir -p "$delta_dir/base_sig"
|
||
mkdir -p "$delta_dir/new"
|
||
mkdir -p "$delta_dir/delta"
|
||
|
||
local md5_file="cpio_item_md5"
|
||
local check=""
|
||
|
||
cd "$delta_dir/base"
|
||
cpio -idmv < "$base_swu"
|
||
check=$(md5sum --quiet -c $md5_file)
|
||
[ x"$check" = x"" ] || {
|
||
print_red "check md5 fail"
|
||
md5sum -c $md5_file
|
||
cd -
|
||
return 1
|
||
}
|
||
cd -
|
||
|
||
cd "$delta_dir/new"
|
||
cpio -idmv < "$new_swu"
|
||
check=$(md5sum --quiet -c $md5_file)
|
||
[ x"$check" = x"" ] || {
|
||
print_red "check md5 fail"
|
||
md5sum -c $md5_file
|
||
cd -
|
||
return 1
|
||
}
|
||
cd -
|
||
|
||
#uncompress *.gz before make delta
|
||
for file in "$delta_dir"/base/*; do
|
||
local filename=$(basename "$file")
|
||
local basefile=$delta_dir/base/$filename
|
||
local newfile=$delta_dir/new/$filename
|
||
if [ x${filename##*.} = x"gz" ]; then
|
||
echo "unzip $basefile"
|
||
gzip -d $basefile
|
||
echo "unzip $newfile"
|
||
gzip -d $newfile
|
||
fi
|
||
if [ x${filename##*.} = x"zst" ]; then
|
||
echo "unzstd $basefile"
|
||
zstd -d $basefile
|
||
echo "unzstd $newfile"
|
||
zstd -d $newfile
|
||
fi
|
||
done
|
||
|
||
for file in "$delta_dir"/base/*; do
|
||
local filename=$(basename "$file")
|
||
local basefile=$delta_dir/base/$filename
|
||
local newfile=$delta_dir/new/$filename
|
||
local sigfile=$delta_dir/base_sig/$filename.rdiff.sig
|
||
local deltafile=$delta_dir/delta/$filename.rdiff.delta
|
||
|
||
if [ -f "$basefile" ]; then
|
||
$T/out/host/bin/rdiff signature "$basefile" "$sigfile"
|
||
[ -e "$newfile" ] && {
|
||
echo "prepare $deltafile"
|
||
$T/out/host/bin/rdiff delta "$sigfile" "$newfile" "$deltafile"
|
||
}
|
||
fi
|
||
done
|
||
ll -h "$delta_dir/delta/"
|
||
}
|
||
|
||
function make_swupdate_img()
|
||
{
|
||
swupdate_pack_swu "$@"
|
||
}
|
||
|
||
function print_red(){
|
||
echo -e '\033[0;31;1m'
|
||
echo $1
|
||
echo -e '\033[0m'
|
||
}
|
||
|
||
function print_green(){
|
||
echo -e '\033[0;32;1m'
|
||
echo $1
|
||
echo -e '\033[0m'
|
||
}
|
||
|
||
function ota_general_keys()
|
||
{
|
||
local target_dir=$1
|
||
local key_name=OTA_Key.pem
|
||
|
||
[ $# -lt 1 ] && echo "usage:ota_general_keys key_dir" && return 1
|
||
rm -f "$target_dir"/*.pem
|
||
#this is for test, finally we should manage ota key with other keys
|
||
#general key
|
||
openssl genrsa -out "$target_dir"/OTA_Key.pem -f4 2048
|
||
#get public key
|
||
openssl rsa -in "$target_dir"/OTA_Key.pem -pubout -out "$target_dir"/OTA_Key_pub.pem
|
||
ls -ll "$target_dir"
|
||
echo "done! please keep the key safe!"
|
||
}
|
||
|
||
function ota_sign_files()
|
||
{
|
||
local target_dir=$1
|
||
local key_dir=$2
|
||
local key_name=OTA_Key.pem
|
||
[ ! -n "$3" ] && key_name=$3
|
||
[ $# -lt 2 ] && echo "usage:ota_sign_files files_dir key_dir [key_name]" && return 1
|
||
target_list="boot.img rootfs.img recovery.img boot_package.img boot0_nand.img boot0_sdcard.img"
|
||
rm -f "$patch_dir"/*.signature
|
||
for i in $target_list; do
|
||
[ ! -f "$target_dir"/"$i" ] && print_red "$target_dir/$i is not exist!"
|
||
echo "do signature for $target_dir/$i"
|
||
openssl dgst -sha256 -out "$target_dir"/"$i.signature" -sign "$key_dir"/"$key_name" "$target_dir"/"$i"
|
||
done
|
||
ls -ll "$target_dir"
|
||
}
|
||
|
||
function ota_general_patchs()
|
||
{
|
||
local old_file_dir="$1/ota/package_sys"
|
||
local new_file_dir="$2/ota/package_sys"
|
||
local patch_dir=$3
|
||
local target_list="recovery.img boot.img rootfs.img "
|
||
|
||
[ $# -lt 3 ] && echo "usage:ota_general_patchs old_file_dir new_file_dir patch_dir" && return 1
|
||
|
||
rm -rf "$patch_dir"/*.patch "$patch_dir"/*.md5
|
||
|
||
for i in $target_list; do
|
||
[ ! -f "$old_file_dir"/"$i" ] && print_red "$old_file_dir/$i is not exist!"
|
||
[ ! -f "$new_file_dir"/"$i" ] && print_red "$new_file_dir/$i is not exist!"
|
||
echo "Generating patch for $i"
|
||
bsdiff "$old_file_dir"/"$i" "$new_file_dir"/"$i" "$patch_dir"/"$i.patch"
|
||
cp "$new_file_dir"/"$i.md5" "$patch_dir"/"$i.md5"
|
||
done
|
||
|
||
ls -ll "$patch_dir"
|
||
|
||
print_green "Generate patch finished!!!"
|
||
}
|
||
|
||
function make_ramfs() {
|
||
local T=$(gettop)
|
||
local make_ramfs_fail=0
|
||
|
||
local ramfs_img_config="$T/target/allwinner/${TARGET_BOARD}/defconfig_ramfs"
|
||
|
||
print_red "build ramfs img"
|
||
|
||
#call make
|
||
make ${TINA_VERBOSE} -j16 TARGET_CONFIG="$ramfs_img_config"
|
||
if [ $? -ne 0 ]; then
|
||
print_red "make ramfs img fail!"
|
||
make_ramfs_fail=1
|
||
fi
|
||
|
||
if [ $make_ramfs_fail -ne 0 ];then
|
||
print_red "build ramfs fail!"
|
||
else
|
||
print_red "build ramfs finish!"
|
||
print_red "cp $T/out/${TARGET_BOARD}/compile_dir/target/rootfs to $T/out/${TARGET_BOARD}/compile_dir/target/rootfs_ramfs"
|
||
rm -rf "$T/out/${TARGET_BOARD}/compile_dir/target/rootfs_ramfs"
|
||
cp -fpr "$T/out/${TARGET_BOARD}/compile_dir/target/rootfs" "$T/out/${TARGET_BOARD}/compile_dir/target/rootfs_ramfs"
|
||
du -sh "$T/out/${TARGET_BOARD}/compile_dir/target/rootfs_ramfs"
|
||
fi
|
||
|
||
\cd "$T/out/${TARGET_BOARD}/compile_dir/target/"
|
||
ramfs_cpio=rootfs_ramfs.cpio.none
|
||
#ramfs_cpio=rootfs_ramfs.cpio.gz
|
||
#ramfs_cpio=rootfs_ramfs.cpio.xz
|
||
rm -f ${ramfs_cpio}
|
||
ln -s rootfs_ramfs skel
|
||
../../../../scripts/build_rootfs.sh c ${ramfs_cpio}
|
||
mv ${ramfs_cpio} "$T/target/allwinner/${TARGET_BOARD}/"
|
||
\cd "$T"
|
||
du -sh "$T/target/allwinner/${TARGET_BOARD}/${ramfs_cpio}"
|
||
}
|
||
|
||
get_uart_debug_port()
|
||
{
|
||
local f="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/sys_config.fex"
|
||
local key_name="uart_debug_port"
|
||
local count=`cat $f | grep "$key_name" -c`
|
||
local uart_port=0
|
||
|
||
while true
|
||
do
|
||
if [ $count = 0 ]; then
|
||
break;
|
||
fi
|
||
str=`cat $f |grep "$key_name" |awk 'NR=='$count`
|
||
count=$(($count-1))
|
||
if [ "x${str:0:1}" = "x;" ]; then
|
||
continue;
|
||
fi
|
||
uart_port=`echo $str |tr -d ' '|awk -F "=" '{print $2}'`
|
||
done
|
||
echo "uart$uart_port"
|
||
}
|
||
|
||
pack_usage()
|
||
{
|
||
printf "Usage: pack [-cCHIP] [-pPLATFORM] [-bBOARD] [-d] [-s] [-m] [-w] [-i] [-h]
|
||
-c CHIP (default: $chip)
|
||
-p PLATFORM (default: $platform)
|
||
-b BOARD (default: $board)
|
||
-d pack firmware with debug info output to card0
|
||
-s pack firmware with signature
|
||
-m pack dump firmware
|
||
-w pack programmer firmware
|
||
-i pack sys_partition.fex downloadfile img.tar.gz
|
||
-h print this help message
|
||
"
|
||
}
|
||
|
||
function pack() {
|
||
local T=$(gettop)
|
||
local chip=sun5i
|
||
local platform=$(get_build_var TARGET_BUILD_VARIANT)
|
||
local board_platform=$(get_build_var TARGET_BOARD_PLATFORM)
|
||
local board=$(get_build_var TARGET_BOARD)
|
||
local debug=$(get_uart_debug_port)
|
||
local sigmode=none
|
||
local securemode=none
|
||
local mode=normal
|
||
local programmer=none
|
||
local tar_image=none
|
||
unset OPTIND
|
||
while getopts "dsvmwih" arg
|
||
do
|
||
case $arg in
|
||
d)
|
||
debug=card0
|
||
;;
|
||
s)
|
||
sigmode=secure
|
||
;;
|
||
v)
|
||
securemode=secure
|
||
;;
|
||
m)
|
||
mode=dump
|
||
;;
|
||
w)
|
||
programmer=programmer
|
||
;;
|
||
i)
|
||
tar_image=tar_image
|
||
;;
|
||
h)
|
||
pack_usage
|
||
return 0
|
||
;;
|
||
?)
|
||
return 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
check_parameters
|
||
[ "$?" -eq 1 ] && return
|
||
|
||
$T/scripts/pack_img.sh -c $chip -p $platform -b $board \
|
||
-d $debug -s $sigmode -m $mode -w $programmer -v $securemode -i $tar_image -t $T
|
||
|
||
independently_pack=$(grep "CONFIG_SUPPORT_PACK_OUT_OF_TINA=y" $T/.config)
|
||
if [ x"${independently_pack}" != x"" ]; then
|
||
$T/scripts/independently_pack/collect_files.sh
|
||
fi
|
||
}
|
||
|
||
function createkeys()
|
||
{
|
||
local T=$(gettop)
|
||
$T/scripts/createkeys -c ${TARGET_PLATFORM}
|
||
}
|
||
|
||
function croot()
|
||
{
|
||
T=$(gettop)
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
\cd $T
|
||
}
|
||
|
||
function cboot()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_UBOOT}" ] && "Please lunch your combo firstly" && return
|
||
|
||
if [ "${TARGET_UBOOT}" = "u-boot-2018" ]; then
|
||
\cd $(gettop)/lichee/brandy-2.0/${TARGET_UBOOT}
|
||
else
|
||
\cd $(gettop)/lichee/brandy/${TARGET_UBOOT}
|
||
fi
|
||
}
|
||
|
||
function cboot0()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_UBOOT}" ] && "Please lunch your combo firstly" && return
|
||
|
||
if [ "${TARGET_UBOOT}" = "u-boot-2014.07" ]; then
|
||
\cd $(gettop)/lichee/bootloader/uboot_2014_sunxi_spl/
|
||
elif [ "${TARGET_UBOOT}" = "u-boot-2011.09" ]; then
|
||
\cd $(gettop)/lichee/bootloader/uboot_2011_sunxi_spl/
|
||
elif [ "${TARGET_UBOOT}" = "u-boot-2018" ]; then
|
||
\cd $T/lichee/brandy-2.0/spl*
|
||
fi
|
||
}
|
||
|
||
function copensbi()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
\cd $T/lichee/brandy-2.0/opensbi
|
||
}
|
||
|
||
function cbin()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
local target_bin_dir="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_PLAN}/bin"
|
||
local tina_bin_dir="$T/target/allwinner/${TARGET_BOARD%-*}-common/bin"
|
||
local longan_bin_dir="$T/device/config/chips/${TARGET_PLATFORM}/bin"
|
||
|
||
[ -e $longan_bin_dir -a -e $tina_bin_dir ] || \
|
||
[ -e $target_bin_dir -a -e $tina_bin_dir ] && {
|
||
print_red "warning: both longan and tina bin dir exist, default jump to longan"
|
||
print_red "tina: $tina_bin_dir"
|
||
}
|
||
|
||
[ -e $longan_bin_dir -a -e $target_bin_dir ] && {
|
||
echo -e "\033[0;31;1mwarning: There are longan bin dir for both platform and target\033[0m"
|
||
echo -e "\033[0;31;1mplease input 1 or 2 to select a dir to enter:\033[0m"
|
||
echo "1.platform: $longan_bin_dir"
|
||
echo "2.target: $target_bin_dir"
|
||
local num
|
||
read num
|
||
if [ $num -eq 1 ]; then
|
||
\cd $longan_bin_dir && return
|
||
elif [ $num -eq 2 ]; then
|
||
\cd $target_bin_dir && return
|
||
else
|
||
print_red "Syntax error, please input '1' or '2'" && return
|
||
fi
|
||
}
|
||
|
||
[ -e $longan_bin_dir ] && \cd $longan_bin_dir && return
|
||
[ -e $target_bin_dir ] && \cd $target_bin_dir && return
|
||
[ -e $tina_bin_dir ] && \cd $tina_bin_dir && return
|
||
}
|
||
|
||
function cdts()
|
||
{
|
||
local T=$(gettop)
|
||
local S=
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
local K="linux-${TARGET_KERNEL_VERSION}"
|
||
local A="${TINA_TARGET_ARCH}"
|
||
[ -z "$K" -o -z "$A" ] && "Please lunch your combo firstly" && return
|
||
[ "$A" = "aarch64" ] && {
|
||
S=sunxi
|
||
A=arm64
|
||
}
|
||
[ "$A" = "riscv" ] && {
|
||
S=sunxi
|
||
A=riscv
|
||
}
|
||
|
||
\cd $T/lichee/$K/arch/$A/boot/dts/$S
|
||
}
|
||
|
||
function ckernel
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
\cd $T/lichee/linux-${TARGET_KERNEL_VERSION}/
|
||
}
|
||
function cxr806
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
\cd $T/lichee/xr806/
|
||
}
|
||
|
||
|
||
function carisc
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
\cd $T/lichee/arisc/ar100s
|
||
}
|
||
|
||
|
||
function cgeneric
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
\cd $T/target/allwinner/generic
|
||
}
|
||
|
||
function callwinnerpk
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/package/allwinner
|
||
}
|
||
|
||
function ctinatest
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/package/testtools/tinatest
|
||
}
|
||
|
||
function cdevice
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/target/allwinner/${TARGET_BOARD}
|
||
}
|
||
|
||
function ccommon
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/target/allwinner/${TARGET_PLATFORM}-common
|
||
}
|
||
|
||
function cconfigs
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
local tina_config_dir="$T/target/allwinner/${TARGET_BOARD}/configs"
|
||
local longan_config_dir="$T/device/config/chips/${TARGET_PLATFORM}/configs/${TARGET_BOARD##*-}/linux"
|
||
|
||
[ -e $longan_config_dir -a -e $tina_config_dir ] && {
|
||
print_red "warning: both longan and tina configs dir exist"
|
||
print_red "tina: $tina_config_dir"
|
||
print_red "longan: $longan_config_dir"
|
||
}
|
||
|
||
[ -e $tina_config_dir ] && \cd $tina_config_dir && return
|
||
[ -e $longan_config_dir ] && \cd $longan_config_dir && return
|
||
}
|
||
|
||
function ctoolchain()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
local A=${TINA_TARGET_ARCH}
|
||
local C="$(awk -F\" '/CONFIG_LIBC=/{print $2}' \
|
||
$T/target/allwinner/${TARGET_BOARD}/defconfig)"
|
||
|
||
if [ "$TARGET_PLATFORM" = "r6" -o "$TARGET_PLATFORM" = "c200s" -o "$TARGET_PLATFORM" = "v133" -o "$TARGET_PLATFORM" = "c600" ]; then
|
||
C=arm9-$C
|
||
fi
|
||
|
||
if [ "$A" = "riscv" ];then
|
||
\cd $T/prebuilt/gcc/linux-x86/$A/toolchain-thead-$C/riscv*
|
||
else
|
||
\cd $T/prebuilt/gcc/linux-x86/$A/toolchain-sunxi-$C/toolchain
|
||
fi
|
||
}
|
||
|
||
function crootfs()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/out/${TARGET_BOARD}/compile_dir/target/rootfs
|
||
}
|
||
|
||
function cout()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/out/${TARGET_BOARD}
|
||
}
|
||
|
||
function cgrep()
|
||
{
|
||
find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 grep --color -n "$@"
|
||
}
|
||
|
||
function mgrep()
|
||
{
|
||
find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o \( -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -o -regextype posix-extended -regex '(.*/)?soong/[^/]*.go' \) -type f \
|
||
-exec grep --color -n "$@" {} +
|
||
}
|
||
|
||
|
||
function ctarget()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
[ -z "${TARGET_BOARD}" ] && "Please lunch your combo firstly" && return
|
||
|
||
\cd $T/out/${TARGET_BOARD}/compile_dir/target
|
||
}
|
||
|
||
function add-rootfs-demo()
|
||
{
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
cp -rf $(gettop)/package/add-rootfs-demo/* $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs
|
||
rm $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs/README
|
||
$(gettop)/out/host/bin/mksquashfs4 $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs \
|
||
$(gettop)/out/${TARGET_BOARD}/root.squashfs -noappend -root-owned -comp xz -b 256k \
|
||
-p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' -processors 1
|
||
rm $(gettop)/out/${TARGET_BOARD}/rootfs.img
|
||
dd if=$(gettop)/out/${TARGET_BOARD}/root.squashfs of=$(gettop)/out/${TARGET_BOARD}/rootfs.img bs=128k conv=sync
|
||
}
|
||
|
||
function prepare_buildserver()
|
||
{
|
||
$T/tools/build/buildserver --path $T 2>/dev/null 1>&2 &
|
||
}
|
||
|
||
function clbuildserver()
|
||
{
|
||
lsof $T/tools/build/buildserver 2> /dev/null | grep -q buildserver
|
||
if [ $? -eq 0 ]; then
|
||
echo "clean buildserver"
|
||
lsof $T/tools/build/buildserver 2> /dev/null | grep buildserver | awk '{ print $2}' | xargs kill -9
|
||
else
|
||
echo "no buildserver to clean"
|
||
fi
|
||
}
|
||
|
||
function mkrootfs_squashfs4()
|
||
{
|
||
kernelfs_formate=`grep CONFIG_SQUASHFS=y $(gettop)/lichee/*/.config | cut -d ":" -f 2`
|
||
echo -e "\033[31m$kernelfs_formate\033[0m"
|
||
if [ -z $kernelfs_formate ];then
|
||
echo -e "\033[31m run -make kernel_menuconfig- choice "squashfs" first!\033[0m"
|
||
else
|
||
compression=`grep ^CONFIG_KERNEL.*y$ $(gettop)/.config | awk 'NR==1{print}' | sed -r 's/.*_(.*)=.*/\1/' | tr '[A-Z]' '[a-z]'`
|
||
if [ -n "$compression" ];then
|
||
$(gettop)/out/host/bin/mksquashfs4 $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs $(gettop)/out/${TARGET_BOARD}/root.squashfs \
|
||
-noappend -root-owned -comp $compression -b 256k -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' -processors 1
|
||
else
|
||
$(gettop)/out/host/bin/mksquashfs4 $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs $(gettop)/out/${TARGET_BOARD}/root.squashfs \
|
||
-noappend -root-owned -comp xz -b 256k -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' -processors 1
|
||
fi
|
||
rm $(gettop)/out/${TARGET_BOARD}/rootfs.img
|
||
dd if=$(gettop)/out/${TARGET_BOARD}/root.squashfs of=$(gettop)/out/${TARGET_BOARD}/rootfs.img bs=128k conv=sync
|
||
fi
|
||
}
|
||
|
||
function mkrootfs_ext4()
|
||
{
|
||
kernelfs_formate=`grep CONFIG_EXT4_FS=y $(gettop)/lichee/*/.config | cut -d ":" -f 2`
|
||
echo -e "\033[31m $kernelfs_formate\033[0m"
|
||
if [ -z $kernelfs_formate ];then
|
||
echo -e "\033[31m run -make kernel_menuconfig- choice "ext4fs" first!\033[0m"
|
||
else
|
||
$(gettop)/out/host/bin/make_ext4fs -l 50331648 -b 4096 -i 6000 -m 0 -J $(gettop)/out/${TARGET_BOARD}/root.ext4 $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs
|
||
rm $(gettop)/out/${TARGET_BOARD}/rootfs.img
|
||
dd if=$(gettop)/out/${TARGET_BOARD}/root.ext4 of=$(gettop)/out/${TARGET_BOARD}/rootfs.img bs=128k conv=sync
|
||
fi
|
||
}
|
||
|
||
function mkrootfs_jffs2()
|
||
{
|
||
kernelfs_formate=`grep CONFIG_JFFS2_FS=y $(gettop)/lichee/*/.config | cut -d ":" -f 2`
|
||
echo -e "\033[31m$kernelfs_formate\033[0m"
|
||
if [ -z $kernelfs_formate ];then
|
||
echo -e "\033[31m run -make kernel_menuconfig- choice "jffs2fs" first!\033[0m"
|
||
else
|
||
$(gettop)/out/host/bin/mkfs.jffs2 --little-endian --squash-uids -v -X rtime -x zlib -x lzma -D $(gettop)/build/device_table.txt \
|
||
-e 128KiB -o $(gettop)/out/${TARGET_BOARD}/root.jffs2-128k -d $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs \
|
||
-v 2>&1 1>/dev/null | awk '/^.+$/'
|
||
rm $(gettop)/out/${TARGET_BOARD}/rootfs.img
|
||
dd if=$(gettop)/out/${TARGET_BOARD}/root.jffs2-128k of=$(gettop)/out/${TARGET_BOARD}/rootfs.img bs=128k conv=sync
|
||
fi
|
||
}
|
||
|
||
function mkrootfs_erofs()
|
||
{
|
||
kernelfs_formate=`grep CONFIG_EROFS_FS=y $(gettop)/lichee/*/.config | cut -d ":" -f 2`
|
||
echo -e "\033[31m $kernelfs_formate\033[0m"
|
||
if [ -z $kernelfs_formate ];then
|
||
echo -e "\033[31m run -make kernel_menuconfig- choice "erofs" first!\033[0m"
|
||
else
|
||
$(gettop)/out/host/bin/mkfs.erofs -zlz4 $(gettop)/out/${TARGET_BOARD}/root.erofs $(gettop)/out/${TARGET_BOARD}/compile_dir/target/rootfs
|
||
rm $(gettop)/out/${TARGET_BOARD}/rootfs.img
|
||
dd if=$(gettop)/out/${TARGET_BOARD}/root.erofs of=$(gettop)/out/${TARGET_BOARD}/rootfs.img bs=128k conv=sync
|
||
fi
|
||
}
|
||
|
||
|
||
function recomp_rootfs()
|
||
{
|
||
T=$(gettop)
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
file_formate=`grep ^CONFIG_TARGET_ROOTFS.*y $(gettop)/.config | cut -d "_" -f 4 | grep "=" | sed -r 's/(.*)=.*/\1/'`
|
||
echo -e "\033[31m $file_formate\033[0m"
|
||
if [ -z $file_formate ];then
|
||
echo -e "\033[31m run -make menuconfig- choice fs_formate of target images!\033[0m"
|
||
else
|
||
[ x$file_formate = x"SQUASHFS" ] && mkrootfs_squashfs4
|
||
[ x$file_formate = x"EXT4FS" ] && mkrootfs_ext4
|
||
[ x$file_formate = x"JFFS2" ] && mkrootfs_jffs2
|
||
[ x$file_formate = x"EROFS" ] && mkrootfs_erofs
|
||
fi
|
||
}
|
||
|
||
function tina_update_all_config()
|
||
{
|
||
T=$(gettop)
|
||
local T=$(gettop)
|
||
[ -z "$T" ] \
|
||
&& echo "Couldn't locate the top of the tree. Try setting TOP." \
|
||
&& return
|
||
|
||
filter=$1
|
||
|
||
time=$(date "+%Y%m%d-%H%M%S")
|
||
echo "${time}"
|
||
for platform in $(ls $T/target/allwinner/)
|
||
do
|
||
if [[ $platform =~ $filter ]]; then
|
||
[ -e $T/target/allwinner/$platform/BoardConfig.mk ] && {
|
||
# echo ${platform//-/_}-tina
|
||
lunch ${platform//-/_}-tina
|
||
make oldconfig
|
||
}
|
||
fi
|
||
done
|
||
time=$(date "+%Y%m%d-%H%M%S")
|
||
echo "${time}"
|
||
}
|
||
|
||
function godir ()
|
||
{
|
||
if [[ -z "$1" ]]; then
|
||
echo "Usage: godir <regex>"
|
||
return
|
||
fi
|
||
local T=$(gettop)
|
||
if [[ ! -f $T/filelist ]]; then
|
||
echo -n "Creating index..."
|
||
(\cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)
|
||
echo " Done"
|
||
echo ""
|
||
fi
|
||
local lines
|
||
lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq))
|
||
if [[ ${#lines[@]} = 0 ]]; then
|
||
echo "Not found"
|
||
return
|
||
fi
|
||
local pathname
|
||
local choice
|
||
if [[ ${#lines[@]} > 1 ]]; then
|
||
while [[ -z "$pathname" ]]; do
|
||
local index=1
|
||
local line
|
||
for line in ${lines[@]}; do
|
||
printf "%6s %s\n" "[$index]" $line
|
||
index=$(($index + 1))
|
||
done
|
||
echo
|
||
echo -n "Select one: "
|
||
unset choice
|
||
read choice
|
||
if [[ $choice -gt ${#lines[@]} || $choice -lt 1 ]]; then
|
||
echo "Invalid choice"
|
||
continue
|
||
fi
|
||
pathname=${lines[$(($choice-1))]}
|
||
done
|
||
else
|
||
pathname=${lines[0]}
|
||
fi
|
||
\cd $T/$pathname
|
||
}
|
||
|
||
function get_newest_file()
|
||
{
|
||
# find the newest file in $1
|
||
find $1 -type f -and -not -path "*/.git*" -and -not -path ".*" -and -not -path "*:*" -and -not -path "*\!*" -and -not -path "* *" -and -not -path "*\#*" -and -not -path "*/.*_check" -and -not -path "*/.*.swp" -and -not -path "*/.newest-*.patch" -printf "%T@ %Tc %p\n" | sort -n | tail -n 1
|
||
}
|
||
|
||
function tina_verbose()
|
||
{
|
||
if [ "$1" = 1 ];then
|
||
export TINA_VERBOSE="V=s"
|
||
elif [ "$1" = 0 ];then
|
||
export TINA_VERBOSE=
|
||
fi
|
||
echo "TINA_VERBOSE=${TINA_VERBOSE}"
|
||
}
|
||
|
||
function make_appImg_squash()
|
||
{
|
||
local PACK_TOPDIR=$(gettop)
|
||
|
||
local SOURCE_DATE_EPOCH=$(${PACK_TOPDIR}/scripts/get_source_date_epoch.sh)
|
||
# 这一行指定要打包到文件系统的数据
|
||
local USER_PART_FILE_PATH=${PACK_TOPDIR}/target/allwinner/${TARGET_BOARD}/appimg
|
||
local USER_PART_SQUASHFS=${PACK_TOPDIR}/out/${TARGET_BOARD}/image/appimg.squashfs
|
||
local USER_PART_DOWNLOAD_FILE=${PACK_TOPDIR}/out/${TARGET_BOARD}/image/appimg.fex
|
||
cd ${PACK_TOPDIR}/out/${TARGET_BOARD}/image
|
||
[ -e $USER_PART_FILE_PATH ] && {
|
||
#这里用了gzip,需要更高压缩率可改成xz
|
||
${PACK_TOPDIR}/out/host/bin/mksquashfs4 $USER_PART_FILE_PATH $USER_PART_SQUASHFS \
|
||
-noappend -root-owned -comp lz4 -b 256k \
|
||
-processors 1
|
||
dd if=${USER_PART_SQUASHFS} of=${USER_PART_DOWNLOAD_FILE} bs=128k conv=sync
|
||
}
|
||
|
||
cp ${USER_PART_DOWNLOAD_FILE} ${PACK_TOPDIR}/out/${TARGET_BOARD}
|
||
cd -
|
||
}
|
||
|
||
function make_recoveryImg_squash()
|
||
{
|
||
local PACK_TOPDIR=$(gettop)
|
||
|
||
local SOURCE_DATE_EPOCH=$(${PACK_TOPDIR}/scripts/get_source_date_epoch.sh)
|
||
# 这一行指定要打包到文件系统的数据
|
||
local USER_PART_FILE_PATH=${PACK_TOPDIR}/target/allwinner/${TARGET_BOARD}/recoveryimg
|
||
local USER_PART_SQUASHFS=${PACK_TOPDIR}/out/${TARGET_BOARD}/image/recoveryimg.squashfs
|
||
local USER_PART_DOWNLOAD_FILE=${PACK_TOPDIR}/out/${TARGET_BOARD}/image/recoveryimg.fex
|
||
cd ${PACK_TOPDIR}/out/${TARGET_BOARD}/image
|
||
[ -e $USER_PART_FILE_PATH ] && {
|
||
#这里用了gzip,需要更高压缩率可改成xz
|
||
${PACK_TOPDIR}/out/host/bin/mksquashfs4 $USER_PART_FILE_PATH $USER_PART_SQUASHFS \
|
||
-noappend -root-owned -comp xz -b 256k \
|
||
-processors 1
|
||
dd if=${USER_PART_SQUASHFS} of=${USER_PART_DOWNLOAD_FILE} bs=128k conv=sync
|
||
}
|
||
|
||
cp ${USER_PART_DOWNLOAD_FILE} ${PACK_TOPDIR}/out/${TARGET_BOARD}
|
||
cd -
|
||
}
|
||
|
||
function make()
|
||
{
|
||
local T=$(gettop)
|
||
local start_time=$(date +"%s")
|
||
|
||
if [ $T = $(pwd) ] ; then
|
||
echo "===This's tina environment.==="
|
||
if echo "$@" | grep -q -E "\-npq|prereq|clean|download|prepare|compile|install|config|update|refresh"; then
|
||
echo "special target, skip mboot,marisc"
|
||
else
|
||
if [ x"${TARGET_UBOOT}" = x"u-boot-2018" ]; then
|
||
#TODO: abort when mboot fail
|
||
|
||
if [ x"$LICHEE_BRANDY_SPL" == x -o ! -f $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL/Makefile ]; then
|
||
LICHEE_BRANDY_SPL=spl
|
||
fi
|
||
BOOT0_NEWEST_FILE=`get_newest_file $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL`
|
||
BOOT0_REBUILD_FLAG=`echo "$BOOT0_NEWEST_FILE $TARGET_BOARD" | md5sum | awk '{print ".newest-"$1".patch"}'`
|
||
# if there is no modification in boot0, do not rebuild boot0
|
||
#if [ ! -f $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL/$BOOT0_REBUILD_FLAG ]; then
|
||
mboot0
|
||
echo "#######now mboot0##########"
|
||
if [ "$?" -ne 0 ]; then
|
||
echo -e "\033[31m#### make boot0 failed!\033[0m"
|
||
return 1
|
||
fi
|
||
rm -rf $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL/.newest-*.patch
|
||
BOOT0_NEWEST_FILE=`get_newest_file $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL`
|
||
BOOT0_REBUILD_FLAG=`echo "$BOOT0_NEWEST_FILE $TARGET_BOARD" | md5sum | awk '{print ".newest-"$1".patch"}'`
|
||
touch $T/lichee/brandy-2.0/$LICHEE_BRANDY_SPL/$BOOT0_REBUILD_FLAG
|
||
#else
|
||
# echo -e "no need rebuild boot0, the newest file is: \n\t$BOOT0_NEWEST_FILE"
|
||
#fi
|
||
|
||
UBOOT_NEWEST_FILE=`get_newest_file $T/lichee/brandy-2.0/u-boot-2018`
|
||
UBOOT_REBUILD_FLAG=`echo "$UBOOT_NEWEST_FILE $TARGET_BOARD" | md5sum | awk '{print ".newest-"$1".patch"}'`
|
||
UBOOT_BOARD_DTS=$LICHEE_BOARD_CONFIG_DIR/uboot-board.dts
|
||
local uboot_build_flag=1
|
||
|
||
if [ ! -f $T/lichee/brandy-2.0/u-boot-2018/$UBOOT_REBUILD_FLAG ];then
|
||
uboot_build_flag=1
|
||
elif [ $T/lichee/brandy-2.0/u-boot-2018/$UBOOT_REBUILD_FLAG -ot $LICHEE_BOARD_CONFIG_DIR/uboot-board.dts ];then
|
||
uboot_build_flag=1
|
||
echo "uboot-board.dts updated."
|
||
fi
|
||
# if there is no modification in uboot, do not rebuild uboot
|
||
if [ $uboot_build_flag = 1 ];then
|
||
muboot
|
||
echo "######now muboot#########"
|
||
if [ "$?" -ne 0 ]; then
|
||
echo -e "\033[31m#### make uboot failed!\033[0m"
|
||
return 1
|
||
fi
|
||
rm -rf $T/lichee/brandy-2.0/u-boot-2018/.newest-*.patch
|
||
UBOOT_NEWEST_FILE=`get_newest_file $T/lichee/brandy-2.0/u-boot-2018`
|
||
UBOOT_REBUILD_FLAG=`echo "$UBOOT_NEWEST_FILE $TARGET_BOARD" | md5sum | awk '{print ".newest-"$1".patch"}'`
|
||
touch $T/lichee/brandy-2.0/u-boot-2018/$UBOOT_REBUILD_FLAG
|
||
else
|
||
echo -e "no need rebuild uboot, the newest file is: \n\t$UBOOT_NEWEST_FILE"
|
||
fi
|
||
else
|
||
echo "not uboot2018, skip mboot"
|
||
fi
|
||
|
||
mkarisc
|
||
[ $? -ne 0 ] && exit 1
|
||
|
||
if [ -d ./lichee/melis-v3.0 ]; then
|
||
make_melis $@
|
||
fi
|
||
fi
|
||
|
||
check_parameters
|
||
[ "$?" -eq 1 ] && return
|
||
else
|
||
echo "===This not's tina environment, use command make.==="
|
||
fi
|
||
|
||
if [[ x"$@" = x"" ]] || [[ "$@" =~ "-j" ]] ; then
|
||
prepare_buildserver
|
||
elif [[ x"$@" = x"clean" ]] || [[ x"$@" = x"distclean" ]]; then
|
||
clbuildserver
|
||
fi
|
||
|
||
command make ${TINA_VERBOSE} "$@"
|
||
|
||
local ret=$?
|
||
local end_time=$(date +"%s")
|
||
local tdiff=$(($end_time-$start_time))
|
||
local hours=$(($tdiff / 3600 ))
|
||
local mins=$((($tdiff % 3600) / 60))
|
||
local secs=$(($tdiff % 60))
|
||
|
||
echo
|
||
if [ $ret -eq 0 ] ; then
|
||
echo -n -e "#### make completed successfully "
|
||
else
|
||
echo -n -e "#### make failed to build some targets "
|
||
fi
|
||
|
||
if [ $hours -gt 0 ] ; then
|
||
printf "(%02g:%02g:%02g (hh:mm:ss))" $hours $mins $secs
|
||
elif [ $mins -gt 0 ] ; then
|
||
printf "(%02g:%02g (mm:ss))" $mins $secs
|
||
elif [ $secs -gt 0 ] ; then
|
||
printf "(%s seconds)" $secs
|
||
fi
|
||
echo -e " ####"
|
||
echo
|
||
|
||
return $ret
|
||
}
|
||
|
||
[ -e ./build/.hooks/expand_func ] && source ./build/.hooks/expand_func
|
||
[ -e ./build/expand_melis.sh ] && [ -d ./lichee/melis-v3.0 ] && source ./build/expand_melis.sh
|
||
|
||
#### MAIN ####
|
||
envsetup
|