From 7c69966520644d64725c822a231990dd586ad953 Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Mon, 23 Jan 2017 16:53:32 +0900 Subject: [PATCH] build: add exynos system-tools script files This patch adds exynos system-tools script files to make merged dtb file and merged kernel file with dtbs. Signed-off-by: Seung-Woo Kim --- release_obs.sh | 4 +- scripts/exynos_dtbtool.sh | 265 ++++++++++++++++++++++++++++++++++++++++++++ scripts/exynos_mkdzimage.sh | 196 ++++++++++++++++++++++++++++++++ 3 files changed, 463 insertions(+), 2 deletions(-) create mode 100755 scripts/exynos_dtbtool.sh create mode 100755 scripts/exynos_mkdzimage.sh diff --git a/release_obs.sh b/release_obs.sh index d89c427..c723418 100755 --- a/release_obs.sh +++ b/release_obs.sh @@ -83,13 +83,13 @@ fi DTC_PATH="scripts/dtc/" -dtbtool -o ${BOOT_PATH}/merged-dtb -p ${DTC_PATH} -v ${BOOT_PATH}/dts/ +./scripts/exynos_dtbtool.sh -o ${BOOT_PATH}/merged-dtb -p ${DTC_PATH} -v ${BOOT_PATH}/dts/ if [ "$?" != "0" ]; then echo "Failed to make merged-dtb" exit 1 fi -mkdzimage -o ${BOOT_PATH}/${DZIMAGE} -k ${BOOT_PATH}/${IMAGE} -d ${BOOT_PATH}/merged-dtb +./scripts/exynos_mkdzimage.sh -o ${BOOT_PATH}/${DZIMAGE} -k ${BOOT_PATH}/${IMAGE} -d ${BOOT_PATH}/merged-dtb if [ "$?" != "0" ]; then echo "Failed to make mkdzImage" exit 1 diff --git a/scripts/exynos_dtbtool.sh b/scripts/exynos_dtbtool.sh new file mode 100755 index 0000000..1c1ea1d --- /dev/null +++ b/scripts/exynos_dtbtool.sh @@ -0,0 +1,265 @@ +#!/bin/bash + + +## Functions +function write_hex_to_4bytes_binary() +{ + HEX=$1 + + HEX=${HEX#0x} + NUM=$((8-${#HEX})) + + ZERO="00000000" + SUB=${ZERO:0:$NUM} + + HEX=$SUB$HEX + + for str in $(echo $HEX | sed 's/../& /g' | rev); do + str=$(echo -en $str | rev) + echo -en "\x$str" + done > $2 +} + +function write_to_4bytes_binary() +{ + HEX=`echo "obase=16; $1" | bc` + + write_hex_to_4bytes_binary $HEX $2 +} + +function write_to_padding_binary() +{ + rm -f padding + + PAD_SIZE=$(($(($PAD - $(($1 % $PAD)))) % $PAD)) + if [ $PAD_SIZE -gt 0 ]; then + dd if=/dev/zero of=./padding bs=1 count=$PAD_SIZE 2>/dev/zero + else + touch padding + fi + + if [ "${VERBOSE}" -eq "1" ]; then + echo -en " | PAD: $PAD_SIZE[B]\n" + fi +} + +function get_dtb_size() +{ + SIZE=`du -b $1 | awk '{print $1}'` + PAD_SIZE=$(($(($PAD - $(($SIZE % $PAD)))) % $PAD)) + DTB_SIZE=$(($SIZE + $PAD_SIZE)) +} + +function help() { + echo "exynos_dtbtool.sh [OPTIONS] -o " + echo " options:" + echo " --output-file/-o output file" + echo " --dtc-path/-p path to dtc" + echo " --page-size/-s page size in bytes" + echo " --verbose/-v verbose" + echo " --help/-h this help screen" + exit 0 +} + + +## Defines +OUT="merged-dtb" +OUT_TMP="multi.tmp" + +OUT_DIR="./arch/arm/boot" +DTC_PATH=scripts/dtc + +EXYNOS_MAGIC="EXYN" +EXYNOS_VERSION=1 +EXYNOS_TAG="samsung,exynos-id" + +ENDOFHEADER=0 + +let MAX_PAD_SIZE=1024*1024 +PAD=2048 +VERBOSE=0 + +if [ "$#" -eq "0" ]; then + help +fi + + +## Input parameters +params="$(getopt -o o:p:s:vh -l output-file:,dtc-path:,page-size:,verbose,help --name "$0" -- "$@")" +eval set -- "$params" +while true +do + case "$1" in + -o|--output-file) + OUTPUT_FILE=$2 + shift 2 + OUT_DIR=`dirname $OUTPUT_FILE` + if [ ! -d "$OUT_DIR" ]; then + echo "invalid output path '$OUT_DIR'." + exit 1 + fi + OUT=${OUTPUT_FILE#${OUT_DIR}} + OUT=${OUT//\//} + OUT_TMP=${OUT}.tmp + ;; + -p|--dtc-path) + DTC_PATH=$2 + shift 2 + ;; + -s|--page-size) + PAD=$2 + shift 2 + R=${PAD#-} + R=${R//[0-9]/} + # page size should be number, and larger than 0, and smaller than 1024*1024 + if [ ! -z "$R" ] || [ "$PAD" -lt "0" ] || [ "$PAD" -gt "$MAX_PAD_SIZE" ]; then + echo "invalid page size." + exit 1 + fi + ;; + -v|--verbose) + VERBOSE=1 + shift + ;; + -h|--help) + help + ;; + --) + shift + break + ;; + *) + help + ;; + esac +done + +if [ "$#" -eq "0" ]; then + help +fi + +DTS_DIR=$1 +DTS_DIR=${DTS_DIR%\/} +if [ ! -d "$DTS_DIR" ]; then + echo "invalid DTB input path '$DTS_DIR'." + exit 1 +else + DTB=(`find ${DTS_DIR} -name "*.dtb"`) + for i in ${DTB[*]}; do + if [ -e $i ]; then + TAG_CHECK=`${DTC_PATH}/dtc -I dtb -O dts $i 2>/dev/null | grep "${EXYNOS_TAG}"` + if [ "z${TAG_CHECK}" == "z" ]; then + # no tag in the dtb file + DTB=(${DTB[@]/$i}) + fi + fi + done +fi + +if [ ! -f "$DTC_PATH/dtc" ]; then + echo "no DTC file in '$DTC_PATH'." + exit 1 +fi + +if [ "${VERBOSE}" -eq "1" ]; then + echo "DTB input path is '${DTS_DIR}'" + echo "output path is '${OUT_DIR}', output file is '${OUT}'" + echo "page size is '${PAD}'" +fi + + +## Header +rm -f $OUT +rm -f $OUT_TMP +touch $OUT_TMP + +DTB_CNT=${#DTB[@]} +HEADER_SIZE=$((12 + 20 * $DTB_CNT + 4)) +DTB_OFFSET=$PAD + +if [ "${VERBOSE}" -eq "1" ]; then + echo -en " *HEADER " + echo -en "$HEADER_SIZE[B]\n" +fi + +echo -en $EXYNOS_MAGIC > $OUT +cat $OUT >> $OUT_TMP +write_to_4bytes_binary $EXYNOS_VERSION $OUT +cat $OUT >> $OUT_TMP +write_to_4bytes_binary $DTB_CNT $OUT +cat $OUT >> $OUT_TMP + +for i in ${DTB[*]}; do + FILE="$i" + if [ -e $FILE ]; then + TAG_CHECK=`${DTC_PATH}/dtc -I dtb -O dts $i 2>/dev/null | grep "${EXYNOS_TAG}"` + TAG_CHECK=${TAG_CHECK#*<} + TAG_CHECK=${TAG_CHECK%>*} + CHIPSET=`echo ${TAG_CHECK} | awk '{ print $1 }'` + PLATFORM=`echo ${TAG_CHECK} | awk '{ print $2 }'` + REV=`echo ${TAG_CHECK} | awk '{ print $3 }'` + + write_hex_to_4bytes_binary $CHIPSET $OUT + cat $OUT >> $OUT_TMP + + write_hex_to_4bytes_binary $PLATFORM $OUT + cat $OUT >> $OUT_TMP + + write_hex_to_4bytes_binary $REV $OUT + cat $OUT >> $OUT_TMP + + write_to_4bytes_binary $DTB_OFFSET $OUT + cat $OUT >> $OUT_TMP + + get_dtb_size $FILE + write_to_4bytes_binary $DTB_SIZE $OUT + cat $OUT >> $OUT_TMP + + DTB_OFFSET=$(($DTB_OFFSET + $DTB_SIZE)) + else + echo -en "$i not found.\nexit\n" + exit -1 + fi +done + +write_to_4bytes_binary $ENDOFHEADER $OUT +cat $OUT >> $OUT_TMP + +write_to_padding_binary $HEADER_SIZE +cat $OUT_TMP padding > $OUT + + +## DTB +for i in ${DTB[*]}; do + FILE="$i" + if [ -e $FILE ]; then + NAME=`echo $i` + SIZE=`du -b $FILE | awk '{print $1}'` + + cat $OUT $FILE > $OUT_TMP + if [ "${VERBOSE}" -eq "1" ]; then + echo -en " *$NAME " + echo -en "$SIZE[B]\n" + fi + + write_to_padding_binary $SIZE + cat $OUT_TMP padding > $OUT + else + echo -en "$i not found.\nexit\n" + exit -1 + fi +done + + +## End +rm -f $OUT_TMP +rm -f padding +rm -f $OUT_DIR/$OUT +mv -f $OUT $OUT_DIR/ + +S=`du -b $OUT_DIR/$OUT | awk '{print $1}'` +S_K=$(($S/1024)) +if [ "${VERBOSE}" -eq "1" ]; then + echo -en "## OUT: $OUT size: $S[B]; $S_K[KB]\n" +fi +echo "$OUT_DIR/$OUT (size: ${S_K}KB) is created." diff --git a/scripts/exynos_mkdzimage.sh b/scripts/exynos_mkdzimage.sh new file mode 100755 index 0000000..eb6f862 --- /dev/null +++ b/scripts/exynos_mkdzimage.sh @@ -0,0 +1,196 @@ +#!/bin/bash + + +## Functions +function write_to_4bytes_binary() +{ + HEX=`echo "obase=16; $1" | bc` + + NUM=$((8-${#HEX})) + + ZERO="00000000" + SUB=${ZERO:0:$NUM} + + HEX=$SUB$HEX + + for str in $(echo $HEX | sed 's/../& /g' | rev); do + str=$(echo -en $str | rev) + echo -en "\x$str" + done > $2 +} + +function write_to_padding_binary() +{ + rm -f padding + + PAD_SIZE=$(($(($PAD - $(($1 % $PAD)))) % $PAD)) + if [ $PAD_SIZE -gt 0 ]; then + dd if=/dev/zero of=./padding bs=1 count=$PAD_SIZE 2>/dev/zero + else + touch padding + fi + + echo -en " | PAD: $PAD_SIZE[B]\n" +} + +function help() { + echo "sprd_mkdzimage.sh [OPTIONS] -o -k " + echo " options:" + echo " --output-file/-o output file" + echo " --kernel/-k kernel file" + echo " --devicetree/-d devicetree file" + echo " --help/-h this help screen" + exit 0 +} + + +## Defines +OUT="dzImage" +OUT_TMP="dzImage.tmp" +OUT_DIR="./arch/arm/boot" + +MAGIC="NZIT" # 0x54495A4E +KERNEL_ADDR=32768 # 0x00008000 +ATAGS_ADDR=31457280 # 0x01e00000 + +PAD=2048 + + +if [ "$#" -eq "0" ]; then + help +fi + + +## Input parameters +params="$(getopt -o o:k:d:h -l output-file:,:kernel:,devicetree:,help --name "$0" -- "$@")" +eval set -- "$params" +while true +do + case "$1" in + -o|--output-file) + OUTPUT_FILE=$2 + shift 2 + OUT_DIR=`dirname $OUTPUT_FILE` + if [ ! -d "$OUT_DIR" ]; then + echo "invalid output path '$OUT_DIR'." + exit 1 + fi + OUT=${OUTPUT_FILE#${OUT_DIR}} + OUT=${OUT//\//} + OUT_TMP=${OUT}.tmp + ;; + -k|--kernel) + KERNEL=$2 + shift 2 + ;; + -d|--devicetree) + DEVICETREE=$2 + shift 2 + ;; + -h|--help) + help + ;; + --) + shift + break + ;; + *) + help + ;; + esac +done + +if [ "z${KERNEL}" == "z" ] || [ "z${DEVICETREE}" == "z" ]; then + help +fi + +if [ ! -e "${KERNEL}" ]; then + echo -en "kernel '${KERNEL}' not found.\nexit\n" + exit -1 +fi + +if [ ! -e "${DEVICETREE}" ]; then + echo -en "devicetree '${DEVICETREE}' not found.\nexit\n" + exit -1 +fi + + +## Header +rm -f $OUT +rm -f $OUT_TMP +touch $OUT_TMP + +HEADER_SIZE=28 + +echo -en " *HEADER " +echo -en "$HEADER_SIZE[B]\n" + +echo -en $MAGIC > $OUT +cat $OUT >> $OUT_TMP +write_to_4bytes_binary $KERNEL_ADDR $OUT +cat $OUT >> $OUT_TMP + +FILE="${KERNEL}" +SIZE=`du -b $FILE | awk '{print $1}'` +write_to_4bytes_binary $SIZE $OUT +cat $OUT >> $OUT_TMP + +DTB_ADDR=$(($KERNEL_ADDR + $SIZE)) +write_to_4bytes_binary $DTB_ADDR $OUT +cat $OUT >> $OUT_TMP + +FILE="${DEVICETREE}" +SIZE=`du -b $FILE | awk '{print $1}'` +write_to_4bytes_binary $SIZE $OUT +cat $OUT >> $OUT_TMP + +write_to_4bytes_binary $ATAGS_ADDR $OUT +cat $OUT >> $OUT_TMP +write_to_4bytes_binary $PAD $OUT +cat $OUT >> $OUT_TMP + +write_to_padding_binary $HEADER_SIZE +cat $OUT_TMP padding > $OUT + + +## Kernel Binary +FILE="${KERNEL}" +FILE_PATH=`dirname ${KERNEL}` +FILE_NAME=${FILE#${FILE_PATH}} +FILE_NAME=${FILE_NAME//\//} + +echo -en " *${FILE_NAME} " +cat $OUT $FILE > $OUT_TMP + +SIZE=`du -b $FILE | awk '{print $1}'` +echo -en "$SIZE[B]\n" + +write_to_padding_binary $SIZE +cat $OUT_TMP padding > $OUT + + +## Devicetree Binary +FILE="${DEVICETREE}" +FILE_PATH=`dirname ${DEVICETREE}` +FILE_NAME=${FILE#${FILE_PATH}} +FILE_NAME=${FILE_NAME//\//} + +echo -en " *${FILE_NAME} " +cat $OUT $FILE > $OUT_TMP + +SIZE=`du -b $FILE | awk '{print $1}'` +echo -en "$SIZE[B]\n" + +write_to_padding_binary $SIZE +cat $OUT_TMP padding > $OUT + + +## END +rm -f $OUT_TMP +rm -f padding +rm -f $OUT_DIR/$OUT +mv -f $OUT $OUT_DIR/ + +S=`du -b $OUT_DIR/$OUT | awk '{print $1}'` +S_K=$(($S/1024)) +echo -en "## OUT: $OUT size: $S[B]; $S_K[KB]\n" -- 2.7.4