⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image_sensor.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  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 + -