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