6223开机流程分析
时间:2022-10-30 10:00:00
MTK—
1说明:...4
2术语:...4
3系统启动流程框图:...4
4MMI开机过程:...4
4.1MMI TASK..4
4.2启动过程分支...7
4.3MMI启动流程图...8
4.4MMI启动函数调用过程和说明...9
5APP INIT:...14
6开机过程--l4 \UEM\NVRAM\MED:...15
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
7 开机过程--BMT\PMIC:...24
8 开机过程--BOOT:...24
9 l4介绍:...24
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
10 MED介绍:...29
11 KEY PAD介绍:...29
11.1 简单说明...29
11.2 文件...30
11.3 相关部分...30
12 BMT介绍:...31
13 PROGRESS:...31
13.1 进程优先级...32
13.2 进程创建...33
14 BOOT:...35
14.1 MCU块图...35
14.2 MEMORY重映射...35
14.3 PWR ON..37
14.4 PMU..38
14.5 BOOT.40
15 其他:...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
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 信令流程图