以下开机过程都是在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();
。。。。。。
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/toonny1985/archive/2009/11/27/4887419.aspx