diff options
author | Mike Lockwood <lockwood@android.com> | 2010-07-20 09:06:41 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-07-20 09:06:41 -0700 |
commit | 30881f68c97125f6bc1dbc7c26ccb3cdb91ebd2a (patch) | |
tree | e76948a9adbfb805885d36f05ad834f5df3cc909 /media | |
parent | aecf390618a0417d5ae2016a14016dff88889812 (diff) | |
parent | 3c51d6a9ef4fbc0cd76d72d60ae902a261e62145 (diff) | |
download | frameworks_base-30881f68c97125f6bc1dbc7c26ccb3cdb91ebd2a.zip frameworks_base-30881f68c97125f6bc1dbc7c26ccb3cdb91ebd2a.tar.gz frameworks_base-30881f68c97125f6bc1dbc7c26ccb3cdb91ebd2a.tar.bz2 |
Merge "MTP host fixes:"
Diffstat (limited to 'media')
-rw-r--r-- | media/mtp/MtpClient.cpp | 90 | ||||
-rw-r--r-- | media/mtp/MtpDataPacket.cpp | 2 |
2 files changed, 53 insertions, 39 deletions
diff --git a/media/mtp/MtpClient.cpp b/media/mtp/MtpClient.cpp index 8d10c27..b53fe54 100644 --- a/media/mtp/MtpClient.cpp +++ b/media/mtp/MtpClient.cpp @@ -118,52 +118,66 @@ bool MtpClient::usbDeviceAdded(const char *devname) { { LOGD("Found camera: \"%s\" \"%s\"\n", usb_device_get_manufacturer_name(device), usb_device_get_product_name(device)); + } else if (interface->bInterfaceClass == 0xFF && + interface->bInterfaceSubClass == 0xFF && + interface->bInterfaceProtocol == 0) { + char* interfaceName = usb_device_get_string(device, interface->iInterface); + if (!interfaceName || strcmp(interfaceName, "MTP")) + continue; + // Looks like an android style MTP device + LOGD("Found MTP device: \"%s\" \"%s\"\n", usb_device_get_manufacturer_name(device), + usb_device_get_product_name(device)); + } else { + // not an MTP or PTP device + continue; + } - // interface should be followed by three endpoints - struct usb_endpoint_descriptor *ep; - struct usb_endpoint_descriptor *ep_in_desc = NULL; - struct usb_endpoint_descriptor *ep_out_desc = NULL; - struct usb_endpoint_descriptor *ep_intr_desc = NULL; - for (int i = 0; i < 3; i++) { - ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter); - if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) { - LOGE("endpoints not found\n"); - return mDone; - } - if (ep->bmAttributes == USB_ENDPOINT_XFER_BULK) { - if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) - ep_in_desc = ep; - else - ep_out_desc = ep; - } else if (ep->bmAttributes == USB_ENDPOINT_XFER_INT && - ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) { - ep_intr_desc = ep; - } - } - if (!ep_in_desc || !ep_out_desc || !ep_intr_desc) { + // if we got here, then we have a likely MTP or PTP device + + // interface should be followed by three endpoints + struct usb_endpoint_descriptor *ep; + struct usb_endpoint_descriptor *ep_in_desc = NULL; + struct usb_endpoint_descriptor *ep_out_desc = NULL; + struct usb_endpoint_descriptor *ep_intr_desc = NULL; + for (int i = 0; i < 3; i++) { + ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter); + if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) { LOGE("endpoints not found\n"); return mDone; } - - struct usb_endpoint *ep_in = usb_endpoint_open(device, ep_in_desc); - struct usb_endpoint *ep_out = usb_endpoint_open(device, ep_out_desc); - struct usb_endpoint *ep_intr = usb_endpoint_open(device, ep_intr_desc); - - if (usb_device_claim_interface(device, interface->bInterfaceNumber)) { - LOGE("usb_device_claim_interface failed\n"); - usb_endpoint_close(ep_in); - usb_endpoint_close(ep_out); - usb_endpoint_close(ep_intr); - return mDone; + if (ep->bmAttributes == USB_ENDPOINT_XFER_BULK) { + if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) + ep_in_desc = ep; + else + ep_out_desc = ep; + } else if (ep->bmAttributes == USB_ENDPOINT_XFER_INT && + ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) { + ep_intr_desc = ep; } + } + if (!ep_in_desc || !ep_out_desc || !ep_intr_desc) { + LOGE("endpoints not found\n"); + return mDone; + } + + struct usb_endpoint *ep_in = usb_endpoint_open(device, ep_in_desc); + struct usb_endpoint *ep_out = usb_endpoint_open(device, ep_out_desc); + struct usb_endpoint *ep_intr = usb_endpoint_open(device, ep_intr_desc); - MtpDevice* mtpDevice = new MtpDevice(device, interface->bInterfaceNumber, - ep_in, ep_out, ep_intr); - mDeviceList.add(mtpDevice); - mtpDevice->initialize(); - deviceAdded(mtpDevice); + if (usb_device_claim_interface(device, interface->bInterfaceNumber)) { + LOGE("usb_device_claim_interface failed\n"); + usb_endpoint_close(ep_in); + usb_endpoint_close(ep_out); + usb_endpoint_close(ep_intr); return mDone; } + + MtpDevice* mtpDevice = new MtpDevice(device, interface->bInterfaceNumber, + ep_in, ep_out, ep_intr); + mDeviceList.add(mtpDevice); + mtpDevice->initialize(); + deviceAdded(mtpDevice); + return mDone; } } diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp index 6f9ea24..ebe764a 100644 --- a/media/mtp/MtpDataPacket.cpp +++ b/media/mtp/MtpDataPacket.cpp @@ -372,7 +372,7 @@ int MtpDataPacket::writeDataHeader(int fd, uint32_t length) { int MtpDataPacket::read(struct usb_endpoint *ep) { // first read the header int length = transfer(ep, mBuffer, mBufferSize); - if (length > MTP_CONTAINER_HEADER_SIZE) { + if (length >= MTP_CONTAINER_HEADER_SIZE) { // look at the length field to see if the data spans multiple packets uint32_t totalLength = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); while (totalLength > length) { |