最近在做板卡的调试工作,需要调试板卡,所以先熟悉一下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流程完成。