#include <stdint.h>
#include "ov7670.h"
#include "ov7670cfg.h"
#include "sccb.h"


//////////////////////////////////////////////////////////////////////////////////	 
//οguanfu_wang롣
//ALIENTEK MiniSTM32
//OV7670 	   
//ԭ@ALIENTEK
//̳:www.openedv.com
//޸:2012/10/31
//汾V1.0		    							    							  
//////////////////////////////////////////////////////////////////////////////////
		    
//ʼOV7670
//0:ɹ
//ֵ:



uint8_t OV7670_Init(void)
{
	uint8_t temp;
	uint16_t i=0;
	SCCB_Init(400000, 0);        		//ʼSCCB IO
 	if(SCCB_WR_Reg(0x12,0x80))return 1;	//λSCCB	  
	usleep(50000);
	//ȡƷͺ
 	temp=SCCB_RD_Reg(0x0b);   
	if(temp!=0x73)return 2;  
 	temp=SCCB_RD_Reg(0x0a);   
	if(temp!=0x76)return 2;
	//ʼ	  
	for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
	{
	   	SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
	   	usleep(2000);
 	}
   	return 0x00; 	//ok
}

////////////////////////////////////////////////////////////////////////////
//OV7670
//ƽ
//0:Զ
//1:̫sunny
//2,cloudy
//3,칫office
//4,home
void OV7670_Light_Mode(uint8_t mode)
{
	uint8_t reg13val=0XE7;//ĬϾΪԶƽ
	uint8_t reg01val=0;
	uint8_t reg02val=0;
	switch(mode)
	{
		case 1://sunny
			reg13val=0XE5;
			reg01val=0X5A;
			reg02val=0X5C;
			break;	
		case 2://cloudy
			reg13val=0XE5;
			reg01val=0X58;
			reg02val=0X60;
			break;	
		case 3://office
			reg13val=0XE5;
			reg01val=0X84;
			reg02val=0X4c;
			break;	
		case 4://home
			reg13val=0XE5;
			reg01val=0X96;
			reg02val=0X40;
			break;	
	}
	SCCB_WR_Reg(0X13,reg13val);//COM8 
	SCCB_WR_Reg(0X01,reg01val);//AWBɫͨ 
	SCCB_WR_Reg(0X02,reg02val);//AWBɫͨ 
}				  
//ɫ
//0:-2
//1:-1
//2,0
//3,1
//4,2
void OV7670_Color_Saturation(uint8_t sat)
{
	uint8_t reg4f5054val=0X80;//ĬϾsat=2,ɫȵ
 	uint8_t reg52val=0X22;
	uint8_t reg53val=0X5E;
 	switch(sat)
	{
		case 0://-2
			reg4f5054val=0X40;  	 
			reg52val=0X11;
			reg53val=0X2F;	 	 
			break;	
		case 1://-1
			reg4f5054val=0X66;	    
			reg52val=0X1B;
			reg53val=0X4B;	  
			break;	
		case 3://1
			reg4f5054val=0X99;	   
			reg52val=0X28;
			reg53val=0X71;	   
			break;	
		case 4://2
			reg4f5054val=0XC0;	   
			reg52val=0X33;
			reg53val=0X8D;	   
			break;	
	}
	SCCB_WR_Reg(0X4F,reg4f5054val);	//ɫʾϵ1
	SCCB_WR_Reg(0X50,reg4f5054val);	//ɫʾϵ2 
	SCCB_WR_Reg(0X51,0X00);			//ɫʾϵ3  
	SCCB_WR_Reg(0X52,reg52val);		//ɫʾϵ4 
	SCCB_WR_Reg(0X53,reg53val);		//ɫʾϵ5 
	SCCB_WR_Reg(0X54,reg4f5054val);	//ɫʾϵ6  
	SCCB_WR_Reg(0X58,0X9E);			//MTXS 
}
//
//0:-2
//1:-1
//2,0
//3,1
//4,2
void OV7670_Brightness(uint8_t bright)
{
	uint8_t reg55val=0X00;//ĬϾbright=2
  	switch(bright)
	{
		case 0://-2
			reg55val=0XB0;	 	 
			break;	
		case 1://-1
			reg55val=0X98;	 	 
			break;	
		case 3://1
			reg55val=0X18;	 	 
			break;	
		case 4://2
			reg55val=0X30;	 	 
			break;	
	}
	SCCB_WR_Reg(0X55,reg55val);	//ȵ 
}

//Աȶ
//0:-2
//1:-1
//2,0
//3,1
//4,2
void OV7670_Contrast(uint8_t contrast)
{
	uint8_t reg56val=0X40;//ĬϾcontrast=2
  	switch(contrast)
	{
		case 0://-2
			reg56val=0X30;	 	 
			break;	
		case 1://-1
			reg56val=0X38;	 	 
			break;	
		case 3://1
			reg56val=0X50;	 	 
			break;	
		case 4://2
			reg56val=0X60;	 	 
			break;	
	}
	SCCB_WR_Reg(0X56,reg56val);	//Աȶȵ 
}

//Ч
//0:ͨģʽ    
//1,Ƭ
//2,ڰ   
//3,ƫɫ
//4,ƫɫ
//5,ƫɫ
//6,	    
void OV7670_Special_Effects(uint8_t eft)
{
	uint8_t reg3aval=0X04;//ĬΪͨģʽ
	uint8_t reg67val=0XC0;
	uint8_t reg68val=0X80;
	switch(eft)
	{
		case 1://Ƭ
			reg3aval=0X24;
			reg67val=0X80;
			reg68val=0X80;
			break;	
		case 2://ڰ
			reg3aval=0X14;
			reg67val=0X80;
			reg68val=0X80;
			break;	
		case 3://ƫɫ
			reg3aval=0X14;
			reg67val=0Xc0;
			reg68val=0X80;
			break;	
		case 4://ƫɫ
			reg3aval=0X14;
			reg67val=0X40;
			reg68val=0X40;
			break;	
		case 5://ƫɫ
			reg3aval=0X14;
			reg67val=0X80;
			reg68val=0XC0;
			break;	
		case 6://
			reg3aval=0X14;
			reg67val=0XA0;
			reg68val=0X40;
			break;	 
	}
	SCCB_WR_Reg(0X3A,reg3aval);//TSLB 
	SCCB_WR_Reg(0X68,reg67val);//MANU,ֶUֵ 
	SCCB_WR_Reg(0X67,reg68val);//MANV,ֶVֵ 
}	
//ͼ
//QVGAá
void OV7670_Window_Set(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height)
{
	uint16_t endx;
	uint16_t endy;
	uint8_t temp;
	endx=sx+width*2;	//V*2
 	endy=sy+height*2;
	if(endy>784)endy-=784;
	temp=SCCB_RD_Reg(0X03);				//ȡVref֮ǰֵ
	temp&=0XF0;
	temp|=((endx&0X03)<<2)|(sx&0X03);
	SCCB_WR_Reg(0X03,temp);				//Vrefstartend2λ
	SCCB_WR_Reg(0X19,sx>>2);			//Vrefstart8λ
	SCCB_WR_Reg(0X1A,endx>>2);			//Vrefendĸ8λ

	temp=SCCB_RD_Reg(0X32);				//ȡHref֮ǰֵ
	temp&=0XC0;
	temp|=((endy&0X07)<<3)|(sy&0X07);
	SCCB_WR_Reg(0X17,sy>>3);			//Hrefstart8λ
	SCCB_WR_Reg(0X18,endy>>3);			//Hrefendĸ8λ
}
