#!/bin/bash
|
|
BUILDROOT=$(pwd)
|
BUILDROOT_IMAGE_DIR=$1
|
BUILDROOT_HOST_DIR=$BUILDROOT_IMAGE_DIR/../host
|
BUILDROOT_DEFCONFIG=$BUILDROOT_IMAGE_DIR/../.config
|
|
ROOTFS_IMAGE_FAKEROOT_UBI=$BUILDROOT_IMAGE_DIR/fakeroot-ubi.fs
|
ROOTFS_SRC_DIR=$BUILDROOT_IMAGE_DIR/../target
|
|
IMAGE_OUTPUT_DIR=$BUILDROOT/../rockdev/
|
TOP_DIR=$BUILDROOT/../
|
FAKEROOT_TOOL=$BUILDROOT_HOST_DIR/bin/fakeroot
|
MKUBIFS_TOOL=$BUILDROOT_HOST_DIR/sbin/mkfs.ubifs
|
MKUBINIZE_TOOL=$BUILDROOT_HOST_DIR/sbin/ubinize
|
MKSQUASHFS_TOOL=$BUILDROOT_HOST_DIR/bin/mksquashfs
|
|
function unset_board_config_all()
|
{
|
local tmp_file=`mktemp`
|
grep -o "^export.*RK_.*=" `find $TOP_DIR/device/rockchip -name "Board*.mk" -type f` -h | sort | uniq > $tmp_file
|
source $tmp_file
|
rm -f $tmp_file
|
}
|
|
mk_ubi_image_fake()
|
{
|
temp_dir="$BUILDROOT_IMAGE_DIR"
|
|
if [ $(( $UBI_BLOCK_SIZE )) -eq $(( 0x20000 )) ]; then
|
ubi_block_size_str="128KB"
|
elif [ $(( $UBI_BLOCK_SIZE )) -eq $(( 0x40000 )) ]; then
|
ubi_block_size_str="256KB"
|
else
|
echo "[$0:error] Please add ubi block size [$UBI_BLOCK_SIZE] to $PWD/$0"
|
exit 1
|
fi
|
|
if [ $(( $UBI_PAGE_SIZE )) -eq 2048 ]; then
|
ubi_page_size_str="2KB"
|
elif [ $(( $UBI_PAGE_SIZE )) -eq 4096 ]; then
|
ubi_page_size_str="4KB"
|
else
|
echo "[$0:error] Please add ubi block size [$UBI_PAGE_SIZE] to $PWD/$0"
|
exit 1
|
fi
|
|
if [ -z "$UBI_VOL_NAME" ]; then
|
echo "[$0:error] Please config ubifs partition volume name"
|
exit 1
|
fi
|
|
ubifs_lebsize=$(( $UBI_BLOCK_SIZE - 2 * $UBI_PAGE_SIZE ))
|
ubifs_miniosize=$UBI_PAGE_SIZE
|
partition_size=$(( $UBI_PART_SIZE ))
|
partition_size_str="$(( $partition_size / 1024 / 1024 ))MB"
|
output_image=${IMAGE_OUTPUT_DIR}/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}.ubi
|
temp_ubinize_file=$temp_dir/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}_ubinize.cfg
|
UBI_VOL_TYPE=${UBI_VOL_TYPE:-dynamic}
|
UBI_COMPRESSION_TPYE=${UBI_COMPRESSION_TPYE:-lzo}
|
|
if [ $partition_size -le 0 ]; then
|
echo "[$0:error] ubifs partition MUST set partition size"
|
exit 1
|
fi
|
|
if [ ! -f $UBI_IMAGE_FAKEROOT ]; then
|
echo "[$0:error] ubifs $UBI_IMAGE_FAKEROOT not found!!!"
|
exit 1
|
fi
|
|
ubifs_maxlebcnt=$(( $partition_size / $ubifs_lebsize ))
|
|
echo "[$0:info] ubifs_lebsize=$UBI_BLOCK_SIZE"
|
echo "[$0:info] ubifs_miniosize=$UBI_PAGE_SIZE"
|
echo "[$0:info] ubifs_maxlebcnt=$ubifs_maxlebcnt"
|
|
case $UBIFS_TYPE in
|
squashfs)
|
temp_image=$temp_dir/${UBI_VOL_NAME}_${partition_size_str}.squashfs
|
parallel_jobs=$((1 + `getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1`))
|
|
if grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZ4=y" $BUILDROOT_DEFCONFIG; then
|
squashfs_compression_args=lz4
|
elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZO=y" $BUILDROOT_DEFCONFIG; then
|
squashfs_compression_args=lzo
|
elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZMA=y" $BUILDROOT_DEFCONFIG; then
|
squashfs_compression_args=lzma
|
elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y" $BUILDROOT_DEFCONFIG; then
|
squashfs_compression_args=xz
|
elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_ZSTD=y" $BUILDROOT_DEFCONFIG; then
|
squashfs_compression_args=zstd
|
else
|
squashfs_compression_args=gzip
|
fi
|
|
if [ "$squashfs_compression_args" = "lz4" ]; then
|
echo "$MKSQUASHFS_TOOL $UBI_SRC_DIR $temp_image -noappend -processors $parallel_jobs -comp $squashfs_compression_args -Xhc" >> $UBI_IMAGE_FAKEROOT
|
else
|
echo "$MKSQUASHFS_TOOL $UBI_SRC_DIR $temp_image -noappend -processors $parallel_jobs -comp $squashfs_compression_args" >> $UBI_IMAGE_FAKEROOT
|
fi
|
;;
|
|
ubifs|*)
|
temp_image=$temp_dir/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}.ubifs
|
echo "$MKUBIFS_TOOL -x $UBI_COMPRESSION_TPYE -e $ubifs_lebsize -m $ubifs_miniosize -c $ubifs_maxlebcnt -d $UBI_SRC_DIR -F -v -o $temp_image" >> $UBI_IMAGE_FAKEROOT
|
;;
|
esac
|
|
echo "[ubifs]" > $temp_ubinize_file
|
echo "mode=ubi" >> $temp_ubinize_file
|
echo "vol_id=0" >> $temp_ubinize_file
|
echo "vol_type=$UBI_VOL_TYPE" >> $temp_ubinize_file
|
echo "vol_name=$UBI_VOL_NAME" >> $temp_ubinize_file
|
echo "vol_alignment=1" >> $temp_ubinize_file
|
echo "vol_flags=autoresize" >> $temp_ubinize_file
|
echo "image=$temp_image" >> $temp_ubinize_file
|
echo "$MKUBINIZE_TOOL -o $output_image -m $ubifs_miniosize -p $UBI_BLOCK_SIZE -v $temp_ubinize_file" >> $UBI_IMAGE_FAKEROOT
|
echo ""
|
|
# Pick a default ubi image
|
if [ $(( $DEFAULT_UBI_PAGE_SIZE )) -eq $(( $UBI_PAGE_SIZE )) \
|
-a $(( $DEFAULT_UBI_BLOCK_SIZE )) -eq $(( $UBI_BLOCK_SIZE )) ]; then
|
if [ "$UBI_VOL_NAME" = "rootfs" ]; then
|
echo "rm -f $BUILDROOT_IMAGE_DIR/rootfs.ubi" >> $UBI_IMAGE_FAKEROOT
|
echo "ln -rfs $output_image $BUILDROOT_IMAGE_DIR/rootfs.ubi" >> $UBI_IMAGE_FAKEROOT
|
fi
|
fi
|
|
UBIFS_TYPE=
|
UBI_BLOCK_SIZE=
|
UBI_IMAGE_FAKEROOT=
|
UBI_PAGE_SIZE=
|
UBI_PART_SIZE=
|
UBI_SRC_DIR=
|
UBI_VOL_NAME=
|
UBI_VOL_TYPE=
|
}
|
|
get_partition_size()
|
{
|
echo $PARAMETER
|
|
PARTITIONS_PREFIX=`echo -n "CMDLINE: mtdparts=rk29xxnand:"`
|
while read line
|
do
|
if [[ $line =~ $PARTITIONS_PREFIX ]]
|
then
|
partitions=`echo $line | sed "s/$PARTITIONS_PREFIX//g"`
|
echo $partitions
|
break
|
fi
|
done < $PARAMETER
|
|
[ -z $"partitions" ] && return
|
|
IFS=,
|
for part in $partitions;
|
do
|
part_size=`echo $part | cut -d '@' -f1`
|
part_name=`echo $part | cut -d '(' -f2|cut -d ')' -f1`
|
|
[[ $part_size =~ "-" ]] && continue
|
|
part_size=$(($part_size))
|
part_size_bytes=$[$part_size*512]
|
|
case $part_name in
|
rootfs | system_[ab])
|
ROOTFS_PART_SIZE=$part_size_bytes
|
;;
|
oem)
|
OEM_PART_SIZE=$part_size_bytes
|
;;
|
esac
|
done
|
}
|
|
mk_ubi_image_fake_for_rootfs()
|
{
|
UBI_BLOCK_SIZE=$1
|
UBI_PAGE_SIZE=$2
|
|
UBI_VOL_NAME="rootfs"
|
UBI_PART_SIZE=$ROOTFS_PART_SIZE
|
UBI_IMAGE_FAKEROOT=$ROOTFS_IMAGE_FAKEROOT_UBI
|
UBI_SRC_DIR=$ROOTFS_SRC_DIR
|
|
UBIFS_TYPE=`grep -w BR2_PACKAGE_ROOTFS_UBI_CUSTOM_FILESYSTEM $BUILDROOT_DEFCONFIG`
|
UBIFS_TYPE=${UBIFS_TYPE##*=}
|
UBIFS_TYPE=${UBIFS_TYPE%*\"}
|
UBIFS_TYPE=${UBIFS_TYPE#*\"}
|
case $UBIFS_TYPE in
|
squashfs)
|
UBI_VOL_TYPE=static
|
;;
|
ubifs|*)
|
UBI_VOL_TYPE=dynamic
|
;;
|
esac
|
|
mk_ubi_image_fake
|
}
|
|
get_ubi_image_compression_tpye()
|
{
|
UBI_COMPRESSION_TPYE=""
|
if grep -w "BR2_TARGET_ROOTFS_UBIFS_RT_ZLIB=y" $BUILDROOT_DEFCONFIG; then
|
UBI_COMPRESSION_TPYE=zlib
|
fi
|
if grep -w "BR2_TARGET_ROOTFS_UBIFS_RT_LZO=y" $BUILDROOT_DEFCONFIG; then
|
UBI_COMPRESSION_TPYE=lzo
|
fi
|
}
|
|
stash_unused_files()
|
{
|
# stash $ROOTFS_SRC_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
|
mv $ROOTFS_SRC_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM $BUILDROOT_IMAGE_DIR/
|
}
|
|
pop_unused_files()
|
{
|
mv $BUILDROOT_IMAGE_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM $ROOTFS_SRC_DIR/
|
}
|
|
# Start
|
|
if [ ! -d $IMAGE_OUTPUT_DIR ]; then
|
mkdir -p $IMAGE_OUTPUT_DIR
|
fi
|
|
unset_board_config_all
|
|
# Get the parameter file
|
source $TOP_DIR/device/rockchip/.BoardConfig.mk
|
PARAMETER=$TOP_DIR/device/rockchip/.target_product/$RK_PARAMETER
|
# default page size 2KB
|
DEFAULT_UBI_PAGE_SIZE=${RK_UBI_PAGE_SIZE:-2048}
|
# default block size 128KB
|
DEFAULT_UBI_BLOCK_SIZE=${RK_UBI_BLOCK_SIZE:-0x20000}
|
|
stash_unused_files
|
|
echo "[$0:info] Start build ubi images..."
|
|
get_partition_size
|
get_ubi_image_compression_tpye
|
|
if which fakeroot; then
|
FAKEROOT_TOOL="`which fakeroot`"
|
else
|
echo -e "[$0:error] Install fakeroot First."
|
echo -e "[$0:error] sudo apt-get install fakeroot"
|
exit -1
|
fi
|
|
sed -i '/\<ubinize\>/d' $ROOTFS_IMAGE_FAKEROOT_UBI
|
mk_ubi_image_fake_for_rootfs 0x20000 2048
|
mk_ubi_image_fake_for_rootfs 0x40000 2048
|
mk_ubi_image_fake_for_rootfs 0x40000 4096
|
$FAKEROOT_TOOL -- $ROOTFS_IMAGE_FAKEROOT_UBI
|
|
echo "[$0:info] End build ubi images..."
|
pop_unused_files
|
|
exit 0
|