SmartAudio/scripts/mempatch/mkpatch-dram.sh

428 lines
11 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
VERSION="0.1.0"
source $(dirname $0)/target.tb
show_help()
{
echo -ne "Usage: mkpatch-dram.sh -p <platform> [-o <outdir>] [-bh] "
echo -e "\033[32m<Root of TinaSDK>\033[0m"
echo -e "Options:"
echo -e "\t-h: show this help message and exit"
echo -e "\t-o <outdir>: out directory [default current dir]"
echo -e "\t-p <platform>: the platform to make"
echo -e "\t-v: just show driver version and exit"
echo -e ""
echo "Eg. ./mkpatch-dram.sh -p r16 ~/worksapce/tina : make dram patch for r16"
}
get_kernel_version()
{
local list="$(find ${ROOT}/target/allwinner -maxdepth 1 -name "$1-*" -type d)"
local one ver version platform
for one in ${list}
do
grep -q 'common$' <<< "${one}" && continue
[ -f "${one}/Makefile" ] || continue
unset ver
ver="$(awk -F":=" '/KERNEL_PATCHVER/{print $2}' ${one}/Makefile)"
if [ -z "${version}" ]; then
platform="${one}"
version="${ver}"
else
[ "${version}" = "${ver}" ] && continue
echo -en "\033[31mkernel version diff: "
echo -en "$(basename ${one}) (${ver}) Vs. "
echo -e "$(basename ${platform}) (${version})\033[0m"
[ "$(echo "${ver} > ${version}" | bc)" -eq 1 ] && version="${ver}"
fi
done
kernel="linux-${version}"
}
get_boot0_version()
{
local kernel=$1
case "${kernel}" in
linux-3.4)
boot0="uboot_2011_sunxi_spl"
;;
*)
boot0="uboot_2014_sunxi_spl"
;;
esac
}
get_chip()
{
local fconfig
fconfig="${ROOT}/target/allwinner/$1-*/config-$(awk -F'-' '{print $2}' <<< $2)"
chip="$(awk -F'[_=]' '/CONFIG_ARCH_SUN.*P.*=y/{print tolower($3)}' ${fconfig} | head -n 1)"
}
get_dram_version()
{
local filter="DRIVE INFO:"
local NextLineFoundVersion=no
local chip=$1
local file=$2
local version
[ $chip = sun50iw1p1 ] && filter="driver version:"
while read line
do
[ $NextLineFoundVersion = yes ] && {
version=`echo "$line" | cut -d "V" -f 2 | cut -c1-4`
break;
}
res=`echo $line |grep "$filter"`
[ $? -eq 0 ] && {
version=`echo "$res" | cut -d ":" -f 2`
if [ `echo $version |grep V` ]; then
version=`echo $version | cut -d "V" -f 2`
break;
else
NextLineFoundVersion=yes
fi
}
done < $file
echo "V$version"
}
get_libdrampath()
{
#1-boot0, 2-kernel, 3-chip
local dramfile=libdram
local kernel=$2
local chip_short=$3
boot0binpath=${ROOT}/target/allwinner/${target}-common/bin/boot0_sdcard_${3}.bin
case $3 in
sun8iw15p1)
dramfile=libdram_ddr3
boot0binpath=${ROOT}/target/allwinner/${target}-common/bin/boot0_sdcard_${3}_lpddr3.bin
;;
sun8iw6p1)
dramfile=libdram-iot
;;
esac
[ ${kernel} = "linux-3.4" ] && {
chip_short=`echo $chip_short | awk '{sub(/.{2}$/,"")}1'`
}
libdrampath=${ROOT}/lichee/bootloader/${1}/sunxi_spl/dram/${chip_short}/dram/$dramfile
}
check_platform()
{
up_platform="$(sed 's/.*/\u&/g' <<< "${platform}")"
info="$(sed 's/ /\n/g' <<< "${table[@]}" | awk "/${up_platform}/{print}")"
[ -z "${info}" ] && return 1
platform="$(sed 's/.*/\l&/g' <<< ${platform})"
target="$(awk -F: '{print $1}' <<< ${info})"
get_kernel_version ${target}
get_boot0_version ${kernel}
get_chip ${target} ${kernel}
# dram
get_libdrampath ${boot0} ${kernel} ${chip}
dramversion=`get_dram_version ${chip} ${libdrampath}`
boot0_bin_dramversion=`get_dram_version ${chip} ${boot0binpath}`
[ $boot0_bin_dramversion != $dramversion ] && {
echo -e "\033[31mDRAM version is $dramversion,"\
"but boot0 bin version is $boot0_bin_dramversion,"\
"please updtate boot0 bin\033[0m"
return 1
}
echo "===================================================================="
echo "platform: ${platform}"
echo "boot0: ${boot0}"
echo "chip: ${chip}"
echo "target: ${target}"
echo "libdram path: ${libdrampath}"
echo "boot0 bin path: ${boot0binpath}"
echo "dram version: ${dramversion}"
echo "===================================================================="
[ -z "${platform}" -o -z "${boot0}" -o -z "${chip}" -o -z "${target}" \
-o -z "${libdrampath}" -o -z "${dramversion}" ] && return 1 || return 0
}
mk_README()
{
cat > ${tmpdir}/README.txt << EOF
注意:
=============================================================
此补丁只适用于更新全志 TinaSDK 的dram 驱动(boot0镜像)
=============================================================
补丁信息:
=============================================================
dram驱动: ${dramversion}
适用方案: ${platform}
补丁提取日期: $(date +%Y-%m-%d\ %H:%M:%S)
=============================================================
文件内容:
=============================================================
bin.tar.gz : Tina boot0 bin 补丁
README.txt : 说明文档
md5sum.txt : 补丁包的md5码
install.sh : 快速更新脚本
=============================================================
更新步骤:
=============================================================
1. 安装补丁
./install.sh <SDK根目录>
Eg. install.sh ~/workspace/tina : 会替换boot0的bin
3. 打包固件
替换boot0镜像后如果之前有编译过固件镜像则只需要重新pack打包即可
否则,请按照固件编译方法进行编译
=============================================================
EOF
}
mk_md5sum()
{
cd ${tmpdir} >/dev/null
md5sum bin.tar.gz >> ${tmpdir}/md5sum.txt
}
mk_install()
{
touch ${tmpdir}/install.sh
chmod +x ${tmpdir}/install.sh
cat > ${tmpdir}/install.sh << EOF
#!/bin/bash
show_help()
{
echo -e "Usage: install.sh [-ahpu] \\033[32m<Root of TinaSDK >\\033[0m"
echo -e "Options:"
echo -e "\\t-p: patch boot0 bin [default]"
echo -e "\\t-h: show this help message and exit"
echo -e ""
echo "Eg. ./install.sh -a ~/worksapce/tina"
}
check_top()
{
OBJ_ROOT="\$1"
[ -f "\${OBJ_ROOT}/android/build/envsetup.sh" -a -d "\${OBJ_ROOT}/lichee" ] \\
&& SDK=android && return 0
[ -f "\${OBJ_ROOT}/build/envsetup.sh" -a -d "\${OBJ_ROOT}/../lichee" ] \\
&& SDK=android && OBJ_ROOT="\${OBJ_ROOT}/.." && return 0
[ -f "\${OBJ_ROOT}/build/envsetup.sh" -a -d "\${OBJ_ROOT}/target/allwinner" ] \\
&& SDK=tina && return 0
echo -e "\\033[31mInvalid Root of TinaSDK or AndroidSDK\\033[0m\n"
return 1
}
check_md5()
{
! which md5sum &>/dev/null \\
&& echo -e "\\033[31mPlease Install md5sum\\033[0m" \\
&& return 1
! which tar &>/dev/null \\
&& echo -e "\\033[31mPlease Install tar\\033[0m" \\
&& return 1
[ ! -f \${cur}/md5sum.txt ] \\
&& echo -e "\\033[31mNot Found md5sum.txt In Current Path\\033[0m" \\
&& return 1
! md5sum -c md5sum.txt &>/dev/null \\
&& echo -e "\\033[31mCheck md5sum Failed\\033[0m" \\
&& return 1
return 0
}
check()
{
[ \$# -ne 1 -o ! -d "\$1" ] && show_help && exit 1
! check_top "\$1" && show_help && exit 1
! check_md5 && echo -e "\\n\\033[31mBad Patch\\033[0m" && exit 1
return 0
}
patch()
{
if [ "\${SDK}" = "tina" -a -f "\${cur}/bin.tar.gz" ]; then
! tar -zmxf \${cur}/bin.tar.gz -C \${OBJ_ROOT} target \\
&& echo -e "\\033[31mPatch Failed\\033[0m" \\
&& exit 1
echo -e "\\033[32mPatch Bin for Tina SDK ... OK\\033[0m"
fi
echo -e "\\033[32mPatch ... OK\\033[0m"
return 0
}
# update
update()
{
cur=\$(dirname \$0)
opts=\$(getopt -o 'hp' -- \$@) || return 1
eval set -- "\${opts}"
while true
do
case "\$1" in
-h)
show_help
exit 0
;;
-p)
actor="patch"
shift
;;
--)
shift
break
esac
done
check \$@
if [ -z "\${actor}" ]; then
actor="patch"
fi
eval "\$(sed 's/ /\\n/g' <<< \${actor})"
echo -e "\\033[32m--- END ---\\033[0m"
}
update \$@
EOF
}
mk_bin()
{
# bin
mkdir -p ${tmpdir}/target/allwinner/${target}-common/bin
cp -r ${ROOT}/target/allwinner/${target}-common/bin/boot0_*.bin \
${tmpdir}/target/allwinner/${target}-common/bin
# pack
cd ${tmpdir}
echo -e "\033[33mPatch List\033[0m"
tar -zcvf bin.tar.gz target
}
do_patch()
{
base="${up_platform}_Update_DRAM_To_$(awk '{print $1}' <<< ${dramversion})_$(date +%Y-%m-%d)"
tmpdir="${outdir}/${base}"
outfile="${base}.tar.gz"
rm -rf ${tmpdir}
rm -f ${outdir}/${outfile}
mkdir -p ${tmpdir}
mk_README && mk_install && mk_bin && mk_md5sum
[ "$?" -ne 0 ] && exit 1
echo ""
rm -rf target
cd ${tmpdir}/..
tar -zcvf ${outdir}/${outfile} ${base} > /dev/null
! [ -f "${outdir}/${outfile}" ] \
&& echo -e "\033[32mMake Patch Failed\033[0m" \
&& exit 1
echo -e "\033[32mMake Patch Finish\033[0m"
echo -e "Patch at:\n\033[33m ${outdir}/${outfile}\033[0m"
}
check_top()
{
ROOT="$(sed 's#/$##' <<< $1)"
[ ! -f "${ROOT}/build/envsetup.sh" ] \
&& echo -e "\033[31mInvalid Root of Tina SDK\033[0m\n" \
&& return 1
return 0
}
check()
{
[ -z "${platform}" ] \
&& echo -e "\033[31mPlease Tell Me The Platform by -p <platform>\033[0m" \
&& return 1
[ $# -ne 1 -o ! -d "$1" ] \
&& echo -e "\033[31mMiss Root Of SDK\033[0m" \
&& show_help && return 1
! check_top "$1" && return 1
! check_platform \
&& echo -e "\033[31mInvalid Platform: ${platform}\033[0m" \
&& return 1
echo ""
return 0
}
show_version()
{
echo "VERSION for this script: ${VERSION}"
}
mkpatch()
{
opts=$(getopt -o 'ho:p:v' -- $@) || return 1
eval set -- "${opts}"
while true
do
case "$1" in
-h)
show_help
exit 0
;;
-p)
shift
platform="$1"
shift
;;
-o)
shift
outdir="$(cd $1 && pwd)"
shift
;;
-v)
shift
do_and_exit="${do_and_exit} show_version"
;;
--)
shift
break
esac
done
[ -z "${outdir}" -o "${outdir}" = '.' ] && outdir="${PWD}"
check $@ || exit 1
[ -n "${do_and_exit}" ] && {
$(sed 's/ /\n/g' <<< ${do_and_exit})
exit 0
}
do_patch
echo -e "\033[32m--- END ---\033[0m"
}
mkpatch $@