tizen: packaging: Repackage 64-bit rpi4 bootloader for use in mixed 64-bit boot/32...
[platform/kernel/u-boot.git] / scripts / tizen / sd_fusing_xu4.sh
1 #!/bin/bash
2
3 declare FORMAT=""
4 declare DEVICE=""
5
6 # Binaires array for fusing
7 declare -a FUSING_BINARY_ARRAY
8 declare -i FUSING_BINARY_NUM=0
9
10 declare CONV_ASCII=""
11 declare -i FUS_ENTRY_NUM=0
12
13 # binary name | part number | offset | bs
14 declare -a PART_TABLE=(
15         "bl1.bin.hardkernel"            ""      1       512
16         "bl2.bin.hardkernel.1mb_uboot"  ""      31      512
17         "u-boot-mmc.bin"                ""      63      512
18         "tzsw.bin.hardkernel"           ""      2111    512
19         "params.bin"                    ""      6272    512
20         "boot.img"                      1       0       512
21         "rootfs.img"                    2       0       4M
22         "system-data.img"               3       0       4M
23         "user.img"                      5       0       4M
24         "modules.img"                   6       0       512
25         "ramdisk.img"                   7       0       512
26         )
27
28 declare -r -i PART_TABLE_COL=4
29 declare -r -i PART_TABLE_ROW=${#PART_TABLE[*]}/${PART_TABLE_COL}
30
31 # partition table support
32 function get_index_use_name () {
33         local -r binary_name=$1
34
35         for ((idx=0;idx<$PART_TABLE_ROW;idx++)); do
36                 if [ ${PART_TABLE[idx * ${PART_TABLE_COL} + 0]} == $binary_name ]; then
37                         return $idx
38                 fi
39         done
40
41         # return out of bound index
42         return $idx
43 }
44
45 # fusing feature
46 function convert_num_to_ascii () {
47         local number=$1
48
49         CONV_ASCII=$(printf \\$(printf '%03o' $number))
50 }
51
52 function print_message () {
53         local color=$1
54         local message=$2
55
56         tput setaf $color
57         tput bold
58         echo ""
59         echo $message
60         tput sgr 0
61 }
62
63 function add_fusing_entry () {
64         local name=$1
65         local offset=$2
66         local size=$3
67
68         FUS_ENTRY_NUM=$((FUS_ENTRY_NUM + 1))
69
70         echo -n "$name" > entry_name
71         cat entry_name /dev/zero | head -c 32 >> entry
72
73         echo -n "" > entry_offset
74         for ((i=0; i < 4; i++))
75         do
76                 declare -i var;
77                 var=$(( ($offset >> (i*8)) & 0xFF ))
78                 convert_num_to_ascii $var
79                 echo -n $CONV_ASCII > tmp
80                 cat tmp /dev/zero | head -c 1 >> entry_offset
81         done
82         cat entry_offset /dev/zero | head -c 4 >> entry
83
84         echo -n "" > entry_size
85         for ((i=0; i < 4; i++))
86         do
87                 declare -i var;
88                 var=$(( ($size >> (i*8)) & 0xFF ))
89                 convert_num_to_ascii $var
90                 echo -n $CONV_ASCII > tmp
91                 cat tmp /dev/zero | head -c 1 >> entry_size
92         done
93         cat entry_size /dev/zero | head -c 4 >> entry
94
95         rm tmp
96         rm entry_name
97         rm entry_offset
98         rm entry_size
99 }
100
101 function fusing_image () {
102         local -r fusing_img=$1
103
104         # get binary info using basename
105         get_index_use_name $(basename $fusing_img)
106         local -r -i part_idx=$?
107
108         if [ $part_idx -ne $PART_TABLE_ROW ];then
109                 local -r device=$DEVICE${PART_TABLE[${part_idx} * ${PART_TABLE_COL} + 1]}
110                 local -r seek=${PART_TABLE[${part_idx} * ${PART_TABLE_COL} + 2]}
111                 local -r bs=${PART_TABLE[${part_idx} * ${PART_TABLE_COL} + 3]}
112         else
113                 echo "Not supported binary: $fusing_img"
114                 return
115         fi
116
117         local -r input_size=`du -b $fusing_img | awk '{print $1}'`
118
119         print_message 2 "[Fusing $1]"
120
121         dd if=$fusing_img | pv -s $input_size | dd of=$device seek=$seek bs=$bs
122
123         if [ $(basename $fusing_img) == "u-boot-mmc.bin" ];then
124                 add_fusing_entry "u-boot" $seek 2048
125         fi
126 }
127
128 function fuse_image_tarball () {
129         local -r filepath=$1
130         local -r temp_dir="tar_tmp"
131
132         mkdir -p $temp_dir
133         tar xvf $filepath -C $temp_dir
134         cd $temp_dir
135
136         for file in *
137         do
138                 fusing_image $file
139         done
140
141         cd ..
142         rm -rf $temp_dir
143 }
144
145 function check_binary_format () {
146         local -r binary=$1
147
148         case "$binary" in
149         *.tar | *.tar.gz)
150                 fuse_image_tarball $binary
151                 eval sync
152                 ;;
153         *)
154                 fusing_image $binary
155                 eval sync
156                 ;;
157         esac
158 }
159
160 function fuse_image () {
161         if [ "$FUSING_BINARY_NUM" == 0 ]; then
162                 return
163         fi
164
165         for ((fuse_idx = 0 ; fuse_idx < $FUSING_BINARY_NUM ; fuse_idx++))
166         do
167                 local filename=${FUSING_BINARY_ARRAY[fuse_idx]}
168
169                 case "$filename" in
170                 *.tar | *.tar.gz)
171                         fuse_image_tarball $filename
172                         ;;
173                 *)
174                         fusing_image $filename
175                         ;;
176                 esac
177         done
178         echo ""
179 }
180
181 # partition format
182 function mkpart_3 () {
183         # NOTE: if your sfdisk version is less than 2.26.0, then you should use following sfdisk command:
184         # sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
185         #
186         # NOTE: sfdisk 2.26 doesn't support units other than sectors and marks --unit option as deprecated.
187         # The input data needs to contain multipliers (MiB) instead.
188         local version=`sfdisk -v | awk '{print $4}'`
189         local major=${version%%.*}
190         local version=${version:`expr index $version .`}
191         local minor=${version%%.*}
192         local sfdisk_new=0
193
194         if [ $major -gt 2 ];  then
195                 sfdisk_new=1
196         else
197                 if [ $major -eq 2 -a $minor -ge 26 ];  then
198                         sfdisk_new=1
199                 fi
200         fi
201
202         local -r DISK=$DEVICE
203         local -r SIZE=`sfdisk -s $DISK`
204         local -r SIZE_MB=$((SIZE >> 10))
205
206         local -r BOOT_SZ=64
207         local -r ROOTFS_SZ=3072
208         local -r DATA_SZ=512
209         local -r MODULE_SZ=32
210         local -r RAMDISK_SZ=8
211         if [ $sfdisk_new == 1 ]; then
212                 local -r EXTEND_SZ=8
213         else
214                 local -r EXTEND_SZ=4
215         fi
216
217         let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ - $DATA_SZ - $MODULE_SZ - $EXTEND_SZ - $RAMDISK_SZ"
218
219         local -r BOOT=boot
220         local -r ROOTFS=rootfs
221         local -r SYSTEMDATA=system-data
222         local -r USER=user
223         local -r MODULE=modules
224         local -r RAMDISK=ramdisk
225
226         if [[ $USER_SZ -le 100 ]]
227         then
228                 echo "We recommend to use more than 4GB disk"
229                 exit 0
230         fi
231
232         echo "========================================"
233         echo "Label          dev           size"
234         echo "========================================"
235         echo $BOOT"             " $DISK"1       " $BOOT_SZ "MB"
236         echo $ROOTFS"           " $DISK"2       " $ROOTFS_SZ "MB"
237         echo $SYSTEMDATA"       " $DISK"3       " $DATA_SZ "MB"
238         echo "[Extend]""        " $DISK"4"
239         echo " "$USER"          " $DISK"5       " $USER_SZ "MB"
240         echo " "$MODULE"                " $DISK"6       " $MODULE_SZ "MB"
241         echo " "$RAMDISK"               " $DISK"7       " $RAMDISK_SZ "MB"
242
243         local MOUNT_LIST=`mount | grep $DISK | awk '{print $1}'`
244         for mnt in $MOUNT_LIST
245         do
246                 umount $mnt
247         done
248
249         echo "Remove partition table..."
250         dd if=/dev/zero of=$DISK bs=512 count=16 conv=notrunc
251
252         if [ $sfdisk_new == 1 ]; then
253                 sfdisk $DISK <<-__EOF__
254                 4MiB,${BOOT_SZ}MiB,0xE,*
255                 8MiB,${ROOTFS_SZ}MiB,,-
256                 8MiB,${DATA_SZ}MiB,,-
257                 8MiB,,E,-
258                 ,${USER_SZ}MiB,,-
259                 ,${MODULE_SZ}MiB,,-
260                 ,${RAMDISK_SZ}MiB,,-
261                 __EOF__
262         else
263                 sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
264                 4,$BOOT_SZ,0xE,*
265                 ,$ROOTFS_SZ,,-
266                 ,$DATA_SZ,,-
267                 ,,E,-
268                 ,$USER_SZ,,-
269                 ,$MODULE_SZ,,-
270                 ,$RAMDISK_SZ,,-
271                 __EOF__
272         fi
273
274         mkfs.vfat -F 16 ${DISK}1 -n $BOOT
275         mkfs.ext4 -q ${DISK}2 -L $ROOTFS -F
276         mkfs.ext4 -q ${DISK}3 -L $SYSTEMDATA -F
277         mkfs.ext4 -q ${DISK}5 -L $USER -F
278         mkfs.ext4 -q ${DISK}6 -L $MODULE -F
279         mkfs.ext4 -q ${DISK}7 -L $RAMDISK -F
280 }
281
282 function show_usage () {
283         echo "- Usage:"
284         echo "  sudo ./sd_fusing_xu4.sh -d <device> [-b <path> <path> ..] [--format]"
285 }
286
287 function check_partition_format () {
288         if [ "$FORMAT" != "2" ]; then
289                 echo "-----------------------"
290                 echo "Skip $DEVICE format"
291                 echo "-----------------------"
292                 return 0
293         fi
294
295         echo "-------------------------------"
296         echo "Start $DEVICE format"
297         echo ""
298         mkpart_3
299         echo "End $DEVICE format"
300         echo "-------------------------------"
301         echo ""
302 }
303
304 function check_args () {
305         if [ "$DEVICE" == "" ]; then
306                 echo "$(tput setaf 1)$(tput bold)- Device node is empty!"
307                 show_usage
308                 tput sgr 0
309                 exit 0
310         fi
311
312         if [ "$DEVICE" != "" ]; then
313                 echo "Device: $DEVICE"
314         fi
315
316         if [ "$FUSING_BINARY_NUM" != 0 ]; then
317                 echo "Fusing binary: "
318                 for ((bid = 0 ; bid < $FUSING_BINARY_NUM ; bid++))
319                 do
320                         echo "  ${FUSING_BINARY_ARRAY[bid]}"
321                 done
322                 echo ""
323         fi
324
325         if [ "$FORMAT" == "1" ]; then
326                 echo ""
327                 echo "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/n]"
328                 tput sgr 0
329                 read input
330                 if [ "$input" == "y" ] || [ "$input" == "Y" ]; then
331                         FORMAT=2
332                 else
333                         FORMAT=0
334                 fi
335         fi
336 }
337
338 function print_logo () {
339         echo ""
340         echo "[Odroid-XU3/4 downloader]"
341         echo "This version also supports Tizen 4.0."
342         echo ""
343 }
344
345 print_logo
346
347 function add_fusing_binary() {
348         local declare binary_name=$1
349         FUSING_BINARY_ARRAY[$FUSING_BINARY_NUM]=$binary_name
350
351         FUSING_BINARY_NUM=$((FUSING_BINARY_NUM + 1))
352 }
353
354 declare -i binary_option=0
355
356 while test $# -ne 0; do
357         option=$1
358         shift
359
360         case $option in
361         --f | --format)
362                 FORMAT="1"
363                 binary_option=0
364                 ;;
365         -d)
366                 DEVICE=$1
367                 binary_option=0
368                 shift
369                 ;;
370         -b)
371                 add_fusing_binary $1
372                 binary_option=1
373                 shift
374                 ;;
375         *)
376                 if [ $binary_option == 1 ];then
377                         add_fusing_binary $option
378                 else
379                         echo "Unkown command: $option"
380                         exit
381                 fi
382                 ;;
383         esac
384 done
385
386 check_args
387 check_partition_format
388 fuse_image