MTK6225开机过程-系统启动

来源:互联网 发布:羽泉大中国知乎 编辑:程序博客网 时间:2024/06/05 17:13

以下开机过程都是在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/toonny1985/archive/2009/11/27/4887419.aspx