MTK 是现在市场上所有国内手机设计、制造商使用的最多的一个完整的手机产品解决方案,大部分做手机的技术人员都对此有接触和了解。不过, MTK 的整套软件系统十分庞大且复杂,很多刚接触这套系统的软件工程师一时不知如何进行配置和客户化定制。本文在此对整个 MTK 软件系统的工程结构和配置进行了简单介绍,希望通过此文和大家相互交流 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 文件中是该模块构建过程中用的条件定义。