现在的位置: 首页 > 综合 > 正文

MTK开机流程—应用部分

2013年09月19日 ⁄ 综合 ⁄ 共 2099字 ⁄ 字号 评论关闭

 

 

MTK开机流程—应用部分
1     说明:... 3
2     应用启动第一阶段—系统资源配置:... 3
3     应用启动第二阶段—等待开机事件:... 4
4     应用启动第三阶段—开机动画:... 7
5     应用启动第四阶段—进入待机界面:... 8
 

 

 

1          说明:
(适用于MTK6223平台)

在分析开机流程的过程中,我们首先需要学习平台的相关文档,并阅读代码,有初步的了解后,再搭建调试环境,通过跟踪和打印LOG来分析验证实际的开机流程。由于目前的条件限制以及平台存在的一些缺陷,目前我调试的方法是结合串口打印和模拟器打印、跟踪的方法来调试的。

因为开机流程跟开机触发原因、卡状态、网络状态、本机设置以及用户交互都有关系,流程各不相同,本文档只分析其中一种过程,在这个过程下学会分析问题和解决问题的方法之后,其他的流程可按此方法分析得来。

 

 

2          应用启动第一阶段—系统资源配置:应用启动的第一阶段是创建系统环境,对TARGET开发板来说,就是启动底层硬件、配置MCU、配置外围器件,创建操作系统、配置系统资源、创建各种任务等;对模拟器了说,主要是创建工作环境来模拟开发板,并提供一套GUI来提供输入输出,和用户交互。下图是模拟器在启动但没开机的时候的串口信息,目标板的信息与之相似:

     顺便提供一套模拟器的图片做参考:

       

 

3          应用启动第二阶段—等待开机事件:

下图是在添加打印语句后在模拟器上得到的打印信息:

由于模拟器是无法完全模拟TARGET上的硬件信息和嵌入式系统的BOOT过程、操作系统创建、任务加载过程的,所以我们目前暂时先不重点关注这个部分,本文档的目的也是在模拟器能完成的应用启动流程上进行说明和介绍。

从上图我们可以看到,在应用启动的过程中,先是创建 mmi_task(),然后进入MMI_task()功能实体,进行MMI应用的初始化,并进入无限循环等待事件处理。在最开始的时候,是等待开机事件,进行应用部分的开机。

开机事件是MSG_ID_MMI_EQ_POWER_ON_IND,在MMI_task收到这个事件后,进入函数分支:
……
switch (p->poweron_mode)

       case POWER_ON_KEYPAD:

              ……

              mmi_bootup_entry_disk_check();                  

                                         

 

然后再逐层调用:
mmi_bootup_exit_disk_check()
mmi_bootup_entry_flight_mode_query()  

 

FlightModeCheckBeforeAnimation()

MTPNP_AD_Bootup()

(这个调用过程到这里就结束了,这个函数是底层封装函数,通过反汇编以及函数调用栈,我们可以看到程序的运行状态。)

 

   我们可以看到,这个封装函数调用了MTPNP_PFAL_Master_Startup_Normal(),再看MTPNP_PFAL_Master_Startup_Normal()的反汇编函数,如下:

 

调用了PowerOnNormalMode()。

 

所以程序能够继续运行下去,整个开机过程的栈结构如下:

 

 

4          应用启动第三阶段—开机动画:
PowerOnNormalMode()的执行过程如下:

 

具体的实现我们可以参照代码来阅读。可以看到此时手机还处在播放开机动画的过程当中,调用SimPasswdReqResponse()进入其中的一个函数分支。
到开机动画播放完后,会有一个定时器事件上面给MMI TASK,进行相关的处理后,退出动画播放,再调用SimPasswdReqResponse()进入它的另一个分支,下面是动画播放完后的函数调用关系。

    最后调用到mmi_ready_to_idle_screen_ind(),该函数是MOD_MMI任务自己给自己发一个MSG_ID_MMI_READY_TO_IDLE_SCREEN_IND消息到外部消息队列,并设置好该事件的处理函数mmi_ready_to_idle_screen_ind_hdlr(),本轮消息处理调用过程结束。

 

5          应用启动第四阶段—进入待机界面:
在MMI_task主循环里收到事件MSG_ID_MMI_READY_TO_IDLE_SCREEN_IND,根据注册的事件处理函数,调用mmi_ready_to_idle_screen_ind_hdlr(),具体的处理过程见下面的函数调用栈:

 

 

  下面是该过程的串口打印信息,注意看函数的执行过程,与调用栈的阅读方式是相反的。到这个过程执行完成,就进入了待机界面了,我们的应用开机过程就基本完成了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiashaohua/archive/2009/09/30/4622187.aspx

抱歉!评论已关闭.