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))