使用 hanwckf/bl-mt798x 引导主线 OpenWrt 固件

简介

由于过去部分用户不屑于与起夜急设备一样使用传统 TFTP 刷写方式,因此在 hanwckf/bl-mt798x 基础上实现了引导和刷写主线 OpenWrt(下称主线)all in FIT(.itb)格式的固件。

新的 U-Boot 会自适应固件格式,只需要对齐 分区表bootargsbootconf 即可正常使用主线固件;也推荐一起对齐 uboot env 以方便在 OpenWrt 内更改。

Info

关于 hanwckf/bl-mt798x,参阅 mt798x uboot 功能介绍,本篇不再重复。

配置说明

Tip

可以参考我的分支 fit-example

1. 对齐分区表

Warning

需要注意主线 FIT 固件默认禁用 NMBM。NAND Mapped-block Management 是 MTK 开发的一种透明 NAND 坏块管理方案。虽称是为了“方便”在 NAND 上使用其他文件系统,但现在大多固件都使用 UBI layer,本身就能优秀地处理坏块。开启 NMBM 会导致 UBI 无法识别坏块,也无法做到磨损均匀,是完全不需要的存在。
对于使用 NAND 的设备,从开启 NMBM 的固件刷入到主线 OpenWrt 前,应备份好数据,特别是 Config/Factory 一类的分区。如果有坏块存在,开启和关闭 NMBM 后读出的数据将不一致并且会造成数据损坏。

Note

在主线 FIT 固件中,kernel 和 rootfs 已被集成在一起,因此不再需要单独的 kernelrootfs 卷/分区,取而代之的是 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 Bytes9728 KiB)开始,分区大小为 124256256 Bytes121344 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 中的值覆盖,基本上等同于固定无法修改。

    1. 修改 U-Boot 配置,启用 CONFIG_ENV_IMPORT_FDTCONFIG_ENV_VARS_UBOOT_CONFIG

    2. 修改 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 才会生效。

    1. 修改 U-Boot 配置

      • 启用 CONFIG_USE_DEFAULT_ENV_FILE
      • CONFIG_DEFAULT_ENV_FILE 设置为 my_board_env
    2. 在 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,刷入后即可正常使用主线固件。

Info

对于 BL2(preloader),请直接刷入主线提供的文件,且必须刷入

Licensed under CC BY-NC-SA 4.0
Last updated on 2025-08-04 16:15:10 +0800
Built with Hugo
Theme Stack designed by Jimmy