qualcomm手机开机全过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qualcomm手机开机全过程
Tags: Android, Nand Flash, Nor Flash, QUALCOMM, 高通手机
由Fgamers发表于2011 年 03 月 30 日 19 次阅读评论(0)
一.开机的简要流程分析
Qualcomm的平台软件支持两种启动方式:一种是Nor Flash启动方式,另外一种就
是Nand Flash启动方式。Nor Flash启动方式就相当于硬件直接找到一个入口点开始执行代码,相比较而言会比较简单,且 Amoi 没有采用此种方式,所以本文对于这种方式不做详细分析。另外一种就是Nand Flash启动方式,这种方式和 PC 的启动方式比较相像,也是 Amoi 采用的 Boot 方式,下面将详细分析在此方式下面的开机过程。
按下开机键之后,将产生一个时钟中断,从而通知 AMSS 主芯片的 Boot Load 硬件去将放置于Nand Flash上面的第一个 Block ( 8K )里面的Boot 代码 Copy 到内核内存( RAM ,这个内存应该是 CPU 自带的内存,同后面提到的 SDRAM 有一定区别,可以把它当作 CPU 的 Cache )的
0xFFFF0000 地址,并开始执行 Boot 代码。 Boot 的主要任务是完成整个系统的硬件初始化工作(类似于 PC 上面的 BIOS 所完成的硬件自检工作,至于 Boot 的详细工作机制,后文会有详细描述)。 Boot 所完成的工作里面,最重要的一件事就是会将整个手机软件代码( AMSS 软件包)拷贝到 SDRAM 中,并最后将控制权交给 AMSS 软件。说白了,就是 Boot 执行完成之后,
代码的执行点将由 Boot 跳转到 AMSS 软件的的入口点函数 main(). (此函数在 mobile.c 里实现)。
代码运行到了 Main() 之后,在这个函数里面将完成操作系统( rex )的初始化工作,其实现方法是调用 rex_init() 。 Rex_init() 完成的工作很简单:
1. 完成操作系统必要的一些数据结构( timer 链表、任务链表等))的初始化之外;
2. 接下来,它创建了三个任务,分别是: rex_idle_task 、 rex_dpc_task 和 tmc_task 。
Idle 任务没什么好解释的,目前这个任务为空,什么也没做, dpc_task 目前不知道是做什么的,暂时可以不用管。前面的这两个任务都属于操作系统层面的,由操作系统来维护,和手机软件关系不大。哪一个和手机软件关系大呢?答案是: tmc_task 。大家可以把这个当作操作系统的入口 ( 主 ) 任务,也可以把它当作整个手机软件的入口任务。即 AMSS 软件里的所有其它任务的创建和维护就是由这个 tmc_task 来完成的。
到此为止,整个 AMSS 软件还并没有跑起来,只是跑到了 tmc_task 里面了。在 tmc_task 里面,会调用 tmc_init() 来完成整个 AMSS 软件包的初始化工作,其中最重要的一项工作就是调用 tmc_define_tasks() 将 AMSS 软件包所有需要的任务都创建起来了。比如说 slee_task 、 dog_task 、
cm_task 、 wms_task 、 ui_task 等。这些任务,一般不需要直接和 AL 层软件打交道,但请大家记住,手机上所有功能的实现最根本点就是由这些服
务组件( Service Task )来完成的。将来大家跟踪一个具体的功能模块时,比如说通话模块,如果需要,可以再去深入研究它的具体实现。
好了,到现在为止,所有的 AMSS 核心软件就全部跑起来了(手机的功能模块,在软件方面就体现为 OS 层面的一个任务)。但现在大家还根本看不到Brew 和 AEE 的影子。呵呵,各位不要急。到了这个层面之后,我想稍微多说几句。最早的Qualcomm平台,比如说 5xxx 系列,是根本没有 Brew 的,那个时候的 AL ( Application Layer )层软件开发,是直接调用底层Service task 所提供的 API 来完成相应的工作的。从这种角度来看的话,显然那时的开发是比较郁闷和难度较高的。不过,到了 65xx 之后,Qualcomm 平台引入了 Brew ,手机开发商就没必要去从这么底层( Service API )的层面进行手机开发了,他们完全可以基于 Brew 来实现一台手机的所有功能(Qualcomm给我们的参考代码,就是全 Brew 平台的)。
Brew 的运行环境 AEE 是如何跑起来的呢?关键在于 ui_task() ,由于
ui_task 和我们手机开发的关系非常密切,其地位也相当重要,所以,后文我将单独对它进行一个深入的研究与分析。到目前为止,大家只需要知道
ui_task 将 AEE 加载起来了,并且,它起到了一个中间层的作用,即所有AMSS 底层服务组件的消息,都将经由 ui_task 而转到 AEE ,并最终转到具体的 App ( Applet )的执行代码里面( HandleEvent() )。
注意:
1.上述的开机过程,在每一次按开机键都需要走一遍,即关机之后,整个系
统的所有功能都将消失,而不像有些手机,看起来是关了机,但实际上底层还是有一些软件模块在跑。为什么可以肯定地说上述开机过程每次都必须走一遍,原因很简单,因为我们的平台软件是基于Nand Flash启动的,
所有的代码都需要 Copy 到 SDRAM 才能运行,而关机断电之后, SDRAM 里的东东会全部丢失,所以,毫无疑问,上述的过程必须每次开机都执行;
2.关机的过程相对比较简单,系统检测到关机中断之后,将调用
tmc_powerdown_handler ()来完成关机动作,它将把所有 AMSS 的任务都 Stop 掉,并最后调用 rex_exit() 退出 Rex ,从而完成整个关机动
作。
3.显然,关机动作前,如果有必要,每一个任务必须将它希望保存的信息保
存到 Flash 上面,以便下次开机时可以得到这些信息;
二. 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) 控制器的初始化 , 这个函数执行完了之后,系统就可以知道两条总线上连接了哪些设备,同时也可以找得到这些设备,不过,至于单个设备自身的初始化,则不在这里 .
[ 注 ]