scripts: add sprd_dtbtool.sh 53/84953/1
authorJoonyoung Shim <jy0922.shim@samsung.com>
Thu, 18 Aug 2016 08:52:44 +0000 (17:52 +0900)
committerJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 23 Aug 2016 00:46:11 +0000 (09:46 +0900)
sprd_dtbtool.sh is script file to make to one merged-dtb binary from
multi dtb binaries for TM1. This will substitute dtbtool binary of
system-tools.

Change-Id: I69b73426ee43e0a5de3d6b4f5a28ec8965da5c6d
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
scripts/sprd_dtbtool.sh [new file with mode: 0755]

diff --git a/scripts/sprd_dtbtool.sh b/scripts/sprd_dtbtool.sh
new file mode 100755 (executable)
index 0000000..14a1f36
--- /dev/null
@@ -0,0 +1,152 @@
+#!/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 get_dtb_size()
+{
+       SIZE=`du -b $1 | awk '{print $1}'`
+       PAD_SIZE=$(($(($PAD - $(($SIZE % $PAD)))) % $PAD))
+       DTB_SIZE=$(($SIZE + $PAD_SIZE))
+}
+
+
+## Defines
+OUT="merged-dtb"
+OUT_TMP="multi.tmp"
+
+OUT_DIR="./arch/arm/boot"
+DTS_DIR="./arch/arm/boot/dts"
+
+SPRD_MAGIC="SPRD"
+SPRD_VERSION=1
+
+DTB=(
+"sprd-scx35-tizen_z3-r00.dtb"
+"sprd-scx35-tizen_z3-r01.dtb"
+"sprd-scx35-tizen_z3-r02.dtb"
+"sprd-scx35-tizen_z3-r03.dtb"
+)
+DTB_CNT=4
+
+CHIPSET=8830
+PLATFORM=0
+REV=131072
+DTB_OFFSET=2048
+
+ENDOFHEADER=0
+
+PAD=2048
+
+
+## Header
+rm -f $OUT
+rm -f $OUT_TMP
+touch $OUT_TMP
+
+HEADER_SIZE=$((12 + 20 * $DTB_CNT + 4))
+
+echo -en " *HEADER "
+echo -en "$HEADER_SIZE[B]\n"
+
+echo -en $SPRD_MAGIC > $OUT
+cat $OUT >> $OUT_TMP
+write_to_4bytes_binary $SPRD_VERSION $OUT
+cat $OUT >> $OUT_TMP
+write_to_4bytes_binary $DTB_CNT $OUT
+cat $OUT >> $OUT_TMP
+
+for i in ${DTB[*]}; do
+       FILE="$DTS_DIR/$i"
+       if [ -e $FILE ]; then
+               write_to_4bytes_binary $CHIPSET $OUT
+               cat $OUT >> $OUT_TMP
+
+               write_to_4bytes_binary $PLATFORM $OUT
+               cat $OUT >> $OUT_TMP
+               PLATFORM=$(($PLATFORM + 1))
+
+               write_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="$DTS_DIR/$i"
+       if [ -e $FILE ]; then
+               NAME=`echo $i`
+               echo -en " *$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
+       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))
+echo -en "## OUT: $OUT size: $S[B]; $S_K[K]\n"