📄 image_sensor_ov7690.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* image_sensor.c
*
* Project:
* --------
* Maui_sw
*
* Description:
* ------------
* Image sensor driver function
*
****************************************************************************/
#include "drv_comm.h"
#include "IntrCtrl.h"
#include "reg_base.h"
#include "gpio_sw.h"
#include "sccb.h"
#include "isp_if.h"
#include "image_sensor.h"
#include "camera_para.h"
#include "upll_ctrl.h"
#include "med_api.h"
#include "image_sensor_ov7690.h"
/* Global Valuable */
//SensorInfo g_CCT_MainSensor = OV7690_OMNIVISION;
extern kal_uint8 start_grab_x_offset, start_grab_y_offset ;
extern kal_bool gVGAmode , sensor_night_mode, MPEG4_encode_mode, g_bMJPEG_mode;
extern kal_uint8 preview_pclk_division, capture_pclk_division;
extern kal_uint16 dummy_pixels , dummy_lines;
extern kal_uint16 exposure_lines;
extern kal_uint16 sensor_global_gain ;
/* Debug Message, Don't Care */
extern kal_uint16 sensor_frame_rate;
/* MAX/MIN Explosure Lines Used By AE Algorithm */
extern kal_uint16 MAX_EXPOSURE_LINES;
extern kal_uint8 MIN_EXPOSURE_LINES ;
/* Image Sensor ID */
kal_uint16 sensor_id = 0;
/* Lens Type: */
OV7690_LENS_TYPE_ENUM OV7690_LENS_TYPE = Sunny_F28; /* 0: Sunny_F28,
1: Sunny_F24,
2: Phoenix_F28,
3: Phoenix_F24,
4: Dongya_F24
*/
extern kal_bool sensor_cap_state ;
extern kal_uint8 CameraModule_ID_CurSel;
extern kal_uint8 CAMERA_MODULE_NUM;
extern kal_uint8 CameraModule_CurSel;
extern CameraModule CameraModules[];
extern kal_uint8 get_coms_sensor(void);
/* read_cmos_sensor() */
/*****************************************************************************
* FUNCTION
* write_OV7690_shutter
* DESCRIPTION
*
* PARAMETERS
* shutter [IN]
* RETURNS
* void
*****************************************************************************/
void write_OV7690_shutter(kal_uint16 shutter)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
write_cmos_sensor(0x10, shutter & 0xFF);
write_cmos_sensor(0x0f, shutter >> 8);
} /* write_OV7690_shutter */
/*****************************************************************************
* FUNCTION
* read_OV7690_shutter
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint16 read_OV7690_shutter(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
exposure_lines = (read_cmos_sensor(0x0f) << 8) | read_cmos_sensor(0x10);
return exposure_lines;
} /* read_OV7690_shutter */
/*****************************************************************************
* FUNCTION
* write_OV7690_gain
* DESCRIPTION
*
* PARAMETERS
* gain [IN]
* RETURNS
* void
*****************************************************************************/
void write_OV7690_gain(kal_uint16 gain)
{
write_cmos_sensor(0x00,gain);
} /* write_OV7690_gain */
/*****************************************************************************
* FUNCTION
* read_OV7690_gain
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_uint16 read_OV7690_gain(void)
{
kal_uint16 sensor_gain;
sensor_gain=read_cmos_sensor(0x00);
return sensor_gain;
} /* read_OV7690_gain */
/*****************************************************************************
* FUNCTION
* set_OV7690_dummy
* DESCRIPTION
*
* PARAMETERS
* pixels [IN]
* lines [IN]
* RETURNS
* void
*****************************************************************************/
void set_OV7690_dummy(kal_uint16 pixels, kal_uint16 lines)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint16 temp;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
temp = read_cmos_sensor(0x2A);
//This is for 15fps setting , any adjust frame rate is base on this.
pixels += 0x334; //horizontal: 820tp
lines += 0x00; //vertial: 512 lines
write_cmos_sensor(0x2B, pixels & 0xFF);
write_cmos_sensor(0x2C, lines & 0xFF);
write_cmos_sensor(0x2A, ((pixels >> 4) & 0x70) | ((lines >> 8) & 0x0F) | (temp & 0x80));
} /* set_OV7690_dummy */
/*****************************************************************************
* FUNCTION
* init_cmos_sensor
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
* void
*****************************************************************************/
void init_cmos_sensor()
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
//12M PCLK, 15fps~5fps, 8x gain
write_cmos_sensor(0x0c,0x06);//org:0x16
write_cmos_sensor(0x48,0x42);
write_cmos_sensor(0x49,0x0d);//;releated IO voltage.
write_cmos_sensor(0x41,0x43);
write_cmos_sensor(0x81,0xff);
write_cmos_sensor(0x21,0x67);//BD step
write_cmos_sensor(0x16,0x03);
write_cmos_sensor(0x39,0x80);
//;;===Format===;;
write_cmos_sensor(0x11,0x01);//12M pclk
write_cmos_sensor(0x12,0x00);
write_cmos_sensor(0x82,0x03);
write_cmos_sensor(0xd0,0x48);
write_cmos_sensor(0x80,0x7f);
write_cmos_sensor(0x3e,0x30);
write_cmos_sensor(0x22,0x00);
write_cmos_sensor(0x2a,0x30);
write_cmos_sensor(0x2b,0x34);//horizontal: 820tp
write_cmos_sensor(0x2c,0x00);//vertial: 512 lines
write_cmos_sensor(0x15,0xa4);//auto down to 1/3 frame rate, 15fps~5fps
//;;===Resolution===;;
write_cmos_sensor(0x17,0x69);
write_cmos_sensor(0x18,0xa4);
write_cmos_sensor(0x19,0x0c);
write_cmos_sensor(0x1a,0xf6);
write_cmos_sensor(0xc8,0x02);
write_cmos_sensor(0xc9,0x80);//ISP input hsize (640)
write_cmos_sensor(0xca,0x01);
write_cmos_sensor(0xcb,0xe0);//ISP input vsize (480)
write_cmos_sensor(0xcc,0x02);
write_cmos_sensor(0xcd,0x80);//ISP output hsize (640)
write_cmos_sensor(0xce,0x01);
write_cmos_sensor(0xcf,0xe0);//ISP output vsize (480)
//;;===Lens Correction==;
write_cmos_sensor(0x85,0x90);
write_cmos_sensor(0x86,0x18);
write_cmos_sensor(0x87,0xb0);
write_cmos_sensor(0x88,0xA0);
write_cmos_sensor(0x89,0x24);
write_cmos_sensor(0x8a,0x1f);
write_cmos_sensor(0x8b,0x21);
//;;====Color Matrix======
write_cmos_sensor(0xbb,0xac);
write_cmos_sensor(0xbc,0xae);
write_cmos_sensor(0xbd,0x02);
write_cmos_sensor(0xbe,0x1f);
write_cmos_sensor(0xbf,0x93);
write_cmos_sensor(0xc0,0xb1);
write_cmos_sensor(0xc1,0x1A);
//;;===Edge + Denoise====;
write_cmos_sensor(0xb4,0x06);
write_cmos_sensor(0xb7,0x06);
write_cmos_sensor(0xb8,0x04);
write_cmos_sensor(0xb9,0x00);
write_cmos_sensor(0xba,0x04);
//;;====AEC/AGC target===
write_cmos_sensor(0x24,0x90);
write_cmos_sensor(0x25,0x80);
write_cmos_sensor(0x26,0xB4);
//;;=====UV adjust======;
write_cmos_sensor(0x81,0xff);
write_cmos_sensor(0x5A,0x10);
write_cmos_sensor(0x5B,0xA1);
write_cmos_sensor(0x5C,0x3a);
write_cmos_sensor(0x5d,0x20);
//;;====Gamma====;;
write_cmos_sensor(0xa3,0x04);
write_cmos_sensor(0xa4,0x0c);
write_cmos_sensor(0xa5,0x23);
write_cmos_sensor(0xa6,0x55);
write_cmos_sensor(0xa7,0x69);
write_cmos_sensor(0xa8,0x78);
write_cmos_sensor(0xa9,0x80);
write_cmos_sensor(0xaa,0x88);
write_cmos_sensor(0xab,0x90);
write_cmos_sensor(0xac,0x97);
write_cmos_sensor(0xad,0xa4);
write_cmos_sensor(0xae,0xb0);
write_cmos_sensor(0xaf,0xc5);
write_cmos_sensor(0xb0,0xd7);
write_cmos_sensor(0xb1,0xe8);
write_cmos_sensor(0xb2,0x20);
//;;==Advance AWB==;;
write_cmos_sensor(0x8c, 0x5e);
write_cmos_sensor(0x8d, 0x11);
write_cmos_sensor(0x8e, 0x12);
write_cmos_sensor(0x8f, 0x19);
write_cmos_sensor(0x90, 0x50);
write_cmos_sensor(0x91, 0x20);
write_cmos_sensor(0x92, 0x99);
write_cmos_sensor(0x93, 0x8b);
write_cmos_sensor(0x94, 0x13);
write_cmos_sensor(0x95, 0x14);
write_cmos_sensor(0x96, 0xf0);
write_cmos_sensor(0x97, 0x10);
write_cmos_sensor(0x98, 0x34);
write_cmos_sensor(0x99, 0x32);
write_cmos_sensor(0x9a, 0x53);
write_cmos_sensor(0x9b, 0x41);
write_cmos_sensor(0x9c, 0xf0);
write_cmos_sensor(0x9d, 0xf0);
write_cmos_sensor(0x9e, 0xf0);
write_cmos_sensor(0x9f, 0xff);
write_cmos_sensor(0xa0, 0x66);
write_cmos_sensor(0xa1, 0x52);
write_cmos_sensor(0xa2, 0x11);
write_cmos_sensor(0x14,0x21);//8x gain ceiling, PPChrg off
write_cmos_sensor(0xd8,0x50);//saturation
write_cmos_sensor(0xd9,0x50);
write_cmos_sensor(0xd2,0x02);
write_cmos_sensor(0x50,0x48);//50hz banding filter value
write_cmos_sensor(0x51,0x3c);//60hz banding filter value
write_cmos_sensor(0x13,0xf7);
switch (OV7690_LENS_TYPE)
{
case Sunny_F28:
//;;===Lens Correction==;
write_cmos_sensor(0x85,0x90);
write_cmos_sensor(0x86,0x18);
write_cmos_sensor(0x87,0xb0);
write_cmos_sensor(0x88,0xA0);
write_cmos_sensor(0x89,0x24);
write_cmos_sensor(0x8a,0x1f);
write_cmos_sensor(0x8b,0x21);
break;
case Sunny_F24:
//;;===Lens Correction==;
write_cmos_sensor(0x85,0x90);
write_cmos_sensor(0x86,0x18);
write_cmos_sensor(0x87,0x10);
write_cmos_sensor(0x88,0x00);
write_cmos_sensor(0x89,0x32);
write_cmos_sensor(0x8a,0x2c);
write_cmos_sensor(0x8b,0x30);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -