PATCH: gspca-mercurial OV7630 fixes

"Andoni Zubimendi" <[email protected]> Thu, 17 Jul 2008 20:11:30 -0300
Newsgroups gmane.linux.drivers.spca50x.devel
Message-ID <[email protected]>
Hi!

This patches make the initialization of the OV7630 shorter and fixes some
initialization values to make the sensor work better in both resolution
modes.

Regards,

Andoni

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/

_______________________________________________
Spca50x-devs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spca50x-devs
ov7630-cleanup.patch (text/x-patch, 2.5 KB)
diff -r ed92c6358ca1 linux/drivers/media/video/gspca/sonixb.c
--- a/linux/drivers/media/video/gspca/sonixb.c	Thu Jul 17 12:34:28 2008 +0200
+++ b/linux/drivers/media/video/gspca/sonixb.c	Thu Jul 17 18:56:15 2008 -0300
@@ -358,7 +358,7 @@
 	{0xa0, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
 	{0xb0, 0x21, 0x01, 0x77, 0x3a, 0x00, 0x00, 0x10},
 /*	{0xd0, 0x21, 0x12, 0x7c, 0x01, 0x80, 0x34, 0x10},	   jfm */
-	{0xd0, 0x21, 0x12, 0x1c, 0x00, 0x80, 0x34, 0x10},	/* jfm */
+	{0xd0, 0x21, 0x12, 0x1c, 0x80, 0x80, 0x14, 0x10},
 	{0xa0, 0x21, 0x1b, 0x04, 0x00, 0x80, 0x34, 0x10},
 	{0xa0, 0x21, 0x20, 0x44, 0x00, 0x80, 0x34, 0x10},
 	{0xa0, 0x21, 0x23, 0xee, 0x00, 0x80, 0x34, 0x10},
@@ -381,10 +381,6 @@
 	{0xa0, 0x21, 0x10, 0x57, 0xbd, 0x06, 0xf6, 0x16},
 	{0xa0, 0x21, 0x76, 0x02, 0xbd, 0x06, 0xf6, 0x16},
 	{0xa0, 0x21, 0x00, 0x10, 0xbd, 0x06, 0xf6, 0x15},	/* gain */
-};
-static const __u8 ov7630_sensor_init_3[][8] = {
-	{0xa0, 0x21, 0x2a, 0xa0, 0x00, 0x00, 0x00, 0x10},
-	{0xa0, 0x21, 0x2a, 0x80, 0x00, 0x00, 0x00, 0x10},
 };
 
 static const __u8 initPas106[] = {
@@ -747,7 +743,7 @@
 		   found experimentally for the ov6650 is exactly half that of
 		   the ov6645. The ov7630 datasheet says the max is 0x41. */
 		const int reg10_max = (sd->sensor == SENSOR_OV6650)
-				? 0x4d : 0x41;
+				? 0x4d : 0xff;
 
 		reg11 = (60 * sd->exposure + 999) / 1000;
 		if (reg11 < 1)
@@ -767,6 +763,12 @@
 			reg10 = 10;
 		else if (reg10 > reg10_max)
 			reg10 = reg10_max;
+
+		/* In 640x480, if the reg11 has less than 2, the image is 
+		   unstable. */
+		if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv == 0
+		    && reg11 < 3)
+			reg11 = 3;
 
 		/* Write reg 10 and reg11 low nibble */
 		i2c[1] = sd->sensor_addr;
@@ -808,7 +810,7 @@
 			break;
 		case 1:			/* 50 hz */
 			i2c[3] = (sd->sensor == SENSOR_OV6650)
-					? 0x4f : 0x8a;
+					? 0x4f : 0x9e;
 			break;
 		}
 		i2c[1] = sd->sensor_addr;
@@ -1134,12 +1136,22 @@
 		i2c_w_vector(gspca_dev, ov7630_sensor_init,
 				sizeof ov7630_sensor_init);
 		break;
-	case SENSOR_OV7630_3:
+	case SENSOR_OV7630_3: {
+		__u8 i2c_r13[] = {0xa0, 0x21, 0x13, 0x80, 0x00, 0x00, 0x00, 0x10};
+		__u8 i2c_r2a[] = {0xa0, 0x21, 0x2a, 0x80, 0x00, 0x00, 0x00, 0x10};
+
+		if (mode == 0) {
+			i2c_r2a[3] |= 0x20;
+			i2c_r13[3] &= ~0x80;
+		}
 		i2c_w_vector(gspca_dev, ov7630_sensor_init_com,
 				sizeof ov7630_sensor_init_com);
 		msleep(200);
-		i2c_w(gspca_dev, ov7630_sensor_init_3[mode]);
+
+		i2c_w(gspca_dev, i2c_r13);
+		i2c_w(gspca_dev, i2c_r2a);
 		break;
+	    }
 	case SENSOR_PAS106:
 		pas106_i2cinit(gspca_dev);
 		break;