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

📄 image_sensor.c

📁 mtk双摄像头驱动软件
💻 C
📖 第 1 页 / 共 5 页
字号:
		GPIO_WriteIO(1, MODULE_CMPDN_PIN);      // close #1	    
		GPIO_ModeSetup(MODULE_CMPDN_PIN_2, 0);		
		GPIO_WriteIO(0, MODULE_CMPDN_PIN_2);    // open #2
	
		Delayms(300);	//100
	}

}

#endif
/*************************************************************************
* FUNCTION
*	init_GC0306
*
* DESCRIPTION
*	This function initialize the registers of CMOS sensor and ISP control register.
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_int8 init_GC0306(void)
{

	cis_module_power_on(KAL_TRUE);      // Power On CIS Power 

	kal_sleep_task(2);				    // To wait for Stable Power
	
	Delay1(10);
// SCCB high, output
  GPIO_ModeSetup(SCCB_SERIAL_CLK_PIN,0);
  GPIO_ModeSetup(SCCB_SERIAL_DATA_PIN,0);		
  GPIO_WriteIO(1, SCCB_SERIAL_CLK_PIN);		
  GPIO_WriteIO(1, SCCB_SERIAL_DATA_PIN);		      
  GPIO_InitIO(OUTPUT, SCCB_SERIAL_CLK_PIN);		
  GPIO_InitIO(OUTPUT, SCCB_SERIAL_DATA_PIN);	
		
	SET_CMOS_CLOCK_POLARITY_LOW; 
	SET_VSYNC_POLARITY_HIGH;
	SET_HSYNC_POLARITY_LOW;  //LOW is hsync high active!  
	//ENABLE_CAMERA_SENSOR_HVALID_HREF; //test how it work?
	
	ENABLE_CAMERA_INDATA_FORMAT;
	SET_CAMERA_INPUT_TYPE(INPUT_YUV422);
	SET_CAMERA_INPUT_ORDER(INPUT_ORDER_YCbY1Cr);
		
	ENABLE_CAMERA_TG_CLK_48M;
	UPLL_Enable(UPLL_OWNER_ISP);    
	//set_isp_driving_current(camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para);
	set_isp_driving_current(ISP_DRIVING_8MA);
		     
	SET_TG_OUTPUT_CLK_DIVIDER(1);
  SET_CMOS_RISING_EDGE(0);
  SET_CMOS_FALLING_EDGE(1);
	ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
  SET_TG_PIXEL_CLK_DIVIDER(1);
  SET_CMOS_DATA_LATCH(1);  
 		   		    

#ifdef __DUAL_CAMERA_SUPPORT__
	dual_camera_switch();
#endif	
 
		
	sensor_id=(read_cmos_sensor(0x00));
		
	if(sensor_id != GC0306_SENSOR_ID)
	return -1;

	// Initail Sequence Write In.
	//write_cmos_sensor(0x11,0x01);

//write_cmos_sensor(	0x44	,	0xa3	); //e0: CbYCrY, e1:CrYCbY, e3:YCbYCr, e4 YCrYCb
write_cmos_sensor(	0x13	,	0x0	);
//write_cmos_sensor(	0x41	,	0x97	); //HB 0x9f
write_cmos_sensor(	0xf1	,	0x00	); //VB 0x9f
//write_cmos_sensor(	0x0	,	0x11	);			
write_cmos_sensor(	0x1	,	0x8c	);			
write_cmos_sensor(	0x2	,	0x26	);			
write_cmos_sensor(	0x3	,	0x01	);	//0x03		
write_cmos_sensor(	0x4	,	0x0e	);  //0xae			
write_cmos_sensor(	0x5	,	0x0	);			
write_cmos_sensor(	0x6	,	0x0	);			
write_cmos_sensor(	0x7	,	0x0	);			
write_cmos_sensor(	0x8	,	0x0	);			
write_cmos_sensor(	0x9	,	0x1	);			
write_cmos_sensor(	0x0a	,	0xfc	);			
write_cmos_sensor(	0x0b	,	0x2	);			
write_cmos_sensor(	0x0c	,	0x90	);			

write_cmos_sensor(	0x0d	,	0x05	);
write_cmos_sensor(	0x0e	,	0x20	);
write_cmos_sensor(	0x0f	,	0x30	);
write_cmos_sensor(	0x10	,	0x24	);
write_cmos_sensor(	0x11	,	0x10	);

write_cmos_sensor(	0x12	,	0x10	);
//write_cmos_sensor(	0x13	,	0x0	);
write_cmos_sensor(	0x14	,	0x00	);  //0xae			
write_cmos_sensor(	0x15	,	0x08	);			
write_cmos_sensor(	0x16	,	0x04	);			
write_cmos_sensor(	0x17	,	0x0	);			
write_cmos_sensor(	0x18	,	0x2	);			
write_cmos_sensor(	0x19	,	0x00	);			
write_cmos_sensor(	0x1a	,	0x00	);			
write_cmos_sensor(	0x1b	,	0x0	);			
write_cmos_sensor(	0x1c	,	0x02	);			

write_cmos_sensor(	0x1d	,	0x02	);
write_cmos_sensor(	0x1e	,	0x00	);

write_cmos_sensor(	0x40	,	0x7c	);
write_cmos_sensor(	0x41	,	0x3d	); //0x9f
write_cmos_sensor(	0x42	,	0x30	);
write_cmos_sensor(	0x43	,	0x60	);
write_cmos_sensor(	0x44	,	0xe2	); //e0: CbYCrY, e1:CrYCbY, e3:YCbYCr, e4 YCrYCb
write_cmos_sensor(	0x45	,	0x25	);
write_cmos_sensor(	0x46	,	0x20	);
//write_cmos_sensor(	0x47	,	0x0	);
write_cmos_sensor(	0x48	,	0x0	);
//write_cmos_sensor(	0x49	,	0x0	);
//write_cmos_sensor(	0x4a	,	0x0	);
//write_cmos_sensor(	0x4b	,	0x0	);
//write_cmos_sensor(	0x4c	,	0x0	);
//write_cmos_sensor(	0x4d	,	0x0	);
write_cmos_sensor(	0x4e	,	0x23	);     //0X23
write_cmos_sensor(	0x4f	,	0x1a	);

/*write_cmos_sensor(	0x50	,	0x0	);
write_cmos_sensor(	0x51	,	0x20	);
write_cmos_sensor(	0x52	,	0x40	);
write_cmos_sensor(	0x53	,	0x60	);
write_cmos_sensor(	0x54	,	0x80	);
write_cmos_sensor(	0x55	,	0xa0	);
write_cmos_sensor(	0x56	,	0xc0	);
write_cmos_sensor(	0x57	,	0xe0	);*/

write_cmos_sensor(	0x59	,	0xf0	);
write_cmos_sensor(	0x5a	,	0xf0 );
write_cmos_sensor(	0x5b	,	0xf0	);
write_cmos_sensor(	0x5c	,	0xf0 );

write_cmos_sensor(	0x61	,	0x40	); //0x60, 2.0X
write_cmos_sensor(	0x63	,	0x40	); //0x6a
write_cmos_sensor(	0x65	,	0x40	); //0x78
write_cmos_sensor(	0x67	,	0x40	); //0x60
write_cmos_sensor(	0x68	,	0x30	); //0x60 , 2.0X, too big??

write_cmos_sensor(	0x69	,	0x48	);
write_cmos_sensor(	0x6a	,	0xf8	);
write_cmos_sensor(	0x6b	,	0xf4	);
write_cmos_sensor(	0x6c	,	0xfc	);
write_cmos_sensor(	0x6d	,	0x53	);
write_cmos_sensor(	0x6e	,	0xe7	);

write_cmos_sensor(	0x70	,	0x0	);
write_cmos_sensor(	0x71	,	0x10	);
write_cmos_sensor(	0x72	,	0x0	);
write_cmos_sensor(	0x73	,	0x14	);
write_cmos_sensor(	0x74	,	0x0	);
write_cmos_sensor(	0x75	,	0x10	);
write_cmos_sensor(	0x76	,	0x28	);
write_cmos_sensor(	0x77	,	0x3c	);
write_cmos_sensor(	0x78	,	0x50	);

write_cmos_sensor(	0x80	,	0x10	);
write_cmos_sensor(	0x81	,	0x10	);
write_cmos_sensor(	0x82	,	0x34	);
write_cmos_sensor(	0x83	,	0x14	);
write_cmos_sensor(	0x84	,	0x40	);
write_cmos_sensor(	0x85	,	0x04	);
//write_cmos_sensor(	0x86	,	0x0	);
write_cmos_sensor(	0x87	,	0x93	);
write_cmos_sensor(	0x88	,	0x0a	);
write_cmos_sensor(	0x89	,	0x4	);
//write_cmos_sensor(	0x8a	,	0x18	);
write_cmos_sensor(	0x8b	,	0x0a	);
write_cmos_sensor(	0x8c	,	0x12	);
//write_cmos_sensor(	0x8d	,	0x80	);
//write_cmos_sensor(	0x8e	,	0x0	);
//write_cmos_sensor(	0x8f	,	0x0	);


write_cmos_sensor(	0x90	,	0x23	);
write_cmos_sensor(	0x91	,	0x3c	);
write_cmos_sensor(	0x92	,	0x52	);
write_cmos_sensor(	0x93	,	0x74	);
write_cmos_sensor(	0x94	,	0x8e	);
write_cmos_sensor(	0x95	,	0xa2	);
write_cmos_sensor(	0x96	,	0xb2	);
write_cmos_sensor(	0x97	,	0xbf	);
write_cmos_sensor(	0x98	,	0xd2	);
write_cmos_sensor(	0x99	,	0xe2	);
write_cmos_sensor(	0x9a	,	0xee	);
write_cmos_sensor(	0x9b	,	0xf6	);
write_cmos_sensor(	0x9c	,	0xfe	);
write_cmos_sensor(	0x9d	,	0x80	);
write_cmos_sensor(	0x9e	,	0x40	);


write_cmos_sensor(	0xa0	,	0x50	);//saturation
write_cmos_sensor(	0xa1	,	0x40	);//contrast
write_cmos_sensor(	0xa2	,	0x30	);//U saturation
write_cmos_sensor(	0xa3	,	0x30	);//V saturation
write_cmos_sensor(	0xa4	,	0xc0	);
write_cmos_sensor(	0xa5	,	0x2	);
write_cmos_sensor(	0xa6	,	0x60	);
write_cmos_sensor(	0xa7	,	0x4	);
write_cmos_sensor(	0xa8	,	0xf4	);
write_cmos_sensor(	0xa9	,	0x0c	);
write_cmos_sensor(	0xaa	,	0x01	);
write_cmos_sensor(	0xab	,	0x00	);
write_cmos_sensor(	0xac	,	0xf8	);
write_cmos_sensor(	0xad	,	0x10	);
write_cmos_sensor(	0xae	,	0x80	);
write_cmos_sensor(	0xaf	,	0x80	);

write_cmos_sensor(	0xb0	,	0x10	);
write_cmos_sensor(	0xb1	,	0xff	);

write_cmos_sensor(	0xbf	,	0x18	); //AWB_diff_range
write_cmos_sensor(	0xc0	,	0x20	);
write_cmos_sensor(	0xc1	,	0xf0	);
write_cmos_sensor(	0xc2	,	0x07	);
write_cmos_sensor(	0xc3	,	0x80	);
write_cmos_sensor(	0xc4	,	0x1	);
write_cmos_sensor(	0xc5	,	0x21	);//AWB_magin,AWB_speed
write_cmos_sensor(	0xc6	,	0x70	); //AWB_max_gain
//write_cmos_sensor(	0xc7	,	0x0	);
//write_cmos_sensor(	0xc8	,	0x0	);
//write_cmos_sensor(	0xc9	,	0x0	);
write_cmos_sensor(	0xca	,	0x40	);
write_cmos_sensor(	0xcb	,	0x40	);
write_cmos_sensor(	0xcc	,	0x40	);
write_cmos_sensor(	0xcd	,	0x40	); //R_ratio
write_cmos_sensor(	0xce	,	0x40	); //G_ratio
write_cmos_sensor(	0xcf	,	0x40); //B_ratio

write_cmos_sensor(	0xd0	,	0x0	);
write_cmos_sensor(	0xd1	,	0x60	);
write_cmos_sensor(	0xd2	,	0xf4	);
//write_cmos_sensor(	0xd3	,	0x0	);
write_cmos_sensor(	0xd4	,	0x30	);
write_cmos_sensor(	0xd5	,	0xf0	);  
write_cmos_sensor(	0xd6	,	0x58	); //flicker_step ,william change 0625
write_cmos_sensor(	0xd7	,	0x02	); //min_exp_l
write_cmos_sensor(	0xd8	,	0x03	); //max_exp_h william change 0625
write_cmos_sensor(	0xd9	,	0x30	);
write_cmos_sensor(	0xda	,	0x30	);
//write_cmos_sensor(	0xdb	,	0x0	);
//write_cmos_sensor(	0xdc	,	0x0	);
write_cmos_sensor(	0xdd	,	0x40	);
write_cmos_sensor(	0xdf	,	0x90	);

write_cmos_sensor(	0xe0	,	0x5	);
write_cmos_sensor(	0xe1	,	0x5	);
write_cmos_sensor(	0xe2	,	0x34	);
write_cmos_sensor(	0xe3	,	0x24	);
write_cmos_sensor(	0xe4	,	0x14	);
write_cmos_sensor(	0xe5	,	0x11	);
write_cmos_sensor(	0xe6	,	0x24	);
write_cmos_sensor(	0xe7	,	0x18	);

	if(isSelfCaptureOn)	//self capture active
	{
		write_cmos_sensor(	0xf	,	0x20	);//0x30
		write_cmos_sensor(	0x45	,	0x25	);//0x27
	}
	else
	{
		write_cmos_sensor(	0xf	,	0x30	);//0x20
		write_cmos_sensor(	0x45	,	0x24	);//0x26
	}
       
	
	normal_gain=0x00;//read_cmos_sensor(0x00);
	sensor_gain_base=BASEGAIN;//0x40;//read_OV9650_gain(); 

	return 1;
}
/*************************************************************************
* FUNCTION
*	power_off_GC0306
*
* DESCRIPTION
*	This function is to turn off sensor module power.
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/

void power_off_GC0306(void)
{
	//POWER_OFF_MODULE;
	cis_module_power_on(KAL_FALSE);
	#ifndef HW_SCCB
	   SET_SCCB_CLK_LOW;
	   SET_SCCB_DATA_LOW;
	#endif
}	/* power_off_GC0306 */

/*************************************************************************
* FUNCTION
*	get_GC0306_id
*
* DESCRIPTION
*	This function return the sensor read/write id of SCCB interface.
*
* PARAMETERS
*	*sensor_write_id : address pointer of sensor write id
*  *sensor_read_id  : address pointer of sensor read id
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_id(kal_uint8 *sensor_write_id, kal_uint8 *sensor_read_id)
{
	*sensor_write_id=OV9650_WRITE_ID;
	*sensor_read_id=OV9650_READ_ID;
}	/* get_GC0306_id */

/*************************************************************************
* FUNCTION
*	get_GC0306_size
*
* DESCRIPTION
*	This function return the image width and height of image sensor.
*
* PARAMETERS
*	*sensor_width : address pointer of horizontal effect pixels of image sensor
*  *sensor_height : address pointer of vertical effect pixels of image sensor
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_size(kal_uint16 *sensor_width, kal_uint16 *sensor_height)
{
	*sensor_width=IMAGE_SENSOR_VGA_WIDTH;		/* pixel numbers actually used in one frame */
	*sensor_height=IMAGE_SENSOR_VGA_HEIGHT;	      /* line numbers actually used in one frame */
}	/* get_GC0306_size */

/*************************************************************************
* FUNCTION
*	get_GC0306_period
*
* DESCRIPTION
*	This function return the image width and height of image sensor.
*
* PARAMETERS
*	*pixel_number : address pointer of pixel numbers in one period of HSYNC
*  *line_number : address pointer of line numbers in one period of VSYNC
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_period(kal_uint16 *pixel_number, kal_uint16 *line_number)
{
	*pixel_number=VGA_PERIOD_PIXEL_NUMS;		/* pixel numbers in one period of HSYNC */
	*line_number=VGA_PERIOD_LINE_NUMS;			/* line numbers in one period of VSYNC */
}	/* get_GC0306_period */




void GC0306_preview(image_sensor_exposure_window_struct *image_window, image_sensor_config_struct *sensor_config_data)
{
	volatile kal_uint32 CISCTL_mode =read_cmos_sensor(0x0f); //read mirror,upsidedown
	volatile kal_uint32 updown_mirror=(CISCTL_mode&0x30);
	
	kal_uint16 current_shutter;
	
	sensor_cap_state=KAL_FALSE;

	g_bMJPEG_mode = KAL_FALSE;

    // 1. OV0306's clock control register causes sensor output some abnormal frame even if
    // it is written with the same value twice
    // 2. MJPEG preview/capture use the same clock divider, no need to update for
    // MJPEG encode mode
 //   if (sensor_config_data->isp_op_mode != ISP_MJPEG_ENCODE_MODE) {
        //write_cmos_sensor(0x11,0x80);	//MCLK = PCLK
//	}
#if 1
	if((sensor_config_data->isp_op_mode==ISP_MJPEG_PREVIEW_MODE)||
		(sensor_config_data->isp_op_mode==ISP_MJPEG_ENCODE_MODE))
	{
			MPEG4_encode_mode=KAL_FALSE;
			g_bMJPEG_mode = KAL_TRUE;
			write_cmos_sensor(0x01,0x9a); //william change 0625
			write_cmos_sensor(0x02,0x22); 
			write_cmos_sensor(0xd6,0x41);

			/* config TG of ISP to match the setting of image sensor*/
			SET_TG_OUTPUT_CLK_DIVIDER(3);			//10fps
			SET_CMOS_RISING_EDGE(0);
			SET_CMOS_FALLING_EDGE(2);
			ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
			SET_TG_PIXEL_CLK_DIVIDER(3);
			SET_CMOS_DATA_LATCH(2);
			//write_cmos_sensor(0xd8	,0x4	);  

			w_blank=160;
			h_blank=120;
			dummy_pixels=0;
	      		dummy_lines=255;	


	}
	else
	#endif	
	
      #if 1  //chris move it to init_GC0306
	   if(sensor_config_data->frame_rate==0x0F)		// MPEG4 Encode Mode
	    {
		    MPEG4_encode_mode=KAL_TRUE;
			write_cmos_sensor(0x01,0x9a); //william change 0625
			write_cmos_sensor(0x02,0x22); 
			write_cmos_sensor(0xd6,0x41);
		
		    /* config TG of ISP to match the setting of image sensor*/
		SET_TG_OUTPUT_CLK_DIVIDER(3);
	    	SET_CMOS_RISING_EDGE(0);
    		SET_CMOS_FALLING_EDGE(2);
		ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
	    	SET_TG_PIXEL_CLK_DIVIDER(3);
    		SET_CMOS_DATA_LATCH(2);
		//write_cmos_sensor(0xd8	,0x4	);   //flicker_step, div2, 24M

		w_blank=160;
		h_blank=120;

    		dummy_pixels=0;
		    dummy_lines=20;
	    }
	    else
	    {
		    MPEG4_encode_mode=KAL_FALSE;
			write_cmos_sensor(0x01,0x8c); //william change 0625
			write_cmos_sensor(0x02,0x26); 
			write_cmos_sensor(0xd6,0x58);
		
		    /* config TG of ISP to match the setting of image sensor*/
		    SET_TG_OUTPUT_CLK_DIVIDER(2);	//30fps,1, william change 0625
		    SET_CMOS_RISING_EDGE(0);
		    SET_CMOS_FALLING_EDGE(1);         // 1
		   ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
		   //DISABLE_CAMERA_PIXEL_CLKIN_ENABLE;
		    
		    SET_TG_PIXEL_CLK_DIVIDER(2);
		    SET_CMOS_DATA_LATCH(1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -