linuxOS_AP05/buildroot/board/rockchip/common/post-image-ubi.sh
2025-06-02 13:59:07 +08:00

268 lines
7.4 KiB
Bash
Executable File

#!/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