现在的位置: 首页 > 综合 > 正文

MTK模块入门

2013年08月11日 ⁄ 综合 ⁄ 共 9155字 ⁄ 字号 评论关闭

**************
*说明:该文件描述资源和模块添加方面
*author:se7en
*time:2009-04-20    modify at 2009-04-27
**************

Ophone开发分析:
一.ophone相关目录说明
1.主目录:目录位置:plutommi/mmi/ophone/
2.资源加载文件:E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI
/Res_MMI/Res_Ophone.c
3.stringID对应文字说明:E:/OPhone/O626G/plutommi/Customer/CustResource
/PLUTO_MMI/ref_list.txt
4.编译目录:E:/OPhone/O626G/make/ophonelib/  –定义模块文件位置
5.图片资源:E:/OPhone/O626G/NEOTEL_PROD/K626G

其中ophone主目录下函授三个子目录及文件,说明:
====ophone====
——inc
—-ophone_def.h             –对string,image,scean ID号的定义
—-ophone_gprot.h           –外部模块调用函数定义
—-ophone_menu.h            –定义menu ID
—-ophone_prot.h            –该模块调用函数的定义

——src
—-ophone_hlit.c            –ophone模块主入口,创建“优会通配置”栏

——lib                    *当对外发布时将lib模块生产为ophonelib.lib文件
—-ophone_main.c           
–该文件主要是ophone的active,update,invite,query,recharge请求时的操作
—-ophone_util.c            –函数库文件

在ophone/ophonelib/plutommi/mmi/ophone/lib中的文件是主要代码,其中:
1.ophone_hilt.c文件为调用MTK函数进行“画界面”;
2.ophone_main.c文件为功能实现的主要函数;

make/ophonelib目录主要是在进行编译时使用,说明:
====ophonelib====
—-ophonelib.def
—-ophonelib.inc
—-ophonelib.pth
说明:MTK设置了很多lst 和 pth 文件供用户添加文件,这些都在make文件夹下。用户可以自己添加模块,也可利用原有的lst 和 pth
文件添加。
以下以添加在 MTK/make/plutommi 为例。

在每个模块对应的目录下,都有四个文件控制了编译链接时的过程和配置。分别是:
<module_name>.def文件中是该模块构建过程中用的条件定义。
<module_name>.inc文件中是该模块所有用到的头文件所在目录的路径,是相对整个工程根目录的路径。
<module_name>.lis文件中列出了该模块的所有C文件,其路径也是相对整个工程根目录的。
<module_name>.pth文件中是该模块的所有C文件所在目录的路径,是相对整个工程根目录的路径。
build目录中保存了构建过程中产生的目标文件和库文件,及其他一些中间文件。

二.详细说明
添加string,image,screan,menu资源及调用说明
1.添加string:
1.1定义StringID
目录位置:plutommi/mmi/ophone/inc/Ophone_def.h
例如:
typedef enum
{
STR_ID_OPHONE_MAIN = OPHONE_STRING_BASE,
STR_ID_OPHONE_MENU,
STR_ID_OPHONE_MENU_SET_ACCOUNT,
}

1.2将StringID进行加载
目录位置;E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI/Res_MMI
/Res_Ophone.c
例如:
ADD_APPLICATION_STRING2(STR_ID_OPHONE_MENU,”Ophone Setting”,”Ophone
Setting”);
ADD_APPLICATION_STRING2(STR_ID_OPHONE_MENU_SET_ACCOUNT,”Account
Setting”,”Account Setting”);
ADD_APPLICATION_STRING2(STR_ID_OPHONE_MENU_ACTIVE,”Active
Ophone”,”Active Ophone”);
ADD_APPLICATION_STRING2(STR_ID_OPHONE_MENU_UPDATE,”Update
Configuration”,”Update Configuration”);

1.3在将stringID与对应的语言文字进行描述
目录位置:E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI
/ref_list.txt
注意:每行数据中各字段之间是以“tab”键分开的;如果不以tab键分割,可能会在这里读取不到数据

1.4在相应函数进行调用
目录位置:plutommi/mmi/Ophone/lib/Ophone_main.c
例如:通过GetString函数来进行调用,然后通过ophone_display_error()来将该字符串显示到手机终端;
ophone_display_error(GetString(STR_ID_OPHONE_HELP_RETURN_EXCEPTION),NULL);
或者
ophone_display_sending_screen(SCR_OPHONE_INVITING,STR_ID_OPHONE_INVITING,IMG_ID_OPHONE_INVITING,(PU8)DialPadCallBuffer,ophone_send_request_abort,NULL);

编译后,在 plutommi/Customer/CustResource下面 会生成新的
CustStrMap.c 和
CustStrRes.c
这两个文件中就包含了新增的string资源

2.添加images
2.1.定义IMAGE ID
目录位置:plutommi/mmi/ophone/inc/Ophone_def.h
例如:
typedef enum
{
IMG_ID_OPHONE_MAIN = OPHONE_IMAGE_BASE,
IMG_ID_OPHONE_MENU,
IMG_ID_OPHONE_DIALING,
IMG_ID_OPHONE_REQUESTING,
}

2.2.加载IMAGE ID
目录位置;E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI/Res_MMI
/Res_Ophone.c
例如:
ADD_APPLICATION_IMAGE2(IMG_ID_OPHONE_ACTIVING  
 ,CUST_IMG_PATH”////MainLCD////Ophone////activing.gif”,”active for
Ophone”);
ADD_APPLICATION_IMAGE2(IMG_ID_OPHONE_UPDATING  
 ,CUST_IMG_PATH”////MainLCD////Ophone////updating.gif”,”update for
Ophone”);
ADD_APPLICATION_IMAGE2(IMG_ID_OPHONE_INVITING  
 ,CUST_IMG_PATH”////MainLCD////Ophone////inviting.gif”,”invite for
Ophone”);

注意:目录之间是以四个反斜杠分割的;

2.3.在函数中进行调用
目录位置:plutommi/mmi/Ophone/lib/Ophone_main.c
或者    :plutommi/mmi/Ophone/src/Ophone_hlit.c
例如:
ophone_display_sending_screen(SCR_OPHONE_INVITING,STR_ID_OPHONE_INVITING,IMG_ID_OPHONE_INVITING,
(PU8)DialPadCallBuffer,ophone_send_request_abort,NULL);如果没有找到图片文件,手机显示的时
候是一个红色的*
添加图片时,注意路径用4杠

3.添加screan,screan在定义后就可以直接使用
3.1定义 scren ID
目录位置:plutommi/mmi/ophone/inc/Ophone_def.h
例如:
typedef enum
{
SCR_ID_OPHONE_MAIN = (OPHONE_SCREEN_BASE + 1), /* for screen id enum
parser */
SCR_OPHONE_SETTING,
SCR_OPHONE_SET_ACCOUNT,
SCR_OPHONE_ACTIVE,
}

3.2加载SCREAN ID(**该位置未知**)
目录位置;E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI/Res_MMI
/Res_Ophone.c

3.3在对应位置进行调用
目录位置:plutommi/mmi/Ophone/lib/Ophone_main.c
例如:
DeleteScreenIfPresent(SCR_OPHONE_ACTIVING);
或者
ophone_display_sending_screen(SCR_OPHONE_UPDATING,STR_ID_OPHONE_UPDATING,IMG_ID_OPHONE_UPDATING,NULL,ophone_send_request_abort,NULL);

4.添加菜单
4.1定义menu ID

目录位置:plutommi/mmi/ophone/inc/ophone_menu.h
例如:
MENU_OPHONE_MAIN,                                //the main menu for
ophone
MENU_OPHONE_SET_ACCOUNT,                        //Set account submenu
for ophone
MENU_OPHONE_ACTIVE,                            //active submenu for
ophone

4.2定义MENU ID对应字符串
目录位置:plutommi/mmi/ophone/inc/Ophone_def.h
例如:
typedef enum
{
STR_ID_OPHONE_MAIN = OPHONE_STRING_BASE,
STR_ID_OPHONE_MENU,
STR_ID_OPHONE_MENU_SET_ACCOUNT,
STR_ID_OPHONE_MENU_ACTIVE,
STR_ID_OPHONE_MENU_UPDATE,
}

4.3对MENU ID进行加载(详细说明请参考<MMI实例培训教程>)
目录位置;E:/OPhone/O626G/plutommi/Customer/CustResource/PLUTO_MMI/Res_MMI
/Res_Ophone.c
例如:
#ifdef __MMI_UCM__
ADD_APPLICATION_MENUITEM((MENU_OPHONE_MAIN,MAIN_MENU_CALL_CENTER,6,
#else
ADD_APPLICATION_MENUITEM((MENU_OPHONE_MAIN,MENU8237_SCR8093_MNGCALL_MENU_MAIN,6,
#endif
MENU_OPHONE_SET_ACCOUNT,
MENU_OPHONE_ACTIVE,
MENU_OPHONE_UPDATE,
MENU_OPHONE_QUERY_BALANCE,
MENU_OPHONE_RECHARGE,
MENU_OPHONE_HELP,
SHOW, MOVEABLEWITHINPARENT|INSERTABLE,
DISP_LIST,STR_ID_OPHONE_MENU,IMG_PHB_SETTINGS));
ADD_APPLICATION_MENUITEM((MENU_OPHONE_SET_ACCOUNT,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_SET_ACCOUNT,
IMG_PHB_SETTINGS))
ADD_APPLICATION_MENUITEM((MENU_OPHONE_ACTIVE,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_ACTIVE,
IMG_PHB_SETTINGS));
ADD_APPLICATION_MENUITEM((MENU_OPHONE_UPDATE,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_UPDATE,
IMG_PHB_SETTINGS));
ADD_APPLICATION_MENUITEM((MENU_OPHONE_QUERY_BALANCE,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_QUERY,
IMG_PHB_SETTINGS));
ADD_APPLICATION_MENUITEM((MENU_OPHONE_RECHARGE,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_RECHARGE,
IMG_PHB_SETTINGS));
ADD_APPLICATION_MENUITEM((MENU_OPHONE_HELP,MENU_OPHONE_MAIN,0,SHOW,
MOVEABLEWITHINPARENT, DISP_LIST,STR_ID_OPHONE_MENU_HELP,
IMG_PHB_SETTINGS));

4.4通过函数调用,实现menu的显示
目录:plutommi/mmi/Ophone/src/Ophone_hlit.c
例如:
SetHiliteHandler(MENU_OPHONE_MAIN, ophone_highlight_mainmenu);

SetHiliteHandler(MENU_OPHONE_SET_ACCOUNT,
ophone_highlight_set_account);
SetHiliteHandler(MENU_OPHONE_ACTIVE, ophone_highlight_active);
SetHiliteHandler(MENU_OPHONE_UPDATE, ophone_highlight_update);
SetHiliteHandler(MENU_OPHONE_QUERY_BALANCE, ophone_highlight_query);
SetHiliteHandler(MENU_OPHONE_RECHARGE, ophone_highlight_recharge);
SetHiliteHandler(MENU_OPHONE_HELP, ophone_highlight_help);

注意,实际menu的添加应该是在D:/G5650_NEW/plutommi/mmi/Inc/GlobalMenuItems.h中,在这里
在该文件中添加ophone_menu.h的引用即可。
例如:
#ifdef __OPHONE__
#include “ophone_menu.h”
#endif

5添加资源注意事项:
5.1修改PopulateRes.c
修改plutommi/MMI/Resource/PopulateRes.c
extern void PopulateMyAppRes(void);

例如:
#ifdef __OPHONE__
{
extern void PopulatemultitallResData(void);
PopulateOphoneResData();
}
#endif

5.2.在加ID之前先得为本程序添加一个基础ID,因所有程序的资源ID都是各自为政各定义各的,但是这些ID又不能冲突(每种类型的资源ID都
是在同一个取
值空间),所以我们就用这些基础ID将每个程序的ID取值隔离开来。
基础ID同样定义在plutommi/MMI/INC/MMIDatype.h:例如
#ifdef __OPHONE__
RESOURCE_BASE_RANGE(OPHONE,                        300),

注意:    此处的定义在相应的MyApp.def文件对资源ID进行定义时使用

-》MMI任务入口:
C:/code_100/plutommi/mmi/Framework/Tasks/TasksSrc
中文件MMITask.c函数MMI_task。
-》MMI任务的建立:
C:/code_100/plutommi/mmi/Framework/Osl/OslSrc
中文件pixtelMMI.c函数WinMain调用InitApplication函数,在该函数中建立MMI任务,建立任务的接口函数
为:osl_create_task。
-》MMI任务信息:
{“MMI TASK”(任务名称), “MMI Q”(队列名称), 127(优先级),
4096(堆栈大小),MAX_PRT_NODES(队列结点个数), MMI_task(任务入口)}。
-》MMI模块入口:
目录C:/code_100/plutommi/
mmi中为MMI各个模块的代码。比如闹钟模块,源代码在C:/code_100/plutommi/mmi/Alarm/AlarmSrc中,头文件在

C:/code_100/plutommi/mmi/Alarm/AlarmInc中。首先找到初始化闹钟的函数AlmInit,该函数定义在选择闹钟菜
单项时调用函数HighlightAlmMenu进入闹钟功能。
6.MMI的制作
参考文档:
文件名    文件内容描述
API For Writing Applications Using Pixtel MMI Platform.pdf    各类窗口列表
Writing Applications Using Pixtel MMI Platform.pdf    如何写应用程序
MMI 2.0 Design DOC和MMI Design
Doc目录中对MMI中的各个模块进行描述,因此在研究某一模块时可以在这两个文件夹中找到该模块的介绍,通过这些文档可以加速对该模块编码的理解。
MMI的模块在路径C:/code_100/plutommi中。
-》设计一个应用程序的流程如下: -
1. Write an Initialization function to register the various event
handlers.
2. Write a populate function to register various string and image
elements for the
application.
3. Write highlight handlers for function
registered.菜单项的功能,当用户选择菜单项后执行的函数。
4. Write the Entry functions。入口函数
5. Write the Exit function。出口函数
6. Write the business logic to call between various entry functions.

假如你以前在其它手机平台上开发过MMI APP,现在公司要更换手机平台,你如何能快速了解新的手机平台?
首先,你要有一个该平台的运行环境(象MTK,展讯都提供一套完整的软件方案)。经过简单的调试,该运行环境编译通过,并且可以运行出WIn32模拟器。

其次,找出手机软件的运行入口。所有的手机启动过程如下:开机
—〉初始化硬件设备—-〉初始化软件(全局变量,读取nv数据等)—-〉开机动画,搜寻网络,Sim卡等—>Idle界面。在vc
工程下,你可以搜寻”Init”,”Initialize”,”start”,”task”等关键字,可能会找到很多c文件包含这些关键字。然后,你可以
根据文件名,以及文件所属的路径,排除大部分搜索结果。在剩下的每个搜索结果处,加一个断点。按“F5”调试,程序会停在某个断点。这个断点向上看看,可
以找到手机软件的运行入口。沿着这个断点跟下去,你就可以发现APP初始化,读取nv,Sim ,显示Animation等等……

第三,简单了解Idle。根据文件路径以及文件名,我们可以确定哪几个文件属于Idle
。一般来说,各个平台的Idle程序都比较乱,因为Idle修改的人多,上面Icon,状态特多。在Idle文件里查找
“create”“start”“entry”等关键字,通过设置断点,可以定位Idle的入口及其出口。Idle不要细看,只要知道Idle的入口,以
及从Idle如何进入MainMenu就行了。

第四,详细了解MainMenu。MainMenu是所有模块中比较简单的一个,程序代码也比较少。只要了解了MenuMain,我觉得各位就可以
在该平台上修改一些简单的Bug了。

第五,自己动手写一个简单的App,在App中尝试使用各种控件。至于如何使用控件,各位可以先看看哪些模块用到这些控件,把相关程序拷贝过来,稍
加修改即可。

第六,尝试添加修改图片字符串资源。

第七,查找关键字“Timer”,看看程序如何使用Timer.

第八,理解消息传递,窗口调用,信息保存等等。

到此为止,你对一个新平台的MMI至少掌握了70%,至于其它的一些细枝末节,以后工作中再慢慢细抠。
各位对快速上手新平台有什么建议,请提出,大家一起讨论。

抱歉!评论已关闭.