#!/bin/bash # 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 # 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" } # 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 URL=`jq -r ".bsp.download" $CONF_FILE | tr 'A-Z' 'a-z'` export CROSS_COMPILE=`jq -r ".bsp.crosstool" $CONF_FILE | tr 'A-Z' 'a-z'` export JOBS=`cat /proc/cpuinfo | grep processor | wc -l` export KER_PATH=$PRJ_PATH/linux-imx if [[ $BOARD =~ 6ull ]] ; then export ARCH=arm export SRCS="linux-imx" elif [[ $BOARD =~ 8mp ]] ; then export ARCH=arm64 export SRCS="linux-imx" else pr_error "\nERROR: Unknow board name $BOARD" exit; fi } # 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 } function do_fetch() { mkdir -p $TARBALL_PATH cd $PRJ_PATH for src in $SRCS do if [ -d $src ] ; then pr_info "$src fetched already" continue fi # Download source code packet if [ ! -s $TARBALL_PATH/$src.tar.xz ] ; then pr_info "start fetch $src source code" wget $URL/bsp/$BSP_VER/$src.tar.xz -P $TARBALL_PATH fi # decompress source code packet do_unpack $TARBALL_PATH/$src.tar.xz # do patch if patch file exist patch_path=$PRJ_PATH/patches/$BOARD patch_file=$patch_path/${src}-${BSP_VER}.patch if [ -f $patch_file ] ; then pr_info "found and patch for $src" patch -p0 < $patch_file fi done rm -f *.tar.* } function build_kernel() { SRC=linux-imx pr_info "Start build linux kernel source code" cd $PRJ_PATH/${SRC} if [ ! -s .config ] ; then make ARCH=${ARCH} ${BOARD}_defconfig fi make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -j ${JOBS} } function build_driver_wifi() { cd $PRJ_PATH/drivers if [[ $BOARD =~ 6ull ]] ; then SRC=rtl8188fu pr_info "Start build $SRC driver for $BOARD" if [ ! -d $SRC ] ; then if [ ! -s $TARBALL_PATH/$SRC.tar.xz ] ; then pr_info "start fetch $SRC source code" wget $URL/bsp/misc/$SRC.tar.xz -P $TARBALL_PATH fi do_unpack $TARBALL_PATH/$SRC.tar.xz fi cd $SRC # Remove noisy debug print information sed -i "s|^#define CONFIG_DEBUG|//#define CONFIG_DEBUG|g" include/autoconf.h sed -i "/nolinked power/d" core/rtw_pwrctrl.c sed -i "/request firmware/d" hal/rtl8188f/rtl8188f_hal_init.c make KSRC=$KER_PATH M=$PWD -j ${JOBS} make -C $KER_PATH M=$PWD modules_install INSTALL_MOD_PATH=$INST_PATH INSTALL_MOD_STRIP=1 mkdir -p $INST_PATH/lib/firmware/rtlwifi/ cp firmware/rtl8188fufw.bin $INST_PATH/lib/firmware/rtlwifi/ fi } function build_driver_user() { cd $PRJ_PATH/drivers/user pr_info "Start build user driver for $BOARD" make -C $KER_PATH M=$PWD make -C $KER_PATH M=$PWD modules_install INSTALL_MOD_PATH=$INST_PATH INSTALL_MOD_STRIP=1 } function install_drv_kernel() { # Install linux kernel modules cd $KER_PATH make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} modules_install INSTALL_MOD_PATH=$INST_PATH INSTALL_MOD_STRIP=1 } function build_driver() { install_drv_kernel build_driver_user build_driver_wifi } function do_install() { pr_info "Start install linux kernel images" # Cleanup install path if [ -d $INST_PATH ] ; then rm -rf $INST_PATH/* fi mkdir -p $INST_PATH/overlays cd $KER_PATH # Install system image and device tree binaries if [[ $BOARD =~ 6ull ]] ; then set -x cp arch/${ARCH}/boot/zImage $INST_PATH cp arch/${ARCH}/boot/dts/${BOARD}.dtb $INST_PATH cp arch/${ARCH}/boot/dts/${BOARD}/*.dtbo $INST_PATH/overlays set +x elif [[ $BOARD =~ 8mp ]] ; then set -x cp arch/${ARCH}/boot/Image $INST_PATH cp arch/${ARCH}/boot/dts/freescale/${BOARD}.dtb $INST_PATH cp arch/${ARCH}/boot/dts/freescale/${BOARD}/*.dtbo $INST_PATH/overlays set +x fi # List install information pr_info "\nlinux kernel installed to '$INST_PATH'" ls $INST_PATH && echo "" } function do_build() { cd $PRJ_PATH build_kernel do_install build_driver } function do_clean() { cd $PRJ_PATH for d in $SRCS do rm -rf $PRJ_PATH/$d done rm -rf drivers/rtl8188fu/ rm -rf $TARBALL_PATH rm -rf $INST_PATH } #+-------------------------+ #| Shell script body entry | #+-------------------------+ cd $PRJ_PATH 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_fetch do_build