Build Atmel ARM9 board Board Support Packets
guowenxue
2024-05-22 a798fccb1c91c903bc156f7e804ba3d6c8764761
Add image build shell script
1 files added
236 ■■■■■ changed files
images/build.sh 236 ●●●●● patch | view | raw | blame | history
images/build.sh
New file
@@ -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