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

📄 cam_module.c

📁 手机摄像头带jpeg压缩芯片PAP1302有关C语言代码,含ISP
💻 C
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************
*  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 + -