From a798fccb1c91c903bc156f7e804ba3d6c8764761 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Wed, 22 May 2024 17:04:36 +0800
Subject: [PATCH] Add image build shell script
---
images/build.sh | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 236 insertions(+), 0 deletions(-)
diff --git a/images/build.sh b/images/build.sh
new file mode 100755
index 0000000..66ac829
--- /dev/null
+++ b/images/build.sh
@@ -0,0 +1,236 @@
+#!/bin/bash
+
+# this project absolute path
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
+
+# top project absolute path
+TOP_PATH=$(realpath $PRJ_PATH/..)
+
+# binaries build prefix install path
+PRFX_PATH=$PRJ_PATH/install
+
+# binaries finally install path if needed
+#INST_PATH=/tftp
+
+# download taballs path
+TARBALL_PATH=$PRJ_PATH/tarballs
+
+# config file path
+CONF_FILE=$TOP_PATH/config.json
+
+# shell script will exit once get command error
+set -e
+
+#+-------------------------+
+#| Shell script functions |
+#+-------------------------+
+
+function pr_error() {
+ echo -e "\033[40;31m $1 \033[0m"
+}
+
+function pr_warn() {
+ echo -e "\033[40;33m $1 \033[0m"
+}
+
+function pr_info() {
+ echo -e "\033[40;32m $1 \033[0m"
+}
+
+# decompress a packet to destination path
+function do_unpack()
+{
+ tarball=$1
+ dstpath=`pwd`
+
+ if [[ $# == 2 ]] ; then
+ dstpath=$2
+ fi
+
+ pr_info "decompress $tarball => $dstpath"
+
+ mkdir -p $dstpath
+ case $tarball in
+ *.tar.gz)
+ tar -xzf $tarball -C $dstpath
+ ;;
+
+ *.tar.bz2)
+ tar -xjf $tarball -C $dstpath
+ ;;
+
+ *.tar.xz)
+ tar -xJf $tarball -C $dstpath
+ ;;
+
+ *.tar.zst)
+ tar -I zstd -xf $tarball -C $dstpath
+ ;;
+
+ *.tar)
+ tar -xf $tarball -C $dstpath
+ ;;
+
+ *.zip)
+ unzip -qo $tarball -d $dstpath
+ ;;
+
+ *)
+ pr_error "decompress Unsupport packet: $tarball"
+ return 1;
+ ;;
+ esac
+}
+
+# parser configure file and export environment variable
+function export_env()
+{
+ export BOARD=`jq -r ".bsp.board" $CONF_FILE | tr 'A-Z' 'a-z'`
+ export BSP_VER=`jq -r ".bsp.version" $CONF_FILE | tr 'A-Z' 'a-z'`
+ export BSP_URL=`jq -r ".bsp.giturl" $CONF_FILE`
+ export CROSS_COMPILE=`jq -r ".bsp.crosstool" $CONF_FILE`
+
+ export JOBS=`cat /proc/cpuinfo | grep processor | wc -l`
+ export ARCH=arm
+
+ ROOTFS_SRC=rootfs
+ ROOTFS_IMG=rootfs-${BOARD}.ubi
+
+ export SRCS="rootfs"
+}
+
+function do_fetch()
+{
+ cd $PRJ_PATH
+
+ for src in $SRCS
+ do
+ if [ -d $src ] ; then
+ pr_info "$src source code fetched already"
+ continue
+ fi
+
+ pr_info "start fetch $src source code"
+ mkdir -p $TARBALL_PATH
+
+ # Download source code packet
+ if [ ! -s $TARBALL_PATH/$src.tar.xz ] ; then
+ wget $BSP_URL/at91/bsp/$BSP_VER/$src.tar.xz -P $TARBALL_PATH
+ fi
+
+ # decompress source code packet
+ do_unpack $TARBALL_PATH/$src.tar.xz $ROOTFS_SRC
+ done
+}
+
+function build_ubifs()
+{
+ ubinize_cfg=ubinize.cfg
+ ubimg_tmp=ubi.img
+
+ # Rootfs partition size
+ partition_size=100 # MiB
+
+ # K9F2G08: 1 block=64 pages, 1 page = 2048
+ BLOCK_PAGES=64
+ PAGE_SIZE=2048
+
+ ROOTFS_IMG=${ROOTFS_IMG}-p`expr $PAGE_SIZE \/ 1024`k
+
+ # Logic Erase Block Size: UBI requires 2 minimum I/O units out of each Physical Erase Block (PEB) for overhead:
+ # 1 for maintaining erase count information, and 1 for maintaining the Volume ID information.
+
+ PEB_SIZE=`expr $PAGE_SIZE \* $BLOCK_PAGES`
+ LEB_SIZE=`expr $PEB_SIZE - 2 \* $PAGE_SIZE `
+
+ #UBI reserves 4 blocks space for management and bad PEB handling operations
+ # 2 PEBs are used to store the UBI volume table
+ # 1 PEB is reserved for wear-leveling purposes;
+ # 1 PEB is reserved for the atomic LEB change operation;
+ # a% of PEBs is reserved for handling bad EBs. The default for NAND is 1%
+
+ PEB_CNT=`expr $partition_size \* 1024 \* 1024 / ${PEB_SIZE}`
+ LEB_CNT=`expr $PEB_CNT - 4 - $PEB_CNT \/ 100 `
+
+ #echo "Parition size ${partition_size}MiB and LEB=$LEB_CNT"
+ set -x
+ sudo mkfs.ubifs -F -d ${ROOTFS_SRC} -m ${PAGE_SIZE} -e ${LEB_SIZE} -c $LEB_CNT -o ${ubimg_tmp}
+ set +x
+
+ # vol_size smaller than the actual size of the partition to leave room for Ubifs internal data.
+ # With "vol_type=dynamic", Ubifs will end up using the whole space automatically
+ vol_size=`expr ${partition_size} \- 10`
+
+ printf "[ubifs] \nmode=ubi \nimage=${ubimg_tmp} \nvol_id=0 \nvol_size=${vol_size}MiB\n" > $ubinize_cfg
+ printf "vol_type=dynamic \nvol_name=rootfs \nvol_flags=autoresize\n" >> $ubinize_cfg
+ #cat $ubinize_cfg
+
+ set -x
+ ubinize -o ${ROOTFS_IMG} -m ${PAGE_SIZE} -p ${PEB_SIZE} $ubinize_cfg
+ set +x
+
+ rm -f $ubimg_tmp $ubinize_cfg
+ chmod a+x ${ROOTFS_IMG}
+}
+
+
+function do_build()
+{
+ cd $PRJ_PATH
+ mkdir -p $PRFX_PATH
+
+ pr_info "start build rootfs image..."
+ build_ubifs
+
+ mv $ROOTFS_IMG $PRFX_PATH
+}
+
+function do_install()
+{
+ cd $PRJ_PATH
+
+ echo ""
+ pr_info "install all images to '$PRFX_PATH'"
+ cp $TOP_PATH/bootloader/install/* $PRFX_PATH
+ cp $TOP_PATH/kernel/install/* $PRFX_PATH
+
+ ls $PRFX_PATH && echo ""
+
+ if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then
+ pr_info "install rootfs to '$INST_PATH'"
+ cp $PRFX_PATH/* $INST_PATH
+ fi
+}
+
+function do_clean()
+{
+ for d in $SRCS
+ do
+ rm -rf $PRJ_PATH/$d
+ done
+
+ rm -rf $PRJ_PATH/tarballs
+ rm -rf $PRFX_PATH
+}
+
+#+-------------------------+
+#| Shell script body entry |
+#+-------------------------+
+
+cd $PRJ_PATH
+
+export_env
+
+if [[ $# == 1 && $1 == -c ]] ;then
+ pr_warn "start clean rootfs"
+ do_clean
+ exit;
+fi
+
+pr_warn "start build rootfs for ${BOARD}"
+
+do_fetch
+
+do_build
+
+do_install
--
Gitblit v1.9.1