Miz-7020-uboot笔记 下载本文

内容发布更新时间 : 2024/5/4 2:10:18星期一 下面是文章的全部内容请认真阅读。

u-boot启动过程中如下流程:

start.S开始定义异常向量保存相关全局变量否跳过lowlevel_init?关闭MMU和Cachelowlevel_init.SDDR初始化重定位board.cboard_init_f1. 为gd数据结构分配地址,并清零2. 执行init_fnc_ptr函数指针数组中的各个初始化函数3. 分配内存地址4. 调用relorateboard_init_r1. 对gd、bd数据结构赋值初始化2. 各种外设初始化3. 执行一个死循环,main_loop()函数

start.S代码分析:

start.S中一个比较重要的全局变量_TEXT_BASE定义如下: .globl_TEXT_BASE _TEXT_BASE:

.word CONFIG_SYS_TEXT_BASE

其中CONFIG_SYS_TEXT_BASE定义在zynq_common.h中,而zynq_zed.h包含了该头文件,

#define CONFIG_SYS_TEXT_BASE 0x04000000

_TEXT_BASE的地址为0x04000000,也就是DDR的起始地址。 .globl _bss_start_ofs _bss_start_ofs:

.word __bss_start - _start

上述代码定义bss起始地址偏移量,其中__bss_start的值在u-boot.lds中获取,start在start.S中启动的第一个函数。 .global _image_copy_end_ofs _image_copy_end_ofs:

.word __image_copy_end - _start

上述代码定义_image_copy_end_ofs起始地址偏移量 .globl _bss_end_ofs _bss_end_ofs:

.word__bss_end__ - _start

上述代码定义bss结束地址偏移量

.globl _end_ofs _end_ofs:

.word _end - _start

上述代码定义全部代码偏移量,其中_end的值在u-boot.lds中获取。 /* IRQ stack memory (calculated at run-time) */ .globl IRQ_STACK_START IRQ_STACK_START:

.word 0x0badc0de

上述代码设置IRQ堆栈。

/* IRQ stack memory (calculated at run-time) */ .globl FIQ_STACK_START FIQ_STACK_START:

.word0x0badc0de

上述代码设置FIQ堆栈。

/* IRQ stack memory (calculated at run-time) + 8 bytes */ .globl IRQ_STACK_START_IN IRQ_STACK_START_IN:

bl cpu_init_cp15 bl cpu_init_crit .word 0x0badc0de

这两条事跳转指令,跳转到cpu_init_cp15函数执行,该函数完成的功能是关闭L1 cache和MMU,而cpu_init_crit函数的主要作用是调用lowlevel_init函数,实现DDR的初始化功能。 call_board_init_f:

ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)

bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ ldr r0,=0x00000000 bl board_init_f

接着调用board_init_f函数(C语言函数),调用C语言函数需要先设置堆栈,然后才能跳转了board_init_f去运行,进行各种硬件的初始化,结束后,跳转到代码重定位relocate。

.globl relocate_code

relocate_code:

mov r4, r0 /* save addr_sp */ mov r5, r1 /* save addr of gd */ mov r6, r2 /* save addr of destination */

board_init_f分析:

board_init_f函数位于arch\\arm\\lib\\board.c中,同时,还有一个重要的board.c位于board\\xilinx\\zynq_common\\目录下,该文件用于完成前一个board.c没有初始化或者与板子资源更相关的一些驱动初始化操作。

board_init_f函数主要是实现gd数据结构内存分配、调用各种硬件外设初始化函数和内存分配。

board_init_f函数中在如下代码段中会调用board.c中的dram_init函数:

for (init_fnc_ptr =init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { }

if ((*init_fnc_ptr)() != 0) { }

hang ();

dram_init函数原型如下: intdram_init(void) { }

gd->ram_size =PHYS_SDRAM_1_SIZE,在配置文件zynq_zed.h中PHYS_SDRAM_1_SIZE=(512*1024*1024),CONFIG_SYS_SDRAM_BASE=0。gd->ram_size =PHYS_SDRAM_1_SIZE; return 0;