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

Leandro Costantino <[email protected]>
Newsgroups gmane.linux.drivers.spca50x.devel
Message-ID <[email protected]>
Hi, this is a testing patch ( maybe it's already finished )
but i have to do some further test tomorrow. The webcam i have here
is a "Avant Webcam", 

Chipset: SN9C325
Sensor: OV7648

Tested on 320 & 640x480 ( on win2 you have up to 1200x1024 ... weird? )
Anyway, its kinda "pixelated", but , the image quality is the same 
as in windows, so i dont know if this particular webcam is  working good or
not ( i will test that tomorrow )

So, if anyone want to test....

Tested on Rxart Desktop 3.2 - kernel 2.6.22-2-...
I attach 2 screenshots. Support is basic, anyone is welcome to add "missing
features" for this chipset.

pd: i will update this topic on this days with more results..


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.1 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 02:02:38.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,55 @@
 };
 //		reg0x04		reg0x07		reg 0x10
 //expo  = (COM1 & 0x02) | (AECHH & 0x2f <<10) [ (AECh << 2)
+static __u8 ov7648_sensor_init[][8] =
+{
+     {0xA1,0x6E,0x3F,0x20,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x3F,0x00,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x3E,0x00,0x00,0x00,0x00,0x10},
+     {0xA1,0x6E,0x3E,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,0x04,0x10},
+     {0xB1,0x6E,0x2B,0x00,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x2d,0x14,0x35,0x61,0x84,0x10},
+     {0xD1,0x6E,0x31,0xA2,0xB2,0xD8,0xFF,0x10},
+     {0xD1,0x6E,0x35,0x06,0x1e,0x12,0x02,0x10},
+     {0xD1,0x6E,0x38,0xAA,0x53,0x37,0xD5,0x10},
+     {0xD1,0x6E,0x35,0x06,0x1e,0x12,0x02,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},
+     {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},
+     {0xD1,0x6E,0x6B,0x00,0x00,0x00,0x00,0x10},
+     {0xD1,0x6E,0x6F,0x00,0x00,0x00,0x00,0x10},
+     {0xC1,0x6E,0x73,0x10,0x80,0xEB,0x00,0x10},
+     {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
+     {0xA1,0x6E,0x06,0x05,0x00,0x00,0x00,0x10}, //RED
+     {0xA1,0x6E,0x07,0x70,0x00,0x00,0x00,0x10}, //R
+     {0xC1,0x6E,0x1A,0x05,0x6F,0x4C,0x00,0x10}, //R
+     {0xA1,0x6E,0x18,0x63,0x00,0x00,0x00,0x10}, //RED 
+     {0, 0, 0, 0, 0, 0, 0, 0}
+};
+
 
 #if 0
 static __u8 qtable1[] = {
@@ -607,6 +678,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 +699,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 +715,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 +749,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 +802,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 +823,10 @@
 	case SENSOR_OV7660:
 		sn9c1xx = sn_ov7660;
 		break;
+	case SENSOR_OV7648:
+		sn9c1xx = sn_ov7648;
+		data = 0x29;
+		break;
 	}
 	if (sn9c1xx == NULL)
 		return;
@@ -746,6 +845,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 +865,10 @@
 	case SENSOR_OV7660:
 		sn9c1xx = sn_ov7660;
 		break;
+	case SENSOR_OV7648:
+		sn9c1xx = sn_ov7648;
+    		break;
+
 	}
 	if (sn9c1xx == NULL)
 		return;
@@ -773,15 +877,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 +913,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 +987,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;
320.png (image/png, 97 KB) - not displayed
640.png (image/png, 288.7 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.