MTK6225开机过程-系统启动2(hardware)
以下是在手机上抓LOG得出的结果
在MMI_Task()中,进入:
switch (p->poweron_mode)
case POWER_ON_KEYPAD:
mmi_bootup_entry_disk_check();
这个函数中,进入:
if (result == FS_NO_ERROR)
mmi_bootup_exit_disk_check();
mmi_frm_power_on_init_procedure();在这个函数中,静态变 量bInit为0,第一次初始化:调用:
InitializeAll();和InitNvramData()。
然后进入:
mmi_pwron_show_image_callback()
CallBackPowerOnAnimationComplete()
mmi_bootup_exit_animation()
mmi_bootup_entry_low_battery_warning()
BatteryCheckAfterPowerOnAnimation()
void mmi_bootup_exit_low_battery_warning(void)
void mmi_bootup_entry_nand_check_query(void)
PowerOnBatteryIndicationComplete()
mmi_bootup_exit_nand_check_query();
mmi_bootup_entry_security_check();
PowerOnBatteryIndicationCompletePhase2()
SimPasswdReqResponse(&gSMUPwdDataStruct);
mmi_bootup_exit_security_check();
mmi_bootup_entry_welcome_screen();
mmi_ready_to_idle_screen_ind();MMI发送消息
MSG_ID_MMI_READY_TO_IDLE_SCREEN_IND给自己。并设置消息
MSG_ID_MMI_READY_TO_IDLE_SCREEN_IND的CBACK函数为:
mmi_ready_to_idle_screen_ind_hdlr()
goto_opening_screen();
InitAllApplications(); //初始化applications
exit_custom_startup_screen();
{
ShowWelcomeScr(); //显示问候语
ShowIdleAppSubLcd();
}
GetPhoneLock();
退出welcom screen的处理函数是:
void mmi_bootup_exit_welcome_screen(void)
{
mmi_bootup_entry_network_searching();
{
BeforeEntryIdleScr();
{
EntryIdleScreen(); //IDLE界面的入口函数
}
}
}
然后,进入IDLE SCREEN:
void EntryIdleScreen(void)
{
if (g_keylock_context.gKeyPadLockFlag == 0) //键盘没有锁
{
mmi_idle_entry_idle_screen(); /* idle screen */
{
设置左软件为:菜单,右软件为:电话簿。
设置数字键以及* #键响应函数:HandleIdleScreenDigitEntry()
然后进入:IdleSetLRKey(); 主要是设置 左软件进入main menu,
右软件进入电话簿。
}
}
else //键盘锁上
{
设置左软件、右软件显示都是空。
设置左软件响应:EntryScrAfterPessingRSK()。
进入IdleSetLRKey();
}
}
然后进入自动键盘锁:
void IdleSetKeyPadLockFlag(void)
{
g_keylock_context.gKeyPadLockFlag = 1;
再次进入EntryIdleScreen();注意:此时键盘已经锁上。
清除所有的按键响应函数。
设置左软件响应:IdleRSKPressOnScreenSaver()。这个函数仍然要进入 EntryIdleScreen()
IdleSetStatusIcon(STATUS_ICON_KEYPAD_LOCK);
}
这个时候,键盘就锁上了。
除了左软件的响应是:EntryScrAfterPessingRSK(),其他按键的响应都为空。
按下左软件,进入:
EntryScrAfterPessingRSK()
{
注意:这个函数由于没有等级Entry函数,因此不会自动加入history中。
ShowCategory64Screen(),SHOW提示信息:按 * 解按鍵鎖
启动定时器:
StartTimer(KEYPADUNLOCKEDHELPMESSAGE_TIMER, KEYPADUNLOCK_TIMEOUT, GoBackHistory);
设置所有按键的响应:GoBackHistory()
设置*键响应:HandlePoundKeyForUnlock()
}
在2秒钟内按下*键,进入:
void HandlePoundKeyForUnlock(void)
{
停止定时器:StopTimer(KEYPADUNLOCKEDMESSAGE_TIMER);
g_keylock_context.gKeyPadLockFlag = 0;
EntryScrKeyPadUnlockMessage(); //提示信息:解除键盘锁!设置定时器:
StartTimer(KEYPADUNLOCKEDMESSAGE_TIMER, KEYPAD_UNLOCK_SCR_TIMEOUT, GoBackHistory);
EntryIdleScreen()。
IdleResetStatusIcon(STATUS_ICON_KEYPAD_LOCK); //隐藏标志
}
问题:
1.没有找到是从何处进入mmi_pwron_show_image_callback()的,也就是从哪里开始SHOW开机动画的??
2.在InitializeAll()中调用PopulateResData()加载资源的时候发现是调用了代码很少的那个,为什么有两个此函数?? 资源真正在哪里被加载?
猜想:
1.记得之前看过一文档介绍:在执行ResGenerator_HW.bat的时候,生成mmi_resource.lib。那么是不是在手机上直接就使用了这个文件来装载资源?
进入MAIN MENU:
void EntryMainMenuFromIdleScreen(void)
{
#ifdef __MMI_KEYPAD_LOCK_PATTERN_2__
g_idle_context.ToMainMenuScrFromIdleApp = 1;
#endif
goto_main_menu();
}
注意:
宏__MMI_MAINMENU_STYLE_CHANGE_EN__打开了
宏__MMI_BI_DEGREE_MAIN_MENU_STYLE__关闭
宏__MMI_WGUI_MINI_TAB_BAR__关闭
宏__MMI_DEFAULT_MAIN_MENU_HIGHLIGHT_CENTER__关闭
宏__MMI_MAINMENU_MATRIX_SUPPORT__打开
宏__MMI_UI_DALMATIAN_SOFTKEYS__关闭
宏__MMI_BI_DEGREE_MAIN_MENU_STYLE__关闭
宏__MMI_KEYPAD_LOCK_PATTERN_2__打开
宏__MMI_DISABLE_KEYPAD_LOCK__关闭
void goto_main_menu(void)
{
mmi_phb_reset_scr_id();
//reset:g_phb_cntx.start_scr_id = g_phb_cntx.end_scr_id = 0;
获取ShowCategoryXXXScreen()中需要的属性
设置高亮ITEM的处理函数:
RegisterHighlightHandler(main_menu_custom_highlight_handler); //这个处理 函数首先调用ExecuteCurrHiliteHandler_Ext()设置当前高亮 MENU的左、右软件的响应函数(就是函数: initalize_main_menu_application()中设置的hilite handler),然 后再改变显示的Title以及变量MMI_title_icon和 main_menu_index。
九宫图排列索引是: 0 1 2
3 4 5
6 7 8
ShowCategory14Screen()
手动键盘锁:
if (g_idle_context.ToMainMenuScrFromIdleApp == 1)
{
StartTimer(KEYPAD_LOCK_TIMER, KEYPAD_LOCK_TIMEOUT, IdleHandleKeypadLockProcess);
SetKeyHandler(IdleHandlePoundKeyForKeypadLock, KEY_STAR, KEY_EVENT_UP);
}
register_menu_shortcut_selected(main_menu_shortcut_executer);
//设置menu_shortcut_item_selected这个函数指针。
SetRightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);
}
函数main_menu_shortcut_executer(S32 index)是用户在MAIN MENU中直接按下数字键时的响应函数,也就是shortcut操作
void main_menu_shortcut_executer(S32 index)
{
execute_left_softkey_function(KEY_EVENT_UP); 直接执行左软件的按下操 作。最后执行的是:在初始化时设置的MENU的hilite函数。
}
手动锁键盘操作:
这个函数是在进入main menu之后,定时器溢出时调用,主要就是停止定时器,并清除一些变量,禁止进入锁键盘。也就是说:如果想锁键盘,必须在定时器溢出之前按下*键。
void IdleHandleKeypadLockProcess(void)
{
StopTimer(KEYPAD_LOCK_TIMER);
g_idle_context.RskPressedFromIdleApp = 0;
g_idle_context.ToMainMenuScrFromIdleApp = 0;
}
*键的处理函数:
void IdleHandlePoundKeyForKeypadLock(void)
{
如果已经超时了,那么就直接返回,不能进入锁键盘了
if (g_idle_context.ToMainMenuScrFromIdleApp == 0)
{
return;
}
g_idle_context.ToMainMenuScrFromIdleApp = 0;
StopTimer(KEYPAD_LOCK_TIMER); 停止定时器
g_keylock_context.gKeyPadLockFlag = 1; 键盘锁标志
IdleSetStatusIcon(STATUS_ICON_KEYPAD_LOCK);
EntryIdleScreen()。
}
锁键盘与解锁时,按键响应函数的总结:
解锁:
进入:EntryIdleScreen(),此时g_keylock_context.gKeyPadLockFlag =0,进入:mmi_idle_entry_idle_screen()。在这个函数中,设置了数字键,*,#的处理函数为:HandleIdleScreenDigitEntry()。然后调用IdleSetLRKey()设置左软件、右软件的处理函数:
SetLeftSoftkeyFunction(EntryMainMenuFromIdleScreen, KEY_EVENT_UP);
SetRightSoftkeyFunction(mmi_phb_idle_enter_phb_list, KEY_EVENT_UP);
然后,设置SEND键和方向键的处理函数。
手动锁键盘:
进入:EntryIdleScreen(),此时g_keylock_context.gKeyPadLockFlag =1,此时,只设置了左软件的响应:EntryScrAfterPessingRSK(),就是解锁。而对于其他的所有按键,在模拟器上没有找到设置为NUL的代码。只有这样的一段代码:
#if defined(__MMI_KEYPAD_LOCK_PROMPT_TEXT__)
SetGroupKeyHandler(
EntryScrKeyPadLockOnPessingAnyKey, //提示如何解锁
(PU16) PresentAllKeys,
(U8) TOTAL_KEYS,
(U16) KEY_EVENT_DOWN);
#endif
如果是自动锁键盘,那么在定时器溢出后,会调用:IdleSetKeyPadLockFlag()。这个函数中,就调用SetGroupKeyHandler(NULL, (PU16) PresentAllKeys, (U8) TOTAL_KEYS, KEY_EVENT_DOWN)设置所有按键响应为NULL,然后再设置左软件:IdleRSKPressOnScreenSaver()(这个函数还是进入EntryIdleScreen,然后设置左软件响应为EntryScrAfterPessingRSK())。
问题:为什么手动锁键盘时,没有SetGroupKeyHandler()这个函数呢??
是不是MTK在底层自动设置成NULL了??
本文为结合项目学习MTK的笔记,如有错误,请不吝赐教!谢谢