uboot启动流程以及分析

最近在做板卡的调试工作,需要调试板卡,所以先熟悉一下uboot启动过程(这里主要分析代码流程):

1:uboot:作用需要设置cpu状态,中断状态,MMU状态,

其中包括arch级初始化:关中断,设置svc模式,时钟,看门狗寄存器的设置。

板级初始化设置:堆栈环境,串口,定时器,环境变量。I2C设置等代码重定向,板级初始化操作sd,nandflash,网络,中断等初始化的过程,进入命令行,等待中断输入命令行状态。

,根据硬件资料进行半颗初始化,代码我的重定向等。

1:代码入口:u-boot/arch/arm/cpu/u-boot.lds连接文件。ENTRY(_start):代码的入口函数。

2:接下来 _start是整个uboot的入口,代码:arch/arm/lib/vector.s跳转到 reset

3:arch/arm/cpu/arv7/start.s:设置SVCD,关中断等操作。

bl cpu_init_cp15:主要对cp15协处理器进行初始化,关闭MMU和tlb(处理器访问内存时做地址转换),和cache。

cache:高速缓存存储器,用来保存CPU使用频繁的数据,一条指令访问内存数据时,查询缓存中的数据是否过期,,处理器会定期回写cache中的数据到内存。

MMU:使用mmu可以向应用程序提供一个虚拟空间地址,uboot启动时使用的都是虚拟空间地址。

tlb:(处理器访问内存时做地址转换),记录了虚拟地址和物理地址的映射关系

bl    save_boot_params:保存参数    

bl    cpu_init_cp15

bl cpu_init_crit 是对一些关键寄存器的初始化,设置内存时序等:核心代码:lowlevel_init。

bl    _main:跳转到板卡级的代码。

4:arch/arm/cpu/lowlevel_init.S中lowlevel_init由板级代码实现()。

5:最后跳转到c语言函数    bl    s_init中去,分析s_init函数。

s_init{ //用来初始化一些关键的硬件函数。配置时钟,确保看门狗运行,确保控制器运行从sdram的0地址运行,初始化时钟,初始化串口,配置专用管脚,配置专用外设,配置fpga
 

二:板级初始化代码:板级初始化代码入口:_main()  ENTRY(_main)

1:arch/arm/lib/crt0.s中跳转到ldr    pc, =board_init_r 和bl    board_init_f

2::uboot/common中调用者两个程序。

board_init_r 

    if (initcall_run_list(init_sequence_r))
        hang();

最终通过调用:init_sequence_r来进入到run_main_loop()函数中去。并且在run_mian_loop进入命令行状态,等待输入命令的操作,对命令进行处理:至此,uboot流程完成。

猜你喜欢

转载自blog.csdn.net/zuodenghuakai/article/details/88717679