一、    开发环境设立
以下表述中提到的相关压缩包或安装文件到华禹ftp服务器下载,部分文件要到群共享里面下,那里是最新的。
华禹ftp服务器:IP:220.113.15.15,帐号为study-bbs.com,密码为study-bbs0304
P1300的QQ群号: 15762255

P1300_Build_Guide.rar来自ftp服务器,“华禹/MTK相关部分”目录下
手机开发板C语言开发视频.rar来自ftp服务器,“华禹/MTK相关部分”目录下
huayu109_ads1.2.rar来自ftp服务器,“华禹/旋风001手机模块/1.工具类”目录下
huayu102_ADS12_Patch_Windows.rar同上
huayu106_perlzip.rar同上
huayu108_SourceInsight3.5.rar同上
huayu101_p1300软件使用工具及开发指南.rar同上
huayu201_P1300_V1.7_Release.rar文件来自群共享
huayu203_P1300_V1.7_Release_patch.rar文件来自群共享
FlashTool_v3.0844.00.rar文件来自群共享
1、开发主机要求及所需工具:
操作系统:Windows 2000, WinXP. 推荐Windows 2000 with SP2 or later.
编 译 器:ADS (Arm Developer Suite) v1.2 [Build 842]
Perl解析:ActivePerl, 推荐使用ActivePerl 5.6.1版本
仿真工具:MTK PC Simulator
跟踪工具:Catcher_L1 v3.10.01,从串口输出调试信息,只做普通UI应用的话,大致不会用到,用PC仿真工具就好了
烧录工具:FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00
其 他:PL2303_Driver_XP2K v204102,这是下载线用到的USB串口驱动,以前机器上装过PL2303驱动的就不必再装了?

2、开发环境建立过程:
新建一个目录,英文的好了,否则有些工具不认识中文路径,这里以E:/MTK_P1300为例说明,下面我用文字和图片简单说明下安装过程,更详细的安装过程可以看压缩文件“手机开发板C语言开发视频.rar”中的Flash文件“P1300_Build_Env.swf”。
1)        安装ADS1.2
解压文件huayu109_ads1.2.rar到某个目录,比如说解压到“E:/MTK_P1300”,解压完后运行“E:/MTK_P1300/ADS1.2/Setup.exe”,一路按下一步,最后安装License时选定文件“E:/MTK_P1300/ADS1.2/CRACK/ license.dat”,然后接着一路下一步直到安装完。安装完后删掉目录“E:/MTK_P1300/ADS1.2/”,节省磁盘空间。

2)        安装ADS补丁
运行huayu102_ADS12_Patch_Windows.rar压缩文件中的ADS_Patch_Window.exe,这是个自解压的压缩文件,选Unzip解压到上一步ADS的安装目录(缺省是C:/Program Files/ARM/ADSv1_2),解压过程中如果问到是否覆盖,全部选覆盖好了。

3)        安装脚本解释器Perl
直接运行压缩包huayu106_perlzip.rar里面扩展名为msi的安装文件,缺省安装就好,一路Next,呵呵。
上述几步完成后,编译环境基本建立,此时可以开一个dos窗(开始菜单->运行->输入cmd->确定)看一下,安装正常应该能顺利执行以下命令,如下图:

注意看版本号,应该是ADS1.2 [Build 842],不是的话可能没打补丁,或补丁打的位置不对,请看第2步ADS补丁部分的说明并重新打一次,直到版本号对为止,哈哈。

这是perl解释器的运行画面。
注1:上述安装过程会自动创建编译环境所需的环境变量,如果发现编译不正常了,可能是安装了其他编译工具导致冲突,这时建议查看下系统环境变量,把Perl和ADS的安装目录调到最前面,同时从path中去掉可能会产生冲突的编译工具链的路径(例如winavr),如下图所示(我是安装到D盘滴,缺省是C盘,不过我C盘几乎被我塞满了):


如果嫌改path麻烦(因为要用到其他编译工具链的时候还得改回去),还有一种办法,就是改make.bat批处理,具体见注4中相关说明。

注2:   如果安装ADS时,改变了默认安装路径,需要修改源码中的设置,源码目录树解压过程见模拟器编译环节相关介绍。
   make/Option.mak
   ----------------------------------
   ifeq ($(strip $(COMPILER)),ADS)
DIR_ARM        =   c:/progra~1/arm/adsv1_2   # 修改这里
DIR_ARM := $(strip $(DIR_ARM))
DIR_TOOL    =   $(DIR_ARM)/bin
DIR_ARMLIB     =   $(DIR_ARM)/lib
DIR_ARMINC     =   $(DIR_ARM)/include
   endif
------------------------------------------------
比如改装到D盘了,这里把红色部分“c”改成“d”就好了

4)        代码编辑环境
运行压缩文件huayu108_Source Insight3.5.rar中的安装文件安装即可。至于编辑器,这个看个人喜好了,不过Source Inside看代码蛮方便的。

5)        PC机模拟器
模拟器MTK PC Simulator是用来在PC上仿真调试用的,要安装VC6 SP6(同时要安装Uuicode 静态和动态库,没有装Unicode库的可以用“huayu103_MTK模拟器DLL补丁.zip”中的库,拷到系统目录“%windir%/system32”下即可)。我机器上的VC是有装Unicode库的,没装过Unicode库的如果在模拟器编译或运行中出现问题,建议重装下VC6,安装时勾选Unicode库,并打上相关补丁到SP6。
模拟器能模拟真机的大部分行为,这样能给调试带来很大便利,不需要每次改动都要烧录。
模拟器要从源码编译,解压压缩包“huayu201_P1300_V1.7_Release.rar”里面的文件“HUAYU_P1300_V1.7_Release.rar”到目录“E:/MTK_P1300”,此时会出现目录“E:/MTK_P1300/P1300_V1.7_Release”,这就是P1300的代码目录树了;接着打上最新的补丁,解压压缩包“huayu203_P1300_V1.7_Release_patch.rar”里面的压缩文件“HUAYU_P1300_V1.7_Release_patch.rar”到目录
“E:/MTK_P1300/P1300_V1.7_Release”,解压时选择全覆盖以替换被修改过的文件,打补丁之前对目录树里面的文件进行修改过的,需要手动再加上去。
   编译PC仿真器之前需要先把刚才上面得到的目录树build一次,开一个dos窗,盘符和目录转到代码目录树对应的盘符和目录,例如:
   E:
   cd E:/MTK_P1300/P1300_V1.7_Release/
make new
注3:第一次make的时候要用“make new”,make new的时间比较长(慢的机器搞不好要2小时以上),编译过程中间会出现一些文件找不到的信息,只要编译过程没意外终止,那些信息可以忽略。编译日志文件位置: build/NEOTEL25_06B/log/,要查看编译过程有啥问题就看这个目录下的文件了;生成的bin文件位置: build/NEOTEL25_06B/*.bin,下载烧录就是烧bin文件。
这里顺带介绍下build的命令格式:
make new                                              清除后重新编译整个项目
make resgen                                           重新生成资源
make remake                                            重新编译链接项目
make viewlog xxx                                  查看模块xxx的编译日志
make                                                        查看可以用make选项帮助信息
   注4:如果机器上装了其他gcc编译工具链(比如winavr之类)的话可能要手动改下Path,否则编译会出错,修改Path的方法见注1,也可以修改批处理文件“E:/MTK_P1300/P1300_V1.7_Release/make.bat”,在“perl make2.pl %*”之前加上下面两句:
set PERL5LIB=D:/perl/lib
set PATH=D:/perl/bin;d:/progra~1/arm/adsv1_2/bin;E:/MTK_P1300/P1300_V1.7_Release/tools;c:/windows/system32;c:/windows;c:/windows/system
注意,上面的路径是我机器上的,不是缺省安装路径,要根据自己的实际安装路径做修改。

   下面开始编译PC仿真器了,用VC6打开工程文件“E:/MTK_P1300/P1300_V1.7_Release/plutommi/mmi/ PC_Simulator.dsw”,然后开始编译,编译时间比较长,具体看机器配置了,这时又可以干点别的啥了,呵呵。
   因为仿真器工程涉及文件较多,编译费时,建议编译过程中电脑上少开窗口,特别是网络类的,如QQ,有时会发现开QQ后,编译过程中VC会挂死,呵呵。有可能是开QQ后防火墙过滤网络数据占用较多系统资源,如果发现VC编译特别慢或干脆挂死,可以重启动一下电脑,只开必要的窗口,然后开始编译。
如果编译过程中发现怪异的问题,如:
incomingstringiddef.h(120) : error C2059: syntax error : 'constant'   或者
error C2065: 'STR_CM_REDIAL' : undeclared identifier 之类
这个时侯你可能需要看一下你VC相关路径的设置顺序,如下图:

把VC原本的头文件路径调整到最前面,我刚开始编译的时候SDK的头文件在前面,编译总是通不过,改一下就好了,库也一样都调整下比较保险,呵呵。

6)        Tracer跟踪工具
解压文件P1300_Build_Guide.rar到E:/MTK_P1300,然后在文件管理器进入目录“E:/MTK_P1300/P1300_Build_Guide”,接着解压Catcher_L1_v3.10.01.zip到当前目录下的Catcher_L1_v3.10.01子目录,进入子目录Catcher_L1_v3.10.01,发送一个Catcher.exe的快捷方式到桌面。
在需要用到TRACE的时候,在代码中使用函数
void kal_prompt_trace(module_type mod_id, const kal_char *fmt,...); 打印需要查看的信息,使用Catcher跟踪查看。
             这个有点类似Linux的Kernel Debug工具,具体使用方法见文档《cather使用手册.doc》,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南.rar”里面找到。

7)        烧录工具
解压文件“E:/MTK_P1300/P1300_Build_Guide/ FlashTool_UI_exe_v3.1.05.zip”到当前目录,然后进入目录“E:/MTK_P1300/P1300_Build_Guide/FlashTool_v3.1.05”,发送一个Flash_tool.exe的快捷方式到桌面好了。
还有个下载工具FlashTool_v3.0844.00.rar,也是不用安装,解压后直接用的,据说烧录速度比上面那个快。
具体使用方法见文档《flash_tool_MT平台使用教程.doc》,这个文档可在压缩包“huayu101_p1300软件使用工具及开发指南.rar”里面找到。

8)        USB串口下载线驱动
运行压缩文件
“E:/MTK_P1300/P1300_Build_Guide/ PL2303_Driver_XP2K_v204102.zip”里面的可执行文件进行安装,一路下一步,这里不再赘述。

这是个基于MT6225芯片的开发环境,可以参照这个搞

nucleus实时操作系统MTK手机软件系统工程和配置简介
MTK使用了nucleus实时操作系统,在其上做了个内核抽象层的封装,以适应多种实时操作系统,如oscar、ThreadX、nucleus。整个软件系统包括nucleus操作系统、平台设备驱动、协议栈、文件系统、WGUI、MMI、J2ME等。在这里MMI部分几乎包括了操作系统内核、协议栈、文件系统之上的所有部分,其中WGUI也在其中。

    MTK的PC模拟版使用VC的编译器和链接器生成,ARM版使用ADS1.2的编译器和链接器生成。因为MTK的整个软件系统是一个很庞大而且复杂的工程,并且要支持多个MTK的产品系列和多家客户的客户化支持,使用集成开发环境(IDE)已经无法胜任,而且很难做到整个工程的自动构建和资源、代码的生成。所以MTK的软件系统使用了windows下的GNU开发工具链(MinGW)来进行工程的管理、配置和构建,MTK将MinGW放到了第三方工具中。另外还使用了perl脚本来解析用户输入的命令行参数,因此第三方工具中还包含了ActivePerl(windows下的perl解释器)。不过,整个软件系统并没有使用MinGW的全部工具,好象只使用了make这个工具,由几个Makefile控制了构建的过程,在编译和链接时根据最终生成PC模拟版还是ARM版而分别调用VC的编译器和链接器或ADS1.2的编译器和链接器。

接下来我们从具体的工程实践来看MTK的手机软件系统。

一. MTK手机软件系统的目录结构简介

    MTK手机软件系统的主要目录如下所示,因整个工程的目录树非常庞大,为简单起见和减小篇幅,去除了在工程结构中相对不重要的目录。

. 
|-- Fast_DL 
|-- ROM 
|-- adaptation 
|-- applib 
|-- bootloader 
|-- config 
|-- custom 
| |-- app 
| | `-- TOP_6227_BB 
| |-- common 
| |-- drv 
| | |-- LCD 
| | | `-- TOP_6227_LCM 
| | `-- image_sensor 
| |        `-- MT9D011 
|-- drv 
|-- fs 
|-- inc 
|-- init 
|-- interface 
|-- j2me 
|-- kal 
|-- make 
| |-- applib 
| | |-- applib.def 
| | |-- applib.inc 
| | |-- applib.lis 
| | `-- applib.pth 
| |-- bootloader 
| |-- config 
| |-- custom 
|-- media 
|-- mmi 
|-- modis 
|-- mtk_lib 
| `-- MT6227 
|        `-- S01 
|          `-- gprs 
|             |-- abm.lib 
|             |-- adaptation.lib 
|             |-- applib_inet.lib 
|-- nucleus 
|-- nvram 
|-- plutommi 
|-- tools



    Fast_DL是开发时下载二进制映像和资源等的相关文件的目录。ROM是固化在ROM(可能是Flash的只读区)中的相关代码和头文件的目录,在给客户的发布版中大都只有一些导出函数的头文件,其中似乎还有一个跳转表的东西ROMSA_FuncTable。

kal是上面所说的内核抽象层的相关文件的目录。nvram是存取NV中的内容的相关代码的目录。nucleus是nucleus实时操作系统的目录,在给客户的发布版中只有头文件。drv是驱动相关的代码的目录。fs是文件系统相关的目录,好像只支持fat格式的。tools是工程相关工具的目录,包括MinGW。interface是系统各层的接口的目录,还包含重要模块的接口,如bluetooth、WIFI。config是一些系统和任务(task)相关头文件的目录,感觉不像是配置相关的目录。inc是中断控制和寄存器地址相关头文件的目录。

modis是PC模拟版的相关目录,包括了虚拟的GSM网络、SIM卡等,以及模拟器需要的字符串、图片等资源,还有PC模拟版的库、VC的相关工程文件。

mmi是一个缺省的空的MMI应用的目录,其中只是创建了一个什么也不干的MMI任务(线程),处理下层发送上来的消息。plutommi是pluto组织(也可能是原本的mmi应用的代号)所写的整套MMI应用所在的目录,而实际上也就是我们需要定制和修改的MMI应用。其中的mmi目录中是pluto原本写好的mmi应用,mtkapp中是mtk后来所写的mmi应用,而Customer中是图片、字符串等资源的定制目录,大部分只是修改了字符串和图片、声音等的项目只要修改这个目录下的资源即可。

mtk_lib中是已经编译链接好的ARM版的库。因整个工程过于庞大,若完整的全新构建一次需要很长的时间。为了减少构建的时间,将一些已经完全调试稳定且基本不再改动的库和MTK不开放源代码的库放到这个目录,这样每次构建时只需要将这些库和其他编译好的库链接起来就可以了。这些库一般是ARM版的,若有thumb版的,则再增加一个和ARM版相对的thumb版的库,一般叫第二个库,如media_sec.lib就是thumb版的多媒体库。

custom是所有客户化项目的驱动程序及系统和MMI应用定制相关的文件的目录。如你的手机主板的RAM、FLASH等存储器的尺寸和地址空间有改动,MMI应用的特性有不同,蓝牙、WAP的配置有变化,或是有项目相关的新应用,其相关文件都是放在这个目录中和特定项目对应的目录下,如项目CUST1_6227,则放在CUST1_6227_BB下。要注意的是custom也作为一个模块存在,这使得其可以通过make目录中的custom模块的四个文件进行客户化的一些定制。

applib、bootloader、init、media、j2me等是这个系统各个层次的相对独立的模块各自的目录,其实drv和fs等目录也可以看成是相对独立的模块,只不过其更重要些而在前面介绍。这些目录包含了这些模块的C文件和头文件。每个目录(模块)都在下面的make目录中有相对应的目录保存构建时的编译链接配置文件。

make是工程构建过程中最重要的一个目录了,工程构建用的Makefile和一些中间配置文件将放在这里,Makefile在讲解构建过程时再具体介绍。在每个模块对应的目录下,都有四个文件控制了编译链接时的过程和配置。分别是:

   <module_name>.def文件中是该模块构建过程中用的条件定义。

   <module_name>.inc文件中是该模块所有用到的头文件所在目录的路径,是相对整个工程根目录的路径。

   <module_name>.lis文件中列出了该模块的所有C文件,其路径也是相对整个工程根目录的。

   <module_name>.pth文件中是该模块的所有C文件所在目录的路径,是相对整个工程根目录的路径。

build目录中保存了构建过程中产生的目标文件和库文件,及其他一些中间文件。

二. MTK手机软件系统的构建过程

如前面一节所述,MTK手机软件系统的构建使用了GNU的make,使得整个工程的构建可以自动进行,且可以灵活控制。整个构建过程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、<customer>_<project>.mak等文件控制。构建PC模拟版是通过msdev和VC的工程文件MoDIS.dsw来完成的。Gsm2.mak是构建ARM版的核心Makefile文件,整个构建过程由其控制,其他是一些启动、选项配置、子过程的文件。其关系图如下所示。

在MTK手机软件系统的根目录下有一个批处理文件Make.bat,这个批处理文件启动了整个工程的构建过程。在windows的命令行下,在该系统的根目录下输入命令make和相应的参数即可开始工程的构建,该批处理文件的使用方法如下所示。

Usage: 
make ["customer"|"mt62xx"] "project" "action" ["modules"] 

Description: 
customer = mtk              (Default customer) 
         = firefly17_demo (FIREFLY17_DEMO project) 
         = [mt6217|mt6219|mt6226|mt6227|mt6228|mt6229] (EVB only) 
         = ... 

project = l1s              (Layer 1 stand-alone) 
         = gsm              (GSM only) 
         = gprs          (GPRS only) 
         = basic          (Basic Framework) 

action     = new              (codegen, resgen, clean, update) (default) 
         = update or u    (scan, compile, link) 
         = remake or r    (compile, link) 
         = clean or c    (clean) 
         = resgen           (resgen) 
         = c,u              (clean then update) 
         = c,r              (clean then remake) 
         = codegen       (codegen) 
         = viewlog       (open edit to view build log) 
         = emigen           (emigen) 
         = emiclean       (emiclean) 

module(s)   = modules' name (kal, l1, ...) 
=> OPTIONAL when action is one of (clean c remake r update u c,r c,u) 

Example: 
make gsm new                          (MT6205B EVB new) 
make gprs codegen                   (MT6218B EVB codegen) 
make mt6219 gprs update             (MT6219 EVB update) 
make firefly17_demo gprs new 
make milan_demo gprs c,u init custom 
make mt6219 gprs r init custom drv



其中较常用的action有new、update、remake、new_modis这几个。

new是全新开始构建整个工程的ARM版,包括图片、声音、字符串等资源都要重做,依赖的其他动作最多,是最彻底也是耗时最长的一个动作,一般得到一个新的MTK发布版本后要做一次。

update是重新更新整个工程的ARM版,该动作会扫描工程中文件和库的依赖关系,若依赖关系有变化会建立新的依赖关系,随后根据新的依赖关系重新编译链接有改动的部分,一般在增加或删除一些驱动或应用的情况下需要用update。

remake是重新编译整个工程的ARM版,该动作只是简单的重新编译链接有改动的部分,不检查依赖关系,是耗时最短的一个动作,也是最常用的动作。

new_modis是全新构建整个工程的PC模拟版,其调用VC的编译器和链接器得到一个可以在windows上运行的PC模拟版。MMI应用软件工程师可以在没有硬件板的情况下在PC上检查和调试自己写好的应用。

Make.bat实际上只起引导作用,其只有一行批处理语句perl make2.pl %*,于是运行该批处理文件后控制权转给了perl脚本make2.pl。在这个perl脚本中解析了用户输入的命令行参数,设置变量,准备make时需要的临时配置文件,随后根据生成的可运行映像是PC模拟版还是ARM版而分别调用不同的构建过程。

  

Pc模拟版的构建通过调用如下命令实现。

system("$msdev MoDIS.dsw /MAKE /"$argu - Win32 $modisDir/" 

                   /OUT ${MoDISLogDir}//${argu}.log")



在这里$msdev就是VC的msdev,通过VC的工程文件MoDIS.dsw和后面的参数进行具体的构建过程。熟悉VC工程的朋友应该比较清楚,因此就不再具体解释了。之后将只以ARM版为主来讲解整个工程的构建过程。

    ARM版的构建通过调用如下命令实现。

 

system("${makeCmd} -f${makeFolder}${myMF} -r -R 

                   CUSTOMER=$custom PROJECT=$project $action")



在这里${makeCmd}是tools/make.exe,即GNU的make,${makeFolder}${myMF}是make/Gsm2.mak,$action是new、update、remake等。变量CUSTOMER和PROJECT分别是客户名和项目名,在构建过程中将根据此两个变量的值选定项目相关的配置文件,从而实现客户化的定制。通过给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 : cleanall cmmgen mmi_feature_check asngen codegen asnregen / 
          operator_check_lite update 

update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake 

remake : cleanlog cleanbin genverno libs $(BIN_FILE) done




上面的构建过程的几个步骤中,最重要的两个步骤是libs、$(BIN_FILE) 。libs调用ARM版的编译器和连接器将各个模块目录下的C文件编译链接为独立的库。$(BIN_FILE)这个步骤将各个模块编译链接得到的库和 mtk_lib目录下的库一起链接起来得到一个映像文件,然后使用ADS的工具fromelf将映像文件生成以变量BIN_FILE命名的二进制文件,该文件可以下载到硬件板上运行。
libs这个步骤如下所示。
libs: cleanlib startbuildlibs $(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% EQU WINDOWS_NT / 
       (if /I $(BM_NEW) EQU TRUE / 
         (tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1) 
/ 
       else / 
         (tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1) / 
       ) / 
else / 
       (if /I $(BM_NEW) EQU TRUE / 
         (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是指没有GNU make的默认规则和变量。COMPONENT=$*把当前要生成的库赋给变量COMPONENT。要注意%.lib匹配了所有要生成的库,但这个步骤一次只生成一个模块的库,这个步骤对所有匹配到的库都会执行一次。
comp.mak这个Makefile文件控制了模块的编译链接过程。在这个文件中,首先将当前模块要生成的库(由变量COMPONENT传入)设置给了变量TARGLIB。之后从<module_name>.lis文件中得到SRC_LIST和CPPSRC_LIST两个源文件列表,设定要编译的C文件、C++文件、汇编文件等的列表,和要链接的中间目标文件的列表。将<module_name>.inc、<module_name>.def、<module_name>.pth 文件中的头文件路径、C文件路径、编译链接参数等赋值给相应的变量。将平台相关(如6223、6225)的编译参数加上,确定使用ARM编译器还是 thumb编译器,是否支持ARM指令和thumb指令的interwork模式。最后进入库的编译链接过程。
库的编译链接由update_lib步骤完成,这个步骤直接依赖了$(TARGLIB)。目标$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj: %.cpp等规则编译得到的中间目标文件链接得到的。其主要过程如下所示。
$(TARGLIB):
...

@if exist $(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是整个工程构建过程中的总控配置文件,在这个文件中还包含了<customer>_<project>.mak和REL_CR_MMI_<project>.mak这两个项目相关的配置文件,用户自定义的配置文件USER_SPECIFIC.mak,另外还包含了一些临时生成的配置文件。这些配置文件在一起设置了工程构建过程中用到的编译器、链接器,库和二进制的工具,设置了编译链接时的参数,公共的头文件路径,设置了需要包含mtk_lib目录中的哪些既有的库,设置了需要生成的库等一系列相关的设置。这些设置都由一些重要的变量保存,具体在下一节中讲解。

三. MTK手机软件系统的配置

    MTK手机软件系统的大部分配置都已经确定,基本上不需要再改变,一般是MTK发布新的版本时会作些改变,客户不大需要关心。最主要的配置文件是Option.mak,而客户化定制需要需要修改的主要是<costomer>_<project>.mak、REL_CR_MMI_<project>.mak这两个文件。

    Option.mak文件中设置了工程构建时用到的编译器、链接器、库管理、二进制文件生成等工具的路径和可执行程序名,设置了基本的编译链接参数,指定CPU类型(ARM7EJ-S),确定最终使用的库列表(COMPLIST)。

  

一个项目是由工程中的多个基本库、第三方库和由源代码新编译链接的库组成的,最终这些库链接到一起得到一个完整的可执行映像文件。由哪些新编译链接的库来组成一个项目是由四个关键的变量决定,其中一个是前面提到的COMPLIST,另外三个分别是CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP、CUS_REL_MTK_COMP。这个几个变量的关系如下所示。

# ************************************************************************* 

# Custom Release Component Configuration 

# ************************************************************************* 

# Be sure the following: 

# 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_<project>.mak这两个文件都有对这两个变量CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP赋值。但Option.mak文件只是设定了整个工程需要的基本库,如手写、图形解码等,和特定项目没有关系。因此客户要定制自己的项目只需要修改REL_CR_MMI_<project>.mak这个文件对这两个变量的赋值即可。

<costomer>_<project>.mak文件也有对COMPLIST的赋值,但这只是对MTK的内部版本有用,客户版本没有影响。值得注意的是,该项目的绝大部分功能特性(feature)是在这个文件中确定的,如使用的sensor、支持哪些音视频格式、电话本大小、LCD屏幕大小等。下面是该文件中的部分内容。

J2ME_SUPPORT    = NONE # J2ME support: NONE, MTK_J2ME, J2ME_LIB, / 
                           MTK_J2MEHI, J2MEHI_LIB, MTK_DUMMYVM 

DRM_SUPPORT = NONE #DRM VENDOR: NONE, MTK, BSCI 

DRM_VERSION = NONE # DRM VERSION: NONE, V01, V02, ALL 

AMRWB_DECODE        = TRUE    # TRUE/FALSE 

AMRWB_ENCODE        = FALSE     # TRUE/FALSE 
            # MT6219 DSP cannot support AMRWB_ENCODE when GPRS connection 

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_<project>.mak这个文件的合适位置加上如下语句。

CUS_REL_SRC_COMP += zlib

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

原理图 和PCB板图和LCD初始化代码。花了半个小时将初始化代码写进程序,一试居然可以工作了,真tm的神了。
然后新建了 XXX_GPRS.mak和Verno_XXX.bld。指定LCD_MOUDLE,CMOS_SENSOR(6219平台的)NOR_FLASH_TYPE,PHONE_TYPE等。
然后从其他项目中拷贝个image过来,在CustResDefPLUTO.h 指定好image 路径。这些步骤不到5分钟。
然后打开原理图
1, eint_def.c 中对照原理图设置好中断,6219中才4个中断,很快设定好,下面有个数组custom_eint_sw_debounce_time_delay是设置debounce time的。
2,   查找LCM背光和keypad背光控制的地方,在custom_equipment.c中的custom_cfg_gpio_set_level函数中设置,一看pwm2和Alter,不用该。
3, 键盘定义,keypad_def.c中对照原理图一行一列的填上去。
4, 各种gpio口的配置,还是在custom_equipment.c,gpio_map_tbl数组,对照原理图配置好,主要就是振动啊,LED灯啊什么的,然后要设置声音,afe.c中,函数
AFEtchExtAmplifier,当中就是把一个gpio口拉高,拉低,注意这个口一定要配置成GPIO模式,并设置为输出。USB使能和上面一样,在函数USB_PowerControl中把相应的口拉高拉低。
5, 看一下flash,nnd原来是samsung的,得改一改了,这个flash的时序和其他的不一样,要大一点,根据flash spec和MTK datasheet,在custom_emi.c中修改一下时序,这个工作花了我半个小时,具体设置请参照MTK datasheet中的EMI Control Register for BANK0
6, 给nor flash分个区,由于没有NAND falsh经理想了个办法,把nor flash分1M出来当U盘,FlashConf.c中的PARTITION_SECTORS设为2048,custom_drv_init函数中写入USB_Ms_Register_DiskDriver(&USB_NOR_drv);这样1M的U盘就出来了,其实没有什么用的
基本设置完了,然后就要在MMI_featuresPLUTO.h中设置了,这个是我最喜欢做的事情了,一看要求,需要 英文,简中,繁中,泰文,sussian文,越南文,阿拉伯文,(md这么多),主菜单需要做成12宫格,开关机mp4,IP拨号等,MTK做的就是好,只要把宏打开就好了,md就是简单,把客户发过来的图片放进去,ok了
make custom=XXX gprs new接着我就找人聊天去了,半个小时后好了,down进去一看,可以了,发给客户做个demo,客户说还可以,这做个版本也真tmd容易。接着客户要提要求了,按ok键要直接放MP3啊,加入来电黑名单啊,在电话本中直接发消息啊,这个个东西把宏打开就可以了,由于用的是OV7660的摄像头,需要30w差值到130w,然后先前把mtk发给我们的差值代码放进去,mmi上在做个1280X1024的选项,其实就是降低一些设置,纯粹是欺骗消费者的,我还看到过最大分辨率是640X480的居然还标着130w,欺骗广大劳动者不会算术。搞定后new一遍,发给客户,客户说,先测一下,过几天再提些要求,并要求做个64+32M bit的版本,省成本。还要做个130w 差值到200 w camera的版本。去忽悠他的客户。