MTK6225开机过程-系统启动2(hardware)

来源:互联网 发布:svd推荐算法实现 java 编辑:程序博客网 时间:2024/06/08 11:52
 

以下是在手机上抓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);

              定时器溢出之后,GoBackHistory()就进入IDLE SCREEN。也就是上面的         函数: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);

       DisplayIdleScreen();           //这个函数会调用: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的笔记,如有错误,请不吝赐教!谢谢

 

原创粉丝点击