#!/bin/bash VERSION="0.1.0" source $(dirname $0)/target.tb show_help() { echo -ne "Usage: mkpatch-dram.sh -p [-o ] [-bh] " echo -e "\033[32m\033[0m" echo -e "Options:" echo -e "\t-h: show this help message and exit" echo -e "\t-o : out directory [default current dir]" echo -e "\t-p : 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 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\\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 \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 $@