【Xilinx】MPSOC启动流程(四)- Uboot

该文详细介绍了Xilinx平台基于ARMV8的Uboot启动流程,包括board_init_f阶段的各项初始化任务,如外设初始化、内存分配、设备树重定位等,并涉及DRAM管理、串口初始化和驱动模型等内容。

此系列博客,仅对Xilinx平台PS端(ARM部分)开发做介绍,不对PL(FPGA)做过多介绍。

目录

一. Uboot启动流程

二. board_init_f

2.1 第一段初始化

三.  relocate_code

四. board_init_r


一. Uboot启动流程

基于ARMV8的启动流程:

二. board_init_f

主要做以下工作:

  1. 初始化外设,例如串口,定时器,或打印相关信息。
  2. 初始化gd的各个成员变量,分配DRAM内存空间,uboot会将自己定位的DRAM的最后面的区域,为Linux腾出空间。

调用initcall_run_list(init_sequence_f);

init_sequence_f 定义了多个初始化函数:

2.1 第一段初始化

  1. fdtdec_setup:设备树的位置在uboot.bin末端,所以将_end的值赋给gd->fdt_blob。

设备树配置共有4中模式:

默认使用CONFIG_OF_SEPARATE 模式

 

2.initf_malloc: 初始化gd中与malloc有关成员变量gd->malloc_limit,malloc内存池大小,宏未定义,此函数执行为空,具体实现在common/dlmolloc.c中

3.board_early_init_f初始化时钟IO,PLL,DDR等,

但CONFIG_ZYNQMP_PSU_INIT_ENABLED未使能,因为之前FSBL已经初始化了

 

 

4.log_init: 日志初始化,common/log.c

5.initf_bootstage: 初始化gd->bootstage, 用于标识当前处于什么阶段,UBOOT可分为两个大阶段:SPL和uboot阶段,common/bootstage.c

6. timer_init: 初始化定时器

7. initf_dm: uboot的驱动模型DM初始化,为后续初始化串口等驱动做准备

8. 板子早期的一些初始化,在board/xilinx/zynqmp.c

9. init_baud_rate: 初始化波特率

10. serial_init:串口初始化, 在driver/serial/serial.c中定义,在DM驱动模型框架下,查找对应的驱动实现

11. display_options:打印一些信息,uboot 最初一行的打印信息

12. announce_dram_init: 打印DRAM

13. dram_init: 并非真正的初始化 DDR,只是设置 gd->ram_size 的值, 即当前dram的大小

14. setup_dest_addr:设置目的地址,设置gd->ram_size,gd->ram_top,gd->relocaddr

15. reserve_xxx: 此一系列函数用于对DRAM内存进行分配

最终DRAM分配如下:

16. display_new_sp:显示新的SP位置

17. reloc_fdt: 根据上面对DRAM的内存分配,重定位设备树的位置

Xilinx的Uboot初始位置为0x100000,重定位后位置为:0x7ddd39c8

18. setup_reloc: 将全局变量gd拷贝到新的位置

三.  relocate_code

此函数用于UBOOT程序从ROM拷贝到新的DRAM位置

  1. 将用的一些值存在寄存器中

    2.拷贝程序到新位置

       X0保存着拷贝的目标地址

​​​​​​​四. board_init_r

继续初始化外设和设置gd的成员变量,board_init_f并没有初始化所有的外设

  1. initr_reloc: 用于设置 gd->flags,标记重定位完成,GD_FLG_RELOC
  2. initr_caches 函数用于初始化 cache,使能 cache
  3. initr_reloc_global_data 函数,初始化重定位后 gd 的一些成员变量
  4. initr_malloc:初始化malloc内存区域
  5. initr_dm:初始化DM驱动框架
  6. board_init 函数,板级初始化,可做一些外设初始化等,开发板未在此处作外设初始化

7.initr_serial 函数,初始化串口

8. initr_mmc 函数,初始化 EMMC

9. initr_env 函数,初始化环境变量,判断是否需要加载环境变量文件,若需要,则匹配相应的加载驱动去将环境变量文件加载进来,否则直接使用默认环境变量值(include/env_default.h)Xilinx使用的是默认配置

 不同芯片的其他环境变量定义相应头文件中,MPSOC定义在include/configs/xilinx_zynqmp.h中

10. initr_secondary_cpu 函数,初始化其他 CPU 核,xilinx函数为空

11. stdio_add_devices 函数,各种输入输出设备的初始化

12. console_init_r 函 数 , 控 制 台 初 始 化 , 初 始 化 完 成 以 后 此 函 数 会 调 用

13. stdio_print_current_devices 函数来打印出当前的控制台设备

14. interrupt_init 函数,初始化中断,arm64直接返回0

15. initr_enable_interrupts 函数,使能中断,arm64直接返回0

16. board_late_init 函数,板子后续初始化,获取启动模式,初始化启动脚本等参数,也可做一些外设初始化工作。

 启动模式寄存器:

17. initr_net 函 数 , 初 始 化 网 络 设 备 , 函 数 调 用 顺 序 为initr_net->eth_initialize:匹配对应的驱动程序

18. run_main_loop 行,主循环,处理命令

后续章节会继续分析Uboot代码流程

<think>嗯,用户问的是关于MPSOC通过USB启动下载镜像的操作步骤。我需要先理解MPSOC是什么。MPSOC应该是Xilinx的Zynq UltraScale+ MPSoC,对吧?这种芯片通常用于嵌入式系统,支持多种启动方式,比如SD卡、QSPI、NAND,还有USB。用户可能是在开发过程中需要从USB启动,可能遇到问题或者第一次尝试。 首先,我得回忆一下Xilinx官方文档中的启动流程。一般来说,启动过程需要正确的启动镜像和配置。USB启动可能涉及到将镜像文件放在USB存储设备中,并设置正确的启动模式引脚。但具体步骤可能需要详细说明。 接下来,用户可能需要知道如何准备镜像文件。比如,生成BOOT.BIN文件,包含FSBL、PMU Firmware、PL配置和Uboot。这里要确认用户是否了解这些组件,可能需要解释一下每个部分的作用,但用户的问题可能更偏向操作步骤,所以重点放在步骤上。 然后,格式化USB设备为FAT32,拷贝BOOT.BIN和可能的image.ub到根目录。需要确认文件系统是否正确,以及文件是否放在正确的位置。用户可能会忽略这一点,导致启动失败。 设置启动模式方面,MPSOC启动模式通过引脚配置,比如设置成USB启动模式。可能需要给出具体的引脚配置,比如Bank0的电压和引脚电平设置。这里需要确保用户知道如何查阅自己的板子手册,因为不同开发板的引脚可能不同。 连接USB设备到正确的接口,比如USB 0,可能需要使用特定的USB端口,用户需要确认板子上的接口标识。 上电启动后,观察串口输出,确认是否成功加载镜像。如果失败,可能需要检查镜像文件是否正确,USB设备是否被识别,启动模式是否正确,或者硬件连接问题。 用户可能的常见错误包括:镜像文件不正确、USB格式不对、启动模式配置错误、USB接口接错、或者硬件问题。需要提醒用户逐一排查这些点。 是否需要提到使用Vivado和PetaLinux工具生成镜像的步骤?用户可能已经生成了这些文件,但如果是新手,可能需要简要说明,但根据问题,用户可能已经有一定的背景,所以可能不需要深入,但保持步骤完整。 最后,确保回答结构清晰,分步骤说明,帮助用户逐步操作,同时指出可能的问题点。需要检查LaTeX格式是否正确,虽然这个问题可能涉及较少数学公式,但如果有变量或代码,需要用正确的格式。</think>以下为Xilinx Zynq UltraScale+ MPSoC通过USB启动镜像的操作指南,采用分步式说明: $$ \text{整体流程} = \text{准备镜像} + \text{配置启动模式} + \text{设备连接} + \text{启动验证} $$ **一、镜像准备阶段** 1. 生成启动镜像文件: - 使用Vivado/PetaLinux工具链生成`BOOT.BIN`文件 - 文件应包含: $$ \text{BOOT.BIN} = \text{FSBL} + \text{PMUFW} + \text{PL Bitstream} + \text{U-Boot} $$ - 可选准备`image.ub`(包含内核与设备树) 2. USB存储设备格式化: ```shell sudo mkfs.vfat -F 32 /dev/sdX # 将设备格式化为FAT32 ``` 其中`sdX`对应USB设备标识符 **二、硬件配置阶段** 1. 设置启动模式引脚: - 配置Bank0电压为3.3V(典型值) - 设置引脚电平组合: $$ \text{MODE[3:0]} = 0011_0 \rightarrow \text{USB0 Primary Boot} $$ - 具体电平参考开发板手册 **三、文件部署阶段** 1. 将生成文件拷贝至USB根目录: ``` /BOOT.BIN /image.ub(如适用) ``` **启动执行阶段** 1. 物理连接: - 将USB设备接入目标板的USB0接口 - 确认JTAG/USB-UART调试接口已连接 2. 上电观察输出: - 通过串口终端(如Putty)监控启动日志 - 正常启动应显示: ```log Xilinx PMUFW: PMU Firmware running... U-Boot 2023.01 (Mar 05 2023 - 15:32:17 +0800) ``` **五、故障排查清单** 1. 启动失败常见原因: - $\text{文件验证}$:`md5sum BOOT.BIN`检查文件完整性 - $\text{格式验证}$:确认USB为FAT32且无隐藏分区 - $\text{硬件验证}$:测量Bank0引脚电平是否符合规格 - $\text{接口验证}$:尝试更换USB端口(注意USB0与USB1差异) **附加说明**: 对于定制化设计需特别注意: $$ \text{PMU配置} \propto \text{系统时钟设置} \times \text{电源时序要求} $$ 建议使用`xsct`工具验证PMU固件与硬件平台的兼容性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有意思科技

给与不给,我都会更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值