MTK MMI啓動過程分析

在取得MTK的06B版本代碼後,開始進行了艱苦的代碼分析工作,我的工作是把一個手機的MTK的代碼移植到另外一個手機上,在改了custom部分代碼後,系統雖然可以正常啓動,但LCD是白屏,沒有任何界面顯示。

由於沒有仿真器可以使用,只能通過閱讀代碼和調試進行,尤其是和硬件有關的信息也需要更多功夫去理解。略去硬件平臺的定製代碼,因爲那是custom裏所定義的一些驅動初始化的工作,最複雜的部分還是在plutommi這個代碼目錄裏。

MMI啓動過程:

系統在TaskInit.c裏創建了MMI的主要任務表:

const osl_task_create_info task_create_tbl[TOTAL_TASKS] = { {"DUM1 TASK", "DUM1 Q", 127, 128, 0, Dummy_task}, {"DUM2 TASK", "DUM2 Q", 127, 128, MAX_PRT_NODES, Dummy_task}, {"MMI TASK", "MMI Q", 127, 4096, MAX_PRT_NODES, MMI_task}, {"DUM3 TASK", "DUM3 Q", 127, 128, 0, Dummy_task}, };

接着發生瞭如下的函數調用過程:

1. plutommi\mmi\Framework\Tasks\TasksSrc\MMITask.c->MMI_task,整個界面是由一個任務函數啓動,MMI_Task函數不斷介紹ps層的消息,在收到MSG_ID_MMI_EQ_POWER_ON_IND消息後,如果是鍵盤開機會調用mmi_bootup_entry_disk_check(),這個調用最終會做一系列的程序初始化工作。。

2. plutommi\mmi\MiscFramework\MiscFrameworkSrc\BootupApp.c->mmi_bootup_entry_disk_check,在系統上電後執行這個函數。

3. plutommi\mmi\MiscFramework\MiscFrameworkSrc\BootupApp.c ->mmi_frm_power_on_init_procedure

4. plutommi\mmi\Framework\Tasks\TasksSrc\MMITask.c->InitializeAll,嘿嘿,又繞回來到這個模塊來了。這個函數實現了很多平臺初始化的工作,我加了函數讓系統直接進入工程模式(可能有其它更好的辦法。)

接着是應用程序初始化:

在Bootup App過程裏,首先是做disk的檢查,然後接着開始檢查飛行模式,緊接着是啓動動畫顯示,接着發生如下過程(可以在BootupApp.c從上看到下): 1.plutommi\mmi\MiscFramework\MiscFrameworkSrc\BootupApp.c->mmi_bootup_entry_nand_check_query()

2. plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->PowerOnBatteryIndicationComplete()

3. plutommi\mmi\MiscFramework\MiscFrameworkSrc\BootupApp.c->mmi_bootup_exit_nand_check_query()

4. plutommi\mmi\MiscFramework\MiscFrameworkSrc\BootupApp.c->mmi_bootup_entry_security_check()

5. plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->PowerOnBatteryIndicationCompletePhase2()

6. SimDetection module: plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->EntryScrEnterPhoneLock(), phone lock 屏幕入口 plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->SimPasswdReqResponse(void *inMsg) ,密碼請求響應被調用 plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->mmi_ready_to_idle_screen_ind_hdlr(void *msg),即將進入idle screen時調用處理。 plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->mmi_bootup_entry_security_check(),啓動時的安全檢查。

7. plutommi\mmi\IdleScreen\IdleScreenSrc\MiscFunctions.c->goto_opening_screen()

8. plutommi\mmi\Framework\Tasks\TasksSrc\MMITask.c->InitAllApplications()

以下開機過程都是在simulator上跑時得出的結論

第一步:啓動simulator的時候,直接進入:MMI_task( )

1. iacMemInit();

2.進入一個while(1)循環。以後的過程都是通過消息機制,即:一直在這個循環中讀取消息,然後做相應的處理。

第一次進入while(1)之後,OslReceiveMsgExtQ(qid, &Message)就讀取到一個消息:PRT_MMI_TIMER_IND。然後就一直在這個循環中讀消息。

第二步:Power On

讀取到消息:MMI_EQ_POWER_ON_IND

case MMI_EQ_POWER_ON_IND:

gdi_init();

switch (p->poweron_mode) //判斷power on的模式

{

case POWER_ON_KEYPAD: //用戶按下開機鍵

OslMemoryStart(TRUE);

g_charbat_context.PowerOnCharger = 0; //不是因爲充電而開機的

InitializeAll(); //初始化,重點學習

OslDumpDataInFile(); //這個函數不能進入,直接跳過

InitNvramData(); //加載保存在NVRAM中的設置的參數

mmi_pwron_entry_animation_screen(); //開機動畫

break;

case case POWER_ON_PRECHARGE:

case POWER_ON_CHARGER_IN:

g_pwr_context.PowerOnMode = p->poweron_mode;

InitializeChargingScr();

break;

case POWER_ON_ALARM: //定時開機

AlmInitRTCPwron();

break;

case POWER_ON_EXCEPTION: //For abnormal reset when invalid SIM

OslMemoryStart(TRUE);

SetAbnormalReset();

InitializeAll();

OslDumpDataInFile();

ClearInputEventHandler(MMI_DEVICE_ALL);

ClearKeyHandler(KEY_END, KEY_LONG_PRESS);

InitNvramData();

AlmReInitialize();

InitAllApplications();

mmi_pwron_exception_check_display();

break;

}

執行過開機之後,就不會進入這裏了。

第三步、在模擬器上隨便按鍵,就進入defalt這裏:

default:

ProtocolEventHandler(

(U16) Message.oslMsgId,

(void*)Message.oslDataPtr,

(int)Message.oslSrcId,

(void*)Message.oslPeerBuffPtr);

break;

以上是總體的開機過程。下面學習藍色部分具體內容:

InitializeAll()

{

InitUnicodeSupport(); //設置使用的編碼函數

gdi_init(); //圖形庫初始

mdi_audio_init(); //音頻初始化

jdi_audio_init();

InitProtocolEvents(); //初始化協議事件(函數是空的)

InitFramework(); //初始化事件的處理函數,以及histroy等。

{

InitEvents(); //Initialize event handlers

InitProcessKeyEvent(); //Initialize keyprocess

InitHistory(); //Initialize history

}

InitHardwareEvents(); //設置一些硬件事件的protocol handler。

InitTime();

InitMMI_App();

setup_UI_wrappers(); //初始化圖形界面相關的參數

PopulateResData(); //裝載資源包括:menu, string, image

{

增加applications

ADD_APPLICATION(APP_MAINMNNU, APP_IDLEAPP, APP_BOOTUP, APP_SIMTOOLKIT, APP_GLOBALDEFS, APP_CHARGER, APP_UIFRAMEWORK, APP_HONEBOOK, APP_SHORTCUTS, APP_SERVICES, APP_ORGANIZER, APP_MESSAGES, APP_CHAT, APP_SETTINGS, APP_CALLMANAGEMENT, APP_DEMOAPP, APP_CLLHISTORY, APP_CALLSETUP, APP_PROFILES, APP_NEWORKSETUP, APP_DATAACCOUNT, APP_PHONESETUP, APP_TODOLIST, APP_INPUTMETHOD。。。。。。);

裝載每一個application的資源(MUNE, IMAGE, STRING)

(1)PopulateNFBProgressImg(); //0—9及其他的image

(2)PopulateGlobalData();

裝載全局資源:主要就是加載字串 ADD_APPLICATION_STRING2和加載圖像 ADD_APPLICATION_IMAGE2。注意:有很多image的圖像是 空的,即在顯示時,即使設置了顯示的image ID,但還是沒有圖 片。只有STRING。

(3)PopulateMainMenuRes();

在代碼中有3個此函數,利用宏的控制以達到不同的應用。 GW606進入的是中間的這個函數,即:宏 __MMI_BI_DEGREE_MAIN_MENU_STYLE__關閉,宏 __MMI_VERSION_2__打開。

加載左軟件開始進入的九宮圖MENU。 ADD_APPLICATION_MENUITEM((

IDLE_SCREEN_MENU_ID,0,9,

MAIN_MENU_PHONEBOOK_MENUID,

MAIN_MENU_MESSAGES_MENUID,

MAIN_MENU_CALL_HISTORY,

MAIN_MENU_SETTINGS_MENUID,

MAIN_MENU_MULTIMEDIA_MENUID,

MAIN_MENU_FILE_MNGR_MENUID,

MAIN_MENU_PROFILES_MENUID,

MAIN_MENU_EXTRA_MENUID,

MAIN_MENU_SERVICES_MENUID,

0,INSERTABLE,

MATRIX_MENU

MAIN_MENU_MENU_TEXT,

MAIN_MENU_PHONEBOOK_ICON));

裝載電話簿的MENU(SIM卡有效)

ADD_APPLICATION_MENUITEM((

MAIN_MENU_PHONEBOOK_MENUID。。。

裝載電話簿的MENU(SIM卡無效)

ADD_APPLICATION_MENUITEM((

MAIN_MENU_PHONEBOOK_NO_SIM_MENUID。。。

裝載通話記錄的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_CALL_HISTORY。。。

裝載功能設置的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_SETTINGS_MENUID。。。

裝載沒有SIM卡時,電話設置的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_SETTINGS_NO_SIM_MENUID,

MENU_SIM_OPTION_ID,

。。。

裝載多媒體娛樂的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_MULTIMEDIA_MENUID

裝載文件管理的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_FILE_MNGR_MENUID。。。

裝載網絡服務的MENU

ADD_APPLICATION_MENUITEM2((

MAIN_MENU_SERVICES_MENUID。。。

裝載工具箱的MENU

ADD_APPLICATION_MENUITEM((

MAIN_MENU_EXTRA_MENUID。。。

到這裏,就裝載了九宮圖的MENU,以及其其大部分MENU的child MENU。紅色的兩個:

MAIN_MENU_MESSAGES_MENUID (信息)

MAIN_MENU_PROFILES_MENUID (情景模式)

沒有裝載其child MENU。

加載以上MENU中需要使用的STRING和IMAGE。

(4)PopulateIdleMenuRes();加載IDLE application使用的資源

{

PopulateStatusIconResources(); 加載IDLE界面的image

PopulateCommonCategoryResources();

PopulateThemeResources();

}

(5)PopulatePbResData (); Populate phone book resource data

加載【電話簿】中的每個EMNU的child menu,stirng,image。

(6)PopulateMainDemoRes(); Populating Main Demo Resources

(7)populateSettingMenu(); Populating Setting Resources

加載【功能設置】中的每個child menu的各種資源。包括:話機設置, 通話設置,網絡設置,GPRS連接設置,安全設置,恢復出廠值,音效, 藍牙。

{

加載[話機設置]的child menu,string和image,以及下一層…的 child menu,stirng,image。

ADD_APPLICATION_MENUITEM((

MENU9102_INITIAL_SETUP。。。

PopulateNetworkSetupResData(); //加載【網絡設置】資源

populateManageCalls(); //加載【通話設置】資源

PopulatePhoneSetupResData(); //剛進入populateSettingMenu() 的時候,加載了【話機設置】中一部分的資源。更 多的資源是在這個函數中加載的。

populateSecuritySetup(); //加載【安全設置】資源

PopulateLanguageStrings();

#ifdef __MMI_SOUND_EFFECT__

PopulateSoundEffectResData();

#endif

#ifdef __FLIGHT_MODE_SUPPORT__

PopulateFlightModeResData();

PopulateConnectSetting();

#endif

}

(8)populateFunAndGamesMenu(); Populating Fun & Games Resources

(9)PopulateSimDetectionMenuRes(); Populating SIM Detect Resources

(10)PopulateChgrPwrOnScrRes(); Populating Charger Power On

(11)PopulateCommonScreensResData();Populating Common Screen

(12)PopulateEMSObjectResources(); Populating EMS object Resources

(13)PopulateCmResData(); Populating CM Resources

加載通話過程中使用的各種資源

首先加載來電時,各種狀態下的資源:MENU,STIRNG,IMAGE

然後調用PopulateCmOutResData();加載呼出電話時各種資源

(14)PopulateQuickAccessData(); Populating Quick Access Resources

(15)PopulateInputMethodRes(); Populating Input Method Resources

(16)PopulateprofileMenu(); Populating Profiles Resources

。。。。。。

}//加載資源結束

PopulateResGetBaseIDTable();

PowerAndEndKeyHandler(); //sets power key & end key handlers

//開始初始化

InitCallManagement(); // Initialize the Call Management Application

Call manahement needs to be initialized here because of SOS calls concept

{

InitIncomingCall(); 初始來電時protocol event以及各MENU的響應函數

InitOutGoingCall(); 初始呼出時protocol event以及個MENU的響應函數

memset (cm_p, 0, sizeof(cm_context_struct)); 主要的全局變量

ResetGlobalValues(); 初始化全局變量

}

initialize_UI_demo();

InitNetWorkBootUpEventsCallBack();

initializes all network related protocol handlers

InitProfileApp();

InitSimDetection();

InitService();

InitCPHS();

InitHWBacklightTest();

InitCallLogs();

ATHandlerInit();

。。。。。。很多根據宏來控制的初始化函數

}

Allows the applications to read their NVRAM data

void InitNvramData(void)

{

InitDownloadNVRAM();

PmgInitExtMelodyStruct (); ;

PhnsetReadWallpaper(); //讀取牆紙信息,並設置爲當前牆紙

PhnsetReadGPIOSetting(); //

PhnsetReadPwrOnOffDisp();

PhnsetInitSetTimeNDateNvram();

PhnsetReadNvramScrSvrSettings();

InitNvramCallerId(); //從NVRAM中讀取caller ID,併發送到L4層。

LoadIPNumbers(); //讀取IP號碼的設置以及號碼

LoadBlackListNum(); //讀取黑名單的設置以及號碼

initnvramprofapp(); // Initialize NVRAM for Profile

InitSettingNVRAM(); // Initialise Settings

ReadValueCityNVRAM();

InitAlarmFrameWork();

SetModeSpeechVolume();

InitServiceWapSetup();

InitDataAccountNVRAM();

wap_bookmark_nvram_init();

}

開始SHOW開機動畫

void mmi_pwron_entry_animation_screen(void)

{

(1) 判斷在SHOW開機動畫時是否已經被中斷,如果是,則進入: PowerOnBatteryIndicationComplete(),然後直接返回。

(2) 獲取要SHOW的動畫資源,類型

(3) 下面開始SHOW 畫面

if (res_type == FMGR_GROUP_IMAGE) SHOW的是圖片

{

ShowCategory166Screen(disp_id, 大屏幕

filename_ptr,

mmi_pwron_show_image_callback);

ShowCategory310Screen() or ShowCategory313Screen() 小屏幕

playRequestedTone(POWER_ON_TONE); 播放開機聲音

}

else if (res_type == FMGR_GROUP_VIDEO) SHOW的是動畫

{

// entry video play screen

ShowCategory224Screen(mmi_pwron_play_video_callback);

}

else if (res_type == FMGR_GROUP_SWFLASH) //不知道這是什麼

{

ShowCategory229Screen(mmi_pwron_show_image_callback);

}

(4)顯示LED pattern

StartLEDPatternPowerOn();

}

void InitAllApplications(void)

{

gInitAllAppFlag = 1;

gInsertSimAppFlag = 0;

//設置SOS菜單MITEM116_PBOOK_SOS_NUMBER的 hilite函數爲:mmi_phb_highlight_sos_list

mmi_phb_sos_list_init();

//設置main menu中所有菜單的highlight handler

initalize_main_menu_application();

SetHiliteHandler(MAIN_MENU_SETTINGS_MENUID, highlight_mainmenu_settings);

//初始化【功能設置】

InitSettingApp();

(1) 設置了【功能設置】中的【手機設置】中幾個MENU的響應函數。

(2) InitManageCalls(); //設置【通話設置】中每個MENU的響應函

InitCallerId(); //注意:在InitializeAll()中,曾經調用了函數

InitCallWaiting(); // InitCallManagement(),這個函數只設置了

InitCallForwarding(); //通話狀態時(呼入+呼出)的MENU的響

InitCallBarring(); //應函數。

InitLineSwitch();

InitGroupListApp();

InitIPNumber();

InitBlackList();

(4) InitNetworkSetupApp();

(5) InitSecuritySetupApp();

(6) PhnsetInitTimeNDate();

(7) InitFixedDialList();

(8) InitBarredDialList();

#ifdef __MMI_PREFER_INPUT_METHOD__

InitPreferedInputMethod();

#endif

mmi_fng_init_app(); //init fun and game applcations

mmi_phb_init(); //Initialize phone book application

InitCallCost();

InitCallHistory();

。。。。。。

}

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/menfolk_odon/archive/2010/01/17/5202149.aspx

http://blog.csdn.net/menfolk_odon

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章