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