mtk平台相关问题总结|mtk架构分析

mtk平台,相关问题总结

编译前请将..\custom\common\nvram_lid_statistics.h文件和tst文件夹的属性、plutommi\Customer\Customize下的GCML.txt改为可读写。

Release 版本的时候,MMI/MiscFramework/MiscFrameworkSrc/UCS2.c不能删除,因为,resgen要用倒ucs2.c

1:深路经覆盖浅路径文件

2:只有ADD_APPLICATION_MENUITEM,ADD_APPLICATION_MENUITEM2两种添加菜单方式

3:添加菜单的时候一定要,指定子菜单的个数

4:CmsWapMmsAdp.h文件中,如果是26项目,不要打开28开关

#define SUPPORT_MTK_6226

#if 0

#ifdef SUPPORT_MTK_6228

#define CMS_SURPPORT_PNG_BMP

#endif

#endif

5:Res_SAT.c中,如果用 移软的 库,要将

#ifndef CMS_NEW_APP

ADD_APPLICATION_MENUITEM((SERVICES_WAP_MENU_ID,MAIN_MENU_SERVICES_MENUID,0,SHOW,NONMOVEABLE|SHORTCUTABLE,DISP_LIST,

SERVICES_WAP_STRING_ID,SERVICES_WAP_IMAGE_ID));

#endif

注释掉

6ataAccountDef.h中添加

#include "custom_mmi_default_value.h"

用来防止

#ifdef MAX_GPRS_USER_NAME_LEN

#define MAX_GPRS_USERNAME                      MAX_GPRS_USER_NAME_LEN-1

#else

#define MAX_GPRS_USERNAME                      15

#endif

#ifdef MAX_GPRS_PASSWORD_LEN

#define MAX_GPRS_USERPASSWD                    MAX_GPRS_PASSWORD_LEN-1

#else

#define MAX_GPRS_USERPASSWD                    15

#endif

的偏差

7:头文件打不开,很可能在

make中的相应文件里,没有加这个路径

如:plutommi.inc文件中没有包含相应路径

8: user agent profile 在文件cmswapmmsadp.c

9:mtk 28, 在mms_send_message函数中,要将

MMS_SetMaxSize(gconfig.sendsize, gconfig.retrievesize);

放在

MMS_Init();

之后,否则,发彩信会重启

10:mms_init_global_param此函数中设置了mms的相关参数,

还有

mms_init_pre_setting_file_chinamobile

改为gconfigtemp.gprs_mode =4

[2  wap]

wap里的wap_init_pre_setting_file_chinamobile函数

帐号改为gWapTemp.gprs_mode = 14//WAP_SERVICE_CHINAMOBILE+GSM_NET_ACCOUNT;

11:cmswapmmsadp.h中有wap,mms相关设置

12:将开关

#if defined(CMS_NEW_APP) || defined(MMS_SUPPORT)

#define __MMI_STATUS_ICON_MMS__

#endif

打开,否则来彩信的时候没有未读图标

13:收发彩信的时候,底下的白色部分

修改mmi_mms_show_send_receive_status函数中的

UI_fill_rectangle(0,MMS_PROGRESS_INDICATOR_HEIGHT,UI_device_width-1,

10,UI_color(255,255,255));

14:

我们发了新版本给贵方,如果需要打trace请在手机上开启trace,方法:

1:Idle->输入*#34364#,选择第2项设备,--〉7项,set uart->1项 TST Config-〉

uart port选择uart1完成,重启

15:gif重复播放,gif图像消失的解决方式

(1)在播放前添加 gdi_image_gif_reset();

16:Idle 来短信 进入了短信inbox,没有进合一接口

#if defined(CMS_NEW_APP)&&defined(SUPPORT_SMSMMS_COMBINE)

extern void mmi_mms_entry_inbox(void);

#endif

void mmi_msg_exit_inbox_list_dummy(void)

{

memset(&currHistory, 0, sizeof(currHistory));

#if defined(CMS_NEW_APP)&&defined(SUPPORT_SMSMMS_COMBINE)

currHistory.scrnID = SCR_ID_MMS_INBOX;

#endif

SetMessagesCurrScrnID(0);

g_msg_cntx.MessagesScrnIdToDelHistoryNodes = SCR_ID_MSG_INBOX_LIST;

g_msg_cntx.MessagesScrnIdDelUptoHistoryNodes = SCR_ID_MSG_INBOX_LIST;

#if defined(CMS_NEW_APP)&&defined(SUPPORT_SMSMMS_COMBINE)

currHistory.entryFuncPtr = mmi_mms_entry_inbox;

#else

currHistory.entryFuncPtr = mmi_msg_entry_inbox_list;

#endif

17:filter.txt文件用于模拟器的编译,此文件中定义的开关,都将被模拟器过滤掉,所以如果第三方release的软件不能支持模拟器就要将其在模拟器上过滤掉

18:

MTK23:我们模拟器在开机无法正常启动时,可以将\MTK23_07AW0736MP\modis\WIN32FS\DRIVE_C\NVRAM\NVD_DATA\下的数据文件全部清除,在从新启动模拟器,一般都可以成功启动。这是因为我们在修改nvram值的时候,这个目录下的值没有从新生成,所以会出现错误

19:editor出现滚动条覆盖虚拟键盘的情况,有可能是mmi_pen_editor_vk_show()中算的changed_height不对

20:去掉手机触摸屏校验在PhnsetNeedFactoryDefaultCalibration()中

21:recorder在退出的时候,要清除与hmchip之间所注册的handler

此外:mdi_video_rec_save_file()中一句代码不应该注释掉,记得要打开media_vid_file_merge()

vis_merge_recorder_file()是用来保存视频文件的

22:recorder在stop的时候,没有stop preview,所以我们要加上stop preview的消息,然后我们还需要close file。media_vid_close()是player用的

23默认支持超级终端,如果要使用Mtk的Trace,设置步骤:

1 . 输入*#3646633#,进入工程模式

2. Device\Set UART \ Trace setting  选择Trace setting ON 手机重起之后就可以了

3. 如果只关心cdma_print 的Trace信息。只选择MOD_DISPATCH模块即可

24:指定模拟器heap大小,ZM300  300指定义的大小(手写时候出现的问题)

25:手写在imeres.c中,参数

IME_HAND_WRITING_ATTRIB(MMI_FALSE, IME_HAN_WRITING_INVALID_INPUT_MODE, GUI_VIRTUAL_KEYBOARD_TRAY,  PEN_EDITOR_SIMPLIFIED_CHINESE)中

PEN_EDITOR_SIMPLIFIED_CHINESE用于在手写时,获取当前的输入法后,此参数将被mmi_pen_editor_get_hand_writing_type_by_input_mode()返回并传给手写模块,用于识别当前输入法,给出相近文字

26:手写可以用库来调试,步骤如下:

1:用wentonginterface.c替换掉原来的文件,并将WTRecognizeUShort定义换为WTRecognize。

#ifdef DEBUG_IN_WIN32_FOR_HANDWRIGING

WTError WTRecognize(unsigned short * PointData,short PointsNumber,unsigned short *CandidateResult,char *RamAddress);

#else

WTError WTRecognizeUShort(unsigned short * PointData,short PointsNumber,unsigned short *CandidateResult,char *RamAddress);

#endif

2:RecoCore.obj为手写模拟器的库,加入即可。此过程遇到模拟器heap大小问题,如25所示修改

27:修改editor默认输入法的时候,在Nvram_cust_pack.c中数组

kal_uint8 const NVRAM_CACHE_SHORT_DEFAULT[NVRAM_CACHE_SIZE]=

{

}

中修改

0x0E, 0x00,

记住此时还需修改

0x0E, 0x00,

后者用于恢复出厂设置的时候,系统来取值

修改nvram的时候,要相应升级custom_nvram_editor_data_item.h中,

#define NVRAM_EF_CACHE_SHORT_LID_VERNO      "004"

我们现在发现一个问题,如果我们修改了nvram里面的一个默认设置的值,如果我们不修改对应的版本号的话,在升级手机的时候就必须要format才可以正常读出我们新设置的值,但是在实际的操作中,这样会把经过硬件校准过的数据清除掉(尤其是客户在量产后进行升级),会造成一些预想不到的错误,所以请大家在修改了nvram的值以后,一定要修改相应的版本号。举例如下:

如果我们修改了:NVRAM_EF_PHB_COMPARE_DIGIT_DEFAULT

那应该同时修改与其对应的NVRAM_EF_PHB_COMPARE_DIGIT_LID的版本:VER(NVRAM_EF_PHB_COMPARE_DIGIT_LID)即:NVRAM_EF_PHB_COMPARE_DIGIT_LID_VERNO

一般的情况,我们修改的方法是:增加一个版本号

请各个review leader在给大家review的时候一定要注意这个问题。

28:

将lib解开的命令

ar -x custom.lib

将文件打包成lib的命令

ar -crus custom.lib *.obj

29:vc模拟器出现error LNK2005错误,如:

mstdXXXX.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(delop.obj)

这是因为两个vc库冲突,把后者LIBCD.lib在vc设置中屏蔽掉即可。

方法如下:

Vc设置==》link==》选择input选项,在ignore libraries中写上LIBCD.lib(要屏蔽的库)

即可

30:mtk底层声音转换在InitializeResourceVariables()函数中,诸如:

resource_tones=

resource_midis =


mtk架构分析

1.1启动流程

1.1.1模拟器线程创建

由于代码是在模拟器中执行,所以代码中都带有一些win32程序的特征。比如模拟器的启动就是用典型的win32程序方式。在PixtelMMI.cpp文件里的函数WinMain就是模拟器的启动入口。里面包括了InitInstance和模拟器的消息循环,这些都是win32程序通用的,我们需要注意的只是InitApplication();

这个InitApplication();函数创建了几个线程,用这几个线程来模拟手机中的不同的任务线程。并且为这些任务创建了不同的消息队列。这些创建出来的线程的一切相关资料都保存在task_info_g1(一个结构数组)里面。包括消息队列的信息。此外,它还设置了一个timer,这个timer是模拟器用来模拟整个时钟震荡用的,以后需要使用timer的时候都是使用它的分频,它的周期

是100ms,不过这只是系统模拟的而已。这些创建的线程中其中有一个是主要的,此线程的入口函数是MMI_task,它在MMITask.c里面。

1.1.2消息循环

函数MMI_task主要完成的是不停的读取protocol task中的消息,然后根据消息和参数进行相应的处理函数。protocol task中的消息其实就是我们刚才在initAppication()里面创建线程时创建的消息队列,这个消息队列的的指针保存在一个消息队列id指针里面,而这个消息队列id指针则保存在task_info_g结构的task_ext_qid项中。晓得了消息队列的所在,读取protocol task就变的可行了,这方面的相关操作我们将在Queue相关里面详细介绍。

在函数MMI_task里读取了消息后,用一个switch语句来选择处理方式,我们发现很多处理方式的最后都调用了一个ProtocolEventHandler函数,此函数是得到消息中保存对应消息处理函数的函数入口,并根据入口执行相应函数,此方面的东西我们将在event相关里面进行详细介绍。最后,我们来看看当手机系统正常启动时执行的操作,看到case MSG_ID_MMI_EQ_POWER_ON_IND:消息,这个消息就是系统启动的消息。当系统收到这个消息时候,系统根据当前系统的状态来决定启动的方式,有正常启动(用户按键盘后启动),有充电启动,还有闹钟闹时启动,有异常启动。这里所谓的启动,有时候仅仅是显示一个用于表示状态的屏幕,而不全是完整的启动整个系统。

1.1.3启动初始化

我们看到正常启动(用户按键盘启动)中首先调用了函数InitializeAll,这个是系统启动的初始化函数。比如协议栈,菜单数组,中断队列的初始化,一些硬件消息所对应的事件设定,还比如一些需要立刻初始化的模块,设定这些模块的菜单相应事件,设定这些模块协议栈消息响应函数。

初始化这些后,接着函数InitNvramData,让一些需要读nvram的模块读出nvram中的数据,以此来初始化这些需要用到nvram中的数据来初始化的模块。

初始化后调用函数fast_openscreen,这个函数就是系统启动后进入主屏幕的函数。比较复杂。

mtk架构分析:

http://bbs.16rd.com/forum.php?mod=viewthread&tid=454043&fromuid=28165

(出处: 一牛网)

你可能感兴趣的:(mtk平台相关问题总结|mtk架构分析)