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