资讯详情

6223开机流程分析

4.1MMI TASK..4

4.2启动过程分支...7

4.3MMI启动流程图...8

4.4MMI启动函数调用过程和说明...9

6.1BMT.15

6.2UEM..15

6.3NVRAM..16

6.4L4C.16

6.5UEM..16

6.6MOD_MED..17

6.7&nbs;   UEM..17

6.8     L4C.17

6.9     信令流程图...18

    

    

    

9.1     COMMON..24

9.2     Architecture.24

9.3     L4 TASK..25

9.4     L4C Module.27

9.5     UEM Module.27

9.6     RAC Module.28

9.7     TCM Module.28

9.8     SMLAL Module.28

9.9     CSM Module.28

9.10   SMU Module.28

9.11    PHB Module.29

9.12   ATCI Module.29

      

   

11.1    简单说明...29

11.2    文件...30

11.3    相关部分...30

      

      

13.1       进程优先级...32

13.2       进程创建...33

      

14.1   MCU块图...35

14.2   MEMORY重映射...35

14.3   PWR ON..37

14.4   PMU..38

14.5   BOOT.40

      

15.1       相关变量和数据结构...40

15.2   _boot_mode.43

15.3   system_boot_mode.43

15.4   _IsBootForUSBAT.44

15.5   PWRon.44

15.6       开机LOGO..45

15.7       默认时间...46

15.8   KAL的初始化...46

15.9   RTC的初始化...46

15.10     Initialize单步之后的流程//6253.47

15.11     寄存器...47

 

1         说明:

 

 

2         术语:

 

DCL (Driver Common Layer)

MPU(Memory Protection Unit)

 

 

 

3         系统开机流程框图:

 

 

 

 

 

 

1         MMI开机过程:

 

1.1       MMI TASK

TaskInit.c

mmi_create()

    {

        MMI_task,   /* task entry function */

        MMI_Init,   /* task initialization function */

        NULL,

    };

 

 

另留意Mmi_create.c文件里有

mmi_create(comptask_handler_struct **handle)

{

       static comptask_handler_struct mmi_handler_info =

       {

              mmi_task_main,                   /* task entry function */

              NULL,                  /* task initialization function */

       };

}

这个文件的函数不执行具体内容,看这个文件出现的作用和是否生效。(简单分析,它由#ifndef PLUTO_MMI这个宏来控制,应该是给AT版本使用的,因为AT版本不需要MMI界面,另这个文件也不在LIS文件之中。)

 

MMI初始化执行在系统的栈初始过程中,先执行。

-000|MMI_Init(task_indx = INDX_MMI)

-001|stack_init_tasks(asm)

-002|stack_init(asm)

-003|mainp(asm)

-004|Application_Initialize()

-005|INC_Initialize(asm)

-006|MTK_Initialize(asm)

----|end of frame

    |

 

任务启动执行在进程创建过程中,后执行。进入MMI TASK后,开始没有有效信号,任务空转,等到键盘发出信号提示开机后,MMI TASK正式开机。

-000|MMI_task(entry_param = 0x00126E28)

-001|TCC_Task_Shell(asm)

----|end of frame

    |

    |

 

 

 

 

 

 

 

 

 

 

MSG_ID_MMI_EQ_POWER_ON_IND

是MMI TASK收到的很早一个信号,给MMI提示开机。

 

MSG_ID_MMI_EQ_PWNON_DUAL_SIM_IND

在开机动画过程中会收到

 

 

g_pwr_context

g_pwr_context_2

 

g_charbat_context

StartUpTime

 

 

g_phnset_cntx

 

 

1.2       开机流程分支

 

类型:无锁、SIM1 PIN1、SIM2 PIN1、SIM1 PUK、SIM2 PUK、SIM1 SML(5种)、SIM2 SML(5种)、PHONE LOCK。

开机模式:飞行模式、只开卡1,只开卡2,开双卡

开机方式:按键、闹钟、充电。。。   

POWER_ON_KEYPAD            = 0 ,

       POWER_ON_ALARM                ,

       POWER_ON_CHARGER_IN             ,

       POWER_ON_EXCEPTION         ,

       POWER_ON_USB               ,

       POWER_ON_UNINIT                ,

       POWER_ON_PRECHARGE = 8

卡状态:不插卡、只插卡1,只插卡2,插双卡

卡类型:正常卡、无效卡、欠费卡;

卡兼容:慢卡、协议不兼容卡、不同协议版本的卡等。

 

组合起来就相当庞大的分支,下面是一个组合矩阵的示例:

 

 

 

1.1       MMI启动流程图

以按键开机举例,正常的双卡开机,没有锁的MMI开机流程图如下:

 

 

 

 

 

1.1       MMI启动函数调用过程和说明

 

MSG_ID_MMI_EQ_POWER_ON_IND

在MMI_Task()中,进入:

switch (p->poweron_mode)

       case POWER_ON_KEYPAD:

mmi_bootup_entry_disk_check

                根据FS_SanityCheck()结果执行不同流程。一般走FS_NO_ERROR。

                mmi_bootup_exit_disk_check()

                  mmi_frm_power_on_init_procedure

                     进行一系列的应用初始化,包括InitializeAll

                  mmi_bootup_entry_flight_mode_query()空函数

                     FlightModeCheckBeforeAnimation()判断飞行模式

MTPNP_AD_Bootup

PowerOnNormalMode

会发送信令PRT_NW_CFUN_STATE_REQ给

L4,让l4c_nw_cfun_state_req()得到执行,启

动网络和SMU等功能,这个事件在双卡项目会

收到两次

                        mmi_bootup_exit_flight_mode_query();

                         mmi_bootup_entry_animation()定时器执行

                         等待期间,会来下面的事件

                          MSG_ID_MMI_EQ_BATTERY_STATUS_IND

                          (这个颜色的信号都是被CATCHER弄丢了的,所以

CATCHER不可以全信)

。。。。。。

   

这里有一个调用栈,是对上面过程的一个验证:

-000|mmi_bootup_exit_flight_mode_query()

-001|PowerOnNormalMode()

-002|MTPNP_AD_Bootup()

-003|FlightModeCheckBeforeAnimation()

-004|mmi_bootup_exit_disk_check()

-005|mmi_bootup_entry_disk_check()

-006|MMI_task(?)

-007|TCC_Task_Shell(asm)

----|end of frame

 

 

代码里关于开机流程有一个简单过程说明

     * Power On Procedure

     *

     * Power On Display      NAND       SIM        Net Search    Idle Scr

     * #----------------------#----------#----------#-------------#-----------#

     * (option)    (option)    (option)

                        

mmi_bootup_entry_animation()

       mmi_pwron_entry_animation_screen()

         ShowCategory166Screen(mmi_pwron_show_image_callback() ),

进入并播放动画,通过回调函数进入后面的流程。

            

            播放动画期间,会来下面的事件(选取比较重要的部分事件)

             MSG_ID_MMI_SMU_SIM_STATUS_UPDATE_IND

             MSG_ID_MMI_SMU_STARTUP_INFO_IND

               smu_main : MSG_ID_SIM_START_CNF 26 0 0

smu_main : MSG_ID_SIM_MMI_SECURITY_IND 26 0 0

 

SML-SIM2 feature: m_handle_chv_validation begin

smu_main : MSG_ID_SIM_MMRR_READY_IND 26 0 0

              (这部分蓝色的位置不太确定,蓝色表示安全检查)

 

MSG_ID_MMI_EQ_PWNON_DUAL_SIM_IND

               ( sim_config_status = 2 , sim_insert_status = 3 都是双卡 )

 

MSG_ID_MMI_NW_PWNON_DUAL_SIM_IND

 

MSG_ID_MMI_NW_CFUN_STATE_RSP

 

MSG_ID_MMI_CPHS_MMI_INFO_IND

 

MSG_ID_L4AUD_AUDIO_PLAY_FINISH_IND

 

MSG_ID_MMI_SMU_PASSWORD_REQUIRED_IND

 

MSG_ID_MMI_NW_SEL_MODE_IND

 

MSG_ID_MMI_RAC_ACTIVATED_ IND

 

MSG_ID_MMI_SMU_CHECK_PIN_STATUS_RSP

 

mmi_pwron_show_image_callback

      状态不同走的流程也不同,下面是进入这个函数之后的调用栈:

-000|PowerOnBatteryIndicationCompletePhase2()

-001|mmi_bootup_entry_security_check()

-002|mmi_bootup_exit_low_battery_warning()

-003|BatteryCheckAfterPowerOnAnimation()

-004|mmi_bootup_entry_low_battery_warning()

-005|mmi_bootup_exit_animation()

-006|CallBackPowerOnAnimationComplete(?)

-007|mmi_pwron_show_image_callback(?)

-008|cat166_animation_complete_callback_int(?)

-009|gdi_anim_callback_timer(?)

-010|L4CallBackTimer(?)

-011|evshed_timer_handler(asm)

-012|EvshedMMITimerHandler(?)

-013|MMI_task(?)

-014|TCC_Task_Shell(asm)

----|end of frame

 

在这之后,会根据安全检查走不同的开机流程,或直接走IDLE,或进入SimPasswdReqResponse()进行安全验证,这个时候会有一下信令交互和界面交互。关于安全验证,会另有专题介绍,本文档专注于开机流程到进入IDLE的过程。

 

MSG_ID_MMI_SMU_SIM_STATUS_UPDATE_IND

MSG_ID_MMI_SMU_STARTUP_INFO_IND

。。。。。。

MSG_ID_MMI_NW_MMRR_SERVICE_STATUS_IND

MSG_ID_MMI_NW_ATTACH_IND

 

MSG_ID_MMI_SAT_SETUP_MENU_IND

 

如果需要安全检查,则安全检查后收到事件

MSG_ID_MMI_READY_TO_IDLE_SCREEN_IND

它会触发下面的栈流程进入IDLE:

-000|EntryIdleScreen()  到这里,historyData已经被清空;这里有根据启动模式走不同的分

支;进搜网mmi_idle_entry_searching_screen()

-001|mmi_idle_entry_dual_sim_root_screen() 这里有根据卡在位的状态进入不同的分支

-002|BeforeEntryIdleScr()

-003|mmi_bootup_exit_welcome_screen()

-004|ShowWelcomeScr()           这里有显示开机问候的分支处理

-005|exit_custom_startup_screen()  这个分支有关闭动画的行为

-006|goto_opening_screen()    会有InitAllApplications进行初始化

-007|mmi_ready_to_idle_screen_ind_hdlr()

-008|mmi_frm_execute_current_protocol_handler(eventID = 5289, MsgStruct = 0x0, m

-009|ProtocolEventHandler(eventID = 5289, MsgStruct = 0x0, mod_src = 68, peerBuf

-010|MMI_task(?)

-011|TCC_Task_Shell(asm)

----|end of frame

 

 

mmi_idle_entry_searching_screen()

MSG_ID_MMI_PHB_STARTUP_BEGIN_IND

MSG_ID_MMI_SAT_SETUP_MENU_RES_RSP

MSG_ID_MMI_SAT_NO_OTHER_CMD_IND

 

MSG_ID_MMI_EMAIL_INIT_RSP

 

再回IDLE,基本上算完成了开机流程,之后还会收到很多事件,如关于网络、短信、电话吧、EMAIL、MMS、WAP、SAT等。这些模块的启动和完成,要另外单独再分析。

|EntryIdleScreen()

 

 

 

1          APP INIT:

网络、短信、电话吧、EMAIL、MMS、WAP、SIM、SAT、NVRAM

 

 

   kal_bool     phb_ready_flag;

   kal_bool     sms_ready_flag;

   kal_bool     ciss_ready_flag;

   kal_bool     tcm_ready_flag;

   kal_bool    mmi_ready_flag;  

   kal_bool sms_init_sent; //true: MSG_ID_L4CSMSAL_INIT_REQ is sent 

 

 

 

 

 

3         开机过程--l4 \UEM\NVRAM\MED:

 

下面是从BMT开始,到MSG_ID_MMI_EQ_POWER_ON_IND发送给MMI TASK的一个流程分析。

3.1       BMT

 

bmt_task_main()

任务启动,即发送MSG_ID_DRVUEM_POWER_ON_IND给MOD_UEM,

 

3.2       UEM

 

uem_main

MSG_ID_DRVUEM_POWER_ON_IND

uemdrv_power_on_ind_hdlr()

uem_poweron_timer_expiry_hdlr()TARGET执行这个函数,模拟器跳过,执行下一个

uemdrv_keypad_power_on_ind()

            l4cuem_power_on_ind()

               发送MSG_ID_NVRAM_STARTUP_REQ给MOD_NVRAM

根据开机原因不同,uemdrv_power_on_ind_hdlr会执行的不同的函数,我们调试的是键盘开机,所以是uemdrv_keypad_power_on_ind()。

typedef enum{

         PWRKEYPWRON = 0,

         CHRPWRON     = 1,

         RTCPWRON = 2,

         CHRPWROFF = 3,

         WDTRESET = 4, /*NORMAL*/

         ABNRESET = 5,  /*ABNORMAL RESET*/

         USBPWRON = 6, 

         USBPWRON_WDT = 7,

         PRECHRPWRON = 8,

         UNKNOWN_PWRON = 0xF9    

}power_on_enum;

 

 

3.3       NVRAM

nvram_main

MSG_ID_NVRAM_STARTUP_REQ

nvram_startup_handler()

nvram_startup_confirm()

        完成几个NV项的处理后,发确认信号MSG_ID_NVRAM_STARTUP_CNF给UEM.

 

3.4       L4C

l4c_main

MSG_ID_NVRAM_STARTUP_CNF

nvram_startup_cnf_hdlr()

l4c_send_msg_to_uem(MSG_ID_L4CUEM_STARTUP_REQ)

 

3.5       UEM

MSG_ID_L4CUEM_STARTUP_REQ

ueml4c_startup_req_hdlr()

uem_startup_process()

uem_send_msg_to_nvram(MSG_ID_NVRAM_READ_REQ, NVRAM_EF_UEM_RMI_DATA_LID, 0, 0);

。。。

通过和NVRAM的几个读交互

uemnvm_read_data_cnf_hdlr()

NVRAM_EF_UEM_RMI_DATA_LID

    NVRAM_EF_CUST_HW_LEVEL_TBL_LID

    NVRAM_EF_UEM_MANUFACTURE_DATA_LID

    然后发出uem_send_msg_to_aud(MSG_ID_MED_STARTUP_REQ)给MOD_MED

 

3.6       MOD_MED

med_main.c

MSG_ID_MED_STARTUP_REQ

med_startup_hdlr()

    启动相关模块和进行一些初始化,然后发送aud_send_startup_cnf(MED_RES_OK),

MSG_ID_MED_STARTUP_CNF

 

3.7       UEM

MSG_ID_MED_STARTUP_CNF

uemaud_startup_cnf_hdlr

    发送MSG_ID_L4CUEM_STARTUP_CNF给L4,并做一些简单的硬件初始,如语音通道、RTC。

 

3.8       L4C

MSG_ID_L4CUEM_STARTUP_CNF

通过L4特有的函数数组映射方法,对应到

l4cuem_startup_cnf_hdlr()

l4c_eq_power_on_lind()

l4a_eq_power_on_lind()

   发送MSG_ID_MMI_EQ_POWER_ON_IND给MMI TASK,至此,MMI TASK收到开机事件的流程结束了。

 

 

1.1       信令流程图

 

 

 

 

标签: sml4749二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台