宁波.Net技术讨论区

调试5.0M sensor模组的笔记

 

在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)保存文件

posted @ 2011-03-16 15:37  山 人  阅读(615)  评论(0编辑  收藏  举报