1#!/bin/bash -e 2 3message() { 4 echo -e "\e[36m$@\e[0m" 5} 6 7fatal() { 8 echo -e "\e[31m$@\e[0m" 9 exit 1 10} 11 12# Get partition size limit, 0 means unlimited or not exists. 13partition_size_kb() { 14 PART_SIZE="$(rk_partition_size "$1")" 15 echo $(( ${PART_SIZE:-0} / 2)) 16} 17 18link_image() { 19 SRC="$1" 20 DST="$2" 21 message "Linking $DST from $SRC..." 22 ln -rsf "$SRC" "$DST" 23} 24 25pack_extra_partitions() { 26 for idx in $(seq 1 "$(rk_extra_part_num)"); do 27 # Skip built-in partitions 28 if rk_extra_part_builtin $idx; then 29 continue 30 fi 31 32 PART_NAME="$(rk_extra_part_name $idx)" 33 FS_TYPE="$(rk_extra_part_fstype $idx)" 34 SIZE="$(rk_extra_part_size $idx)" 35 FAKEROOT_SCRIPT="$(rk_extra_part_fakeroot_script $idx)" 36 OUTDIR="$(rk_extra_part_outdir $idx)" 37 DST="$(rk_extra_part_img $idx)" 38 39 if [ -z "$(rk_extra_part_src $idx)" ]; then 40 echo "Ignoring $PART_NAME for no sources" 41 continue 42 fi 43 44 rk_extra_part_prepare $idx 45 46 if [ "$SIZE" = max ]; then 47 SIZE="$(partition_size_kb "$PART_NAME")K" 48 if [ "$SIZE" = 0K ]; then 49 fatal "Unable to detect max size of $PART_NAME" 50 fi 51 52 echo "Using maxium size: $SIZE" 53 fi 54 55 sed -i '/mk-image.sh/d' "$FAKEROOT_SCRIPT" 56 echo "\"$SCRIPTS_DIR/mk-image.sh\" \ 57 \"$OUTDIR\" \"$DST\" \"$FS_TYPE\" \ 58 \"$SIZE\" \"$PART_NAME\"" >> "$FAKEROOT_SCRIPT" 59 60 message "Packing $DST from $FAKEROOT_SCRIPT" 61 cd "$OUTDIR" 62 fakeroot -- "$FAKEROOT_SCRIPT" 63 message "Done packing $DST" 64 done 65} 66 67build_firmware() 68{ 69 if ! which fakeroot &>/dev/null; then 70 echo "fakeroot not found! (sudo apt-get install fakeroot)" 71 exit 1 72 fi 73 74 mkdir -p "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR" 75 if [ "$RK_SECURITY" ]; then 76 FIRMWARE_DIR="$RK_SECURITY_FIRMWARE_DIR" 77 else 78 FIRMWARE_DIR="$RK_FIRMWARE_DIR" 79 fi 80 81 rm -rf "$RK_ROCKDEV_DIR" 82 ln -rsf "$FIRMWARE_DIR" "$RK_ROCKDEV_DIR" 83 84 "$SCRIPTS_DIR/check-grow-align.sh" 85 link_image "$CHIP_DIR/$RK_PARAMETER" "$RK_FIRMWARE_DIR/parameter.txt" 86 87 if [ "$RK_MISC_IMG" ]; then 88 link_image "$RK_IMAGE_DIR/$RK_MISC_IMG" \ 89 "$RK_FIRMWARE_DIR/misc.img" 90 fi 91 92 pack_extra_partitions 93 94 if [ "$RK_SECURITY" ]; then 95 # Link non-security images 96 for f in $(ls "$RK_FIRMWARE_DIR/"); do 97 if [ -r "$FIRMWARE_DIR/$f" ]; then 98 continue 99 fi 100 101 link_image "$RK_FIRMWARE_DIR/$f" "$FIRMWARE_DIR/$f" 102 done 103 fi 104 105 echo "Packed files:" 106 for f in "$FIRMWARE_DIR"/*; do 107 NAME=$(basename "$f") 108 109 echo -n "$NAME" 110 if [ -L "$f" ]; then 111 echo -n "($(readlink -f "$f"))" 112 fi 113 114 FILE_SIZE=$(ls -lLh $f | xargs | cut -d' ' -f 5) 115 echo ": $FILE_SIZE" 116 117 echo "$NAME" | grep -q ".img$" || continue 118 119 # Assert the image's size smaller then the limit 120 PART_SIZE_KB="$(partition_size_kb "${NAME%.img}")" 121 [ ! "$PART_SIZE_KB" -eq 0 ] || continue 122 123 FILE_SIZE_KB="$(( $(stat -Lc "%s" "$f") / 1024 ))" 124 if [ "$PART_SIZE_KB" -lt "$FILE_SIZE_KB" ]; then 125 fatal "error: $NAME's size exceed parameter's limit!" 126 fi 127 done 128 129 message "Images in $FIRMWARE_DIR are ready!" 130 131 finish_build 132} 133 134# Hooks 135 136usage_hook() 137{ 138 echo -e "firmware \tpack and check firmwares" 139} 140 141clean_hook() 142{ 143 rm -rf "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR" "$RK_ROCKDEV_DIR" 144} 145 146POST_BUILD_CMDS="firmware" 147post_build_hook() 148{ 149 echo "==========================================" 150 echo " Start packing firmwares" 151 echo "==========================================" 152 153 build_firmware 154} 155 156source "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}" 157 158post_build_hook $@ 159