Package: libgphoto2-port0
Version: 2.3.1-5
Tags: patch
Hello,
for about month and half I was not able to
download pictures from my camera to my Linux box.
Today I finally took a look at what's different
between 2.2.1 and 2.3.1, and found that some
hack for some other Microsoft hack (MTP) was added
to the library, and that it is what is breaking
my Olympus.
Problem is that MTP's attempt to read string
descriptor 0xEE from this camera apparently
crashes its firmware, as this request returns
with -EPIPE, and device is gone from lsusb
or any other listing until it is powercycled.
I guess that lot of other devices will be affected
as well, but as I have only this camera, here
I go. Definitely better solution would be
just first probe for devices by vendor/device
ID, and after that do class-based searches
(especially these violating USB spec).
Unfortunately it does not seem doable with current
libgphoto infrastructure.
Thanks,
Petr Vandrovec
diff -urN libgphoto2-2.3.1/libgphoto2_port/usb/libusb.c
libgphoto2-2.3.1.fixed/libgphoto2_port/usb/libusb.c
--- libgphoto2-2.3.1/libgphoto2_port/usb/libusb.c 2006-11-25
06:47:35.000000000 -0800
+++ libgphoto2-2.3.1.fixed/libgphoto2_port/usb/libusb.c 2007-05-13
02:13:20.000000000 -0700
@@ -671,6 +671,10 @@
int ret,i,i1,i2;
usb_dev_handle *devh;
+ /* If string descriptor 0xEE is read from Olympus C-3000 ZOOM, it dies.
*/
+ if (dev->descriptor.idVendor == 0x07B4 && dev->descriptor.idProduct ==
0x0100)
+ return 0;
+
/* All of them are "vendor specific" device class */
#if 0
if ((dev->descriptor.bDeviceClass!=0xff) &&
(dev->descriptor.bDeviceClass!=0))
diff -urN libgphoto2-2.3.1/libgphoto2_port/usb/libusb.c
libgphoto2-2.3.1.fixed/libgphoto2_port/usb/libusb.c
--- libgphoto2-2.3.1/libgphoto2_port/usb/libusb.c 2006-11-25
06:47:35.000000000 -0800
+++ libgphoto2-2.3.1.fixed/libgphoto2_port/usb/libusb.c 2007-05-13
02:13:20.000000000 -0700
@@ -671,6 +671,10 @@
int ret,i,i1,i2;
usb_dev_handle *devh;
+ /* If string descriptor 0xEE is read from Olympus C-3000 ZOOM, it dies.
*/
+ if (dev->descriptor.idVendor == 0x07B4 && dev->descriptor.idProduct ==
0x0100)
+ return 0;
+
/* All of them are "vendor specific" device class */
#if 0
if ((dev->descriptor.bDeviceClass!=0xff) &&
(dev->descriptor.bDeviceClass!=0))