Re: [gspcav1-20071224] Testing Patch 0c45:612a Microdia ( SN9C325+OV7648)

Costantino Leandro <[email protected]>
Newsgroups gmane.linux.drivers.spca50x.devel
Message-ID <[email protected]>
This sould be the final patch.
- The blue tint have been fixed.
- Quality is not so good in win/linux, so its not related to the driver. 
The image is like it should be ( cheap .... ). ( tested on other units too )

- AMcap on win, have zoom functions but its by software ( the parameters 
set on the webcam when enable/disable this feature are the same as at 
the initialization )

- I kept some commented registers on the sensor init, if some1 is having 
problems with the color, could test uncommenting that.

I attach a screenshot , both cameras are 0xc45:612a ( SN9C325 + OV7648 ).

Ty to Moises Herrera for testing ( he's on the screenshot :) ),

Costantino Leandro
Pixart SRL

-------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/spca50x-devs
gspcav1-20071224-sn9c325-ov7648.patch (text/x-patch, 11.5 KB)
diff -Nru gspcav1-20071224/Sonix/sn9cxxx.h gspcav1-20071224-sn9c325-ov7648/Sonix/sn9cxxx.h
--- gspcav1-20071224/Sonix/sn9cxxx.h	2007-04-26 09:51:48.000000000 -0300
+++ gspcav1-20071224-sn9c325-ov7648/Sonix/sn9cxxx.h	2008-02-26 23:10:17.000000000 -0300
@@ -80,6 +80,7 @@
 	SN9C105,
 	SN9C110,
 	SN9C120,
+	SN9C325,
 };
 
 static __u8 sn_mi0360[] = {
@@ -114,6 +115,13 @@
 	0x01,	0x01,	0x08,	0x28,	0x1e,	0x20,	0x07,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00,	0x00
 	//reg12	reg13	reg14	reg15	reg16	reg17	reg18	reg19	reg1a	reg1b	reg1c	reg1d	reg1e	reg1f	reg20	reg21	reg22	reg23
 };
+
+static __u8 sn_ov7648[] =
+{
+    0x00,0x21,0x62,0x00,0x1a,0x20,0x20,0x20,0xA1,0x6E,0x18,0x65,
+    0x00,0x00,0x00,0x10,0x03,0x00,0x00,0x06,0x06,0x28,0x1E,0x82,
+    0x07,0x00,0x00,0x00,0x00,0x00
+};
 	
 static __u8 reg9a[] = {
 	0x08, 0x40, 0x20, 0x10, 0x00, 0x04
@@ -128,6 +136,20 @@
 	//0x3E, 0x00, 0xC3, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00
 	0x3E, 0x00, 0xC3, 0x0F, 0xf7, 0x0f, 0x0a, 0x00, 0x00
 };
+static __u8 reg9a_sn9c325[]=
+{
+   0x0a,0x40,0x38,0x30,0x00,0x20
+};
+static __u8 regsn20_sn9c325[]=
+{
+   0x0A,0x3A,0x56, 0x6C ,0x7E ,0x8D ,0x9A ,0xA4 ,0xAF ,0xBB ,0xC5 ,0xCD ,0xD5 ,0xDE ,0xE8 ,0xED  ,0xF5
+}
+;
+static __u8 reg84_sn9c325[] =
+{
+   0x14,0x00,0x27,0x00,0x07,0x00,0xE4,0x0F,0xD3,0x0F,0x4B,0x00,0x48,0x00,0xC0,0x0F,0xF8,0x0F,0x00,0x00,0x00
+};
+
 static __u8 hv7131r_sensor_init[][8] = {
 	{0xC1, 0x11, 0x01, 0x08, 0x01, 0x00, 0x00, 0x10},
 	{0xB1, 0x11, 0x34, 0x17, 0x7F, 0x00, 0x00, 0x10},
@@ -309,6 +331,60 @@
 };
 //		reg0x04		reg0x07		reg 0x10
 //expo  = (COM1 & 0x02) | (AECHH & 0x2f <<10) [ (AECh << 2)
+static __u8 ov7648_sensor_init[][8] =
+{
+        {0xC1,0x00,0x01,0x00,0x00,0x00,0x01,0x00},
+     {0xC1,0x00,0x00,0x00,0x00,0x00,0x01,0x00},
+     {0xC1,0x00,0x01,0x00,0x00,0x00,0x01,0x00},
+     {0xA1,0x6E,0x3F,0x20,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x3F,0x00,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x3E,0x00,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x04,0x02,0xB1,0x02,0x39,0x10},
+     {0xD1,0x6E,0x08,0x00,0x01,0x00,0x00,0x10},
+     {0xD1,0x6E,0x0C,0x02,0x7F,0x01,0xE0,0x10},
+     {0xD1,0x6E,0x12,0x03,0x02,0x00,0x03,0x10},
+     {0xD1,0x6E,0x16,0x85,0x40,0x4A,0x40,0x10},
+     {0xC1,0x6E,0x1A,0x00,0x80,0x00,0x00,0x10},
+     {0xD1,0x6E,0x1D,0x08,0x03,0x00,0x00,0x10},
+     {0xD1,0x6E,0x23,0x00,0xB0,0x00,0x94,0x10},
+     {0xD1,0x6E,0x27,0x58,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x2D,0x14,0x35,0x61,0x84,0x10},
+     {0xD1,0x6E,0x31,0xA2,0xBD,0xD8,0xFF,0x10},
+     {0xD1,0x6E,0x35,0x06,0x1E,0x12,0x02,0x10},
+     {0xD1,0x6E,0x39,0xAA,0x53,0x37,0xD5,0x10},
+     {0xA1,0x6E,0x3D,0xF2,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x3E,0x00,0x00,0x80,0x03,0x10},
+     {0xD1,0x6E,0x42,0x03,0x00,0x00,0x00,0x10},
+     {0xC1,0x6E,0x46,0x00,0x80,0x80,0x00,0x10},
+     {0xD1,0x6E,0x4B,0x02,0xEF,0x08,0xCD,0x10},
+     {0xD1,0x6E,0x4F,0x00,0xD0,0x00,0xA0,0x10},
+     {0xD1,0x6E,0x53,0x01,0xAA,0x01,0x40,0x10},
+     {0xD1,0x6E,0x5A,0x50,0x04,0x30,0x03,0x10},
+     {0xA1,0x6E,0x5E,0x00,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x5F,0x10,0x40,0xFF,0x00,0x10},
+  /* {0xD1,0x6E,0x63,0x40,0x40,0x00,0x00,0x10},
+     {0xD1,0x6E,0x67,0x00,0x00,0x00,0x00,0x10}, This is currently setting a
+     {0xD1,0x6E,0x6B,0x00,0x00,0x00,0x00,0x10}, blue tint, and some things more , i leave it here for future test if
+     {0xD1,0x6E,0x6F,0x00,0x00,0x00,0x00,0x10}, somene is having problems with color on this sensor
+     {0xC1,0x6E,0x73,0x10,0x80,0xEB,0x00,0x10},
+     {0xA1,0x6E,0x1E,0x03,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x15,0x01,0x00,0x00,0x00,0x10},
+     {0xC1,0x6E,0x16,0x40,0x40,0x40,0x00,0x10},
+     {0xA1,0x6E,0x1D,0x08,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x06,0x02,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x07,0xB5,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x18,0x6B,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x1D,0x08,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x06,0x02,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x07,0xB8,0x00,0x00,0x00,0x10},
+  */ {0xC1,0x00,0x01,0x00,0x00,0x00,0x01,0x00},
+     {0xA1,0x6E,0x06,0x03,0x00,0x00,0x00,0x10}, //Bright...
+     {0xA1,0x6E,0x07,0x66,0x00,0x00,0x00,0x10}, //B..
+     {0xC1,0x6E,0x1A,0x03,0x65,0x90,0x00,0x10}, //Bright/Witen....
+//     {0xC1,0x6E,0x16,0x45,0x40,0x60,0x00,0x10}, //Bright/Witene
+     {0, 0, 0, 0, 0, 0, 0, 0}
+};
+
 
 #if 0
 static __u8 qtable1[] = {
@@ -607,6 +683,19 @@
 		i++;
 	}
 }
+static void
+  ov7648_InitSensor(struct usb_spca50x *spca50x)
+{
+   int i = 0;
+   struct usb_device *dev = spca50x->dev;
+
+   while (ov7648_sensor_init[i][0])
+     {
+	sn9c102p_i2cwritebuf(dev, ov7648_sensor_init[i]);
+	i++;
+     }
+}
+
 static int
 sn9cxxx_init(struct usb_spca50x *spca50x)
 {
@@ -615,6 +704,7 @@
 	__u8 *sn9c1xx = NULL;
 	__u8 regF1 = 0x01;
 	__u8 regGpio[] = { 0x29, 0x74 };
+	__u8 regGpioAlt = 0x62; 
 	__u8 data = 0x00;
 	/* setup a selector by customid */
 	switch (spca50x->sensor) {
@@ -630,7 +720,11 @@
 	case SENSOR_OV7660:
 		sn9c1xx = sn_ov7660;
 		break;
+        case SENSOR_OV7648:
+	    	sn9c1xx = sn_ov7648;
+		break;
 	}
+
 	if (sn9c1xx == NULL)
 		return -ENODEV;
 	sonixRegWrite(dev, 0x08, 0xf1, 0x0000, &regF1, 1);
@@ -660,6 +754,11 @@
 		regGpio[1] = 0x70;
 		sonixRegWrite(dev, 0x08, 0x02, 0x0000, regGpio, 2);
 		break;
+	case SN9C325:
+	        if (regF1 != 0x12 )
+			return -ENODEV;
+	       	sonixRegWrite(dev, 0x08, 0x02, 0x0000, &regGpioAlt, 1);
+		break;;
 	}
 
 	regF1 = 0x01;
@@ -708,6 +807,7 @@
 	struct usb_device *dev = spca50x->dev;
 	__u8 stophv7131[] = { 0xA1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10 };
 	__u8 stopmi0360[] = { 0xB1, 0x5D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10 };
+	
 	__u8 regF1 = 0x01;
 	__u8 data = 0x0b;
 	__u8 *sn9c1xx = NULL;
@@ -728,6 +828,10 @@
 	case SENSOR_OV7660:
 		sn9c1xx = sn_ov7660;
 		break;
+	case SENSOR_OV7648:
+		sn9c1xx = sn_ov7648;
+		data = 0x29;
+		break;
 	}
 	if (sn9c1xx == NULL)
 		return;
@@ -746,6 +850,7 @@
 	__u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
 	__u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
 	__u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd };	//MI0360
+	__u8 CE_sn9c325[] = { 0x32, 0xdd, 0x32, 0xdd };	//OV7648 - SN9C325
 	__u8 data = 0;
 	__u8 regF1 = 0x00;
 	__u8 reg17 = 0x61;
@@ -765,6 +870,10 @@
 	case SENSOR_OV7660:
 		sn9c1xx = sn_ov7660;
 		break;
+	case SENSOR_OV7648:
+		sn9c1xx = sn_ov7648;
+    		break;
+
 	}
 	if (sn9c1xx == NULL)
 		return;
@@ -773,15 +882,19 @@
 	sonixRegWrite(dev, 0x08, 0x01, 0x0000, &sn9c1xx[1], 2);
 	sonixRegWrite(dev, 0x08, 0x08, 0x0000, &sn9c1xx[8], 2);
 	sonixRegWrite(dev, 0x08, 0x17, 0x0000, &sn9c1xx[0x17], 3);
-
-	sonixRegWrite(dev, 0x08, 0x9a, 0x0000, reg9a, 6);
+    	if( spca50x->customid == SN9C325 )
+    	    sonixRegWrite(dev, 0x08, 0x9a, 0x0000, reg9a_sn9c325, 6);
+	else
+	    sonixRegWrite(dev, 0x08, 0x9a, 0x0000, reg9a, 6);
 	data = 0x60;
 	sonixRegWrite(dev, 0x08, 0xD4, 0x0000, &data, 1);
-
 	sonixRegWrite(dev, 0x08, 0x03, 0x0000, &sn9c1xx[3], 0x0f);
 	data = 0x43;
 	sonixRegWrite(dev, 0x08, 0x01, 0x0000, &data, 1);
-	data = 0x61;
+	if( spca50x->customid == SN9C325 )
+	    data = 0xae;
+	else
+	    data = 0x61;
 	sonixRegWrite(dev, 0x08, 0x17, 0x0000, &data, 1);
 	data = 0x42;
 	sonixRegWrite(dev, 0x08, 0x01, 0x0000, &data, 1);
@@ -805,18 +918,38 @@
 	sonixRegWrite(dev, 0x08, 0xc8, 0x0000, &DC29[4], 1);
 	sonixRegWrite(dev, 0x08, 0xc9, 0x0000, &DC29[5], 1);
 	sonixRegWrite(dev, 0x08, 0x18, 0x0000, &sn9c1xx[0x18], 1);
-	data = 0x60;
+	if( spca50x->customid == SN9C325 )
+	    data = 0xAE;
+	else
+	    data = 0x60;
 	sonixRegWrite(dev, 0x08, 0x17, 0x0000, &data, 1);
 	sonixRegWrite(dev, 0x08, 0x05, 0x0000, &sn9c1xx[5], 1);
 	sonixRegWrite(dev, 0x08, 0x07, 0x0000, &sn9c1xx[7], 1);
 	sonixRegWrite(dev, 0x08, 0x06, 0x0000, &sn9c1xx[6], 1);
 	sonixRegWrite(dev, 0x08, 0x14, 0x0000, &sn9c1xx[0x14], 1);
-	sonixRegWrite(dev, 0x08, 0x20, 0x0000, regsn20, 0x11);
+	if( spca50x->customid == SN9C325 )
+	    sonixRegWrite(dev, 0x08, 0x20, 0x0000, regsn20_sn9c325, 0x11);
+	else
+	    sonixRegWrite(dev, 0x08, 0x20, 0x0000, regsn20, 0x11);
+	
 	for (i = 0; i < 8; i++)
-		sonixRegWrite(dev, 0x08, 0x84, 0x0000, reg84, 0x15);
-	data = 0x08;
+	{
+	    if( spca50x->customid == SN9C325 )
+    		sonixRegWrite(dev, 0x08, 0x84, 0x0000, reg84_sn9c325, 0x15);
+	   else
+	         sonixRegWrite(dev, 0x08, 0x84, 0x0000, reg84, 0x15);
+	}
+
+	if( spca50x->customid == SN9C325 )
+	    data = 0x0a;
+	else
+	    data = 0x08;
 	sonixRegWrite(dev, 0x08, 0x9a, 0x0000, &data, 1);
-	data = 0x59;
+	
+	if( spca50x->customid == SN9C325 )
+	      data = 0x60;
+	else
+	      data = 0x59;
 	sonixRegWrite(dev, 0x08, 0x99, 0x0000, &data, 1);
 
 	switch (spca50x->sensor) {
@@ -859,10 +992,22 @@
 	}
 		
 		break;
+	case SENSOR_OV7648:
+		reg17 = 0xa2;
+		reg1 = 0x44;
+    		ov7648_InitSensor(spca50x);
+		if (spca50x->mode){ //320x2...
+		}
+		else { //640x...
+		}		    
+		break;;
 	}
 	sonixRegWrite(dev, 0x08, 0xc0, 0x0000, C0, 6);
 	sonixRegWrite(dev, 0x08, 0xca, 0x0000, CA, 4);
-	sonixRegWrite(dev, 0x08, 0xce, 0x0000, CE, 4);	//?? {0x1e,0xdd,0x2d,0xe7}
+	if( spca50x->customid == SN9C325 )
+	    sonixRegWrite(dev, 0x08, 0xce, 0x0000, CE_sn9c325, 4);	
+	else
+	    sonixRegWrite(dev, 0x08, 0xce, 0x0000, CE, 4);	//?? {0x1e,0xdd,0x2d,0xe7}
 
 	// here change size mode 0 -> VGA; 1 -> CIF
 	data = 0x40 | sn9c1xx[0x18] | (spca50x->mode << 4);
diff -Nru gspcav1-20071224/Sonix/sonix.h gspcav1-20071224-sn9c325-ov7648/Sonix/sonix.h
--- gspcav1-20071224/Sonix/sonix.h	2007-11-22 11:52:16.000000000 -0300
+++ gspcav1-20071224-sn9c325-ov7648/Sonix/sonix.h	2008-02-26 01:51:01.000000000 -0300
@@ -654,6 +654,7 @@
 	case SENSOR_HV7131R:
 	case SENSOR_MI0360:
 	case SENSOR_PAS202:
+	case SENSOR_OV7648:
 		set_sonixVGA(spca50x);
 		break;
 	case SENSOR_PAS106:
diff -Nru gspcav1-20071224/gspca.h gspcav1-20071224-sn9c325-ov7648/gspca.h
--- gspcav1-20071224/gspca.h	2007-12-24 13:56:47.000000000 -0300
+++ gspcav1-20071224-sn9c325-ov7648/gspca.h	2008-02-26 01:46:21.000000000 -0300
@@ -129,7 +129,7 @@
 #define SENSOR_OV7670 29
 #define SENSOR_MI1310_SOC 30
 #define SENSOR_MC501CB 31
-
+#define SENSOR_OV7648 35
 /* Alternate interface transfer sizes */
 #define SPCA50X_ALT_SIZE_0       0
 #define SPCA50X_ALT_SIZE_128     1
diff -Nru gspcav1-20071224/gspca_core.c gspcav1-20071224-sn9c325-ov7648/gspca_core.c
--- gspcav1-20071224/gspca_core.c	2007-12-24 13:56:47.000000000 -0300
+++ gspcav1-20071224-sn9c325-ov7648/gspca_core.c	2008-02-26 01:49:48.000000000 -0300
@@ -422,6 +422,7 @@
 	Lenovo,
 	LogitechQC4Notebooks,
 	PhilipsSPC220NC,
+	AvantCamera,
 	LastCamera
 };
 static struct cam_list clist[] = {
@@ -620,6 +621,7 @@
 	{Lenovo,"lenovo MI1310_SOC"},
 	{LogitechQC4Notebooks,"Logitech QuickCam for Notebooks"},
 	{PhilipsSPC220NC,"Philips SPC220NC PAC207"},
+	{AvantCamera,"Avant Camera"},
 	{-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, 0x612a)},	/* Philips spc200nc pac207 */
 	{USB_DEVICE(0x0000, 0x0000)},	/* MystFromOri Unknow Camera */
 	{}			/* Terminating entry */
 };
@@ -1926,6 +1929,7 @@
 	case SENSOR_OV7660:
 	case SENSOR_OV7620:
 	case SENSOR_MC501CB:
+	case SENSOR_OV7648:
 		break;
 	default:
 		PDEBUG(0,
@@ -3889,6 +3893,14 @@
 			spca50x->i2c_ctrl_reg = 0x20;
 			spca50x->i2c_base = 0x11;
 			break;
+		case 0x612a:
+			spca50x->desc = AvantCamera;
+			spca50x->bridge =BRIDGE_SN9CXXX;
+			spca50x->sensor = SENSOR_OV7648;
+			spca50x->customid = SN9C325;
+			spca50x->i2c_ctrl_reg = 0x81;
+			spca50x->i2c_base = 0x21;
+			break;
 		case 0x6024:
 		case 0x6025:
 			spca50x->desc = Sonix6025;
moises.png (image/png, 350.1 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.