MTK知识点小结11-08-22

 

0 ctrl+shift+F10 ctrl+end
1 在CustResDefPLUTO.h 中设置工程模式等

2 MTK申请和释放media内存的函数
eg: 分配20字节内存, temp_filename指向其首地址
    char* temp_filename;
    if (media_get_ext_buffer(MOD_MMI, (void **)&temp_filename, 20) != MED_RES_OK)
    {
       return ;
    }
    media_free_ext_buffer(MOD_MMI, (void**)wstr_filename);
    med_alloc_ext_mem(size);
    med_free_ext_mem(pointer);
    media_free_ext_buffer出问题是由于越界访问用media_get_ext_buffer申请的内存
3 MTK申请ctrlbuff内存的函数
eg:
    kal_Uint16* p = (kal_Uint16*)get_ctrl_buff(buff_size);
    free_ctrl_buff(p);

4 从MMI往L4发消息请求数据
eg:
    MYQUEUE Message;
    Message.oslSrcId = MOD_MMI;
    Message.oslDestId = MOD_L4C_2;
    Message.oslMsgId = (msg_type) PRT_MSG_ID_MMI_SMS_GET_PROFILE_PARAMS_REQ;
    Message.oslDataPtr = (oslParaType*)msgReq; //传递的参数
    Message.oslPeerBuffPtr = NULL;
    OslMsgSendExtQueue(&Message);

    SetSlaveProtocolEventHandler(Ys_GDevice_MasterCenterNumRsp, PRT_MSG_ID_MMI_SMS_GET_PROFILE_PARAMS_RSP);//设置消息响应的回调


5 获取系统盘和获取挂载设备 获取设备状态 检查剩余空间
  eg1:
 fun int() get_sys_drv
 return FS_GetDrive(FS_DRIVE_V_NORMAL, 2, FS_DRIVE_V_NORMAL | FS_DRIVE_I_SYSTEM);
  eg2:
 fun int() get_removeable_drv
 return FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE);
  eg3:
        if(!FS_GetDevStatus(drv, FS_MOUNT_STATE_ENUM) == FS_NO_ERROR)
  eg4:
 FS_DiskInfo disk_info; U16  path[4] = L"C:\\";
        FS_GetDiskInfo((PU16) path, &disk_info, FS_DI_BASIC_INFO | FS_DI_FREE_SPACE);
        disk_free_space = (U64)disk_info.FreeClusters * disk_info.SectorsPerCluster * disk_info.BytesPerSector;(byte单位)
6 判断文件是否存在
eg: kal_bool fun(wchar* unifilename)
 int attrs = FS_GetAttributes((const WCHAR*)filename);
 return (attrs >= 0) && ((attrs & FS_ATTR_DIR) == 0);
6.1 读写文件
  char  temp_filename[50];
  short wstr_filename[50];
  sprintf(temp_filename, "%c:\\sample.cgg", get_sys_drv());
  ascii_to_unicode(temp_filename, wstr_filename);
  if((file_handle = FS_Open((const WCHAR*)wstr_filename,FS_CREATE_ALWAYS | FS_READ_WRITE)) < 0)
  {
 FS_Close(file_handle);
 return ERROR;
  }
  else
  {
       FS_Write(file_handle, &statistics_flag, sizeof(statistics_flag), (UINT *)&size);
       FS_Read(file_handle, &statistics_flag, sizeof(statistics_flag), (UINT *)&size);
       FS_Close(file_handle);
  }
6.2 dump文件
  static char _logbuff[1024];
  void _dumpFileLog()
  {
    FS_HANDLE logHandle;
    U8 size;
    logHandle = FS_Open(_logFileName, FS_CREATE|FS_READ_WRITE);
    if(logHandle < 0)return;
           FS_Seek(logHandle, 0, FS_FILE_END);
    FS_Write(logHandle, _logBuff, sizeof(_logBuff), (UINT *)&size);
    FS_Write(logHandle, "\r\n", sizeof("\r\n"), (UINT *)&size);
    FS_Close(logHandle);
  }
6.3 设置文件属性
  void fun()
  {
 FS_HANDLE file_handle = FS_Open((const WCHAR*)_finishFile, FS_CREATE);
 int setAttriError = 0;
 if(file_handle < 0)return;
 FS_Close(file_handle);
 if((setAttriError = FS_SetAttributes((const WCHAR*)_finishFile, FS_ATTR_HIDDEN|FS_ATTR_SYSTEM))< 0){sys_error();} 
  }
6.4 检查盘符
  MMI_BOOL available;
  available = (FS_GetDevStatus(drv, FS_MOUNT_STATE_ENUM) == FS_NO_ERROR);
6.5 从路径中提取文件名
  U16 *mmi_da_util_get_filename(U16 * filepath)
 {
    S32 length, i;
    length = mmi_ucs2strlen((S8 *) filepath);
    /*从后往前推到一个斜杠或者是反斜杠就是文件名(有扩展)*/
    for (i = length - 1; i >= 0; i--)
    {
        if (filepath[i] == L'\\' || filepath[i] == L'/'){return &filepath[i + 1];}
    }
    return filepath;
 }
6.6 提取路径
    u16* ptr = mmi_da_util_get_filename((U16*)buf_filepath);
    *ptr = 0;
   
7 MTK中获取sim卡状态和当前模式的API
  mmi_idle_get_dual_sim_status(U8 *sim_status, U8* mode_status)
  sim_status包括:
                 MMI_SIM_ID_SIM1,
                 MMI_SIM_ID_SIM2,
                 MMI_SIM_ID_DUAL_SIM,
                 MMI_SIM_ID_NO_SIM,
  mode_state包括:
                 MMI_SIM_ID_SIM1,
                 MMI_SIM_ID_SIM2,
                 MMI_SIM_ID_DUAL_SIM,
                 MMI_SIM_ID_FLIGHT_MODE,

8 获取运营商
eg:
 char* operid = NULL;
 #ifdef __SALES_STATISTICS_DUAL_SIM__
 if(mode_status == MMI_SIM_ID_SIM1){ operid = gHomePLMNNum;return;}
 else if(mode_status == MMI_SIM_ID_SIM2 ){ operid = gHomePLMNNum_2;return;}
 else
 {
        if(sim_status == MMI_SIM_ID_DUAL_SIM)
        {
   switch(mode_status)
   {
    case MMI_SIM_ID_SIM1:{operid = gHomePLMNNum;return;}  
           case MMI_SIM_ID_SIM2:{operid = gHomePLMNNum_2;return;}
   }
  }
  else if (sim_status == MMI_SIM_ID_SIM2){operid = gHomePLMNNum_2;return;}
  else{operid = gHomePLMNNum; return;}
 }
 #else
 if (sim_status != MMI_SIM_ID_SIM1) return;
 else{operid = gHomePLMNNum; return;}
 #endif

9 读写nvram
第一步:添加LID 文件 Nvram_common_defs.h 位置 NVRAM_EF_LAST_LID_COMMAPP
eg: NVRAM_EF_YOSC_TEST_LID

第二步:添加nvram项的单项字节数和总项数的宏定义 文件 Nvram_common_defs.h 或 Nvram_common_config.c
eg:     #define NVRAM_EF_YOSC_TEST_LID_TOTAL 2
 #define NVRAM_EF_YOSC_TEST_LID_SIZE (sizeof(NVRAM_YOSC_TEST_STRUCT) * NVRAM_EF_YOSC_TEST_LID_TOTAL)

第三步:设置nvram 数据项的默认值 文件 Nvram_common_config.c 结构体定义在 Nvram_editor_data_item.h
eg:
 typedef struct {
   int data;
   char c1[20];
   char c2[20];
   }NVRAM_YOSC_TEST_STRUCT;
static NVRAM_YOSC_TEST_STRUCT const NVRAM_YOSC_TEST_DEFAULT[] =
 {
  {1, "j1", ""},
  {2, "j2", ""}
 };

第四步:添加nvram项的版本, 文件 Nvram_editor_data_item.h
 #define NVRAM_EF_YOSC_TEST_LID_VERNO         "000"

第五步:添加nvram项 文件  Nvram_common_config.c 位置 NVRAM_EF_RESERVED_LID
eg:
 ,{
  NVRAM_EF_YOSC_TEST_LID,
  NVRAM_EF_YOSC_TEST_LID_SIZE,
  NVRAM_EF_YOSC_TEST_LID_TOTAL,
  NVRAM_NORMAL(NVRAM_YOSC_TEST_DEFAULT),
  NVRAM_ATTR_AVERAGE, //指定属性比如备份
  NVRAM_CATEGORY_USER, //指定文件的目录
  "yosc_test",  //文件名的前部分 文件名的组成是:"yosc_test"  + "-" + "版本号"
  VER(NVRAM_EF_YOSC_TEST_LID), //版本
  "yosc test data", //描述
  NVRAM_APP_RESERVED //默认是这个
 }

第六步:读写nvram项
eg1:
 S16 pError;
 NVRAM_YOSC_TEST_STRUCT data_item[2];
 ReadRecord(
        NVRAM_EF_YOSC_TEST_LID,
        1,//从哪条记录开始读 起始1
        (void*)data_item,
        2 * sizeof(vrsd_tag_struct), //读取的字节数
        &pError);

eg2:
 NVRAM_YOSC_TEST_STRUCT data_item[2] = {{1, "k1", ""},{2, "k2", ""}};
 WriteRecord(NVRAM_EF_YOSC_TEST_LID,1, (void*)data_item, 2 * sizeof(vrsd_tag_struct), &pError);
 pError = 1 时 success
第七步:codegen

10 修改medbuf大小 Med_mem.h 修改asm大小App_mem_config.h
10.1 与unicode有关的函数UCS2.c
10.2 与UI有关的函数声明Gui.h
10.3 与字体有关的FontType.c
10.4 gdi_layer_push_and_set_active(handle_layer) 和 gdi_layer_pop_and_restore_active(void)成对使用
eg:
 gdi_layer_push_and_set_active(avatar_cntx_p->image_buffer_handle);
        gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);
        gdi_layer_clear(GDI_COLOR_GREEN);   
        gdi_layer_pop_and_restore_active();
10.5 盘符eg:MMI_CARD_DRV 用宏保存在FileMgrGprot.h

11 添加从idle输入*#XX#进入的界面 在ssc_table1[]

12.1 COM_DEF
 COM_DEF +=字符串 eg:COM_DEF += VRE_30
 COM_DEF +=变量   eg:VRE_USER_AGENT_COMPANY = Tcent
       COM_DEF += VRE_USER_AGENT_COMPANY=$(strip $(VRE_USER_AGENT_COMPANY))
12.2 mak输出
   $(warning ERROR: Please set VRE_USER_AGENT_COMPANY as "NONE" when VRE_CIPHER_UA = TRUE)
12.3 mak调用过程
   eg:
   DEP_ERR_ONA_OR_OFFB = $(warning ERROR: PLEASE turn on $1 or turn off $2)
   $(call DEP_ERR_ONA_OR_OFFB,WBXML_SUPPORT,VRE_SUPPORT)

13.1 编译目录出错 导致Resgenerating Process Error build目录在开始编译时刻建立在编译目录(可删除)
13.2 Resgenerating Process merge ref_list.txt error. 35版本出错在MMIDataType.h 53版本在mmi_res_range_def.h

>>主题系列
14 哪个目录下的themecomponents.h会生效
   custresource\themecomponents.h    remake
   custresource\pluto_mmi\themecomponents.h   resgen
   lcdresource\$MAINLCD_SIZE\touch or non_touch  new
14.1 custthemeres.h里面定义结构MMI_theme
     themeres.c里面定义theme_defaultTheme是默认主题
     themecomponents.h里面定义默认主题元素
14.2 resgen图片生成的数据在custimgdatahw.h(这里面的数据直接调用)
     themecomponents.h里面的UI_FILEED_AREA数据从custimgdatahw.h(custimgdatahw.h包含路径)手动拷贝
     特别注意从custimgdatahw.h拷贝数据到themecomponents.h之后,要把custimgdatahw.h里面原始数据删除以免额外占用rom空间(一个已经不用的const数组)


     路径参见custresdef.h或custdatares.h
14.3 资源范围RESOURCE_BASE_RANGE定义在 MMIDatatype.h
14.4 themeres.c:
     MAX_MMI_THEMES 主题列表里显示的主题个数
     mtk_MMI_themes[] 主题列表项
     MMI_theme_names[] 主题名称
14.5 用Modis Theme Editor 导出来的mte文件同struct MMI_theme结构里面的项一一对应。
     类型有UI_filled_area 和 color 两种,UI_filled_area 一般是image 或 NULL 
14.6 修改themecomponents.h后模拟器没有修改,重编ThemeRes.c  

15.1   n字节对齐(a+(n-1))&(~(n-1))
15.2   #if #elif #else #endif
15.3   soureinsight ctrl+M添加书签

>>Features系列
16  Gsm2.mak:
    @if /I "$(NEED_COPY_MMIFEATURE)" EQU "PLUTO_MMI" \
  (if exist $(FIXPATH)\$(MMIDIR)\Customer\CustResource\PLUTO_MMI\MMI_features_switchPLUTO.h \
   (copy /y $(FIXPATH)\$(MMIDIR)\Customer\CustResource\PLUTO_MMI\MMI_features_switchPLUTO.h $(FIXPATH)\$(MMIDIR)          

\MMI\Inc\MMI_features_switch.h) \
  ) & \
  (if exist $(FIXPATH)\$(MMIDIR)\Customer\CustResource\$(strip $(CUSTOMER))_MMI\MMI_features_switch$(strip $(CUSTOMER)).h \
   (copy /y $(FIXPATH)\$(MMIDIR)\Customer\CustResource\$(strip $(CUSTOMER))_MMI\MMI_features_switch$(strip $(CUSTOMER)).h 

    $(FIXPATH)\$(MMIDIR)\MMI\Inc\MMI_features_switch.h) \
  )
    说明:MMI_features_switch$(strip $(CUSTOMER)).h 是MTK Release的文件,作为原始features的参考和备份。MMI_features_switchPLUTO.h也是
    MTK release的文件,用来客制化。Gsm2.mak的语法揭示了MMI_features_switch.h的内容优先从MMI_features_switchPLUTO.h拷贝,成功即退出。
     
    MMI_features.h: include "MMI_features_switch.h"
    MMI_features.h根据MMI_features_switch.h的Features是OFF\AUTO\ON 制定相关Features的宏

    MMI_include.h:  include "MMI_features.h"
    MMI_include.h在几乎所有.c文件中被包含。所以MMI_features.h里面的宏对包含MMI_include.h的源文件是可见的。
   
 
>>ref_list.txt
17 删除从前面删,第三项是字符长度最大是20,resgen只修改pluto_mmi下面的,可以用Excel打开看是否显示正常来确认是否添加对了.

>>another notes
18.0 在showcategory里面将某个资源指针置“非空的非法指针”有可能可以快速定位到绘制的地方。
18.1 放在plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI目录下的res_xx.c文件会在resgen的时候被搜索编译到
18.2 其它模块包含本模块的头文件用COMMINCDIRS
18.3 第一次进入screen和从子screen返回的时候不会调用highlighthander
18.4 在EntryNewScreen后面调用DeleteScreenIfPresent可以返回到上上一屏。DeleteScreenIfPresent()
18.5 __MTK_TARGET__ _WIN32 


       

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值