必须在uboot的xxx_defconfig/.config进行配置
例子在:rv1106-spi-nand-nomcu_defconfig.md
CONFIG_FIT=y
# CONFIG_SPL_KERNEL_BOOT is not set #关闭spl启动内核
#CONFIG_ENVF=y #关闭校验env.img
#CONFIG_ENV_IS_NOWHERE=y
#CONFIG_ANDROID_BOOT_IMAGE=y #安卓镜像
#CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
#CONFIG_FIT_ENABLE_RSASSA_PKCS=y
CONFIG_BOOTDELAY=3 #3s后无操作的话,启动kernel
CONFIG_BAUDRATE=115200
CONFIG_MTD=y
#CONFIG_CMD_MTD=y
#CONFIG_MTD_PARTITIONS=y #开启这个会导致mtd dev 1命令找不到设备号
CONFIG_ENVF=y
CONFIG_ENV_NAND_OFFSET=0x400000
CONFIG_ENV_NAND_SIZE=0x400000
3. 配置dev.img方式启动
CONFIG_ENVF=y
CONFIG_ENV_NAND_OFFSET=0x400000#烧录地址
CONFIG_ENV_NAND_SIZE=0x400000#大小
CONFIG_ENV_NAND_OFFSET=0x400000:设置 ENV 的物理偏移量为 4M( env 分区位置即烧录地址)。
CONFIG_ENV_NAND_SIZE=0x400000:设置 ENV 大小为 4M。
# 1. MTD 分区表(SPI NAND)
mtdparts=spi-nand0:4M(idblock),4M(env),512K(uboot),4M(boot),-(rootfs)
# ↑ ↑ ↑
# 设备名 分区定义 剩余空间给rootfs
# 2. 内核启动参数
sys_bootargs= ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs rk_dma_heap_cma=66M
# ↑ ↑ ↑ ↑
# MTD索引4 UBI卷名 文件系统类型 DMA内存预留66M
# 3. SD卡分区表(可选,用于SD卡启动)
sd_parts=mmcblk0:16K@512(env),512K@32K(idblock),4M(uboot)
-
生成env.img(设置了偏移量和大小就不需要在xxx_defconfig配置)
-s 0x400000: ENV大小4M生成的
env.img是一个二进制格式的ENV数据
../uboot/tools/mkenvimage -s 0x400000 -o env.img .env.txt
-
env注意点
这3者必须完全对应。Config,mkenvimage,烧录地址。
| U-Boot Config | CONFIG_ENV_OFFSET=0x400000 CONFIG_ENV_SIZE=0x400000 | 告诉 U-Boot 去 0x400000 读,读 4M |
|---|---|---|
| mkenvimage | -s 0x400000 | 生成4M 大小的镜像 |
| 烧录地址 | 0x400000 | 将 env.img 烧录到 Flash 的 0x400000 处 |
Rockchip 平台的特殊性
再次强调,Luckfox RV1106 默认使用 CONFIG_ENVF (Environment Framework)。
-
在这种模式下,U-Boot 可能忽略
CONFIG_ENV_OFFSET,而是通过 MTD 分区表 来查找名为env的分区。 -
如果是这种情况,只要你:
.env.txt中的mtdparts定义了env在正确位置。- 烧录工具根据
mtdparts将env.img烧录到正确位置。 - U-Boot 能正确解析 MTD 分区。
那么即使
CONFIG_ENV_OFFSET没改(或者是错的),系统可能仍然能正常工作,因为 ENVF 框架更智能。 -
但是,如果你禁用了
CONFIG_ENVF或强制使用CONFIG_ENV_IS_IN_NAND,那么必须严格一致
启动命令解析(针对1,2)
mtd dev 1
mtd read 0x02000000 0x4400 0x4000
iminfo 0x02000000
bootm 0x02000000
- **mtd:**选 NAND 设备
- mtd read :
- 0x4400:nand存放boot.img镜像快地址 (0x0088 0000/512)
- 0x02000000 :DDR 加载地址
- 0x4000: boot.img 大小 0x0080 0000(8M) /512
- **bootm:**启动 FIT 镜像(必须是boot.img)
- **iminfo:**检查镜像
1. uboot命令行启动
在本篇md中启动命令解析这一章节
这种方式无法挂载文件系统!!
2. uboot配置修改启动
- 目标:直接uboot直接启动kernel。不需要env.img配置
uboot启动kernel详细在:env.img文件&uboot启动kernel流程.md
-
2.1 uboot/include/configs/rv1106_common.h修改
include"rockchip-common.h"之后添加
#include "rockchip-common.h"
#ifndef RKIMG_BOOTCOMMAND
#define RKIMG_BOOTCOMMAND "mtd dev 1; mtd read 0x02000000 0x4400 0x4000; bootm 0x02000000"
#endif
-
2.2 将
#undef RKIMG_BOOTCOMMAND #ifdef CONFIG_FIT_SIGNATURE #define RKIMG_BOOTCOMMAND \ "boot_fit;" #else #define RKIMG_BOOTCOMMAND \ "boot_fit;" \ "boot_android ${devtype} ${devnum};" #endif -
2.3改为
#undef RKIMG_BOOTCOMMAND #define RKIMG_BOOTCOMMAND "mtd dev 1; mtd read 0x02000000 0x4400 0x4000; bootm 0x02000000"
这种方式无法挂载文件系统!!