| OLD | NEW |
| 1 /* | 1 /* |
| 2 * \file libusb1-glue.c | 2 * \file libusb1-glue.c |
| 3 * Low-level USB interface glue towards libusb. | 3 * Low-level USB interface glue towards libusb. |
| 4 * | 4 * |
| 5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com> | 5 * Copyright (C) 2005-2007 Richard A. Low <richard@wentnet.com> |
| 6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se> | 6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se> |
| 7 * Copyright (C) 2006-2012 Marcus Meissner | 7 * Copyright (C) 2006-2012 Marcus Meissner |
| 8 * Copyright (C) 2007 Ted Bullock | 8 * Copyright (C) 2007 Ted Bullock |
| 9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com> | 9 * Copyright (C) 2008 Chris Bagwell <chris@cnpbagwell.com> |
| 10 * | 10 * |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 /* Internal data types */ | 70 /* Internal data types */ |
| 71 struct mtpdevice_list_struct { | 71 struct mtpdevice_list_struct { |
| 72 libusb_device *device; | 72 libusb_device *device; |
| 73 PTPParams *params; | 73 PTPParams *params; |
| 74 PTP_USB *ptp_usb; | 74 PTP_USB *ptp_usb; |
| 75 uint32_t bus_location; | 75 uint32_t bus_location; |
| 76 struct mtpdevice_list_struct *next; | 76 struct mtpdevice_list_struct *next; |
| 77 }; | 77 }; |
| 78 typedef struct mtpdevice_list_struct mtpdevice_list_t; | 78 typedef struct mtpdevice_list_struct mtpdevice_list_t; |
| 79 | 79 |
| 80 struct ptp_event_cb_data { | |
| 81 PTPEventCbFn cb; | |
| 82 void *user_data; | |
| 83 PTPParams *params; | |
| 84 }; | |
| 85 | |
| 86 static const LIBMTP_device_entry_t mtp_device_table[] = { | 80 static const LIBMTP_device_entry_t mtp_device_table[] = { |
| 87 /* We include an .h file which is shared between us and libgphoto2 */ | 81 /* We include an .h file which is shared between us and libgphoto2 */ |
| 88 #include "music-players.h" | 82 #include "music-players.h" |
| 89 }; | 83 }; |
| 90 static const int mtp_device_table_size = | 84 static const int mtp_device_table_size = sizeof(mtp_device_table) / sizeof(LIBMT
P_device_entry_t); |
| 91 sizeof(mtp_device_table) / sizeof(LIBMTP_device_entry_t); | |
| 92 | 85 |
| 93 // Local functions | 86 // Local functions |
| 94 static LIBMTP_error_number_t init_usb(); | 87 static LIBMTP_error_number_t init_usb(); |
| 95 static void close_usb(PTP_USB* ptp_usb); | 88 static void close_usb(PTP_USB* ptp_usb); |
| 96 static int find_interface_and_endpoints(libusb_device *dev, | 89 static int find_interface_and_endpoints(libusb_device *dev, |
| 97 uint8_t *conf, | 90 uint8_t *conf, |
| 98 uint8_t *interface, | 91 uint8_t *interface, |
| 99 uint8_t *altsetting, | 92 uint8_t *altsetting, |
| 100 int* inep, | 93 int* inep, |
| 101 int* inep_maxpacket, | 94 int* inep_maxpacket, |
| 102 int* outep, | 95 int* outep, |
| 103 int* outep_maxpacket, | 96 int* outep_maxpacket, |
| 104 int* intep); | 97 int* intep); |
| 105 static void clear_stall(PTP_USB* ptp_usb); | 98 static void clear_stall(PTP_USB* ptp_usb); |
| 106 static int init_ptp_usb(PTPParams* params, | 99 static int init_ptp_usb (PTPParams* params, PTP_USB* ptp_usb, libusb_device* dev
); |
| 107 » » PTP_USB* ptp_usb, libusb_device* dev); | 100 static short ptp_write_func (unsigned long,PTPDataHandler*,void *data,unsigned l
ong*); |
| 108 static short ptp_write_func(unsigned long, | 101 static short ptp_read_func (unsigned long,PTPDataHandler*,void *data,unsigned lo
ng*,int); |
| 109 » » PTPDataHandler*, void *data, unsigned long*); | 102 static int usb_get_endpoint_status(PTP_USB* ptp_usb, int ep, uint16_t* status); |
| 110 static short ptp_read_func (unsigned long, | |
| 111 » » PTPDataHandler*, void *data, unsigned long*, int); | |
| 112 static int usb_get_endpoint_status(PTP_USB* ptp_usb, | |
| 113 » » int ep, uint16_t* status); | |
| 114 | 103 |
| 115 /** | 104 /** |
| 116 * Get a list of the supported USB devices. | 105 * Get a list of the supported USB devices. |
| 117 * | 106 * |
| 118 * The developers depend on users of this library to constantly | 107 * The developers depend on users of this library to constantly |
| 119 * add in to the list of supported devices. What we need is the | 108 * add in to the list of supported devices. What we need is the |
| 120 * device name, USB Vendor ID (VID) and USB Product ID (PID). | 109 * device name, USB Vendor ID (VID) and USB Product ID (PID). |
| 121 * put this into a bug ticket at the project homepage, please. | 110 * put this into a bug ticket at the project homepage, please. |
| 122 * The VID/PID is used to let e.g. udev lift the device to | 111 * The VID/PID is used to let e.g. udev lift the device to |
| 123 * console userspace access when it's plugged in. | 112 * console userspace access when it's plugged in. |
| 124 * | 113 * |
| 125 * @param devices a pointer to a pointer that will hold a device | 114 * @param devices a pointer to a pointer that will hold a device |
| 126 * list after the call to this function, if it was | 115 * list after the call to this function, if it was |
| 127 * successful. | 116 * successful. |
| 128 * @param numdevs a pointer to an integer that will hold the number | 117 * @param numdevs a pointer to an integer that will hold the number |
| 129 * of devices in the device list if the call was successful. | 118 * of devices in the device list if the call was successful. |
| 130 * @return 0 if the list was successfull retrieved, any other | 119 * @return 0 if the list was successfull retrieved, any other |
| 131 * value means failure. | 120 * value means failure. |
| 132 */ | 121 */ |
| 133 int LIBMTP_Get_Supported_Devices_List(LIBMTP_device_entry_t ** const devices, | 122 int LIBMTP_Get_Supported_Devices_List(LIBMTP_device_entry_t ** const devices, in
t * const numdevs) |
| 134 » » » » int * const numdevs) | |
| 135 { | 123 { |
| 136 *devices = (LIBMTP_device_entry_t *) &mtp_device_table; | 124 *devices = (LIBMTP_device_entry_t *) &mtp_device_table; |
| 137 *numdevs = mtp_device_table_size; | 125 *numdevs = mtp_device_table_size; |
| 138 return 0; | 126 return 0; |
| 139 } | 127 } |
| 140 | 128 |
| 141 | 129 |
| 142 static LIBMTP_error_number_t init_usb() | 130 static LIBMTP_error_number_t init_usb() |
| 143 { | 131 { |
| 144 static int libusb1_initialized = 0; | |
| 145 | |
| 146 /* | 132 /* |
| 147 * Some additional libusb debugging please. | 133 * Some additional libusb debugging please. |
| 148 * We use the same level debug between MTP and USB. | 134 * We use the same level debug between MTP and USB. |
| 149 */ | 135 */ |
| 150 if (libusb1_initialized) | |
| 151 return LIBMTP_ERROR_NONE; | |
| 152 | |
| 153 if (libusb_init(NULL) < 0) { | 136 if (libusb_init(NULL) < 0) { |
| 154 LIBMTP_ERROR("Libusb1 init failed\n"); | 137 LIBMTP_ERROR("Libusb1 init failed\n"); |
| 155 return LIBMTP_ERROR_USB_LAYER; | 138 return LIBMTP_ERROR_USB_LAYER; |
| 156 } | 139 } |
| 157 | 140 |
| 158 libusb1_initialized = 1; | |
| 159 | |
| 160 if ((LIBMTP_debug & LIBMTP_DEBUG_USB) != 0) | 141 if ((LIBMTP_debug & LIBMTP_DEBUG_USB) != 0) |
| 161 libusb_set_debug(NULL,9); | 142 libusb_set_debug(NULL,9); |
| 162 return LIBMTP_ERROR_NONE; | 143 return LIBMTP_ERROR_NONE; |
| 163 } | 144 } |
| 164 | 145 |
| 165 /** | 146 /** |
| 166 * Small recursive function to append a new usb_device to the linked | 147 * Small recursive function to append a new usb_device to the linked list of |
| 167 * list of USB MTP devices | 148 * USB MTP devices |
| 168 * @param devlist dynamic linked list of pointers to usb devices with | 149 * @param devlist dynamic linked list of pointers to usb devices with MTP |
| 169 * MTP properties, to be extended with new device. | 150 * properties, to be extended with new device. |
| 170 * @param newdevice the new device to add. | 151 * @param newdevice the new device to add. |
| 171 * @param bus_location bus for this device. | 152 * @param bus_location bus for this device. |
| 172 * @return an extended array or NULL on failure. | 153 * @return an extended array or NULL on failure. |
| 173 */ | 154 */ |
| 174 static mtpdevice_list_t *append_to_mtpdevice_list(mtpdevice_list_t *devlist, | 155 static mtpdevice_list_t *append_to_mtpdevice_list(mtpdevice_list_t *devlist, |
| 175 libusb_device *newdevice, | 156 libusb_device *newdevice, |
| 157 |
| 176 uint32_t bus_location) | 158 uint32_t bus_location) |
| 177 { | 159 { |
| 178 mtpdevice_list_t *new_list_entry; | 160 mtpdevice_list_t *new_list_entry; |
| 179 | 161 |
| 180 new_list_entry = (mtpdevice_list_t *) malloc(sizeof(mtpdevice_list_t)); | 162 new_list_entry = (mtpdevice_list_t *) malloc(sizeof(mtpdevice_list_t)); |
| 181 if (new_list_entry == NULL) { | 163 if (new_list_entry == NULL) { |
| 182 return NULL; | 164 return NULL; |
| 183 } | 165 } |
| 184 // Fill in USB device, if we *HAVE* to make a copy of the device do it here. | 166 // Fill in USB device, if we *HAVE* to make a copy of the device do it here. |
| 185 new_list_entry->device = newdevice; | 167 new_list_entry->device = newdevice; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 /* | 285 /* |
| 304 * We only want to probe for the OS descriptor if the | 286 * We only want to probe for the OS descriptor if the |
| 305 * device is LIBUSB_CLASS_VENDOR_SPEC or one of the interfaces | 287 * device is LIBUSB_CLASS_VENDOR_SPEC or one of the interfaces |
| 306 * in it is, so flag if we find an interface like this. | 288 * in it is, so flag if we find an interface like this. |
| 307 */ | 289 */ |
| 308 if (intf->bInterfaceClass == LIBUSB_CLASS_VENDOR_SPEC) { | 290 if (intf->bInterfaceClass == LIBUSB_CLASS_VENDOR_SPEC) { |
| 309 found_vendor_spec_interface = 1; | 291 found_vendor_spec_interface = 1; |
| 310 } | 292 } |
| 311 | 293 |
| 312 /* | 294 /* |
| 313 » * TODO: Check for Still Image Capture class with PIMA 15740 | 295 » * Check for Still Image Capture class with PIMA 15740 protocol, |
| 314 » * protocol, also known as PTP | 296 » * also known as PTP |
| 315 */ | 297 */ |
| 316 if (intf->bInterfaceClass == LIBUSB_CLASS_PTP | 298 if (intf->bInterfaceClass == LIBUSB_CLASS_PTP |
| 317 && intf->bInterfaceSubClass == 0x01 | 299 && intf->bInterfaceSubClass == 0x01 |
| 318 && intf->bInterfaceProtocol == 0x01) { | 300 && intf->bInterfaceProtocol == 0x01) { |
| 319 if (dumpfile != NULL) { | 301 if (dumpfile != NULL) { |
| 320 fprintf(dumpfile, "Configuration %d, interface %d, altsetting %d:\
n", i, j, k); | 302 fprintf(dumpfile, "Configuration %d, interface %d, altsetting %d:\
n", i, j, k); |
| 321 fprintf(dumpfile, " Found PTP device, check vendor " | 303 fprintf(dumpfile, " Found PTP device, check vendor " |
| 322 "extension...\n"); | 304 "extension...\n"); |
| 323 } | 305 } |
| 324 libusb_close(devh); | 306 libusb_close(devh); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 349 if (libusb_kernel_driver_active(devh, config->interface[j].altsetting[
k].iInterface)) | 331 if (libusb_kernel_driver_active(devh, config->interface[j].altsetting[
k].iInterface)) |
| 350 { | 332 { |
| 351 /* | 333 /* |
| 352 * Specifically avoid probing anything else than USB mass storage de
vices | 334 * Specifically avoid probing anything else than USB mass storage de
vices |
| 353 * and non-associated drivers in Linux. | 335 * and non-associated drivers in Linux. |
| 354 */ | 336 */ |
| 355 if (config->interface[j].altsetting[k].bInterfaceClass != | 337 if (config->interface[j].altsetting[k].bInterfaceClass != |
| 356 LIBUSB_CLASS_MASS_STORAGE) { | 338 LIBUSB_CLASS_MASS_STORAGE) { |
| 357 LIBMTP_INFO("avoid probing device using attached kernel interface\
n"); | 339 LIBMTP_INFO("avoid probing device using attached kernel interface\
n"); |
| 358 libusb_free_config_descriptor(config); | 340 libusb_free_config_descriptor(config); |
| 359 libusb_close(devh); | |
| 360 return 0; | 341 return 0; |
| 361 } | 342 } |
| 362 } | 343 } |
| 363 } | 344 } |
| 364 } | 345 } |
| 365 libusb_free_config_descriptor(config); | 346 libusb_free_config_descriptor(config); |
| 366 } | 347 } |
| 367 | 348 |
| 368 /* | 349 /* |
| 369 * Only probe for OS descriptor if the device is vendor specific | 350 * Only probe for OS descriptor if the device is vendor specific |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 libusb_device **devs = NULL; | 564 libusb_device **devs = NULL; |
| 584 int i; | 565 int i; |
| 585 LIBMTP_error_number_t init_usb_ret; | 566 LIBMTP_error_number_t init_usb_ret; |
| 586 | 567 |
| 587 init_usb_ret = init_usb(); | 568 init_usb_ret = init_usb(); |
| 588 if (init_usb_ret != LIBMTP_ERROR_NONE) | 569 if (init_usb_ret != LIBMTP_ERROR_NONE) |
| 589 return 0; | 570 return 0; |
| 590 | 571 |
| 591 nrofdevs = libusb_get_device_list (NULL, &devs); | 572 nrofdevs = libusb_get_device_list (NULL, &devs); |
| 592 for (i = 0; i < nrofdevs ; i++ ) { | 573 for (i = 0; i < nrofdevs ; i++ ) { |
| 574 |
| 593 if (libusb_get_bus_number(devs[i]) != busno) | 575 if (libusb_get_bus_number(devs[i]) != busno) |
| 594 » continue; | 576 continue; |
| 595 if (libusb_get_device_address(devs[i]) != devno) | 577 if (libusb_get_device_address(devs[i]) != devno) |
| 596 » continue; | 578 continue; |
| 597 if (probe_device_descriptor(devs[i], NULL)) | 579 |
| 580 if (probe_device_descriptor(devs[i], NULL)) |
| 598 return 1; | 581 return 1; |
| 599 } | 582 } |
| 600 return 0; | 583 return 0; |
| 601 } | 584 } |
| 602 | 585 |
| 603 /** | 586 /** |
| 604 * Detect the raw MTP device descriptors and return a list of | 587 * Detect the raw MTP device descriptors and return a list of |
| 605 * of the devices found. | 588 * of the devices found. |
| 606 * | 589 * |
| 607 * @param devices a pointer to a variable that will hold | 590 * @param devices a pointer to a variable that will hold |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is a %s %s.\n", | 664 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is a %s %s.\n", |
| 682 i, | 665 i, |
| 683 desc.idVendor, | 666 desc.idVendor, |
| 684 desc.idProduct, | 667 desc.idProduct, |
| 685 mtp_device_table[j].vendor, | 668 mtp_device_table[j].vendor, |
| 686 mtp_device_table[j].product); | 669 mtp_device_table[j].product); |
| 687 break; | 670 break; |
| 688 } | 671 } |
| 689 } | 672 } |
| 690 if (!device_known) { | 673 if (!device_known) { |
| 691 device_unknown(i, desc.idVendor, desc.idProduct); | 674 // This device is unknown to the developers |
| 675 LIBMTP_ERROR("Device %d (VID=%04x and PID=%04x) is UNKNOWN.\n", |
| 676 » i, |
| 677 » desc.idVendor, |
| 678 » desc.idProduct); |
| 679 LIBMTP_ERROR("Please report this VID/PID and the device model to the " |
| 680 » "libmtp development team\n"); |
| 681 /* |
| 682 * Trying to get iManufacturer or iProduct from the device at this |
| 683 * point would require opening a device handle, that we don't want |
| 684 * to do right now. (Takes time for no good enough reason.) |
| 685 */ |
| 692 } | 686 } |
| 693 // Save the location on the bus | 687 // Save the location on the bus |
| 694 retdevs[i].bus_location = libusb_get_bus_number (dev->device); | 688 retdevs[i].bus_location = libusb_get_bus_number (dev->device); |
| 695 retdevs[i].devnum = libusb_get_device_address (dev->device); | 689 retdevs[i].devnum = libusb_get_device_address (dev->device); |
| 696 i++; | 690 i++; |
| 697 dev = dev->next; | 691 dev = dev->next; |
| 698 } | 692 } |
| 699 *devices = retdevs; | 693 *devices = retdevs; |
| 700 *numdevs = i; | 694 *numdevs = i; |
| 701 free_mtpdevice_list(devlist); | 695 free_mtpdevice_list(devlist); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 ptp_read_func ( | 817 ptp_read_func ( |
| 824 unsigned long size, PTPDataHandler *handler,void *data, | 818 unsigned long size, PTPDataHandler *handler,void *data, |
| 825 unsigned long *readbytes, | 819 unsigned long *readbytes, |
| 826 int readzero | 820 int readzero |
| 827 ) { | 821 ) { |
| 828 PTP_USB *ptp_usb = (PTP_USB *)data; | 822 PTP_USB *ptp_usb = (PTP_USB *)data; |
| 829 unsigned long toread = 0; | 823 unsigned long toread = 0; |
| 830 int ret = 0; | 824 int ret = 0; |
| 831 int xread; | 825 int xread; |
| 832 unsigned long curread = 0; | 826 unsigned long curread = 0; |
| 827 unsigned long written; |
| 833 unsigned char *bytes; | 828 unsigned char *bytes; |
| 834 int expect_terminator_byte = 0; | 829 int expect_terminator_byte = 0; |
| 835 unsigned long usb_inep_maxpacket_size; | |
| 836 unsigned long context_block_size_1; | |
| 837 unsigned long context_block_size_2; | |
| 838 uint16_t ptp_dev_vendor_id = ptp_usb->rawdevice.device_entry.vendor_id; | |
| 839 | 830 |
| 840 //"iRiver" device special handling | |
| 841 if (ptp_dev_vendor_id == 0x4102 || ptp_dev_vendor_id == 0x1006) { | |
| 842 usb_inep_maxpacket_size = ptp_usb->inep_maxpacket; | |
| 843 if (usb_inep_maxpacket_size == 0x400) { | |
| 844 context_block_size_1 = CONTEXT_BLOCK_SIZE_1 - 0x200; | |
| 845 context_block_size_2 = CONTEXT_BLOCK_SIZE_2 + 0x200; | |
| 846 } | |
| 847 else { | |
| 848 context_block_size_1 = CONTEXT_BLOCK_SIZE_1; | |
| 849 context_block_size_2 = CONTEXT_BLOCK_SIZE_2; | |
| 850 } | |
| 851 } | |
| 852 // This is the largest block we'll need to read in. | 831 // This is the largest block we'll need to read in. |
| 853 bytes = malloc(CONTEXT_BLOCK_SIZE); | 832 bytes = malloc(CONTEXT_BLOCK_SIZE); |
| 854 while (curread < size) { | 833 while (curread < size) { |
| 855 | 834 |
| 856 LIBMTP_USB_DEBUG("Remaining size to read: 0x%04lx bytes\n", size - curread); | 835 LIBMTP_USB_DEBUG("Remaining size to read: 0x%04lx bytes\n", size - curread); |
| 857 | 836 |
| 858 // check equal to condition here | 837 // check equal to condition here |
| 859 if (size - curread < CONTEXT_BLOCK_SIZE) | 838 if (size - curread < CONTEXT_BLOCK_SIZE) |
| 860 { | 839 { |
| 861 // this is the last packet | 840 // this is the last packet |
| 862 toread = size - curread; | 841 toread = size - curread; |
| 863 // this is equivalent to zero read for these devices | 842 // this is equivalent to zero read for these devices |
| 864 if (readzero && FLAG_NO_ZERO_READS(ptp_usb) && toread % 64 == 0) { | 843 if (readzero && FLAG_NO_ZERO_READS(ptp_usb) && toread % 64 == 0) { |
| 865 toread += 1; | 844 toread += 1; |
| 866 expect_terminator_byte = 1; | 845 expect_terminator_byte = 1; |
| 867 } | 846 } |
| 868 } | 847 } |
| 869 else if (ptp_dev_vendor_id == 0x4102 || ptp_dev_vendor_id == 0x1006) { | 848 else if (curread == 0) |
| 870 » //"iRiver" device special handling | 849 // we are first packet, but not last packet |
| 871 » if (curread == 0) | 850 toread = CONTEXT_BLOCK_SIZE_1; |
| 872 » » // we are first packet, but not last packet | 851 else if (toread == CONTEXT_BLOCK_SIZE_1) |
| 873 » » toread = context_block_size_1; | 852 toread = CONTEXT_BLOCK_SIZE_2; |
| 874 » else if (toread == context_block_size_1) | 853 else if (toread == CONTEXT_BLOCK_SIZE_2) |
| 875 » » toread = context_block_size_2; | 854 toread = CONTEXT_BLOCK_SIZE_1; |
| 876 » else if (toread == context_block_size_2) | |
| 877 » » toread = context_block_size_1; | |
| 878 » else | |
| 879 » » LIBMTP_INFO("unexpected toread size 0x%04x, 0x%04x remaining
bytes\n", | |
| 880 » » » » (unsigned int) toread, (unsigned int) (size-curr
ead)); | |
| 881 } | |
| 882 else | 855 else |
| 883 » toread = CONTEXT_BLOCK_SIZE; | 856 LIBMTP_INFO("unexpected toread size 0x%04x, 0x%04x remaining bytes\n", |
| 857 » (unsigned int) toread, (unsigned int) (size-curread)); |
| 884 | 858 |
| 885 LIBMTP_USB_DEBUG("Reading in 0x%04lx bytes\n", toread); | 859 LIBMTP_USB_DEBUG("Reading in 0x%04lx bytes\n", toread); |
| 886 | 860 |
| 887 ret = USB_BULK_READ(ptp_usb->handle, | 861 ret = USB_BULK_READ(ptp_usb->handle, |
| 888 ptp_usb->inep, | 862 ptp_usb->inep, |
| 889 bytes, | 863 bytes, |
| 890 toread, | 864 toread, |
| 891 &xread, | 865 &xread, |
| 892 ptp_usb->timeout); | 866 ptp_usb->timeout); |
| 893 | 867 |
| 894 LIBMTP_USB_DEBUG("Result of read: 0x%04x (%d bytes)\n", ret, xread); | 868 LIBMTP_USB_DEBUG("Result of read: 0x%04x (%d bytes)\n", ret, xread); |
| 895 | 869 |
| 896 if (ret != LIBUSB_SUCCESS) | 870 if (ret != LIBUSB_SUCCESS) |
| 897 return PTP_ERROR_IO; | 871 return PTP_ERROR_IO; |
| 898 | 872 |
| 899 LIBMTP_USB_DEBUG("<==USB IN\n"); | 873 LIBMTP_USB_DEBUG("<==USB IN\n"); |
| 900 if (xread == 0) | 874 if (xread == 0) |
| 901 LIBMTP_USB_DEBUG("Zero Read\n"); | 875 LIBMTP_USB_DEBUG("Zero Read\n"); |
| 902 else | 876 else |
| 903 LIBMTP_USB_DATA(bytes, xread, 16); | 877 LIBMTP_USB_DATA(bytes, xread, 16); |
| 904 | 878 |
| 905 // want to discard extra byte | 879 // want to discard extra byte |
| 906 if (expect_terminator_byte && xread == toread) | 880 if (expect_terminator_byte && xread == toread) |
| 907 { | 881 { |
| 908 LIBMTP_USB_DEBUG("<==USB IN\nDiscarding extra byte\n"); | 882 LIBMTP_USB_DEBUG("<==USB IN\nDiscarding extra byte\n"); |
| 909 | 883 |
| 910 xread--; | 884 xread--; |
| 911 } | 885 } |
| 912 | 886 |
| 913 int putfunc_ret = handler->putfunc(NULL, handler->priv, xread, bytes); | 887 int putfunc_ret = handler->putfunc(NULL, handler->priv, xread, bytes, &writt
en); |
| 914 if (putfunc_ret != PTP_RC_OK) | 888 if (putfunc_ret != PTP_RC_OK) |
| 915 return putfunc_ret; | 889 return putfunc_ret; |
| 916 | 890 |
| 917 ptp_usb->current_transfer_complete += xread; | 891 ptp_usb->current_transfer_complete += xread; |
| 918 curread += xread; | 892 curread += xread; |
| 919 | 893 |
| 920 // Increase counters, call callback | 894 // Increase counters, call callback |
| 921 if (ptp_usb->callback_active) { | 895 if (ptp_usb->callback_active) { |
| 922 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total)
{ | 896 if (ptp_usb->current_transfer_complete >= ptp_usb->current_transfer_total)
{ |
| 923 // send last update and disable callback. | 897 // send last update and disable callback. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 977 unsigned long curwrite = 0; | 951 unsigned long curwrite = 0; |
| 978 unsigned char *bytes; | 952 unsigned char *bytes; |
| 979 | 953 |
| 980 // This is the largest block we'll need to read in. | 954 // This is the largest block we'll need to read in. |
| 981 bytes = malloc(CONTEXT_BLOCK_SIZE); | 955 bytes = malloc(CONTEXT_BLOCK_SIZE); |
| 982 if (!bytes) { | 956 if (!bytes) { |
| 983 return PTP_ERROR_IO; | 957 return PTP_ERROR_IO; |
| 984 } | 958 } |
| 985 while (curwrite < size) { | 959 while (curwrite < size) { |
| 986 unsigned long usbwritten = 0; | 960 unsigned long usbwritten = 0; |
| 987 int xwritten = 0; | 961 int xwritten; |
| 988 | 962 |
| 989 towrite = size-curwrite; | 963 towrite = size-curwrite; |
| 990 if (towrite > CONTEXT_BLOCK_SIZE) { | 964 if (towrite > CONTEXT_BLOCK_SIZE) { |
| 991 towrite = CONTEXT_BLOCK_SIZE; | 965 towrite = CONTEXT_BLOCK_SIZE; |
| 992 } else { | 966 } else { |
| 993 // This magic makes packets the same size that WMP send them. | 967 // This magic makes packets the same size that WMP send them. |
| 994 if (towrite > ptp_usb->outep_maxpacket && towrite % ptp_usb->outep_maxpack
et != 0) { | 968 if (towrite > ptp_usb->outep_maxpacket && towrite % ptp_usb->outep_maxpack
et != 0) { |
| 995 towrite -= towrite % ptp_usb->outep_maxpacket; | 969 towrite -= towrite % ptp_usb->outep_maxpacket; |
| 996 } | 970 } |
| 997 } | 971 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 if (priv->curoff + tocopy > priv->size) | 1060 if (priv->curoff + tocopy > priv->size) |
| 1087 tocopy = priv->size - priv->curoff; | 1061 tocopy = priv->size - priv->curoff; |
| 1088 memcpy (data, priv->data + priv->curoff, tocopy); | 1062 memcpy (data, priv->data + priv->curoff, tocopy); |
| 1089 priv->curoff += tocopy; | 1063 priv->curoff += tocopy; |
| 1090 *gotlen = tocopy; | 1064 *gotlen = tocopy; |
| 1091 return PTP_RC_OK; | 1065 return PTP_RC_OK; |
| 1092 } | 1066 } |
| 1093 | 1067 |
| 1094 static uint16_t | 1068 static uint16_t |
| 1095 memory_putfunc(PTPParams* params, void* private, | 1069 memory_putfunc(PTPParams* params, void* private, |
| 1096 » unsigned long sendlen, unsigned char *data | 1070 » unsigned long sendlen, unsigned char *data, |
| 1071 » unsigned long *putlen |
| 1097 ) { | 1072 ) { |
| 1098 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private; | 1073 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)private; |
| 1099 | 1074 |
| 1100 if (priv->curoff + sendlen > priv->size) { | 1075 if (priv->curoff + sendlen > priv->size) { |
| 1101 priv->data = realloc (priv->data, priv->curoff+sendlen); | 1076 priv->data = realloc (priv->data, priv->curoff+sendlen); |
| 1102 priv->size = priv->curoff + sendlen; | 1077 priv->size = priv->curoff + sendlen; |
| 1103 } | 1078 } |
| 1104 memcpy (priv->data + priv->curoff, data, sendlen); | 1079 memcpy (priv->data + priv->curoff, data, sendlen); |
| 1105 priv->curoff += sendlen; | 1080 priv->curoff += sendlen; |
| 1081 *putlen = sendlen; |
| 1106 return PTP_RC_OK; | 1082 return PTP_RC_OK; |
| 1107 } | 1083 } |
| 1108 | 1084 |
| 1109 /* init private struct for receiving data. */ | 1085 /* init private struct for receiving data. */ |
| 1110 static uint16_t | 1086 static uint16_t |
| 1111 ptp_init_recv_memory_handler(PTPDataHandler *handler) { | 1087 ptp_init_recv_memory_handler(PTPDataHandler *handler) { |
| 1112 PTPMemHandlerPrivate* priv; | 1088 PTPMemHandlerPrivate* priv; |
| 1113 priv = malloc (sizeof(PTPMemHandlerPrivate)); | 1089 priv = malloc (sizeof(PTPMemHandlerPrivate)); |
| 1114 handler->priv = priv; | 1090 handler->priv = priv; |
| 1115 handler->getfunc = memory_getfunc; | 1091 handler->getfunc = memory_getfunc; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv; | 1133 PTPMemHandlerPrivate* priv = (PTPMemHandlerPrivate*)handler->priv; |
| 1158 *data = priv->data; | 1134 *data = priv->data; |
| 1159 *size = priv->size; | 1135 *size = priv->size; |
| 1160 free (priv); | 1136 free (priv); |
| 1161 return PTP_RC_OK; | 1137 return PTP_RC_OK; |
| 1162 } | 1138 } |
| 1163 | 1139 |
| 1164 /* send / receive functions */ | 1140 /* send / receive functions */ |
| 1165 | 1141 |
| 1166 uint16_t | 1142 uint16_t |
| 1167 ptp_usb_sendreq (PTPParams* params, PTPContainer* req, int dataphase) | 1143 ptp_usb_sendreq (PTPParams* params, PTPContainer* req) |
| 1168 { | 1144 { |
| 1169 uint16_t ret; | 1145 uint16_t ret; |
| 1170 PTPUSBBulkContainer usbreq; | 1146 PTPUSBBulkContainer usbreq; |
| 1171 PTPDataHandler memhandler; | 1147 PTPDataHandler memhandler; |
| 1172 unsigned long written = 0; | 1148 unsigned long written = 0; |
| 1173 unsigned long towrite; | 1149 unsigned long towrite; |
| 1174 | 1150 |
| 1175 char txt[256]; | 1151 char txt[256]; |
| 1176 | 1152 |
| 1177 » (void) ptp_render_ofc (params, req->Code, sizeof(txt), txt); | 1153 » (void) ptp_render_opcode (params, req->Code, sizeof(txt), txt); |
| 1178 LIBMTP_USB_DEBUG("REQUEST: 0x%04x, %s\n", req->Code, txt); | 1154 LIBMTP_USB_DEBUG("REQUEST: 0x%04x, %s\n", req->Code, txt); |
| 1179 | 1155 |
| 1180 /* build appropriate USB container */ | 1156 /* build appropriate USB container */ |
| 1181 usbreq.length=htod32(PTP_USB_BULK_REQ_LEN- | 1157 usbreq.length=htod32(PTP_USB_BULK_REQ_LEN- |
| 1182 (sizeof(uint32_t)*(5-req->Nparam))); | 1158 (sizeof(uint32_t)*(5-req->Nparam))); |
| 1183 usbreq.type=htod16(PTP_USB_CONTAINER_COMMAND); | 1159 usbreq.type=htod16(PTP_USB_CONTAINER_COMMAND); |
| 1184 usbreq.code=htod16(req->Code); | 1160 usbreq.code=htod16(req->Code); |
| 1185 usbreq.trans_id=htod32(req->Transaction_ID); | 1161 usbreq.trans_id=htod32(req->Transaction_ID); |
| 1186 usbreq.payload.params.param1=htod32(req->Param1); | 1162 usbreq.payload.params.param1=htod32(req->Param1); |
| 1187 usbreq.payload.params.param2=htod32(req->Param2); | 1163 usbreq.payload.params.param2=htod32(req->Param2); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1206 "PTP: request code 0x%04x sending req wrote only %ld byt
es instead of %d", | 1182 "PTP: request code 0x%04x sending req wrote only %ld byt
es instead of %d", |
| 1207 req->Code, written, towrite | 1183 req->Code, written, towrite |
| 1208 ); | 1184 ); |
| 1209 ret = PTP_ERROR_IO; | 1185 ret = PTP_ERROR_IO; |
| 1210 } | 1186 } |
| 1211 return ret; | 1187 return ret; |
| 1212 } | 1188 } |
| 1213 | 1189 |
| 1214 uint16_t | 1190 uint16_t |
| 1215 ptp_usb_senddata (PTPParams* params, PTPContainer* ptp, | 1191 ptp_usb_senddata (PTPParams* params, PTPContainer* ptp, |
| 1216 » » uint64_t size, PTPDataHandler *handler | 1192 » » unsigned long size, PTPDataHandler *handler |
| 1217 ) { | 1193 ) { |
| 1218 uint16_t ret; | 1194 uint16_t ret; |
| 1219 int wlen, datawlen; | 1195 int wlen, datawlen; |
| 1220 unsigned long written; | 1196 unsigned long written; |
| 1221 PTPUSBBulkContainer usbdata; | 1197 PTPUSBBulkContainer usbdata; |
| 1222 » uint64_t bytes_left_to_transfer; | 1198 » uint32_t bytes_left_to_transfer; |
| 1223 PTPDataHandler memhandler; | 1199 PTPDataHandler memhandler; |
| 1224 | 1200 |
| 1225 | 1201 |
| 1226 LIBMTP_USB_DEBUG("SEND DATA PHASE\n"); | 1202 LIBMTP_USB_DEBUG("SEND DATA PHASE\n"); |
| 1227 | 1203 |
| 1228 /* build appropriate USB container */ | 1204 /* build appropriate USB container */ |
| 1229 usbdata.length = htod32(PTP_USB_BULK_HDR_LEN+size); | 1205 usbdata.length = htod32(PTP_USB_BULK_HDR_LEN+size); |
| 1230 usbdata.type = htod16(PTP_USB_CONTAINER_DATA); | 1206 usbdata.type = htod16(PTP_USB_CONTAINER_DATA); |
| 1231 usbdata.code = htod16(ptp->Code); | 1207 usbdata.code = htod16(ptp->Code); |
| 1232 usbdata.trans_id= htod32(ptp->Transaction_ID); | 1208 usbdata.trans_id= htod32(ptp->Transaction_ID); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 ret = PTP_ERROR_IO; | 1250 ret = PTP_ERROR_IO; |
| 1275 return ret; | 1251 return ret; |
| 1276 } | 1252 } |
| 1277 | 1253 |
| 1278 static uint16_t ptp_usb_getpacket(PTPParams *params, | 1254 static uint16_t ptp_usb_getpacket(PTPParams *params, |
| 1279 PTPUSBBulkContainer *packet, unsigned long *rlen) | 1255 PTPUSBBulkContainer *packet, unsigned long *rlen) |
| 1280 { | 1256 { |
| 1281 PTPDataHandler memhandler; | 1257 PTPDataHandler memhandler; |
| 1282 uint16_t ret; | 1258 uint16_t ret; |
| 1283 unsigned char *x = NULL; | 1259 unsigned char *x = NULL; |
| 1284 unsigned long packet_size; | |
| 1285 PTP_USB *ptp_usb = (PTP_USB *) params->data; | |
| 1286 | |
| 1287 packet_size = ptp_usb->inep_maxpacket; | |
| 1288 | 1260 |
| 1289 /* read the header and potentially the first data */ | 1261 /* read the header and potentially the first data */ |
| 1290 if (params->response_packet_size > 0) { | 1262 if (params->response_packet_size > 0) { |
| 1291 /* If there is a buffered packet, just use it. */ | 1263 /* If there is a buffered packet, just use it. */ |
| 1292 memcpy(packet, params->response_packet, params->response_packet_
size); | 1264 memcpy(packet, params->response_packet, params->response_packet_
size); |
| 1293 *rlen = params->response_packet_size; | 1265 *rlen = params->response_packet_size; |
| 1294 free(params->response_packet); | 1266 free(params->response_packet); |
| 1295 params->response_packet = NULL; | 1267 params->response_packet = NULL; |
| 1296 params->response_packet_size = 0; | 1268 params->response_packet_size = 0; |
| 1297 /* Here this signifies a "virtual read" */ | 1269 /* Here this signifies a "virtual read" */ |
| 1298 return PTP_RC_OK; | 1270 return PTP_RC_OK; |
| 1299 } | 1271 } |
| 1300 ptp_init_recv_memory_handler (&memhandler); | 1272 ptp_init_recv_memory_handler (&memhandler); |
| 1301 » ret = ptp_read_func(packet_size, &memhandler, params->data, rlen, 0); | 1273 » ret = ptp_read_func(PTP_USB_BULK_HS_MAX_PACKET_LEN_READ, &memhandler, pa
rams->data, rlen, 0); |
| 1302 ptp_exit_recv_memory_handler (&memhandler, &x, rlen); | 1274 ptp_exit_recv_memory_handler (&memhandler, &x, rlen); |
| 1303 if (x) { | 1275 if (x) { |
| 1304 memcpy (packet, x, *rlen); | 1276 memcpy (packet, x, *rlen); |
| 1305 free (x); | 1277 free (x); |
| 1306 } | 1278 } |
| 1307 return ret; | 1279 return ret; |
| 1308 } | 1280 } |
| 1309 | 1281 |
| 1310 uint16_t | 1282 uint16_t |
| 1311 ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) | 1283 ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler) |
| 1312 { | 1284 { |
| 1313 uint16_t ret; | 1285 uint16_t ret; |
| 1314 PTPUSBBulkContainer usbdata; | 1286 PTPUSBBulkContainer usbdata; |
| 1287 unsigned long written; |
| 1315 PTP_USB *ptp_usb = (PTP_USB *) params->data; | 1288 PTP_USB *ptp_usb = (PTP_USB *) params->data; |
| 1316 int putfunc_ret; | 1289 int putfunc_ret; |
| 1317 | 1290 |
| 1318 LIBMTP_USB_DEBUG("GET DATA PHASE\n"); | 1291 LIBMTP_USB_DEBUG("GET DATA PHASE\n"); |
| 1319 | 1292 |
| 1320 memset(&usbdata,0,sizeof(usbdata)); | 1293 memset(&usbdata,0,sizeof(usbdata)); |
| 1321 do { | 1294 do { |
| 1322 unsigned long len, rlen; | 1295 unsigned long len, rlen; |
| 1323 | 1296 |
| 1324 ret = ptp_usb_getpacket(params, &usbdata, &rlen); | 1297 ret = ptp_usb_getpacket(params, &usbdata, &rlen); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1346 // getting data. It appears Windows ignores the
contents of this | 1319 // getting data. It appears Windows ignores the
contents of this |
| 1347 // field entirely. | 1320 // field entirely. |
| 1348 if (ret < PTP_RC_Undefined || ret > PTP_RC_Speci
ficationOfDestinationUnsupported) { | 1321 if (ret < PTP_RC_Undefined || ret > PTP_RC_Speci
ficationOfDestinationUnsupported) { |
| 1349 libusb_glue_debug (params, "ptp2/ptp_usb
_getdata: detected a broken " | 1322 libusb_glue_debug (params, "ptp2/ptp_usb
_getdata: detected a broken " |
| 1350 "PTP header, code field insan
e."); | 1323 "PTP header, code field insan
e."); |
| 1351 ret = PTP_ERROR_IO; | 1324 ret = PTP_ERROR_IO; |
| 1352 } | 1325 } |
| 1353 break; | 1326 break; |
| 1354 } | 1327 } |
| 1355 } | 1328 } |
| 1356 » » if (rlen == ptp_usb->inep_maxpacket) { | 1329 » » if (usbdata.length == 0xffffffffU) { |
| 1357 /* Copy first part of data to 'data' */ | 1330 /* Copy first part of data to 'data' */ |
| 1358 putfunc_ret = | 1331 putfunc_ret = |
| 1359 handler->putfunc( | 1332 handler->putfunc( |
| 1360 » » » » params, handler->priv, rlen - PTP_USB_BULK_
HDR_LEN, usbdata.payload.data | 1333 » » » » params, handler->priv, rlen - PTP_USB_BULK_
HDR_LEN, usbdata.payload.data, |
| 1334 » » » » &written |
| 1361 ); | 1335 ); |
| 1362 if (putfunc_ret != PTP_RC_OK) | 1336 if (putfunc_ret != PTP_RC_OK) |
| 1363 return putfunc_ret; | 1337 return putfunc_ret; |
| 1364 | 1338 |
| 1365 /* stuff data directly to passed data handler */ | 1339 /* stuff data directly to passed data handler */ |
| 1366 while (1) { | 1340 while (1) { |
| 1367 unsigned long readdata; | 1341 unsigned long readdata; |
| 1368 uint16_t xret; | 1342 uint16_t xret; |
| 1369 | 1343 |
| 1370 xret = ptp_read_func( | 1344 xret = ptp_read_func( |
| 1371 » » » » » 0x20000000, | 1345 » » » » » PTP_USB_BULK_HS_MAX_PACKET_LEN_READ, |
| 1372 handler, | 1346 handler, |
| 1373 params->data, | 1347 params->data, |
| 1374 &readdata, | 1348 &readdata, |
| 1375 0 | 1349 0 |
| 1376 ); | 1350 ); |
| 1377 if (xret != PTP_RC_OK) | 1351 if (xret != PTP_RC_OK) |
| 1378 return xret; | 1352 return xret; |
| 1379 » » if (readdata < 0x20000000) | 1353 » » if (readdata < PTP_USB_BULK_HS_MAX_PACKET_LEN_READ) |
| 1380 break; | 1354 break; |
| 1381 } | 1355 } |
| 1382 return PTP_RC_OK; | 1356 return PTP_RC_OK; |
| 1383 } | 1357 } |
| 1384 if (rlen > dtoh32(usbdata.length)) { | 1358 if (rlen > dtoh32(usbdata.length)) { |
| 1385 /* | 1359 /* |
| 1386 * Buffer the surplus response packet if it is >= | 1360 * Buffer the surplus response packet if it is >= |
| 1387 * PTP_USB_BULK_HDR_LEN | 1361 * PTP_USB_BULK_HDR_LEN |
| 1388 * (i.e. it is probably an entire package) | 1362 * (i.e. it is probably an entire package) |
| 1389 * else discard it as erroneous surplus data. | 1363 * else discard it as erroneous surplus data. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1420 len=dtoh32(usbdata.length)-PTP_USB_BULK_HDR_LEN; | 1394 len=dtoh32(usbdata.length)-PTP_USB_BULK_HDR_LEN; |
| 1421 | 1395 |
| 1422 /* autodetect split header/data MTP devices */ | 1396 /* autodetect split header/data MTP devices */ |
| 1423 if (dtoh32(usbdata.length) > 12 && (rlen==12)) | 1397 if (dtoh32(usbdata.length) > 12 && (rlen==12)) |
| 1424 params->split_header_data = 1; | 1398 params->split_header_data = 1; |
| 1425 | 1399 |
| 1426 /* Copy first part of data to 'data' */ | 1400 /* Copy first part of data to 'data' */ |
| 1427 putfunc_ret = | 1401 putfunc_ret = |
| 1428 handler->putfunc( | 1402 handler->putfunc( |
| 1429 params, handler->priv, rlen - PTP_USB_BULK_HD
R_LEN, | 1403 params, handler->priv, rlen - PTP_USB_BULK_HD
R_LEN, |
| 1430 » » » » usbdata.payload.data | 1404 » » » » usbdata.payload.data, |
| 1405 » » » » &written |
| 1431 ); | 1406 ); |
| 1432 if (putfunc_ret != PTP_RC_OK) | 1407 if (putfunc_ret != PTP_RC_OK) |
| 1433 return putfunc_ret; | 1408 return putfunc_ret; |
| 1434 | 1409 |
| 1435 if (FLAG_NO_ZERO_READS(ptp_usb) && | 1410 if (FLAG_NO_ZERO_READS(ptp_usb) && |
| 1436 » » len+PTP_USB_BULK_HDR_LEN == ptp_usb->inep_maxpacket) { | 1411 » » len+PTP_USB_BULK_HDR_LEN == PTP_USB_BULK_HS_MAX_PACKET_LEN_R
EAD) { |
| 1437 | 1412 |
| 1438 LIBMTP_USB_DEBUG("Reading in extra terminating byte\n"); | 1413 LIBMTP_USB_DEBUG("Reading in extra terminating byte\n"); |
| 1439 | 1414 |
| 1440 // need to read in extra byte and discard it | 1415 // need to read in extra byte and discard it |
| 1441 int result = 0, xread; | 1416 int result = 0, xread; |
| 1442 unsigned char byte = 0; | 1417 unsigned char byte = 0; |
| 1443 result = USB_BULK_READ(ptp_usb->handle, | 1418 result = USB_BULK_READ(ptp_usb->handle, |
| 1444 ptp_usb->inep, | 1419 ptp_usb->inep, |
| 1445 &byte, | 1420 &byte, |
| 1446 1, | 1421 1, |
| 1447 &xread, | 1422 &xread, |
| 1448 ptp_usb->timeout); | 1423 ptp_usb->timeout); |
| 1449 | 1424 |
| 1450 if (result != 1) | 1425 if (result != 1) |
| 1451 » » LIBMTP_INFO("Could not read in extra byte for %d byte long f
ile, return value 0x%04x\n", ptp_usb->inep_maxpacket, result); | 1426 » » LIBMTP_INFO("Could not read in extra byte for PTP_USB_BULK_H
S_MAX_PACKET_LEN_READ long file, return value 0x%04x\n", result); |
| 1452 » » } else if (len+PTP_USB_BULK_HDR_LEN == ptp_usb->inep_maxpacket &
& params->split_header_data == 0) { | 1427 » » } else if (len+PTP_USB_BULK_HDR_LEN == PTP_USB_BULK_HS_MAX_PACKE
T_LEN_READ && params->split_header_data == 0) { |
| 1453 int zeroresult = 0, xread; | 1428 int zeroresult = 0, xread; |
| 1454 unsigned char zerobyte = 0; | 1429 unsigned char zerobyte = 0; |
| 1455 | 1430 |
| 1456 LIBMTP_INFO("Reading in zero packet after header\n"); | 1431 LIBMTP_INFO("Reading in zero packet after header\n"); |
| 1457 | 1432 |
| 1458 zeroresult = USB_BULK_READ(ptp_usb->handle, | 1433 zeroresult = USB_BULK_READ(ptp_usb->handle, |
| 1459 ptp_usb->inep, | 1434 ptp_usb->inep, |
| 1460 &zerobyte, | 1435 &zerobyte, |
| 1461 0, | 1436 0, |
| 1462 &xread, | 1437 &xread, |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 #define PTP_EVENT_CHECK 0x0000 /* waits for */ | 1528 #define PTP_EVENT_CHECK 0x0000 /* waits for */ |
| 1554 #define PTP_EVENT_CHECK_FAST 0x0001 /* checks */ | 1529 #define PTP_EVENT_CHECK_FAST 0x0001 /* checks */ |
| 1555 | 1530 |
| 1556 static inline uint16_t | 1531 static inline uint16_t |
| 1557 ptp_usb_event (PTPParams* params, PTPContainer* event, int wait) | 1532 ptp_usb_event (PTPParams* params, PTPContainer* event, int wait) |
| 1558 { | 1533 { |
| 1559 uint16_t ret; | 1534 uint16_t ret; |
| 1560 int result, xread; | 1535 int result, xread; |
| 1561 unsigned long rlen; | 1536 unsigned long rlen; |
| 1562 PTPUSBEventContainer usbevent; | 1537 PTPUSBEventContainer usbevent; |
| 1563 » PTP_USB *ptp_usb; | 1538 » PTP_USB *ptp_usb = (PTP_USB *)(params->data); |
| 1564 | 1539 |
| 1565 memset(&usbevent,0,sizeof(usbevent)); | 1540 memset(&usbevent,0,sizeof(usbevent)); |
| 1566 | 1541 |
| 1567 if ((params==NULL) || (event==NULL)) | 1542 if ((params==NULL) || (event==NULL)) |
| 1568 return PTP_ERROR_BADPARAM; | 1543 return PTP_ERROR_BADPARAM; |
| 1569 ptp_usb = (PTP_USB *)(params->data); | |
| 1570 | |
| 1571 ret = PTP_RC_OK; | 1544 ret = PTP_RC_OK; |
| 1572 switch(wait) { | 1545 switch(wait) { |
| 1573 case PTP_EVENT_CHECK: | 1546 case PTP_EVENT_CHECK: |
| 1574 result = USB_BULK_READ(ptp_usb->handle, | 1547 result = USB_BULK_READ(ptp_usb->handle, |
| 1575 ptp_usb->intep, | 1548 ptp_usb->intep, |
| 1576 (unsigned char *) &usbevent, | 1549 (unsigned char *) &usbevent, |
| 1577 sizeof(usbevent), | 1550 sizeof(usbevent), |
| 1578 &xread, | 1551 &xread, |
| 1579 0); | 1552 0); |
| 1580 if (xread == 0) | 1553 if (xread == 0) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1633 | 1606 |
| 1634 return ptp_usb_event (params, event, PTP_EVENT_CHECK_FAST); | 1607 return ptp_usb_event (params, event, PTP_EVENT_CHECK_FAST); |
| 1635 } | 1608 } |
| 1636 | 1609 |
| 1637 uint16_t | 1610 uint16_t |
| 1638 ptp_usb_event_wait (PTPParams* params, PTPContainer* event) { | 1611 ptp_usb_event_wait (PTPParams* params, PTPContainer* event) { |
| 1639 | 1612 |
| 1640 return ptp_usb_event (params, event, PTP_EVENT_CHECK); | 1613 return ptp_usb_event (params, event, PTP_EVENT_CHECK); |
| 1641 } | 1614 } |
| 1642 | 1615 |
| 1643 static void | |
| 1644 ptp_usb_event_cb (struct libusb_transfer *t) { | |
| 1645 struct ptp_event_cb_data *data = t->user_data; | |
| 1646 PTPParams *params = data->params; | |
| 1647 PTPUSBEventContainer *usbevent = (void *)t->buffer; | |
| 1648 PTPContainer event = {0,}; | |
| 1649 uint16_t code; | |
| 1650 | |
| 1651 switch (t->status) { | |
| 1652 case LIBUSB_TRANSFER_COMPLETED: | |
| 1653 if (t->actual_length < 8) { | |
| 1654 libusb_glue_error (params, | |
| 1655 "PTP: reading event an short read of %ld bytes o
ccurred\n", | |
| 1656 t->actual_length); | |
| 1657 code = PTP_ERROR_IO; | |
| 1658 } else { | |
| 1659 event.Code=dtoh16(usbevent->code); | |
| 1660 event.SessionID=params->session_id; | |
| 1661 event.Transaction_ID=dtoh32(usbevent->trans_id); | |
| 1662 event.Param1=dtoh32(usbevent->param1); | |
| 1663 event.Param2=dtoh32(usbevent->param2); | |
| 1664 event.Param3=dtoh32(usbevent->param3); | |
| 1665 code = PTP_RC_OK; | |
| 1666 } | |
| 1667 break; | |
| 1668 case LIBUSB_TRANSFER_TIMED_OUT: | |
| 1669 code = PTP_ERROR_TIMEOUT; | |
| 1670 break; | |
| 1671 case LIBUSB_TRANSFER_CANCELLED: | |
| 1672 code = PTP_ERROR_CANCEL; | |
| 1673 break; | |
| 1674 case LIBUSB_TRANSFER_STALL: | |
| 1675 code = PTP_ERROR_DATA_EXPECTED; | |
| 1676 break; | |
| 1677 case LIBUSB_TRANSFER_ERROR: | |
| 1678 case LIBUSB_TRANSFER_NO_DEVICE: | |
| 1679 case LIBUSB_TRANSFER_OVERFLOW: | |
| 1680 default: | |
| 1681 code = PTP_ERROR_IO; | |
| 1682 break; | |
| 1683 } | |
| 1684 if (code != PTP_RC_OK) { | |
| 1685 libusb_glue_error (params, | |
| 1686 "PTP: reading event an error 0x%02x occurred\n", | |
| 1687 t->status); | |
| 1688 } | |
| 1689 data->cb(params, code, &event, data->user_data); | |
| 1690 free(data); | |
| 1691 } | |
| 1692 | |
| 1693 uint16_t | |
| 1694 ptp_usb_event_async (PTPParams* params, PTPEventCbFn cb, void *user_data) { | |
| 1695 PTP_USB *ptp_usb; | |
| 1696 PTPUSBEventContainer *usbevent; | |
| 1697 struct ptp_event_cb_data *data; | |
| 1698 struct libusb_transfer *t; | |
| 1699 int ret; | |
| 1700 | |
| 1701 if (params == NULL) { | |
| 1702 return PTP_ERROR_BADPARAM; | |
| 1703 } | |
| 1704 | |
| 1705 usbevent = calloc(1, sizeof(*usbevent)); | |
| 1706 if (usbevent == NULL) { | |
| 1707 return PTP_ERROR_IO; | |
| 1708 } | |
| 1709 | |
| 1710 data = malloc(sizeof(*data)); | |
| 1711 if (data == NULL) { | |
| 1712 free(usbevent); | |
| 1713 return PTP_ERROR_IO; | |
| 1714 } | |
| 1715 | |
| 1716 t = libusb_alloc_transfer(0); | |
| 1717 if (t == NULL) { | |
| 1718 free(data); | |
| 1719 free(usbevent); | |
| 1720 return PTP_ERROR_IO; | |
| 1721 } | |
| 1722 | |
| 1723 data->cb = cb; | |
| 1724 data->user_data = user_data; | |
| 1725 data->params = params; | |
| 1726 | |
| 1727 ptp_usb = (PTP_USB *)(params->data); | |
| 1728 libusb_fill_interrupt_transfer(t, ptp_usb->handle, ptp_usb->intep, | |
| 1729 (unsigned char *)usbevent, sizeof(*usbeve
nt), | |
| 1730 ptp_usb_event_cb, data, 0); | |
| 1731 t->flags = LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; | |
| 1732 | |
| 1733 ret = libusb_submit_transfer(t); | |
| 1734 return ret == 0 ? PTP_RC_OK : PTP_ERROR_IO; | |
| 1735 } | |
| 1736 | |
| 1737 /** | |
| 1738 * Trivial wrapper around the most generic libusb method for polling for events. | |
| 1739 * Can be used to drive asynchronous event detection. | |
| 1740 */ | |
| 1741 int LIBMTP_Handle_Events_Timeout_Completed(struct timeval *tv, int *completed) { | |
| 1742 /* Pass NULL for context as libmtp always uses the default context */ | |
| 1743 return libusb_handle_events_timeout_completed(NULL, tv, completed); | |
| 1744 } | |
| 1745 | |
| 1746 uint16_t | 1616 uint16_t |
| 1747 ptp_usb_control_cancel_request (PTPParams *params, uint32_t transactionid) { | 1617 ptp_usb_control_cancel_request (PTPParams *params, uint32_t transactionid) { |
| 1748 PTP_USB *ptp_usb = (PTP_USB *)(params->data); | 1618 PTP_USB *ptp_usb = (PTP_USB *)(params->data); |
| 1749 int ret; | 1619 int ret; |
| 1750 unsigned char buffer[6]; | 1620 unsigned char buffer[6]; |
| 1751 | 1621 |
| 1752 htod16a(&buffer[0],PTP_EC_CancelTransaction); | 1622 htod16a(&buffer[0],PTP_EC_CancelTransaction); |
| 1753 htod32a(&buffer[2],transactionid); | 1623 htod32a(&buffer[2],transactionid); |
| 1754 ret = libusb_control_transfer(ptp_usb->handle, | 1624 ret = libusb_control_transfer(ptp_usb->handle, |
| 1755 LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTER
FACE, | 1625 LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTER
FACE, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1801 ) { | 1671 ) { |
| 1802 if (LIBUSB_SUCCESS != libusb_detach_kernel_driver(device_handle, ptp_usb->
interface)) { | 1672 if (LIBUSB_SUCCESS != libusb_detach_kernel_driver(device_handle, ptp_usb->
interface)) { |
| 1803 perror("libusb_detach_kernel_driver() failed, continuing anyway..."); | 1673 perror("libusb_detach_kernel_driver() failed, continuing anyway..."); |
| 1804 } | 1674 } |
| 1805 } | 1675 } |
| 1806 | 1676 |
| 1807 /* | 1677 /* |
| 1808 * Check if the config is set to something else than what we want | 1678 * Check if the config is set to something else than what we want |
| 1809 * to use. Only set the configuration if we absolutely have to. | 1679 * to use. Only set the configuration if we absolutely have to. |
| 1810 * Also do not bail out if we fail. | 1680 * Also do not bail out if we fail. |
| 1811 * | |
| 1812 * Note that Darwin will not set the configuration for vendor-specific | |
| 1813 * devices so we need to go in and set it. | |
| 1814 */ | 1681 */ |
| 1815 ret = libusb_get_active_config_descriptor(dev, &config); | 1682 ret = libusb_get_active_config_descriptor(dev, &config); |
| 1816 if (ret != LIBUSB_SUCCESS) { | 1683 if (ret != LIBUSB_SUCCESS) { |
| 1817 perror("libusb_get_active_config_descriptor(1) failed"); | 1684 perror("libusb_get_active_config_descriptor(1) failed"); |
| 1818 fprintf(stderr, "no active configuration, trying to set configuration\n"); | 1685 return -1; |
| 1819 if (libusb_set_configuration(device_handle, ptp_usb->config) != LIBUSB_SUCCE
SS) { | |
| 1820 perror("libusb_set_configuration() failed, continuing anyway..."); | |
| 1821 } | |
| 1822 ret = libusb_get_active_config_descriptor(dev, &config); | |
| 1823 if (ret != LIBUSB_SUCCESS) { | |
| 1824 perror("libusb_get_active_config_descriptor(2) failed"); | |
| 1825 return -1; | |
| 1826 } | |
| 1827 } | 1686 } |
| 1828 if (config->bConfigurationValue != ptp_usb->config) { | 1687 if (config->bConfigurationValue != ptp_usb->config) { |
| 1829 fprintf(stderr, "desired configuration different from current, trying to set
configuration\n"); | 1688 fprintf(stderr, "desired configuration different from current, trying to set
configuration\n"); |
| 1830 if (libusb_set_configuration(device_handle, ptp_usb->config)) { | 1689 if (libusb_set_configuration(device_handle, ptp_usb->config)) { |
| 1831 perror("libusb_set_configuration() failed, continuing anyway..."); | 1690 perror("libusb_set_configuration() failed, continuing anyway..."); |
| 1832 } | 1691 } |
| 1833 /* Re-fetch the config descriptor if we changed */ | 1692 /* Re-fetch the config descriptor if we changed */ |
| 1834 libusb_free_config_descriptor(config); | 1693 libusb_free_config_descriptor(config); |
| 1835 ret = libusb_get_active_config_descriptor(dev, &config); | 1694 ret = libusb_get_active_config_descriptor(dev, &config); |
| 1836 if (ret != LIBUSB_SUCCESS) { | 1695 if (ret != LIBUSB_SUCCESS) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1932 } | 1791 } |
| 1933 } | 1792 } |
| 1934 | 1793 |
| 1935 /* check the outep status */ | 1794 /* check the outep status */ |
| 1936 status=0; | 1795 status=0; |
| 1937 ret = usb_get_endpoint_status(ptp_usb,ptp_usb->outep,&status); | 1796 ret = usb_get_endpoint_status(ptp_usb,ptp_usb->outep,&status); |
| 1938 if (ret<0) { | 1797 if (ret<0) { |
| 1939 perror("outep: usb_get_endpoint_status()"); | 1798 perror("outep: usb_get_endpoint_status()"); |
| 1940 } else if (status) { | 1799 } else if (status) { |
| 1941 LIBMTP_INFO("Clearing stall on OUT endpoint\n"); | 1800 LIBMTP_INFO("Clearing stall on OUT endpoint\n"); |
| 1942 ret = libusb_clear_halt(ptp_usb->handle, ptp_usb->outep); | 1801 ret = libusb_clear_halt (ptp_usb->handle, ptp_usb->outep); |
| 1943 if (ret != LIBUSB_SUCCESS) { | 1802 if (ret != LIBUSB_SUCCESS) { |
| 1944 perror("usb_clear_stall_feature()"); | 1803 perror("usb_clear_stall_feature()"); |
| 1945 } | 1804 } |
| 1946 } | 1805 } |
| 1947 | 1806 |
| 1948 /* TODO: do we need this for INTERRUPT (ptp_usb->intep) too? */ | 1807 /* TODO: do we need this for INTERRUPT (ptp_usb->intep) too? */ |
| 1949 } | 1808 } |
| 1950 | 1809 |
| 1810 static void clear_halt(PTP_USB* ptp_usb) |
| 1811 { |
| 1812 int ret; |
| 1813 |
| 1814 ret = libusb_clear_halt(ptp_usb->handle,ptp_usb->inep); |
| 1815 if (ret<0) { |
| 1816 perror("usb_clear_halt() on IN endpoint"); |
| 1817 } |
| 1818 ret = libusb_clear_halt(ptp_usb->handle,ptp_usb->outep); |
| 1819 if (ret<0) { |
| 1820 perror("usb_clear_halt() on OUT endpoint"); |
| 1821 } |
| 1822 ret = libusb_clear_halt(ptp_usb->handle,ptp_usb->intep); |
| 1823 if (ret<0) { |
| 1824 perror("usb_clear_halt() on INTERRUPT endpoint"); |
| 1825 } |
| 1826 } |
| 1827 |
| 1951 static void close_usb(PTP_USB* ptp_usb) | 1828 static void close_usb(PTP_USB* ptp_usb) |
| 1952 { | 1829 { |
| 1953 if (!FLAG_NO_RELEASE_INTERFACE(ptp_usb)) { | 1830 if (!FLAG_NO_RELEASE_INTERFACE(ptp_usb)) { |
| 1954 /* | 1831 /* |
| 1955 * Clear any stalled endpoints | 1832 * Clear any stalled endpoints |
| 1956 * On misbehaving devices designed for Windows/Mac, quote from: | 1833 * On misbehaving devices designed for Windows/Mac, quote from: |
| 1957 * http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt | 1834 * http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt |
| 1958 * Device does Bad Things(tm) when it gets a GET_STATUS after CLEAR_HALT | 1835 * Device does Bad Things(tm) when it gets a GET_STATUS after CLEAR_HALT |
| 1959 * (...) Windows, when clearing a stall, only sends the CLEAR_HALT command, | 1836 * (...) Windows, when clearing a stall, only sends the CLEAR_HALT command, |
| 1960 * and presumes that the stall has cleared. Some devices actually choke | 1837 * and presumes that the stall has cleared. Some devices actually choke |
| 1961 * if the CLEAR_HALT is followed by a GET_STATUS (used to determine if the | 1838 * if the CLEAR_HALT is followed by a GET_STATUS (used to determine if the |
| 1962 * STALL is persistant or not). | 1839 * STALL is persistant or not). |
| 1963 */ | 1840 */ |
| 1964 clear_stall(ptp_usb); | 1841 clear_stall(ptp_usb); |
| 1842 // Clear halts on any endpoints |
| 1843 clear_halt(ptp_usb); |
| 1844 // Added to clear some stuff on the OUT endpoint |
| 1845 // TODO: is this good on the Mac too? |
| 1846 // HINT: some devices may need that you comment these two out too. |
| 1847 libusb_clear_halt(ptp_usb->handle, ptp_usb->outep); |
| 1965 libusb_release_interface(ptp_usb->handle, (int) ptp_usb->interface); | 1848 libusb_release_interface(ptp_usb->handle, (int) ptp_usb->interface); |
| 1966 } | 1849 } |
| 1967 if (FLAG_FORCE_RESET_ON_CLOSE(ptp_usb)) { | 1850 if (FLAG_FORCE_RESET_ON_CLOSE(ptp_usb)) { |
| 1968 /* | 1851 /* |
| 1969 * Some devices really love to get reset after being | 1852 * Some devices really love to get reset after being |
| 1970 * disconnected. Again, since Windows never disconnects | 1853 * disconnected. Again, since Windows never disconnects |
| 1971 * a device closing behaviour is seldom or never exercised | 1854 * a device closing behaviour is seldom or never exercised |
| 1972 * on devices when engineered and often error prone. | 1855 * on devices when engineered and often error prone. |
| 1973 * Reset may help some. | 1856 * Reset may help some. |
| 1974 */ | 1857 */ |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1996 ret = libusb_get_device_descriptor(dev, &desc); | 1879 ret = libusb_get_device_descriptor(dev, &desc); |
| 1997 if (ret != LIBUSB_SUCCESS) | 1880 if (ret != LIBUSB_SUCCESS) |
| 1998 return -1; | 1881 return -1; |
| 1999 | 1882 |
| 2000 // Loop over the device configurations | 1883 // Loop over the device configurations |
| 2001 for (i = 0; i < desc.bNumConfigurations; i++) { | 1884 for (i = 0; i < desc.bNumConfigurations; i++) { |
| 2002 uint8_t j; | 1885 uint8_t j; |
| 2003 struct libusb_config_descriptor *config; | 1886 struct libusb_config_descriptor *config; |
| 2004 | 1887 |
| 2005 ret = libusb_get_config_descriptor(dev, i, &config); | 1888 ret = libusb_get_config_descriptor(dev, i, &config); |
| 2006 if (ret != LIBUSB_SUCCESS) | 1889 if (ret != 0) |
| 2007 continue; | 1890 continue; |
| 2008 | 1891 |
| 2009 *conf = config->bConfigurationValue; | 1892 *conf = config->bConfigurationValue; |
| 2010 | 1893 |
| 1894 if (ret != LIBUSB_SUCCESS) continue; |
| 2011 // Loop over each configurations interfaces | 1895 // Loop over each configurations interfaces |
| 2012 for (j = 0; j < config->bNumInterfaces; j++) { | 1896 for (j = 0; j < config->bNumInterfaces; j++) { |
| 2013 uint8_t k, l; | 1897 uint8_t k, l; |
| 2014 uint8_t no_ep; | 1898 uint8_t no_ep; |
| 2015 int found_inep = 0; | 1899 int found_inep = 0; |
| 2016 int found_outep = 0; | 1900 int found_outep = 0; |
| 2017 int found_intep = 0; | 1901 int found_intep = 0; |
| 2018 const struct libusb_endpoint_descriptor *ep; | 1902 const struct libusb_endpoint_descriptor *ep; |
| 2019 | 1903 |
| 2020 // Inspect the altsettings of this interface... | 1904 // Inspect the altsettings of this interface... |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 &ptp_usb->interface, | 2024 &ptp_usb->interface, |
| 2141 &ptp_usb->altsetting, | 2025 &ptp_usb->altsetting, |
| 2142 &ptp_usb->inep, | 2026 &ptp_usb->inep, |
| 2143 &ptp_usb->inep_maxpacket, | 2027 &ptp_usb->inep_maxpacket, |
| 2144 &ptp_usb->outep, | 2028 &ptp_usb->outep, |
| 2145 &ptp_usb->outep_maxpacket, | 2029 &ptp_usb->outep_maxpacket, |
| 2146 &ptp_usb->intep); | 2030 &ptp_usb->intep); |
| 2147 | 2031 |
| 2148 if (err) { | 2032 if (err) { |
| 2149 libusb_free_device_list (devs, 0); | 2033 libusb_free_device_list (devs, 0); |
| 2150 free (ptp_usb); | |
| 2151 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of device\n
"); | 2034 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of device\n
"); |
| 2152 return LIBMTP_ERROR_CONNECTING; | 2035 return LIBMTP_ERROR_CONNECTING; |
| 2153 } | 2036 } |
| 2154 | 2037 |
| 2155 /* Copy USB version number */ | 2038 /* Copy USB version number */ |
| 2156 ptp_usb->bcdusb = desc.bcdUSB; | 2039 ptp_usb->bcdusb = desc.bcdUSB; |
| 2157 | 2040 |
| 2158 /* Attempt to initialize this device */ | 2041 /* Attempt to initialize this device */ |
| 2159 if (init_ptp_usb(params, ptp_usb, ldevice) < 0) { | 2042 if (init_ptp_usb(params, ptp_usb, ldevice) < 0) { |
| 2160 free (ptp_usb); | |
| 2161 LIBMTP_ERROR("LIBMTP PANIC: Unable to initialize device\n"); | 2043 LIBMTP_ERROR("LIBMTP PANIC: Unable to initialize device\n"); |
| 2162 libusb_free_device_list (devs, 0); | 2044 libusb_free_device_list (devs, 0); |
| 2163 return LIBMTP_ERROR_CONNECTING; | 2045 return LIBMTP_ERROR_CONNECTING; |
| 2164 } | 2046 } |
| 2165 | 2047 |
| 2166 /* | 2048 /* |
| 2167 * This works in situations where previous bad applications | 2049 * This works in situations where previous bad applications |
| 2168 * have not used LIBMTP_Release_Device on exit | 2050 * have not used LIBMTP_Release_Device on exit |
| 2169 */ | 2051 */ |
| 2170 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { | 2052 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { |
| 2171 LIBMTP_ERROR("PTP_ERROR_IO: failed to open session, trying again after reset
ting USB interface\n"); | 2053 LIBMTP_ERROR("PTP_ERROR_IO: failed to open session, trying again after reset
ting USB interface\n"); |
| 2172 LIBMTP_ERROR("LIBMTP libusb: Attempt to reset device\n"); | 2054 LIBMTP_ERROR("LIBMTP libusb: Attempt to reset device\n"); |
| 2173 libusb_reset_device (ptp_usb->handle); | 2055 libusb_reset_device (ptp_usb->handle); |
| 2174 close_usb(ptp_usb); | 2056 close_usb(ptp_usb); |
| 2175 | 2057 |
| 2176 if(init_ptp_usb(params, ptp_usb, ldevice) <0) { | 2058 if(init_ptp_usb(params, ptp_usb, ldevice) <0) { |
| 2177 LIBMTP_ERROR("LIBMTP PANIC: Could not init USB on second attempt\n"); | 2059 LIBMTP_ERROR("LIBMTP PANIC: Could not init USB on second attempt\n"); |
| 2178 libusb_free_device_list (devs, 0); | 2060 libusb_free_device_list (devs, 0); |
| 2179 free (ptp_usb); | |
| 2180 return LIBMTP_ERROR_CONNECTING; | 2061 return LIBMTP_ERROR_CONNECTING; |
| 2181 } | 2062 } |
| 2182 | 2063 |
| 2183 /* Device has been reset, try again */ | 2064 /* Device has been reset, try again */ |
| 2184 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { | 2065 if ((ret = ptp_opensession(params, 1)) == PTP_ERROR_IO) { |
| 2185 LIBMTP_ERROR("LIBMTP PANIC: failed to open session on second attempt\n"); | 2066 LIBMTP_ERROR("LIBMTP PANIC: failed to open session on second attempt\n"); |
| 2186 libusb_free_device_list (devs, 0); | 2067 libusb_free_device_list (devs, 0); |
| 2187 free (ptp_usb); | |
| 2188 return LIBMTP_ERROR_CONNECTING; | 2068 return LIBMTP_ERROR_CONNECTING; |
| 2189 } | 2069 } |
| 2190 } | 2070 } |
| 2191 | 2071 |
| 2192 /* Was the transaction id invalid? Try again */ | 2072 /* Was the transaction id invalid? Try again */ |
| 2193 if (ret == PTP_RC_InvalidTransactionID) { | 2073 if (ret == PTP_RC_InvalidTransactionID) { |
| 2194 LIBMTP_ERROR("LIBMTP WARNING: Transaction ID was invalid, increment and try
again\n"); | 2074 LIBMTP_ERROR("LIBMTP WARNING: Transaction ID was invalid, increment and try
again\n"); |
| 2195 params->transaction_id += 10; | 2075 params->transaction_id += 10; |
| 2196 ret = ptp_opensession(params, 1); | 2076 ret = ptp_opensession(params, 1); |
| 2197 } | 2077 } |
| 2198 | 2078 |
| 2199 if (ret != PTP_RC_SessionAlreadyOpened && ret != PTP_RC_OK) { | 2079 if (ret != PTP_RC_SessionAlreadyOpened && ret != PTP_RC_OK) { |
| 2200 LIBMTP_ERROR("LIBMTP PANIC: Could not open session! " | 2080 LIBMTP_ERROR("LIBMTP PANIC: Could not open session! " |
| 2201 "(Return code %d)\n Try to reset the device.\n", | 2081 "(Return code %d)\n Try to reset the device.\n", |
| 2202 ret); | 2082 ret); |
| 2203 libusb_release_interface(ptp_usb->handle, ptp_usb->interface); | 2083 libusb_release_interface(ptp_usb->handle, ptp_usb->interface); |
| 2204 libusb_free_device_list (devs, 0); | 2084 libusb_free_device_list (devs, 0); |
| 2205 free (ptp_usb); | |
| 2206 return LIBMTP_ERROR_CONNECTING; | 2085 return LIBMTP_ERROR_CONNECTING; |
| 2207 } | 2086 } |
| 2208 | 2087 |
| 2209 /* OK configured properly */ | 2088 /* OK configured properly */ |
| 2210 *usbinfo = (void *) ptp_usb; | 2089 *usbinfo = (void *) ptp_usb; |
| 2211 libusb_free_device_list (devs, 0); | 2090 libusb_free_device_list (devs, 0); |
| 2212 return LIBMTP_ERROR_NONE; | 2091 return LIBMTP_ERROR_NONE; |
| 2213 } | 2092 } |
| 2214 | 2093 |
| 2215 | 2094 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2263 { | 2142 { |
| 2264 return libusb_control_transfer(ptp_usb->handle, | 2143 return libusb_control_transfer(ptp_usb->handle, |
| 2265 LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_ENDPOINT, | 2144 LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_ENDPOINT, |
| 2266 LIBUSB_REQUEST_GET_STATUS, | 2145 LIBUSB_REQUEST_GET_STATUS, |
| 2267 USB_FEATURE_HALT, | 2146 USB_FEATURE_HALT, |
| 2268 ep, | 2147 ep, |
| 2269 (unsigned char *) status, | 2148 (unsigned char *) status, |
| 2270 2, | 2149 2, |
| 2271 ptp_usb->timeout); | 2150 ptp_usb->timeout); |
| 2272 } | 2151 } |
| OLD | NEW |