Commit 63fc4a03 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab

V4L/DVB (8438): gspca: Lack of matrix for zc3xx - tas5130c (vf0250).

Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent bb64e86c
...@@ -24,9 +24,6 @@ ...@@ -24,9 +24,6 @@
#include "gspca.h" #include "gspca.h"
#define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 7)
static const char version[] = "2.1.7";
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, " MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>, "
"Serge A. Suchkov <Serge.A.S@tochka.ru>"); "Serge A. Suchkov <Serge.A.S@tochka.ru>");
MODULE_DESCRIPTION("GSPCA ZC03xx/VC3xx USB Camera Driver"); MODULE_DESCRIPTION("GSPCA ZC03xx/VC3xx USB Camera Driver");
...@@ -49,7 +46,7 @@ struct sd { ...@@ -49,7 +46,7 @@ struct sd {
__u8 sharpness; __u8 sharpness;
char qindex; char qindex;
char sensor; /* Type of image sensor chip */ signed char sensor; /* Type of image sensor chip */
/* !! values used in different tables */ /* !! values used in different tables */
#define SENSOR_CS2102 0 #define SENSOR_CS2102 0
#define SENSOR_CS2102K 1 #define SENSOR_CS2102K 1
...@@ -2205,10 +2202,10 @@ static const struct usb_action hdcs2020xb_InitialScale[] = { ...@@ -2205,10 +2202,10 @@ static const struct usb_action hdcs2020xb_InitialScale[] = {
}; };
static const struct usb_action hdcs2020b_50HZ[] = { static const struct usb_action hdcs2020b_50HZ[] = {
{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */ {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
{0xaa, 0x13, 0x0018}, /* 00,13,18,aa */ {0xaa, 0x13, 0x0018}, /* 00,13,18,aa */
{0xaa, 0x14, 0x0001}, /* 00,14,01,aa */ {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */
{0xaa, 0x0e, 0x0005}, /* 00,0e,05,aa */ {0xaa, 0x0e, 0x0005}, /* 00,0e,05,aa */
{0xaa, 0x19, 0x001f}, /* 00,19,1f,aa */ {0xaa, 0x19, 0x001f}, /* 00,19,1f,aa */
{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */ {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */ {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
{0xa0, 0x76, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,76,cc */ {0xa0, 0x76, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,76,cc */
...@@ -2226,10 +2223,10 @@ static const struct usb_action hdcs2020b_50HZ[] = { ...@@ -2226,10 +2223,10 @@ static const struct usb_action hdcs2020b_50HZ[] = {
}; };
static const struct usb_action hdcs2020b_60HZ[] = { static const struct usb_action hdcs2020b_60HZ[] = {
{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */ {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
{0xaa, 0x13, 0x0031}, /* 00,13,31,aa */ {0xaa, 0x13, 0x0031}, /* 00,13,31,aa */
{0xaa, 0x14, 0x0001}, /* 00,14,01,aa */ {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */
{0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */ {0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */
{0xaa, 0x19, 0x00cd}, /* 00,19,cd,aa */ {0xaa, 0x19, 0x00cd}, /* 00,19,cd,aa */
{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */ {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */ {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
{0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,62,cc */ {0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,62,cc */
...@@ -2247,10 +2244,10 @@ static const struct usb_action hdcs2020b_60HZ[] = { ...@@ -2247,10 +2244,10 @@ static const struct usb_action hdcs2020b_60HZ[] = {
}; };
static const struct usb_action hdcs2020b_NoFliker[] = { static const struct usb_action hdcs2020b_NoFliker[] = {
{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */ {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */
{0xaa, 0x13, 0x0010}, /* 00,13,10,aa */ {0xaa, 0x13, 0x0010}, /* 00,13,10,aa */
{0xaa, 0x14, 0x0001}, /* 00,14,01,aa */ {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */
{0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */ {0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */
{0xaa, 0x19, 0x0000}, /* 00,19,00,aa */ {0xaa, 0x19, 0x0000}, /* 00,19,00,aa */
{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */ {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */
{0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */ {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */
{0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */ {0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */
...@@ -4102,27 +4099,27 @@ static const struct usb_action pas106b_Initial_com[] = { ...@@ -4102,27 +4099,27 @@ static const struct usb_action pas106b_Initial_com[] = {
static const struct usb_action pas106b_Initial[] = { /* 176x144 */ static const struct usb_action pas106b_Initial[] = { /* 176x144 */
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
/* Sream and Sensor specific */ /* Sream and Sensor specific */
{0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT}, /* CMOSSensorSelect */ {0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},
/* Picture size */ /* Picture size */
{0xa0, 0x00, ZC3XX_R003_FRAMEWIDTHHIGH}, /* FrameWidthHigh 00 */ {0xa0, 0x00, ZC3XX_R003_FRAMEWIDTHHIGH},
{0xa0, 0xb0, ZC3XX_R004_FRAMEWIDTHLOW}, /* FrameWidthLow B0 */ {0xa0, 0xb0, ZC3XX_R004_FRAMEWIDTHLOW},
{0xa0, 0x00, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* FrameHeightHigh 00 */ {0xa0, 0x00, ZC3XX_R005_FRAMEHEIGHTHIGH},
{0xa0, 0x90, ZC3XX_R006_FRAMEHEIGHTLOW}, /* FrameHightLow 90 */ {0xa0, 0x90, ZC3XX_R006_FRAMEHEIGHTLOW},
/* System */ /* System */
{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* SystemOperating */ {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
/* Sream and Sensor specific */ /* Sream and Sensor specific */
{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* VideoControlFunction */ {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* VideoControlFunction */ {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
/* Sensor Interface */ /* Sensor Interface */
{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* Compatibily Mode */ {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
/* Window inside sensor array */ /* Window inside sensor array */
{0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW}, /* WinXStartLow */ {0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},
{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* FirstYLow */ {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
{0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW}, /* FirstxLow */ {0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},
{0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW}, /* WinHeightLow */ {0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},
{0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW}, /* WinWidthLow */ {0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},
/* Init the sensor */ /* Init the sensor */
{0xaa, 0x02, 0x0004}, {0xaa, 0x02, 0x0004},
{0xaa, 0x08, 0x0000}, {0xaa, 0x08, 0x0000},
...@@ -4135,40 +4132,40 @@ static const struct usb_action pas106b_Initial[] = { /* 176x144 */ ...@@ -4135,40 +4132,40 @@ static const struct usb_action pas106b_Initial[] = { /* 176x144 */
{0xaa, 0x14, 0x0081}, {0xaa, 0x14, 0x0081},
/* Other registors */ /* Other registors */
{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* SensorCorrection */ {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
/* Frame retreiving */ /* Frame retreiving */
{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* AutoAdjustFPS */ {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
/* Gains */ /* Gains */
{0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN}, /* DigitalGain */ {0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},
/* Unknown */ /* Unknown */
{0xa0, 0x00, 0x01ad}, {0xa0, 0x00, 0x01ad},
/* Sharpness */ /* Sharpness */
{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* SharpnessMode */ {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* Sharpness05 */ {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
/* Other registors */ /* Other registors */
{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* OperationMode */ {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* AWBStatus */ {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
/*Dead pixels */ /*Dead pixels */
{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* DeadPixelsMode */ {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
/* EEPROM */ /* EEPROM */
{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* EEPROMAccess */ {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */ {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */ {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
/* Other registers */ /* Other registers */
{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* OperationMode */ {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* AWBStatus */ {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
/*Dead pixels */ /*Dead pixels */
{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* DeadPixelsMode */ {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
/* EEPROM */ /* EEPROM */
{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* EEPROMAccess */ {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */ {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */ {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
{0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */ {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */
{0xa0, 0xf4, ZC3XX_R10B_RGB01}, {0xa0, 0xf4, ZC3XX_R10B_RGB01},
...@@ -4180,67 +4177,67 @@ static const struct usb_action pas106b_Initial[] = { /* 176x144 */ ...@@ -4180,67 +4177,67 @@ static const struct usb_action pas106b_Initial[] = { /* 176x144 */
{0xa0, 0xf4, ZC3XX_R111_RGB21}, {0xa0, 0xf4, ZC3XX_R111_RGB21},
{0xa0, 0x58, ZC3XX_R112_RGB22}, {0xa0, 0x58, ZC3XX_R112_RGB22},
/* Auto correction */ /* Auto correction */
{0xa0, 0x03, ZC3XX_R181_WINXSTART}, /* WinXstart */ {0xa0, 0x03, ZC3XX_R181_WINXSTART},
{0xa0, 0x08, ZC3XX_R182_WINXWIDTH}, /* WinXWidth */ {0xa0, 0x08, ZC3XX_R182_WINXWIDTH},
{0xa0, 0x16, ZC3XX_R183_WINXCENTER}, /* WinXCenter */ {0xa0, 0x16, ZC3XX_R183_WINXCENTER},
{0xa0, 0x03, ZC3XX_R184_WINYSTART}, /* WinYStart */ {0xa0, 0x03, ZC3XX_R184_WINYSTART},
{0xa0, 0x05, ZC3XX_R185_WINYWIDTH}, /* WinYWidth */ {0xa0, 0x05, ZC3XX_R185_WINYWIDTH},
{0xa0, 0x14, ZC3XX_R186_WINYCENTER}, /* WinYCenter */ {0xa0, 0x14, ZC3XX_R186_WINYCENTER},
{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* ExposureLimitHigh */ {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
{0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID}, /* ExposureLimitMid */ {0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},
{0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW}, /* ExposureLimitLow */ {0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},
{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* AntiFlickerHigh */ {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* AntiFlickerLow */ {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
{0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW}, /* AntiFlickerLow */ {0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},
{0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* AEBFreeze */ {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},
{0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* AEBUnfreeze */ {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},
/* sensor on */ /* sensor on */
{0xaa, 0x07, 0x00b1}, {0xaa, 0x07, 0x00b1},
{0xaa, 0x05, 0x0003}, {0xaa, 0x05, 0x0003},
{0xaa, 0x04, 0x0001}, {0xaa, 0x04, 0x0001},
{0xaa, 0x03, 0x003b}, {0xaa, 0x03, 0x003b},
/* Gains */ /* Gains */
{0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* DigitalLimitDiff */ {0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},
{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP}, /* DigitalGainStep */ {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
{0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN}, /* GlobalGain */ {0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN},
{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN}, /* GlobalGain */ {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
/* Auto correction */ /* Auto correction */
{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
{0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */ {0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */
{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
/* Gains */ /* Gains */
{0xa0, 0x40, ZC3XX_R116_RGAIN}, /* RGain */ {0xa0, 0x40, ZC3XX_R116_RGAIN},
{0xa0, 0x40, ZC3XX_R117_GGAIN}, /* GGain */ {0xa0, 0x40, ZC3XX_R117_GGAIN},
{0xa0, 0x40, ZC3XX_R118_BGAIN}, /* BGain */ {0xa0, 0x40, ZC3XX_R118_BGAIN},
{} {}
}; };
static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */ static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
/* Sream and Sensor specific */ /* Sream and Sensor specific */
{0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT}, /* CMOSSensorSelect */ {0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},
/* Picture size */ /* Picture size */
{0xa0, 0x01, ZC3XX_R003_FRAMEWIDTHHIGH}, /* FrameWidthHigh */ {0xa0, 0x01, ZC3XX_R003_FRAMEWIDTHHIGH},
{0xa0, 0x60, ZC3XX_R004_FRAMEWIDTHLOW}, /* FrameWidthLow */ {0xa0, 0x60, ZC3XX_R004_FRAMEWIDTHLOW},
{0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* FrameHeightHigh */ {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},
{0xa0, 0x20, ZC3XX_R006_FRAMEHEIGHTLOW}, /* FrameHightLow */ {0xa0, 0x20, ZC3XX_R006_FRAMEHEIGHTLOW},
/* System */ /* System */
{0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* SystemOperating */ {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},
/* Sream and Sensor specific */ /* Sream and Sensor specific */
{0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* VideoControlFunction */ {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},
{0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* VideoControlFunction */ {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},
/* Sensor Interface */ /* Sensor Interface */
{0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* Compatibily Mode */ {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},
/* Window inside sensor array */ /* Window inside sensor array */
{0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW}, /* WinXStartLow */ {0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},
{0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* FirstYLow */ {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},
{0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW}, /* FirstxLow */ {0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},
{0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW}, /* WinHeightLow */ {0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},
{0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW}, /* WinWidthLow */ {0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},
/* Init the sensor */ /* Init the sensor */
{0xaa, 0x02, 0x0004}, {0xaa, 0x02, 0x0004},
{0xaa, 0x08, 0x0000}, {0xaa, 0x08, 0x0000},
...@@ -4253,41 +4250,41 @@ static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */ ...@@ -4253,41 +4250,41 @@ static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */
{0xaa, 0x14, 0x0081}, {0xaa, 0x14, 0x0081},
/* Other registors */ /* Other registors */
{0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* SensorCorrection */ {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},
/* Frame retreiving */ /* Frame retreiving */
{0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* AutoAdjustFPS */ {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},
/* Gains */ /* Gains */
{0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN}, /* DigitalGain */ {0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},
/* Unknown */ /* Unknown */
{0xa0, 0x00, 0x01ad}, {0xa0, 0x00, 0x01ad},
/* Sharpness */ /* Sharpness */
{0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* SharpnessMode */ {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},
{0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* Sharpness05 */ {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},
/* Other registors */ /* Other registors */
{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* OperationMode */ {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* AWBStatus */ {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
{0xa0, 0x80, ZC3XX_R18D_YTARGET}, /* ????????? */ {0xa0, 0x80, ZC3XX_R18D_YTARGET},
/*Dead pixels */ /*Dead pixels */
{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* DeadPixelsMode */ {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
/* EEPROM */ /* EEPROM */
{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* EEPROMAccess */ {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */ {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */ {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
/* Other registers */ /* Other registers */
{0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* OperationMode */ {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* AWBStatus */ {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},
/*Dead pixels */ /*Dead pixels */
{0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* DeadPixelsMode */ {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},
/* EEPROM */ /* EEPROM */
{0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* EEPROMAccess */ {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},
/* JPEG control */ /* JPEG control */
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* ClockSetting */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */ {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
{0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */ {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},
{0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */ {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */
{0xa0, 0xf4, ZC3XX_R10B_RGB01}, {0xa0, 0xf4, ZC3XX_R10B_RGB01},
...@@ -4299,43 +4296,43 @@ static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */ ...@@ -4299,43 +4296,43 @@ static const struct usb_action pas106b_InitialScale[] = { /* 352x288 */
{0xa0, 0xf4, ZC3XX_R111_RGB21}, {0xa0, 0xf4, ZC3XX_R111_RGB21},
{0xa0, 0x58, ZC3XX_R112_RGB22}, {0xa0, 0x58, ZC3XX_R112_RGB22},
/* Auto correction */ /* Auto correction */
{0xa0, 0x03, ZC3XX_R181_WINXSTART}, /* WinXstart */ {0xa0, 0x03, ZC3XX_R181_WINXSTART},
{0xa0, 0x08, ZC3XX_R182_WINXWIDTH}, /* WinXWidth */ {0xa0, 0x08, ZC3XX_R182_WINXWIDTH},
{0xa0, 0x16, ZC3XX_R183_WINXCENTER}, /* WinXCenter */ {0xa0, 0x16, ZC3XX_R183_WINXCENTER},
{0xa0, 0x03, ZC3XX_R184_WINYSTART}, /* WinYStart */ {0xa0, 0x03, ZC3XX_R184_WINYSTART},
{0xa0, 0x05, ZC3XX_R185_WINYWIDTH}, /* WinYWidth */ {0xa0, 0x05, ZC3XX_R185_WINYWIDTH},
{0xa0, 0x14, ZC3XX_R186_WINYCENTER}, /* WinYCenter */ {0xa0, 0x14, ZC3XX_R186_WINYCENTER},
{0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},
/* Auto exposure and white balance */ /* Auto exposure and white balance */
{0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* ExposureLimitHigh 0 */ {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},
{0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID}, /* ExposureLimitMid */ {0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},
{0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW}, /* ExposureLimitLow 0xb1 */ {0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},
{0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* AntiFlickerHigh 0x00 */ {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},
{0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* AntiFlickerLow 0x00 */ {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},
{0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW}, /* AntiFlickerLow 0x87 */ {0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},
{0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* AEBFreeze 0x10 0x0c */ {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},
{0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* AEBUnfreeze 0x30 0x18 */ {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},
/* sensor on */ /* sensor on */
{0xaa, 0x07, 0x00b1}, {0xaa, 0x07, 0x00b1},
{0xaa, 0x05, 0x0003}, {0xaa, 0x05, 0x0003},
{0xaa, 0x04, 0x0001}, {0xaa, 0x04, 0x0001},
{0xaa, 0x03, 0x003b}, {0xaa, 0x03, 0x003b},
/* Gains */ /* Gains */
{0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* DigitalLimitDiff */ {0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},
{0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP}, /* DigitalGainStep */ {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},
{0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN}, /* GlobalGain */ {0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN},
{0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN}, /* GlobalGain */ {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},
/* Auto correction */ /* Auto correction */
{0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},
{0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */ {0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */
{0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* AutoCorrectEnable */ {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},
/* Gains */ /* Gains */
{0xa0, 0x40, ZC3XX_R116_RGAIN}, /* RGain */ {0xa0, 0x40, ZC3XX_R116_RGAIN},
{0xa0, 0x40, ZC3XX_R117_GGAIN}, /* GGain */ {0xa0, 0x40, ZC3XX_R117_GGAIN},
{0xa0, 0x40, ZC3XX_R118_BGAIN}, /* BGain */ {0xa0, 0x40, ZC3XX_R118_BGAIN},
{0xa0, 0x00, 0x0007}, /* AutoCorrectEnable */ {0xa0, 0x00, 0x0007}, /* AutoCorrectEnable */
{0xa0, 0xff, ZC3XX_R018_FRAMELOST}, /* Frame adjust */ {0xa0, 0xff, ZC3XX_R018_FRAMELOST}, /* Frame adjust */
...@@ -4459,8 +4456,8 @@ static const struct usb_action pb03303x_Initial[] = { ...@@ -4459,8 +4456,8 @@ static const struct usb_action pb03303x_Initial[] = {
{0xa0, 0x50, ZC3XX_R112_RGB22}, {0xa0, 0x50, ZC3XX_R112_RGB22},
{0xa1, 0x01, 0x0008}, {0xa1, 0x01, 0x0008},
{0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */ {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},
{0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */ {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},
{0xa1, 0x01, 0x01c8}, {0xa1, 0x01, 0x01c8},
{0xa1, 0x01, 0x01c9}, {0xa1, 0x01, 0x01c9},
{0xa1, 0x01, 0x01ca}, {0xa1, 0x01, 0x01ca},
...@@ -5984,7 +5981,7 @@ static const struct usb_action tas5130c_vf0250_Initial[] = { ...@@ -5984,7 +5981,7 @@ static const struct usb_action tas5130c_vf0250_Initial[] = {
{0xaa, 0x1b, 0x0000}, /* 00,1b,00,aa, */ {0xaa, 0x1b, 0x0000}, /* 00,1b,00,aa, */
{0xaa, 0x13, 0x0002}, /* 00,13,02,aa, */ {0xaa, 0x13, 0x0002}, /* 00,13,02,aa, */
{0xaa, 0x15, 0x0004}, /* 00,15,04,aa */ {0xaa, 0x15, 0x0004}, /* 00,15,04,aa */
{0xaa, 0x01, 0x0000}, /*?? {0xaa, 0x01, 0x0000}, */
{0xaa, 0x01, 0x0000}, {0xaa, 0x01, 0x0000},
{0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa, */ {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa, */
{0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa, */ {0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa, */
...@@ -6000,8 +5997,8 @@ static const struct usb_action tas5130c_vf0250_Initial[] = { ...@@ -6000,8 +5997,8 @@ static const struct usb_action tas5130c_vf0250_Initial[] = {
{0xaa, 0x0f, 0x00a0}, /* 00,0f,a0,aa, */ {0xaa, 0x0f, 0x00a0}, /* 00,0f,a0,aa, */
{0xaa, 0x10, 0x0000}, /* 00,10,00,aa, */ {0xaa, 0x10, 0x0000}, /* 00,10,00,aa, */
{0xaa, 0x11, 0x00a0}, /* 00,11,a0,aa, */ {0xaa, 0x11, 0x00a0}, /* 00,11,a0,aa, */
{0xa0, 0x00, 0x0039}, /*?? {0xa0, 0x00, 0x0039},
{0xa1, 0x01, 0x0037}, {0xa1, 0x01, 0x0037}, */
{0xaa, 0x16, 0x0001}, /* 00,16,01,aa, */ {0xaa, 0x16, 0x0001}, /* 00,16,01,aa, */
{0xaa, 0x17, 0x00e8}, /* 00,17,e6,aa, (e6 -> e8) */ {0xaa, 0x17, 0x00e8}, /* 00,17,e6,aa, (e6 -> e8) */
{0xaa, 0x18, 0x0002}, /* 00,18,02,aa, */ {0xaa, 0x18, 0x0002}, /* 00,18,02,aa, */
...@@ -6272,7 +6269,7 @@ static void reg_w(struct usb_device *dev, ...@@ -6272,7 +6269,7 @@ static void reg_w(struct usb_device *dev,
__u8 value, __u8 value,
__u16 index) __u16 index)
{ {
PDEBUG(D_USBO, "reg w %02x -> [%04x]", value, index); PDEBUG(D_USBO, "reg w [%04x] = %02x", index, value);
reg_w_i(dev, value, index); reg_w_i(dev, value, index);
} }
...@@ -6280,17 +6277,17 @@ static __u16 i2c_read(struct gspca_dev *gspca_dev, ...@@ -6280,17 +6277,17 @@ static __u16 i2c_read(struct gspca_dev *gspca_dev,
__u8 reg) __u8 reg)
{ {
__u8 retbyte; __u8 retbyte;
__u8 retval[2]; __u16 retval;
reg_w_i(gspca_dev->dev, reg, 0x92); reg_w_i(gspca_dev->dev, reg, 0x92);
reg_w_i(gspca_dev->dev, 0x02, 0x90); /* <- read command */ reg_w_i(gspca_dev->dev, 0x02, 0x90); /* <- read command */
msleep(25); msleep(25);
retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */ retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */
retval[0] = reg_r_i(gspca_dev, 0x0095); /* read Lowbyte */ retval = reg_r_i(gspca_dev, 0x0095); /* read Lowbyte */
retval[1] = reg_r_i(gspca_dev, 0x0096); /* read Hightbyte */ retval |= reg_r_i(gspca_dev, 0x0096) << 8; /* read Hightbyte */
PDEBUG(D_USBO, "i2c r [%02x] -> (%02x) %02x%02x", PDEBUG(D_USBO, "i2c r [%02x] -> %04x (%02x)",
reg, retbyte, retval[1], retval[0]); reg, retval, retbyte);
return (retval[1] << 8) | retval[0]; return retval;
} }
static __u8 i2c_write(struct gspca_dev *gspca_dev, static __u8 i2c_write(struct gspca_dev *gspca_dev,
...@@ -6306,7 +6303,7 @@ static __u8 i2c_write(struct gspca_dev *gspca_dev, ...@@ -6306,7 +6303,7 @@ static __u8 i2c_write(struct gspca_dev *gspca_dev,
reg_w_i(gspca_dev->dev, 0x01, 0x90); /* <- write command */ reg_w_i(gspca_dev->dev, 0x01, 0x90); /* <- write command */
msleep(5); msleep(5);
retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */ retbyte = reg_r_i(gspca_dev, 0x0091); /* read status */
PDEBUG(D_USBO, "i2c w [%02x] %02x%02x (%02x)", PDEBUG(D_USBO, "i2c w [%02x] = %02x%02x (%02x)",
reg, valH, valL, retbyte); reg, valH, valL, retbyte);
return retbyte; return retbyte;
} }
...@@ -6349,6 +6346,8 @@ static void setmatrix(struct gspca_dev *gspca_dev) ...@@ -6349,6 +6346,8 @@ static void setmatrix(struct gspca_dev *gspca_dev)
{0x58, 0xf4, 0xf4, 0xf4, 0x58, 0xf4, 0xf4, 0xf4, 0x58}; {0x58, 0xf4, 0xf4, 0xf4, 0x58, 0xf4, 0xf4, 0xf4, 0x58};
static const __u8 po2030_matrix[9] = static const __u8 po2030_matrix[9] =
{0x60, 0xf0, 0xf0, 0xf0, 0x60, 0xf0, 0xf0, 0xf0, 0x60}; {0x60, 0xf0, 0xf0, 0xf0, 0x60, 0xf0, 0xf0, 0xf0, 0x60};
static const __u8 vf0250_matrix[9] =
{0x7b, 0xea, 0xea, 0xea, 0x7b, 0xea, 0xea, 0xea, 0x7b};
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_GC0305: case SENSOR_GC0305:
...@@ -6363,8 +6362,9 @@ static void setmatrix(struct gspca_dev *gspca_dev) ...@@ -6363,8 +6362,9 @@ static void setmatrix(struct gspca_dev *gspca_dev)
case SENSOR_PO2030: case SENSOR_PO2030:
matrix = po2030_matrix; matrix = po2030_matrix;
break; break;
case SENSOR_TAS5130C_VF0250: /* no matrix? */ case SENSOR_TAS5130C_VF0250:
return; matrix = vf0250_matrix;
break;
default: /* matrix already loaded */ default: /* matrix already loaded */
return; return;
} }
...@@ -6744,7 +6744,7 @@ static int vga_2wr_probe(struct gspca_dev *gspca_dev) ...@@ -6744,7 +6744,7 @@ static int vga_2wr_probe(struct gspca_dev *gspca_dev)
return 0x04; /* CS2102 */ return 0x04; /* CS2102 */
start_2wr_probe(dev, 0x06); /* OmniVision */ start_2wr_probe(dev, 0x06); /* OmniVision */
reg_w(dev, 0x08, 0x8d); reg_w(dev, 0x08, 0x008d);
i2c_write(gspca_dev, 0x11, 0xaa, 0x00); i2c_write(gspca_dev, 0x11, 0xaa, 0x00);
retbyte = i2c_read(gspca_dev, 0x11); retbyte = i2c_read(gspca_dev, 0x11);
if (retbyte != 0) { if (retbyte != 0) {
...@@ -6778,7 +6778,7 @@ static int vga_2wr_probe(struct gspca_dev *gspca_dev) ...@@ -6778,7 +6778,7 @@ static int vga_2wr_probe(struct gspca_dev *gspca_dev)
return 0x0c; /* ICM105A */ return 0x0c; /* ICM105A */
start_2wr_probe(dev, 0x0e); /* PAS202BCB */ start_2wr_probe(dev, 0x0e); /* PAS202BCB */
reg_w(dev, 0x08, 0x8d); reg_w(dev, 0x08, 0x008d);
i2c_write(gspca_dev, 0x03, 0xaa, 0x00); i2c_write(gspca_dev, 0x03, 0xaa, 0x00);
msleep(500); msleep(500);
retbyte = i2c_read(gspca_dev, 0x03); retbyte = i2c_read(gspca_dev, 0x03);
...@@ -6830,7 +6830,6 @@ static const struct sensor_by_chipset_revision chipset_revision_sensor[] = { ...@@ -6830,7 +6830,6 @@ static const struct sensor_by_chipset_revision chipset_revision_sensor[] = {
{0x8001, 0x13}, {0x8001, 0x13},
{0x8000, 0x14}, /* CS2102K */ {0x8000, 0x14}, /* CS2102K */
{0x8400, 0x15}, /* TAS5130K */ {0x8400, 0x15}, /* TAS5130K */
{0, 0}
}; };
static int vga_3wr_probe(struct gspca_dev *gspca_dev) static int vga_3wr_probe(struct gspca_dev *gspca_dev)
...@@ -6843,7 +6842,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) ...@@ -6843,7 +6842,7 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev)
/*fixme: lack of 8b=b3 (11,12)-> 10, 8b=e0 (14,15,16)-> 12 found in gspcav1*/ /*fixme: lack of 8b=b3 (11,12)-> 10, 8b=e0 (14,15,16)-> 12 found in gspcav1*/
reg_w(dev, 0x02, 0x0010); reg_w(dev, 0x02, 0x0010);
reg_r(gspca_dev, 0x10); reg_r(gspca_dev, 0x0010);
reg_w(dev, 0x01, 0x0000); reg_w(dev, 0x01, 0x0000);
reg_w(dev, 0x00, 0x0010); reg_w(dev, 0x00, 0x0010);
reg_w(dev, 0x01, 0x0001); reg_w(dev, 0x01, 0x0001);
...@@ -6869,17 +6868,15 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) ...@@ -6869,17 +6868,15 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev)
PDEBUG(D_PROBE, "probe 3wr vga 1 0x%04x", checkword); PDEBUG(D_PROBE, "probe 3wr vga 1 0x%04x", checkword);
reg_r(gspca_dev, 0x0010); reg_r(gspca_dev, 0x0010);
/* this is tested only once anyway */ /* this is tested only once anyway */
i = 0; for (i = 0; i < ARRAY_SIZE(chipset_revision_sensor); i++) {
while (chipset_revision_sensor[i].revision) {
if (chipset_revision_sensor[i].revision == checkword) { if (chipset_revision_sensor[i].revision == checkword) {
sd->chip_revision = checkword; sd->chip_revision = checkword;
send_unknown(dev, SENSOR_PB0330); send_unknown(dev, SENSOR_PB0330);
return chipset_revision_sensor[i].internal_sensor_id; return chipset_revision_sensor[i].internal_sensor_id;
} }
i++;
} }
reg_w(dev, 0x01, 0x0000); reg_w(dev, 0x01, 0x0000); /* check ?? */
reg_w(dev, 0x01, 0x0001); reg_w(dev, 0x01, 0x0001);
reg_w(dev, 0xdd, 0x008b); reg_w(dev, 0xdd, 0x008b);
reg_w(dev, 0x0a, 0x0010); reg_w(dev, 0x0a, 0x0010);
...@@ -6901,8 +6898,11 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) ...@@ -6901,8 +6898,11 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev)
retbyte = i2c_read(gspca_dev, 0x00); retbyte = i2c_read(gspca_dev, 0x00);
if (retbyte != 0) { if (retbyte != 0) {
PDEBUG(D_PROBE, "probe 3wr vga type %02x", retbyte); PDEBUG(D_PROBE, "probe 3wr vga type %02x", retbyte);
send_unknown(dev, SENSOR_GC0305); if (retbyte == 0x11) /* VF0250 */
return retbyte; /* 0x29 = gc0305 - should continue? */ return 0x0250;
if (retbyte == 0x29) /* gc0305 */
send_unknown(dev, SENSOR_GC0305);
return retbyte;
} }
reg_w(dev, 0x01, 0x0000); /* check OmniVision */ reg_w(dev, 0x01, 0x0000); /* check OmniVision */
...@@ -6918,18 +6918,18 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) ...@@ -6918,18 +6918,18 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev)
return 0x06; /* OmniVision confirm ? */ return 0x06; /* OmniVision confirm ? */
} }
reg_w(dev, 0x01, 0x00); reg_w(dev, 0x01, 0x0000);
reg_w(dev, 0x00, 0x02); reg_w(dev, 0x00, 0x0002);
reg_w(dev, 0x01, 0x10); reg_w(dev, 0x01, 0x0010);
reg_w(dev, 0x01, 0x01); reg_w(dev, 0x01, 0x0001);
reg_w(dev, 0xee, 0x8b); reg_w(dev, 0xee, 0x008b);
reg_w(dev, 0x03, 0x12); reg_w(dev, 0x03, 0x0012);
/* msleep(150); */ /* msleep(150); */
reg_w(dev, 0x01, 0x12); reg_w(dev, 0x01, 0x0012);
reg_w(dev, 0x05, 0x12); reg_w(dev, 0x05, 0x0012);
retbyte = i2c_read(gspca_dev, 0x00); /* ID 0 */ retbyte = i2c_read(gspca_dev, 0x0000); /* ID 0 */
checkword = retbyte << 8; checkword = retbyte << 8;
retbyte = i2c_read(gspca_dev, 0x01); /* ID 1 */ retbyte = i2c_read(gspca_dev, 0x0001); /* ID 1 */
checkword |= retbyte; checkword |= retbyte;
PDEBUG(D_PROBE, "probe 3wr vga 2 0x%04x", checkword); PDEBUG(D_PROBE, "probe 3wr vga 2 0x%04x", checkword);
if (checkword == 0x2030) { if (checkword == 0x2030) {
...@@ -6939,14 +6939,14 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev) ...@@ -6939,14 +6939,14 @@ static int vga_3wr_probe(struct gspca_dev *gspca_dev)
return checkword; return checkword;
} }
reg_w(dev, 0x01, 0x00); reg_w(dev, 0x01, 0x0000);
reg_w(dev, 0x0a, 0x10); reg_w(dev, 0x0a, 0x0010);
reg_w(dev, 0xd3, 0x8b); reg_w(dev, 0xd3, 0x008b);
reg_w(dev, 0x01, 0x01); reg_w(dev, 0x01, 0x0001);
reg_w(dev, 0x03, 0x12); reg_w(dev, 0x03, 0x0012);
reg_w(dev, 0x01, 0x12); reg_w(dev, 0x01, 0x0012);
reg_w(dev, 0x05, 0x01); reg_w(dev, 0x05, 0x0001);
reg_w(dev, 0xd3, 0x8b); reg_w(dev, 0xd3, 0x008b);
retbyte = i2c_read(gspca_dev, 0x01); retbyte = i2c_read(gspca_dev, 0x01);
if (retbyte != 0) { if (retbyte != 0) {
PDEBUG(D_PROBE, "probe 3wr vga type 0a ?"); PDEBUG(D_PROBE, "probe 3wr vga type 0a ?");
...@@ -6962,7 +6962,9 @@ static int zcxx_probeSensor(struct gspca_dev *gspca_dev) ...@@ -6962,7 +6962,9 @@ static int zcxx_probeSensor(struct gspca_dev *gspca_dev)
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_MC501CB: case SENSOR_MC501CB:
return -1; /* don't probe */
case SENSOR_TAS5130C_VF0250: case SENSOR_TAS5130C_VF0250:
/* may probe but with write in reg 0x0010 */
return -1; /* don't probe */ return -1; /* don't probe */
} }
sensor = vga_2wr_probe(gspca_dev); sensor = vga_2wr_probe(gspca_dev);
...@@ -7010,6 +7012,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -7010,6 +7012,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
/* define some sensors from the vendor/product */ /* define some sensors from the vendor/product */
sd->sharpness = 2; sd->sharpness = 2;
sd->sensor = -1;
switch (id->idVendor) { switch (id->idVendor) {
case 0x041e: /* Creative */ case 0x041e: /* Creative */
switch (id->idProduct) { switch (id->idProduct) {
...@@ -7119,6 +7122,10 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -7119,6 +7122,10 @@ static int sd_config(struct gspca_dev *gspca_dev,
PDEBUG(D_PROBE, "Find Sensor GC0305"); PDEBUG(D_PROBE, "Find Sensor GC0305");
sd->sensor = SENSOR_GC0305; sd->sensor = SENSOR_GC0305;
break; break;
case 0x0250:
PDEBUG(D_PROBE, "Sensor Tas5130 (VF0250)");
sd->sensor = SENSOR_TAS5130C_VF0250;
break;
case 0x2030: case 0x2030:
PDEBUG(D_PROBE, "Find Sensor PO2030"); PDEBUG(D_PROBE, "Find Sensor PO2030");
sd->sensor = SENSOR_PO2030; sd->sensor = SENSOR_PO2030;
...@@ -7235,6 +7242,7 @@ static void sd_start(struct gspca_dev *gspca_dev) ...@@ -7235,6 +7242,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
case SENSOR_GC0305: case SENSOR_GC0305:
case SENSOR_OV7620: case SENSOR_OV7620:
case SENSOR_PO2030: case SENSOR_PO2030:
case SENSOR_TAS5130C_VF0250:
msleep(100); /* ?? */ msleep(100); /* ?? */
reg_r(gspca_dev, 0x0002); /* --> 0x40 */ reg_r(gspca_dev, 0x0002); /* --> 0x40 */
reg_w(dev, 0x09, 0x01ad); /* (from win traces) */ reg_w(dev, 0x09, 0x01ad); /* (from win traces) */
...@@ -7605,7 +7613,7 @@ static int __init sd_mod_init(void) ...@@ -7605,7 +7613,7 @@ static int __init sd_mod_init(void)
{ {
if (usb_register(&sd_driver) < 0) if (usb_register(&sd_driver) < 0)
return -1; return -1;
PDEBUG(D_PROBE, "v%s registered", version); PDEBUG(D_PROBE, "registered");
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment