mtk6225平臺經由ISP支持三星5.0M sensor的調試筆記

2009年曾經在mtk6225平臺上調試了一款帶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處理器簡介:ait838是一款isp(圖像信號處理器)ic,核心是一款arm7 process,提供自動對焦,人臉識別等功能。BB通過i2c與其進行命令類的數據通信,而sensor數據則通過CCIR總線傳輸給BB.

 

 

 

三. mtk6225平臺 camera處理流程學習

 

1.      void cam_event_ind_hdlr(ilm_struct *ilm_ptr)// This function is tohandle 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 tohandle camera capture request.

 

(1)       該函數首先執行exit_camera_preview_process();命令退出preview流程;

 

(2)       ./* copy preview datato 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.  重新定義#defineMAX_CAM_FILE_BUFFER_LEN  (3150*1024)    /* 2700kb for 5.0M*/

 

 

 

3.仿照camera_capture_jpeg_process函數,創建一個新函數,在該函數中對獲取的數據直接存儲,而不經過jpeg編碼流程(由於ait838傳輸過來的已經是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)保存文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章