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 信令流程图