uboot2016(基于IMX6ULL)
介绍U-Boot 就是嵌入式芯片的「开机引导程序」相当于电脑的 BIOS 启动管理器是芯片上电后第一个跑起来的软件。整个流程如下上电 → 硬件复位 → U-Boot 启动 → 初始化硬件 → 加载 Linux 内核 → 内核启动 → 跑系统 / 应用。顺序CPU 裸机 → U-Boot → Linux 内核 → 根文件系统U-Boot 主要做 4 件核心事底层硬件初始化最关键刚上电时内存、时钟、闪存、串口、EMMC/NAND 都处于未初始化状态U-Boot 先把它们跑起来配置系统时钟、PLL、电压。初始化 DDR 内存必须先初始化内核才能运行。初始化 Flash、EMMC、SD 卡、串口、网口。配置引脚、电源管理。选择并加载系统镜像U-Boot 会按预设顺序找系统SD 卡 → EMMC → NAND Flash然后把 Linux 内核 (zImage/Image)、设备树 (dtb) 读到 DDR 内存里。传递启动参数给 Linux 内核U-Boot 会把内存大小根文件系统位置EMMC 哪个分区串口控制台、波特率硬件标识这些参数传给内核内核才能正常挂载根文件系统、识别硬件。4. 人机交互 调试命令行上电倒计时按空格 / 回车就能进入 U-Boot 命令行常用操作查看内存、Flash、分区读写 Flash、烧录固件网络下载tftp更新镜像切换启动介质、修改启动参数恢复出厂、擦除分区基础命令环境变量相关完整命令等价简写功能说明常用用法env printprintenv/print查看环境变量查看所有env print查看单个env print bootargsenv setsetenv/set设置 / 修改 / 删除环境变量设置变量env set bootargs consolettymxc0,115200删除变量env set 变量名env savesaveenv/save保存变量到存储介质永久生效直接执行env save内存相关命令全称功能说明基础语法常用示例mdmemory display读取并显示指定内存区域的数据md[.b/.w/.l] 起始地址 数量md.l 0x80000000 20以 4 字节为单位显示0x80000000开始的 20 个长字数据mmmemory modify交互式逐地址修改内存内容回车自动跳到下一个地址mm[.b/.w/.l] 起始地址mm.l 0x80000000进入交互模式输入数值后回车修改下一个地址输入q退出mwmemory fill批量填充指定内存区域最常用于内存清零mw[.b/.w/.l] 起始地址 填充值 数量mw.l 0x80000000 0x0 0x400将0x80000000开始的 0x400 个长字共 4KB 内存全部清零cpmemory copy将一段内存数据完整拷贝到另一个地址cp[.b/.w/.l] 源地址 目标地址 数量cp.l 0x80000000 0x82000000 0x1000将0x80000000开始的 0x1000 个长字共 16KB拷贝到0x82000000处cmpmemory compare比较两段内存数据是否一致常用于校验拷贝 / 下载结果cmp[.b/.w/.l] 地址1 地址2 数量cmp.l 0x80000000 0x82000000 0x1000比较两段 16KB 内存是否完全一致mtestmemory test简单内存读写测试用于校验 DDR 硬件稳定性mtest 起始地址 结束地址 测试值 迭代次数mtest 0x80000000 0x81000000测试0x80000000~0x81000000这段 16MB 内存的读写稳定性按CtrlC停止网络相关命令名称核心定位基本语法使用示例关键注意事项ping网络操作的基础前提专门测试开发板与目标主机的网络连通性验证 IP、网卡、物理链路是否正常ping 目标IP地址ping 192.168.1.100验证与服务器是否网络互通1. 跨网段测试需提前配置gatewayip网关地址2.单向连通特性仅支持 U-Boot 主动 ping 主机主机无法 ping 通 U-BootU-Boot 无完整 TCP/IP 协议栈不响应 ICMP 请求3. 成功提示host xxx is alive失败提示host xxx is not alive。dhcp核心功能是自动获取网络参数向 DHCP 服务器申请 IP、子网掩码、网关、服务器 IP下载文件只是附加扩展能力底层复用 TFTP 协议dhcp [内存加载地址] [启动文件名]1.dhcp最核心用法仅自动获取网络参数并更新环境变量2.dhcp 0x42000000 zImage扩展用法获取 IP 后顺带调用 TFTP 下载镜像到内存1. DHCP 协议本身不具备文件传输能力下载动作底层走 TFTP2. 执行成功后自动更新ipaddr、serverip、netmask、gatewayip等环境变量3. 局域网必须存在可用 DHCP 服务器若服务器未配置next-server字段则沿用当前serverip。tftpU-Boot 阶段最核心的文件传输工具专门负责将服务器上的内核、设备树等镜像下载到开发板内存是网络启动的主力加载方式tftp 内存加载地址 [服务器IP:]文件名1.tftp 0x42000000 zImage从已配置的serverip对应服务器下载 zImage2.tftp 0x42000000 192.168.1.100:zImage手动指定服务器 IP 下载文件1. 主机需搭建 TFTP 服务如 tftp-hpa、tftpd32目标文件必须放在 TFTP 根目录下2. 基于 UDP 协议默认端口 69轻量高效是嵌入式开发阶段下载镜像的首选方案3. 使用前需先用 ping 验证网络连通性提前配置好serverip。nfs具备两级能力1. U-Boot 阶段可加载单个文件到内存少用TFTP 更便捷2.核心价值Linux 内核启动后挂载远程完整根文件系统替代本地 Flash 的 rootfs是开发调试的黄金方案1. U-Boot 加载文件nfs 内存加载地址 [服务器IP:]文件绝对路径2. 内核挂载根文件系统在bootargs中配置 NFS 根参数1. U-Boot 加载文件nfs 0x42000000 192.168.1.100:/home/nfs/zImage2. 内核挂载 NFS 根文件系统bootargs 配置setenv bootargs root/dev/nfs nfsroot192.168.1.100:/home/nfs/rootfs,prototcp rw ip192.168.1.2001. U-Boot 与 Linux 内核默认均支持NFSv2、NFSv3版本服务器端需启用对应版本2. 挂载根文件系统需要 Linux 内核编译时开启 NFS 客户端、NFS 根文件系统挂载支持3. 服务器端需配置 NFS 目录读写权限关闭防火墙与 SELinux4. 挂载后修改根文件系统内容直接在服务器端操作无需重新烧录镜像大幅提升开发效率。DHCP负责自动分配 IP、传递启动服务器信息是网络启动的辅助协议本身不提供启动文件TFTP负责加载内核、设备树等启动镜像到开发板内存是 U-Boot 阶段最常用的文件传输载体NFS既可以加载启动镜像更核心的作用是提供远程根文件系统让内核启动后直接挂载服务器上的文件系统。简单说DHCP 配网络TFTP 载内核NFS 挂根文件系统三者配合可以实现完整的 “从服务器启动整个 Linux 系统”全程不需要把系统烧写到本地 Flash。MMC相关命令核心功能语法使用示例关键说明mmc list列出开发板识别到的所有 MMC 设备SD 卡、eMMC显示设备号和设备类型mmc list mmc list FSL_SDHC: 0 (SD) FSL_SDHC: 1 (eMMC)输出中的数字为设备号如上 0 是 SD 卡1 是 eMMC不同硬件平台编号可能不同mmc dev切换当前操作的 MMC 设备或查看当前选中的设备后续所有 mmc 命令均作用于当前设备mmc dev [设备号] [:分区号]1. 查看当前设备mmc dev2. 切换到 0 号 SD 卡mmc dev 03. 切换到 eMMC 的第 2 分区mmc dev 1:2默认选中设备的第 0 分区用户主分区操作 eMMC 的 boot 硬件分区时需指定分区号mmc info查看当前选中设备的详细硬件信息包括总容量、扇区总数、总线宽度、工作频率、版本等mmc infommc info用于确认设备是否正常识别、容量是否匹配排查硬件识别异常mmc part查看当前设备的分区表显示每个分区的起始扇区、总扇区数、分区类型mmc partmmc part输出的「Start Sector」是后续读写分区数据的核心参考依据mmc rescan重新扫描 MMC 总线重新识别设备mmc rescanmmc rescan用于 SD 卡热插拔后重新识别或设备识别异常时复位扫描命令核心功能语法使用示例关键注意事项mmc read从 MMC 设备的指定扇区位置读取指定数量的扇区数据到 DDR 内存指定地址mmc read 内存地址 起始扇区号 扇区数量# 从eMMC第20480扇区开始读取1024个扇区到内存0x80800000 mmc read 0x80800000 20480 10241024 扇区 1024 × 512 512KB 数据典型用途是从 eMMC 加载内核、设备树到内存启动mmc write将内存中的数据写入 MMC 设备的指定扇区是烧写系统镜像的核心命令mmc write 内存地址 起始扇区号 扇区数量配合 tftp 烧写内核1. 下载镜像到内存tftp 0x80800000 zImage2. 写入 eMMC 第 1 分区mmc write 0x80800000 20480 122881. 扇区数量需向上取整确保文件完整写入2. 写入位置不能超出分区范围避免覆盖其他数据3. eMMC 写入无需提前擦除可直接覆盖mmc erase擦除 MMC 设备上指定范围的扇区数据mmc erase 起始扇区号 扇区数量# 擦除eMMC前1024个扇区 mmc erase 0 1024仅用于彻底清空数据、擦除旧分区表常规烧写镜像时不需要主动擦除文件相关命令名称核心功能基本语法使用示例关键注意事项fatinfo查看指定 FAT 分区的文件系统详细信息验证分区格式是否正常识别fatinfo 接口 设备号:分区号fatinfo mmc 0:1查看 SD 卡第 1 分区的 FAT 文件系统信息输出包含文件系统类型、簇大小、总扇区数、FAT 表位置、根目录信息等识别失败说明分区不是 FAT 格式或分区损坏fatls列出 FAT 分区内指定目录的文件和子目录确认目标文件是否存在、路径是否正确fatls 接口 设备号:分区号 [目录路径]1. 查看根目录fatls mmc 0:12. 查看 boot 子目录fatls mmc 0:1 /boot路径相对于分区根目录省略路径默认查看根目录未开启长文件名支持时仅显示 8.3 格式短文件名fatload最核心命令将 FAT 分区中的指定文件加载到 DDR 内存指定地址常用于从 SD 卡加载内核、设备树fatload 接口 设备号:分区号 内存地址 文件名fatload mmc 0:1 0x80800000 zImage将 SD 卡 1 分区的 zImage 加载到内存 0x808000001. 加载成功后自动设置filesize环境变量记录文件字节大小可直接引用2. 内存地址必须在 DDR 有效范围内不能覆盖 U-Boot 运行区域3. 文件名区分大小写需和分区内实际名称完全一致fatwrite将内存中指定长度的数据写入 FAT 分区生成指定文件用于保存日志、导出数据、更新文件fatwrite 接口 设备号:分区号 内存地址 文件名 字节数fatwrite mmc 0:1 0x80800000 test.bin 0x100000将内存 0x80800000 开始的 1MB 数据保存为 test.bin1. 长度单位是字节不是扇区注意和mmc write区分2. 默认多数 U-Boot 版本未启用该功能需编译时开启CONFIG_FAT_WRITE宏3. 不能直接覆盖已有文件需先删除或换文件名BOOT相关命令 / 变量核心定位适配镜像格式标准语法典型使用示例关键注意事项bootzARM32 平台专用内核启动命令执行 zImage 自解压并跳转内核仅支持zImage格式压缩内核必须搭配设备树dtb使用bootz 内核地址 [ramdisk地址] 设备树地址bootz 0x80800000 - 0x83000000无 ramdisk 时用-占住中间位置1. 仅适用于 ARMv7/ARM32 架构如 IMX6ULL2. 无 ramdisk 时中间的-不能省略否则参数位置错位3. 内核加载地址需足够高避免自解压过程覆盖自身。bootmU-Boot 通用型启动命令跨架构兼容是 U-Boot 传统标准启动方式仅支持uImage格式镜像U-Boot 专属封装格式支持有无设备树两种模式也可启动 ramdisk、固件等其他类型镜像bootm uImage地址 [ramdisk地址] [设备树地址]1. 无设备树老平台bootm 0x808000002. 带设备树bootm 0x80800000 - 0x830000001. uImage 加载地址必须和打包时mkimage -a指定的地址完全一致否则启动失败2. 支持 ARM、PowerPC、MIPS 等多架构通用性强3. 启动前会校验镜像头部 CRC完整性更高。bootcmd本质是U-Boot 环境变量非独立命令是系统上电自动启动的预设脚本boot命令的执行主体无格式限制可组合任意 U-Boot 命令tftp、fatload、bootz、bootm 等setenv bootcmd 命令1; 命令2; 命令3多条命令用英文分号分隔setenv bootcmd tftp 0x80800000 zImage; tftp 0x83000000 imx6ull.dtb; bootz 0x80800000 - 0x830000001. 必须执行saveenv保存后才会掉电不丢失2. U-Boot 上电倒计时结束后会自动执行boot命令即自动运行bootcmd内的所有指令3. 命令间必须用英文分号分隔不能换行。文件结构arch/arm/cpu/u-boot.lds是 U-Boot 的核心链接脚本它会指导链接器规划最终镜像的内存布局明确程序入口地址、代码段、数据段、BSS 段的排列顺序与加载 / 运行地址同时定义重定位相关的段规则直接决定 U-Boot 在内存中的分布与启动执行的起点。board/freescale/mx6ullevk是 i.MX6ULL 官方 EVK 开发板的板级适配目录存放与具体硬件强绑定的定制代码包含 DDR 初始化参数、GPIO 引脚复用配置、外设硬件参数、板级初始化函数等内容是通用驱动与具体电路板之间的适配层也是硬件移植时的核心修改目录。configs目录是 U-Boot 的板级配置模板仓库目录下所有以_defconfig结尾的文件每一个都对应一款开发板的精简功能配置仅保存与全局默认配置有差异的项用于指定 CPU 型号、板级目录、启用的驱动与功能、存储介质类型不同文件名对应不同 DDR 容量、不同存储介质的硬件组合。移植 U-Boot 时重点关注board/freescale与configs两个目录是因为 U-Boot 采用 “通用驱动 板级定制” 的架构设计通用架构代码与外设驱动通常无需修改只需要在 board 目录修改硬件适配参数、在 configs 目录调整功能裁剪配置即可快速完成新硬件的适配。Makefile专属配置文件 de_configCONFIG_TARGET_MX6ULL_14X14_EVKy核心板子标识整条构建链路的起点,启用 mx6ull_14x14_evk 这块开发板的专属适配CONFIG_ARCH_MX6y启用 NXP IMX6 系列 SoC 底层驱动与初始化代码,开启后才会编译 IMX6ULL 专属DDR 初始化、时钟、IO 复用、OCOTP 熔丝、启动设备等底层芯片代码关闭的话整个 IMX6 系列底层代码不会参与编译。CONFIG_ARMy指定目标 CPU 大架构为 ARM,控制全局架构分支编译 ARM 汇编、ARM 链接脚本、ARM 交叉编译适配逻辑会给全局传递 -D__ARM__ 宏源码中所有 #ifdef CONFIG_ARM 的架构专用代码才会编译同时决定交叉编译器前缀、arch/arm/ 整个目录参与构建。CONFIG_CMD_GPIOy开启 uboot 命令行下的 gpio 调试命令。开启后才会编译 cmd/gpio.c提供引脚调试功能去掉这条 uboot 无 gpio 操作命令。CONFIG_SYS_EXTRA_OPTIONSIMX_CONFIGboard/freescale/mx6ullevk/imximage.cfgIMX 芯片专属关键配置给mkimage打包工具用imx 系列 SOC 启动时ROM 固化程序需要读取头部配置DDR 参数、时钟、镜像加载偏移imximage.cfg 就是这块板子的 DDR 时序、启动头参数文件构建时 mkimage 会读取这个路径的 cfg给 u-boot.bin 加上 NXP 专用启动头否则芯片 ROM 无法识别镜像、无法开机。当执行了make mx6ull_14x14_evk_defconfig后会匹配到如下规则。%config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)scripts/kconfig $展开后为:make -f scripts/Makefile.build objscripts/kconfig mx6ull_14x14_evk_defconfig-f scripts/Makefile.build-f 指定 make 不读当前目录默认 Makefile而是使用通用公共构建脚本 scripts/Makefile.build。Makefile.build 是整个 U-Boot 递归编译的通用模板负责接收 obj 参数进入对应子目录、加载该目录本地的 Makefile。objscripts/kconfig 传递参数告诉 Makefile.build本次要操作的子目录是 scripts/kconfig。内部逻辑切换工作目录视角到 scripts/kconfig自动加载 scripts/kconfig/Makefile配置专用规则文件所有后续规则、变量都以 scripts/kconfig 为上下文。末尾 mx6ull_14x14_evk_defconfig传给下层 Makefile 的目标target。也就是告诉 scripts/kconfig/Makefile我要执行 %_defconfig 这条规则。%_defconfig: $(obj)/conf $(Q)$ $(silent) --defconfigarch/$(SRCARCH)/configs/$ $(Kconfig)展开后为:scripts/kconfig/conf --defconfigarch/arm/configs/mx6ull_14x14_evk_defconfig Kconfigconf 是 C 写的二进制工具处理分 4 大步。步骤 1递归解析全部 Kconfig在内存建一张完整配置表以根 Kconfig 为起点执行所有 source 语句一层一层加载 arch、board、cmd、driver 所有子 Kconfig逐条读取每一个 config、menu、depends on、default、select在内存生成一张大表格每条记录包含开关名 CONFIG_XXX类型 bool/hex/string默认值、依赖项、自动选中项归属哪个菜单层级、帮助文本此时 conf 已经掌握全工程所有配置的全部规则、约束关系。步骤 2读取你传入的 defconfig 板子模板读取 arch/arm/configs/mx6ull_14x14_evk_defconfig里面只有板子差异化开关plaintextCONFIG_TARGET_MX6ULL_14X14_EVKyCONFIG_CMD_GPIOyCONFIG_SYS_EXTRA_OPTIONSIMX_CONFIGboard/freescale/mx6ullevk/imximage.cfg用模板里的配置覆盖内存表格里对应的默认值。步骤 3自动校验、补齐所有连锁依赖依靠内存里的 Kconfig 规则表自动推导你开了 CONFIG_TARGET_MX6ULL_14X14_EVKy它里面写了 select ARM、select ARCH_MX6 → 自动把这两个置 y步骤 4输出完整 .config 文件把内存里最终全部配置状态写入输出目录的 .config开启项CONFIG_ARMy、CONFIG_SYS_MALLOC_F_LEN0x400关闭项注释# CONFIG_USB is not set板子标识字符串CONFIG_SYS_VENDORfreescale 等。核心MAKE过程ALL-y u-boot.srec u-boot.bin u-boot.sym System.map ...ALL_y定义了最终输出文件包含以下文件。make会触发all --- All_y的目标。目标名称类型说明u-boot.srec镜像文件S-Record 格式的可执行镜像常用于烧录器、调试器加载u-boot.bin镜像文件纯二进制 U-Boot 镜像最核心的烧录产物去掉了 ELF 头与调试信息u-boot.sym符号文件导出 U-Boot 所有符号地址表用于调试、异常栈解析System.map符号文件全局符号映射表按地址排序记录所有函数 / 变量的链接地址u-boot.cfg配置文件导出当前镜像所有生效的宏定义用于核对编译配置binary_size_check检查伪目标不生成文件校验最终镜像大小是否超出板级配置的上限

相关新闻