chrisking 发表于 2010-1-11 21:56:00近来准备驱动通过EMI驱动一个LCD屏,加上一颗4W的sensor,研究了下CAMERA的流程。
以23C的平台为例子。
1. mmi_camera_entry_app_screen 进入MMI,CAMERA进行分配动态内存,供采集数据处理。
2. mmi_camera_entry_app_screen_internal,进入判断T卡等环境相关,---》CAMERA_ENTER_STATE(CAMERA_STATE_PREVIEW),进入预览状态,mmi_camera_entry_preview_state,获取用户的对CAMERA的设置参数,如大小,特效等参数。同时,注册进入CAMERA后的快捷键,为CAMERA的界面,画OSD层,画出左右软键到OSD LAYER的BUFFER中,通过该函数mmi_camera_preview_set_blt_layer合并OSD层和基层,通过函数gdi_layer_blt_previous实现把合并后的层数据刷到LCD上。
3. mmi_camera_preview_start,开始进入CAMERA预览状态,获得并初始化CAMERA驱动所要的设置参数(camera_setting_data),通过gdi_layer_push_and_set_active函数激活CAMERA的PREVIEW层,也就是预览时的BUFFER用来保存SENSOR输出的数据。
4. mdi_camera_preview_start, --》mdi_camera_preview_start_internal,设置好状态,准备打开SENSOR了,取得驱动需要的各种参数(cam_preview_data),
5. media_cam_preview,发送消息到下层,通知打开SENSOR,设置好CAMERA预览的事件,
6. cam_preview_req_hdlr,下层开始启动CAMERA预览事件。
接下来,预览的刷屏都是通过SENSOR的VSYC接到中断上来实现的,每来个VSYC中断,把PREVIEW LAYER的BUFFER,经过YUV-RGB的转换,通过DMA配置来刷到LCD上。
由于MTK把刷屏的那部分没有开放,所以跟到6就跟不下去了,在6那里有几个CAM_SET_EVENT(CAM_EVT_PREVIEW);由于对MTK的操作系统不是很熟悉,不知道这句话是什么意思,#define CAM_SET_EVENT(evt_) do{ /
kal_set_eg_events(cam_context_p->cam_event, (evt_),KAL_OR);/
CAM_SET_EVT(evt_,__LINE__); /
} while(0)
这个应该是个NUCLEUS中的事件机制,但是研究不深,还得好好阅读下NUCLUES。
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_chrisking_22693.html