packaging: install license for rpm package instead of license package
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / scripts / sprd_dtbtool.sh
1 #!/bin/bash
2
3
4 ## Functions
5 function write_hex_to_4bytes_binary()
6 {
7         HEX=$1
8
9         HEX=${HEX#0x}
10         NUM=$((8-${#HEX}))
11
12         ZERO="00000000"
13         SUB=${ZERO:0:$NUM}
14
15         HEX=$SUB$HEX
16
17         for str in $(echo $HEX | sed 's/../& /g' | rev); do
18                 str=$(echo -en $str | rev)
19                 echo -en "\x$str"
20         done > $2
21 }
22
23 function write_to_4bytes_binary()
24 {
25         HEX=`echo "obase=16; $1" | bc`
26
27         write_hex_to_4bytes_binary $HEX $2
28 }
29
30 function write_to_padding_binary()
31 {
32         rm -f padding
33
34         PAD_SIZE=$(($(($PAD - $(($1 % $PAD)))) % $PAD))
35         if [ $PAD_SIZE -gt 0 ]; then
36                 dd if=/dev/zero of=./padding bs=1 count=$PAD_SIZE 2>/dev/zero
37         else
38                 touch padding
39         fi
40
41         if [ "${VERBOSE}" -eq "1" ]; then
42                 echo -en " | PAD: $PAD_SIZE[B]\n"
43         fi
44 }
45
46 function get_dtb_size()
47 {
48         SIZE=`du -b $1 | awk '{print $1}'`
49         PAD_SIZE=$(($(($PAD - $(($SIZE % $PAD)))) % $PAD))
50         DTB_SIZE=$(($SIZE + $PAD_SIZE))
51 }
52
53 function help() {
54         echo "sprd_dtbtool.sh [OPTIONS] -o <output file> <input DTB path>"
55         echo "  options:"
56         echo "  --output-file/-o    output file"
57         echo "  --dtc-path/-p       path to dtc"
58         echo "  --page-size/-s      page size in bytes"
59         echo "  --verbose/-v        verbose"
60         echo "  --help/-h           this help screen"
61         exit 0
62 }
63
64
65 ## Defines
66 OUT="merged-dtb"
67 OUT_TMP="multi.tmp"
68
69 OUT_DIR="./arch/arm/boot"
70 DTC_PATH=scripts/dtc
71
72 SPRD_MAGIC="SPRD"
73 SPRD_VERSION=1
74 SPRD_TAG="sprd,sc-id"
75
76 ENDOFHEADER=0
77
78 let MAX_PAD_SIZE=1024*1024
79 PAD=2048
80 VERBOSE=0
81
82 if [ "$#" -eq "0" ]; then
83         help
84 fi
85
86
87 ## Input parameters
88 params="$(getopt -o o:p:s:vh -l output-file:,dtc-path:,page-size:,verbose,help --name "$0" -- "$@")"
89 eval set -- "$params"
90 while true
91 do
92         case "$1" in
93                 -o|--output-file)
94                         OUTPUT_FILE=$2
95                         shift 2
96                         OUT_DIR=`dirname $OUTPUT_FILE`
97                         if [ ! -d "$OUT_DIR" ]; then
98                                 echo "invalid output path '$OUT_DIR'."
99                                 exit 1
100                         fi
101                         OUT=${OUTPUT_FILE#${OUT_DIR}}
102                         OUT=${OUT//\//}
103                         OUT_TMP=${OUT}.tmp
104                         ;;
105                 -p|--dtc-path)
106                         DTC_PATH=$2
107                         shift 2
108                         ;;
109                 -s|--page-size)
110                         PAD=$2
111                         shift 2
112                         R=${PAD#-}
113                         R=${R//[0-9]/}
114                         # page size should be number, and larger than 0, and smaller than 1024*1024
115                         if [ ! -z "$R" ] || [ "$PAD" -lt "0" ] || [ "$PAD" -gt "$MAX_PAD_SIZE" ]; then
116                                 echo "invalid page size."
117                                 exit 1
118                         fi
119                         ;;
120                 -v|--verbose)
121                         VERBOSE=1
122                         shift
123                         ;;
124                 -h|--help)
125                         help
126                         ;;
127                 --)
128                         shift
129                         break
130                         ;;
131                 *)
132                         help
133                         ;;
134         esac
135 done
136
137 if [ "$#" -eq "0" ]; then
138         help
139 fi
140
141 DTS_DIR=$1
142 DTS_DIR=${DTS_DIR%\/}
143 if [ ! -d "$DTS_DIR" ]; then
144         echo "invalid DTB input path '$DTS_DIR'."
145         exit 1
146 else
147         DTB=(`find ${DTS_DIR} -name "*.dtb"`)
148         for i in ${DTB[*]}; do
149                 if [ -e $i ]; then
150                         TAG_CHECK=`${DTC_PATH}/dtc -I dtb -O dts $i 2>/dev/null | grep "${SPRD_TAG}"`
151                         if [ "z${TAG_CHECK}" == "z" ]; then
152                                 # no tag in the dtb file
153                                 DTB=(${DTB[@]/$i})
154                         fi
155                 fi
156         done
157 fi
158
159 if [ ! -f "$DTC_PATH/dtc" ]; then
160         echo "no DTC file in '$DTC_PATH'."
161         exit 1
162 fi
163
164 if [ "${VERBOSE}" -eq "1" ]; then
165         echo "DTB input path is '${DTS_DIR}'"
166         echo "output path is '${OUT_DIR}', output file is '${OUT}'"
167         echo "page size is '${PAD}'"
168 fi
169
170
171 ## Header
172 rm -f $OUT
173 rm -f $OUT_TMP
174 touch $OUT_TMP
175
176 DTB_CNT=${#DTB[@]}
177 HEADER_SIZE=$((12 + 20 * $DTB_CNT + 4))
178 DTB_OFFSET=$PAD
179
180 if [ "${VERBOSE}" -eq "1" ]; then
181         echo -en " *HEADER "
182         echo -en "$HEADER_SIZE[B]\n"
183 fi
184
185 echo -en $SPRD_MAGIC > $OUT
186 cat $OUT >> $OUT_TMP
187 write_to_4bytes_binary $SPRD_VERSION $OUT
188 cat $OUT >> $OUT_TMP
189 write_to_4bytes_binary $DTB_CNT $OUT
190 cat $OUT >> $OUT_TMP
191
192 for i in ${DTB[*]}; do
193         FILE="$i"
194         if [ -e $FILE ]; then
195                 TAG_CHECK=`${DTC_PATH}/dtc -I dtb -O dts $i 2>/dev/null | grep "${SPRD_TAG}"`
196                 TAG_CHECK=${TAG_CHECK#*<}
197                 TAG_CHECK=${TAG_CHECK%>*}
198                 CHIPSET=`echo ${TAG_CHECK} | awk '{ print $1 }'`
199                 PLATFORM=`echo ${TAG_CHECK} | awk '{ print $2 }'`
200                 REV=`echo ${TAG_CHECK} | awk '{ print $3 }'`
201
202                 write_hex_to_4bytes_binary $CHIPSET $OUT
203                 cat $OUT >> $OUT_TMP
204
205                 write_hex_to_4bytes_binary $PLATFORM $OUT
206                 cat $OUT >> $OUT_TMP
207
208                 write_hex_to_4bytes_binary $REV $OUT
209                 cat $OUT >> $OUT_TMP
210
211                 write_to_4bytes_binary $DTB_OFFSET $OUT
212                 cat $OUT >> $OUT_TMP
213
214                 get_dtb_size $FILE
215                 write_to_4bytes_binary $DTB_SIZE $OUT
216                 cat $OUT >> $OUT_TMP
217
218                 DTB_OFFSET=$(($DTB_OFFSET + $DTB_SIZE))
219         else
220                 echo -en "$i not found.\nexit\n"
221                 exit -1
222         fi
223 done
224
225 write_to_4bytes_binary $ENDOFHEADER $OUT
226 cat $OUT >> $OUT_TMP
227
228 write_to_padding_binary $HEADER_SIZE
229 cat $OUT_TMP padding > $OUT
230
231
232 ## DTB
233 for i in ${DTB[*]}; do
234         FILE="$i"
235         if [ -e $FILE ]; then
236                 NAME=`echo $i`
237                 SIZE=`du -b $FILE | awk '{print $1}'`
238
239                 cat $OUT $FILE > $OUT_TMP
240                 if [ "${VERBOSE}" -eq "1" ]; then
241                         echo -en " *$NAME "
242                         echo -en "$SIZE[B]\n"
243                 fi
244
245                 write_to_padding_binary $SIZE
246                 cat $OUT_TMP padding > $OUT
247         else
248                 echo -en "$i not found.\nexit\n"
249                 exit -1
250         fi
251 done
252
253
254 ## End
255 rm -f $OUT_TMP
256 rm -f padding
257 rm -f $OUT_DIR/$OUT
258 mv -f $OUT $OUT_DIR/
259
260 S=`du -b $OUT_DIR/$OUT | awk '{print $1}'`
261 S_K=$(($S/1024))
262 if [ "${VERBOSE}" -eq "1" ]; then
263         echo -en "## OUT: $OUT size: $S[B]; $S_K[KB]\n"
264 fi
265 echo "$OUT_DIR/$OUT (size: ${S_K}KB) is created."