📄 image_sensor.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
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#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 "lcd_sw_inc.h"
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
#include "tv_out.h"
#endif
#define USE_48MHZ
#define LIMIT_EXPOSURE_LINES (1487)
#define ALWAYS_FULL_RESOLUTION
#define VIDEO_NORMALMODE_30FRAME_RATE (30)
#define VIDEO_NORMALMODE_FRAME_RATE (15)
#define VIDEO_NIGHTMODE_FRAME_RATE (7.5)
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
kal_bool const SHUTTER_PRI_60HZ_TABLE[TV_NO]={
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0};
kal_bool const SHUTTER_PRI_50HZ_TABLE[TV_NO]={
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0};
extern kal_bool const APERTURE_PRI_TABLE[AV_NO];
extern kal_bool const ISO_PRI_TABLE[ISO_NO];
extern kal_uint16 const ISO_INFO_TABLE[ISO_NO];
extern kal_uint8 tv_operation_state;
#endif
/* Global Valuable */
SensorInfo g_CCT_MainSensor=CURRENT_MAIN_SENSOR;
kal_uint8 g_CCT_FirstGrabColor=FIRST_GRAB_COLOR;
kal_uint8 start_grab_x_offset=0, start_grab_y_offset=0,window_high_offset=0;
kal_bool gPVmode=KAL_TRUE, sensor_night_mode=KAL_FALSE, MPEG4_encode_mode=KAL_FALSE, MPEG4_30fps_mode=KAL_FALSE;
kal_uint8 normal_gain=0x20, night_gain=SENSOR_NIGHT_MODE_GAIN;
kal_uint16 PV_dummy_pixels=0, PV_dummy_lines=0, FULL_dummy_pixels=0, FULL_dummy_lines=0;
kal_uint16 exposure_lines=0;
kal_uint16 sensor_global_gain=BASEGAIN, sensor_gain_base=BASEGAIN;
kal_uint16 sensor_gain_array[2][4]={{0x2D, 0x2E, 0x2B, 0x2C},{0, 0, 0, 0}};
kal_uint32 sensor_pclk=13000000;
kal_uint16 sensor_expo_width=1,current_sensor_expo_width=1;
/* MAX/MIN Explosure Lines Used By AE Algorithm */
kal_uint16 MAX_EXPOSURE_LINES=LIMIT_EXPOSURE_LINES;
kal_uint8 MIN_EXPOSURE_LINES = 4;
/* Parameter For Engineer mode function */
kal_uint32 FAC_SENSOR_REG;
kal_uint16 sensor_flip_value;
void write_cmos_sensor(kal_uint32 addr, kal_uint32 para)
{
if((sccb_getMode()==SCCB_HW_8BIT)||(sccb_getMode()==SCCB_SW_8BIT))
sccb_cont_write(addr, MT9D011_READ_REG_ID, para);
else /* 16BIT SCCB*/
sccb_write(addr, para);
} /* write_cmos_sensor() */
kal_uint32 read_cmos_sensor(kal_uint32 addr)
{
kal_uint16 get_byte=0;
if((sccb_getMode()==SCCB_HW_8BIT)||(sccb_getMode()==SCCB_SW_8BIT))
get_byte = sccb_cont_read(addr, MT9D011_READ_REG_ID);
else /* 16BIT SCCB*/
get_byte = sccb_read(addr);
return get_byte;
} /* read_cmos_sensor() */
void write_MT9D011_gain(kal_uint16 gain)
{
volatile signed char i;
kal_uint16 temp_reg, temp_gain;
kal_uint16 temp_min_gain = gain;
for(i=0;i<4;i++)
{
temp_gain=(sensor_gain_array[1][i]*gain)/BASEGAIN;
/* prevent init value error of temp_min_gain > 2 */
if (i==0)
{
temp_min_gain = temp_gain;
}
if((temp_gain>=BASEGAIN) && (temp_gain<(2*BASEGAIN)))
{
temp_reg=(kal_uint16)((temp_gain*32)/BASEGAIN);
if(temp_gain<=temp_min_gain)
{
sensor_global_gain=temp_gain&(~0x1);
temp_min_gain = temp_gain;
}
}
else if((temp_gain>=(2*BASEGAIN)) && (temp_gain<(8*BASEGAIN)))
{
temp_reg=(kal_uint16)((temp_gain*16)/BASEGAIN+128);
if(temp_gain<=temp_min_gain)
{
sensor_global_gain=temp_gain&(~0x3);
temp_min_gain = temp_gain;
}
}
else if((temp_gain>=(8*BASEGAIN)) && (temp_gain<(16*BASEGAIN)))
{
temp_reg=(kal_uint16)((temp_gain*8)/BASEGAIN+384);
if(temp_gain<=temp_min_gain)
{
sensor_global_gain=temp_gain&(~0x7);
temp_min_gain = temp_gain;
}
}
else
{
temp_reg=(kal_uint16)((15.875*BASEGAIN*8)/BASEGAIN+384);
if(temp_gain<=temp_min_gain)
{
sensor_global_gain=(kal_uint16)(15.875*BASEGAIN);
temp_min_gain = temp_gain;
}
}
write_cmos_sensor(sensor_gain_array[0][i],temp_reg);
}
} /* write_MT9D011_gain */
kal_uint16 read_MT9D011_gain(void)
{
volatile signed char i;
kal_uint16 temp_reg, sensor_gain,temp_reg_base;
for(i=0;i<4;i++)
{
temp_reg_base=camera_para.SENSOR.cct[SENSOR_BASEGAIN].para;
temp_reg=camera_para.SENSOR.cct[PRE_GAIN_R_INDEX+i].para;
if(temp_reg>=0x20 && temp_reg<=0x3F)
sensor_gain_array[1][i]=((((temp_reg*BASEGAIN)/32)*temp_reg_base)/32);
else if(temp_reg>=0xA0 && temp_reg<=0xFF)
sensor_gain_array[1][i]=(((((temp_reg-128)*BASEGAIN)/16)*temp_reg_base)/32);
else if(temp_reg>=0x1C0 && temp_reg<=0x1FF)
sensor_gain_array[1][i]=(((((temp_reg-384)*BASEGAIN)/8)*temp_reg_base)/32);
else
ASSERT(0);
}
sensor_gain=(temp_reg_base*BASEGAIN)/32;
return sensor_gain;
} /* read_MT9D011_gain */
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
void init_shutter_pri_table(void)
{
kal_uint8 i;
for(i=0;i<TV_NO;i++)
{
shutter_pri_60hz_info[i]=SHUTTER_PRI_60HZ_TABLE[i];
shutter_pri_50hz_info[i]=SHUTTER_PRI_50HZ_TABLE[i];
}
}
void init_aperture_pri_table(void)
{
kal_uint8 i;
for(i=0;i<AV_NO;i++)
aperture_pri_info[i]=APERTURE_PRI_TABLE[i];
}
void init_iso_pri_table(void)
{
kal_uint8 i;
for(i=0;i<ISO_NO;i++)
{
iso_pri_info[i]=ISO_PRI_TABLE[i];
iso_gain_info[i]=ISO_INFO_TABLE[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -