1715173329 / blog

一点文字垃圾。
https://blog.imouto.in/
Creative Commons Attribution Share Alike 4.0 International
17 stars 1 forks source link

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

Open 1715173329 opened 2 months ago

1715173329 commented 2 months ago

简介

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

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

[!NOTE] 关于 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 卷/分区。

  1. 设置 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_FDT
      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 ...
    • 通过 env file 配置

      注意:只有当环境变量为空(未配置)时,env file 才会生效。

      1. 修改 U-Boot 配置

        • 启用 CONFIG_USE_DEFAULT_ENV_FILE
        • CONFIG_DEFAULT_ENV_FILE 设置为 my_board_env
      2. 在 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
  2. 设置 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

    环境变量设置方式参考上文。

  3. 设置环境变量保存位置

    修改 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),请直接刷入主线提供的文件。