uboot启动流程

更新时间:2024-04-07 15:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Uboot在MPC860架构下的启动流程:

『运行在BOOTROM中』 (汇编S) 设置immr—> 设置msr—>

初始化I-cache和D-cache(unlockall— invalidall— disable-D-cache—enable-I-cache)—> 初始化mmu的tlb—> 重定位PC指针—> 设置栈指针r1 —>

设置r3为immr,调用cpu_init_f(immr)函数—> (汇编E)

(C代码S)

配置通过immr映射的CPU内部寄存器—>

配置BAx和ORx,使相关的bootrom或cpld等的片选可用—> (C代码E)

(汇编S)

设置r3为bootflag,调用board_init_f(type)函数—> (汇编E)

(C代码S) board_init_f()

执行init_sequence[]数组中的所有初始化函数,主要有以下内容,可根据实际情况添加: env_init(初始化enviroment变量相关的数据结构) init_baudrate(在数据结构上设置波特率) serial_init(初始化串口硬件)

console_init_f(从此处开始,可以使用串口,输出打印信息了) display_options

init_func_ram(配置SDRAM控制器,使SDRAM可用)—>

分配SDRAM内存空间;R1为特殊用途保留区;uboot存放uboot代码;malloc用作malloc函数的分配空间;bd_t存放单板信息;gd_t存放全局信息;R2为栈顶保留区;addr指向uboot代码区;id指向全局数据区;addr_sp指向栈顶;

R1ubootaddrmallocbd_tgd_tidaddr_spR2

—>

为bd_t和gd_t区设置初始数据—>

调用汇编代码段relocate_code,把addr_sp,id和addr作为参数传入 —> (C代码E)

(汇编S)

分别从r3,r4,r5中获取从C函数中传递过来的addr_sp,id和addr三参数—> 从bootrom向sdram的addr处,搬运uboot代码—> 『运行在SDRAM中』

在sdram中,重新定位代码中的全局符号表—>

设置r3和r4为gd指针和dest_addr,作为向调用函数传递的两个参数,调用board_init_r()函数—> (汇编E)

(C代码S) board_init_r()

重定位cmd_table[]表中的所有命令—> 调用flash_init()初始化flash设备—>

调用cpu_init_r(),根据需要初始化CPU的一些高级特性—>

调用mem_malloc_init()初始化malloc功能,此后,可以调用malloc()分配堆空间—>

调用env_relocate(),根据代码中的默认env值或bootrom中存放的env值,初始化内存中由env_ptr指向的env值—>

从env_ptr指向的环境变量中,获取ethmac地址和IP地址—>

调用device_init()初始化设备链表devlist,并把单板上的所有设备注册在这个链表上—> 调用jumptable_init()初始化全局数据gd_t中的jt表,以供后续应用程序调用—> 调用console_init()初始化stdin,stdout,stderr—>

调用interrupt_init()安装中断处理程序,复位减法计数器,开启中断功能—>

调用set_timer()设置时间戳timestamp为0,减法计数器中断会修改它的值—> 从环境变量中获取loadaddr和bootfile值—> 调用eth_initialize()初始化网口设备—> 通过永久for循环进入main_loop() (C代码E)

本文来源:https://www.bwwdw.com/article/818r.html

Top