📄 sonix.h
字号:
spca50x->brightness = 0x80 << 8; spca50x->contrast = 0x80 << 8; return spca50x->brightness;}static __u16sonix_getcontrast(struct usb_spca50x *spca50x){ /*FIXME hardcoded as we need to read register of the tasc */ spca50x->contrast = 0x80 << 8; return spca50x->contrast;}static voidsonix_setbrightness(struct usb_spca50x *spca50x){ __u8 value; __u8 i2c[] = { 0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10 }; __u8 i2c1[] = { 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14 }; __u8 i2cOV[] = { 0xa0, 0x21, 0x06, 0x36, 0xbd, 0x06, 0xf6, 0x16 }; __u8 i2cp202[] = { 0xA0, 0x40, 0x10, 0x0E, 0x31, 0x00, 0x63, 0x15 }; __u8 i2cpdoit[] = { 0xA0, 0x40, 0x11, 0x01, 0x31, 0x00, 0x63, 0x16 }; //__u8 i2cpexpo1[] = { 0xB0,0x40,0x04,0x07,0x2A,0x00,0x63,0x16 }; __u8 i2cpexpo[] = { 0xB0, 0x40, 0x0e, 0x01, 0xab, 0x00, 0x63, 0x16 }; if (spca50x->sensor == SENSOR_TAS5130CXX || spca50x->sensor == SENSOR_TAS5110) { value = (0xFF - (spca50x->brightness >> 8)); i2c[4] = value & 0xFF; PDEBUG(4, "brightness %d :%d ", value, i2c[4]); if (sonix_i2cwrite(spca50x->dev, i2c, 8) < 0) PDEBUG(0, "i2c error brightness"); } else if (spca50x->sensor == SENSOR_PAS106) { i2c1[3] = spca50x->brightness >> 11; i2c1[2] = 0x0e; if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0) PDEBUG(0, "i2c error brightness"); i2c1[3] = 0x01; i2c1[2] = 0x13; if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0) PDEBUG(0, "i2c error brightness"); } else if (spca50x->sensor == SENSOR_OV7630) { // change reg 0x06 i2cOV[3] = spca50x->brightness >> 8; if (sonix_i2cwrite(spca50x->dev, i2cOV, 8) < 0) PDEBUG(0, "i2c error brightness"); } else if (spca50x->sensor == SENSOR_PAS202) { // change reg 0x10 i2cpexpo[4] = 0xff - (spca50x->brightness >> 8); //if(sonix_i2cwrite(spca50x->dev,i2cpexpo1,8) < 0) PDEBUG(0,"i2c error brightness"); //if(sonix_i2cwrite(spca50x->dev,i2cpdoit,8) < 0) PDEBUG(0,"i2c error brightness"); if (sonix_i2cwrite(spca50x->dev, i2cpexpo, 8) < 0) PDEBUG(0, "i2c error brightness"); if (sonix_i2cwrite(spca50x->dev, i2cpdoit, 8) < 0) PDEBUG(0, "i2c error brightness"); i2cp202[3] = (spca50x->brightness >> 11); if (sonix_i2cwrite(spca50x->dev, i2cp202, 8) < 0) PDEBUG(0, "i2c error brightness"); if (sonix_i2cwrite(spca50x->dev, i2cpdoit, 8) < 0) PDEBUG(0, "i2c error brightness"); }}static voidsonix_setcontrast(struct usb_spca50x *spca50x){ __u8 gain = 0; __u8 rgb_value = 0; gain = (spca50x->contrast >> 12) & 0x0F; /* red and blue gain */ rgb_value = gain << 4 | gain; sonixRegWrite(spca50x->dev, 0x08, 0x10, 0x0000, &rgb_value, 1); /* green gain */ rgb_value = gain; sonixRegWrite(spca50x->dev, 0x08, 0x11, 0x0000, &rgb_value, 1);}static intsonix_init(struct usb_spca50x *spca50x){ __u8 ByteReceive = 0x00; sonixRegRead(spca50x->dev, 0x00, 0x00, 0x0000, &ByteReceive, 1); if (ByteReceive != 0x10) return -ENODEV; return 0;}static inttas5130_I2cinit(struct usb_spca50x *spca50x){ //__u8 i2c10[]= { 0x30,0x11,0x00,0x40,0x47,0x00,0x00,0x10 }; // shutter 0x47 short exposure? __u8 i2c10[] = { 0x30, 0x11, 0x00, 0x40, 0x01, 0x00, 0x00, 0x10 }; // shutter 0x01 long exposure __u8 i2c2[] = { 0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10 }; if (sonix_i2cwrite(spca50x->dev, i2c10, 8) < 0) PDEBUG(0, "i2c error i2c10"); if (sonix_i2cwrite(spca50x->dev, i2c2, 8) < 0) PDEBUG(0, "i2c error i2c2"); return 0;}static intpas106_I2cinit(struct usb_spca50x *spca50x){ __u8 i2c1[] = { 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14 }; int i = 0; while (pas106_data[i][0]) { memcpy(&i2c1[2], &pas106_data[i++][0], 2); //copy 2 bytes from the template if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0) PDEBUG(0, "i2c error pas106"); } return 0;}static intov7630_I2cinit(struct usb_spca50x *spca50x){ int i = 0; while (ov7630_sensor_init[i][0]) { if (sonix_i2cwrite(spca50x->dev, ov7630_sensor_init[i], 8) < 0) PDEBUG(0, "i2c error ov7630"); i++; } return 0;}static inttas5110_I2cinit(struct usb_spca50x *spca50x){ int i = 0; while (tas5110_sensor_init[i][0]) { if (sonix_i2cwrite(spca50x->dev, tas5110_sensor_init[i], 8) < 0) PDEBUG(0, "i2c error tas5110"); i++; } return 0;}static inthv7131_I2cinit(struct usb_spca50x *spca50x){ int i = 0; while (hv7131_sensor_init[i][0]) { if (sonix_i2cwrite(spca50x->dev, hv7131_sensor_init[i], 8) < 0) PDEBUG(0, "i2c error hv7131"); i++; } return 0;}static intpas202_I2cinit(struct usb_spca50x *spca50x){ int i = 0; while (pas202_sensor_init[i][0]) { if (sonix_i2cwrite(spca50x->dev, pas202_sensor_init[i], 8) < 0) PDEBUG(0, "i2c error pas202"); i++; } return 0;}static voidsonix_start(struct usb_spca50x *spca50x){ __u8 compress = 0; __u8 MCK_SIZE = 0x33; __u8 frmult = 0x28; __u8 *sn9c10x = NULL; __u8 CompressCtrl[] = { 0, 0 }; int err = 0; switch (spca50x->sensor) { case SENSOR_OV7630: sn9c10x = initOv7630; compress = spca50x->mode << 4 | COMP2; CompressCtrl[0] = compress; frmult = 0x68; CompressCtrl[1] = 0x20; MCK_SIZE = 0x20; break; case SENSOR_TAS5130CXX: sn9c10x = initTas5130; compress = spca50x->mode << 4 | COMP; CompressCtrl[0] = compress; frmult = 0x60; switch (spca50x->mode) { case 0: /* 640x480 3fp/s */ CompressCtrl[1] = 0x43; //0xA3 3fp/s ;// 0xF3; MCK_SIZE = 0x43; // 0xA3;//0xF3; break; case 1: /* 320x240 0x33 10fp/s */ CompressCtrl[1] = 0x23; MCK_SIZE = 0x23; break; case 2: /* 160x120 15fp/s */ CompressCtrl[1] = 0x23; MCK_SIZE = 0x23; break; default: break; } break; case SENSOR_PAS106: sn9c10x = initPas106;; compress = spca50x->mode << 4 | COMP1; CompressCtrl[0] = compress; frmult = 0x24; //0x28 CompressCtrl[1] = 0x20; //0xF3; MCK_SIZE = 0x20; //0xF3; break; case SENSOR_TAS5110: sn9c10x = initTas5110; compress = spca50x->mode << 4 | 0x86; CompressCtrl[0] = compress; frmult = 0x60; CompressCtrl[1] = 0x2b; //0xF3; MCK_SIZE = 0x2b; //0xF3; break; case SENSOR_HV7131R: sn9c10x = initHv7131; compress = spca50x->mode << 4 | 0x8a; CompressCtrl[0] = compress; frmult = 0x60; CompressCtrl[1] = 0x20; MCK_SIZE = 0x20; break; case SENSOR_PAS202: sn9c10x = initPas202; compress = spca50x->mode << 4 | 0x89; CompressCtrl[0] = compress; frmult = 0x20; //reg17 // 7 fp/s VGA if (spca50x->mode) frmult = 0x24; // 0x28->11fp/s SIF 0x24 CompressCtrl[1] = 0x20; //reg19 30 MCK_SIZE = 0x20; break; } /* reg 0x01 bit 2 video transfert on */ sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &sn9c10x[0], 1); /* reg 0x17 SensorClk enable inv Clk 0x60 */ sonixRegWrite(spca50x->dev, 0x08, 0x17, 0x0000, &sn9c10x[0x17 - 1], 1); /* Set the whole registers from the template */ sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, sn9c10x, 0x1f); switch (spca50x->sensor) { case SENSOR_TAS5130CXX: err = tas5130_I2cinit(spca50x); break; case SENSOR_PAS106: err = pas106_I2cinit(spca50x); break; case SENSOR_OV7630: err = ov7630_I2cinit(spca50x); break; case SENSOR_HV7131R: err = hv7131_I2cinit(spca50x); break; case SENSOR_TAS5110: err = tas5110_I2cinit(spca50x); break; case SENSOR_PAS202: err = pas202_I2cinit(spca50x); break; default: err = -EINVAL; break; } /* H_size V_size 0x28,0x1e maybe 640x480 */ sonixRegWrite(spca50x->dev, 0x08, 0x15, 0x0000, &sn9c10x[0x15 - 1], 0x02); /* compression register */ sonixRegWrite(spca50x->dev, 0x08, 0x18, 0x0000, &compress, 1); // H_start sonixRegWrite(spca50x->dev, 0x08, 0x12, 0x0000, &sn9c10x[0x12 - 1], 1); // V_START sonixRegWrite(spca50x->dev, 0x08, 0x13, 0x0000, &sn9c10x[0x13 - 1], 1); /* re set 0x17 SensorClk enable inv Clk 0x60 */ sonixRegWrite(spca50x->dev, 0x08, 0x17, 0x0000, &frmult, 1); /*MCKSIZE ->3 */ sonixRegWrite(spca50x->dev, 0x08, 0x19, 0x0000, &MCK_SIZE, 1); /* AE_STRX AE_STRY AE_ENDX AE_ENDY */ sonixRegWrite(spca50x->dev, 0x08, 0x1c, 0x0000, &sn9c10x[0x1c - 1], 4); /* Enable video transfert */ sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &sn9c10x[0], 1); /* Compression */ sonixRegWrite(spca50x->dev, 0x08, 0x18, 0x0000, CompressCtrl, 2); sonix_setcontrast(spca50x); sonix_setbrightness(spca50x);}static intsonix_config(struct usb_spca50x *spca50x){ switch (spca50x->sensor) { case SENSOR_OV7660: case SENSOR_MO4000: case SENSOR_OV7630: case SENSOR_TAS5130CXX: case SENSOR_HV7131R: case SENSOR_MI0360: case SENSOR_PAS202: set_sonixVGA(spca50x); break; case SENSOR_PAS106: case SENSOR_TAS5110: set_sonixSIF(spca50x); break; default: return -EINVAL; break; } spca50x->qindex = 4; //set the quantization table return 0;}static voidsonix_stopN(struct usb_spca50x *spca50x){ __u8 ByteSend = 0; ByteSend = 0x09; // 0X00 sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &ByteSend, 1);}static intsonix_sofdetect(struct usb_spca50x *spca50x, struct spca50x_frame *frame, unsigned char *cdata, int *iPix, int seqnum, int *datalength){ int sof = 0; int j = 0; int p = 0; if (*datalength < 24) { if (*datalength > 6) { j = *datalength - 6; } else { j = 0; } if (j > 0) { for (p = 0; p < j; p++) { if ((cdata[0 + p] == 0xFF) && (cdata[1 + p] == 0xFF) && (cdata[2 + p] == 0x00) && (cdata[3 + p] == 0xC4) && (cdata[4 + p] == 0xC4) && (cdata[5 + p] == 0x96)) { sof = 1; break; } } } } if (sof) { *iPix = p + 12; *datalength -= *iPix; return 0; PDEBUG(5, "Sonix header packet found %d datalength %d !!", p, *datalength); } else *iPix = 0; return seqnum + 1;}#endif /* SONIXUSB_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -