| 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-2011 Linus Walleij <triad@df.lth.se> | 6 * Copyright (C) 2005-2012 Linus Walleij <triad@df.lth.se> |
| 7 * Copyright (C) 2006-2011 Marcus Meissner | 7 * Copyright (C) 2006-2011 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 * |
| 11 * This library is free software; you can redistribute it and/or | 11 * This library is free software; you can redistribute it and/or |
| 12 * modify it under the terms of the GNU Lesser General Public | 12 * modify it under the terms of the GNU Lesser General Public |
| 13 * License as published by the Free Software Foundation; either | 13 * License as published by the Free Software Foundation; either |
| 14 * version 2 of the License, or (at your option) any later version. | 14 * version 2 of the License, or (at your option) any later version. |
| 15 * | 15 * |
| 16 * This library is distributed in the hope that it will be useful, | 16 * This library is distributed in the hope that it will be useful, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 static const LIBMTP_device_entry_t mtp_device_table[] = { | 86 static const LIBMTP_device_entry_t mtp_device_table[] = { |
| 87 /* 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 */ |
| 88 #include "music-players.h" | 88 #include "music-players.h" |
| 89 }; | 89 }; |
| 90 static const int mtp_device_table_size = sizeof (mtp_device_table) / sizeof (LIB
MTP_device_entry_t); | 90 static const int mtp_device_table_size = sizeof (mtp_device_table) / sizeof (LIB
MTP_device_entry_t); |
| 91 | 91 |
| 92 // Local functions | 92 // Local functions |
| 93 static void init_usb(); | 93 static void init_usb(); |
| 94 static void close_usb(PTP_USB* ptp_usb); | 94 static void close_usb(PTP_USB* ptp_usb); |
| 95 static int find_interface_and_endpoints(openusb_dev_handle_t *dev, | 95 static int find_interface_and_endpoints(openusb_dev_handle_t *dev, |
| 96 uint8_t *conf, |
| 96 uint8_t *interface, | 97 uint8_t *interface, |
| 98 uint8_t *altsetting, |
| 97 int* inep, | 99 int* inep, |
| 98 int* inep_maxpacket, | 100 int* inep_maxpacket, |
| 99 int* outep, | 101 int* outep, |
| 100 int* outep_maxpacket, | 102 int* outep_maxpacket, |
| 101 int* intep); | 103 int* intep); |
| 102 static void clear_stall(PTP_USB* ptp_usb); | 104 static void clear_stall(PTP_USB* ptp_usb); |
| 103 static int init_ptp_usb(PTPParams* params, PTP_USB* ptp_usb, openusb_dev_handle_
t * dev); | 105 static int init_ptp_usb(PTPParams* params, PTP_USB* ptp_usb, openusb_dev_handle_
t * dev); |
| 104 static short ptp_write_func(unsigned long, PTPDataHandler*, void *data, unsigned
long*); | 106 static short ptp_write_func(unsigned long, PTPDataHandler*, void *data, unsigned
long*); |
| 105 static short ptp_read_func(unsigned long, PTPDataHandler*, void *data, unsigned
long*, int); | 107 static short ptp_read_func(unsigned long, PTPDataHandler*, void *data, unsigned
long*, int); |
| 106 static int usb_get_endpoint_status(PTP_USB* ptp_usb, int ep, uint16_t* status); | 108 static int usb_get_endpoint_status(PTP_USB* ptp_usb, int ep, uint16_t* status); |
| (...skipping 1834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1941 */ | 1943 */ |
| 1942 openusb_reset(*ptp_usb->handle); | 1944 openusb_reset(*ptp_usb->handle); |
| 1943 } | 1945 } |
| 1944 openusb_close_device(*ptp_usb->handle); | 1946 openusb_close_device(*ptp_usb->handle); |
| 1945 } | 1947 } |
| 1946 | 1948 |
| 1947 /** | 1949 /** |
| 1948 * Self-explanatory? | 1950 * Self-explanatory? |
| 1949 */ | 1951 */ |
| 1950 static int find_interface_and_endpoints(openusb_dev_handle_t *dev, | 1952 static int find_interface_and_endpoints(openusb_dev_handle_t *dev, |
| 1953 uint8_t *conf, |
| 1951 uint8_t *interface, | 1954 uint8_t *interface, |
| 1955 uint8_t *altsetting, |
| 1952 int* inep, | 1956 int* inep, |
| 1953 int* inep_maxpacket, | 1957 int* inep_maxpacket, |
| 1954 int* outep, | 1958 int* outep, |
| 1955 int *outep_maxpacket, | 1959 int *outep_maxpacket, |
| 1956 int* intep) { | 1960 int* intep) { |
| 1957 int i, ret; | 1961 uint8_t i; |
| 1962 int ret; |
| 1958 struct usb_device_desc desc; | 1963 struct usb_device_desc desc; |
| 1959 | 1964 |
| 1960 ret = openusb_parse_device_desc(libmtp_openusb_handle, *dev, NULL, 0, &desc)
; | 1965 ret = openusb_parse_device_desc(libmtp_openusb_handle, *dev, NULL, 0, &desc)
; |
| 1961 if (ret != OPENUSB_SUCCESS) return -1; | 1966 if (ret != OPENUSB_SUCCESS) return -1; |
| 1962 | 1967 |
| 1963 // Loop over the device configurations | 1968 // Loop over the device configurations |
| 1964 for (i = 0; i < desc.bNumConfigurations; i++) { | 1969 for (i = 0; i < desc.bNumConfigurations; i++) { |
| 1965 uint8_t j; | 1970 uint8_t j; |
| 1966 struct usb_config_desc config; | 1971 struct usb_config_desc config; |
| 1967 | 1972 |
| 1968 ret = openusb_parse_config_desc(libmtp_openusb_handle, *dev, NULL, 0, i,
&config); | 1973 ret = openusb_parse_config_desc(libmtp_openusb_handle, *dev, NULL, 0, i,
&config); |
| 1969 if (ret != OPENUSB_SUCCESS) continue; | 1974 if (ret != OPENUSB_SUCCESS) continue; |
| 1975 *conf = desc.bConfigurationValue; |
| 1970 // Loop over each configurations interfaces | 1976 // Loop over each configurations interfaces |
| 1971 for (j = 0; j < config.bNumInterfaces; j++) { | 1977 for (j = 0; j < config.bNumInterfaces; j++) { |
| 1972 uint8_t k; | 1978 uint8_t k; |
| 1973 uint8_t no_ep; | 1979 uint8_t no_ep; |
| 1974 int found_inep = 0; | 1980 int found_inep = 0; |
| 1975 int found_outep = 0; | 1981 int found_outep = 0; |
| 1976 int found_intep = 0; | 1982 int found_intep = 0; |
| 1977 struct usb_endpoint_desc ep; | 1983 struct usb_endpoint_desc ep; |
| 1978 struct usb_interface_desc ifcdesc; | 1984 struct usb_interface_desc ifcdesc; |
| 1979 openusb_parse_interface_desc(libmtp_openusb_handle, *dev, NULL, 0, i
, j, 0, &ifcdesc); | 1985 openusb_parse_interface_desc(libmtp_openusb_handle, *dev, NULL, 0, i
, j, 0, &ifcdesc); |
| 1980 // MTP devices shall have 3 endpoints, ignore those interfaces | 1986 // MTP devices shall have 3 endpoints, ignore those interfaces |
| 1981 // that haven't. | 1987 // that haven't. |
| 1982 no_ep = ifcdesc.bNumEndpoints; | 1988 no_ep = ifcdesc.bNumEndpoints; |
| 1983 if (no_ep != 3) | 1989 if (no_ep != 3) |
| 1984 continue; | 1990 continue; |
| 1985 *interface = ifcdesc.bInterfaceNumber; | 1991 *interface = ifcdesc.bInterfaceNumber; |
| 1992 *altsetting = ifcdesc.bAlternateSetting; |
| 1986 // Loop over the three endpoints to locate two bulk and | 1993 // Loop over the three endpoints to locate two bulk and |
| 1987 // one interrupt endpoint and FAIL if we cannot, and continue. | 1994 // one interrupt endpoint and FAIL if we cannot, and continue. |
| 1988 for (k = 0; k < no_ep; k++) { | 1995 for (k = 0; k < no_ep; k++) { |
| 1989 openusb_parse_endpoint_desc(libmtp_openusb_handle, *dev, NULL, 0
, i, j, 0, k, &ep); | 1996 openusb_parse_endpoint_desc(libmtp_openusb_handle, *dev, NULL, 0
, i, j, 0, k, &ep); |
| 1990 if (ep.bmAttributes == USB_ENDPOINT_TYPE_BULK) { | 1997 if (ep.bmAttributes == USB_ENDPOINT_TYPE_BULK) { |
| 1991 if ((ep.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == | 1998 if ((ep.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == |
| 1992 USB_ENDPOINT_DIR_MASK) { | 1999 USB_ENDPOINT_DIR_MASK) { |
| 1993 *inep = ep.bEndpointAddress; | 2000 *inep = ep.bEndpointAddress; |
| 1994 *inep_maxpacket = ep.wMaxPacketSize; | 2001 *inep_maxpacket = ep.wMaxPacketSize; |
| 1995 found_inep = 1; | 2002 found_inep = 1; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2080 * to work. | 2087 * to work. |
| 2081 */ | 2088 */ |
| 2082 if (FLAG_ALWAYS_PROBE_DESCRIPTOR(ptp_usb)) { | 2089 if (FLAG_ALWAYS_PROBE_DESCRIPTOR(ptp_usb)) { |
| 2083 // Massage the device descriptor | 2090 // Massage the device descriptor |
| 2084 (void) probe_device_descriptor(ldevice, NULL); | 2091 (void) probe_device_descriptor(ldevice, NULL); |
| 2085 } | 2092 } |
| 2086 | 2093 |
| 2087 | 2094 |
| 2088 /* Assign interface and endpoints to usbinfo... */ | 2095 /* Assign interface and endpoints to usbinfo... */ |
| 2089 err = find_interface_and_endpoints(ldevice, | 2096 err = find_interface_and_endpoints(ldevice, |
| 2097 &ptp_usb->conf, |
| 2090 &ptp_usb->interface, | 2098 &ptp_usb->interface, |
| 2099 &ptp_usb->altsetting, |
| 2091 &ptp_usb->inep, | 2100 &ptp_usb->inep, |
| 2092 &ptp_usb->inep_maxpacket, | 2101 &ptp_usb->inep_maxpacket, |
| 2093 &ptp_usb->outep, | 2102 &ptp_usb->outep, |
| 2094 &ptp_usb->outep_maxpacket, | 2103 &ptp_usb->outep_maxpacket, |
| 2095 &ptp_usb->intep); | 2104 &ptp_usb->intep); |
| 2096 | 2105 |
| 2097 if (err) { | 2106 if (err) { |
| 2098 openusb_free_devid_list(devs); | 2107 openusb_free_devid_list(devs); |
| 2099 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of devi
ce\n"); | 2108 LIBMTP_ERROR("LIBMTP PANIC: Unable to find interface & endpoints of devi
ce\n"); |
| 2100 return LIBMTP_ERROR_CONNECTING; | 2109 return LIBMTP_ERROR_CONNECTING; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2211 ctrl.timeout = ptp_usb->timeout; | 2220 ctrl.timeout = ptp_usb->timeout; |
| 2212 ctrl.next = NULL; | 2221 ctrl.next = NULL; |
| 2213 ctrl.setup.bRequest = USB_REQ_GET_STATUS; | 2222 ctrl.setup.bRequest = USB_REQ_GET_STATUS; |
| 2214 ctrl.setup.bmRequestType = USB_ENDPOINT_IN | USB_RECIP_ENDPOINT; | 2223 ctrl.setup.bmRequestType = USB_ENDPOINT_IN | USB_RECIP_ENDPOINT; |
| 2215 ctrl.setup.wIndex = ep; | 2224 ctrl.setup.wIndex = ep; |
| 2216 ctrl.setup.wValue = USB_FEATURE_HALT; | 2225 ctrl.setup.wValue = USB_FEATURE_HALT; |
| 2217 openusb_ctrl_xfer(*ptp_usb->handle, ptp_usb->interface, ep, &ctrl); | 2226 openusb_ctrl_xfer(*ptp_usb->handle, ptp_usb->interface, ep, &ctrl); |
| 2218 return ctrl.result.status; | 2227 return ctrl.result.status; |
| 2219 | 2228 |
| 2220 } | 2229 } |
| OLD | NEW |