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 TRACE_USB
18
19#include "sysdeps.h"
20
21#include <winsock2.h>  // winsock.h *must* be included before windows.h.
22#include <adb_api.h>
23#include <errno.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <usb100.h>
27#include <windows.h>
28#include <winerror.h>
29
30#include "adb.h"
31#include "transport.h"
32
33/** Structure usb_handle describes our connection to the usb device via
34  AdbWinApi.dll. This structure is returned from usb_open() routine and
35  is expected in each subsequent call that is accessing the device.
36*/
37struct usb_handle {
38  /// Previous entry in the list of opened usb handles
39  usb_handle *prev;
40
41  /// Next entry in the list of opened usb handles
42  usb_handle *next;
43
44  /// Handle to USB interface
45  ADBAPIHANDLE  adb_interface;
46
47  /// Handle to USB read pipe (endpoint)
48  ADBAPIHANDLE  adb_read_pipe;
49
50  /// Handle to USB write pipe (endpoint)
51  ADBAPIHANDLE  adb_write_pipe;
52
53  /// Interface name
54  char*         interface_name;
55
56  /// Mask for determining when to use zero length packets
57  unsigned zero_mask;
58};
59
60/// Class ID assigned to the device by androidusb.sys
61static const GUID usb_class_id = ANDROID_USB_CLASS_ID;
62
63/// List of opened usb handles
64static usb_handle handle_list = {
65  .prev = &handle_list,
66  .next = &handle_list,
67};
68
69/// Locker for the list of opened usb handles
70ADB_MUTEX_DEFINE( usb_lock );
71
72/// Checks if there is opened usb handle in handle_list for this device.
73int known_device(const char* dev_name);
74
75/// Checks if there is opened usb handle in handle_list for this device.
76/// usb_lock mutex must be held before calling this routine.
77int known_device_locked(const char* dev_name);
78
79/// Registers opened usb handle (adds it to handle_list).
80int register_new_device(usb_handle* handle);
81
82/// Checks if interface (device) matches certain criteria
83int recognized_device(usb_handle* handle);
84
85/// Enumerates present and available interfaces (devices), opens new ones and
86/// registers usb transport for them.
87void find_devices();
88
89/// Entry point for thread that polls (every second) for new usb interfaces.
90/// This routine calls find_devices in infinite loop.
91void* device_poll_thread(void* unused);
92
93/// Initializes this module
94void usb_init();
95
96/// Cleans up this module
97void usb_cleanup();
98
99/// Opens usb interface (device) by interface (device) name.
100usb_handle* do_usb_open(const wchar_t* interface_name);
101
102/// Writes data to the opened usb handle
103int usb_write(usb_handle* handle, const void* data, int len);
104
105/// Reads data using the opened usb handle
106int usb_read(usb_handle *handle, void* data, int len);
107
108/// Cleans up opened usb handle
109void usb_cleanup_handle(usb_handle* handle);
110
111/// Cleans up (but don't close) opened usb handle
112void usb_kick(usb_handle* handle);
113
114/// Closes opened usb handle
115int usb_close(usb_handle* handle);
116
117/// Gets interface (device) name for an opened usb handle
118const char *usb_name(usb_handle* handle);
119
120int known_device_locked(const char* dev_name) {
121  usb_handle* usb;
122
123  if (NULL != dev_name) {
124    // Iterate through the list looking for the name match.
125    for(usb = handle_list.next; usb != &handle_list; usb = usb->next) {
126      // In Windows names are not case sensetive!
127      if((NULL != usb->interface_name) &&
128         (0 == stricmp(usb->interface_name, dev_name))) {
129        return 1;
130      }
131    }
132  }
133
134  return 0;
135}
136
137int known_device(const char* dev_name) {
138  int ret = 0;
139
140  if (NULL != dev_name) {
141    adb_mutex_lock(&usb_lock);
142    ret = known_device_locked(dev_name);
143    adb_mutex_unlock(&usb_lock);
144  }
145
146  return ret;
147}
148
149int register_new_device(usb_handle* handle) {
150  if (NULL == handle)
151    return 0;
152
153  adb_mutex_lock(&usb_lock);
154
155  // Check if device is already in the list
156  if (known_device_locked(handle->interface_name)) {
157    adb_mutex_unlock(&usb_lock);
158    return 0;
159  }
160
161  // Not in the list. Add this handle to the list.
162  handle->next = &handle_list;
163  handle->prev = handle_list.prev;
164  handle->prev->next = handle;
165  handle->next->prev = handle;
166
167  adb_mutex_unlock(&usb_lock);
168
169  return 1;
170}
171
172void* device_poll_thread(void* unused) {
173  D("Created device thread\n");
174
175  while(1) {
176    find_devices();
177    adb_sleep_ms(1000);
178  }
179
180  return NULL;
181}
182
183void usb_init() {
184  adb_thread_t tid;
185
186  if(adb_thread_create(&tid, device_poll_thread, NULL)) {
187    fatal_errno("cannot create input thread");
188  }
189}
190
191void usb_cleanup() {
192}
193
194usb_handle* do_usb_open(const wchar_t* interface_name) {
195  // Allocate our handle
196  usb_handle* ret = (usb_handle*)malloc(sizeof(usb_handle));
197  if (NULL == ret)
198    return NULL;
199
200  // Set linkers back to the handle
201  ret->next = ret;
202  ret->prev = ret;
203
204  // Create interface.
205  ret->adb_interface = AdbCreateInterfaceByName(interface_name);
206
207  if (NULL == ret->adb_interface) {
208    free(ret);
209    errno = GetLastError();
210    return NULL;
211  }
212
213  // Open read pipe (endpoint)
214  ret->adb_read_pipe =
215    AdbOpenDefaultBulkReadEndpoint(ret->adb_interface,
216                                   AdbOpenAccessTypeReadWrite,
217                                   AdbOpenSharingModeReadWrite);
218  if (NULL != ret->adb_read_pipe) {
219    // Open write pipe (endpoint)
220    ret->adb_write_pipe =
221      AdbOpenDefaultBulkWriteEndpoint(ret->adb_interface,
222                                      AdbOpenAccessTypeReadWrite,
223                                      AdbOpenSharingModeReadWrite);
224    if (NULL != ret->adb_write_pipe) {
225      // Save interface name
226      unsigned long name_len = 0;
227
228      // First get expected name length
229      AdbGetInterfaceName(ret->adb_interface,
230                          NULL,
231                          &name_len,
232                          true);
233      if (0 != name_len) {
234        ret->interface_name = (char*)malloc(name_len);
235
236        if (NULL != ret->interface_name) {
237          // Now save the name
238          if (AdbGetInterfaceName(ret->adb_interface,
239                                  ret->interface_name,
240                                  &name_len,
241                                  true)) {
242            // We're done at this point
243            return ret;
244          }
245        } else {
246          SetLastError(ERROR_OUTOFMEMORY);
247        }
248      }
249    }
250  }
251
252  // Something went wrong.
253  int saved_errno = GetLastError();
254  usb_cleanup_handle(ret);
255  free(ret);
256  SetLastError(saved_errno);
257
258  return NULL;
259}
260
261int usb_write(usb_handle* handle, const void* data, int len) {
262  unsigned long time_out = 5000;
263  unsigned long written = 0;
264  int ret;
265
266  D("usb_write %d\n", len);
267  if (NULL != handle) {
268    // Perform write
269    ret = AdbWriteEndpointSync(handle->adb_write_pipe,
270                               (void*)data,
271                               (unsigned long)len,
272                               &written,
273                               time_out);
274    int saved_errno = GetLastError();
275
276    if (ret) {
277      // Make sure that we've written what we were asked to write
278      D("usb_write got: %ld, expected: %d\n", written, len);
279      if (written == (unsigned long)len) {
280        if(handle->zero_mask && (len & handle->zero_mask) == 0) {
281          // Send a zero length packet
282          AdbWriteEndpointSync(handle->adb_write_pipe,
283                               (void*)data,
284                               0,
285                               &written,
286                               time_out);
287        }
288        return 0;
289      }
290    } else {
291      // assume ERROR_INVALID_HANDLE indicates we are disconnected
292      if (saved_errno == ERROR_INVALID_HANDLE)
293        usb_kick(handle);
294    }
295    errno = saved_errno;
296  } else {
297    D("usb_write NULL handle\n");
298    SetLastError(ERROR_INVALID_HANDLE);
299  }
300
301  D("usb_write failed: %d\n", errno);
302
303  return -1;
304}
305
306int usb_read(usb_handle *handle, void* data, int len) {
307  unsigned long time_out = 0;
308  unsigned long read = 0;
309  int ret;
310
311  D("usb_read %d\n", len);
312  if (NULL != handle) {
313    while (len > 0) {
314      int xfer = (len > 4096) ? 4096 : len;
315
316      ret = AdbReadEndpointSync(handle->adb_read_pipe,
317                                  data,
318                                  (unsigned long)xfer,
319                                  &read,
320                                  time_out);
321      int saved_errno = GetLastError();
322      D("usb_write got: %ld, expected: %d, errno: %d\n", read, xfer, saved_errno);
323      if (ret) {
324        data = (char *)data + read;
325        len -= read;
326
327        if (len == 0)
328          return 0;
329      } else {
330        // assume ERROR_INVALID_HANDLE indicates we are disconnected
331        if (saved_errno == ERROR_INVALID_HANDLE)
332          usb_kick(handle);
333        break;
334      }
335      errno = saved_errno;
336    }
337  } else {
338    D("usb_read NULL handle\n");
339    SetLastError(ERROR_INVALID_HANDLE);
340  }
341
342  D("usb_read failed: %d\n", errno);
343
344  return -1;
345}
346
347void usb_cleanup_handle(usb_handle* handle) {
348  if (NULL != handle) {
349    if (NULL != handle->interface_name)
350      free(handle->interface_name);
351    if (NULL != handle->adb_write_pipe)
352      AdbCloseHandle(handle->adb_write_pipe);
353    if (NULL != handle->adb_read_pipe)
354      AdbCloseHandle(handle->adb_read_pipe);
355    if (NULL != handle->adb_interface)
356      AdbCloseHandle(handle->adb_interface);
357
358    handle->interface_name = NULL;
359    handle->adb_write_pipe = NULL;
360    handle->adb_read_pipe = NULL;
361    handle->adb_interface = NULL;
362  }
363}
364
365void usb_kick(usb_handle* handle) {
366  if (NULL != handle) {
367    adb_mutex_lock(&usb_lock);
368
369    usb_cleanup_handle(handle);
370
371    adb_mutex_unlock(&usb_lock);
372  } else {
373    SetLastError(ERROR_INVALID_HANDLE);
374    errno = ERROR_INVALID_HANDLE;
375  }
376}
377
378int usb_close(usb_handle* handle) {
379  D("usb_close\n");
380
381  if (NULL != handle) {
382    // Remove handle from the list
383    adb_mutex_lock(&usb_lock);
384
385    if ((handle->next != handle) && (handle->prev != handle)) {
386      handle->next->prev = handle->prev;
387      handle->prev->next = handle->next;
388      handle->prev = handle;
389      handle->next = handle;
390    }
391
392    adb_mutex_unlock(&usb_lock);
393
394    // Cleanup handle
395    usb_cleanup_handle(handle);
396    free(handle);
397  }
398
399  return 0;
400}
401
402const char *usb_name(usb_handle* handle) {
403  if (NULL == handle) {
404    SetLastError(ERROR_INVALID_HANDLE);
405    errno = ERROR_INVALID_HANDLE;
406    return NULL;
407  }
408
409  return (const char*)handle->interface_name;
410}
411
412int recognized_device(usb_handle* handle) {
413  if (NULL == handle)
414    return 0;
415
416  // Check vendor and product id first
417  USB_DEVICE_DESCRIPTOR device_desc;
418
419  if (!AdbGetUsbDeviceDescriptor(handle->adb_interface,
420                                 &device_desc)) {
421    return 0;
422  }
423
424  // Then check interface properties
425  USB_INTERFACE_DESCRIPTOR interf_desc;
426
427  if (!AdbGetUsbInterfaceDescriptor(handle->adb_interface,
428                                    &interf_desc)) {
429    return 0;
430  }
431
432  // Must have two endpoints
433  if (2 != interf_desc.bNumEndpoints) {
434    return 0;
435  }
436
437  if (is_adb_interface(device_desc.idVendor, device_desc.idProduct,
438      interf_desc.bInterfaceClass, interf_desc.bInterfaceSubClass, interf_desc.bInterfaceProtocol)) {
439
440    if(interf_desc.bInterfaceProtocol == 0x01) {
441      AdbEndpointInformation endpoint_info;
442      // assuming zero is a valid bulk endpoint ID
443      if (AdbGetEndpointInformation(handle->adb_interface, 0, &endpoint_info)) {
444        handle->zero_mask = endpoint_info.max_packet_size - 1;
445      }
446    }
447
448    return 1;
449  }
450
451  return 0;
452}
453
454void find_devices() {
455        usb_handle* handle = NULL;
456  char entry_buffer[2048];
457  char interf_name[2048];
458  AdbInterfaceInfo* next_interface = (AdbInterfaceInfo*)(&entry_buffer[0]);
459  unsigned long entry_buffer_size = sizeof(entry_buffer);
460  char* copy_name;
461
462  // Enumerate all present and active interfaces.
463  ADBAPIHANDLE enum_handle =
464    AdbEnumInterfaces(usb_class_id, true, true, true);
465
466  if (NULL == enum_handle)
467    return;
468
469  while (AdbNextInterface(enum_handle, next_interface, &entry_buffer_size)) {
470    // TODO: FIXME - temp hack converting wchar_t into char.
471    // It would be better to change AdbNextInterface so it will return
472    // interface name as single char string.
473    const wchar_t* wchar_name = next_interface->device_name;
474    for(copy_name = interf_name;
475        L'\0' != *wchar_name;
476        wchar_name++, copy_name++) {
477      *copy_name = (char)(*wchar_name);
478    }
479    *copy_name = '\0';
480
481    // Lets see if we already have this device in the list
482    if (!known_device(interf_name)) {
483      // This seems to be a new device. Open it!
484        handle = do_usb_open(next_interface->device_name);
485        if (NULL != handle) {
486        // Lets see if this interface (device) belongs to us
487        if (recognized_device(handle)) {
488          D("adding a new device %s\n", interf_name);
489          char serial_number[512];
490          unsigned long serial_number_len = sizeof(serial_number);
491          if (AdbGetSerialNumber(handle->adb_interface,
492                                serial_number,
493                                &serial_number_len,
494                                true)) {
495            // Lets make sure that we don't duplicate this device
496            if (register_new_device(handle)) {
497              register_usb_transport(handle, serial_number, NULL, 1);
498            } else {
499              D("register_new_device failed for %s\n", interf_name);
500              usb_cleanup_handle(handle);
501              free(handle);
502            }
503          } else {
504            D("cannot get serial number\n");
505            usb_cleanup_handle(handle);
506            free(handle);
507          }
508        } else {
509          usb_cleanup_handle(handle);
510          free(handle);
511        }
512      }
513    }
514
515    entry_buffer_size = sizeof(entry_buffer);
516  }
517
518  AdbCloseHandle(enum_handle);
519}
520