二、Boot代码深入分析
Boot代码大部分是用汇编语言写的,也有小部分,可能需要由OEM商修改,所以用C语言来写。另外,Boot代码属于Driver范围,所以大家可以在
drivers/boot目录里面找到相应的代码。Boot的代码组织得非常模块化,整个boot的入口点是在 Boot_function_table.s里面,这个汇编代码里面实际上是将Boot需要完成的任务封装成了不同的函数,由不同的函数来完成相应的工作,接下来,我将深入分析这些函数所完成的工作,如下所述。
a)mmu_enable_instruction_cache;
这个只有在Nand启动模式时才需要,打开ARM的指令Cache.
b)boot_hw_ctrl_init
此函数主要是完成两条总线(EBI1、EBI2)控制器的初始化,这个函数执行完了之后,系统就可以知道两条总线上连接了哪些设备,同时也可以找得到这些设备,不过,至于单个设备自身的初始化,则不在这里。
[注]
这个函数很重要,OEM商如果需要加新的设备到系统中(挂在两条总线上),则需要定做此模块,目前阶段主要是内存。另外,如前文所述,这个函数是由C语言来写的,主要目的就是为了方便OEM商定做。内存设备的修改,可以在这个模块里找到相应的数据结构,相对还是比较简单的。
c)boot_hw_tlmm_init
1.晶振时钟的初始化;
2.中断表的初始化;
3.GPIO的初始化;
4.Msm本身的驱动,除了EBI2;
d)boot_rom_test
这个函数非常简单,只是做一个很简单的Rom检查.(比对两个标志位来检查,并没有一块一块地去检查)。
e)boot_ram_test
Ram自检,具体算法其实也很简单,就是读、写内存以判断是否成功。
f)boot_ram_init
1.拷贝手机代码从Nand Flash到SDRAM。
a.Image__BB_RAM__Base:Core Code;
b.Image__APP_RAM__Base:App Code;
[注]
上述动作是分块进行的,原因是因为Qualcomm支持分块Boot Load.
2.将Image__ZI_REGION__ZI区域初始化为0;
3.初始化OEM要求的动态Heap;
4.至于代码段里的数据初始化,直接在Image里就完成了(编译器完成);
g)boot_stack_initialize
ARM栈初始化,主要是为分块代码加载而预留的.
h)boot_cache_mmu_init
ARM Mmu初始化
注意:到此为止,整个Boot的工作就告完结了,那么,它又是如何跳到AMSS的main入口点呢?原因很简单,ARM编译器在链接的时候会自动做出一个
__rt_entry(),由此函数来完成ARM库函数的初始化,并最后将代码执行点跳转到main()。而__rt_entry()会在 boot_reset_handler.s里调用,具体细节,大家可以不用太过关心,只需要明白,Boot跑完之后,手机软件就跑到了main里就Ok了。
手机开发之二:Boot代码深入分析
最新推荐文章于 2024-08-27 11:00:58 发布