配色: 字号:
MTK MMI启动过程分析
2012-08-06 | 阅:  转:  |  分享 
  
MTKMMI启动过程分析

分类:MTK学习资料2012-04-0814:5236人阅读评论(0)收藏举报

在取得MTK的06B版本代码后,开始进行了艰苦的代码分析工作,我的工作是把一个手机的MTK的代码移植到另外一个手机上,在改了custom部分代码后,系统虽然可以正常启动,但LCD是白屏,没有任何界面显示。

由于没有仿真器可以使用,只能通过阅读代码和调试进行,尤其是和硬件有关的信息也需要更多功夫去理解。略去硬件平台的定制代码,因为那是custom里所定义的一些驱动初始化的工作,最复杂的部分还是在plutommi这个代码目录里。

MMI启动过程:

系统在TaskInit.c里创建了MMI的主要任务表:

constosl_task_create_infotask_create_tbl[TOTAL_TASKS]={{"DUM1TASK","DUM1Q",127,128,0,Dummy_task},{"DUM2TASK","DUM2Q",127,128,MAX_PRT_NODES,Dummy_task},{"MMITASK","MMIQ",127,4096,MAX_PRT_NODES,MMI_task},{"DUM3TASK","DUM3Q",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,嘿嘿,又绕回来到这个模块来了。这个函数实现了很多平台初始化的工作,我加了函数让系统直接进入工程模式(可能有其它更好的办法。)

接着是应用程序初始化:

在BootupApp过程里,首先是做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.SimDetectionmodule:plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->EntryScrEnterPhoneLock(),phonelock屏幕入口plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->SimPasswdReqResponse(voidinMsg),密码请求响应被调用plutommi\mmi\MiscFramework\MiscFrameworkSrc\SimDetection.c->mmi_ready_to_idle_screen_ind_hdlr(voidmsg),即将进入idlescreen时调用处理。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。然后就一直在这个循环中读消息。

第二步:PowerOn

读取到消息:MMI_EQ_POWER_ON_IND

caseMMI_EQ_POWER_ON_IND:

gdi_init();

switch(p->poweron_mode)//判断poweron的模式

{

casePOWER_ON_KEYPAD://用户按下开机键

OslMemoryStart(TRUE);

g_charbat_context.PowerOnCharger=0;//不是因为充电而开机的

InitializeAll();//初始化,重点学习

OslDumpDataInFile();//这个函数不能进入,直接跳过

InitNvramData();//加载保存在NVRAM中的设置的参数

mmi_pwron_entry_animation_screen();//开机动画

break;

casecasePOWER_ON_PRECHARGE:

casePOWER_ON_CHARGER_IN:

g_pwr_context.PowerOnMode=p->poweron_mode;

InitializeChargingScr();

break;

casePOWER_ON_ALARM://定时开机

AlmInitRTCPwron();

break;

casePOWER_ON_EXCEPTION://ForabnormalresetwheninvalidSIM

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();//Initializeeventhandlers

InitProcessKeyEvent();//Initializekeyprocess

InitHistory();//Initializehistory

}

InitHardwareEvents();//设置一些硬件事件的protocolhandler。

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的图像是空的,即在显示时,即使设置了显示的imageID,但还是没有图片。只有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的childMENU。红色的两个:

MAIN_MENU_MESSAGES_MENUID(信息)

MAIN_MENU_PROFILES_MENUID(情景模式)

没有装载其childMENU。

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

(4)PopulateIdleMenuRes();加载IDLEapplication使用的资源

{

PopulateStatusIconResources();加载IDLE界面的image

PopulateCommonCategoryResources();

PopulateThemeResources();

}

(5)PopulatePbResData();Populatephonebookresourcedata

加载【电话簿】中的每个EMNU的childmenu,stirng,image。

(6)PopulateMainDemoRes();PopulatingMainDemoResources

(7)populateSettingMenu();PopulatingSettingResources

加载【功能设置】中的每个childmenu的各种资源。包括:话机设置,通话设置,网络设置,GPRS连接设置,安全设置,恢复出厂值,音效,蓝牙。

{

加载[话机设置]的childmenu,string和image,以及下一层…的childmenu,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();PopulatingFun&GamesResources

(9)PopulateSimDetectionMenuRes();PopulatingSIMDetectResources

(10)PopulateChgrPwrOnScrRes();PopulatingChargerPowerOn

(11)PopulateCommonScreensResData();PopulatingCommonScreen

(12)PopulateEMSObjectResources();PopulatingEMSobjectResources

(13)PopulateCmResData();PopulatingCMResources

加载通话过程中使用的各种资源

首先加载来电时,各种状态下的资源:MENU,STIRNG,IMAGE

然后调用PopulateCmOutResData();加载呼出电话时各种资源

(14)PopulateQuickAccessData();PopulatingQuickAccessResources

(15)PopulateInputMethodRes();PopulatingInputMethodResources

(16)PopulateprofileMenu();PopulatingProfilesResources

。。。。。。

}//加载资源结束

PopulateResGetBaseIDTable();

PowerAndEndKeyHandler();//setspowerkey&endkeyhandlers

//开始初始化

InitCallManagement();//InitializetheCallManagementApplication

CallmanahementneedstobeinitializedherebecauseofSOScallsconcept

{

InitIncomingCall();初始来电时protocolevent以及各MENU的响应函数

InitOutGoingCall();初始呼出时protocolevent以及个MENU的响应函数

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

ResetGlobalValues();初始化全局变量

}

initialize_UI_demo();

InitNetWorkBootUpEventsCallBack();

initializesallnetworkrelatedprotocolhandlers

InitProfileApp();

InitSimDetection();

InitService();

InitCPHS();

InitHWBacklightTest();

InitCallLogs();

ATHandlerInit();

。。。。。。很多根据宏来控制的初始化函数

}

AllowstheapplicationstoreadtheirNVRAMdata

voidInitNvramData(void)

{

InitDownloadNVRAM();

PmgInitExtMelodyStruct();;

PhnsetReadWallpaper();//读取墙纸信息,并设置为当前墙纸

PhnsetReadGPIOSetting();//

PhnsetReadPwrOnOffDisp();

PhnsetInitSetTimeNDateNvram();

PhnsetReadNvramScrSvrSettings();

InitNvramCallerId();//从NVRAM中读取callerID,并发送到L4层。

LoadIPNumbers();//读取IP号码的设置以及号码

LoadBlackListNum();//读取黑名单的设置以及号码

initnvramprofapp();//InitializeNVRAMforProfile

InitSettingNVRAM();//InitialiseSettings

ReadValueCityNVRAM();

InitAlarmFrameWork();

SetModeSpeechVolume();

InitServiceWapSetup();

InitDataAccountNVRAM();

wap_bookmark_nvram_init();

}

开始SHOW开机动画

voidmmi_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()orShowCategory313Screen()小屏幕

playRequestedTone(POWER_ON_TONE);播放开机声音

}

elseif(res_type==FMGR_GROUP_VIDEO)SHOW的是动画

{

//entryvideoplayscreen

ShowCategory224Screen(mmi_pwron_play_video_callback);

}

elseif(res_type==FMGR_GROUP_SWFLASH)//不知道这是什么

{

ShowCategory229Screen(mmi_pwron_show_image_callback);

}

(4)显示LEDpattern

StartLEDPatternPowerOn();

}

voidInitAllApplications(void)

{

gInitAllAppFlag=1;

gInsertSimAppFlag=0;

//设置SOS菜单MITEM116_PBOOK_SOS_NUMBER的hilite函数为:mmi_phb_highlight_sos_list

mmi_phb_sos_list_init();

//设置mainmenu中所有菜单的highlighthandler

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();//initfunandgameapplcations

mmi_phb_init();//Initializephonebookapplication

InitCallCost();

InitCallHistory();

。。。。。。

}



献花(0)
+1
(本文系小云蔡首藏)