|
@@ -5793,7 +5793,7 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
|
|
|
break;
|
|
|
default:
|
|
|
/* case 0xdd: * delay */
|
|
|
- msleep(action->val / 64 + 10);
|
|
|
+ msleep(action->idx);
|
|
|
break;
|
|
|
}
|
|
|
action++;
|
|
@@ -5830,7 +5830,7 @@ static void setmatrix(struct gspca_dev *gspca_dev)
|
|
|
[SENSOR_GC0305] = gc0305_matrix,
|
|
|
[SENSOR_HDCS2020b] = NULL,
|
|
|
[SENSOR_HV7131B] = NULL,
|
|
|
- [SENSOR_HV7131R] = NULL,
|
|
|
+ [SENSOR_HV7131R] = po2030_matrix,
|
|
|
[SENSOR_ICM105A] = po2030_matrix,
|
|
|
[SENSOR_MC501CB] = NULL,
|
|
|
[SENSOR_MT9V111_1] = gc0305_matrix,
|
|
@@ -5936,6 +5936,7 @@ static void setquality(struct gspca_dev *gspca_dev)
|
|
|
case SENSOR_ADCM2700:
|
|
|
case SENSOR_GC0305:
|
|
|
case SENSOR_HV7131B:
|
|
|
+ case SENSOR_HV7131R:
|
|
|
case SENSOR_OV7620:
|
|
|
case SENSOR_PAS202B:
|
|
|
case SENSOR_PO2030:
|
|
@@ -6108,11 +6109,13 @@ static void send_unknown(struct gspca_dev *gspca_dev, int sensor)
|
|
|
reg_w(gspca_dev, 0x02, 0x003b);
|
|
|
reg_w(gspca_dev, 0x00, 0x0038);
|
|
|
break;
|
|
|
+ case SENSOR_HV7131R:
|
|
|
case SENSOR_PAS202B:
|
|
|
reg_w(gspca_dev, 0x03, 0x003b);
|
|
|
reg_w(gspca_dev, 0x0c, 0x003a);
|
|
|
reg_w(gspca_dev, 0x0b, 0x0039);
|
|
|
- reg_w(gspca_dev, 0x0b, 0x0038);
|
|
|
+ if (sensor == SENSOR_PAS202B)
|
|
|
+ reg_w(gspca_dev, 0x0b, 0x0038);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -6704,10 +6707,13 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
|
|
reg_w(gspca_dev, 0x02, 0x003b);
|
|
|
reg_w(gspca_dev, 0x00, 0x0038);
|
|
|
break;
|
|
|
+ case SENSOR_HV7131R:
|
|
|
case SENSOR_PAS202B:
|
|
|
reg_w(gspca_dev, 0x03, 0x003b);
|
|
|
reg_w(gspca_dev, 0x0c, 0x003a);
|
|
|
reg_w(gspca_dev, 0x0b, 0x0039);
|
|
|
+ if (sd->sensor == SENSOR_HV7131R)
|
|
|
+ reg_w(gspca_dev, 0x50, ZC3XX_R11D_GLOBALGAIN);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -6720,6 +6726,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
|
|
break;
|
|
|
case SENSOR_PAS202B:
|
|
|
case SENSOR_GC0305:
|
|
|
+ case SENSOR_HV7131R:
|
|
|
case SENSOR_TAS5130C:
|
|
|
reg_r(gspca_dev, 0x0008);
|
|
|
/* fall thru */
|
|
@@ -6760,6 +6767,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
|
|
/* ms-win + */
|
|
|
reg_w(gspca_dev, 0x40, 0x0117);
|
|
|
break;
|
|
|
+ case SENSOR_HV7131R:
|
|
|
+ i2c_write(gspca_dev, 0x25, 0x04, 0x00); /* exposure */
|
|
|
+ i2c_write(gspca_dev, 0x26, 0x93, 0x00);
|
|
|
+ i2c_write(gspca_dev, 0x27, 0xe0, 0x00);
|
|
|
+ reg_w(gspca_dev, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN);
|
|
|
+ break;
|
|
|
case SENSOR_GC0305:
|
|
|
case SENSOR_TAS5130C:
|
|
|
reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */
|
|
@@ -6808,9 +6821,17 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|
|
{
|
|
|
struct sd *sd = (struct sd *) gspca_dev;
|
|
|
|
|
|
- if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */
|
|
|
+ /* check the JPEG end of frame */
|
|
|
+ if (len >= 3
|
|
|
+ && data[len - 3] == 0xff && data[len - 2] == 0xd9) {
|
|
|
+/*fixme: what does the last byte mean?*/
|
|
|
gspca_frame_add(gspca_dev, LAST_PACKET,
|
|
|
- NULL, 0);
|
|
|
+ data, len - 1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* check the JPEG start of a frame */
|
|
|
+ if (data[0] == 0xff && data[1] == 0xd8) {
|
|
|
/* put the JPEG header in the new frame */
|
|
|
gspca_frame_add(gspca_dev, FIRST_PACKET,
|
|
|
sd->jpeg_hdr, JPEG_HDR_SZ);
|