scripts: add sprd_dtbtool.sh
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / scripts / sprd_dtbtool.sh
1 #!/bin/bash
2
3
4 ## Functions
5 function write_to_4bytes_binary()
6 {
7         HEX=`echo "obase=16; $1" | bc`
8
9         NUM=$((8-${#HEX}))
10
11         ZERO="00000000"
12         SUB=${ZERO:0:$NUM}
13
14         HEX=$SUB$HEX
15
16         for str in $(echo $HEX | sed 's/../& /g' | rev); do
17                 str=$(echo -en $str | rev)
18                 echo -en "\x$str"
19         done > $2
20 }
21
22 function write_to_padding_binary()
23 {
24         rm -f padding
25
26         PAD_SIZE=$(($(($PAD - $(($1 % $PAD)))) % $PAD))
27         if [ $PAD_SIZE -gt 0 ]; then
28                 dd if=/dev/zero of=./padding bs=1 count=$PAD_SIZE 2>/dev/zero
29         else
30                 touch padding
31         fi
32
33         echo -en " | PAD: $PAD_SIZE[B]\n"
34 }
35
36 function get_dtb_size()
37 {
38         SIZE=`du -b $1 | awk '{print $1}'`
39         PAD_SIZE=$(($(($PAD - $(($SIZE % $PAD)))) % $PAD))
40         DTB_SIZE=$(($SIZE + $PAD_SIZE))
41 }
42
43
44 ## Defines
45 OUT="merged-dtb"
46 OUT_TMP="multi.tmp"
47
48 OUT_DIR="./arch/arm/boot"
49 DTS_DIR="./arch/arm/boot/dts"
50
51 SPRD_MAGIC="SPRD"
52 SPRD_VERSION=1
53
54 DTB=(
55 "sprd-scx35-tizen_z3-r00.dtb"
56 "sprd-scx35-tizen_z3-r01.dtb"
57 "sprd-scx35-tizen_z3-r02.dtb"
58 "sprd-scx35-tizen_z3-r03.dtb"
59 )
60 DTB_CNT=4
61
62 CHIPSET=8830
63 PLATFORM=0
64 REV=131072
65 DTB_OFFSET=2048
66
67 ENDOFHEADER=0
68
69 PAD=2048
70
71
72 ## Header
73 rm -f $OUT
74 rm -f $OUT_TMP
75 touch $OUT_TMP
76
77 HEADER_SIZE=$((12 + 20 * $DTB_CNT + 4))
78
79 echo -en " *HEADER "
80 echo -en "$HEADER_SIZE[B]\n"
81
82 echo -en $SPRD_MAGIC > $OUT
83 cat $OUT >> $OUT_TMP
84 write_to_4bytes_binary $SPRD_VERSION $OUT
85 cat $OUT >> $OUT_TMP
86 write_to_4bytes_binary $DTB_CNT $OUT
87 cat $OUT >> $OUT_TMP
88
89 for i in ${DTB[*]}; do
90         FILE="$DTS_DIR/$i"
91         if [ -e $FILE ]; then
92                 write_to_4bytes_binary $CHIPSET $OUT
93                 cat $OUT >> $OUT_TMP
94
95                 write_to_4bytes_binary $PLATFORM $OUT
96                 cat $OUT >> $OUT_TMP
97                 PLATFORM=$(($PLATFORM + 1))
98
99                 write_to_4bytes_binary $REV $OUT
100                 cat $OUT >> $OUT_TMP
101
102                 write_to_4bytes_binary $DTB_OFFSET $OUT
103                 cat $OUT >> $OUT_TMP
104
105                 get_dtb_size $FILE
106                 write_to_4bytes_binary $DTB_SIZE $OUT
107                 cat $OUT >> $OUT_TMP
108
109                 DTB_OFFSET=$(($DTB_OFFSET + $DTB_SIZE))
110         else
111                 echo -en "$i not found.\nexit\n"
112                 exit -1
113         fi
114 done
115
116 write_to_4bytes_binary $ENDOFHEADER $OUT
117 cat $OUT >> $OUT_TMP
118
119 write_to_padding_binary $HEADER_SIZE
120 cat $OUT_TMP padding > $OUT
121
122
123 ## DTB
124 for i in ${DTB[*]}; do
125         FILE="$DTS_DIR/$i"
126         if [ -e $FILE ]; then
127                 NAME=`echo $i`
128                 echo -en " *$NAME "
129
130                 cat $OUT $FILE > $OUT_TMP
131
132                 SIZE=`du -b $FILE | awk '{print $1}'`
133                 echo -en "$SIZE[B]\n"
134
135                 write_to_padding_binary $SIZE
136                 cat $OUT_TMP padding > $OUT
137         else
138                 echo -en "$i not found.\nexit\n"
139                 exit -1
140         fi
141 done
142
143
144 ## End
145 rm -f $OUT_TMP
146 rm -f padding
147 rm -f $OUT_DIR/$OUT
148 mv -f $OUT $OUT_DIR/
149
150 S=`du -b $OUT_DIR/$OUT | awk '{print $1}'`
151 S_K=$(($S/1024))
152 echo -en "## OUT: $OUT size: $S[B]; $S_K[K]\n"