📄 cam_module.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) 2003
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* cam_module.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This file contains the driver of pap1302 camera module
*
* 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!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "kal_release.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h"
#include "data_buff_pool.h"
#include "stack_config.h"
#include "syscomp_config.h"
#include "drv_comm.h"
#include "reg_base.h"
#include "gpio_sw.h"
#include "ext_camera.h"
#include "cam_module.h"
#include "lcd_if.h"
#include "med_api.h"
extern kal_uint32 SaveAndSetIRQMask(void);
extern void RestoreIRQMask(kal_uint32);
extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
#if (defined(CAMERA_MODULE))
#define OV7660_Initial_Step 85
#define F_LCM_NEW
//======================================================================================================================
//Hsin for OV7660
kal_uint8 OV7660_Reg[OV7660_Initial_Step]={0x12,0x00,0x8d,0x01,0x02,0x03,0x04,0x0c,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1a,
0x1b,0x1e,0x24,0x25,0x26,0x29,0x2b,0x32,0x33,0x34,
0x35,0x36,0x38,0x39,0x3b,0x3c,0x3d,0x3f,0x40,0x41,
0x69,0x6b,0xa1,0x8b,0x8c,0x8d,0x92,0x93,0x9e,0x6c,
0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,
0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80,
0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,
0x92,0x93,0x9d,0x9e,0x2a};
kal_uint8 OV7660_Dat[OV7660_Initial_Step]={0x00,0x00,0xcf,0x8c,0x26,0x00,0x00,0x00,0x84,0x62,
0x00,0x80,0x05,0xf5,0x1e,0x02,0x10,0x61,0x01,0x7b,
0x01,0x01,0x58,0x4e,0x74,0x3c,0x42,0x80,0x00,0x07,
0x84,0x00,0x13,0x43,0xc2,0x68,0x99,0x00,0xc1,0x00,
0x50,0x0a,0x00,0xcc,0xcc,0xcf,0x00,0x00,0x3f,0x90,
0x70,0x60,0x50,0x50,0x48,0x48,0x40,0x48,0x40,0x40,
0x3c,0x3a,0x3a,0x36,0x33,0x09,0x10,0x1c,0x30,0x3a,
0x43,0x4c,0x54,0x5d,0x65,0x75,0x84,0xa1,0xbe,0xd9,
0x80,0x00,0x4c,0x7f,0x00};
//0506
//reg3b = 0xc2 ==>(30fps into night_mode down to 7.5fps)
//0422 setting
//reg9d = 0x4c for 50Hz banding filter value
//0420 setting
//reg92 = Dummy Line low 8bits
//reg93 = Dummy Line high 8bits
//0418 setting
//reg14 = 0x2e ==> 0x1e (AGCmax = 8x -> 4x) to avoid AE-oscillate
//reg26 = 0x73 ==> 0x74 (AGC/AEC Fast mode region) to accelerate AE-speed
//reg8f(PAP1302) = 0x1130 ==> 0x0030 (Defect threshold setting)
//0415 setting
//ps: reg0x1b=1, reg0xa1=0x00 => disable anti-noise function
//ps: reg0x1b=0, reg0xa1=0x08 => enable anti-noise function
//ps: Tuning 0x1b with 1 or 0 to avoid saw-toothed edge issue
//ps: reg0x0f = 0x62 ==> 0x42 (ADBLC disable) ==>But ADBLC_enable create frame error for 2sec.(But ADBLC must enable)
//ps: The Vertical output format always = 488 lines
//ps: reg0x19(Vstart) = 0x02 ==> 0x01
//ps: reg0x1a(Vstop ) = 0x7a ==> 0x7b
//count:(0x7b-0x01)<<2=488(low two bit are in VREF[0:3](=0)
//ps: The horizontal output format always = 648 cols
//ps: reg0x17(Hstart) = 0x11 ==> 0x10
//ps: reg0x18(Hstop ) = 0x61 ==> 0x61
//count:(0x61-0x10)<<3=648(low three bit are in HREF[0:5](=0)
//all more 8 than we need
//====================================================================================================================================
kal_uint16 preview_image_width,preview_image_height;
ext_camera_para_struct pap1302_config_data;
ext_camera_para_struct *pap1302_capture_ptr;
kal_uint8 sensor_flip_status;
kal_uint16 *image_shadow_ptr;
kal_uint8 *jpeg_file_shadow_ptr;
kal_uint32 jpeg_file_size_limit;
kal_uint8 preview_frame_count=0;
#if (!defined(MT6217))
kal_uint32 lcd_if_timing_ctrl_reg=0;
#endif
//kal_uint16 locked_lpf=0x40F;
//kal_uint16 locked_exposure_offset=1;
kal_uint16 locked_OV7660_Exposure_Value=0x40;
kal_uint16 locked_OV7660_LSB_dummy=0x00;
kal_uint16 locked_OV7660_MSB_dummy=0x00;
kal_uint8 digital_zoom_flag=0;
kal_uint8 digital_zoom_factor;
//kal_uint16 pap1302_reg_lpf,pap1302_reg_ny,pap1302_reg_global;
kal_uint16 OV7660_Exposure_Value,OV7660_01H,OV7660_02H,OV7660_69H,OV7660_2DH,OV7660_2EH;
kal_bool wb_selection_auto=KAL_FALSE;
kal_uint8 current_q_factor;
kal_uint8 capture_retry_count=0;
kal_bool burst_capture_mode=KAL_FALSE;
kal_uint8 current_captured_number=0;
kal_uint8 video_clip_drop_frame=0;
kal_bool ASIC_SELECT=KAL_TRUE;
kal_uint16 AWB_R_Gain = 0x01D3;
kal_uint16 AWB_B_Gain = 0x0100;
kal_bool ae_awb_occupy_i2c=KAL_FALSE;
ext_cam_module_func cam_module_func_pap1302=
{ init_pap1302,
pap1302_cmd_mapping,
check_pap1302_status,
check_pap1302_preview_ready,
check_pap1302_capture_ready,
stop_pap1302,
pap1302_preview_frame,
pap1302_stop_preview,
pap1302_capture_frame,
pap1302_encode_frame,
pap1302_set_para,
pap1302_reg_write_if,
pap1302_reg_read_if,
pap1302_frame_rate
};
kal_bool enable_ae_awb(kal_uint8 ae_enable, kal_uint8 awb_enable);
kal_bool disable_ae_awb(kal_bool ae_disable, kal_bool awb_disable);
/*************************************************************************
* FUNCTION
* cam_module_func_config
*
* DESCRIPTION
* This function maps the external camera module function API structure
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void cam_module_func_config(void)
{
ext_cam_func=&cam_module_func_pap1302;
} /* cam_module_func_config() */
/*************************************************************************
* FUNCTION
* pap1302_delay
*
* DESCRIPTION
* Delay loop function for pap1302.
*
* PARAMETERS
* delay_count : delay loop count
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void pap1302_delay(kal_uint32 delay_count)
{
volatile kal_uint32 i;
for (i=0;i<delay_count;i++);
}
void pas302_reg_write(kal_uint8 reg_address,kal_uint8 data)
{
kal_uint16 read_data,read_data1,read_int;
/*
read_data=pap1302_reg_read(0xb3);//save 0x88
read_data &= 0x03FF;
if(read_data>=400)
{
read_int=pap1302_reg_read(0xE2);//save 0xE2
pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
while (!pap1302_READY) {};
pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
pap1302_reg_write(0xE2,read_int);//resotre 0xE2
}
*/
read_data1=pap1302_reg_read(0xE2);
pap1302_reg_write(0xE2,0x0002);//0x8002
pap1302_reg_write(0xEF,0x0001);//select register bank to sensor
pap1302_reg_write(reg_address,data);
pap1302_reg_write(0xEF,0x0000);//select register bank to ASIC
while (1)
{
while (!pap1302_READY)
{}; /* wait for I2C transfer complete */
read_data=pap1302_reg_read(pap1302_INTERRUPT_FLAG_ADDR);
if (read_data & 0x02)
{
pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0); /* clear interrupt flag */
break;
}
}
pap1302_reg_write(0xE2,read_data1);
} /* pas302_reg_write() */
//============================================================================
void pap1302_reg_write(kal_uint8 reg_address,kal_uint16 data)
{
//kal_prompt_trace(MOD_MED,"Call pap1302_reg_write");
pap1302_WRITE_CMD(pap1302_REG_WRITE_ADDR);
pap1302_delay(0x2);
pap1302_WRITE_CMD(reg_address);
pap1302_delay(0x2);
pap1302_WRITE_DATA((kal_uint8) (data&0xFF));
pap1302_delay(0x2);
pap1302_WRITE_DATA((kal_uint8) ((data&0xFF00)>>8));
}
kal_uint16 OV7660_reg_read(kal_uint8 reg_address)//for OV7660 read Reg.
{
kal_uint16 read_data,read_int,read_88H;
kal_uint16 read_data1,read_data2;
kal_uint16 read_data_1th,read_data_2th,read_data_3th;
read_data=pap1302_reg_read(0xb3);//save 0x88
read_data &= 0x03FF;
if(read_data>=400)
{
read_int=pap1302_reg_read(0xE2);//save 0xE2
pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
while (!pap1302_READY) {};
pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
pap1302_reg_write(0xE2,read_int);//resotre 0xE2
}
read_88H=pap1302_reg_read(0x88);//save 0x88
read_int=pap1302_reg_read(0xE2);//save 0xE2
//pap1302_reg_write(0x88,read_88H&0xFEFF);//disable AWB
pap1302_reg_write(0xE2,0x0002);//enable I2C_Acs_End Interrupt
//patch
pap1302_reg_write(0x97,0x000f);
pap1302_delay(0x100);
pap1302_reg_write(0x97,0x007f);
pap1302_reg_write(0xEF,0x0001);//select register bank to sensor
// 1th read
pap1302_WRITE_CMD(pap1302_REG_READ_ADDR);//0xF9
pap1302_delay(0x2);
pap1302_WRITE_CMD(reg_address);//sensor_address
pap1302_delay(0x2);
while (!pap1302_READY) {};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -