xref: /OK3568_Linux_fs/tools/linux/Linux_Diff_Firmware/mk-diff-ota.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/bin/bash
2
3OLD_IMG=$1
4NEW_IMG=$2
5DIFF_IMG=$3
6
7if [ x$OLD_IMG = x"" -o x$NEW_IMG = x"" -o x$DIFF_IMG = x"" ]; then
8  echo "Usage: $0 [old_img] [new_img] [diff_img]"
9  exit 1
10fi
11
12echo "To differ image from OLD: $1 and NEW: $2"
13
14echo_red()
15{
16  echo -e "\033[31m$1\033[0m"
17}
18
19DIR=$(cd $(dirname $0); pwd)
20export PATH=$PATH:"$DIR"
21
22check_tool()
23{
24  which "$1" &> /dev/null
25  if [ $? -ne 0 ]; then
26    echo "command: $1 not found!"
27    exit 1;
28  fi
29}
30
31get_fs_type()
32{
33  file_info=$(file -b $1)
34  if [[ "$file_info" == *"Squashfs"* ]]; then
35    echo -n Squashfs
36  elif [[ "$file_info" == *"ext4"* ]]; then
37    echo -n ext4
38  else
39    echo -n unsupported
40  fi
41}
42
43check_tool bsdiff
44check_tool rkImageMaker
45check_tool afptool
46check_tool md5sum
47
48OLD_DIR=$(mktemp -d --suffix=-OLD -p ${DIR})
49NEW_DIR=$(mktemp -d --suffix=-NEW -p ${DIR})
50DIFF_DIR=$(mktemp -d --suffix=-DIFF -p ${DIR})
51
52cleanup()
53{
54  echo -e "\033[41;33m $1 \033[0m"
55  exit 1
56}
57
58#
59get_chip_from_parameter()
60{
61  parameter=$1
62
63  chip=$(eval echo $(grep -h "MACHINE_MODEL" $parameter | cut -f2 -d':' | tr 'a-z' 'A-Z'))
64  case $chip in
65    PX30 | RK3358)
66      echo -n -RKPX30
67      ;;
68    RK1808 | RK3399PRO_NPU)
69      echo -n -RK180A
70      ;;
71    RK3036)
72      echo -n -RK303A
73      ;;
74    RK3126 | RK3128)
75      echo -n -RK312A
76      ;;
77    RK3128H)
78      echo -n -RK312X
79      ;;
80    RK3229)
81      echo -n -RK3229
82      ;;
83    RK3288)
84      echo -n -RK320A
85      ;;
86    RK3308)
87      echo -n -RK3308
88      ;;
89    RK3326)
90      echo -n -RK3326
91      ;;
92    RK3328)
93      echo -n -RK322H
94      ;;
95    RK3399)
96      echo -n -RK330C
97      ;;
98    RK3568)
99      echo -n -RK3568
100      ;;
101    RK3566)
102      echo -n -RK3568
103      ;;
104    RK3562)
105      echo -n -RK3562
106      ;;
107    RK3588)
108      echo -n -RK3588
109      ;;
110    RV1126)
111      echo -n -RK1126
112      ;;
113    *)
114      cleanup "Bad MACHINE_MODEL: $chip in parameter.txt"
115  esac
116}
117
118# diff_img <name> <old_file> <new_file> <diff_file>
119diff_img()
120{
121  name=$1
122  diff=$4
123  old=$2
124  new=$3
125  old_size=$(stat --printf=%s $old)
126  new_size=$(stat --printf=%s $new)
127  md5sum=$(md5sum $new | cut -f 1 -d ' ')
128
129  echo_red "Diff ${NAME}..."
130  sec_1=$(date +%s)
131  bsdiff "$old" "$new" "${diff}" || cleanup "bsdiff $new: $?"
132  sec_2=$(date +%s)
133  # MAGIC HEADER 80 bytes
134  printf "DIFF:%-15s:%-12s:%-12s:%-32s:" $name $old_size $new_size $md5sum  >> "${diff}"
135  echo_red "Diff ${NAME} use $((($sec_2 - $sec_1)/3600))h:$((($sec_2 - $sec_1)%3600/60))m:$((($sec_2 - $sec_1)%60))s"
136}
137
138echo "Unpacking old image: ${OLD_IMG}"
139rkImageMaker -unpack ${OLD_IMG} ${OLD_DIR} || cleanup "rkImageMaker unpack: $?"
140afptool -unpack ${OLD_DIR}/firmware.img ${OLD_DIR} || cleanup "afptool unpack: $?"
141
142echo "Unpacking new image: ${NEW_IMG}"
143rkImageMaker -unpack ${NEW_IMG} ${NEW_DIR} || cleanup "rkImageMaker unpack: $?"
144afptool -unpack ${NEW_DIR}/firmware.img ${NEW_DIR} || cleanup "afptool unpack: $?"
145
146# TODO: a/b image is not yet supported, warning
147
148mkdir ${DIFF_DIR}/Image
149
150# Copy parameter/loader to target dir
151cp ${NEW_DIR}/package-file ${DIFF_DIR}/
152cp ${NEW_DIR}/MiniLoaderAll.bin ${DIFF_DIR}/
153cp ${NEW_DIR}/MiniLoaderAll.bin ${DIFF_DIR}/Image
154cp ${NEW_DIR}/parameter.txt ${DIFF_DIR}/
155cp ${NEW_DIR}/parameter.txt ${DIFF_DIR}/Image
156
157while read LINE; do
158  # delete any blank at beginning or "#" line
159  STRIP=$(eval echo "$LINE")
160  if [[ $STRIP = "" ]]; then
161    continue
162  fi
163
164  # get the paratition name by deleting the chars after [[:blank:]]
165  NAME=${STRIP/%[[:blank:]]*/}
166  IMG=${STRIP/#*[[:blank:]]/}
167
168  if [[ $NAME = "backup" ]]; then
169    echo_red "Skip backup, it's not a real image"
170    continue
171  fi
172
173  if [ $NAME = "package-file" -o $NAME = "parameter" -o $NAME = "bootloader" ]; then
174    echo_red "Copy ${IMG}"
175    # Already copied
176    continue
177  fi
178
179  if [ ! -f ${OLD_DIR}/${IMG} ]; then
180    echo_red "Copy ${IMG}, there's not corresponding old file"
181    ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
182    continue
183  fi
184
185  case ${NAME} in
186    uboot | trust | boot)
187      diff_img $NAME ${OLD_DIR}/${IMG} ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
188      ;;
189    rootfs)
190      fs_new=$(get_fs_type ${NEW_DIR}/${IMG})
191      fs_old=$(get_fs_type ${OLD_DIR}/${IMG})
192
193      if [ $fs_new != $fs_old ]; then
194        echo_red "Copy ${IMG}, root fs type are different: $fs_old vs $fs_new"
195        ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
196      elif [ $fs_new != "Squashfs" ]; then
197        echo_red "Copy ${IMG}, $fs_new not supported"
198        ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
199      else
200        diff_img $NAME ${OLD_DIR}/${IMG} ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
201      fi
202      ;;
203    *)
204      echo_red "Copy ${IMG}"
205      ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG}
206      ;;
207  esac
208done < ${NEW_DIR}/package-file
209
210afptool -pack ${DIFF_DIR} ${DIFF_DIR}/Image/update.img || cleanup "afptool pack: $?"
211rkImageMaker $(get_chip_from_parameter ${DIFF_DIR}/parameter.txt) \
212  ${DIFF_DIR}/Image/MiniLoaderAll.bin \
213  ${DIFF_DIR}/Image/update.img \
214  ${DIFF_IMG} -os_type:androidos || cleanup "rkImageMaker pack: $?"
215
216#rm -rf ${DIFF_DIR} ${NEW_DIR} ${OLD_DIR}
217
218echo_red "Make diff ${DIFF_IMG} Finished"
219