📄 spca506.h
字号:
/* * SPCA506 chip based cameras function * M Xhaard 15/04/2004 based on different work Mark Taylor and others * and my own snoopy file on a pv-321c donate by a german compagny * "Firma Frank Gmbh" from Saarbruecken */#ifndef SPCA506_INIT_H#define SPCA506_INIT_H#define SAA7113_bright 0x0A // defaults 0x80#define SAA7113_contrast 0x0B // defaults 0x47#define SAA7113_saturation 0x0C //defaults 0x40#define SAA7113_hue 0x0D //defaults 0x00/* define from v4l *///#define VIDEO_MODE_PAL 0//#define VIDEO_MODE_NTSC 1//#define VIDEO_MODE_SECAM 2//#define VIDEO_MODE_AUTO 3/*********************** Specific spca506 Usbgrabber ************************/static void spca506_init (struct usb_spca50x *spca50x);static void spca506_start (struct usb_spca50x *spca50x);static void spca506_stop (struct usb_spca50x *spca50x);static void spca506_Setsize (struct usb_spca50x *spca50x,__u16 code ,__u16 xmult,__u16 ymult); static void spca506_SetBrightContrastHueColors (struct usb_spca50x *spca50x,__u16 bright ,__u16 contrast, __u16 hue, __u16 colors);static void spca506_GetBrightContrastHueColors (struct usb_spca50x *spca50x, __u16 *bright , __u16 *contrast, __u16 *hue, __u16 *colors);static void spca506_SetNormeInput (struct usb_spca50x *spca50x, __u16 norme,__u16 channel );static void spca506_GetNormeInput (struct usb_spca50x *spca50x, __u16 *norme, __u16 *channel );/****************************************************************************/static void spca506_Initi2c(struct usb_spca50x *spca50x){ spca5xxRegWrite(spca50x->dev,0x07,SAA7113_I2C_BASE_WRITE,0x0004 ,NULL ,0 );}static void spca506_WriteI2c(struct usb_spca50x *spca50x,__u16 valeur,__u16 registre){ int retry = 60; unsigned char Data[2]; spca5xxRegWrite(spca50x->dev,0x07,registre ,0x0001 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x07,valeur ,0x0000 ,NULL ,0 ); while (retry--) { spca5xxRegRead(spca50x->dev,0x07 ,0 ,0x0003 , Data ,2); if ((Data[0] | Data[1]) == 0x00) break; }}static int spca506_ReadI2c(struct usb_spca50x *spca50x, __u16 registre){ int retry = 60; unsigned char Data[2]; unsigned char value = 0; spca5xxRegWrite(spca50x->dev,0x07,SAA7113_I2C_BASE_WRITE,0x0004 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x07,registre ,0x0001 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x07,0x01,0x0002 ,NULL ,0 ); while (retry--) { spca5xxRegRead(spca50x->dev,0x07 ,0 ,0x0003 , Data ,2); if ((Data[0] | Data[1]) == 0x00) break; } if (retry == 0) return -1; spca5xxRegRead(spca50x->dev,0x07 ,0 ,0x0000 , &value ,1); return (int) value;}static void spca506_SetNormeInput (struct usb_spca50x *spca50x,__u16 norme,__u16 channel ){ __u8 setbit0 = 0x00; __u8 setbit1 = 0x00; __u8 videomask = 0x00; PDEBUG( 3, "************ Open Set Norme **************"); spca506_Initi2c(spca50x); /* NTSC bit0 -> 1(525 l) PAL SECAM bit0 -> 0 (625 l)*/ /* Composite channel bit1 -> 1 S-video bit 1 -> 0 */ /* and exclude SAA7113 reserved channel set default 0 otherwise*/ if (norme == VIDEO_MODE_NTSC) setbit0 = 0x01; if( (channel == 4) || (channel == 5) || (channel > 9)) channel = 0; if (channel < 4) setbit1 = 0x02; videomask = (0x48 | setbit0 | setbit1); spca5xxRegWrite(spca50x->dev,0x08,videomask,0x0000 ,NULL ,0 ); spca506_WriteI2c(spca50x,(0xc0 | (channel & 0x0F)),0x02); switch (norme) { case VIDEO_MODE_PAL: spca506_WriteI2c(spca50x,0x03,0x0e);//Chrominance Control PAL BGHIV break; case VIDEO_MODE_NTSC: spca506_WriteI2c(spca50x,0x33,0x0e);//Chrominance Control NTSC N break; case VIDEO_MODE_SECAM: spca506_WriteI2c(spca50x,0x53,0x0e);//Chrominance Control SECAM break; default: spca506_WriteI2c(spca50x,0x03,0x0e);//Chrominance Control PAL BGHIV break; } spca50x->norme=norme; spca50x->channel=channel; PDEBUG( 3, "Set Video Byte to 0x%2X ", videomask ); PDEBUG( 3, "Set Norme : %d Channel %d ", norme , channel ); PDEBUG( 3, "************ Close SetNorme **************"); }static void spca506_GetNormeInput (struct usb_spca50x *spca50x, __u16 *norme,__u16 *channel ){ PDEBUG( 3, "************ Open Get Norme **************"); /* Read the register is not so good value change so we use your own copy in spca50x struct */ *norme = spca50x->norme; *channel = spca50x->channel; PDEBUG( 3, "Get Norme : %d Channel %d ",*norme ,*channel ); PDEBUG( 3, "************ Close Get Norme **************");}static void spca506_init (struct usb_spca50x *spca50x){ PDEBUG( 3, "************ Open Init spca506 **************"); spca5xxRegWrite(spca50x->dev,0x03,0x00 ,0x0004 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0xFF ,0x0003 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x00 ,0x0000 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x1c ,0x0001 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x18 ,0x0001 ,NULL ,0 ); /* Init on PAL and composite input0 */ spca506_SetNormeInput(spca50x,0,0); spca5xxRegWrite(spca50x->dev,0x03,0x1c ,1 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x18 ,0x0001 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x05,0x00 ,0x0000 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x05,0xef ,0x0001 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x05,0x00 ,0x00c1 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x05,0x00 ,0x00c2 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x18 ,0x0002 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0xf5 ,0x0011 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x02 ,0x0012 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0xfb ,0x0013 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x00 ,0x0014 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0xa4 ,0x0051 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x40 ,0x0052 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x71 ,0x0053 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x06,0x40 ,0x0054 ,NULL ,0 ); /***********************************************************/ spca5xxRegWrite(spca50x->dev,0x03,0x00 ,0x0004 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x00 ,0x0003 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x00 ,0x0004 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0xFF ,0x0003 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x02,0x00 ,0x0000 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x60 ,0x0000 ,NULL ,0 ); spca5xxRegWrite(spca50x->dev,0x03,0x18 ,0x0001 ,NULL ,0 ); /* for a better reading mx :) */ /*spca506_WriteI2c(value,register)*/ spca506_Initi2c(spca50x); spca506_WriteI2c(spca50x,0x08,0x01); spca506_WriteI2c(spca50x,0xc0,0x02); // input composite video spca506_WriteI2c(spca50x,0x33,0x03); spca506_WriteI2c(spca50x,0x00,0x04); spca506_WriteI2c(spca50x,0x00,0x05); spca506_WriteI2c(spca50x,0x0d,0x06); spca506_WriteI2c(spca50x,0xf0,0x07); spca506_WriteI2c(spca50x,0x98,0x08); spca506_WriteI2c(spca50x,0x03,0x09); spca506_WriteI2c(spca50x,0x80,0x0a); spca506_WriteI2c(spca50x,0x47,0x0b); spca506_WriteI2c(spca50x,0x48,0x0c); spca506_WriteI2c(spca50x,0x00,0x0d); spca506_WriteI2c(spca50x,0x03,0x0e);// Chroma Pal adjust spca506_WriteI2c(spca50x,0x2a,0x0f); spca506_WriteI2c(spca50x,0x00,0x10); spca506_WriteI2c(spca50x,0x0c,0x11); spca506_WriteI2c(spca50x,0xb8,0x12); spca506_WriteI2c(spca50x,0x01,0x13); spca506_WriteI2c(spca50x,0x00,0x14); spca506_WriteI2c(spca50x,0x00,0x15); spca506_WriteI2c(spca50x,0x00,0x16); spca506_WriteI2c(spca50x,0x00,0x17); spca506_WriteI2c(spca50x,0x00,0x18); spca506_WriteI2c(spca50x,0x00,0x19); spca506_WriteI2c(spca50x,0x00,0x1a); spca506_WriteI2c(spca50x,0x00,0x1b);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -