scripts: tizen: sd_fusing_*.sh: Change a message to notcie
[platform/kernel/u-boot.git] / scripts / tizen / sd_fusing_rpi3.sh
1 #!/bin/bash
2
3 declare FORMAT=""
4 declare DEVICE=""
5 declare -i OLD_DD=0
6
7 # Binaires array for fusing
8 declare -a FUSING_BINARY_ARRAY
9 declare -i FUSING_BINARY_NUM=0
10
11 declare CONV_ASCII=""
12 declare -i FUS_ENTRY_NUM=0
13
14 # binary name | part number | bs | label | fs type
15 declare -a PART_TABLE=(
16         "boot.img"                      1       4M      boot                    vfat
17         "rootfs.img"                    2       4M      rootfs                  ext4
18         "system-data.img"               3       4M      system-data             ext4
19         "user.img"                      5       4M      user                    ext4
20         "modules.img"                   6       4M      modules                 ext4
21         "ramdisk.img"                   7       4M      ramdisk                 ext4
22         "ramdisk-recovery.img"          8       4M      ramdisk-recovery        ext4
23         "hal.img"                       10      4M      hal                     ext4
24         )
25
26 declare -r -i PART_TABLE_COL=5
27 declare -r -i PART_TABLE_ROW=${#PART_TABLE[*]}/${PART_TABLE_COL}
28
29 # partition table support
30 function get_index_use_name () {
31         local -r binary_name=$1
32
33         for ((idx=0;idx<$PART_TABLE_ROW;idx++)); do
34                 if [ ${PART_TABLE[idx * ${PART_TABLE_COL} + 0]} == "$binary_name" ]; then
35                         return $idx
36                 fi
37         done
38
39         # return out of bound index
40         return $idx
41 }
42
43 function print_message () {
44         local color=$1
45         local message=$2
46
47         tput setaf $color
48         tput bold
49         echo ""
50         echo $message
51         tput sgr 0
52 }
53
54 function check_ddversion () {
55         # NOTE
56         # before coreutils dd 8.24, dd doesn't support "status=progress"
57         # and the option causes fusing failure. For backward compatibility,
58         # do not use the option for old dd
59         local version=(`dd --version | head -1 | grep -o '[0-9]\+'`)
60         local major=${version[0]}
61         local minor=${version[1]}
62
63         if [ $major -lt 8 ];  then
64                 OLD_DD=1
65         elif [ $major -eq 8 -a $minor -lt 24 ];  then
66                 OLD_DD=1
67         fi
68 }
69
70 function fusing_image () {
71         local -r fusing_img=$1
72
73         # get binary info using basename
74         get_index_use_name $(basename "$fusing_img")
75         local -r -i part_idx=$?
76
77         if [ $part_idx -ne $PART_TABLE_ROW ];then
78                 local -r num=${PART_TABLE[${part_idx} * ${PART_TABLE_COL} + 1]}
79                 if [ "${num}" == "" ]; then
80                         local -r blktype=disk
81                 else
82                         local -r blktype=part
83                 fi
84                 local -r device=/dev/`lsblk ${DEVICE} -o TYPE,KNAME | awk "/^${blktype}.*[a-z]${num}\$/ { print \\\$2 }"`
85                 local -r bs=${PART_TABLE[${part_idx} * ${PART_TABLE_COL} + 2]}
86         else
87                 echo "Unsupported binary: $fusing_img"
88                 return
89         fi
90
91         if ! [ -b "$device" ]; then
92                 print_message 1 "$device is not a block device."
93                 exit 1
94         fi
95
96         local -r input_size=`du -b $fusing_img | awk '{print $1}'`
97         local -r input_size_mb=`expr $input_size / 1024 / 1024`
98
99         print_message 2 "[Fusing $1 ($input_size_mb MiB)]"
100         if [ "$blktype" == "part" ]; then
101                 local MOUNT_PART=`mount | grep $device`
102                 if [ "$MOUNT_PART" != "" ]; then
103                         umount $device
104                 fi
105         fi
106         if [ $OLD_DD == 1 ]; then
107                 dd if=$fusing_img | pv -s $input_size | dd of=$device bs=$bs
108         else
109                 dd if=$fusing_img of=$device bs=$bs status=progress oflag=direct
110         fi
111
112         local -r fstype=`blkid -o value -s TYPE $device`
113         if [[ "$fstype" =~ "ext" ]]; then
114                 resize2fs -f $device
115         fi
116 }
117
118 function fuse_image_tarball () {
119         local -r filepath=$1
120         local -r temp_dir="tar_tmp"
121
122         mkdir -p $temp_dir
123         tar xvf $filepath -C $temp_dir
124         cd $temp_dir
125
126         for file in *
127         do
128                 fusing_image $file
129         done
130
131         cd ..
132         rm -rf $temp_dir
133         eval sync
134 }
135
136 function fuse_image () {
137
138         if [ "$FUSING_BINARY_NUM" == 0 ]; then
139                 return
140         fi
141
142         for ((fuse_idx = 0 ; fuse_idx < $FUSING_BINARY_NUM ; fuse_idx++))
143         do
144                 local filename=${FUSING_BINARY_ARRAY[fuse_idx]}
145
146                 case "$filename" in
147                     *.tar | *.tar.gz)
148                         fuse_image_tarball $filename
149                         ;;
150                     *)
151                         fusing_image $filename
152                         ;;
153                 esac
154         done
155         echo ""
156 }
157
158 # partition format
159 function mkpart_3 () {
160         # NOTE: if your sfdisk version is less than 2.26.0, then you should use following sfdisk command:
161         # sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
162
163         # NOTE: sfdisk 2.26 doesn't support units other than sectors and marks --unit option as deprecated.
164         # The input data needs to contain multipliers (MiB) instead.
165         local version=(`sfdisk -v | grep -o '[0-9]\+'`)
166         local major=${version[0]}
167         local minor=${version[1]}
168         local sfdisk_new=0
169         local support_delete=0
170         local sfdisk_37=0
171
172         if [ $major -gt 2 ];  then
173                 sfdisk_new=1
174         else
175                 if [ $major -eq 2 -a $minor -ge 26 ];  then
176                         sfdisk_new=1
177                         if [ $major -eq 2 -a $minor -ge 28 ]; then
178                                 support_delete=1
179                         fi
180                         if [ $major -eq 2 -a $minor -ge 37 ]; then
181                                 sfdisk_37=1
182                         fi
183                 fi
184         fi
185
186         if [ $sfdisk_new == 0 ]; then
187                 echo "$(tput setaf 3)$(tput bold)NOTICE: Your sfidk ${version[0]}.${version[1]}  version is too old. It can do unstable behavior!"
188                 tput sgr 0
189                 echo ""
190
191         fi
192
193         local -r DISK=$DEVICE
194         local -r SIZE=`sfdisk -s $DISK`
195         local -r SIZE_MB=$((SIZE >> 10))
196
197         local -r BOOT_SZ=64
198         local -r ROOTFS_SZ=3072
199         local -r DATA_SZ=1344
200         local -r MODULE_SZ=32
201         local -r RAMDISK_SZ=32
202         local -r RAMDISK_RECOVERY_SZ=32
203         local -r INFORM_SZ=8
204         local -r HAL_SZ=256
205         local -r RESERVED2_SZ=125
206         local -r EXTEND_SZ=12
207
208         let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ - $DATA_SZ - $MODULE_SZ - $RAMDISK_SZ - $RAMDISK_RECOVERY_SZ - $INFORM_SZ - $EXTEND_SZ - $HAL_SZ - $RESERVED2_SZ"
209
210         local -r BOOT=${PART_TABLE[0 * ${PART_TABLE_COL} + 3]}
211         local -r ROOTFS=${PART_TABLE[1 * ${PART_TABLE_COL} + 3]}
212         local -r SYSTEMDATA=${PART_TABLE[2 * ${PART_TABLE_COL} + 3]}
213         local -r USER=${PART_TABLE[3 * ${PART_TABLE_COL} + 3]}
214         local -r MODULE=${PART_TABLE[4 * ${PART_TABLE_COL} + 3]}
215         local -r RAMDISK=${PART_TABLE[5 * ${PART_TABLE_COL} + 3]}
216         local -r RAMDISK_RECOVERY=${PART_TABLE[6 * ${PART_TABLE_COL} + 3]}
217         local -r INFORM=inform
218         local -r HAL=${PART_TABLE[7 * ${PART_TABLE_COL} + 3]}
219         local -r RESERVED2=reserved2
220
221         if [[ $USER_SZ -le 100 ]]
222         then
223                 echo "We recommend to use more than 4GB disk"
224                 exit 0
225         fi
226
227         echo "================================================"
228         echo "Label                     dev             size"
229         echo "================================================"
230         echo $BOOT"                     " $DISK"1       " $BOOT_SZ "MB"
231         echo $ROOTFS"                   " $DISK"2       " $ROOTFS_SZ "MB"
232         echo $SYSTEMDATA"               " $DISK"3       " $DATA_SZ "MB"
233         echo "[Extend]""                " $DISK"4"
234         echo " "$USER"                  " $DISK"5       " $USER_SZ "MB"
235         echo " "$MODULE"                " $DISK"6       " $MODULE_SZ "MB"
236         echo " "$RAMDISK"               " $DISK"7       " $RAMDISK_SZ "MB"
237         echo " "$RAMDISK_RECOVERY"      " $DISK"8       " $RAMDISK_RECOVERY_SZ "MB"
238         echo " "$INFORM"                        " $DISK"9       " $INFORM_SZ "MB"
239         echo " "$HAL"                   " $DISK"10      " $HAL_SZ "MB"
240         echo " "$RESERVED2"             " $DISK"11      " $RESERVED2_SZ "MB"
241
242         local MOUNT_LIST=`mount | grep $DISK | awk '{print $1}'`
243         for mnt in $MOUNT_LIST
244         do
245                 umount $mnt
246         done
247
248         echo "Remove partition table..."
249         dd if=/dev/zero of=$DISK bs=512 count=32 conv=notrunc
250
251         if [ $sfdisk_new == 1 ]; then
252                 if [ $support_delete == 1 ]; then
253                         sfdisk --delete $DISK
254                 fi
255                 if [ $sfdisk_37 == 1 ] ; then
256                         sfdisk $DISK <<-__EOF__
257                         4MiB,${BOOT_SZ}MiB,0xE,*
258                         ,${ROOTFS_SZ}MiB,,-
259                         ,${DATA_SZ}MiB,,-
260                         12MiB,,E,-
261                         ,${USER_SZ}MiB,,-
262                         ,${MODULE_SZ}MiB,,-
263                         ,${RAMDISK_SZ}MiB,,-
264                         ,${RAMDISK_RECOVERY_SZ}MiB,,-
265                         ,${INFORM_SZ}MiB,,-
266                         ,${HAL_SZ}MiB,,-
267                         ,${RESERVED2_SZ}MiB,,-
268                         __EOF__
269                 else
270                         sfdisk $DISK <<-__EOF__
271                         4MiB,${BOOT_SZ}MiB,0xE,*
272                         8MiB,${ROOTFS_SZ}MiB,,-
273                         8MiB,${DATA_SZ}MiB,,-
274                         12MiB,,E,-
275                         ,${USER_SZ}MiB,,-
276                         ,${MODULE_SZ}MiB,,-
277                         ,${RAMDISK_SZ}MiB,,-
278                         ,${RAMDISK_RECOVERY_SZ}MiB,,-
279                         ,${INFORM_SZ}MiB,,-
280                         ,${HAL_SZ}MiB,,-
281                         ,${RESERVED2_SZ}MiB,,-
282                         __EOF__
283                 fi
284         else
285                 # calculate start positions for alignment for extended partitions
286                 let "USER_START = 4 + $BOOT_SZ + $ROOTFS_SZ + $DATA_SZ + 1"
287                 let "MODULE_START = $USER_START + $USER_SZ + 1"
288                 let "RAMDISK_START = $MODULE_START + $MODULE_SZ + 1"
289                 let "RAMDISK_RECOVERY_START = $RAMDISK_START + $RAMDISK_SZ + 1"
290                 let "INFORM_START = $RAMDISK_RECOVERY_START + $RAMDISK_RECOVERY_SZ + 1"
291                 let "HAL_START = $INFORM_START + $INFORM_SZ + 1"
292                 let "RESERVED2_START = $HAL_START + $HAL_SZ + 1"
293
294                 sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
295                 4,$BOOT_SZ,0xE,*
296                 ,$ROOTFS_SZ,,-
297                 ,$DATA_SZ,,-
298                 ,,E,-
299                 $USER_START,$USER_SZ,,-
300                 $MODULE_START,$MODULE_SZ,,-
301                 $RAMDISK_START,$RAMDISK_SZ,,-
302                 $RAMDISK_RECOVERY_START,$RAMDISK_RECOVERY_SZ,,-
303                 $INFORM_START,$INFORM_SZ,,-
304                 $HAL_START,$HAL_SZ,,-
305                 $RESERVED2_START,$RESERVED2_SZ,,-
306                 __EOF__
307         fi
308
309         for ((idx=0;idx<$PART_TABLE_ROW;idx++)); do
310                 local PART=/dev/`lsblk ${DISK} -o TYPE,KNAME | awk "/^part.*[a-z]${PART_TABLE[$idx * ${PART_TABLE_COL} + 1]}\$/ { print \\\$2 }"`
311                 if [ "${PART_TABLE[$idx * ${PART_TABLE_COL} + 4]}" == "vfat" ]; then
312                         mkfs.vfat -F 16 ${PART} -n ${PART_TABLE[$idx * ${PART_TABLE_COL} + 3]}
313                         if [ $? -eq 1 ]; then
314                                 echo "Failed to format as FAT filesystem"
315                                 exit -1
316                         fi
317                 elif [ "${PART_TABLE[$idx * ${PART_TABLE_COL} + 4]}" == "ext4" ]; then
318                         mkfs.ext4 -q ${PART} -L ${PART_TABLE[$idx * ${PART_TABLE_COL} + 3]} -F
319                 else
320                         echo "Skip to format for unknown filesystem type ${PART_TABLE[$idx * ${PART_TABLE_COL} + 4]} for part$idx, ${PART_TABLE[$idx * ${PART_TABLE_COL} + 3]}"
321                 fi
322         done
323
324         local -r PART9=/dev/`lsblk ${DISK} -o TYPE,KNAME | grep part | awk '{ print $2 }' | grep -G "[a-z]9\$"`
325         mkfs.ext4 -q ${PART9} -L $INFORM -F
326
327         # create "reboot-param.bin" file in inform partition for passing reboot parameter
328         # It should be done only once upon partition format.
329         if [ -d mnt_tmp ]; then
330                 echo "Remove the existing mnt_tmp directory!!"
331                 rm -rf mnt_tmp
332         fi
333         mkdir mnt_tmp
334         mount -t ext4 ${PART9} ./mnt_tmp
335         touch ./mnt_tmp/reboot-param.bin
336         sync
337         umount ./mnt_tmp
338         rmdir mnt_tmp
339
340         local -r PART11=/dev/`lsblk ${DISK} -o TYPE,KNAME | grep part | awk '{ print $2 }' | grep -G "[a-z]11\$"`
341         mkfs.ext4 -q ${PART11} -L $RESERVED2 -F
342 }
343
344 function show_usage () {
345         echo "- Usage:"
346         echo "  sudo ./sd_fusing*.sh -d <device> [-b <path> <path> ..] [--format]"
347 }
348
349 function check_partition_format () {
350         if [ "$FORMAT" != "2" ]; then
351                 echo "-----------------------"
352                 echo "Skip $DEVICE format"
353                 echo "-----------------------"
354                 return 0
355         fi
356
357         echo "-------------------------------"
358         echo "Start $DEVICE format"
359         echo ""
360         mkpart_3
361         echo "End $DEVICE format"
362         echo "-------------------------------"
363         echo ""
364 }
365
366 function check_args () {
367         if [ "$DEVICE" == "" ]; then
368                 echo "$(tput setaf 1)$(tput bold)- Device node is empty!"
369                 show_usage
370                 tput sgr 0
371                 exit 0
372         fi
373
374         if [ "$DEVICE" != "" ]; then
375                 echo "Device: $DEVICE"
376         fi
377
378         if [ "$FUSING_BINARY_NUM" != 0 ]; then
379                 echo "Fusing binary: "
380                 for ((bid = 0 ; bid < $FUSING_BINARY_NUM ; bid++))
381                 do
382                         echo "  ${FUSING_BINARY_ARRAY[bid]}"
383                 done
384                 echo ""
385         fi
386
387         if [ "$FORMAT" == "1" ]; then
388                 echo ""
389                 echo -n "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/<n>] "
390                 tput sgr 0
391                 read input
392                 if [ "$input" == "y" ] || [ "$input" == "Y" ]; then
393                         FORMAT=2
394                 else
395                         FORMAT=0
396                 fi
397         fi
398 }
399
400 function check_device () {
401         if [ ! -b "$DEVICE" ]; then
402                 echo "No such device: $DEVICE"
403                 exit 0
404         fi
405
406         DEVICE=/dev/`lsblk $DEVICE -o TYPE,KNAME | awk "/^disk/ { print \\\$2 }"`
407
408         local REMOVABLE=`lsblk $DEVICE -nd -o RM | grep 1 | wc -l`
409         local LOOPBACK=`lsblk $DEVICE -nd -o TYPE | grep loop | wc -l`
410         if [ "$REMOVABLE" == "0" -a "$LOOPBACK" = "0" ]; then
411                 echo ""
412                 echo -n "$(tput setaf 3)$(tput bold)$DEVICE is neither a removable disk nor a loopback, Is it OK? [y/<n>] "
413                 tput sgr 0
414                 read input
415                 if [ "$input" != "y" ] && [ "$input" != "Y" ]; then
416                         exit 0
417                 fi
418         fi
419
420         if [ ! -w "$DEVICE" ]; then
421                 echo "Write not permitted: $DEVICE"
422                 exit 0
423         fi
424 }
425
426 function print_logo () {
427         echo ""
428         echo "Raspberry Pi3/4 downloader, version 2.3.2"
429         echo ""
430 }
431
432 print_logo
433
434 function add_fusing_binary() {
435         local declare binary_name=$1
436
437         if [ "$binary_name" != "" ]; then
438                 if [ -f "$binary_name" ]; then
439                         FUSING_BINARY_ARRAY[$FUSING_BINARY_NUM]=$binary_name
440
441                         FUSING_BINARY_NUM=$((FUSING_BINARY_NUM + 1))
442                 else
443                         echo "No such file: $binary_name"
444                 fi
445         fi
446 }
447
448
449 declare -i binary_option=0
450
451 while test $# -ne 0; do
452         option=$1
453         shift
454
455         case $option in
456         --f | --format)
457                 FORMAT="1"
458                 binary_option=0
459                 ;;
460         -d)
461                 DEVICE=$1
462                 binary_option=0
463                 shift
464                 ;;
465         -b)
466                 add_fusing_binary $1
467                 binary_option=1
468                 shift
469                 ;;
470         *)
471                 if [ $binary_option == 1 ];then
472                         add_fusing_binary $option
473                 else
474                         echo "Unkown command: $option"
475                         exit
476                 fi
477                 ;;
478         esac
479 done
480
481 print_message 3 "NOTICE: This script will is deprecated. Please use sd_fusing.py instead."
482 echo
483
484 check_args
485 check_device
486 check_partition_format
487 check_ddversion
488 fuse_image