www.pudn.com > spca5xx-.rar > tv8532.h


/* 
 * Quickcam cameras initialization data
 *
 */

/*
   Initialization data: this is the first set-up data written to the
   device (before the open data).
 */
#define TESTCLK 0x10	// reg 0x2c -> 0x12 //10
#define TESTCOMP 0x90	// reg 0x28 -> 0x80
#define TESTLINE 0x81	// reg 0x29 -> 0x81  
#define QCIFLINE 0x41	// reg 0x29 -> 0x81 
#define TESTPTL 0x14	// reg 0x2D -> 0x14
#define TESTPTH 0x01	// reg 0x2E -> 0x01
#define TESTPTBL 0x12	// reg 0x2F -> 0x0a
#define TESTPTBH 0x01	// reg 0x30 -> 0x01
#define ADWIDTHL 0xe8	// reg 0x0c -> 0xe8
#define ADWIDTHH 0x03	// reg 0x0d -> 0x03
#define ADHEIGHL 0x90	// reg 0x0e -> 0x91 //93
#define ADHEIGHH 0x01	// reg 0x0f -> 0x01
#define EXPOL 0x8f	// reg 0x1c -> 0x8f
#define EXPOH 0x01	// reg 0x1d -> 0x01
#define ADCBEGINL 0x44  // reg 0x10 -> 0x46 //47
#define ADCBEGINH 0x00  // reg 0x11 -> 0x00
#define ADRBEGINL 0x0a  // reg 0x14 -> 0x0b //0x0c
#define ADRBEGINH 0x00  // reg 0x15 -> 0x00
#define TV8532_CMD_UPDATE 0x84

#define TV8532_EEprom_Add 0x03
#define TV8532_EEprom_DataL 0x04
#define TV8532_EEprom_DataM 0x05
#define TV8532_EEprom_DataH 0x06
#define TV8532_EEprom_TableLength 0x07
#define TV8532_EEprom_Write 0x08
#define TV8532_PART_CTRL 0x00
#define TV8532_CTRL 0x01
#define TV8532_CMD_EEprom_Open 0x30
#define TV8532_CMD_EEprom_Close 0x29
#define TV8532_UDP_UPDATE 0x31
#define TV8532_GPIO 0x39
#define TV8532_GPIO_OE 0x3B
#define TV8532_REQ_RegWrite 0x02
#define TV8532_REQ_RegRead 0x03

#define TV8532_ADWIDTH_L 0x0C
#define TV8532_ADWIDTH_H 0x0D
#define TV8532_ADHEIGHT_L 0x0E
#define TV8532_ADHEIGHT_H 0x0F
#define TV8532_EXPOSURE 0x1C
#define TV8532_QUANT_COMP 0x28
#define TV8532_MODE_PACKET 0x29
#define TV8532_SETCLK 0x2C
#define TV8532_POINT_L 0x2D
#define TV8532_POINT_H 0x2E
#define TV8532_POINTB_L 0x2F
#define TV8532_POINTB_H 0x30
#define TV8532_BUDGET_L 0x2A
#define TV8532_BUDGET_H 0x2B
#define TV8532_VID_L 0x34
#define TV8532_VID_H 0x35
#define TV8532_PID_L 0x36
#define TV8532_PID_H 0x37
#define TV8532_DeviceID 0x83
#define TV8532_AD_SLOPE 0x91
#define TV8532_AD_BITCTRL 0x94
#define TV8532_AD_COLBEGIN_L 0x10
#define TV8532_AD_COLBEGIN_H 0x11
#define TV8532_AD_ROWBEGIN_L 0x14
#define TV8532_AD_ROWBEGIN_H 0x15
/***************************************************************/

static void
 tv8532_initPictSetting(struct usb_spca50x *spca50x);
static __u16
 tv8532_getbrightness(struct usb_spca50x *spca50x);
static __u16
 tv8532_setbrightness(struct usb_spca50x *spca50x);
static __u16
 tv8532_setcontrast(struct usb_spca50x *spca50x);
static void
 tv8532_configure (struct usb_spca50x *spca50x);
static int
 tv8532_init(struct usb_spca50x *spca50x);
static void
 tv8532_start(struct usb_spca50x *spca50x);
static void
 tv8532_stop(struct usb_spca50x *spca50x);
/****************************************************************/
static __u32 tv_8532_eeprom_data[]= {
/*add dataL dataM dataH */
0x00010001,0x01018011,0x02050014,0x0305001c,
0x040d001e,0x0505001f,0x06050519,0x0705011b,
0x0805091e,0x090d892e,0x0a05892f,0x0b050dd9,
0x0c0509f1,0
};

static void tv_8532WriteEEprom(struct usb_spca50x *spca50x)
{
	int i =0;
	__u8 reg,data0 ,data1,data2,datacmd;
	struct usb_device *dev=spca50x->dev;
	
datacmd = 0xb0;;
spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO,&datacmd,1);
datacmd = TV8532_CMD_EEprom_Open;
spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_CTRL,&datacmd,1);
//wait_ms(1);
	while(tv_8532_eeprom_data[i]){
		reg = (tv_8532_eeprom_data[i] & 0xFF000000) >> 24;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_Add,®,1);		
		//wait_ms(1);
		data0 = (tv_8532_eeprom_data[i] & 0x000000FF) ;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_DataL,&data0,1);		
		//wait_ms(1);
		data1 = (tv_8532_eeprom_data[i] & 0x0000FF00) >> 8 ;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_DataM,&data1,1);
		//wait_ms(1);
		data2 = (tv_8532_eeprom_data[i] & 0x00FF0000) >> 16;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_DataH,&data2,1);
		//wait_ms(1);
		datacmd = 0;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_Write,&datacmd,1);
		//wait_ms(10);
		i++;
	}
datacmd = i;
spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EEprom_TableLength,&datacmd,1);
//wait_ms(1); //udelay(1000);
datacmd = TV8532_CMD_EEprom_Close;
spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_CTRL,&datacmd,1);
wait_ms(10);
}

static void tv8532_initPictSetting(struct usb_spca50x *spca50x)
{
	/* set the initial value of brightness and contrast 
	on probe */
	spca50x->brightness = 0x018f  << 7;
	spca50x->contrast =0x80 << 8 ;
}

static __u16 tv8532_getbrightness(struct usb_spca50x *spca50x)
{		
	return spca50x->brightness;
}

static __u16 tv8532_setbrightness(struct usb_spca50x *spca50x)
{
	__u8 value[2]={0xfc,0x01};
	__u8 data;
	int brightness = (spca50x->brightness >> 7);
	if(brightness > 0x01FF) brightness = 0x01FF;
	if(brightness < 1 ) brightness = 1;
	value[1] = ((brightness >> 8) & 0xff);
	value[0] = ((brightness) & 0xff);
	spca5xxRegWrite(spca50x->dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); //1c
	data = TV8532_CMD_UPDATE;
	spca5xxRegWrite(spca50x->dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1);
	return 0;
}
static __u16 tv8532_setcontrast(struct usb_spca50x *spca50x)
{	
	return 0;
} 

static void
tv8532_configure (struct usb_spca50x *spca50x)
{
	tv_8532WriteEEprom(spca50x) ;
}


static void tv_8532ReadRegisters(struct usb_spca50x *spca50x)
{
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	//__u16 vid,pid;
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,0x0001,&data,1);
	PDEBUG(1,"register 0x01-> %x",data);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,0x0002,&data,1);
	PDEBUG(1,"register 0x02-> %x",data);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_ADWIDTH_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_ADWIDTH_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_QUANT_COMP,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_MODE_PACKET,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_SETCLK,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_POINT_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_POINT_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_POINTB_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_POINTB_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_BUDGET_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_BUDGET_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_VID_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_VID_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_PID_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_PID_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0,TV8532_DeviceID,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0, TV8532_AD_COLBEGIN_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0, TV8532_AD_COLBEGIN_H,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0, TV8532_AD_ROWBEGIN_L,&data,1);
	spca5xxRegRead(dev,TV8532_REQ_RegRead,0, TV8532_AD_ROWBEGIN_H,&data,1);
}

static void tv_8532_setReg(struct usb_spca50x *spca50x)
{
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	__u8 value [2]= {0,0};
	
	data = ADCBEGINL;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_COLBEGIN_L,&data,1); //0x10
	data = ADCBEGINH; // also digital gain
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_COLBEGIN_H,&data,1);
	data = TV8532_CMD_UPDATE;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1); //0x00<-0x84

	data= 0x0a;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
	/*******************************************************************/
	data= ADHEIGHL;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADHEIGHT_L,&data,1); //0e
	data= ADHEIGHH;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADHEIGHT_H,&data,1); //0f
	value[0] = EXPOL; value[1] =EXPOH; // 350d 0x014c;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); //1c
	data = ADCBEGINL;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_COLBEGIN_L,&data,1); //0x10
	data = ADCBEGINH; // also digital gain
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_COLBEGIN_H,&data,1);
	data = ADRBEGINL;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_ROWBEGIN_L,&data,1); //0x14
	
	data = 0x00;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_SLOPE,&data,1); //0x91
	data = 0x02;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_BITCTRL,&data,1); //0x94
	
	
	data = TV8532_CMD_EEprom_Close;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_CTRL,&data,1); //0x01
	
	data = 0x00;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_SLOPE,&data,1); //0x91
	data = TV8532_CMD_UPDATE;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1); //0x00<-0x84

}

static void tv_8532_PollReg(struct usb_spca50x *spca50x){
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	int i;
	/* strange polling from tgc */
	for (i=0; i< 10; i++){
		data = TESTCLK; //0x48; //0x08;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_SETCLK,&data,1); //0x2c
		data = TV8532_CMD_UPDATE;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1);
		data = 0x01;
		spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1); //0x31
	}
}

static int tv8532_init(struct usb_spca50x *spca50x)
{
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	__u8 dataStart = 0;
	__u8 value [2]= {0,0};
		
	
	data = 0x32;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_SLOPE,&data,1);
	
	data = 0;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_BITCTRL,&data,1);
	
	tv_8532ReadRegisters(spca50x);
	
	data= 0x0b;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
	
	value[0] = ADHEIGHL; value[1]= ADHEIGHH; // 401d 0x0169;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADHEIGHT_L,value,2); //0e
	
	value[0] = EXPOL; value[1] =EXPOH; // 350d 0x014c;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); //1c
	
	data = ADWIDTHL ;// 0x20;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADWIDTH_L,&data,1); //0x0c
	data = ADWIDTHH;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADWIDTH_H,&data,1); // 0x0d
	
	/*******************************************************************/
	data = TESTCOMP; //0x72 compressed mode
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_QUANT_COMP,&data,1); //0x28
	data = TESTLINE; //0x84; // CIF | 4 packet
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_MODE_PACKET,&data,1); //0x29
	
	/*******************************************************************/
	data = TESTCLK; //0x48; //0x08;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_SETCLK,&data,1); //0x2c
	data = TESTPTL;// 0x38; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINT_L,&data,1);//0x2d
	data = TESTPTH;// 0x04;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINT_H ,&data,1); // 0x2e
	dataStart = TESTPTBL; //0x04; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINTB_L ,&dataStart,1); //0x2f
	data = TESTPTBH; //0x04; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINTB_H ,&data,1); //0x30
	data = TV8532_CMD_UPDATE;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1); //0x00<-0x84
	/********************************************************************/
	data = 0x01;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1);//0x31
wait_ms(200);
	data = 0x00;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1); //0x31
	/********************************************************************/
	tv_8532_setReg(spca50x);
	/*******************************************************************/
	data= 0x0b;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
	/*******************************************************************/
	tv_8532_setReg(spca50x);
	/********************************************************************/
	tv_8532_PollReg(spca50x);	
	return 0;
}

static void tv8532_start(struct usb_spca50x *spca50x)
{
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	__u8 dataStart = 0;
	__u8 value [2]= {0,0};
	__u16 err;
	
	data = 0x32;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_SLOPE,&data,1);
	
	data = 0;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_AD_BITCTRL,&data,1);
	
	tv_8532ReadRegisters(spca50x);
	
	data= 0x0b;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
	
	value[0] = ADHEIGHL; value[1]= ADHEIGHH; // 401d 0x0169;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADHEIGHT_L,value,2); //0e
	tv8532_initPictSetting(spca50x);
	//value[0] = EXPOL; value[1] =EXPOH; // 350d 0x014c;
	//spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); //1c
	err = tv8532_setbrightness(spca50x);
	
	data = ADWIDTHL ;// 0x20;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADWIDTH_L,&data,1); //0x0c
	data = ADWIDTHH;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_ADWIDTH_H,&data,1); // 0x0d
	
	/*******************************************************************/
	data = TESTCOMP; //0x72 compressed mode
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_QUANT_COMP,&data,1); //0x28
	if(spca50x->mode){
	data = QCIFLINE; //0x84; // CIF | 4 packet
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_MODE_PACKET,&data,1); //0x29
	} else {
	data = TESTLINE; //0x84; // CIF | 4 packet
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_MODE_PACKET,&data,1); //0x29
	}
	/*******************************************************************/
	data = TESTCLK; //0x48; //0x08;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_SETCLK,&data,1); //0x2c
	data = TESTPTL;// 0x38; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINT_L,&data,1);//0x2d
	data = TESTPTH;// 0x04;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINT_H ,&data,1); // 0x2e
	dataStart = TESTPTBL; //0x04; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINTB_L ,&dataStart,1); //0x2f
	data = TESTPTBH; //0x04; 
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_POINTB_H ,&data,1); //0x30
	data = TV8532_CMD_UPDATE;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_PART_CTRL,&data,1); //0x00<-0x84
	/********************************************************************/
	data = 0x01;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1);//0x31
wait_ms(200);
	data = 0x00;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1); //0x31
	/********************************************************************/
	tv_8532_setReg(spca50x);
	/*******************************************************************/
	data= 0x0b;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
	/*******************************************************************/
	tv_8532_setReg(spca50x);
	/********************************************************************/
	tv_8532_PollReg(spca50x);	
	
	data = 0x00;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_UDP_UPDATE,&data,1); //0x31

}

static void tv8532_stop(struct usb_spca50x *spca50x)
{	
	struct usb_device *dev=spca50x->dev;
	__u8 data = 0;
	
	data= 0x0b;
	spca5xxRegWrite(dev,TV8532_REQ_RegWrite,0,TV8532_GPIO_OE,&data,1);
}