6 # Binaires array for fusing
7 declare -a FUSING_BINARY_ARRAY
8 declare -i FUSING_BINARY_NUM=0
11 declare -i FUS_ENTRY_NUM=0
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
22 "system-data.img" 3 0 4M
28 declare -r -i PART_TABLE_COL=4
29 declare -r -i PART_TABLE_ROW=${#PART_TABLE[*]}/${PART_TABLE_COL}
31 # partition table support
32 function get_index_use_name () {
33 local -r binary_name=$1
35 for ((idx=0;idx<$PART_TABLE_ROW;idx++)); do
36 if [ ${PART_TABLE[idx * ${PART_TABLE_COL} + 0]} == $binary_name ]; then
41 # return out of bound index
46 function convert_num_to_ascii () {
49 CONV_ASCII=$(printf \\$(printf '%03o' $number))
52 function print_message () {
63 function add_fusing_entry () {
68 FUS_ENTRY_NUM=$((FUS_ENTRY_NUM + 1))
70 echo -n "$name" > entry_name
71 cat entry_name /dev/zero | head -c 32 >> entry
73 echo -n "" > entry_offset
74 for ((i=0; i < 4; i++))
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
82 cat entry_offset /dev/zero | head -c 4 >> entry
84 echo -n "" > entry_size
85 for ((i=0; i < 4; i++))
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
93 cat entry_size /dev/zero | head -c 4 >> entry
101 function fusing_image () {
102 local -r fusing_img=$1
104 # get binary info using basename
105 get_index_use_name $(basename $fusing_img)
106 local -r -i part_idx=$?
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]}
113 echo "Not supported binary: $fusing_img"
117 local -r input_size=`du -b $fusing_img | awk '{print $1}'`
119 print_message 2 "[Fusing $1]"
121 dd if=$fusing_img | pv -s $input_size | dd of=$device seek=$seek bs=$bs
123 if [ $(basename $fusing_img) == "u-boot-mmc.bin" ];then
124 add_fusing_entry "u-boot" $seek 2048
128 function fuse_image_tarball () {
130 local -r temp_dir="tar_tmp"
133 tar xvf $filepath -C $temp_dir
145 function check_binary_format () {
150 fuse_image_tarball $binary
160 function fuse_image () {
161 if [ "$FUSING_BINARY_NUM" == 0 ]; then
165 for ((fuse_idx = 0 ; fuse_idx < $FUSING_BINARY_NUM ; fuse_idx++))
167 local filename=${FUSING_BINARY_ARRAY[fuse_idx]}
171 fuse_image_tarball $filename
174 fusing_image $filename
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__
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%%.*}
194 if [ $major -gt 2 ]; then
197 if [ $major -eq 2 -a $minor -ge 26 ]; then
202 local -r DISK=$DEVICE
203 local -r SIZE=`sfdisk -s $DISK`
204 local -r SIZE_MB=$((SIZE >> 10))
207 local -r ROOTFS_SZ=3072
209 local -r MODULE_SZ=32
210 local -r RAMDISK_SZ=8
211 if [ $sfdisk_new == 1 ]; then
217 let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ - $DATA_SZ - $MODULE_SZ - $EXTEND_SZ - $RAMDISK_SZ"
220 local -r ROOTFS=rootfs
221 local -r SYSTEMDATA=system-data
223 local -r MODULE=modules
224 local -r RAMDISK=ramdisk
226 if [[ $USER_SZ -le 100 ]]
228 echo "We recommend to use more than 4GB disk"
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"
243 local MOUNT_LIST=`mount | grep $DISK | awk '{print $1}'`
244 for mnt in $MOUNT_LIST
249 echo "Remove partition table..."
250 dd if=/dev/zero of=$DISK bs=512 count=16 conv=notrunc
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,,-
263 sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
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
282 function show_usage () {
284 echo " sudo ./sd_fusing_xu4.sh -d <device> [-b <path> <path> ..] [--format]"
287 function check_partition_format () {
288 if [ "$FORMAT" != "2" ]; then
289 echo "-----------------------"
290 echo "Skip $DEVICE format"
291 echo "-----------------------"
295 echo "-------------------------------"
296 echo "Start $DEVICE format"
299 echo "End $DEVICE format"
300 echo "-------------------------------"
304 function check_args () {
305 if [ "$DEVICE" == "" ]; then
306 echo "$(tput setaf 1)$(tput bold)- Device node is empty!"
312 if [ "$DEVICE" != "" ]; then
313 echo "Device: $DEVICE"
316 if [ "$FUSING_BINARY_NUM" != 0 ]; then
317 echo "Fusing binary: "
318 for ((bid = 0 ; bid < $FUSING_BINARY_NUM ; bid++))
320 echo " ${FUSING_BINARY_ARRAY[bid]}"
325 if [ "$FORMAT" == "1" ]; then
327 echo "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/n]"
330 if [ "$input" == "y" ] || [ "$input" == "Y" ]; then
338 function print_logo () {
340 echo "[Odroid-XU3/4 downloader]"
341 echo "This version also supports Tizen 4.0."
347 function add_fusing_binary() {
348 local declare binary_name=$1
349 FUSING_BINARY_ARRAY[$FUSING_BINARY_NUM]=$binary_name
351 FUSING_BINARY_NUM=$((FUSING_BINARY_NUM + 1))
354 declare -i binary_option=0
356 while test $# -ne 0; do
376 if [ $binary_option == 1 ];then
377 add_fusing_binary $option
379 echo "Unkown command: $option"
387 check_partition_format