Home | History | Annotate | Download | only in adb
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define TRACE_TAG USB
     18 
     19 #include "sysdeps.h"
     20 
     21 #include <CoreFoundation/CoreFoundation.h>
     22 
     23 #include <IOKit/IOKitLib.h>
     24 #include <IOKit/IOCFPlugIn.h>
     25 #include <IOKit/usb/IOUSBLib.h>
     26 #include <IOKit/IOMessage.h>
     27 #include <mach/mach_port.h>
     28 
     29 #include <inttypes.h>
     30 #include <stdio.h>
     31 
     32 #include <atomic>
     33 #include <memory>
     34 #include <mutex>
     35 #include <vector>
     36 
     37 #include <android-base/logging.h>
     38 #include <android-base/stringprintf.h>
     39 
     40 #include "adb.h"
     41 #include "transport.h"
     42 
     43 struct usb_handle
     44 {
     45     UInt8 bulkIn;
     46     UInt8 bulkOut;
     47     IOUSBInterfaceInterface190** interface;
     48     unsigned int zero_mask;
     49 
     50     // For garbage collecting disconnected devices.
     51     bool mark;
     52     std::string devpath;
     53     std::atomic<bool> dead;
     54 
     55     usb_handle() : bulkIn(0), bulkOut(0), interface(nullptr),
     56         zero_mask(0), mark(false), dead(false) {
     57     }
     58 };
     59 
     60 static std::atomic<bool> usb_inited_flag;
     61 
     62 static auto& g_usb_handles_mutex = *new std::mutex();
     63 static auto& g_usb_handles = *new std::vector<std::unique_ptr<usb_handle>>();
     64 
     65 static bool IsKnownDevice(const std::string& devpath) {
     66     std::lock_guard<std::mutex> lock_guard(g_usb_handles_mutex);
     67     for (auto& usb : g_usb_handles) {
     68         if (usb->devpath == devpath) {
     69             // Set mark flag to indicate this device is still alive.
     70             usb->mark = true;
     71             return true;
     72         }
     73     }
     74     return false;
     75 }
     76 
     77 static void usb_kick_locked(usb_handle* handle);
     78 
     79 static void KickDisconnectedDevices() {
     80     std::lock_guard<std::mutex> lock_guard(g_usb_handles_mutex);
     81     for (auto& usb : g_usb_handles) {
     82         if (!usb->mark) {
     83             usb_kick_locked(usb.get());
     84         } else {
     85             usb->mark = false;
     86         }
     87     }
     88 }
     89 
     90 static void AddDevice(std::unique_ptr<usb_handle> handle) {
     91     handle->mark = true;
     92     std::lock_guard<std::mutex> lock(g_usb_handles_mutex);
     93     g_usb_handles.push_back(std::move(handle));
     94 }
     95 
     96 static void AndroidInterfaceAdded(io_iterator_t iterator);
     97 static std::unique_ptr<usb_handle> CheckInterface(IOUSBInterfaceInterface190 **iface,
     98                                                   UInt16 vendor, UInt16 product);
     99 
    100 static bool FindUSBDevices() {
    101     // Create the matching dictionary to find the Android device's adb interface.
    102     CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBInterfaceClassName);
    103     if (!matchingDict) {
    104         LOG(ERROR) << "couldn't create USB matching dictionary";
    105         return false;
    106     }
    107     // Create an iterator for all I/O Registry objects that match the dictionary.
    108     io_iterator_t iter = 0;
    109     kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
    110     if (kr != KERN_SUCCESS) {
    111         LOG(ERROR) << "failed to get matching services";
    112         return false;
    113     }
    114     // Iterate over all matching objects.
    115     AndroidInterfaceAdded(iter);
    116     IOObjectRelease(iter);
    117     return true;
    118 }
    119 
    120 static void
    121 AndroidInterfaceAdded(io_iterator_t iterator)
    122 {
    123     kern_return_t            kr;
    124     io_service_t             usbDevice;
    125     io_service_t             usbInterface;
    126     IOCFPlugInInterface      **plugInInterface = NULL;
    127     IOUSBInterfaceInterface220  **iface = NULL;
    128     IOUSBDeviceInterface197  **dev = NULL;
    129     HRESULT                  result;
    130     SInt32                   score;
    131     uint32_t                 locationId;
    132     UInt8                    if_class, subclass, protocol;
    133     UInt16                   vendor;
    134     UInt16                   product;
    135     UInt8                    serialIndex;
    136     char                     serial[256];
    137     std::string devpath;
    138 
    139     while ((usbInterface = IOIteratorNext(iterator))) {
    140         //* Create an intermediate interface plugin
    141         kr = IOCreatePlugInInterfaceForService(usbInterface,
    142                                                kIOUSBInterfaceUserClientTypeID,
    143                                                kIOCFPlugInInterfaceID,
    144                                                &plugInInterface, &score);
    145         IOObjectRelease(usbInterface);
    146         if ((kIOReturnSuccess != kr) || (!plugInInterface)) {
    147             LOG(ERROR) << "Unable to create an interface plug-in (" << std::hex << kr << ")";
    148             continue;
    149         }
    150 
    151         //* This gets us the interface object
    152         result = (*plugInInterface)->QueryInterface(
    153             plugInInterface,
    154             CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), (LPVOID*)&iface);
    155         //* We only needed the plugin to get the interface, so discard it
    156         (*plugInInterface)->Release(plugInInterface);
    157         if (result || !iface) {
    158             LOG(ERROR) << "Couldn't query the interface (" << std::hex << result << ")";
    159             continue;
    160         }
    161 
    162         kr = (*iface)->GetInterfaceClass(iface, &if_class);
    163         kr = (*iface)->GetInterfaceSubClass(iface, &subclass);
    164         kr = (*iface)->GetInterfaceProtocol(iface, &protocol);
    165         if(if_class != ADB_CLASS || subclass != ADB_SUBCLASS || protocol != ADB_PROTOCOL) {
    166             // Ignore non-ADB devices.
    167             LOG(DEBUG) << "Ignoring interface with incorrect class/subclass/protocol - " << if_class
    168                        << ", " << subclass << ", " << protocol;
    169             (*iface)->Release(iface);
    170             continue;
    171         }
    172 
    173         //* this gets us an ioservice, with which we will find the actual
    174         //* device; after getting a plugin, and querying the interface, of
    175         //* course.
    176         //* Gotta love OS X
    177         kr = (*iface)->GetDevice(iface, &usbDevice);
    178         if (kIOReturnSuccess != kr || !usbDevice) {
    179             LOG(ERROR) << "Couldn't grab device from interface (" << std::hex << kr << ")";
    180             continue;
    181         }
    182 
    183         plugInInterface = NULL;
    184         score = 0;
    185         //* create an intermediate device plugin
    186         kr = IOCreatePlugInInterfaceForService(usbDevice,
    187                                                kIOUSBDeviceUserClientTypeID,
    188                                                kIOCFPlugInInterfaceID,
    189                                                &plugInInterface, &score);
    190         //* only needed this to find the plugin
    191         (void)IOObjectRelease(usbDevice);
    192         if ((kIOReturnSuccess != kr) || (!plugInInterface)) {
    193             LOG(ERROR) << "Unable to create a device plug-in (" << std::hex << kr << ")";
    194             continue;
    195         }
    196 
    197         result = (*plugInInterface)->QueryInterface(plugInInterface,
    198             CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID*)&dev);
    199         //* only needed this to query the plugin
    200         (*plugInInterface)->Release(plugInInterface);
    201         if (result || !dev) {
    202             LOG(ERROR) << "Couldn't create a device interface (" << std::hex << result << ")";
    203             continue;
    204         }
    205 
    206         //* Now after all that, we actually have a ref to the device and
    207         //* the interface that matched our criteria
    208         kr = (*dev)->GetDeviceVendor(dev, &vendor);
    209         kr = (*dev)->GetDeviceProduct(dev, &product);
    210         kr = (*dev)->GetLocationID(dev, &locationId);
    211         if (kr == KERN_SUCCESS) {
    212             devpath = android::base::StringPrintf("usb:%" PRIu32 "X", locationId);
    213             if (IsKnownDevice(devpath)) {
    214                 continue;
    215             }
    216         }
    217         kr = (*dev)->USBGetSerialNumberStringIndex(dev, &serialIndex);
    218 
    219         if (serialIndex > 0) {
    220             IOUSBDevRequest req;
    221             UInt16          buffer[256];
    222             UInt16          languages[128];
    223 
    224             memset(languages, 0, sizeof(languages));
    225 
    226             req.bmRequestType =
    227                     USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
    228             req.bRequest = kUSBRqGetDescriptor;
    229             req.wValue = (kUSBStringDesc << 8) | 0;
    230             req.wIndex = 0;
    231             req.pData = languages;
    232             req.wLength = sizeof(languages);
    233             kr = (*dev)->DeviceRequest(dev, &req);
    234 
    235             if (kr == kIOReturnSuccess && req.wLenDone > 0) {
    236 
    237                 int langCount = (req.wLenDone - 2) / 2, lang;
    238 
    239                 for (lang = 1; lang <= langCount; lang++) {
    240 
    241                     memset(buffer, 0, sizeof(buffer));
    242                     memset(&req, 0, sizeof(req));
    243 
    244                     req.bmRequestType =
    245                             USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
    246                     req.bRequest = kUSBRqGetDescriptor;
    247                     req.wValue = (kUSBStringDesc << 8) | serialIndex;
    248                     req.wIndex = languages[lang];
    249                     req.pData = buffer;
    250                     req.wLength = sizeof(buffer);
    251                     kr = (*dev)->DeviceRequest(dev, &req);
    252 
    253                     if (kr == kIOReturnSuccess && req.wLenDone > 0) {
    254                         int i, count;
    255 
    256                         // skip first word, and copy the rest to the serial string,
    257                         // changing shorts to bytes.
    258                         count = (req.wLenDone - 1) / 2;
    259                         for (i = 0; i < count; i++)
    260                                 serial[i] = buffer[i + 1];
    261                         serial[i] = 0;
    262                         break;
    263                     }
    264                 }
    265             }
    266         }
    267 
    268         (*dev)->Release(dev);
    269 
    270         VLOG(USB) << android::base::StringPrintf("Found vid=%04x pid=%04x serial=%s\n",
    271                         vendor, product, serial);
    272         if (devpath.empty()) {
    273             devpath = serial;
    274         }
    275         if (IsKnownDevice(devpath)) {
    276             (*iface)->USBInterfaceClose(iface);
    277             (*iface)->Release(iface);
    278             continue;
    279         }
    280 
    281         std::unique_ptr<usb_handle> handle = CheckInterface((IOUSBInterfaceInterface190**)iface,
    282                                                             vendor, product);
    283         if (handle == nullptr) {
    284             LOG(ERROR) << "Could not find device interface";
    285             (*iface)->Release(iface);
    286             continue;
    287         }
    288         handle->devpath = devpath;
    289         usb_handle* handle_p = handle.get();
    290         VLOG(USB) << "Add usb device " << serial;
    291         AddDevice(std::move(handle));
    292         register_usb_transport(handle_p, serial, devpath.c_str(), 1);
    293     }
    294 }
    295 
    296 // Used to clear both the endpoints before starting.
    297 // When adb quits, we might clear the host endpoint but not the device.
    298 // So we make sure both sides are clear before starting up.
    299 static bool ClearPipeStallBothEnds(IOUSBInterfaceInterface190** interface, UInt8 bulkEp) {
    300     IOReturn rc = (*interface)->ClearPipeStallBothEnds(interface, bulkEp);
    301     if (rc != kIOReturnSuccess) {
    302         LOG(ERROR) << "Could not clear pipe stall both ends: " << std::hex << rc;
    303         return false;
    304     }
    305     return true;
    306 }
    307 
    308 //* TODO: simplify this further since we only register to get ADB interface
    309 //* subclass+protocol events
    310 static std::unique_ptr<usb_handle>
    311 CheckInterface(IOUSBInterfaceInterface190 **interface, UInt16 vendor, UInt16 product)
    312 {
    313     std::unique_ptr<usb_handle> handle;
    314     IOReturn kr;
    315     UInt8 interfaceNumEndpoints, interfaceClass, interfaceSubClass, interfaceProtocol;
    316     UInt8 endpoint;
    317 
    318     //* Now open the interface.  This will cause the pipes associated with
    319     //* the endpoints in the interface descriptor to be instantiated
    320     kr = (*interface)->USBInterfaceOpen(interface);
    321     if (kr != kIOReturnSuccess) {
    322         LOG(ERROR) << "Could not open interface: " << std::hex << kr;
    323         return NULL;
    324     }
    325 
    326     //* Get the number of endpoints associated with this interface
    327     kr = (*interface)->GetNumEndpoints(interface, &interfaceNumEndpoints);
    328     if (kr != kIOReturnSuccess) {
    329         LOG(ERROR) << "Unable to get number of endpoints: " << std::hex << kr;
    330         goto err_get_num_ep;
    331     }
    332 
    333     //* Get interface class, subclass and protocol
    334     if ((*interface)->GetInterfaceClass(interface, &interfaceClass) != kIOReturnSuccess ||
    335             (*interface)->GetInterfaceSubClass(interface, &interfaceSubClass) != kIOReturnSuccess ||
    336             (*interface)->GetInterfaceProtocol(interface, &interfaceProtocol) != kIOReturnSuccess) {
    337             LOG(ERROR) << "Unable to get interface class, subclass and protocol";
    338             goto err_get_interface_class;
    339     }
    340 
    341     //* check to make sure interface class, subclass and protocol match ADB
    342     //* avoid opening mass storage endpoints
    343     if (!is_adb_interface(vendor, product, interfaceClass, interfaceSubClass, interfaceProtocol)) {
    344         goto err_bad_adb_interface;
    345     }
    346 
    347     handle.reset(new usb_handle);
    348     if (handle == nullptr) {
    349         goto err_bad_adb_interface;
    350     }
    351 
    352     //* Iterate over the endpoints for this interface and find the first
    353     //* bulk in/out pipes available.  These will be our read/write pipes.
    354     for (endpoint = 1; endpoint <= interfaceNumEndpoints; endpoint++) {
    355         UInt8   transferType;
    356         UInt16  maxPacketSize;
    357         UInt8   interval;
    358         UInt8   number;
    359         UInt8   direction;
    360 
    361         kr = (*interface)->GetPipeProperties(interface, endpoint, &direction,
    362                 &number, &transferType, &maxPacketSize, &interval);
    363         if (kr != kIOReturnSuccess) {
    364             LOG(ERROR) << "FindDeviceInterface - could not get pipe properties: "
    365                        << std::hex << kr;
    366             goto err_get_pipe_props;
    367         }
    368 
    369         if (kUSBBulk != transferType) continue;
    370 
    371         if (kUSBIn == direction) {
    372             handle->bulkIn = endpoint;
    373             if (!ClearPipeStallBothEnds(interface, handle->bulkIn)) goto err_get_pipe_props;
    374         }
    375 
    376         if (kUSBOut == direction) {
    377             handle->bulkOut = endpoint;
    378             if (!ClearPipeStallBothEnds(interface, handle->bulkOut)) goto err_get_pipe_props;
    379         }
    380 
    381         handle->zero_mask = maxPacketSize - 1;
    382     }
    383 
    384     handle->interface = interface;
    385     return handle;
    386 
    387 err_get_pipe_props:
    388 err_bad_adb_interface:
    389 err_get_interface_class:
    390 err_get_num_ep:
    391     (*interface)->USBInterfaceClose(interface);
    392     return nullptr;
    393 }
    394 
    395 std::mutex& operate_device_lock = *new std::mutex();
    396 
    397 static void RunLoopThread(void* unused) {
    398     adb_thread_setname("RunLoop");
    399 
    400     VLOG(USB) << "RunLoopThread started";
    401     while (true) {
    402         {
    403             std::lock_guard<std::mutex> lock_guard(operate_device_lock);
    404             FindUSBDevices();
    405             KickDisconnectedDevices();
    406         }
    407         // Signal the parent that we are running
    408         usb_inited_flag = true;
    409         adb_sleep_ms(1000);
    410     }
    411     VLOG(USB) << "RunLoopThread done";
    412 }
    413 
    414 static void usb_cleanup() {
    415     VLOG(USB) << "usb_cleanup";
    416     // Wait until usb operations in RunLoopThread finish, and prevent further operations.
    417     operate_device_lock.lock();
    418     close_usb_devices();
    419 }
    420 
    421 void usb_init() {
    422     static bool initialized = false;
    423     if (!initialized) {
    424         atexit(usb_cleanup);
    425 
    426         usb_inited_flag = false;
    427 
    428         if (!adb_thread_create(RunLoopThread, nullptr)) {
    429             fatal_errno("cannot create RunLoop thread");
    430         }
    431 
    432         // Wait for initialization to finish
    433         while (!usb_inited_flag) {
    434             adb_sleep_ms(100);
    435         }
    436 
    437         initialized = true;
    438     }
    439 }
    440 
    441 int usb_write(usb_handle *handle, const void *buf, int len)
    442 {
    443     IOReturn    result;
    444 
    445     if (!len)
    446         return 0;
    447 
    448     if (!handle || handle->dead)
    449         return -1;
    450 
    451     if (NULL == handle->interface) {
    452         LOG(ERROR) << "usb_write interface was null";
    453         return -1;
    454     }
    455 
    456     if (0 == handle->bulkOut) {
    457         LOG(ERROR) << "bulkOut endpoint not assigned";
    458         return -1;
    459     }
    460 
    461     result =
    462         (*handle->interface)->WritePipe(handle->interface, handle->bulkOut, (void *)buf, len);
    463 
    464     if ((result == 0) && (handle->zero_mask)) {
    465         /* we need 0-markers and our transfer */
    466         if(!(len & handle->zero_mask)) {
    467             result =
    468                 (*handle->interface)->WritePipe(
    469                         handle->interface, handle->bulkOut, (void *)buf, 0);
    470         }
    471     }
    472 
    473     if (0 == result)
    474         return 0;
    475 
    476     LOG(ERROR) << "usb_write failed with status: " << std::hex << result;
    477     return -1;
    478 }
    479 
    480 int usb_read(usb_handle *handle, void *buf, int len)
    481 {
    482     IOReturn result;
    483     UInt32  numBytes = len;
    484 
    485     if (!len) {
    486         return 0;
    487     }
    488 
    489     if (!handle || handle->dead) {
    490         return -1;
    491     }
    492 
    493     if (NULL == handle->interface) {
    494         LOG(ERROR) << "usb_read interface was null";
    495         return -1;
    496     }
    497 
    498     if (0 == handle->bulkIn) {
    499         LOG(ERROR) << "bulkIn endpoint not assigned";
    500         return -1;
    501     }
    502 
    503     result = (*handle->interface)->ReadPipe(handle->interface, handle->bulkIn, buf, &numBytes);
    504 
    505     if (kIOUSBPipeStalled == result) {
    506         LOG(ERROR) << "Pipe stalled, clearing stall.\n";
    507         (*handle->interface)->ClearPipeStall(handle->interface, handle->bulkIn);
    508         result = (*handle->interface)->ReadPipe(handle->interface, handle->bulkIn, buf, &numBytes);
    509     }
    510 
    511     if (kIOReturnSuccess == result)
    512         return 0;
    513     else {
    514         LOG(ERROR) << "usb_read failed with status: " << std::hex << result;
    515     }
    516 
    517     return -1;
    518 }
    519 
    520 int usb_close(usb_handle *handle)
    521 {
    522     std::lock_guard<std::mutex> lock(g_usb_handles_mutex);
    523     for (auto it = g_usb_handles.begin(); it != g_usb_handles.end(); ++it) {
    524         if ((*it).get() == handle) {
    525             g_usb_handles.erase(it);
    526             break;
    527         }
    528     }
    529     return 0;
    530 }
    531 
    532 static void usb_kick_locked(usb_handle *handle)
    533 {
    534     LOG(INFO) << "Kicking handle";
    535     /* release the interface */
    536     if (!handle)
    537         return;
    538 
    539     if (!handle->dead)
    540     {
    541         handle->dead = true;
    542         (*handle->interface)->USBInterfaceClose(handle->interface);
    543         (*handle->interface)->Release(handle->interface);
    544     }
    545 }
    546 
    547 void usb_kick(usb_handle *handle) {
    548     // Use the lock to avoid multiple thread kicking the device at the same time.
    549     std::lock_guard<std::mutex> lock_guard(g_usb_handles_mutex);
    550     usb_kick_locked(handle);
    551 }
    552