纸翼 · 加载中
1585 words
8 minutes
i.mx6ull启动流程

I.MX6ULL 启动流程核心知识点笔记#


一、选择启动方式#

🔹 1. 前提条件:内部启动模式#

选择启动方式

要让 BOOT_CFG 引脚生效,必须先将开发板设置为内部启动模式,也就是: MODE1 = 1MODE0 = 0 这是开发板上的硬件拨码开关,需要你手动设置。只有在这个模式下,Boot ROM 才会去读取 BOOT_CFG 引脚的配置,选择从外部设备启动。


🔹 2. 支持的启动设备#

在内部启动模式下,Boot ROM 支持的启动设备包括:

  • NOR Flash
  • oneNAND / NAND Flash
  • QSPI Flash
  • SD/EMMC
  • EEPROM

其中,SD 卡、eMMC 和 QSPI Flash 是开发和调试中最常用的。


🔹 3. BOOT_CFG 引脚的硬件实现#

  • 引脚复用BOOT_CFG 配置并非专用引脚,而是复用了开发板上的 LCD_DATA0~23 这 24 个 LCD 数据引脚。
  • 默认电平:这些引脚默认通过 47K 下拉电阻接地,所以默认电平为低电平(0)。

🔹 4. BOOT_CFG 的分组与配置逻辑#

BOOT_CFG 被分成了多组 8 位寄存器(如 BOOT_CFG1BOOT_CFG2BOOT_CFG4),每组负责不同的配置:

  • BOOT_CFG4:8 根线全部接地(默认 0),通常无需修改。
  • BOOT_CFG2:大部分位也接地,仅 BOOT_CFG2[3] 这一位用来选择 SD 卡启动接口。
  • BOOT_CFG1:其中 0、1、2 位是硬件固定的,3~7 位是可配置的,这几位的电平组合直接决定了启动设备(如 SD 卡、eMMC 等)。

二、Boot ROM 阶段:芯片上电后的第一步#

1. 核心工作#

  • 硬件初始化
    • 设置内核时钟为 396MHz,通过 ARM PLL 将 24MHz 外部晶振倍频到高频,提升启动速度。
    • 使能 MMU(内存管理单元)和 L1/L2 Cache,让 CPU 能高速访问数据,为后续启动加速。
  • 启动设备选择 读取 BOOT_CFG 硬件引脚的电平配置,确定从 SD 卡、eMMC 还是 SPI Flash 等外部存储设备加载启动镜像。
  • 加载镜像 从选定的外置存储中读取可启动镜像(如 load.imx),并进入下一步处理。

2. 关键意义#

Boot ROM 是芯片出厂时固化在内部的代码,是整个启动流程的第一个软件环节,它完成了最基础的硬件准备,为后续加载 U-Boot 铺路。


三、可启动镜像与 IVT、Boot Data#

1. 可启动镜像(load.imx#

  • 本质:是 U-Boot 的封装版,由 u-boot.bin(原始 U-Boot 二进制) + IVT(镜像向量表) + DCD(设备配置数据) + Boot Data 打包生成。
  • 作用:因为包含了 Boot ROM 能识别的标准头部,所以能被 Boot ROM 直接加载和执行。

2. IVT(镜像向量表)#

  • 作用:是 Boot ROM 读取的第一个数据结构,像一个“导航目录”,包含了镜像各部分的地址指针。
  • 核心字段
    字段作用示例值
    header标识 IVT 的合法性,包含 Tag、大小、版本0X402000D1
    entry镜像的入口地址,即 U-Boot 开始执行的地址0X87800000
    dcd指向 DCD 数据的地址,用于硬件初始化0X877FF42C
    boot data指向 Boot Data 的地址,包含镜像大小等信息0X877FF420
  • SD 卡启动时的位置:IVT 在 SD 卡中的偏移是 1KB(0x400),这是 Boot ROM 固定的查找位置。

3. Boot Data#

  • 作用:描述镜像的基本信息,如镜像在存储设备中的位置、总大小、插件标志等,供 Boot ROM 验证镜像完整性。
  • 位置:紧跟在 IVT 之后,IVT 大小为 32 字节,所以在 SD 卡中它的地址是 0x400 + 32 = 0x420

4. 镜像地址计算(SD 卡启动场景)#

  • IVT 在 SD 卡中的起始地址:0x400(1KB)
  • 头部(IVT + Boot Data + DCD)总大小:3KB
  • 原始 u-boot.bin 在 SD 卡中的起始地址:0x400 + 0xC00 = 0x1000(4KB,即 4096 字节)

不同介质的ivt地址


四、DCD(设备配置数据)#

  • 作用:是 Boot ROM 执行的硬件初始化配置表,通过“地址-数据”对直接配置寄存器,核心任务是初始化 DDR 内存和外设时钟。
  • 关键初始化
    1. 配置时钟使能寄存器(CCGR0-CCGR6),打开外设时钟。
    2. 初始化 DDR 控制器(MMDC),让系统可以使用外部内存。
    3. 配置 IOMUX 引脚复用,确保硬件工作在预期状态。
  • 位置:在镜像中紧跟 Boot Data 之后,例如表中的 0X877FF42C

DCD结构(部分)

🔹 1. header(0X40E801D2)#

  • 这是 DCD 的身份标识,用来告诉 Boot ROM 这是一个合法的 DCD 数据块。
  • 0XD2:固定的 Tag 标识,是 DCD 的“签名”。
  • 0X01E8:表示 DCD 的总大小为 488 字节(大端模式存储)。
  • 0X40:表示 DCD 的版本号,与芯片手册中的规范完全一致。

🔹 2. Write Data Command(0X04E401CC)#

  • 这是一个“写数据”命令的头部,用来定义后续寄存器配置的格式。
  • 0XCC:固定的命令 Tag,表示这是一个写寄存器的操作。
  • 0X01E4:表示这条命令包含的数据总长度为 484 字节(大端模式)。
  • 0X04:表示目标寄存器的位宽为 4 字节(32 位),即每次写一个 32 位值。

🔹 3. 核心硬件初始化配置(部分)#

接下来是一系列“地址-值”对,Boot ROM 会按顺序将 Value 写入对应的 Address 寄存器,完成硬件初始化。

① 外设时钟使能#

  • 地址 0X020C4068(CCGR0) → 值 0XFFFFFFFF
  • 地址 0X020C4080(CCGR6) → 值 0XFFFFFFFF
  • 这些是时钟控制寄存器(CCGR0-CCGR6),写入全 1 表示打开该寄存器控制的所有外设时钟,比如 DDR、UART、I2C 等,确保硬件模块能正常工作。

② DDR 模式配置#

  • 地址 0X020E04B4(IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE) → 值 0X0000C000
  • 这个配置将 DDR 的所有 IO 设置为 DDR3 模式,是 DDR 初始化的关键一步。

③ DDR 引脚配置#

  • 地址 0X020E04AC(IOMUXC_SW_PAD_CTL_GRP_DDRPKE) → 值 0X00000000
  • 这个配置关闭了所有 DDR 引脚的 Pull/Keeper(上拉/保持)功能,因为 DDR 信号通常由外部终端电阻匹配,不需要内部上拉。

五、U-Boot 阶段#

1. 核心作用#

  • 是承上启下的启动加载器,负责完成更完善的硬件初始化(如网口、LCD、USB),并加载 Linux 内核。
  • 提供命令行交互界面,支持烧写镜像、下载文件、调试硬件等开发功能。

2. 启动流程#

Boot ROM 加载 load.imx → 执行 DCD 初始化硬件 → 跳转到 IVT 中 entry 指向的地址 → U-Boot 开始运行 → 加载 Linux 内核(zImage)和设备树(.dtb) → 启动 Linux 系统。

i.mx6ull启动流程
https://blog.huangzy.xyz/posts/imx6ull启动流程/
Author
纸翼
Published at
2026-02-02
License
CC BY-NC-SA 4.0

Some information may be outdated