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
(出处: 一牛网)