U‑Boot 笔记

一、概念

U‑Boot 是 bootloader 的一种,作用:内核加载前初始化硬件,为Linux内核提供引导功能。

i.MX6ULL 上电启动链路:芯片上电 → 片内ROM → U‑Boot第一阶段 → U‑Boot第二阶段 → Linux内核 分两阶段原因:片内RAM(OCRAM)仅128KB,放不下完整U‑Boot镜像。

完整启动流程

  1. 上电复位,运行芯片iROM固化代码
  2. 读取启动设备(SD/EMMC/NAND/QSPI),把uboot.imx前4KB加载到片内RAM 0x00900000
  3. 执行U‑Boot第一阶段(IVT+DCD+BOOT_DTAT):初始化DDR、时钟、引脚
  4. 将完整u‑boot.img加载到DDR 0x87800000
  5. 运行U‑Boot第二阶段主程序:初始化外设、读取环境变量、解析启动命令
  6. 将Linux内核zImage+设备树dtb加载到DDR,启动内核

启动3个阶段解析

  1. 阶段1:Boot ROM(芯片固化,不属于U‑Boot)
    • 根据拨码识别启动模式;初始化基础时钟;读取uboot.imx头部;加载头部到OCRAM。
  2. 阶段2:U‑Boot第一阶段 SPL,运行于片内OCRAM
    • 关闭看门狗,配置CPU时钟,引脚复用;初始化DDR控制器;完整初始化存储设备;把完整U‑Boot拷贝到DDR;跳转到DDR执行。
    • u‑boot.imx = IVT + BootData + DCD + u‑boot.bin
  3. 阶段3:U‑Boot第二阶段(主程序,DDR 0x87800000,命令行交互)
    • 初始化DDR、时钟、存储外设;加载内核+设备树;传递启动参数;启动Linux内核。

二、U‑Boot常用命令&环境变量

1.环境变量操作

命令 功能 格式
printenv 查看环境变量 printenv
setenv 新建/修改变量 setenv 变量名 值
saveenv 保存变量到flash saveenv

2.内存操作(了解)

  • md[b,w,l] 地址 [数量]:查看内存
  • nm[b,w,l] 地址:修改指定地址内存
  • mw[b,w,l] 地址 值 [计数]:填充一段内存
  • cp[b,w,l] 源 目标 计数:内存数据拷贝

3.网络命令

  • ping 目标IP:测试网络连通
  • tftp 内存地址 文件名:tftp下载文件到内存
  • nfs 内存地址 服务器路径:nfs下载文件到内存

完整网络启动环境变量配置示例

复制代码
env default -a      #恢复默认环境变量
saveenv
reset
setenv ipaddr 192.168.1.50         #开发板IP
setenv ethaddr 00:04:9f:04:d2:35   #MAC地址
setenv gatewayip 192.168.1.1       #网关
setenv netmask 255.255.255.0       #子网掩码
setenv serverip 192.168.1.100      #PC主机IP
#内核启动参数
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs/rootfs,v3,proto=tcp rw ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
#下载zImage、dtb并启动
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull‑alientek‑emmc.dtb;bootz 80800000 ‑ 83000000'
saveenv
reset

三、U‑Boot编译

  1. 解压源码:tar -zxvf uboot.tar.gz && cd uboot

  2. 依赖安装(图形menuconfig):

    sudo apt‑get install libncurses5‑dev

  3. 编译三步

    #清理工程
    make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
    #加载板子默认配置
    make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ mx6ull1_alientek_emmc_defconfig
    #编译,‑j16多线程,V=0精简输出
    make V=0 ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ ‑j16

参数说明

  • ARCH=arm:目标架构ARM
  • CROSS_COMPILE:指定交叉编译器前缀
  • V=0:精简编译输出;V=1输出完整编译命令,用于调试
  1. 编译输出产物:顶层目录 u‑boot.imx

四、烧录

Ubuntu下使用imxdownload工具烧写:

复制代码
./imxdownload u‑boot.bin /dev/sdd

烧写至SD卡,开发板拨码SD卡启动,上电后配置uboot环境参数。

五. U-Boot 启动 3 大阶段

阶段 1:i.MX6ULL Boot ROM(芯片内部 ROM,不属于 U-Boot)

芯片出厂固化程序,上电最先运行,是启动 U-Boot 的前提 执行任务:

  1. 检测启动模式(SD/EMMC/NAND/QSPI),由拨码开关决定;SD/EMMC 未完全初始化,仅读取存储设备前端部分数据。
  2. 初始化基础时钟:arm_pll 396M,system_PLL 528M。
  3. 读取启动设备中uboot.imx头部信息。
  4. 将 uboot.imx 头部信息加载到片内 RAM(OCRAM,地址0x00900000)。

uboot.imx 组成:IVT + BootData + DCD + u-boot.bin

阶段 2:U-Boot 第一阶段(SPL,Secondary Program Loader)

运行位置:片内 RAM OCRAM 核心使命:初始化 DDR,加载完整 U-Boot 镜像 执行任务:

  1. 关闭看门狗,防止芯片自动复位。
  2. 配置 CPU 主频、系统时钟,i.MX6ULL 一般设 792MHz,初始化 PLL 锁相环。
  3. 初始化 IOMUXC 引脚复用,配置 DDR 引脚、启动设备引脚。
  4. 初始化 DDR 控制器 + DDR 校准(核心!无 DDR,U-Boot 和 Linux 都无法运行)
  5. 完整初始化 SD/EMMC/NAND/QSPI 控制器。
  6. 从 Flash 读取完整 U-Boot 镜像,加载到 DDR 地址 0x87800000。
  7. 跳转到 DDR 中运行完整 U-Boot,BootROM 工作结束。

u-boot.bin 加上 IVT、BootData、DCD 头部信息,打包生成 u-boot.imx。

阶段 3:U-Boot 第二阶段(U-Boot 主程序,可交互命令行)

✅ 运行位置:DDR 0x87800000,就是串口看到的 U-Boot 命令行 执行任务:

  1. 初始化 DDR
  2. 初始化时钟(CPU 主频、总线时钟)
  3. 初始化存储外设(SD/EMMC/NAND)
  4. 通过 TFTP/NFS 加载 Linux 内核 zImage、设备树 dtb 到内存
  5. 向 Linux 内核传递 bootargs 启动参数
  6. 调用 bootz,启动 Linux 内核

编译 U-Boot 后,工程顶层目录生成 u-boot.imx。


简述:

  1. BootROM(阶段 1):芯片固化代码,上电最先跑,根据拨码选择启动介质,把 uboot 头部加载到 OCRAM。
  2. SPL(U-Boot 阶段 1,OCRAM):初始化 DDR,把完整 uboot 拷贝到 DDR,跳转过去运行。
  3. U-Boot 主程序(阶段 2,DDR):命令交互,加载内核与设备树,传参,启动 Linux。
  4. uboot.imx = IVT+BootData+DCD + u-boot.bin,用 imxdownload 烧录到 SD 卡。

补充Linux查找命令

复制代码
find ./ -name '文件名'    #按文件名搜索
grep -Rin '内容'         #按文件内容搜索
相关推荐
susplus7 小时前
【IMX6ULL Linux系统移植】SD卡分区 | uboot详解
linux·arm·u-boot
每日出拳老爷子5 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
你的强来了9988 天前
DriverSwitcher:Windows USB设备驱动切换工具
驱动·usb·驱动切换工具
企鹅的蚂蚁24 天前
LubanCat RK3588 实时 Linux 开发(九):从 U-Boot 到 initramfs 的串口启动故障分析
linux·rk3588·u-boot·串口调试·initramfs·linux启动
深念Y1 个月前
PVE 安装黑苹果并直通 Quadro P400
macos·ios·黑苹果·驱动·苹果·英伟达·p400
blueSatchel2 个月前
u-boot启动过程(bootROM到SPL到u-boot)
linux·u-boot
blueSatchel2 个月前
u-boot的start.S文件详解
u-boot
深念Y2 个月前
AMD 芯片组驱动触发高频 SSD 写入的问题及解决方案
windows·bug·ssd·日志·芯片·驱动·amd
Dlrb12112 个月前
Linux驱动---PinCtrl 与 GPIO 子系统详解以及基于PinCtrl 与 GPIO的 LED 驱动编写
linux·arm·imx6ull·驱动·gpio子系统·pinctrl