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

24 篇文章 1 订阅
14 篇文章 11 订阅

此系列博客,仅对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代码流程

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有意思科技

给与不给,我都会更新

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

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

打赏作者

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

抵扣说明:

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

余额充值