diff --git a/adb/commandline.c b/adb/commandline.c index 7cd77e0ba..878108120 100644 --- a/adb/commandline.c +++ b/adb/commandline.c @@ -110,7 +110,7 @@ void help() "\n" "device commands:\n" " adb push - copy file/dir to device\n" - " adb pull - copy file/dir from device\n" + " adb pull [] - copy file/dir from device\n" " adb sync [ ] - copy host->device only if changed\n" " (see 'adb help all')\n" " adb shell - run remote shell interactively\n" @@ -951,10 +951,8 @@ top: } if(!strcmp(argv[0], "bugreport")) { - if (argc != 1) { - return 1; - } - do_cmd(ttype, serial, "shell", "dumpstate", "-", 0); + if (argc != 1) return usage(); + do_cmd(ttype, serial, "shell", "bugreport", 0); return 0; } @@ -1022,8 +1020,13 @@ top: } if(!strcmp(argv[0], "pull")) { - if(argc != 3) return usage(); - return do_sync_pull(argv[1], argv[2]); + if (argc == 2) { + return do_sync_pull(argv[1], "."); + } else if (argc == 3) { + return do_sync_pull(argv[1], argv[2]); + } else { + return usage(); + } } if(!strcmp(argv[0], "install")) { diff --git a/adb/usb_linux.c b/adb/usb_linux.c index 863af1dfc..66ee317ed 100644 --- a/adb/usb_linux.c +++ b/adb/usb_linux.c @@ -150,13 +150,13 @@ static void find_usb_device(const char *base, while((de = readdir(devdir))) { unsigned char devdesc[256]; unsigned char* bufptr = devdesc; + unsigned char* bufend; struct usb_device_descriptor* device; struct usb_config_descriptor* config; struct usb_interface_descriptor* interface; struct usb_endpoint_descriptor *ep1, *ep2; unsigned zero_mask = 0; unsigned vid, pid; - int i, interfaces; size_t desclength; if(badname(de->d_name)) continue; @@ -173,6 +173,7 @@ static void find_usb_device(const char *base, } desclength = adb_read(fd, devdesc, sizeof(devdesc)); + bufend = bufptr + desclength; // should have device and configuration descriptors, and atleast two endpoints if (desclength < USB_DT_DEVICE_SIZE + USB_DT_CONFIG_SIZE) { @@ -203,75 +204,73 @@ static void find_usb_device(const char *base, continue; } - // loop through all the interfaces and look for the ADB interface - interfaces = config->bNumInterfaces; - for (i = 0; i < interfaces; i++) { - if (bufptr + USB_DT_ENDPOINT_SIZE > devdesc + desclength) - break; + // loop through all the descriptors and look for the ADB interface + while (bufptr < bufend) { + unsigned char length = bufptr[0]; + unsigned char type = bufptr[1]; - interface = (struct usb_interface_descriptor *)bufptr; - bufptr += USB_DT_INTERFACE_SIZE; - if (interface->bLength != USB_DT_INTERFACE_SIZE || - interface->bDescriptorType != USB_DT_INTERFACE) { - D("usb_interface_descriptor not found\n"); - break; - } + if (type == USB_DT_INTERFACE) { + interface = (struct usb_interface_descriptor *)bufptr; + bufptr += length; - DBGX("bInterfaceClass: %d, bInterfaceSubClass: %d," - "bInterfaceProtocol: %d, bNumEndpoints: %d\n", - interface->bInterfaceClass, interface->bInterfaceSubClass, - interface->bInterfaceProtocol, interface->bNumEndpoints); - - if (interface->bNumEndpoints == 2 && - is_adb_interface(vid, pid, interface->bInterfaceClass, - interface->bInterfaceSubClass, interface->bInterfaceProtocol)) { - - DBGX("looking for bulk endpoints\n"); - // looks like ADB... - ep1 = (struct usb_endpoint_descriptor *)bufptr; - bufptr += USB_DT_ENDPOINT_SIZE; - ep2 = (struct usb_endpoint_descriptor *)bufptr; - bufptr += USB_DT_ENDPOINT_SIZE; - - if (bufptr > devdesc + desclength || - ep1->bLength != USB_DT_ENDPOINT_SIZE || - ep1->bDescriptorType != USB_DT_ENDPOINT || - ep2->bLength != USB_DT_ENDPOINT_SIZE || - ep2->bDescriptorType != USB_DT_ENDPOINT) { - D("endpoints not found\n"); + if (length != USB_DT_INTERFACE_SIZE) { + D("interface descriptor has wrong size\n"); break; } - // both endpoints should be bulk - if (ep1->bmAttributes != USB_ENDPOINT_XFER_BULK || - ep2->bmAttributes != USB_ENDPOINT_XFER_BULK) { - D("bulk endpoints not found\n"); - continue; + DBGX("bInterfaceClass: %d, bInterfaceSubClass: %d," + "bInterfaceProtocol: %d, bNumEndpoints: %d\n", + interface->bInterfaceClass, interface->bInterfaceSubClass, + interface->bInterfaceProtocol, interface->bNumEndpoints); + + if (interface->bNumEndpoints == 2 && + is_adb_interface(vid, pid, interface->bInterfaceClass, + interface->bInterfaceSubClass, interface->bInterfaceProtocol)) { + + DBGX("looking for bulk endpoints\n"); + // looks like ADB... + ep1 = (struct usb_endpoint_descriptor *)bufptr; + bufptr += USB_DT_ENDPOINT_SIZE; + ep2 = (struct usb_endpoint_descriptor *)bufptr; + bufptr += USB_DT_ENDPOINT_SIZE; + + if (bufptr > devdesc + desclength || + ep1->bLength != USB_DT_ENDPOINT_SIZE || + ep1->bDescriptorType != USB_DT_ENDPOINT || + ep2->bLength != USB_DT_ENDPOINT_SIZE || + ep2->bDescriptorType != USB_DT_ENDPOINT) { + D("endpoints not found\n"); + break; + } + + // both endpoints should be bulk + if (ep1->bmAttributes != USB_ENDPOINT_XFER_BULK || + ep2->bmAttributes != USB_ENDPOINT_XFER_BULK) { + D("bulk endpoints not found\n"); + continue; + } + /* aproto 01 needs 0 termination */ + if(interface->bInterfaceProtocol == 0x01) { + zero_mask = ep1->wMaxPacketSize - 1; + } + + // we have a match. now we just need to figure out which is in and which is out. + if (ep1->bEndpointAddress & USB_ENDPOINT_DIR_MASK) { + local_ep_in = ep1->bEndpointAddress; + local_ep_out = ep2->bEndpointAddress; + } else { + local_ep_in = ep2->bEndpointAddress; + local_ep_out = ep1->bEndpointAddress; + } + + register_device_callback(devname, local_ep_in, local_ep_out, + interface->bInterfaceNumber, device->iSerialNumber, zero_mask); + break; } - - /* aproto 01 needs 0 termination */ - if(interface->bInterfaceProtocol == 0x01) { - zero_mask = ep1->wMaxPacketSize - 1; - } - - // we have a match. now we just need to figure out which is in and which is out. - if (ep1->bEndpointAddress & USB_ENDPOINT_DIR_MASK) { - local_ep_in = ep1->bEndpointAddress; - local_ep_out = ep2->bEndpointAddress; - } else { - local_ep_in = ep2->bEndpointAddress; - local_ep_out = ep1->bEndpointAddress; - } - - register_device_callback(devname, local_ep_in, local_ep_out, - interface->bInterfaceNumber, device->iSerialNumber, zero_mask); - - break; } else { - // seek next interface descriptor - bufptr += (USB_DT_ENDPOINT_SIZE * interface->bNumEndpoints); - } - } // end of for + bufptr += length; + } + } // end of while adb_close(fd); } // end of devdir while diff --git a/adb/usb_vendors.c b/adb/usb_vendors.c index 9b8c9720b..73bf41843 100644 --- a/adb/usb_vendors.c +++ b/adb/usb_vendors.c @@ -55,6 +55,8 @@ #define VENDOR_ID_FOXCONN 0x0489 // Dell's USB Vendor ID #define VENDOR_ID_DELL 0x413c +// Nvidia's USB Vendor ID +#define VENDOR_ID_NVIDIA 0x0955 // Garmin-Asus's USB Vendor ID #define VENDOR_ID_GARMIN_ASUS 0x091E @@ -71,6 +73,7 @@ int builtInVendorIds[] = { VENDOR_ID_SONY_ERICSSON, VENDOR_ID_FOXCONN, VENDOR_ID_DELL, + VENDOR_ID_NVIDIA, VENDOR_ID_GARMIN_ASUS, };