从而实现客户化的定制。通过给make指定ARM版的核心Makefile文件Gsm2.mak,开始了ARM版的构建过程。
Gsm2.mak文件中包含了Option.mak这个配置用的Makefile文件,另外还包含了一些以.tmp和.bld为后缀的由perl脚本make2.pl生成的临时配置文件。这些临时配置文件主要是一些action如clean、remake等所需的变量设置,及客户化和版本号等的一些信息。Gsm2.mak控制了new、update、remake等动作的过程。具体分别如下所示。
new:cleanallcmmgenmmi_feature_checkasngencodegenasnregen\\ operator_check_liteupdate
update:cleanlogcleanbinmcddll_updatecodegenresgencksysdrvremake remake:cleanlogcleanbingenvernolibs$(BIN_FILE)done 上面的构建过程的几个步骤中,最重要的两个步骤是libs、$(BIN_FILE)。libs调用ARM版的编译器和连接器将各个模块目录下的C文件编译链接为独立的库。$(BIN_FILE)这个步骤将各个模块编译链接得到的库和mtk_lib目录下的库一起链接起来得到一个映像文件,然后使用ADS的工具fromelf将映像文件生成以变量BIN_FILE命名的二进制文件,该文件可以下载到硬件板上运行。 libs这个步骤如下所示。
libs:cleanlibstartbuildlibs$(COMPLIBLIST)
libs中真正进行编译链接的步骤是$(COMPLIBLIST),要生成的库由变量COMPLIBLIST列出,在ARM版中,变量COMPLIBLIST从变量COMPLIST得到。变量COMPLIST是在Option.mak及其包含的Makefile文件中赋值的。因有很多库需要编译链接,变量COMPLIBLIST展开后包含多个步骤,而这些步骤都是重复不变的,因此在定义步骤$(COMPLIBLIST)的构建过程时使用%.lib代替。%.lib这个步骤先清除了之前的一些依赖关系文件,将一些变量的设置写入~compbld.tmp这个临时文件中,然后给make指定Makefile文件comp.mak,完成库的编译和链接,如下所示。 %.lib: … @if/I%OS%EQUWINDOWS_NT\\ (if/I$(BM_NEW)EQUTRUE\\ (tools\\make.exe-fmake\\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\\$*.log2>&1) \\ else\\ (tools\\make.exe-fmake\\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\\$*.log2>&1)\\ )\\ else\\ (if/I$(BM_NEW)EQUTRUE\\ (tools\\make.exe-fmake\\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\\$*.log)\\ else\\
(tools\\make.exe-fmake\\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\\$*.log)\\ )
上面的命令语句中,参数-k是指有错误也要继续编译,-r和-R是指没有GNUmake的默认规则和变量。COMPONENT=$*把当前要生成的库赋给变量COMPONENT。要注意%.lib匹配了所有要生成的库,但这个步骤一次只生成一个模块的库,这个步骤对所有匹配到的库都会执行一次。
comp.mak这个Makefile文件控制了模块的编译链接过程。在这个文件中,首先将当前模块要生成的库(由变量COMPONENT传入)设置给了变量TARGLIB。之后从
库的编译链接由update_lib步骤完成,这个步骤直接依赖了$(TARGLIB)。目标
$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj:%.cpp等规则编译得到的中间目标文件链接得到的。其主要过程如下所示。 $(TARGLIB): ... @ifexist$(FIXPATH)\\$(CUS_MTK_LIB)\\$(COMPONENT).lib\\ (copy/z$(FIXPATH)\\$(CUS_MTK_LIB)\\$(COMPONENT).lib$(subst/,\\,$(TARGLIB)))&\\ ($(LIB)-r$(TARGLIB)$(COMPOBJS_DIR)/*.obj)\\ else\\ ($(LIB)-create$(TARGLIB)$(COMPOBJS_DIR)/*.obj) ...
Option.mak是整个工程构建过程中的总控配置文件,在这个文件中还包含了
MTK手机软件系统的大部分配置都已经确定,基本上不需要再改变,一般是MTK发布新的版本时会作些改变,客户不大需要关心。最主要的配置文件是Option.mak,而客户化定制需要需要修改的主要是
Option.mak文件中设置了工程构建时用到的编译器、链接器、库管理、二进制文件生成等工具的路径和可执行程序名,设置了基本的编译链接参数,指定CPU类型(ARM7EJ-S),
确定最终使用的库列表(COMPLIST)。 一个项目是由工程中的多个基本库、第三方库和由源代码新编译链接的库组成的,最终这些库链接到一起得到一个完整的可执行映像文件。由哪些新编译链接的库来组成一个项目是由四个关键的变量决定,其中一个是前面提到的COMPLIST,另外三个分别是CUS_REL_SRC_COMP、CUS_REL_PAR_SRC_COMP、CUS_REL_MTK_COMP。这个几个变量的关系如下所示。
#************************************************************************* #CustomReleaseComponentConfiguration
#************************************************************************* #Besurethefollowing:
#1.CUS_REL_SRC_COMP+CUS_REL_PAR_SRC_COMP=COMPLIST(CUSTOM_RELEASE=True)
#2.CUS_REL_SRC_COMP+CUS_REL_PAR_SRC_COMP+CUS_REL_MTK_COMP=COMPLIST(CUSTOM_RELEASE=False)
COMPLIST确定了该项目最终是由哪些库(组件)组成的。MTK的内部版本构建时,则包括CUS_REL_SRC_COMP、CUS_REL_PAR_SRC_COMP、CUS_REL_MTK_COMP这些库。客户版本构建时,则只包括CUS_REL_SRC_COMP、
CUS_REL_PAR_SRC_COMP这些库。手机设计公司构建的版本都是客户版本,因此只要改变CUS_REL_SRC_COMP、CUS_REL_PAR_SRC_COMP这两个变量的值即可以定制自己的项目了。
MTK_LIBS确定了该项目最终包含了哪些MTK提供的基本库。
COMPOBJS确定了该项目最终包含了哪些第三方提供的不带源代码的库。变量CUS_RES_OBJ_LIST用于把这些第三方库随项目发布。
Option.mak和REL_CR_MMI_
J2ME_SUPPORT =NONE #J2MEsupport:NONE,MTK_J2ME,J2ME_LIB,\\ MTK_J2MEHI,J2MEHI_LIB,MTK_DUMMYVM DRM_SUPPORT=NONE#DRMVENDOR:NONE,MTK,BSCI DRM_VERSION=NONE#DRMVERSION:NONE,V01,V02,ALL AMRWB_DECODE =TRUE #TRUE/FALSE AMRWB_ENCODE =FALSE #TRUE/FALSE #MT6219DSPcannotsupportAMRWB_ENCODEwhenGPRSconnection JPG_DECODE =JPG_HW #NONE,JPG_HW,JPG_SW JPG_ENCODE =JPG_HW #NONE,JPG_HW,JPG_SW GIF_DECODE =TRUE #TRUE/FALSE
PNG_DECODE =NONE #NONE,PNG_HW,PNG_SW DAF_DECODE =TRUE #TRUE/FALSE MJPG_SUPPORT =FALSE #TRUE/FALSE MP4_CODEC =TRUE #TRUE/FALSE AAC_DECODE =TRUE #TRUE/FALSE ISP_SUPPORT =TRUE #TRUE/FALSE CMOS_SENSOR =OV7660 #OV9640,PAS105,PAS302,NONE,MT9D011,\\ MT9M111,OV9650 四.增加模块的配置实例
若我们需要加入zlib这么一个模块(zlib包含了很多程序都用到的压缩和解压函数),我们可以按如下步骤进行。
1.把zlib的源代码包拷贝到你的MTK软件系统根目录下,这样所有的zlib代码都在zlib目录或zlib-1.2.3目录下(用哪个目录名由你的喜好来确定),在此为简单起见就放在zlib目录。
2.在make目录下新增一个zlib的目录(最好和根目录下的目录名一样),增加四个文件,分别是zlib.def、zlib.inc、zlib.lis、zlib.pth。zlib.def文件只要加上APCS_INTWORK就可以了,其他三个文件中加上源文件及其目录、头文件目录即可。 3.在REL_CR_MMI_
4.把这个工程remake一下,若没有错误,zlib模块就成功加上去了。其他模块就可以调用zlib提供的压缩和解压缩函数了。
若我们需要加入一个没有源代码的第三方库,譬如加入wifi,我们可以按如下步骤进行。 1.把wifi的所有第三方库文件拷贝到一个新建的wifi目录下。 2.在Option.mak这个文件的合适位置加上如下语句。 ifeq($(strip$(WIFI_SUPPORT)),WIFI_LIB) COMPOBJS+=wifi\\sslplus.lib CUS_REL_OBJ_LIST+=wifi\\sslplus.lib COMPOBJS+=wifi\\sb.lib CUS_REL_OBJ_LIST+=wifi\\sb.lib endif
3.把这个工程remake一下,若没有错误,wifi库就成功加上去了。其他模块就可以调用wifi提供的功能了。
MTK6225开机过程-系统启动
以下开机过程都是在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,