小组让做ppt,内容太多,看得不是很仔细,结果讲得一塌糊涂的。但是想想也是自己这段时间看的,总是该总结总结的,至少以后自己看了,有点启发吧。
简单说说msm8x60的启动,首先是arm7中,根据PBL启动RPM,在由RPM启动SBL1,SBL1之后分成两部分:RPM和SBL2,RPM这里陷入一个循环,等待一个变量的改变,之后再进入rpm_main_ctl的主函数,而这个变量将在sbl2跳转sbl3时被触发。sbl2在启动后,会跳转三个方向:1.tz.img,这个我基本没看,2.rpm,指定rpmFirmware启动后的主函数,3.sbl3,在跳转时会将一个*JUMPRPM*(名字没记住)的值赋给一个变量,触发sbl1留下的跳转RPM的循环,实现RPM的跳转。
代码中有1个重要的结构:sbl1/2/3_config_table[],里面包括,一个或者多个成员,以NULL结束。每个成员里面有包含着以下几个重要的成员:exec_func, jump_func, load_sbl_pre_procs, load_sbl_post_procs.
另外在sbl的主控函数中sbl1/2/3_main_ctl中最后一个函数很重要,全称不记得了,它调用了config_table.而后逐个执行config_table的成员,这时它调用的是另一个函数,该函数主要是:1执行load_sbl_pre_procs中的函数清单,2,把跳转的信息拷贝到一个局域变量,而后传递给bl_shared_data,3.跳转exec_func,4.执行load_sbl_post_procs,5.执行jump_func,其中jump_func和exec_func,两者只能执行其一。
sbl1没有exec_func和jump_func,sbl2的config_table有三个成员tz镜像,它在exec_func中执行跳转,它的post_procs为NULL;RPM的pre_procs只用一个函数,指定跳转地址,但是由于之前的循环没有被触发,所以这里不跳转;SBL3,它在jump_func跳转,同时在jump_func中触发rpm跳转。
sbl3跳转appsbl和上面的差不多,appsbl的相关过程,参看:http://www.sctarena.com/Article/Article.asp?nid=3726
值得一提的aboot_init函数是先通过宏定义生成并放在apps的代码段(__SECTION(apps)),然后apps_init函数中挨个初始化apps代码段的函数时,启动aboot_init,在aboot中boot_linux_from_flash 和boot_linux_from_mmc中都有boot_linux,从而启动linux。