[PATCH] UBUNTU: [Hardy SRU] LP#310760 Fix the MIC of the Lenovo webcam problem

AceLan Kao acelan.kao at canonical.com
Tue Sep 1 09:58:38 UTC 2009


SRU JUSTIFICATION

IMPACT: The MIC of the Lenovo webcam doesn't work after launching the
camera, because of the i2c command that turn on/off the LED for the
camera is wrong and will impact the MIC function.

FIX: By snooping the USB traffic from Windows and extracting the correct
i2c commands that turn on/off the LED. The patch goes to the V4L/DVB
tree contains other bug fixes that introduced from the following two
2.6.29 commits
6af4e7a V4L/DVB (10424): gspca - vc032x: Add resolution 1280x1024 for
sensor mi1310_soc.
a92e906 V4L/DVB (10420): gspca - vc032x: Webcam 041e:405b added and
mi1310_soc updated.
I only merge back the LED part, since Hardy doesn't have that problem.
The patch is already accepted by the V4L/DVB branch and will be merged
into upstream kernel later.
http://linuxtv.org/hg/v4l-dvb/rev/49966c5f2052

TEST: This patch work fine with the Lenovo webcam I have.

git://kernel.ubuntu.com/acelan/ubuntu-hardy-lum.git lp310760

Signed-off-by: AceLan Kao <acelan.kao at canonical.com>
---
 ubuntu/media/gspcav1/Vimicro/vc032x.h |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/ubuntu/media/gspcav1/Vimicro/vc032x.h b/ubuntu/media/gspcav1/Vimicro/vc032x.h
index 2bd1f67..7a1a02c 100644
--- a/ubuntu/media/gspcav1/Vimicro/vc032x.h
+++ b/ubuntu/media/gspcav1/Vimicro/vc032x.h
@@ -509,6 +509,8 @@ static void vc0321_start(struct usb_spca50x *spca50x)
 	    		/* 640x480 */
 	   		 err = vc0321WriteVector(spca50x, mi1310_socinitVGA_JPG);
 		}
+		// turn on LED
+		spca5xxRegWrite(spca50x->dev, 0x89, 0x058c, 0x0000, NULL, 0);
 	break;
 	default:
 		PDEBUG(0, "Damned !! no sensor found Bye");
@@ -554,7 +556,12 @@ static void vc0321_start(struct usb_spca50x *spca50x)
 static void vc0321_stopN(struct usb_spca50x *spca50x)
 {
     struct usb_device *dev = spca50x->dev;
-    spca5xxRegWrite(dev, 0x89, 0xffff, 0xffff, NULL, 0);
+
+    if( spca50x->sensor == SENSOR_MI1310_SOC)
+        spca5xxRegWrite(dev, 0x89, 0x058c, 0x00ff, NULL, 0);
+    else
+        spca5xxRegWrite(dev, 0x89, 0xffff, 0xffff, NULL, 0);
+
     spca5xxRegWrite(dev, 0xa0, 0x01, 0xb301, NULL, 0);
     spca5xxRegWrite(dev, 0xa0, 0x09, 0xb003, NULL, 0);
 }
@@ -562,7 +569,10 @@ static void vc0321_stopN(struct usb_spca50x *spca50x)
 static void vc0321_stop0(struct usb_spca50x *spca50x)
 {
     struct usb_device *dev = spca50x->dev;
-    spca5xxRegWrite(dev, 0x89, 0xffff, 0xffff, NULL, 0);
+    if( spca50x->sensor == SENSOR_MI1310_SOC)
+        spca5xxRegWrite(dev, 0x89, 0x058c, 0x00ff, NULL, 0);
+    else
+        spca5xxRegWrite(dev, 0x89, 0xffff, 0xffff, NULL, 0);
 }
 
 static void vc0321_shutdown(struct usb_spca50x *spca50x)
-- 
1.6.0.4





More information about the kernel-team mailing list