📄 et61xx51.h
字号:
/*************************************************************************** # Etoms Et61x151 GPL Linux driver by Michel Xhaard (09/09/2004)# This driver is design for embedded Linux hardware but should work happy# on Linux host computer# Etoms compagnies did not provided any help and support# The Linux driver is made by reverse engeneering the usb protocol. # This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## #****************************************************************************/#ifndef ET61XX51_H#define ET61XX51_H#define ETOMS_ALT_SIZE_1000 12#define ET_GPIO_DIR_CTRL 0x04 //Control IO bit[0..5] (0 in 1 out)#define ET_GPIO_OUT 0x05 // Only IO data#define ET_GPIO_IN 0x06 //Read Only IO data#define ET_RESET_ALL 0x03#define ET_ClCK 0x01#define ET_CTRL 0x02 //enable i2c OutClck Powerdown mode#define ET_COMP 0x12 //Compression register#define ET_MAXQt 0x13#define ET_MINQt 0x14#define ET_COMP_VAL0 0x02 #define ET_COMP_VAL1 0x03#define ET_REG1d 0x1d#define ET_REG1e 0x1e#define ET_REG1f 0x1f#define ET_REG20 0x20#define ET_REG21 0x21#define ET_REG22 0x22#define ET_REG23 0x23#define ET_REG24 0x24#define ET_REG25 0x25// base registers for luma calculation#define ET_LUMA_CENTER 0x39#define ET_G_RED 0x4d#define ET_G_GREEN1 0x4e#define ET_G_BLUE 0x4f#define ET_G_GREEN2 0x50#define ET_G_GR_H 0x51#define ET_G_GB_H 0x52#define ET_O_RED 0x34#define ET_O_GREEN1 0x35#define ET_O_BLUE 0x36#define ET_O_GREEN2 0x37#define ET_SYNCHRO 0x68#define ET_STARTX 0x69#define ET_STARTY 0x6a#define ET_WIDTH_LOW 0x6b#define ET_HEIGTH_LOW 0x6c#define ET_W_H_HEIGTH 0x6d#define ET_REG6e 0x6e //OBW#define ET_REG6f 0x6f //OBW#define ET_REG70 0x70 //OBW_AWB#define ET_REG71 0x71 //OBW_AWB#define ET_REG72 0x72 //OBW_AWB#define ET_REG73 0x73 //Clkdelay ns#define ET_REG74 0x74 // test pattern#define ET_REG75 0x75 // test pattern#define ET_I2C_CLK 0x8c#define ET_PXL_CLK 0x60#define ET_I2C_BASE 0x89#define ET_I2C_COUNT 0x8a#define ET_I2C_PREFETCH 0x8b#define ET_I2C_REG 0x88#define ET_I2C_DATA7 0x87#define ET_I2C_DATA6 0x86#define ET_I2C_DATA5 0x85#define ET_I2C_DATA4 0x84#define ET_I2C_DATA3 0x83#define ET_I2C_DATA2 0x82#define ET_I2C_DATA1 0x81#define ET_I2C_DATA0 0x80#define PAS106_REG2 0x02 //pxlClk = systemClk/(reg2)#define PAS106_REG3 0x03 //line/frame H [11..4]#define PAS106_REG4 0x04 //line/frame L [3..0]#define PAS106_REG5 0x05 //exposure time line offset(default 5)#define PAS106_REG6 0x06 //exposure time pixel offset(default 6)#define PAS106_REG7 0x07 //signbit Dac (default 0)#define PAS106_REG9 0x09#define PAS106_REG0e 0x0e //global gain [4..0](default 0x0e)#define PAS106_REG13 0x13 //end i2c writestatic __u8 GainRGBG [] ={0x80,0x80,0x80,0x80,0x00,0x00};static __u8 I2c2 [] ={0x08,0x08,0x08,0x08,0x0d};static __u8 I2c3 [] ={0x12,0x05};static __u8 I2c4 [] ={0x41,0x08};/***************************************************************************//******************* Camera Interface ***********************/static int Et_init (struct usb_spca50x *etx);static void Et_startCamera(struct usb_spca50x *etx);static void Et_stopCamera(struct usb_spca50x *etx);static __u16 Et_setbrightness(struct usb_spca50x *etx);static __u16 Et_getbrightness(struct usb_spca50x *etx);static __u16 Et_setcontrast(struct usb_spca50x *etx);static __u16 Et_getcontrast(struct usb_spca50x *etx);static __u16 Et_setcolors(struct usb_spca50x *etx);static __u16 Et_getcolors(struct usb_spca50x *etx);static void Et_setAutobright (struct usb_spca50x *etx);static int Etxx_config(struct usb_spca50x *spca50x );/******************* Camera private ******************************/static __u8 Et_getgainG (struct usb_spca50x *etx);static void Et_setgainG (struct usb_spca50x *etx, __u8 gain);static int Et_i2cwrite(struct usb_device *dev,__u8 reg,__u8 *buffer,__u16 length,__u8 mode);static int Et_i2cread(struct usb_device *dev,__u8 reg,__u8 *buffer,__u16 length,__u8 mode);static int Et_WaitStatus(struct usb_device *dev);static int Et_videoOff (struct usb_device *dev);static int Et_videoOn (struct usb_device *dev);static void Et_init1 (struct usb_spca50x *etx);/***************************************************************************/static int Et_i2cwrite(struct usb_device *dev,__u8 reg,__u8 *buffer,__u16 length,__u8 mode){/* buffer should be [D0..D7] */int i,j;__u8 base = 0x40; // sensor base for the pas106__u8 ptchcount = 0;ptchcount =(((length & 0x07)<<4) | (mode & 0x03));/* set the base address */Et_RegWrite(dev,0x0,0x0,ET_I2C_BASE,&base,1);/* set count and prefetch */Et_RegWrite(dev,0x0,0x0,ET_I2C_COUNT,&ptchcount,1);/* set the register base */Et_RegWrite(dev,0x0,0x0,ET_I2C_REG,®,1);j = length-1; for (i = 0; i < length;i++){ Et_RegWrite(dev,0x0,0x0,(ET_I2C_DATA0+j),&buffer[j],1); j--; } return 0;}static int Et_i2cread(struct usb_device *dev,__u8 reg,__u8 *buffer,__u16 length,__u8 mode){/* buffer should be [D0..D7] */int i,j;__u8 base = 0x40; // sensor base for the pas106__u8 ptchcount = 0;__u8 prefetch = 0x02;ptchcount =(((length & 0x07)<<4) | (mode & 0x03));/* set the base address */Et_RegWrite(dev,0x0,0x0,ET_I2C_BASE,&base,1);/* set count and prefetch */Et_RegWrite(dev,0x0,0x0,ET_I2C_COUNT,&ptchcount,1);/* set the register base */Et_RegWrite(dev,0x0,0x0,ET_I2C_REG,®,1);Et_RegWrite(dev,0x0,0x0,ET_I2C_PREFETCH,&prefetch,1);prefetch = 0x00;Et_RegWrite(dev,0x0,0x0,ET_I2C_PREFETCH,&prefetch,1);j = length-1; for (i = 0; i < length;i++){ Et_RegRead(dev,0x0,0x0,(ET_I2C_DATA0+j),&buffer[j],1); j--; } return 0;}static int Et_WaitStatus(struct usb_device *dev){ __u8 bytereceived =0; int retry =10; while (retry--){ Et_RegRead(dev,0x0,0x0,ET_ClCK,&bytereceived,1); if (bytereceived != 0) return 1; } return 0;}static int Et_videoOff (struct usb_device *dev){ int err = -1; __u8 stopvideo =0; Et_RegWrite(dev,0x0,0x0,ET_GPIO_OUT,&stopvideo,1); err =Et_WaitStatus(dev); if(!err) PDEBUG(5,"timeout Et_waitStatus VideoON"); return err;}static int Et_videoOn (struct usb_device *dev){ int err = -1; __u8 startvideo =0x10; //set Bit5 Et_RegWrite(dev,0x0,0x0,ET_GPIO_OUT,&startvideo,1); err =Et_WaitStatus(dev); if(!err) PDEBUG(5,"timeout Et_waitStatus VideoOFF"); return err;}static void Et_init2 (struct usb_spca50x *etx){ __u8 value = 0x00; __u8 received = 0x00; __u8 FormLine[] ={0x84,0x03,0x14,0xf4,0x01,0x05}; PDEBUG(5,"Open Init2 ET"); value = 0x2f; Et_RegWrite(etx->dev,0x0,0x0,ET_GPIO_DIR_CTRL,&value,1); value = 0x10; Et_RegWrite(etx->dev,0x0,0x0,ET_GPIO_OUT,&value,1); Et_RegRead(etx->dev,0x0,0x0,ET_GPIO_IN,&received,1); value = 0x14; //0x14 // 0x16 enabled pattern Et_RegWrite(etx->dev,0x0,0x0,ET_ClCK,&value,1); value = 0x1b; Et_RegWrite(etx->dev,0x0,0x0,ET_CTRL,&value,1); /* compression et subsampling */ if (etx->mode){ value = ET_COMP_VAL1; // 320 } else { value = ET_COMP_VAL0; // 640 } Et_RegWrite(etx->dev,0x0,0x0,ET_COMP,&value,1); value = 0x1f; Et_RegWrite(etx->dev,0x0,0x0,ET_MAXQt,&value,1); value = 0x04; Et_RegWrite(etx->dev,0x0,0x0,ET_MINQt,&value,1); /* undocumented registers */ value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,ET_REG1d,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,ET_REG1e,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,ET_REG1f,&value,1); value = 0x35; Et_RegWrite(etx->dev,0x0,0x0,ET_REG20,&value,1); value = 0x01; Et_RegWrite(etx->dev,0x0,0x0,ET_REG21,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_REG22,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,ET_REG23,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,ET_REG24,&value,1); value = 0x0f; Et_RegWrite(etx->dev,0x0,0x0,ET_REG25,&value,1); /* colors setting */ value = 0x11; Et_RegWrite(etx->dev,0x0,0x0,0x30,&value,1); //0x30 value = 0x40; Et_RegWrite(etx->dev,0x0,0x0,0x31,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,0x32,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_O_RED,&value,1); //0x34 value = 0x00; Et_RegWrite(etx->dev,0x0,0x0, ET_O_GREEN1,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_O_BLUE,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_O_GREEN2,&value,1); /*************/ value = 0x80; Et_RegWrite(etx->dev,0x0,0x0,ET_G_RED,&value,1); //0x4d value = 0x80; Et_RegWrite(etx->dev,0x0,0x0, ET_G_GREEN1,&value,1); value = 0x80; Et_RegWrite(etx->dev,0x0,0x0,ET_G_BLUE,&value,1); value = 0x80; Et_RegWrite(etx->dev,0x0,0x0,ET_G_GREEN2,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_G_GR_H,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_G_GB_H,&value,1); //0x52 /* Window control registers */ value = 0x80; /* use cmc_out */ Et_RegWrite(etx->dev,0x0,0x0,0x61,&value,1); value = 0x02; Et_RegWrite(etx->dev,0x0,0x0,0x62,&value,1); value = 0x03; Et_RegWrite(etx->dev,0x0,0x0,0x63,&value,1); value = 0x14; Et_RegWrite(etx->dev,0x0,0x0,0x64,&value,1); value = 0x0e; Et_RegWrite(etx->dev,0x0,0x0,0x65,&value,1); value = 0x02; Et_RegWrite(etx->dev,0x0,0x0,0x66,&value,1); value = 0x02; Et_RegWrite(etx->dev,0x0,0x0,0x67,&value,1); /**************************************/ value = 0x8f; Et_RegWrite(etx->dev,0x0,0x0,ET_SYNCHRO,&value,1); //0x68 value = 0x69; //0x6a //0x69 Et_RegWrite(etx->dev,0x0,0x0,ET_STARTX,&value,1); value = 0x0d; //0x0d //0x0c Et_RegWrite(etx->dev,0x0,0x0,ET_STARTY,&value,1); value = 0x80; Et_RegWrite(etx->dev,0x0,0x0,ET_WIDTH_LOW,&value,1); value = 0xe0; Et_RegWrite(etx->dev,0x0,0x0,ET_HEIGTH_LOW,&value,1); value = 0x60; Et_RegWrite(etx->dev,0x0,0x0,ET_W_H_HEIGTH,&value,1); //6d value = 0x86; Et_RegWrite(etx->dev,0x0,0x0,ET_REG6e,&value,1); value = 0x01; Et_RegWrite(etx->dev,0x0,0x0,ET_REG6f,&value,1); value = 0x26; Et_RegWrite(etx->dev,0x0,0x0,ET_REG70,&value,1); value = 0x7a; Et_RegWrite(etx->dev,0x0,0x0,ET_REG71,&value,1); value = 0x01; Et_RegWrite(etx->dev,0x0,0x0,ET_REG72,&value,1); /* Clock Pattern registers ***************** */ value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,ET_REG73,&value,1); value = 0x18; //0x28 Et_RegWrite(etx->dev,0x0,0x0,ET_REG74,&value,1); value = 0x0f;// 0x01 Et_RegWrite(etx->dev,0x0,0x0,ET_REG75,&value,1); /**********************************************/ value = 0x20; Et_RegWrite(etx->dev,0x0,0x0,0x8a,&value,1); value = 0x0f; Et_RegWrite(etx->dev,0x0,0x0,0x8d,&value,1); value = 0x08; Et_RegWrite(etx->dev,0x0,0x0,0x8e,&value,1); /**************************************/ value = 0x08; Et_RegWrite(etx->dev,0x0,0x0,0x03,&value,1); value = 0x03; Et_RegWrite(etx->dev,0x0,0x0,ET_PXL_CLK,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,0x81,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,0x80,&value,1); value = 0xff; Et_RegWrite(etx->dev,0x0,0x0,0x81,&value,1); value = 0x20; Et_RegWrite(etx->dev,0x0,0x0,0x80,&value,1); value = 0x01; Et_RegWrite(etx->dev,0x0,0x0,0x03,&value,1); value = 0x00; Et_RegWrite(etx->dev,0x0,0x0,0x03,&value,1); value = 0x08; Et_RegWrite(etx->dev,0x0,0x0,0x03,&value,1); /********************************************/ // Et_RegRead(etx->dev,0x0,0x0,ET_I2C_BASE,&received,1); always 0x40 as the pas106 ??? /* set the sensor */ if (etx->mode){ /* 320*/ value = 0x04; Et_RegWrite(etx->dev,0x0,0x0,ET_PXL_CLK,&value,1); /* now set by fifo the FormatLine setting */ Et_RegWrite(etx->dev,0x0,0x0,0x62,FormLine,6); } else { /* 640 */ /* setting PixelClock 0x03 mean 24/(3+1) = 6 Mhz 0x05 -> 24/(5+1) = 4 Mhz 0x0b -> 24/(11+1) = 2 Mhz 0x17 -> 24/(23+1) = 1 Mhz */ value = 0x1e; //0x17 Et_RegWrite(etx->dev,0x0,0x0,ET_PXL_CLK,&value,1); /* now set by fifo the FormatLine setting */ Et_RegWrite(etx->dev,0x0,0x0,0x62,FormLine,6); } value = 0x47; // 0x47; Et_RegWrite(etx->dev,0x0,0x0,0x81,&value,1); // set exposure times [ 0..0x78] 0->longvalue 0x78->shortvalue value = 0x40; // 0x40; Et_RegWrite(etx->dev,0x0,0x0,0x80,&value,1); /* Pedro change */ // Brightness change Brith+ decrease value // Brigth- increase value // original value = 0x70; value = 0x30; // 0x20; Et_RegWrite(etx->dev,0x0,0x0,0x81,&value,1); // set brightness value = 0x20; // 0x20; Et_RegWrite(etx->dev,0x0,0x0,0x80,&value,1); }static void Et_init1 (struct usb_spca50x *etx){ __u8 value = 0x00; __u8 received = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -