1585 words
8 minutes
i.mx6ull启动流程
I.MX6ULL 启动流程核心知识点笔记
一、选择启动方式
🔹 1. 前提条件:内部启动模式

要让 BOOT_CFG 引脚生效,必须先将开发板设置为内部启动模式,也就是:
MODE1 = 1,MODE0 = 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_CFG1、BOOT_CFG2、BOOT_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、大小、版本 0X402000D1entry镜像的入口地址,即 U-Boot 开始执行的地址 0X87800000dcd指向 DCD 数据的地址,用于硬件初始化 0X877FF42Cboot 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 字节)

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

🔹 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启动流程/ Some information may be outdated