Open 1715173329 opened 2 months ago
由于过去部分用户不屑于与起夜急设备一样使用传统 TFTP 刷写方式,因此在 hanwckf/bl-mt798x 基础上实现了引导和刷写主线 OpenWrt(下称主线)all in FIT(.itb)格式的固件。
.itb
新的 U-Boot 会自适应固件格式,只需要对齐 分区表、bootargs、bootconf 即可正常使用主线固件;也推荐一起对齐 uboot env 以方便在 OpenWrt 内更改。
分区表
bootargs
bootconf
uboot env
[!NOTE] 关于 hanwckf/bl-mt798x,参阅 mt798x uboot 功能介绍,本篇不再重复。
[!TIP] 可以参考我的分支 fit-example。
[!WARNING] 需要注意主线 FIT 固件强制禁用 NMBM。NAND Mapped-block Management 是 MTK 开发的一种透明 NAND 坏块管理方案。虽称是为了“方便”在 NAND 上使用其他文件系统,但现在大多固件都使用 UBI layer,本身就能优秀地处理坏块。开启 NMBM 会导致 UBI 无法识别坏块,也无法做到磨损均匀,是完全不需要的存在。 对于使用 NAND 的设备,从开启 NMBM 的固件刷入到主线 OpenWrt 前,应备份好数据,特别是 Config/Factory 一类的分区。如果有坏块存在,开启和关闭 NMBM 后读出的数据将不一致并且会造成数据损坏。 [!NOTE] 在主线 FIT 固件中,kernel 和 rootfs 已被集成在一起,因此不再需要单独的 kernel 和 rootfs 卷/分区,取而代之的是 fit(NAND)和 production(eMMC)。要使用此 U-Boot 引导主线固件,不能存在 kernel 卷/分区。
[!WARNING] 需要注意主线 FIT 固件强制禁用 NMBM。NAND Mapped-block Management 是 MTK 开发的一种透明 NAND 坏块管理方案。虽称是为了“方便”在 NAND 上使用其他文件系统,但现在大多固件都使用 UBI layer,本身就能优秀地处理坏块。开启 NMBM 会导致 UBI 无法识别坏块,也无法做到磨损均匀,是完全不需要的存在。 对于使用 NAND 的设备,从开启 NMBM 的固件刷入到主线 OpenWrt 前,应备份好数据,特别是 Config/Factory 一类的分区。如果有坏块存在,开启和关闭 NMBM 后读出的数据将不一致并且会造成数据损坏。
[!NOTE] 在主线 FIT 固件中,kernel 和 rootfs 已被集成在一起,因此不再需要单独的 kernel 和 rootfs 卷/分区,取而代之的是 fit(NAND)和 production(eMMC)。要使用此 U-Boot 引导主线固件,不能存在 kernel 卷/分区。
kernel
rootfs
fit
production
NAND 设备
此处以 诺基亚贝尔 EA0326GMP 为例,查询主线的分区信息,将其替换到 U-Boot 配置中,如下:
# CONFIG_ENABLE_NAND_NMBM is not set # CONFIG_CMD_NMBM is not set CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0" CONFIG_MTDPARTS_DEFAULT="spi-nand0:1024k(bl2),512k(u-boot-env),2048k(factory),2048k(fip),2048k(Config),2048k(Config2),121344k(ubi)"
在 dts 中,reg 为 16 进制的 Bytes,一前一后分别代表分区起始偏移量以及大小。 如 reg = <0x980000 0x7680000>; 代表此分区从 9961472 Bytes(9728 KiB)开始,分区大小为 124256256 Bytes(121344 KiB)。
reg = <0x980000 0x7680000>;
9961472 Bytes
9728 KiB
124256256 Bytes
121344 KiB
eMMC 设备
刷入由主线提供的 GPT 分区表即可。
设置 bootargs
如果主线中的 dts 已经指定了 bootargs,可以跳过此步。
对于 OpenWrt 23.05 固件
使用 NAND 的设备不需要指定此变量。
eMMC 设备的 bootargs 为:
root=/dev/mmcblk0p65 rootwait
对于 OpenWrt 23.05 之后的固件
OpenWrt 在 23.05 之后的版本切换到了新的 fitblk 实现,统一 bootargs 为:
root=/dev/fit0 rootwait
bootargs 存放于环境变量中,可以由多种方式指定,以下为三种示例:
通过 dt 配置
注意:在这种方式下,每次启动时 bootargs 变量都会被 dt 中的值覆盖,基本上等同于固定无法修改。
CONFIG_ENV_IMPORT_FDT
修改 dts 文件,增加 /config/environment 节点
/config/environment
... snip ... / { #address-cells = <1>; #size-cells = <1>; model = "mt7981-nokia_ea0326gmp"; compatible = "mediatek,mt7981", "mediatek,mt7981-rfb"; ... snip ... config { ... snip ... environment { bootargs = "root=/dev/fit0 rootwait"; }; }; ... snip ...
通过 env file 配置
注意:只有当环境变量为空(未配置)时,env file 才会生效。
修改 U-Boot 配置
CONFIG_USE_DEFAULT_ENV_FILE
CONFIG_DEFAULT_ENV_FILE
my_board_env
在 U-Boot 源码根目录下创建 env 文件
echo "bootargs=root=/dev/fit0 rootwait" > "my_board_env"
手动配置
两种方式任选其一即可。
在 U-Boot 中执行
env set bootargs root=/dev/fit0 rootwait env save
在 OpenWrt 中执行
fw_setenv bootargs root=/dev/fit0 rootwait
设置 bootconf
bootconf 同样存放于环境变量中,用于选择 FIT 配置。目前只有极少数设备需要手动指定此变量,通常用于加载 dtb overlay。
如 BananaPi R3,要启动到 NAND 需要设置为 config-mt7986a-bananapi-bpi-r3#mt7986a-bananapi-bpi-r3-nand。 或 CMCC RAX3000M eMMC 需要设置为 config-1#mt7981b-cmcc-rax3000m-emmc。
config-mt7986a-bananapi-bpi-r3#mt7986a-bananapi-bpi-r3-nand
config-1#mt7981b-cmcc-rax3000m-emmc
环境变量设置方式参考上文。
设置环境变量保存位置
修改 U-Boot 配置:
删除以下配置:
CONFIG_ENV_OFFSET CONFIG_ENV_IS_IN_MTD CONFIG_ENV_MTD_NAME CONFIG_ENV_SIZE_REDUND
添加/修改以下配置:
CONFIG_ENV_IS_IN_UBI=y CONFIG_ENV_SIZE=0x1f000 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y CONFIG_ENV_UBI_PART="ubi" CONFIG_ENV_UBI_VOLUME="ubootenv" CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
CONFIG_ENV_IS_IN_MMC=y CONFIG_ENV_SIZE=0x40000 CONFIG_ENV_OFFSET=0x400000 CONFIG_ENV_OFFSET_REDUND=0x440000 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
配置完毕后,编译 U-Boot 和 BL31 生成 FIP,刷入后即可正常使用主线固件。 对于 BL2(preloader),请直接刷入主线提供的文件。
简介
由于过去部分用户不屑于与起夜急设备一样使用传统 TFTP 刷写方式,因此在 hanwckf/bl-mt798x 基础上实现了引导和刷写主线 OpenWrt(下称主线)all in FIT(
.itb
)格式的固件。新的 U-Boot 会自适应固件格式,只需要对齐
分区表
、bootargs
、bootconf
即可正常使用主线固件;也推荐一起对齐uboot env
以方便在 OpenWrt 内更改。配置说明
NAND 设备
此处以 诺基亚贝尔 EA0326GMP 为例,查询主线的分区信息,将其替换到 U-Boot 配置中,如下:
在 dts 中,reg 为 16 进制的 Bytes,一前一后分别代表分区起始偏移量以及大小。 如
reg = <0x980000 0x7680000>;
代表此分区从9961472 Bytes
(9728 KiB
)开始,分区大小为124256256 Bytes
(121344 KiB
)。eMMC 设备
刷入由主线提供的 GPT 分区表即可。
设置
bootargs
如果主线中的 dts 已经指定了
bootargs
,可以跳过此步。对于 OpenWrt 23.05 固件
使用 NAND 的设备不需要指定此变量。
eMMC 设备的
bootargs
为:对于 OpenWrt 23.05 之后的固件
OpenWrt 在 23.05 之后的版本切换到了新的 fitblk 实现,统一
bootargs
为:bootargs
存放于环境变量中,可以由多种方式指定,以下为三种示例:通过 dt 配置
注意:在这种方式下,每次启动时
bootargs
变量都会被 dt 中的值覆盖,基本上等同于固定无法修改。CONFIG_ENV_IMPORT_FDT
修改 dts 文件,增加
/config/environment
节点通过 env file 配置
注意:只有当环境变量为空(未配置)时,env file 才会生效。
修改 U-Boot 配置
CONFIG_USE_DEFAULT_ENV_FILE
CONFIG_DEFAULT_ENV_FILE
设置为my_board_env
在 U-Boot 源码根目录下创建 env 文件
手动配置
两种方式任选其一即可。
在 U-Boot 中执行
在 OpenWrt 中执行
设置
bootconf
bootconf
同样存放于环境变量中,用于选择 FIT 配置。目前只有极少数设备需要手动指定此变量,通常用于加载 dtb overlay。如 BananaPi R3,要启动到 NAND 需要设置为
config-mt7986a-bananapi-bpi-r3#mt7986a-bananapi-bpi-r3-nand
。 或 CMCC RAX3000M eMMC 需要设置为config-1#mt7981b-cmcc-rax3000m-emmc
。环境变量设置方式参考上文。
设置环境变量保存位置
修改 U-Boot 配置:
NAND 设备
删除以下配置:
添加/修改以下配置:
eMMC 设备
添加/修改以下配置:
配置完毕后,编译 U-Boot 和 BL31 生成 FIP,刷入后即可正常使用主线固件。 对于 BL2(preloader),请直接刷入主线提供的文件。