📄 zc3xx.h
字号:
static __u16 zc3xx_getbrightness(struct usb_spca50x *spca50x){ spca50x->brightness = 0x80 << 8; spca50x->contrast = 0x80 << 8; return spca50x->brightness;}static __u16 zc3xx_getcontrast(struct usb_spca50x *spca50x){ return spca50x->contrast;}static void zc3xx_setbrightness(struct usb_spca50x *spca50x){ __u8 brightness; brightness = spca50x->brightness >> 8; spca5xxRegWrite(spca50x->dev, 0xa0, brightness, 0x011d, NULL, 0); if (brightness < 0x70) { spca5xxRegWrite(spca50x->dev, 0xa0, brightness + 0x10, 0x018d, NULL, 0); } else { spca5xxRegWrite(spca50x->dev, 0xa0, 0x80, 0x018d, NULL, 0); }}static void zc3xx_setcontrast(struct usb_spca50x *spca50x){ __u16 contrast; __u8 * Tgamma = Tgamma_default; __u8 * Tgradient = Tgradient_default; int gm0 = 0; int gr0 = 0; int index = 0; int i; int GammaSettingsID; if( force_gamma_id != -1) { if(force_gamma_id >= Last_Gamma || force_gamma_id < -1 ) { GammaSettingsID = Default_Gamma; force_gamma_id = -1; } else { GammaSettingsID = force_gamma_id; } } else switch (spca50x->sensor) { case SENSOR_MC501CB: GammaSettingsID = MC501CB_Gamma; break; case SENSOR_TAS5130C_VF0250: GammaSettingsID = VF0250_Gamma; break; case SENSOR_CS2102: GammaSettingsID = CS2102_Gamma; break; default: GammaSettingsID = Default_Gamma; } switch (GammaSettingsID) { case MC501CB_Gamma: Tgamma = Tgamma_MC501CB; Tgradient = Tgradient_MC501CB; break; case VF0250_Gamma: Tgamma = Tgamma_VF0250; Tgradient = Tgradient_VF0250; break; case CS2102_Gamma: Tgamma = Tgamma_CS2102; Tgradient = Tgradient_CS2102; break; case Default_Gamma: Tgamma = Tgamma_default; Tgradient = Tgradient_default; break; } /* now get the index of gamma table */ contrast = zc3xx_getcontrast(spca50x); if ((index = contrast >> 13) > 6) index = 6; PDEBUG(2, "starting new table index %d ", index); for (i = 0; i < 16; i++) { gm0 = Tgamma[i] * index >> 2; gr0 = Tgradient[i] * index >> 2; spca5xxRegWrite(spca50x->dev, 0xa0, CLAMP(gm0), 0x0120 + i, NULL, 0); // brightness spca5xxRegWrite(spca50x->dev, 0xa0, CLAMP(gr0), 0x0130 + i, NULL, 0); // contrast //PDEBUG(0,"i %d gamma %d gradient %d",i ,Tgamma[i],Tgradient[i]); }}static int zc3xx_init(struct usb_spca50x *spca50x){ spca5xxRegWrite(spca50x->dev, 0xa0, 0x01, 0x0000, NULL, 0); return 0;}static void set_zc3xxVGA(struct usb_spca50x *spca50x){ memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam)); spca50x->mode_cam[VGA].width = 640; spca50x->mode_cam[VGA].height = 480; spca50x->mode_cam[VGA].t_palette = P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[VGA].pipe = 1023; spca50x->mode_cam[VGA].method = 0; spca50x->mode_cam[VGA].mode = 0; spca50x->mode_cam[PAL].width = 384; spca50x->mode_cam[PAL].height = 288; spca50x->mode_cam[PAL].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[PAL].pipe = 1023; spca50x->mode_cam[PAL].method = 1; spca50x->mode_cam[PAL].mode = 0; spca50x->mode_cam[SIF].width = 352; spca50x->mode_cam[SIF].height = 288; spca50x->mode_cam[SIF].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[SIF].pipe = 1023; spca50x->mode_cam[SIF].method = 1; spca50x->mode_cam[SIF].mode = 0; spca50x->mode_cam[CIF].width = 320; spca50x->mode_cam[CIF].height = 240; spca50x->mode_cam[CIF].t_palette = P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[CIF].pipe = 1023; spca50x->mode_cam[CIF].method = 0; spca50x->mode_cam[CIF].mode = 1; spca50x->mode_cam[QPAL].width = 192; spca50x->mode_cam[QPAL].height = 144; spca50x->mode_cam[QPAL].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QPAL].pipe = 1023; spca50x->mode_cam[QPAL].method = 1; spca50x->mode_cam[QPAL].mode = 1; spca50x->mode_cam[QSIF].width = 176; spca50x->mode_cam[QSIF].height = 144; spca50x->mode_cam[QSIF].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QSIF].pipe = 1023; spca50x->mode_cam[QSIF].method = 1; spca50x->mode_cam[QSIF].mode = 1; spca50x->mode_cam[QCIF].width = 160; spca50x->mode_cam[QCIF].height = 120; spca50x->mode_cam[QCIF].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QCIF].pipe = 1023; spca50x->mode_cam[QCIF].method = 1; spca50x->mode_cam[QCIF].mode = 1;}static void set_zc3xxSIF(struct usb_spca50x *spca50x){ memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam)); spca50x->mode_cam[SIF].width = 352; spca50x->mode_cam[SIF].height = 288; spca50x->mode_cam[SIF].t_palette = P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[SIF].pipe = 1023; spca50x->mode_cam[SIF].method = 0; spca50x->mode_cam[SIF].mode = 0; spca50x->mode_cam[CIF].width = 320; spca50x->mode_cam[CIF].height = 240; spca50x->mode_cam[CIF].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[CIF].pipe = 1023; spca50x->mode_cam[CIF].method = 1; spca50x->mode_cam[CIF].mode = 0; spca50x->mode_cam[QPAL].width = 192; spca50x->mode_cam[QPAL].height = 144; spca50x->mode_cam[QPAL].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QPAL].pipe = 1023; spca50x->mode_cam[QPAL].method = 1; spca50x->mode_cam[QPAL].mode = 0; spca50x->mode_cam[QSIF].width = 176; spca50x->mode_cam[QSIF].height = 144; spca50x->mode_cam[QSIF].t_palette = P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QSIF].pipe = 1023; spca50x->mode_cam[QSIF].method = 0; spca50x->mode_cam[QSIF].mode = 1; spca50x->mode_cam[QCIF].width = 160; spca50x->mode_cam[QCIF].height = 120; spca50x->mode_cam[QCIF].t_palette = P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16; spca50x->mode_cam[QCIF].pipe = 1023; spca50x->mode_cam[QCIF].method = 1; spca50x->mode_cam[QCIF].mode = 1;}static int zc3xx_config(struct usb_spca50x *spca50x){ int sensor = 0; __u8 bsensor = 0; spca50x->qindex = 1; PDEBUG(2, "Sensor ID:%d",spca50x->sensor); sensor = zcxx_probeSensor(spca50x); /* Force assign sensor id */ if(force_sensor_id != -1) { PDEBUG(0, "ATTENTION!: Forced assign sensor ID to %d ", force_sensor_id); spca50x->sensor = force_sensor_id; set_zc3xxVGA(spca50x); } else switch (sensor) { case -1: if (spca50x->sensor == SENSOR_MC501CB) { PDEBUG(0, " Sensor MC501CB"); set_zc3xxVGA(spca50x); }else if (spca50x->sensor == SENSOR_OV7620) { PDEBUG(0, " Sensor OV7620"); set_zc3xxVGA(spca50x); }else if(spca50x->sensor == SENSOR_TAS5130C_VF0250) { PDEBUG(0, " Sensor Tas5130 (VF0250)"); set_zc3xxVGA(spca50x); } else { PDEBUG(0, " Sensor UNKNOW_0 force Tas5130"); spca50x->sensor = SENSOR_TAS5130CXX; set_zc3xxVGA(spca50x); } break; case 0: PDEBUG(0, "Find Sensor HV7131B"); spca50x->sensor = SENSOR_HV7131B; set_zc3xxVGA(spca50x); break; case 1: PDEBUG(0, "Find Sensor SIF UNKNOW_1"); break; case 0x02: PDEBUG(0, "Find Sensor UNKNOW_2"); break; case 0x04: PDEBUG(0, "Find Sensor CS2102"); spca50x->sensor = SENSOR_CS2102; set_zc3xxVGA(spca50x); break; case 5: PDEBUG(0, "Find Sensor SIF UNKNOW_5"); break; case 0x06: PDEBUG(0, "Find Sensor OV7630C"); spca50x->sensor = SENSOR_OV7630C; set_zc3xxVGA(spca50x); break; case 7: PDEBUG(0, "Find Sensor SIF UNKNOW_7"); break; case 0x08: PDEBUG(0, "Find Sensor HDCS2020(b)"); spca50x->sensor = SENSOR_HDCS2020b; set_zc3xxVGA(spca50x); break; case 9: PDEBUG(0, "Find Sensor SIF UNKNOW_9"); break; case 0x0a: PDEBUG(0, "Find Sensor PB0330. Chip revision %x",spca50x->chip_revision); spca50x->sensor = SENSOR_PB0330; set_zc3xxVGA(spca50x); break; case 0x0b: PDEBUG(0, "Find Sensor SIF UNKNOW_b"); break; case 0x0c: PDEBUG(0, "Find Sensor ICM105T"); spca50x->sensor = SENSOR_ICM105A; set_zc3xxVGA(spca50x); break; case 0x0d: PDEBUG(0, "Find Sensor SIF UNKNOW_d"); break; case 0x0e: PDEBUG(0, "Find Sensor PAS202BCB"); spca50x->sensor = SENSOR_HDCS2020; set_zc3xxVGA(spca50x); break; case 0x0f: PDEBUG(0, "Find Sensor PAS106"); spca50x->sensor = SENSOR_PAS106; set_zc3xxSIF(spca50x); break; case 0x10: PDEBUG(0, "Find Sensor TAS5130"); spca50x->sensor = SENSOR_TAS5130CXX; set_zc3xxVGA(spca50x); break; case 0x11: PDEBUG(0, "Find Sensor HV7131R(c)"); spca50x->sensor = SENSOR_HV7131C; set_zc3xxVGA(spca50x); break; case 0x12: PDEBUG(0, "Find Sensor TAS5130"); spca50x->sensor = SENSOR_TAS5130CXX; set_zc3xxVGA(spca50x); break; case 0x13: PDEBUG(0, "Find Sensor MI0360. Chip revision %x",spca50x->chip_revision); spca50x->sensor = SENSOR_PB0330; set_zc3xxVGA(spca50x); break; }; if ((sensor == 0x02) || (sensor == 0x01) || (sensor == 0x05) || (sensor == 0x07) || (sensor == 0x09) || (sensor == 0x0b) || (sensor == 0x0d)) { PDEBUG(0, "Our Sensor is unknow at the moment please report mxhaard@free.fr "); return -EINVAL; } if ((sensor == -1) || (sensor == 0x10) || (sensor == 0x12)) { spca5xxRegWrite(spca50x->dev, 0xa0, 0x02, 0x0010, NULL, 0); spca5xxRegRead(spca50x->dev, 0xa1, 0x01, 0x0010, &bsensor, 1); } else { spca5xxRegWrite(spca50x->dev, 0xa0, sensor & 0x0f, 0x0010, NULL, 0); spca5xxRegRead(spca50x->dev, 0xa1, 0x01, 0x0010, &bsensor, 1); } /* switch the led off */ if( sensor == 0x06 || sensor == 0x11) spca5xxRegWrite(spca50x->dev,0xa0,0x01,0x0000,NULL,0); return 0;}static void zc3xx_setquality(struct usb_spca50x *spca50x){ __u8 quality = 0; __u8 frxt = 0x30; quality = (spca50x->qindex) & 0x0f; spca5xxRegWrite(spca50x->dev, 0xa0, quality, 0x0008, NULL, 0); spca5xxRegWrite(spca50x->dev, 0xa0, frxt, 0x0007, NULL, 0); switch (quality){ case 0: case 1: case 2: frxt = 0xff; break; case 3: frxt = 0xf0; break; case 4: frxt = 0xe0; break; case 5: frxt = 0x20; break; } spca5xxRegWrite(spca50x->dev, 0xa0, frxt, 0x0018, NULL, 0); }static void zc3xx_setAutobright(struct usb_spca50x *spca50x){ __u8 autoval = 0; if (spca50x->autoexpo) autoval = 0x42; else autoval = 0x02; spca5xxRegWrite(spca50x->dev, 0xa0, autoval, 0x0180, NULL, 0);}static void zc3xx_start(struct usb_spca50x *spca50x){ int err = 0; /* Assume start use the good resolution from spca50x->mode */ //err = zcxx_probeSensor(spca50x); switch (spca50x->sensor) { case SENSOR_MC501CB: if (spca50x->mode) {/* 320x240 */ err = zc3xxWriteVector(spca50x, MC501CB_Initial);} else {/* 640x480 */ err = zc3xxWriteVector(spca50x, MC501CB_InitialScale); } break; case SENSOR_OV7620: if (spca50x->mode) { /* 320x240 */ err = zc3xxWriteVector(spca50x, OV7620_Initial); } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -