2024年6月5日发(作者:)

本文试图通过代码来深入剖析Qualcomm手机开机的整个过程,即从按下开机键一

直到出现待机界面,Qualcomm的手机软件在整个流程中究竟完成了哪些工作。本文的主

要目标是理清手机的初始化流程,并为今后Amoi定做初始化工作提供一个参考。

关键字:开机、Rex、TMC、ui_task、CoreApp

一、开机的简要流程分析

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)层软件开发,