封装mtk7986/7988启动镜像

mk_image.sh -p mt7986a -d spim-nand -b openwrt-mediatek-filogic-bananapi_bpi-r3-snand-preloader.bin -f openwrt-mediatek-filogic-bananapi_bpi-r3-snand-bl31-uboot.fip -k openwrt-mediatek-mt7986-BPI-R3-NAND-WAN1-RJ45-squashfs-factory.bin -o -c nand.yaml r3.img
u-boot可以用自己编译的(参考:https://blog.hetao.me/2024/07/02/mtk-7986-7988%e6%9d%bf%e5%ad%90%e5%90%af%e5%8a%a8%e8%bf%87%e7%a8%8b%e5%8f%8au-boot%e7%bc%96%e8%af%91/),也可以从openwrt上下载(https://downloads.openwrt.org/snapshots/targets/mediatek/filogic/)

mk_image.sh内容
这个脚本是搬运的

#!/bin/bash
# Copyright (C) 2021-2022 SkyLake Huang
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Use this script to compose single image.
# Author: SkyLake Huang
# Email: skylake.huang@mediatek.com

#global variables:
bl2_start_dec=0
bl2_start_hex=0x0
rf_start_dec=0
rf_start_hex=0x0
fip_start_dec=0
fip_start_hex=0x0
kernel_start_dec=0
kernel_start_hex=0x0
rootfs_start_dec=0
rootfs_start_hex=0x0
rootfs_image=""

# Regular Colors
RED='\033[0;31m'
NC='\033[0m'

usage() {
        printf 'Usage:\n'\
'  ./mk_image -p <platform>\n'\
'             -d <flash device type>\n'\
'             -c <partition config>\n'\
'             -b <BL2 image>, default=bl2.img\n'\
'             -r <RF image>\n'\
'             -f <FIP image>, default=fip.bin\n'\
'             -k <kernel image>\n'\
'             -g <GPT table>\n'\
'             -h <usage menu>\n'\
'             -o <single image name>\n'\
'  example:\n'\
'    ./mk_image.sh -p mt7986a -d emmc \\\n'\
'                  -g GPT_EMMC-iap-20220125 \\\n'\
'                  -f fip-iap-emmc-20220125.bin \\\n'\
'                  -k OF_openwrt-mediatek-mt7986-mt7986a-ax6000-emmc-rfb-squashfs-sysupgrade.bin\n'\
'    ./mk_image.sh -p mt7986a -d spim-nand \\\n'\
'                  -b bl2-iap-snand-20220114.img \\\n'\
'                  -f fip-snand-20220114.bin \\\n'\
'                  -k OF_openwrt-mediatek-mt7986-mt7986a-ax6000-spim-nand-rfb-squashfs-factory.bin \\\n'
        exit
}

parse_yaml() {
        local prefix=2
        local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=(echo @|tr @ '\034')
        sed -ne "s|^\(s\):|\1|" \
                -e "s|^\(s\)\(w\)s:s[\"']\(.*\)[\"']s\|\1fs\2fs\3|p" \
                -e "s|^\(s\)\(w\)s:s\(.*\)s\|\1fs\2fs\3|p"1 |
        awk -Ffs '{
                indent = length(1)/2;
                vname[indent] = 2;
                for (i in vname) {if (i>indent) {delete vname[i]}}
                if (length(3) > 0) {
                        vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
                        printf("%s=%s\n", 2,3);
                }
        }'
}

load_partition() {
        IFS='\r\n'
        for line in `parse_yamlpartition_config`; do
                IFS='=' read -ra arr <<< "line"
                case "{arr[0]}" in
                        bl2_start )
                                bl2_start_hex={arr[1]}
                                bl2_start_dec=`printf '%d'bl2_start_hex`
                                ;;
                        rf_start )
                                rf_start_hex={arr[1]}
                                rf_start_dec=`printf '%d'rf_start_hex`
                                ;;
                        fip_start )
                                fip_start_hex={arr[1]}
                                fip_start_dec=`printf '%d'fip_start_hex`
                                ;;
                        kernel_start )
                                kernel_start_hex={arr[1]}
                                kernel_start_dec=`printf '%d'kernel_start_hex`
                                ;;
                        rootfs_start )
                                rootfs_start_hex={arr[1]}
                                rootfs_start_dec=`printf '%d'rootfs_start_hex`
                esac
        done
}

prepare_image() {
        # Pad empty bytes to single image first
        if [[ -z kernel_image ]]
        then
                if [[flash_type == "emmc" ]] || [[ flash_type == "sd" ]]
                then
                        dd if=/dev/zero ibs=fip_start_dec count=1 status=none \
                                > single_image
                else
                        dd if=/dev/zero ibs=fip_start_dec count=1 status=none \
                                | tr "\000" "\377" > single_image
                fi
        else
                if [[flash_type == "emmc" ]] || [[ flash_type == "sd" ]]
                then
                        dd if=/dev/zero ibs=kernel_start_dec count=1 status=none \
                                > single_image 2>&1
                else
                        dd if=/dev/zero ibs=kernel_start_dec count=1 status=none \
                                | tr "\000" "\377" > single_image 2>&1
                fi
        fi
}

extract_sdmmc_kernel() {
        output=`tar -xvfkernel_image | awk {'print 1'}`
        IFS='\n' read -d "\034" -r -a output_arr <<< "output"

        #For debugging
        #echo "There are{#output_arr[*]}" next lines in the output.

        for filename in "{output_arr[@]}";
        do
                if [[ "filename" == *"kernel" ]]
                then
                        kernel_image=filename
                elif [[ "filename" == *"root" ]]
                then
                        rootfs_image=filename
                fi
        done
}

start_wrapping() {
        printf "[Start wrapping %s single image......]\n"flash_type

        if [[ flash_type != "emmc" ]]
        then
                printf "[wrapping BL2 image......]\n"
                dd if=bl2_image of=single_image bs=512 \
                        seek=(( (bl2_start_dec/512) )) conv=notrunc status=none
        fi

        if [[flash_type == "emmc" ]] || [[ flash_type == "sd" ]]
        then
                printf "[wrapping GPT......]\n"
                dd if=gpt of=single_image bs=512 seek=0 conv=notrunc status=none
        fi

        if [[ -nrf_image ]]
        then
                printf "[wrapping RF image......]\n"
                dd if=rf_image of=single_image bs=512 \
                        seek=(( (rf_start_dec/512) )) conv=notrunc status=none
        fi

        printf "[wrapping FIP image......]\n"
        dd if=fip_image of=single_image bs=512 \
                seek=(( (fip_start_dec/512) )) conv=notrunc status=none

        if [[ -n kernel_image ]]
        then
                printf "[wrapping kernel image......]\n"
                if [[flash_type == "emmc" ]] || [[ flash_type == "sd" ]]
                then
                        extract_sdmmc_kernel
                        dd if=kernel_image of=single_image bs=512 \
                                seek=(( (kernel_start_dec/512) )) conv=notrunc status=none
                        printf "[wrapping rootfs image......]\n"
                        dd if=rootfs_image of=single_image bs=512 \
                                seek=(( (rootfs_start_dec/512) )) conv=notrunc status=none
                else
                        dd if=kernel_image of=single_image bs=512 \
                                seek=(( (kernel_start_dec/512) )) conv=notrunc status=none
                fi
        fi
}

if [# -lt 1 ]
then
        usage
        exit 1
fi

## We set default values for some arguments
bl2_image="bl2.img"
bl2_default=1
fip_image="fip.bin"
fip_default=1
partition_config=""
partition_config_default=1

while [ "1" != "" ]; do
        case1 in
        -h )
                usage
                ;;
        -p )
                shift
                platform=1
                ;;
        -d )
                shift
                flash_type=1
                ;;
        -c )
                shift
                partition_config=1
                partition_config_default=0
                ;;
        -b )
                shift
                bl2_image=1
                bl2_default=0
                ;;
        -f )
                shift
                fip_image=1
                fip_default=0
                ;;
        -k )
                shift
                kernel_image=1
                ;;
        -g )
                shift
                gpt=1
                ;;
        -o )
                shift
                single_image=1
                ;;
        -r )
                shift
                rf_image=1
                ;;
        esac
        shift
done


######## Check if variables are valid ########
check_ok=1
if ! [[platform =~ ^(mt7981abd|mt7981c|mt7986a|mt7986b)]]; then
        printf "{RED}Platform must be in mt7981abd|mt7981c|mt7986a|mt7986b\n{NC}"
        usage
        exit 1
fi
if ! [[flash_type =~ ^(snfi-nand|spim-nand|spim-nor|emmc|sd)]]; then
        printf "{RED}Flash type must be in snfi-nand|spim-nand|spim-nor|emmc|sd\n{NC}"
        usage
        exit 1
fi

if [[partition_config_default -eq 1 ]]; then
        partition_config="partitions/{flash_type}-default.yml"
fi

if [[flash_type =~ ^(emmc|sd)]] && [[ -zgpt ]]; then
        printf "{RED}GPT table must be provided if flash type is emmc or sd\n{NC}"
        usage
        exit 1
fi

if [[ -n gpt ]] && ! [[ -fgpt ]]; then
        printf "{RED}GPT table provided doesn't exist.\n{NC}"
        exit 1
fi
if [[ -n rf_image ]] && ! [[ -frf_image ]]; then
        printf "{RED}RF image provided doesn't exist.\n{NC}"
        exit 1
fi
if [[ -n kernel_image ]] && ! [[ -fkernel_image ]]; then
        printf "{RED}Kernel image provided doesn't exist.\n{NC}"
        exit 1
fi

##############################################
if ! [[ -f partition_config ]]
then
        if [[partition_config_default -eq 1 ]]
        then
                printf "{RED}Default partition config{NC}"
        else
                printf "{RED}Partition config provided{NC}"
        fi
        printf "{RED} doesn't exist: %s\n{NC}" partition_config
        exit 1
fi
printf "* Partition config: %s\n"partition_config

if ! [[ -f bl2_image ]]
then
        if [[bl2_default -eq 1 ]]
        then
                printf "{RED}Default BL2 image{NC}"
        else
                printf "{RED}BL2 image provided{NC}"
        fi
        printf "{RED} doesn't exist: %s\n{NC}" bl2_image
        exit 1
fi
printf "* BL2 image name: %s\n"bl2_image

if ! [[ -f fip_image ]]
then
        if [[fip_default -eq 1 ]]
        then
                printf "{RED}Default FIP image"
        else
                printf "{RED}FIP image provided"
        fi
        printf "{RED} doesn't exist: %s\n{NC}" fip_image
        exit 1
fi
printf "* FIP image name: %s\n"fip_image

if [[ -z single_image ]]
then
        single_image="platform-flash_type-(date +%Y%m%d)-single-image.bin"
        printf "* Single image name: %s\n" single_image
fi

if [[check_ok == 1 ]]; then
        #printf "./mk_image -p %s -d %s\n" platformflash_type
        load_partition
        prepare_image
        start_wrapping
fi

nand镜像的分区配置文件(nand.yaml):

# Copyright (C) 2021-2022 SkyLake Huang
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

# NAND flash layout:
#       0x0~0x100000: BL2,       1024K
#  0x100000~0x180000: Uboot env,  512K
#  0x180000~0x380000: RF,        2048K
#  0x380000~0x580000: FIP,       2048K
#  0x580000~        : firmware

spim-nand:
  bl2_start: 0x0
  rf_start: 0x180000
  fip_start: 0x380000
  kernel_start: 0x580000

发表回复