MTK两个常用函数
mtk imgsensor_info 参数

mtk imgsensor_info 参数mtk imgsensor_info 参数是用于获取图像传感器信息的函数,它是在Android系统中用于获取传感器数据的一种常见方法。
该参数提供了有关图像传感器状态和性能的详细信息,包括传感器类型、分辨率、曝光时间、光源等信息。
这些信息对于开发者和应用程序开发人员来说非常重要,因为它们可以用于优化图像质量和提高用户体验。
一、函数原型```cint imgsensor_info(struct imgsensor* sensor, u16*sensor_id);```其中,`sensor` 是一个指向 `imgsensor` 结构的指针,该结构包含了传感器相关的信息;`sensor_id` 是一个指向无符号16位整数的指针,用于存储传感器ID。
二、参数说明1. `sensor`:指向 `imgsensor` 结构的指针,用于存储传感器相关的信息。
该结构包含了传感器类型、分辨率、曝光时间、光源等信息。
2. `sensor_id`:指向无符号16位整数的指针,用于存储传感器ID。
通过该参数可以识别不同的传感器型号和版本。
三、函数返回值函数返回一个整数值,表示函数执行的结果。
如果函数执行成功,则返回值为0;否则返回一个非零值,表示发生了错误。
四、参数详解1. `sensor->version`:传感器版本号,表示传感器的型号和版本信息。
2. `sensor->vendor_id`:传感器厂商ID,表示传感器的制造商信息。
3. `sensor->sensor_type`:传感器类型,表示图像传感器的类型,如CMOS、CCD等。
5. `sensor->format`:传感器图像格式,表示图像的像素格式,如RGB、YUV等。
6. `sensor->exposure_time`:曝光时间,表示传感器曝光的时间长度。
7. `sensor->awb_mode`:白平衡模式,表示图像的白平衡模式。
MTK文件操作常用函数

1. int FS_Open(const WCHAR*FileName, UINT Flag)该函数用来打开一个文件,FielName为文件路径及文件名,Flag为文件的操作属性,其值可为FS_READ_WRITE,FS_READ_ONLY,FS_OPEN_SHARED等。
如果文件打开成功,该函数返回一个大于等于0的值,否则返回一个小于0 的值。
具体操作方法可如下:FS_HANDLE h;if((h = (FS_HANDLE)FS_Open((constWCHAR*)filename,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}注意,这里的路径要转换成Unicode字符串,可以通过AnsiiToUnicodeString(S8 * pOutBuffer, S8 *pInBuffer)函数来实现。
比如我们在D盘的example 文件夹下有一个test.c 文件需要对其进行修改(D:\example\test.c),则:FS_HANDLE h;S8UnicodeName[100];AnsiiToUnicodeString((S8*) UnicodeName, (S8 *)”D:\\example\\test.c”);if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}也可使用FS_Open((const WCHAR *)L”D:\\example\\t est.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。
当对文件修改完成后,要使用函数FS_Close()将其关闭。
2. intFS_Close(FS_HANDLEFileHandle)用来关闭一个已经打开的文件。
MTK_NVRAM等操作

MTK 中nvram 的读写操作定义NVRAM 数据有三种方式:(一)、在nvram_editor_data_item.h、nvram_data_item.h、nvram_data_item.c三个文件中添加。
1、在nvram_editor_data_item.h文件中定义自己保存在nvram 中的结构体数据类型。
例如:typedef struct{Int a;Char b;}my_nvram_data_t;2、在nvram_data_item.h 文件中的nvram_lid_core_enum 枚举中定义自己的nvram ID(建议在最后面添加,但必须添加到NVRAM_EF_LAST_LID_CORE 的前面)。
再定义两个宏,一个宏是前面定义的结构体的字节大小,另一个是在nvram中保存的数据个数,如果在nvram 中只需要保存一个数据的话,就定义为1。
例如:typedef enum{…………My_nvram_data_lid, //自己定义的nvram IDNVRAM_EF_LAST_LID_CORE}nvram_lid_core_enum;#define my_nvram_data_size sizeof( my_nvram_data_t )#define my_nvram_data_total 13、在nvram_data_items.c文件中的lobical_data_item_table_core 结构体数组中添加自己的项。
建议添加在最后,仿照前面的添加。
例如:Itable_entry_struct logical_data_item_table_core[] ={…………,{My_nvram_data_lid , //前面定义的枚举IDmy_nvram_data_size , //前面定义的宏,结构体大小my_nvram_data_total , //前面定义的宏,nvram中数据的个数NVRAM_EF_ZERO_DEFAULT,NVRAM_A TTR_A VERAGE,NVRAM_CATEGORY_USER,“ MT1D” ,// 根据前面的数据项递增VER( My_nvram_data_lid ),“ my nvram test\0” ,//数据描述,只做参考,无其他作用NVRAM_RESERVED_VALUE}, { NVRAM_EF_RESERVED_LID}}4、my_nvram_data_t my_nvram_data = {0};S16 error ;//将my_nvram_data中的数据写到nvram中My_nvram_data_lid 标志处,error保存错误标志WriteRecord(My_nvram_data_lid, 1, &my_nvram_data, sizeof(my_nvram_data_t ), & error);//将nvram中My_nvram_data_lid 标志处的数据读到my_nvram_data中,error保存错误标志ReadRecord(My_nvram_data_lid, 1, &my_nvram_data, sizeof(my_nvram_data_t ), & error);二、在common_nvram_editor_data_item.h、nvram_user_defs.h、nvram_user_config.c 中定义1、common_nvram_editor_data_item.h 此处定义nvram 中保存数据的结构体数据类型2、nvram_user_defs.h 此处定义nvram ID 和结构体数据大小、数据总数3、nvram_user_config.c 此处填充nvram 结构数据内容及defult值(在MTK 下建议使用此方法修改nvram)(mtk 中nvram 的读写操作(一,二)/epll_apple/blog/item/94b29c22083a14a84723e846.html)三、在coustom_mmi_default_value.h、common_mmi_cache_config.c中定义1、在custom_mmi_default_value.h 文件中有三个枚举类型BYTEDATA,SHORTDATA和DOUBLEDATA。
MTK图形图象函数

1、S32 gdi_image_draw_id(S32 offset_x, S32offset_y, U16 image_id);offset_x和offset_y 是图片左上角的坐标,image_id是指向图片的枚举类型,用法如下:ADD_APPLICATION_IMAGE(MAIN_MENU_MA TRIX_PHONEBOOK_ICON,CUST_IMG_PATH"\\\\MainLCD\\\\MainMenu\\\\MATRIX\\\\MM_PB.gif");2、S32 gdi_image_draw(S32 offset_x, S32 offset_y, U8 *image_ptr);Image_ptr是用file2hex.exe转化后的图片文件名;在MTK平台里,image_ptr = (U8*)GetImage(image_id);3、S32 gdi_image_draw_file(S32 offset_x, S32 offset_y, S8*image_name);Image_name是图片的文件名;4、S32 gdi_image_get_dimension_id(U16 image_id, S32 *width, S32*height);S32 gdi_image_get_dimension_file(S8 *image_name, S32 *width, S32*height);S32 gdi_image_get_dimension(U8 *image_ptr, S32 *width, S32 *height);获得图片的长宽参数5、S32 gdi_image_get_frame_count_id(U16 image_id, S32 *frame_count); S32 gdi_image_get_frame_count_id(U16 image_id, S32 *frame_count);获得动态图片的帧数画点函数;6、void UI_putpixel(s32 x,s32 y,color c);7、关于剪切矩形:void UI_set_clip(s32 x1,s32 y1,s32 x2,s32 y2);void UI_reset_clip(void);void UI_pop_clip(void);void UI_set_text_clip(s32 x1,s32 y1,s32 x2,s32 y2);void UI_reset_text_clip(void);void UI_pop_text_clip(void);画线函数;颜色为c的一条直线:void UI_line(s32 x1,s32 y1,s32 x2,s32 y2,color c);颜色为c,宽度为w的一条直线:void UI_wline(s32 x1,s32 y1,s32 x2,s32 y2,color c,s32 w);画一个空心矩形:void UI_draw_rectangle(s32 x1,s32 y1,s32 x2,s32 y2,color c); 填充一个矩形:void UI_fill_rectangle(s32 x1,s32 y1,s32 x2,s32 y2,color c); 画图区域控制函数:void UI_lock_double_buffer(void);void UI_unlock_double_buffer(void);void UI_BLT_double_buffer(s32 x1, s32 y1, s32 x2 , s32 y2); 文字输出有关的函数:设置字符显示区:void UI_set_text_clip(s32 x1,s32 y1,s32 x2,s32 y2);设置字体颜色:void UI_set_text_color(color c);设置字体边框颜色:void UI_set_text_border_color(color c);设置当前光标位置:void UI_move_text_cursor(s32 x,s32 y);获取字符串的长、宽参数:void UI_measure_string(UI_string_type text,s32 *width,s32 *height);获得单个字符的长、宽参数:void UI_measure_character(UI_character_type c,s32 *width,s32*height);输出字符串:void UI_print_text(UI_string_type text);输出一个字符:void UI_print_character(UI_character_type c);字符串求长:U16 UTF8Strlen(U8 *p);字符串操作函数:字符串查找:strstr字符串拷贝:strcpy字符串定长拷贝:strncpy字符串比较:strcmp字符串定长比较:strncmp字符串续接:strcat字符串定长续接:strncat字符串转化为整型函数:atoi整型转化为字符串函数:itoa关于层建立一个层:GDI_RESULT dm_create_layer_using_outside_memory(S32 x, S32 y, S32 width, S32 height, gdi_handle **handle_ptr, U8 *outside_memory, S32 outside_memory_size, U32 flags);MTK平台上,软件支持四层。
mtk中的一些函数作用

1. HandleIdleScreenDigitEntry()
判断是否处飞行静音模式
2. IdleScreenDigitHandler()
ShowCategory16Screen()建立拨号输入框,并且注册每个按键的响应
执行数字键‘1’的响应:MMI_key_1_down()
g_ucm_p->call_misc.curr_action = MMI_UCM_DIAL;
装载g_ucm_p->call_list.group_info[freeTab]信息(group_id, call_type, call_state)
装载g_ucm_p->call_list.group_info[freeTab].call_info[0]信息
装载消息结构,发送消息:PRT_USSDVSS_REQ(到L4层分析号码)
L4层分析号码后,返回消息:PRT_USSDVSS_RSP,进入CBACK:
1.PsCBackSetCallFeatures()
根据拨出号码,设置到PHB查找,设置gPhoneNumberStruct
判断是否是紧急呼叫:mmi_ucm_is_sos_number()--CheckValidEmergencyNo1()
判断是否是空号码
判断是否已经存在SOS
判断UCM是否忙:mmi_ucm_is_busy()--没有需要处理的Call,没有OUTGOING, INCOMING的group,没有emergency call。
SetCurrentState(CM_OUTGOING_STATE);
AddNewCallInfo()
MakePsInitiateCall((PU8)MsgStruct, (void*)OutgoingCallConnected);
MTK_timer

小结一:MTK timer 有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer 的身影。
一、KAL的timerKAL timer是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,也就是说,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service Routine)),这个中断会回调注册的回调函数。
所以这种timer 使用时,要比较小心,它的优先级很高,在回调函数运行时,其他事件是得不到处理的。
//创建一个timer,参数是timer的名字kal_timerid kal_create_timer(kal_char* timer_name_ptr); void//设置timer 超时时间, timer_id 是 create 返回值,handler_func_ptr是回调函数,handler_param_ptr 是回调函数返回的参数(一般回调函数都是这么设置,这样很灵活),delay,是超时时间,注意这个参数的单位是ticks 不是ms。
reschedule_time 表示是否循环使用timer,0 表示 timer 超时一次就停止,1 表示自动循环启动timer。
kal_set_timer(kal_timerid timer_id, kal_timer_func_ptrhandler_func_ptr, void* handler_param_ptr, kal_uint32 delay, kal_uint32 reschedule_time);二、stack timer这种timer 与 KAL timer 最大的区别是:stack timer 超时后,发送一个超时消息到相应task的消息队列,由task的消息队列来处理这个消息,而不像KAL timer,直接在中断状态回调注册函数。
MTK个人笔记

6、查看进入MTK手机工程模式的指令可在CustResDef.h里,对应值为:SSC_ENGINEERING_MODE。
7、打包命令:armar -r *.a(或者*.lib) *.obj,解包命令:armar -x *.a,执行时都要先运行到obj或者库文件目录下。
22、Idle界面里面的触摸屏函数实现,是通过屏幕模板ShowCategory33Screen实现的,在wgui_categories_idlescreen.c里函数ShowCategory33Screen_ext里有注册,如:
wgui_register_category_screen_control_area_pen_handlers(wgui_cat033_pen_down_handler, MMI_PEN_EVENT_DOWN);注册点下触摸时的响应函数,然后我们可以在此响应函数里设置我们需要的屏幕位置的响应函数。
20、函数TurnOnBacklight(GPIO_BACKLIGHT_SHORT_TIME);用于把手机从背光中开启出来高亮屏幕一小段时间,参数也可换成GPIO_BACKLIGHT_PERMANENT(长久。
21、函数ForceSubLCDScreen(mmi_msg_start_msg_sub_anm)用于强制开启小屏幕提醒界面的,里面的参数只是举例,是提示有新短信收到的,在该函数里还需要调用屏幕模板来实现小窗口,这里用的是ShowCategory304Screen,然后会设置SetSubLCDExitHandler(mmi_msg_callback_msg_sub_anm);停止小窗口。
MTK手机设备驱动编写介绍

•
LCD_delay_HX8306A();\
•
}
•
#define LCD_DataWrite_HX8306A(_data) \
•
{\
•
*(volatile kal_uint32 *) LCD_HX8306A_DATA_ADDR=
((_data & 0xFF00)<<2)|((_data & 0xFF)<<1);\
TD_CTRL);
construct_local_para(sizeof(aux_id_struct),
aux_id_data->aux_id = AUX_ID_FLICK_OFF;
DRV_BuildPrimitive(flick_ilm, MOD_EINT_HISR, MOD_UEM, MSG_ID_AUX_ID, aux_id_data);
3. GPIO使用中需注意的问题
MTK手机设备驱动编写介绍
二.中断的配置与使用
<1>. 中断个数
8个 EINT0, EINT1为专用中断, EINT2-7 与GPIO等功能复用
<2>. 设置中断模式
通过DRV_TOOL或Gpio_init(void)来初始化,也可在程序中通过 GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)随时修改
MTK手机设备驱动编写介绍
audcoeff_default.h
#define DEFAULT_SPEECH_LOUDSPK_MODE_PARA \ {\ 128, 224, 5128, 0, 374, 0, 400, 0 \ }
starty,kal_uint16 endx,kal_uint16 endy) • void LCD_EnterSleep_ST7549T(void) • void LCD_ExitSleep_ST7549T(void) • void LCD_SetContrast_ST7549T(kal_uint8 level)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、域名解析
对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。
MTK 对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下
soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的
module_type mod_id, //调用该函数的模块id,也即将来接收消息的模块
kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用
const kal_char *domain_name,//域名
kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的
kal_uint8 *addr_len,//数据长度
kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了
kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白
)//
补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤
实例代码如下:
typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);
static mf_funcOnGetHostByName mf_dnsFunc = NULL;
#define MF_DNS_APPID 1
static void MF_dns_event(void * inMsg)
{
app_soc_get_host_by_name_ind_struct *dns_ind;
if( inMsg )
{
dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;
if (dns_ind->result == KAL_TRUE)
{
mf_u32 ipAddr = 0;
switch (dns_ind->request_id)
{
case MF_DNS_APPID:
ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);
MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);
if( mf_dnsFunc )
mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);
mf_dnsFunc = NULL;
break;
}
}
}
else if( mf_dnsFunc )
{
mf_dnsFunc(0,0);
}
}
mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func)
{
kal_int8 ret = MF_FALSE;
static kal_uint8 addr_len=0;
kal_uint32 nwk_account_id = mf_skt_account;
static kal_int16 sDNSHandle = MF_DNS_APPID;
static kal_uint32 ipAddr;
mf_dnsFunc = func;
ret = soc_gethostbyname(KAL_FALSE,
MOD_MMI,
(kal_int32)sDNSHandle,
(const kal_char *)server_domain,
(kal_uint8*)&ipAddr,
(kal_uint8*)&addr_len,
(kal_uint8)0,
nwk_account_id);
if (ret == SOC_SUCCESS)
{
kal_uint8 *ptr;
ptr = (kal_uint8*)&ipAddr;
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);
if(hAddr)
*hAddr = MF_ntohl((mf_u32)ipAddr);
if(nAddr)
*nAddr = (mf_u32)ipAddr;
return MF_TRUE;
}
else if(ret == SOC_WOULDBLOCK)
{
SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
}
kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);
return ret;
}
2、定制窗口的使用
一般我们创建mtk应用的时候,多多少少会用到Screen,而我们可以使用MTK自带的categories screen,这些封装好的函数,会完成两件重要的事情
第一是绘制我们自己创建的Screen,第二是检测该类型窗口的事件,当然MTK允许你设置一些事件的处理函数(也即钩子函数,Handler)。
我们可以
在程序创建时调用EntryNewScreen,然后再调用ShowListCategoryScreen,绘制列表框窗口,并注册自己的highlight handler,当然也可,更进一步
即我们可以在这个screen上再绘制别的类型的窗口,比如ShowCategory74Screen,唯一需要注意的是,你需要把自己注册的钩子函数注销(干净的做法);
并且调用ExitListCategoryScreen(),来停止绘制列表框界面,再调用ShowCategory74Screen 开始绘制文本框。
嘿嘿,这个方法很爽的。
不过,有一点
需要注意,就是绘图很慢,显示下一个窗口需要延时显示,即调用ExitListCategoryScreen之后,延时一段时间后再调用ShowCategory74Screen,这样才
不会有“重影”。
补充:需要注意的是新窗口的建立撤销方法,我以实例说明,
static void MF_Scr_Exit(void)
{
MF_Exit_LastCategoriesScreen();
//if(new_scr_id == GetActiveScreenId())
// GoBackHistory();
//else
DeleteScreenIfPresent(new_scr_id);
if ( exit_func )
exit_func();
}
static void MF_Scr_Enter(void)
{
EntryNewScreen(new_scr_id, MF_Scr_Exit, MF_Scr_Enter, NULL);
if( enter_func )
enter_func();
}
EntryNewScreen的第3个参数就是screen的入口函数,必须设置成MF_Scr_Enter本身,否则,什么效果都不会出来,这也是够变态的,至于其原因,我不愿详述。