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