详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_bmw7_24676.html#41074
在25平台上调试了一款带ISP处理器的5.0M sensor 模组,在25上实现了5.0M sensor的预览拍照功能。下面是调试过程中的一些笔记:
一.关于H-sync /V-Sync的知识:
1. 分辨率:比如说640x480,就會有640 个pixel &480 line,那么每个V-sync的信号时间内就会有480个H-sync,而一个H-sync会有640个pixel。但是,每个pixel会有2 byte,所以我们会量到PCLK 在一个H-sync內的数量会有1280个。
2. H-sync /V-Sync的极性polarity: polarity就是资料有效的准备,比方说V-sync上的H-sync有可能在V-sync的low,也有可能在high出现。
二. 所使用的ISP处理器简介:XXX838是一款isp(图像信号处理器)ic,核心是一款arm7 process,提供自动对焦,人脸识别等功能。BB通过i2c与其进行命令类的数据通信,而sensor数据则通过CCIR总线传输给BB.
三. 25平台 camera处理流程学习
1. void cam_event_ind_hdlr(ilm_struct *ilm_ptr)// This function is to handle camera event indication.
在该函数中,通过camera_capture_mem_process(&capture_mem_param)命令从lcd层获取capture数据,然后通过jpeg_encode_process(&jpg_encode)命令将这些数据软编码成jpeg格式的数据。
2. void cam_capture_req_hdlr(ilm_struct *ilm_ptr)// This function is to handle camera capture request.
(1) 该函数首先执行exit_camera_preview_process();命令退出preview流程;
(2) ./* copy preview data to MMI buffer */
memcpy(
(kal_uint8*) cam_context_p->frame_buffer_p,
(kal_uint8*) cam_context_p->int_frame_buffer_p,
cam_context_p->frame_buffer_size);
(3). /* release preview related memory */
cam_release_memory();
3.cam_context_p->capture_buffer_p :所需存储的拍照数据指针
cam_context_p->file_size :所要存储的数据大小
4. 在cam_open_image_file函数中执行命令
cam_context_p->capture_buffer_p = (kal_uint32) med_alloc_ext_mem(buffer_size);
来分配内存。
Capture数据存储指针:capture_isp_param.target_buffer_start_address = (kal_uint32) cam_context_p->capture_buffer_p;
camera_capture_jpeg_process(&capture_isp_param);
isp_capture_jpeg_data.target_buffer_start_address=isp_data->target_buffer_start_address;
sw_jpeg_encode_config_data.jpeg_file_start_address=isp_capture_jpeg_data.target_buffer_start_address;
5. camera capture后的数据传送流程:cam_context_p->intmem_start_address.
(1). capture_isp_param.intmem_start_address = cam_context_p->intmem_start_address =
(kal_uint32) med_alloc_int_mem(cam_capture_mem[0]);//只有45k
capture_isp_param.intmem_size = cam_context_p->intmem_size = (kal_uint32) cam_capture_mem[0];
(2). file_size = camera_capture_jpeg_process(&capture_isp_param); //jpeg编码后的文件大小
(3).isp_capture_jpeg_data.intmem_start_address=isp_data->intmem_start_address;
isp_capture_jpeg_data.intmem_size=isp_data->intmem_size;
(4). intmem_init((kal_uint32 *) isp_capture_jpeg_data.intmem_start_address,
isp_capture_jpeg_data.intmem_size);
(5).sw_jpeg_encode_config_data.intmem_start_address=isp_capture_jpeg_data.intmem_start_address; //将所获取的capture原始数据地址指针赋给软编码的起始地址
四.调试关键点
1. 首先调通I2C通讯,必须确保BB与ISP的I2C通讯正常;
2. 重新定义#define MAX_CAM_FILE_BUFFER_LEN (3150*1024) /* 2700kb for 5.0M */
3.仿照camera_capture_jpeg_process函数,创建一个新函数,在该函数中对获取的数据直接存储,而不经过jpeg编码流程(由于XXX838传输过来的已经是jpeg格式的数据)。
注意:
(1) 在该函数中,要设置:
ENABLE_CAMERA_OUTPUT_TO_MEM;//ISP输出至Memory,
SET_CAMERA_CAPTURE_MODE
/*** Capture,等待VSYNC中断**/
(2).在capture完成后,要DISABLE_CMOS_SESNOR;//关闭sensor信号。
(3).此时,获取的capture的数据已经存储在isp_data->target_buffer_start_address中;
然后读取这些数据,通过0xff ,0xd8判断文件头,0xff ,0xd9判断jpeg文件尾及其长度。
(4)最后,通过kal_int32 cam_close_image_file(kal_uint32 size)保存文件