Web lists-archives.com

[Spca50x-devs] [gspcav1-20071224] Patch for 0c45:6011 Microdia




Hi, i am attaching a "patch" for  webcam  0c45:0611  , reported as
"Microdia "
This camera have  chip SN9C101G and sensor OV6650 ( QCIF/CIF ), and
works under bridge SONIX.
Thx to Matias Mousseaud from Hong Kong CF for sending a webcam to the
office.

Patch was tested on Rxart Desktop 3.2 , kernel 2.6.22.2-pixart-panda.
Driver SN9C102 will take care of this webcam at first ( but dont support
this sensor ), so if you have it on your system, unload it or put it on
blacklist.

I also attach a screenshot.

Ty in advance,
Costantino Leandro
Pixart SRL

PD: Any problem no doubt in get in contact, maybe some sensor init regs
may need a tweak.




diff -Nru gspcav1-20071224/gspca_core.c gspcav1-2007224-rxart-ov6650/gspca_core.c
--- gspcav1-20071224/gspca_core.c	2007-12-24 13:56:47.000000000 -0300
+++ gspcav1-2007224-rxart-ov6650/gspca_core.c	2008-02-18 07:10:12.000000000 -0300
@@ -422,6 +422,7 @@
 	Lenovo,
 	LogitechQC4Notebooks,
 	PhilipsSPC220NC,
+	MaxSonixCamera,
 	LastCamera
 };
 static struct cam_list clist[] = {
@@ -620,6 +621,7 @@
 	{Lenovo,"lenovo MI1310_SOC"},
 	{LogitechQC4Notebooks,"Logitech QuickCam for Notebooks"},
 	{PhilipsSPC220NC,"Philips SPC220NC PAC207"},
+	{MaxSonixCamera,"Max Webcam (SN9C101G-OV6650-352x288)"},
 	{-1, NULL}
 };
 static __devinitdata struct usb_device_id device_table[] = {
@@ -834,6 +836,7 @@
 	{USB_DEVICE(0x046d, 0x08af)},	/* Logitech QuickCam Cool */
 	{USB_DEVICE(0x093a, 0x2472)},	/* PAC207 Genius VideoCam ge110 */
 	{USB_DEVICE(0x093a, 0x2463)},	/* Philips spc200nc pac207 */
+	{USB_DEVICE(0x0c45, 0x6011)},	/* MAX Webcam ( OV 6650 - SN9C101G ( works only with 	SONIX BRIDGE ) */
 	{USB_DEVICE(0x0000, 0x0000)},	/* MystFromOri Unknow Camera */
 	{}			/* Terminating entry */
 };
@@ -3889,6 +3892,14 @@
 			spca50x->i2c_ctrl_reg = 0x20;
 			spca50x->i2c_base = 0x11;
 			break;
+		case 0x6011:
+		       	spca50x->desc = MaxSonixCamera;
+		       	spca50x->bridge = BRIDGE_SONIX;
+		       	spca50x->sensor = SENSOR_OV6650;
+		       	spca50x->customid = SN9C101; //SN9C101G 
+		       	spca50x->i2c_ctrl_reg = 0x81;
+		       	spca50x->i2c_base = 0x21;
+		       	break;
 		case 0x6024:
 		case 0x6025:
 			spca50x->desc = Sonix6025;
diff -Nru gspcav1-20071224/gspca.h gspcav1-2007224-rxart-ov6650/gspca.h
--- gspcav1-20071224/gspca.h	2007-12-24 13:56:47.000000000 -0300
+++ gspcav1-2007224-rxart-ov6650/gspca.h	2008-02-18 00:00:00.000000000 -0300
@@ -129,6 +129,7 @@
 #define SENSOR_OV7670 29
 #define SENSOR_MI1310_SOC 30
 #define SENSOR_MC501CB 31
+#define SENSOR_OV6650 32
 
 /* Alternate interface transfer sizes */
 #define SPCA50X_ALT_SIZE_0       0
diff -Nru gspcav1-20071224/Sonix/sonix.h gspcav1-2007224-rxart-ov6650/Sonix/sonix.h
--- gspcav1-20071224/Sonix/sonix.h	2007-11-22 11:52:16.000000000 -0300
+++ gspcav1-2007224-rxart-ov6650/Sonix/sonix.h	2008-02-18 06:56:39.000000000 -0300
@@ -243,6 +243,12 @@
 	0x00, 0x00, 0x02, 0x03, 0x0F, 0x0C
 };
 
+static __u8 initOv6650[] =
+{
+   	0x64,0x44,0x28,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+        0x00,0x02,0x01,0x0A,0x14,0x0f,0x68,0x8B,0x10,0x1D,0x10,0x01,0x01,0x07,0x06       
+};
+
 //compression 0x86 mckinit1 0x2b
 static __u8 pas106_data[][2] = {
 	{0x02, 0x04},		/* Pixel Clock Divider 6 */
@@ -337,6 +343,43 @@
 	{0, 0, 0, 0, 0, 0, 0, 0}
 };
 
+static __u8 ov6650_sensor_init[][8] =
+{
+   //Bright, contrast, etc are set througth SCBB interface. AVCAP on win2 do not send any data on this 	controls.
+   //Anyway, some registers appears to alter bright and constrat
+
+     	{0xA0,0x60,0x12,0x80,0x00,0x00,0x00,0x10},
+	{0xD0,0x60,0x11,0xC0,0x1B,0x18,0xC1,0x10},
+	{0xB0,0x60,0x15,0x00,0x02,0x18,0xC1,0x10},
+      //{0xA0,0x60,0x1B,0x01,0x02,0x18,0xC1,0x10}, //THIS SET GREEN SCREEN ( pixels could be innverted in decode kind of "brg", but blue wont be there. Avoid this data ...
+        {0xD0,0x60,0x26,0x01,0x14,0xD8,0xA4,0x10}, //format out?
+        {0xD0,0x60,0x26,0x01,0x14,0xD8,0xA4,0x10},
+        {0xA0,0x60,0x30,0x3D,0x0A,0xD8,0xA4,0x10},
+     	{0xB0,0x60,0x60,0x66,0x68,0xD8,0xA4,0x10},
+     	{0xA0,0x60,0x68,0x04,0x68,0xD8,0xA4,0x10},
+     	{0xD0,0x60,0x17,0x24,0xD6,0x04,0x94,0x10}, //Clipreg
+     	{0xA0,0x60,0x10,0x5D,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x2D,0x0A,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x32,0x00,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x33,0x40,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x11,0xC0,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x00,0x16,0x99,0x04,0x94,0x15},   //bright / Lumino
+     	{0xA0,0x60,0x2B,0xAB,0x99,0x04,0x94,0x15}, //?flicker o brillo
+     	{0xA0,0x60,0x2D,0x2A,0x99,0x04,0x94,0x15},
+     	{0xA0,0x60,0x2D,0x2A,0x99,0x04,0x94,0x15},
+     	{0xA0,0x60,0x2D,0x2B,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x32,0x00,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x33,0x00,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x10,0x57,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x2D,0x2B,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x32,0x00,0x99,0x04,0x94,0x16}, // Low Light ( Enabled: 0x32 0x1 | Disabled: 0x32 0x00 )
+     	{0xA0,0x60,0x33,0x29,0x99,0x04,0x94,0x16}, // Low Ligth ( Enabled: 0x33 0x13 | Disabled: 0x33 0x29 )
+     	{0xA0,0x60,0x11,0xC1,0x99,0x04,0x94,0x16},
+     	{0xA0,0x60,0x00,0x17,0x99,0x04,0x94,0x15}, //clip? r
+     	{0xA0,0x60,0x00,0x18,0x99,0x04,0x94,0x15}, //clip? r
+     	{0 , 0, 0, 0, 0, 0, 0, 0},
+}
+;
 static int
 sonix_i2cwrite(struct usb_device *dev, __u8 * buffer, __u16 length)
 {
@@ -380,6 +423,7 @@
 	__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 };
+	__u8 i2cOV6650[] = { 0xa0, 0x60, 0x06,0x11, 0x99, 0x04, 0x94, 0x15 }; 
 	if (spca50x->sensor == SENSOR_TAS5130CXX ||
 	    spca50x->sensor == SENSOR_TAS5110) {
 		value = (0xFF - (spca50x->brightness >> 8));
@@ -416,6 +460,12 @@
 		if (sonix_i2cwrite(spca50x->dev, i2cpdoit, 8) < 0)
 			PDEBUG(0, "i2c error brightness");
 	}
+	else if( spca50x->sensor == SENSOR_OV6650 )
+     	{
+		i2cOV6650[3] =spca50x->brightness>> 8;
+		if (sonix_i2cwrite(spca50x->dev, i2cOV6650, 8) < 0)
+			 PDEBUG(0, "i2c error brightness");
+     	}
 }
 static void
 sonix_setcontrast(struct usb_spca50x *spca50x)
@@ -513,6 +563,17 @@
 	}
 	return 0;
 }
+static int
+ov6650_I2cinit(struct usb_spca50x *spca50x)
+{
+	int i = 0;
+	while (ov6650_sensor_init[i][0]) {
+		if (sonix_i2cwrite(spca50x->dev, ov6650_sensor_init[i], 8) < 0)
+	  		PDEBUG(0, "i2c error ov665-");
+		i++;
+     	}
+   	return 0;
+}
 static void
 sonix_start(struct usb_spca50x *spca50x)
 {
@@ -588,6 +649,14 @@
 		CompressCtrl[1] = 0x20;	//reg19 30
 		MCK_SIZE = 0x20;
 		break;
+	case SENSOR_OV6650:
+		sn9c10x = initOv6650;
+		compress = 0x8b;//spca50x->mode << 4 | 0x8b;
+		CompressCtrl[0] = compress;
+		frmult = 0x68;
+		CompressCtrl[1] = 0x20;
+		MCK_SIZE = 0x20;
+		break;
 	}
 	/* reg 0x01 bit 2 video transfert on */
 
@@ -615,6 +684,9 @@
 	case SENSOR_PAS202:
 		err = pas202_I2cinit(spca50x);
 		break;
+	case SENSOR_OV6650:
+		err = ov6650_I2cinit(spca50x);
+		break;
 	default:
 		err = -EINVAL;
 		break;
@@ -654,6 +726,7 @@
 	case SENSOR_HV7131R:
 	case SENSOR_MI0360:
 	case SENSOR_PAS202:
+	case SENSOR_OV6650:
 		set_sonixVGA(spca50x);
 		break;
 	case SENSOR_PAS106:

JPEG image

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Spca50x-devs mailing list
Spca50x-devs@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/spca50x-devs