简介
由于过去部分用户不屑于与起夜急设备一样使用传统 TFTP 刷写方式,因此在 hanwckf/bl-mt798x 基础上实现了引导和刷写主线 OpenWrt(下称主线)all in FIT(.itb
)格式的固件。
新的 U-Boot 会自适应固件格式,只需要对齐 分区表
、bootargs
、bootconf
即可正常使用主线固件;也推荐一起对齐 uboot env
以方便在 OpenWrt 内更改。
关于 hanwckf/bl-mt798x,参阅 mt798x uboot 功能介绍,本篇不再重复。
配置说明
可以参考我的分支 fit-example。
1. 对齐分区表
需要注意主线 FIT 固件默认禁用 NMBM。NAND Mapped-block Management 是 MTK 开发的一种透明 NAND 坏块管理方案。虽称是为了“方便”在 NAND 上使用其他文件系统,但现在大多固件都使用 UBI layer,本身就能优秀地处理坏块。开启 NMBM 会导致 UBI 无法识别坏块,也无法做到磨损均匀,是完全不需要的存在。
对于使用 NAND 的设备,从开启 NMBM 的固件刷入到主线 OpenWrt 前,应备份好数据,特别是 Config/Factory 一类的分区。如果有坏块存在,开启和关闭 NMBM 后读出的数据将不一致并且会造成数据损坏。
在主线 FIT 固件中,kernel 和 rootfs 已被集成在一起,因此不再需要单独的 kernel
和 rootfs
卷/分区,取而代之的是 fit
(NAND)和 production
(eMMC)。
要使用此 U-Boot 引导主线固件,不能存在 kernel
卷/分区。
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
)。eMMC 设备
刷入由主线提供的 GPT 分区表即可。
2. 设置 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 中的值覆盖,基本上等同于固定无法修改。修改 U-Boot 配置,启用
CONFIG_ENV_IMPORT_FDT
和CONFIG_ENV_VARS_UBOOT_CONFIG
修改 dts 文件,增加
/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 ...
通过
USE_BOOTARGS
配置注意:只有当环境变量为空(未配置)时,
CONFIG_BOOTARGS
才会生效。- 启用
CONFIG_USE_BOOTARGS
- 将
CONFIG_BOOTARGS
设置为root=/dev/fit0 rootwait
- 启用
通过 env file 配置
注意:只有当环境变量为空(未配置)时,env file 才会生效。
修改 U-Boot 配置
- 启用
CONFIG_USE_DEFAULT_ENV_FILE
- 将
CONFIG_DEFAULT_ENV_FILE
设置为my_board_env
- 启用
在 U-Boot 源码根目录下创建 env 文件
1
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
3. 设置 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
。
环境变量设置方式参考上文。
4. 设置环境变量保存位置
修改 U-Boot 配置:
NAND 设备
删除以下配置:
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"
eMMC 设备
添加/修改以下配置:
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),请直接刷入主线提供的文件,且必须刷入。