From 75a960df1eb8abad7c1c693d8cad75db63478d6b Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Tue, 26 Sep 2023 00:17:38 +0800 Subject: [PATCH] Add build-evkboard shell script tools --- config.json | 17 images/build.sh | 279 +++++++++ android/build.sh | 251 ++++++++ debian/build.sh | 167 +++++ kernel/build.sh | 142 +++++ tools/setup_tools.sh | 120 ++++ yocto/build.sh | 149 +++++ bootloader/build.sh | 376 +++++++++++++ tools/imgmnt | 120 ++++ 9 files changed, 1,621 insertions(+), 0 deletions(-) diff --git a/android/build.sh b/android/build.sh new file mode 100755 index 0000000..2ef67b9 --- /dev/null +++ b/android/build.sh @@ -0,0 +1,251 @@ +#!/bin/bash + +PRJ_PATH=`pwd` +BOARD=evk_8mp + +ANDROID_VER=imx-android-12.0.0_1.0.0 +IMAGE_PATH=${PRJ_PATH}/android_image +IMAGE_NAME=${ANDROID_VER}-${BOARD}.img +IMAGE_SIZE=14336M #14G + +JOBS=`cat /proc/cpuinfo | grep processor | wc -l` +LOOP_DEV=`losetup -f | cut -d/ -f3` + +set -e + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + +function exit_handler() +{ + pr_info "Shell script exit now, do some clean work" + + set +e + + if [ -L /dev/mapper/${LOOP_DEV}p1 ] ; then + echo "kpartx -dv /dev/${LOOP_DEV}" + kpartx -dv /dev/${LOOP_DEV} > /dev/null + fi + + losetup -a | grep "${LOOP_DEV}" > /dev/null 2>&1 + if [ $? == 0 ] ; then + echo "losetup -d /dev/${LOOP_DEV}" + losetup -d /dev/${LOOP_DEV} > /dev/null + fi +} + +function do_systool() +{ + if command -v simg2img > /dev/null 2>&1 ; then + pr_info "system tools installed already." + return ; + fi + + pr_info "Start install system tools." + # ubuntu22.04 miss android-sdk-ext4-utils + sudo apt install -y uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev make libssl-dev \ + lzop git curl u-boot-tools mtd-utils device-tree-compiler gdisk m4 bison flex gcc-multilib \ + android-sdk-libsparse-utils android-sdk android-sdk-build-tools libncurses5 + + sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1 +} + +function do_fetch() +{ + if [ -f ${PRJ_PATH}/${ANDROID_VER}/imx_android_setup.sh ] ; then + pr_info "android source code fetch already." + return; + fi + + pr_info "Start fetch source code." + mkdir -p ${PRJ_PATH}/bin + curl https://storage.googleapis.com/git-repo-downloads/repo > ${PRJ_PATH}/bin/repo + chmod a+x ${PRJ_PATH}/bin/repo + + export PATH=${PATH}:${PRJ_PATH}/bin + + + if [ ! -d $ANDROID_VER ] ; then + tar -xzf $ANDROID_VER.tar.gz + fi + + source ${PRJ_PATH}/${ANDROID_VER}/imx_android_setup.sh + + # By default, after preceding command finishes execution, current working directory changed to the + # i.MX Android source code root directory. + # ${MY_ANDROID} will be refered as the i.MX Android source code root directory in all i.MX Andorid + # release documentation + + export MY_ANDROID=${PRJ_PATH} +} + +function do_build() +{ + IMX_TARGET="bootloader kernel mxmwifi dtboimage bootimage vendorbootimage vendorimage" + + pr_info "Start build android source code." + + export AARCH64_GCC_CROSS_COMPILE=aarch64-linux-gnu- + export MY_ANDROID=${PRJ_PATH}/android_build + + cd $MY_ANDROID + source build/envsetup.sh + #lunch ${BOARD}-eng + lunch ${BOARD}-userdebug + + # Build U-Boot/kernel with imx-make.sh first, but not to build Android images. + ./imx-make.sh -j${JOBS} ${IMX_TARGET} 2>&1 | tee build-log.txt + + # Start the process of build Android images with "make" function. + make -j${JOBS} 2>&1 | tee -a build-log.txt + + # output in ${MY_ANDROID}/out/target/product/${BOARD} + ls out/target/product/${BOARD}/*.img +} + +function do_install() +{ + export MY_ANDROID=${PRJ_PATH}/android_build + + IMAGE_FILES="boot.img dtbo-imx8mp.img partition-table.img super.img \ + u-boot-imx8mp.imx vbmeta-imx8mp.img vendor_boot.img \ + fastboot_imx_flashall.* imx-sdcard-partition.* uuu_imx_android_flash.* " + + pr_info "Start install output images" + + mkdir -p $IMAGE_PATH && rm -f $IMAGE_PATH/* + cd ${MY_ANDROID}/out/target/product/${BOARD}/ + + for f in $IMAGE_FILES + do + cp $f ${IMAGE_PATH} + done + + cd $PRJ_PATH +} + +function do_image() +{ + cd $IMAGE_PATH + + # Generate android system image file and losetup for it + pr_info "Start generate android system images: ${IMAGE_NAME}" + cp partition-table.img ${IMAGE_NAME} + chmod +x ${IMAGE_NAME} + + truncate -s ${IMAGE_SIZE} ${IMAGE_NAME} + sgdisk -e ${IMAGE_NAME} + gdisk -l ${IMAGE_NAME} + + losetup /dev/${LOOP_DEV} ${IMAGE_NAME} + kpartx -av /dev/${LOOP_DEV} > /dev/null + + # Android system image partition table and written images + part1=(dtbo_a:dtbo-imx8mp.img) + part2=(dtbo_b:dtbo-imx8mp.img) + part3=(boot_a:boot.img) + part4=(boot_b:boot.img) + part5=(vendor_boot_a:vendor_boot.img) + part6=(vendor_boot_b:vendor_boot.img) + part7=(misc:zero) + part8=(metadata:ext4) + part9=(presistdata:zero) + part10=(super:super.img) + part11=(userdata:ext4) + part12=(fbmisc:zero) + part13=(vbmeta_a:vbmeta-imx8mp.img) + part14=(vbmeta_b:vbmeta-imx8mp.img) + + pr_info "Start write built output images to android system images" + for i in `seq 1 14` + do + eval var=\${part${i}[@]} + for info in ${var} + do + partnum=$i + partname=`echo ${info} | cut -d: -f1` + imgfile=`echo ${info} | cut -d: -f2` + + echo "Flash partition${partnum}($partname): $imgfile " + + if [ "$imgfile" = "zero" ] ; then + size=`gdisk -l ${IMAGE_NAME} | grep -w ${partname} | awk '{print $4}' | cut -d. -f1` + unit=`gdisk -l ${IMAGE_NAME} | grep -w ${partname} | awk '{print $5}'` + dd if=/dev/zero of=/dev/mapper/${LOOP_DEV}p${partnum} bs=1${unit} count=${size} conv=fsync,nocreat status=none + + elif [ "$imgfile" = "ext4" ] ; then + mkfs.ext4 -F /dev/mapper/${LOOP_DEV}p${partnum} -L${partname} > /dev/null 2>&1 + + elif [ "$imgfile" = "super.img" ] ; then + simg2img $imgfile /dev/mapper/${LOOP_DEV}p${partnum} + + else + dd if=$imgfile of=/dev/mapper/${LOOP_DEV}p${partnum} bs=10M conv=fsync,nocreat status=none + + fi + done + done + + pr_info "Start write u-boot image to android system images" + dd if=u-boot-imx8mp.imx of=/dev/${LOOP_DEV} bs=1k seek=32 conv=fsync status=none + + sync + pr_info "generate ${IMAGE_NAME} successful!" +} + +function do_usage() +{ + echo "" + echo "Usage:" + echo " $0 [-b] [-g] [-h]" + echo " -b : build android source code SDK" + echo " -g : generate android system image" + echo " -h : show this help message" + echo "" + echo " WARNNING: Generate android image need run as sudo" + echo "" + echo " Build Example: $0 -b && sudo $0 -g" + echo "" + exit; +} + +action="usage" + +while getopts "bgh" OPTNAME +do + case "${OPTNAME}" in + "b") + action="build" + shift + ;; + + "g") + action="generate" + shift + ;; + + "h") + action="usage" + ;; + esac +done + +trap 'exit_handler' EXIT + +#do_systool + +if [ $action == "usage" ] ; then + do_usage + +elif [ $action == "build" ] ; then + do_fetch + do_build + do_install + +elif [ $action == "generate" ] ; then + do_image + +fi + diff --git a/bootloader/build.sh b/bootloader/build.sh new file mode 100755 index 0000000..d54aecd --- /dev/null +++ b/bootloader/build.sh @@ -0,0 +1,376 @@ +#!/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 + +# 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" +} + +# select firmware version by BSP version +function export_fmver() +{ + if [[ $BSP_VER =~ 6.1.22 ]] ; then + + export FMW_IMX=firmware-imx-8.20 + export FMW_SENTINEL=firmware-sentinel-0.10 + export FMW_UPOWER=firmware-upower-1.3.0 + + elif [[ $BSP_VER =~ 6.1.1 ]] ; then + + export FMW_IMX=firmware-imx-8.19 + export FMW_SENTINEL=firmware-sentinel-0.9 + export FMW_UPOWER=firmware-upower-1.2.0 + + elif [[ $BSP_VER =~ 5.15.71 ]] ; then + + export FMW_IMX=firmware-imx-8.18 + export FMW_SENTINEL=firmware-sentinel-0.8 + export FMW_UPOWER=firmware-upower-1.1.0 + + fi + + export FMWS="$FMW_IMX $FMW_SENTINEL $FMW_UPOWER" + export FMW_URL=https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/ + export FMW_PATH=$PRJ_PATH/firmware/ +} + +# 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 GIT_URL=`jq -r ".bsp.giturl" $CONF_FILE | tr 'A-Z' 'a-z'` + export CROSS_COMPILE=`jq -r ".bsp.cortexAtool" $CONF_FILE | tr 'A-Z' 'a-z'` + export MCORE_COMPILE=`jq -r ".bsp.cortexMtool" $CONF_FILE | tr 'A-Z' 'a-z'` + + export SRCS="imx-atf uboot-imx imx-mkimage" + export BRANCH=$BSP_VER + export JOBS=`cat /proc/cpuinfo | grep processor | wc -l` + export ARCH=arm + + export_fmver + export SRCS="imx-atf uboot-imx imx-mkimage" + + if [[ $BOARD =~ mx93 ]] ; then + + ATF_PLATFORM=imx93 + IMX_BOOT_SOC_TARGET=iMX9 + IMXBOOT_TARGETS=flash_singleboot + IMXBOOT_DTB=imx93-11x11-evk.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX9/ + + elif [[ $BOARD =~ mx8ulp ]] ; then + + MCORE_BUILD=yes + MCORE_BOARD=evkmimx8ulp + MCORE_IMAGE=m33_image.bin + + ATF_PLATFORM=imx8ulp + IMX_BOOT_SOC_TARGET=iMX8ULP + IMXBOOT_TARGETS=flash_singleboot_m33 + IMXBOOT_DTB=imx8ulp-evk.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX8ULP/ + + elif [[ $BOARD =~ mx8mq ]] ; then + + ATF_PLATFORM=imx8mq + IMX_BOOT_SOC_TARGET=iMX8M + IMXBOOT_TARGETS=flash_ddr4_val + IMXBOOT_DTB=imx8mq-ddr4-val.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX8M/ + + elif [[ $BOARD =~ mx8mp ]] ; then + + ATF_PLATFORM=imx8mp + IMX_BOOT_SOC_TARGET=iMX8MP + IMXBOOT_TARGETS=flash_ddr4_evk + IMXBOOT_DTB=imx8mp-ddr4-evk.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX8M/ + + + elif [[ $BOARD =~ mx8mm ]] ; then + + ATF_PLATFORM=imx8mm + IMX_BOOT_SOC_TARGET=iMX8MM + IMXBOOT_TARGETS=flash_ddr4_evk + IMXBOOT_DTB=imx8mm-ddr4-evk.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX8M/ + + elif [[ $BOARD =~ mx8mn ]] ; then + + ATF_PLATFORM=imx8mn + IMX_BOOT_SOC_TARGET=iMX8MN + IMXBOOT_TARGETS=flash_ddr4_evk + IMXBOOT_DTB=imx8mn-ddr4-evk.dtb + MKIMG_BIN_PATH=$PRJ_PATH/imx-mkimage/iMX8M/ + + fi +} + +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" + git clone $GIT_URL/$src.git -b $BRANCH + done + + + mkdir -p $FMW_PATH && cd $FMW_PATH + + for fmw in $FMWS + do + if [ -d $fmw ] ; then + pr_info "Firmware $fmw fetch already" + continue + fi + pr_info "start fetch $fmw firmware" + wget $FMW_URL/$fmw.bin + + bash $fmw.bin --auto-accept > /dev/null 2>&1 + done + + rm -f *.bin +} + +function build_atf() +{ + SRC=imx-atf + + pr_warn "start build $SRC" + cd $PRJ_PATH/${SRC} + + make -j${JOBS} CROSS_COMPILE=${CROSS_COMPILE} PLAT=$ATF_PLATFORM bl31 + + set -x + cp build/$ATF_PLATFORM/release/bl31.bin $MKIMG_BIN_PATH + set +x +} + +# Cortex-M SDK download from https://mcuxpresso.nxp.com/ by manual +function build_cortexM() +{ + SRC=mcore-sdk + DEMO_PATH=boards/$MCORE_BOARD/multicore_examples/rpmsg_lite_str_echo_rtos/armgcc + DEMO_BIN=release/rpmsg_lite_str_echo_rtos.bin + export ARMGCC_DIR=$(echo $MCORE_COMPILE | sed 's\/bin/.*\\') + + if [ ! -d $PRJ_PATH/$SRC ] ; then + if [ "$MCORE_BUILD" == "yes" ] ; then + pr_error "INFO: Please download $BOARD SDK from https://mcuxpresso.nxp.com" + pr_error " by manual and decompress it to folder '$SRC'" + exit; + else + pr_warn "Skip build Cortex-M core SDK source code '$SRC'" + return ; + fi + fi + + pr_warn "start build $SRC" + + cd $PRJ_PATH/${SRC} + cd $DEMO_PATH + + #bash clean.sh + if [ ! -s $DEMO_BIN ] ; then + bash build_release.sh + fi + + set -x + cp $DEMO_BIN $MKIMG_BIN_PATH/$MCORE_IMAGE + set +x +} + +function build_uboot() +{ + SRC=uboot-imx + + pr_warn "start build $SRC" + cd $PRJ_PATH/${SRC} + + defconfig=`echo ${BOARD} | sed 's/-/_/g'`_defconfig + if [ ! -f .config ] ; then + make ARCH=arm ${defconfig} + fi + + make -j${JOBS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=arm + + set -x + cp u-boot.bin $MKIMG_BIN_PATH + cp u-boot-nodtb.bin $MKIMG_BIN_PATH + cp spl/u-boot-spl.bin $MKIMG_BIN_PATH + cp arch/arm/dts/${BOARD}.dtb $MKIMG_BIN_PATH/$IMXBOOT_DTB + cp tools/mkimage $MKIMG_BIN_PATH/mkimage_uboot + set +x +} + +# The diagram below illustrate a signed iMX8 flash.bin image layout: +# reference: uboot-imx/doc/imx/habv4/guides/mx8m_secure_boot.txt +# +# +-----------------------------+ +# | | +# | *Signed HDMI/DP FW | +# | | +# +-----------------------------+ +# | Padding | +# ------- +-----------------------------+ -------- +# ^ | IVT - SPL | ^ +# Signed | +-----------------------------+ | +# Data | | u-boot-spl.bin | | +# | | + | | SPL +# v | DDR FW | | Image +# ------- +-----------------------------+ | +# | CSF - SPL + DDR FW | v +# +-----------------------------+ -------- +# | Padding | +# ------- +-----------------------------+ -------- +# Signed ^ | FDT - FIT | ^ +# Data | +-----------------------------+ | +# v | IVT - FIT | | +# ------- +-----------------------------+ | +# | CSF - FIT | | +# ------- +-----------------------------+ | FIT +# ^ | u-boot-nodtb.bin | | Image +# | +-----------------------------+ | +# Signed | | OP-TEE (Optional) | | +# Data | +-----------------------------+ | +# | | bl31.bin (ATF) | | +# | +-----------------------------+ | +# v | u-boot.dtb | v +# ------- +-----------------------------+ -------- +# +# +# Reference: <<IMX_LINUX_USERS_GUIDE.pdf>> 4.5.13 How to build imx-boot image by using imx-mkimage + +function build_imxboot() +{ + SRC=imx-mkimage + + pr_warn "start build $SRC" + cd $PRJ_PATH/${SRC} + + if [[ $BOARD =~ mx93 ]] ; then + pr_info "Copy iMX93 firmware to $MKIMG_BIN_PATH" + + cp $FMW_PATH/firmware-sentinel-*/mx93a0-ahab-container.img $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/lpddr4_imem_1d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/lpddr4_dmem_1d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/lpddr4_imem_2d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/lpddr4_dmem_2d*.bin $MKIMG_BIN_PATH + + elif [[ $BOARD =~ mx8ulp ]] ; then + pr_info "Copy iMX8ULP firmware to $MKIMG_BIN_PATH" + + cp $FMW_PATH/firmware-upower-*/upower_a1.bin $MKIMG_BIN_PATH/upower.bin + cp $FMW_PATH/firmware-sentinel-*/mx8ulpa2-ahab-container.img $MKIMG_BIN_PATH + + elif [[ $BOARD =~ mx8 ]] ; then + pr_info "Copy DDR4 firmware to $MKIMG_BIN_PATH" + + cp $FMW_PATH/firmware-imx-*/firmware/hdmi/cadence/signed_hdmi_imx8m.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/ddr4_imem_1d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/ddr4_dmem_1d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/ddr4_imem_2d*.bin $MKIMG_BIN_PATH + cp $FMW_PATH/firmware-imx-*/firmware/ddr/synopsys/ddr4_dmem_2d*.bin $MKIMG_BIN_PATH + fi + + make SOC=$IMX_BOOT_SOC_TARGET REV=A2 $IMXBOOT_TARGETS + + cp $MKIMG_BIN_PATH/flash.bin u-boot-${BOARD}.imx + chmod a+x u-boot-${BOARD}.imx + + cp u-boot-${BOARD}.imx $PRFX_PATH +} + +function do_build() +{ + cd $PRJ_PATH + mkdir -p $PRFX_PATH + + build_atf + build_cortexM + build_uboot + build_imxboot +} + +function do_install() +{ + cd $PRJ_PATH + + echo "" + pr_info "bootloader installed to '$PRFX_PATH'" + ls $PRFX_PATH && echo "" + + if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then + pr_info "install bootloader to '$INST_PATH'" + cp $PRFX_PATH/u-boot-${BOARD}.imx $INST_PATH + fi +} + +function do_clean() +{ + for d in $SRCS + do + rm -rf $PRJ_PATH/$d + done + + rm -rf $PRJ_PATH/firmware + rm -rf $PRFX_PATH +} + +#+-------------------------+ +#| Shell script body entry | +#+-------------------------+ + +cd $PRJ_PATH + +export_env + +if [[ $# == 1 && $1 == -c ]] ;then + pr_warn "start clean bootloader" + do_clean + exit; +fi + +pr_warn "start build bootloader for ${BOARD}" + +do_fetch + +do_build + +do_install diff --git a/config.json b/config.json new file mode 100644 index 0000000..2e6482e --- /dev/null +++ b/config.json @@ -0,0 +1,17 @@ +{ + "bsp": + { + "board":"imx8mp-evk", + "version":"lf-6.1.22-2.0.0", + "giturl":"https://github.com/nxp-imx/", + "cortexAtool":"/opt/gcc-aarch64-10.3-2021.07/bin/aarch64-none-linux-gnu-", + "cortexMtool":"/opt/gcc-cortexM-10.3-2021.07/bin/arm-none-eabi-" + }, + "system": + { + "distro":"yocto", + "version":"mickledore", + "imgsize":"2048", + "bootsize":"100" + } +} diff --git a/debian/build.sh b/debian/build.sh new file mode 100755 index 0000000..f1821da --- /dev/null +++ b/debian/build.sh @@ -0,0 +1,167 @@ +#!/bin/bash +# This shell script used to fetch debian root file system + +# this project absolute path +PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) + +# the target board name and ARCH(armel/armhf/arm64) +BOARD=igkboard +ARCH=armhf +ARCH=arm64 + +# Debian 11 (bullseye) +CODENAME=bullseye +VERSION=11 + +# Debian 12 (bookworm) +CODENAME=bookworm +VERSION=12 + +# rootfs directory name +ROOTFS_DIR=rootfs-debian-$CODENAME + +# rootfs configuration +DEF_PASSWD=12345 + +# 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" +} + +# Debian 12 depends on the new keyring +# https://packages.debian.org/sid/all/debian-archive-keyring/download +function update_keyring() +{ + debname=debian-archive-keyring + debversion=2023.3 + + set +e + dpkg -l $debname > /dev/null 2>&1 + if [ $? == 0 ] ; then + dpkg -s debian-archive-keyring | grep Version: | grep $debversion > /dev/null 2>&1 + if [ $? != 0 ] ; then + pr_info "updating $debname" + apt purge -y $debname + else + pr_info "$debname is latest" + return; + fi + fi + set -e + + pr_info "install $debname now" + wget http://ftp.us.debian.org/debian/pool/main/d/$debname/${debname}_${debversion}_all.deb > /dev/null + dpkg -i ${debname}_${debversion}_all.deb + rm -f ${debname}_${debversion}_all.deb +} + +function do_install() +{ + pr_warn "\ninstall system tools" + + update_keyring + + debootstrap --version > /dev/null 2>&1 + if [ $? == 0 ] ; then + pr_info "system tools installed already" + return ; + fi + + apt install binfmt-support qemu qemu-user-static debootstrap +} + +function do_fetch() +{ + pr_warn "\ndebootstrap fetch" + + if [ -f ${ROOTFS_DIR}/bin/bash ] ; then + pr_info "debain rootfs fetched already" + return ; + fi + debootstrap --arch=${ARCH} --foreign ${CODENAME} ${ROOTFS_DIR} http://ftp.debian.org/debian/ + + cp -f /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/ + DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot ${ROOTFS_DIR} debootstrap/debootstrap --second-stage + DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot ${ROOTFS_DIR} dpkg --configure -a + rm -f ${ROOTFS_DIR}/usr/bin/qemu-arm-static +} + +function modify_rootfs() +{ + pr_warn "\nmodify rootfs environment" + + # update hostnmae and issue + echo $BOARD > ${ROOTFS_DIR}/etc/hostname + echo "Debian GNU/Linux $VERSION \n \l, default password '$DEF_PASSWD'" > ${ROOTFS_DIR}/etc/issue + + # update dns server + echo "nameserver 223.5.5.5" > ${ROOTFS_DIR}/etc/resolv.conf + echo "nameserver 114.114.114.114" >> ${ROOTFS_DIR}/etc/resolv.conf + + set +e + # add ls alias for display with color + grep "color=auto" ${ROOTFS_DIR}/etc/profile > /dev/null 2>&1 + if [ $? != 0 ] ; then + echo "alias ls='ls --color=auto'" >> ${ROOTFS_DIR}/etc/profile + fi + + grep "^PermitRootLogin" ${ROOTFS_DIR}/etc/ssh/sshd_config > /dev/null 2>&1 + if [ $? != 0 ] ; then + echo "PermitRootLogin yes" >> ${ROOTFS_DIR}/etc/ssh/sshd_config + fi + set -e +} + +function do_conf() +{ + EXTRA_APPS="vim net-tools network-manager tree file parted locales lsb-release tzdata wireless-tools openssh-server" + + pr_warn "\ndebootstrap configure" + + cp -f /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/ + DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot ${ROOTFS_DIR} apt update + DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot ${ROOTFS_DIR} apt install -y ${EXTRA_APPS} + DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot ${ROOTFS_DIR} sh -c "echo root:${DEF_PASSWD} | chpasswd" + rm -f ${ROOTFS_DIR}/usr/bin/qemu-arm-static + + modify_rootfs +} + +function do_pack() +{ + pr_warn "\npackage $ROOTFS_DIR" + + cd $PRJ_PATH/$ROOTFS_DIR + tar -cJf ../$ROOTFS_DIR.tar.xz * +} + +#+-------------------------+ +#| Shell script body start | +#+-------------------------+ + +if [ `id -u` != 0 ] ; then + pr_error "ERRROR: This shell script must excuted as root privilege." + exit 0; +fi + +do_install + +do_fetch + +do_conf + +do_pack diff --git a/images/build.sh b/images/build.sh new file mode 100755 index 0000000..ac9a555 --- /dev/null +++ b/images/build.sh @@ -0,0 +1,279 @@ +#!/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 + +# config file path +CONF_FILE=$TOP_PATH/config.json + +# shell script will exit once get command error +set -e +set -u + +#+-------------------------+ +#| 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 DIS_VER=`jq -r ".system.version" $CONF_FILE | tr 'A-Z' 'a-z'` + export IMAGE_SIZE=`jq -r ".system.imgsize" $CONF_FILE | tr 'A-Z' 'a-z'` + export BOOT_SIZE=`jq -r ".system.bootsize" $CONF_FILE | tr 'A-Z' 'a-z'` + + export LOOP_DEV=`losetup -f | cut -d/ -f3` + export MNT_POINT=$PRJ_PATH/mnt + + export ROOTFS=rootfs-${DIS_VER} + export UBOOT_BINPATH=$TOP_PATH/bootloader/install/ + export KERNEL_BINPATH=$TOP_PATH/kernel/install/ + export ROOTFS_BINPATH=$TOP_PATH/yocto/install/ + + if [[ $BOARD =~ mx8ulp ]] || [[ $BOARD =~ mx8mq ]] || [[ $BOARD =~ mx8mm ]] ; then + export UBOOT_OFFSET_SECTOR=66 + elif [[ $BOARD =~ mx8mn ]] || [[ $BOARD =~ mx8mp ]] || [[ $BOARD =~ mx93 ]] ; then + export UBOOT_OFFSET_SECTOR=64 + elif [[ $BOARD =~ mx6 ]] || [[ $BOARD =~ mx7 ]] ; then + export UBOOT_OFFSET_SECTOR=2 + fi +} + +function do_fetch() +{ + cd $PRJ_PATH + + SRCS=$ROOTFS + + for src in $SRCS + do + if [ -d $ROOTFS/bin ] ; then + pr_info "$src fetched already" + continue + fi + + for tarball in $ROOTFS_BINPATH/rootfs.tar.* + do + if [ -s $tarball ] ; then + mkdir -p $ROOTFS + do_unpack $tarball $ROOTFS + break; + fi + done + done +} + +# System image layout map: +# +-------------------+--------------------+----------------------+ +# | Raw Part(10MB) | FAT32 Part2(100MB) | EXT4 Part3(All left) | +# +-------------------+--------------------+----------------------+ +# | U-boot on #64 | Kernel and DTB | Root file system | +# +-------------------+--------------------+----------------------+ + +function build_image() +{ + export IMAGE_NAME=$BOARD-$DIS_VER.img + + # Uboot size set be 10MB and deployed in 64th sector on eMMC/TFCard + UBOOT_SIZE=10 + + mkdir -p $MNT_POINT + + pr_info "start generate empty system image" + dd if=/dev/zero of=${IMAGE_NAME} bs=1024k count=${IMAGE_SIZE} conv=sync + chmod a+x ${IMAGE_NAME} + + pr_info "start partition system image" + fat_start=$UBOOT_SIZE + fat_end=`expr $UBOOT_SIZE + $BOOT_SIZE` + parted ${IMAGE_NAME} mklabel msdos + parted ${IMAGE_NAME} mkpart primary fat32 ${fat_start}M ${fat_end}M + parted ${IMAGE_NAME} mkpart primary ext4 ${fat_end}M 100% + sync + + pr_info "losetup system image on $LOOP_DEV" + losetup /dev/${LOOP_DEV} ${IMAGE_NAME} + kpartx -av /dev/${LOOP_DEV} + + pr_info "start format system image" + mkfs.vfat /dev/mapper/${LOOP_DEV}p1 + mkfs.ext4 /dev/mapper/${LOOP_DEV}p2 + sync + + pr_info "start install u-boot image" + dd if=$UBOOT_BINPATH/u-boot-${BOARD}.imx of=${IMAGE_NAME} bs=512 seek=$UBOOT_OFFSET_SECTOR conv=notrunc,sync + + pr_info "start install linux kernel images" + mount -t vfat /dev/mapper/${LOOP_DEV}p1 ${MNT_POINT} + cp -rf $KERNEL_BINPATH/Image ${MNT_POINT}/ + cp -rf $KERNEL_BINPATH/${BOARD}.dtb ${MNT_POINT}/ + + sync && umount ${MNT_POINT} + + pr_info "update drivers in root filesystem" + rm -rf $ROOTFS/lib/modules/ + mkdir -p $ROOTFS/lib/modules/ + cp -rf $KERNEL_BINPATH/lib/modules/[0-9]*\.[0-9]*\.[0-9]* $ROOTFS/lib/modules/ + + pr_info "start install root filesystem" + mount -t ext4 /dev/mapper/${LOOP_DEV}p2 ${MNT_POINT} + cp -af $ROOTFS/* ${MNT_POINT} + sync && umount ${MNT_POINT} + + pr_warn "Build $BOARD-$BSP_VER-$DIS_VER system image done" +} + +function exit_handler() +{ + pr_warn "Shell script exit now, do some clean work\n" + set +e + + if mountpoint ${MNT_POINT} > /dev/null 2>&1 ; then + pr_info "umount ${MNT_POINT}" + umount ${MNT_POINT} > /dev/null 2>&1 + fi + + rm -rf ${MNT_POINT} + + if [ -e /dev/mapper/${LOOP_DEV}p1 ] ; then + pr_info "kpartx -dv /dev/${LOOP_DEV}" + kpartx -dv /dev/${LOOP_DEV} + fi + + losetup -a | grep "${LOOP_DEV}" > /dev/null 2>&1 + if [ $? == 0 ] ; then + pr_info "losetup -d /dev/${LOOP_DEV}" + losetup -d /dev/${LOOP_DEV} + fi +} + +function do_build() +{ + cd $PRJ_PATH + + build_image +} + +function do_install() +{ + cd $PRJ_PATH + + mkdir -p $PRFX_PATH + cp $UBOOT_BINPATH/u-boot-${BOARD}.imx $PRFX_PATH + mv $IMAGE_NAME $PRFX_PATH + + if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then + pr_info "install bootloader and system image to '$INST_PATH'" + cp $PRFX_PATH/u-boot-${BOARD}.imx $INST_PATH + cp $PRFX_PATH/$IMAGE_NAME $INST_PATH + fi +} + + +function do_clean() +{ + for d in rootfs-* + do + rm -rf $PRJ_PATH/$d + done + + rm -rf $PRFX_PATH + rm -f *.img +} + +#+-------------------------+ +#| Shell script body entry | +#+-------------------------+ + +if [ `id -u` != 0 ] ; then + pr_error "ERROR: This shell script must run as root" + exit; +fi + +cd $PRJ_PATH + +export_env + +if [[ $# == 1 && $1 == -c ]] ;then + pr_warn "start clean system image" + do_clean + exit; +fi + +pr_warn "Build $BOARD-$BSP_VER-$DIS_VER system image" + +trap 'exit_handler' EXIT + +do_fetch + +do_build + +do_install + diff --git a/kernel/build.sh b/kernel/build.sh new file mode 100755 index 0000000..71d697c --- /dev/null +++ b/kernel/build.sh @@ -0,0 +1,142 @@ +#!/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 + +# 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" +} + +# 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 GIT_URL=`jq -r ".bsp.giturl" $CONF_FILE | tr 'A-Z' 'a-z'` + export CROSS_COMPILE=`jq -r ".bsp.cortexAtool" $CONF_FILE | tr 'A-Z' 'a-z'` + + export BRANCH=$BSP_VER + export KER_PATH=$PRJ_PATH/linux-imx + + export JOBS=`cat /proc/cpuinfo | grep processor | wc -l` + export ARCH=arm64 + export SRCS="linux-imx" +} + +function build_kernel() +{ + cd $PRJ_PATH + + if [ -d $KER_PATH ] ; then + pr_info "linux kernel source code fetched already" + else + pr_info "start fetch linux kernel source code" + git clone $GIT_URL/linux-imx.git -b $BRANCH + fi + + pr_info "Start build linux kernel source code" + + cd $KER_PATH + + defconfig=imx_v8_defconfig + if [ ! -s .config ] ; then + make ${defconfig} + fi + + make -j ${JOBS} +} + +function do_install() +{ + pr_info "start install linux kernel images" + + cd $KER_PATH + + if [ -d $PRFX_PATH ] ; then + rm -rf $PRFX_PATH/* + else + mkdir -p $PRFX_PATH + fi + + # Install image + cp arch/arm64/boot/Image $PRFX_PATH + cp arch/arm64/boot/dts/freescale/${BOARD}.dtb $PRFX_PATH + + # Install kernel modules + make modules_install INSTALL_MOD_PATH=$PRFX_PATH INSTALL_MOD_STRIP=1 + + echo "" + pr_info "linux kernel installed to '$PRFX_PATH'" + ls $PRFX_PATH && echo "" + + if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then + pr_info "install linux kernel to '$INST_PATH'" + cp $PRFX_PATH/Image $INST_PATH + cp $PRFX_PATH/${BOARD}.dtb $INST_PATH + fi +} + +function do_build() +{ + cd $PRJ_PATH + + build_kernel + + do_install +} + +function do_clean() +{ + cd $PRJ_PATH + + for d in $SRCS + do + rm -rf $PRJ_PATH/$d + done + + rm -rf $PRFX_PATH +} + +#+-------------------------+ +#| Shell script body entry | +#+-------------------------+ + +export_env + +if [[ $# == 1 && $1 == -c ]] ;then + pr_warn "start clean linux kernel" + do_clean + exit; +fi + +pr_warn "start build linux kernel for ${BOARD}" + +do_build + diff --git a/tools/imgmnt b/tools/imgmnt new file mode 100755 index 0000000..0999302 --- /dev/null +++ b/tools/imgmnt @@ -0,0 +1,120 @@ +#!/bin/bash +# This shell script used mount/umount an linux system image and update it + +mnt_boot=boot +mnt_root=rootfs + +function mount_image() +{ + img_file=$1 + loop_dev=`losetup -f | cut -d/ -f3` + + if [ ! -s $img_file ] ; then + echo "ERROR: $img_file not found!" + exit 1; + fi + + if [ -z $loop_dev ] ; then + echo "ERROR: loop dev not found!" + exit 2; + fi + + echo "INFO: losetup /dev/${loop_dev} ${img_file}" + losetup /dev/${loop_dev} ${img_file} + if [ $? != 0 ] ; then + echo "ERROR: losetup /dev/${loop_dev} ${img_file} failed!" + exit 3; + fi + + echo "INFO: kpartx -av /dev/${loop_dev}" + kpartx -av /dev/${loop_dev} + + echo "INFO: mount ${mnt_boot} ${mnt_root}" + mkdir -p ${mnt_boot} ${mnt_root} + mount /dev/mapper/${loop_dev}p1 ${mnt_boot} + mount /dev/mapper/${loop_dev}p2 ${mnt_root} + + echo "INFO: mount $img_file done." +} + +function umount_image() +{ + img_file=$1 + + mountpoint $mnt_boot > /dev/null 2>&1 + if [ $? == 0 ] ; then + echo "INFO: umount ${mnt_boot}" + umount ${mnt_boot} + rmdir ${mnt_boot} + fi + + mountpoint $mnt_root > /dev/null 2>&1 + if [ $? == 0 ] ; then + echo "INFO: umount ${mnt_root}" + umount ${mnt_root} + rmdir ${mnt_root} + fi + + # loop_dev should be 'loopX' such as 'loop9'. + loop_dev=`losetup -a | grep $img_file| cut -d: -f1 | cut -d/ -f3` + if [[ -z $loop_dev ]] ; then + exit; + fi + + if [[ -e /dev/mapper/${loop_dev}p1 ]] ; then + echo "INFO: kpartx -dv /dev/${loop_dev}" + kpartx -dv /dev/${loop_dev} + fi + + echo "INFO: losetup -d /dev/${loop_dev}" + losetup -d /dev/${loop_dev} + + echo "INFO: umount $img_file done." +} + + +function do_usage() +{ + echo "" + echo "Usage:" + echo " $0 [-m] [-u] image_file" + echo " -m: mount the image file" + echo " -u: umount the image file" + echo "" + exit; +} + +action= +img_file= + +while getopts "mu" OPTNAME +do + case "${OPTNAME}" in + "m") + action=mount + ;; + + "u") + action=umount + ;; + + "*") + do_usage + ;; + esac +done + +shift $(( $OPTIND-1 )) +img_file=$1 + +if [[ -z $img_file ]] || [[ -z $action ]] ; then + do_usage + exit; +fi + +if [ $action == "mount" ] ; then + mount_image $img_file +elif [ $action == "umount" ] ; then + umount_image $img_file +fi + diff --git a/tools/setup_tools.sh b/tools/setup_tools.sh new file mode 100755 index 0000000..5e4314c --- /dev/null +++ b/tools/setup_tools.sh @@ -0,0 +1,120 @@ +#!/bin/bash +# This shell script used to install system tools + +# display in red +function pr_error() { + echo -e "\033[40;31m --E-- $1 \033[0m\n" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m\n" +} + +if [ `id -u` != 0 ] ; then + echo "" + pr_error "This shell script must be excuted as root privilege" + exit; +fi + +function install_systools() +{ + if command -v jq > /dev/null 2>&1 ; then + pr_info "All system tools already installed, skip it" + return 0; + fi + + pr_info "start apt install system tools(commands)" + + systools="coreutils jq wget curl tree gawk sed unzip cpio bc lzop zstd rsync kmod kpartx \ + desktop-file-utils iputils-ping xterm diffstat chrpath asciidoc docbook-utils help2man \ + build-essential gcc g++ make cmake automake groff socat flex texinfo bison texi2html \ + git cvs subversion mercurial autoconf autoconf-archive parted dosfstools \ + python3 python3-pip python3-pexpect python3-git python3-jinja2 \ + lib32z1 libssl-dev libncurses-dev libgl1-mesa-dev libglu1-mesa-dev libsdl1.2-dev " + + apt update > /dev/null 2>&1 + apt install -y $systools +} + + +function install_devtools() +{ + if command -v debootstrap > /dev/null 2>&1 ; then + pr_info "All development tools already installed, skip it" + return 0; + fi + + pr_info "start apt install devlopment tools(commands)" + + devtools="u-boot-tools mtd-utils device-tree-compiler binfmt-support \ + qemu qemu-user-static debootstrap debian-archive-keyring " + + apt install -y $devtools +} + + +# NXP document suggest cross compiler from ARM Developer: +# https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads +function install_crosstool() +{ + ARMTOOL_VER=10.3-2021.07 + + CortexM_PACK=gcc-arm-none-eabi-$ARMTOOL_VER-`uname -p`-linux + CortexM_TAR=$CortexM_PACK.tar.bz2 + CortexM_URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/$ARMTOOL_VER/ + CortexM_NAME=gcc-cortexM-$ARMTOOL_VER + + # Crosstool for Cortex-M download from ARM Developer + + if [ -d /opt/$CortexM_NAME ] ; then + pr_info "Cortex-M crosstool /opt/$CortexM_NAME installed already, skip it" + else + if [ ! -s $CortexM_TAR ] ; then + pr_info "start download cross compiler from ARM Developer for Cortex-M core" + wget $CortexM_URL/$CortexM_TAR + fi + + pr_info "start decompress cross compiler for Cortex-M core" + tar -xjf $CortexM_TAR -C /opt + mv /opt/gcc-arm-none-eabi-$ARMTOOL_VER /opt/$CortexM_NAME + rm -f $CortexM_TAR + + /opt/$CortexM_NAME/bin/arm-none-eabi-gcc -v + pr_info "cross compiler for Cortex-M installed to \"/opt/$CortexM_NAME\" successfully" + fi + + # Crosstool for Cortex-A download from ARM Developer + + CortexA_PACK=gcc-arm-$ARMTOOL_VER-`uname -p`-aarch64-none-linux-gnu + CortexA_TAR=$CortexA_PACK.tar.xz + CortexA_URL=https://developer.arm.com/-/media/Files/downloads/gnu-a/$ARMTOOL_VER/binrel/ + CortexA_NAME=gcc-aarch64-$ARMTOOL_VER + + if [ -d /opt/$CortexA_NAME ] ; then + pr_info "Cortex-A crosstool /opt/$CortexA_NAME installed already, skip it" + else + if [ ! -s $CortexA_TAR ] ; then + pr_info "start download cross compiler from ARM Developer for Cortex-A core" + wget $CortexA_URL/$CortexA_TAR + fi + + pr_info "start decompress cross compiler for Cortex-A core" + tar -xJf $CortexA_TAR -C /opt + mv /opt/$CortexA_PACK /opt/$CortexA_NAME + rm -f $CortexA_TAR + + /opt/$CortexA_NAME/bin/aarch64-none-linux-gnu-gcc -v + pr_info "cross compiler for Cortex-A installed to \"/opt/$CortexA_NAME\" successfully" + fi +} + +echo "" +set -e + +install_systools + +install_devtools + +install_crosstool + diff --git a/yocto/build.sh b/yocto/build.sh new file mode 100755 index 0000000..756d044 --- /dev/null +++ b/yocto/build.sh @@ -0,0 +1,149 @@ +#!/bin/bash + +# bitbake target +BB_TARGET=imx-image-full + +# this project absolute path +PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) + +# top project absolute path +TOP_PATH=$(realpath $PRJ_PATH/..) + +# binaries install path +INST_PATH=$PRJ_PATH/install + +# config file path +CONF_FILE=$TOP_PATH/config.json + +# Download path +#DL_PATH="/srv/yocto_packets/" + +# 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" +} + +# 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 GIT_URL=`jq -r ".bsp.giturl" $CONF_FILE | tr 'A-Z' 'a-z'` + export YCT_VER=`jq -r ".system.version" $CONF_FILE | tr 'A-Z' 'a-z'` + + export YCT_PATH=$PRJ_PATH/$YCT_VER-$BSP_VER + export BUILD_DIR=${BOARD} + + if [[ $BOARD =~ mx93 ]] ; then + YCT_MACHINE=imx93evk + elif [[ $BOARD =~ mx8ulp ]] ; then + YCT_MACHINE=imx8ulp-lpddr4-evk + elif [[ $BOARD =~ mx8mq ]] ; then + YCT_MACHINE=imx8mqevk + elif [[ $BOARD =~ mx8mp ]] ; then + YCT_MACHINE=imx8mp-ddr4-evk + elif [[ $BOARD =~ mx8mm ]] ; then + YCT_MACHINE=imx8mm-ddr4-evk + elif [[ $BOARD =~ mx8mn ]] ; then + YCT_MACHINE=imx8mn-ddr4-evk + fi +} + +function do_fetch() +{ + mkdir -p $YCT_PATH && cd $YCT_PATH + + if [ ! -d sources ] ; then + pr_info "start repo fetch Yocto $YCT_VER source code" + + if ! command -v repo > /dev/null 2>&1 ; then + curl https://storage.googleapis.com/git-repo-downloads/repo > repo + chmod a+x repo + export PATH=$YCT_PATH:$PATH + fi + + BSP_VER=`echo $BSP_VER | sed 's/lf/imx/'` + repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-$YCT_VER -m $BSP_VER.xml + repo sync && rm -f repo + + else + pr_warn "Yocto $YCT_VER source code fetched already" + fi +} + +function do_build() +{ + cd $YCT_PATH + + if [ ! -f ${BUILD_DIR}/conf/local.conf ] ; then + pr_info "source imx-setup-release.sh for $BOARD" + DISTRO=fsl-imx-wayland MACHINE=$YCT_MACHINE source imx-setup-release.sh -b $BUILD_DIR + else + pr_info "source poky/oe-init-build-env" + source sources/poky/oe-init-build-env $BUILD_DIR + fi + + if [[ -n "$DL_PATH" ]] ; then + sed -i "s|^#DL_DIR.*|DL_DIR ?= \"$DL_PATH\"|g" conf/local.conf + sed -i "s|^DL_DIR.*|DL_DIR ?= \"$DL_PATH\"|g" conf/local.conf + fi + + bitbake $BB_TARGET +} + +function do_install() +{ + cd $YCT_PATH + + echo "" + pr_info "Yocto($YCT_VER) installed to '$INST_PATH'" + + mkdir -p ${INST_PATH} + cp $BUILD_DIR/tmp/deploy/images/*/$BB_TARGET-*.rootfs.tar.zst ${INST_PATH}/rootfs.tar.zst + cp $BUILD_DIR/tmp/deploy/images/*/imx-boot ${INST_PATH}/u-boot-${BOARD}.imx + chmod a+x ${INST_PATH}/u-boot-${BOARD}.imx + cp $BUILD_DIR/tmp/deploy/images/*/$BB_TARGET-*.wic.zst ${INST_PATH} + + ls ${INST_PATH} && echo "" +} + +function do_clean() +{ + cd $PRJ_PATH + + rm -rf $INST_PATH +} + +#+-------------------------+ +#| Shell script body entry | +#+-------------------------+ + +export_env + +if [[ $# == 1 && $1 == -c ]] ;then + pr_warn "start clean Yocto source code" + do_clean + exit; +fi + +pr_warn "start build Yocto $YCT_VER for ${BOARD}" + +do_fetch + +do_build + +do_install -- Gitblit v1.9.1