Hi,
Here's a patch against 2.4.18-pre2 that updates the USB video pwc driver
to the latest version. The patch was done by Nemosoft.
thanks,
greg k-h
diff -Nru a/drivers/usb/pwc-ctrl.c b/drivers/usb/pwc-ctrl.c
--- a/drivers/usb/pwc-ctrl.c Tue Jan 8 09:48:28 2002
+++ b/drivers/usb/pwc-ctrl.c Tue Jan 8 09:48:28 2002
@@ -1008,6 +1008,8 @@
if (pdev->type < 730)
return 0;
+ on_value /= 100;
+ off_value /= 100;
if (on_value < 0)
on_value = 0;
if (on_value > 0xff)
@@ -1048,8 +1050,8 @@
if (ret < 0)
return ret;
- *on_value = buf[0];
- *off_value = buf[1];
+ *on_value = buf[0] * 100;
+ *off_value = buf[1] * 100;
return 0;
}
@@ -1175,6 +1177,8 @@
wb.read_red = pwc_read_red_gain(pdev);
wb.read_blue = pwc_read_blue_gain(pdev);
}
+ if (copy_to_user(arg, &wb, sizeof(wb)))
+ return -EFAULT;
break;
}
diff -Nru a/drivers/usb/pwc-if.c b/drivers/usb/pwc-if.c
--- a/drivers/usb/pwc-if.c Tue Jan 8 09:48:29 2002
+++ b/drivers/usb/pwc-if.c Tue Jan 8 09:48:29 2002
@@ -39,7 +39,10 @@
/* Contributors:
- Alvarado: adding whitebalance code
- - Alistar Moire: QuickCam 3000 Pro testing
+ - Alistar Moire: QuickCam 3000 Pro device/product ID
+ - Tony Hoyle: Creative Labs Webcam 5 device/product ID
+ - Mark Burazin: solving hang in VIDIOCSYNC when camera gets unplugged
+ - Jk Fang: SOTEC device/product ID
*/
#include <linux/errno.h>
@@ -76,6 +79,8 @@
{ USB_DEVICE(0x046D, 0x08b0) },
{ USB_DEVICE(0x055D, 0x9000) },
{ USB_DEVICE(0x055D, 0x9001) },
+ { USB_DEVICE(0x041E, 0x400C) },
+ { USB_DEVICE(0x04CC, 0x8116) },
{ }
};
MODULE_DEVICE_TABLE(usb, pwc_device_table);
@@ -887,6 +892,7 @@
/* Stop camera, but only if we are sure the camera is still there */
if (!pdev->unplugged)
usb_set_interface(pdev->udev, 0, 0);
+ /* Unlinking ISOC buffers one by one */
for (i = MAX_ISO_BUFS - 1; i >= 0; i--) {
pdev->sbuf[i].urb->next = NULL;
usb_unlink_urb(pdev->sbuf[i].urb);
@@ -1493,6 +1499,12 @@
*/
add_wait_queue(&pdev->frameq, &wait);
while (pdev->full_frames == NULL) {
+ if (pdev->unplugged) {
+ remove_wait_queue(&pdev->frameq, &wait);
+ set_current_state(TASK_RUNNING);
+ return -ENODEV;
+ }
+
if (signal_pending(current)) {
remove_wait_queue(&pdev->frameq, &wait);
set_current_state(TASK_RUNNING);
@@ -1710,7 +1722,29 @@
break;
}
}
- else return NULL; /* Not Philips, Askey, Logitech or Samsung, for sure. */
+ else if (vendor_id == 0x041e) {
+ switch(product_id) {
+ case 0x400c:
+ Info("Creative Labs Webcam 5 detected.\n");
+ type_id = 730;
+ break;
+ default:
+ return NULL;
+ break;
+ }
+ }
+ else if (vendor_id == 0x04cc) {
+ switch(product_id) {
+ case 0x8116:
+ Info("SOTEC CMS-001 USB webcam detected.\n");
+ type_id = 730;
+ break;
+ default:
+ return NULL;
+ break;
+ }
+ }
+ else return NULL; /* Not Philips, Askey, Logitech, Samsung, Creative or SOTEC,
+for sure. */
memset(serial_number, 0, 30);
usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
@@ -1780,16 +1814,6 @@
if (hint < MAX_DEV_HINTS)
device_hint[hint].pdev = pdev;
-#if 0
- /* Shut down camera now (some people like the LED off) */
- if (power_save) {
- Trace(TRACE_PROBE, "Powering down camera");
- i = pwc_camera_power(pdev, 0);
- if (i < 0)
- Info("Failed to power-down the camera (%d)\n", i);
- }
-#endif
-
Trace(TRACE_PROBE, "probe() function returning struct at 0x%p.\n", pdev);
return pdev;
}
@@ -1799,6 +1823,7 @@
{
struct pwc_device *pdev;
int hint;
+ DECLARE_WAITQUEUE(wait, current);
lock_kernel();
free_mem_leak();
@@ -1833,13 +1858,19 @@
*/
wake_up(&pdev->frameq);
- /* Wait until we get a 'go' from _close(). This
- had a gigantic race condition, since we kfree()
+ /* Wait until we get a 'go' from _close(). This used
+ to have a gigantic race condition, since we kfree()
stuff here, but we have to wait until close()
- is finished. */
+ is finished.
+ */
Trace(TRACE_PROBE, "Sleeping on remove_ok.\n");
- sleep_on(&pdev->remove_ok);
+ add_wait_queue(&pdev->remove_ok, &wait);
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ /* ... wait ... */
+ schedule();
+ remove_wait_queue(&pdev->remove_ok, &wait);
+ set_current_state(TASK_RUNNING);
Trace(TRACE_PROBE, "Done sleeping.\n");
set_mem_leak(pdev->vdev);
pdev->vdev = NULL;
@@ -1920,7 +1951,7 @@
char *sizenames[PSZ_MAX] = { "sqcif", "qsif", "qcif", "sif", "cif", "vga" };
Info("Philips PCA645/646 + PCVC675/680/690 + PCVC730/740/750 webcam module
version " PWC_VERSION " loaded.\n");
- Info("Also supports the Askey VC010, Logitech Quickcam 3000 Pro and the
Samsung MPC-C10 and MPC-C30.\n");
+ Info("Also supports the Askey VC010, Logitech Quickcam 3000 Pro, Samsung
+MPC-C10 and MPC-C30, the Creative WebCam 5 and the SOTEC CMS-001.\n");
if (fps) {
if (fps < 5 || fps > 30) {
diff -Nru a/drivers/usb/pwc-ioctl.h b/drivers/usb/pwc-ioctl.h
--- a/drivers/usb/pwc-ioctl.h Tue Jan 8 09:48:29 2002
+++ b/drivers/usb/pwc-ioctl.h Tue Jan 8 09:48:29 2002
@@ -79,8 +79,8 @@
/* Used with VIDIOCPWC[SG]LED */
struct pwc_leds
{
- int led_on; /* Led on-time; range = 0..255 */
- int led_off; /* */
+ int led_on; /* Led on-time; range = 0..25000 */
+ int led_off; /* Led off-time; range = 0..25000 */
};
diff -Nru a/drivers/usb/pwc.h b/drivers/usb/pwc.h
--- a/drivers/usb/pwc.h Tue Jan 8 09:48:29 2002
+++ b/drivers/usb/pwc.h Tue Jan 8 09:48:29 2002
@@ -60,8 +60,8 @@
/* Version block */
#define PWC_MAJOR 8
-#define PWC_MINOR 4
-#define PWC_VERSION "8.4"
+#define PWC_MINOR 5
+#define PWC_VERSION "8.5"
#define PWC_NAME "pwc"
/* Turn certain features on/off */
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel