1 /* 2 * Windows CE backend for libusbx 1.0 3 * Copyright 2011-2013 RealVNC Ltd. 4 * Large portions taken from Windows backend, which is 5 * Copyright 2009-2010 Pete Batard <pbatard (at) gmail.com> 6 * With contributions from Michael Plante, Orin Eman et al. 7 * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer 8 * Major code testing contribution by Xiaofan Chen 9 * 10 * This library is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 14 * 15 * This library is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more details. 19 * 20 * You should have received a copy of the GNU Lesser General Public 21 * License along with this library; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23 */ 24 25 #include <libusbi.h> 26 27 #include <stdint.h> 28 #include <errno.h> 29 #include <inttypes.h> 30 31 #include "wince_usb.h" 32 33 // Forward declares 34 static int wince_clock_gettime(int clk_id, struct timespec *tp); 35 unsigned __stdcall wince_clock_gettime_threaded(void* param); 36 37 // Global variables 38 uint64_t hires_frequency, hires_ticks_to_ps; 39 int errno; 40 const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime 41 enum windows_version windows_version = WINDOWS_CE; 42 static int concurrent_usage = -1; 43 // Timer thread 44 // NB: index 0 is for monotonic and 1 is for the thread exit event 45 HANDLE timer_thread = NULL; 46 HANDLE timer_mutex = NULL; 47 struct timespec timer_tp; 48 volatile LONG request_count[2] = {0, 1}; // last one must be > 0 49 HANDLE timer_request[2] = { NULL, NULL }; 50 HANDLE timer_response = NULL; 51 HANDLE driver_handle = INVALID_HANDLE_VALUE; 52 53 /* 54 * Converts a windows error to human readable string 55 * uses retval as errorcode, or, if 0, use GetLastError() 56 */ 57 #if defined(ENABLE_LOGGING) 58 static char* windows_error_str(uint32_t retval) 59 { 60 static TCHAR wErr_string[ERR_BUFFER_SIZE]; 61 static char err_string[ERR_BUFFER_SIZE]; 62 63 DWORD size; 64 size_t i; 65 uint32_t error_code, format_error; 66 67 error_code = retval?retval:GetLastError(); 68 69 safe_stprintf(wErr_string, ERR_BUFFER_SIZE, _T("[%d] "), error_code); 70 71 size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, 72 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &wErr_string[safe_tcslen(wErr_string)], 73 ERR_BUFFER_SIZE - (DWORD)safe_tcslen(wErr_string), NULL); 74 if (size == 0) { 75 format_error = GetLastError(); 76 if (format_error) 77 safe_stprintf(wErr_string, ERR_BUFFER_SIZE, 78 _T("Windows error code %u (FormatMessage error code %u)"), error_code, format_error); 79 else 80 safe_stprintf(wErr_string, ERR_BUFFER_SIZE, _T("Unknown error code %u"), error_code); 81 } else { 82 // Remove CR/LF terminators 83 for (i=safe_tcslen(wErr_string)-1; ((wErr_string[i]==0x0A) || (wErr_string[i]==0x0D)); i--) { 84 wErr_string[i] = 0; 85 } 86 } 87 if (WideCharToMultiByte(CP_ACP, 0, wErr_string, -1, err_string, ERR_BUFFER_SIZE, NULL, NULL) < 0) 88 { 89 strcpy(err_string, "Unable to convert error string"); 90 } 91 return err_string; 92 } 93 #endif 94 95 static struct wince_device_priv *_device_priv(struct libusb_device *dev) 96 { 97 return (struct wince_device_priv *) dev->os_priv; 98 } 99 100 // ceusbkwrapper to libusb error code mapping 101 static int translate_driver_error(int error) 102 { 103 switch (error) { 104 case ERROR_INVALID_PARAMETER: 105 return LIBUSB_ERROR_INVALID_PARAM; 106 case ERROR_CALL_NOT_IMPLEMENTED: 107 case ERROR_NOT_SUPPORTED: 108 return LIBUSB_ERROR_NOT_SUPPORTED; 109 case ERROR_NOT_ENOUGH_MEMORY: 110 return LIBUSB_ERROR_NO_MEM; 111 case ERROR_INVALID_HANDLE: 112 return LIBUSB_ERROR_NO_DEVICE; 113 case ERROR_BUSY: 114 return LIBUSB_ERROR_BUSY; 115 116 // Error codes that are either unexpected, or have 117 // no suitable LIBUSB_ERROR equivilant. 118 case ERROR_CANCELLED: 119 case ERROR_INTERNAL_ERROR: 120 default: 121 return LIBUSB_ERROR_OTHER; 122 } 123 } 124 125 static int init_dllimports() 126 { 127 DLL_LOAD(ceusbkwrapper.dll, UkwOpenDriver, TRUE); 128 DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceList, TRUE); 129 DLL_LOAD(ceusbkwrapper.dll, UkwReleaseDeviceList, TRUE); 130 DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceAddress, TRUE); 131 DLL_LOAD(ceusbkwrapper.dll, UkwGetDeviceDescriptor, TRUE); 132 DLL_LOAD(ceusbkwrapper.dll, UkwGetConfigDescriptor, TRUE); 133 DLL_LOAD(ceusbkwrapper.dll, UkwCloseDriver, TRUE); 134 DLL_LOAD(ceusbkwrapper.dll, UkwCancelTransfer, TRUE); 135 DLL_LOAD(ceusbkwrapper.dll, UkwIssueControlTransfer, TRUE); 136 DLL_LOAD(ceusbkwrapper.dll, UkwClaimInterface, TRUE); 137 DLL_LOAD(ceusbkwrapper.dll, UkwReleaseInterface, TRUE); 138 DLL_LOAD(ceusbkwrapper.dll, UkwSetInterfaceAlternateSetting, TRUE); 139 DLL_LOAD(ceusbkwrapper.dll, UkwClearHaltHost, TRUE); 140 DLL_LOAD(ceusbkwrapper.dll, UkwClearHaltDevice, TRUE); 141 DLL_LOAD(ceusbkwrapper.dll, UkwGetConfig, TRUE); 142 DLL_LOAD(ceusbkwrapper.dll, UkwSetConfig, TRUE); 143 DLL_LOAD(ceusbkwrapper.dll, UkwResetDevice, TRUE); 144 DLL_LOAD(ceusbkwrapper.dll, UkwKernelDriverActive, TRUE); 145 DLL_LOAD(ceusbkwrapper.dll, UkwAttachKernelDriver, TRUE); 146 DLL_LOAD(ceusbkwrapper.dll, UkwDetachKernelDriver, TRUE); 147 DLL_LOAD(ceusbkwrapper.dll, UkwIssueBulkTransfer, TRUE); 148 DLL_LOAD(ceusbkwrapper.dll, UkwIsPipeHalted, TRUE); 149 return LIBUSB_SUCCESS; 150 } 151 152 static int init_device(struct libusb_device *dev, UKW_DEVICE drv_dev, 153 unsigned char bus_addr, unsigned char dev_addr) 154 { 155 struct wince_device_priv *priv = _device_priv(dev); 156 int r = LIBUSB_SUCCESS; 157 158 dev->bus_number = bus_addr; 159 dev->device_address = dev_addr; 160 priv->dev = drv_dev; 161 162 if (!UkwGetDeviceDescriptor(priv->dev, &(priv->desc))) { 163 r = translate_driver_error(GetLastError()); 164 } 165 return r; 166 } 167 168 // Internal API functions 169 static int wince_init(struct libusb_context *ctx) 170 { 171 int i, r = LIBUSB_ERROR_OTHER; 172 HANDLE semaphore; 173 TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) 174 175 _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); 176 semaphore = CreateSemaphore(NULL, 1, 1, sem_name); 177 if (semaphore == NULL) { 178 usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); 179 return LIBUSB_ERROR_NO_MEM; 180 } 181 182 // A successful wait brings our semaphore count to 0 (unsignaled) 183 // => any concurent wait stalls until the semaphore's release 184 if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { 185 usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); 186 CloseHandle(semaphore); 187 return LIBUSB_ERROR_NO_MEM; 188 } 189 190 // NB: concurrent usage supposes that init calls are equally balanced with 191 // exit calls. If init is called more than exit, we will not exit properly 192 if ( ++concurrent_usage == 0 ) { // First init? 193 // Initialize pollable file descriptors 194 init_polling(); 195 196 // Load DLL imports 197 if (init_dllimports() != LIBUSB_SUCCESS) { 198 usbi_err(ctx, "could not resolve DLL functions"); 199 r = LIBUSB_ERROR_NOT_SUPPORTED; 200 goto init_exit; 201 } 202 203 // try to open a handle to the driver 204 driver_handle = UkwOpenDriver(); 205 if (driver_handle == INVALID_HANDLE_VALUE) { 206 usbi_err(ctx, "could not connect to driver"); 207 r = LIBUSB_ERROR_NOT_SUPPORTED; 208 goto init_exit; 209 } 210 211 // Windows CE doesn't have a way of specifying thread affinity, so this code 212 // just has to hope QueryPerformanceCounter doesn't report different values when 213 // running on different cores. 214 r = LIBUSB_ERROR_NO_MEM; 215 for (i = 0; i < 2; i++) { 216 timer_request[i] = CreateEvent(NULL, TRUE, FALSE, NULL); 217 if (timer_request[i] == NULL) { 218 usbi_err(ctx, "could not create timer request event %d - aborting", i); 219 goto init_exit; 220 } 221 } 222 timer_response = CreateSemaphore(NULL, 0, MAX_TIMER_SEMAPHORES, NULL); 223 if (timer_response == NULL) { 224 usbi_err(ctx, "could not create timer response semaphore - aborting"); 225 goto init_exit; 226 } 227 timer_mutex = CreateMutex(NULL, FALSE, NULL); 228 if (timer_mutex == NULL) { 229 usbi_err(ctx, "could not create timer mutex - aborting"); 230 goto init_exit; 231 } 232 timer_thread = CreateThread(NULL, 0, wince_clock_gettime_threaded, NULL, 0, NULL); 233 if (timer_thread == NULL) { 234 usbi_err(ctx, "Unable to create timer thread - aborting"); 235 goto init_exit; 236 } 237 238 // Wait for timer thread to init before continuing. 239 if (WaitForSingleObject(timer_response, INFINITE) != WAIT_OBJECT_0) { 240 usbi_err(ctx, "Failed to wait for timer thread to become ready - aborting"); 241 goto init_exit; 242 } 243 } 244 // At this stage, either we went through full init successfully, or didn't need to 245 r = LIBUSB_SUCCESS; 246 247 init_exit: // Holds semaphore here. 248 if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? 249 if (driver_handle != INVALID_HANDLE_VALUE) { 250 UkwCloseDriver(driver_handle); 251 driver_handle = INVALID_HANDLE_VALUE; 252 } 253 if (timer_thread) { 254 SetEvent(timer_request[1]); // actually the signal to quit the thread. 255 if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) { 256 usbi_warn(ctx, "could not wait for timer thread to quit"); 257 TerminateThread(timer_thread, 1); // shouldn't happen, but we're destroying 258 // all objects it might have held anyway. 259 } 260 CloseHandle(timer_thread); 261 timer_thread = NULL; 262 } 263 for (i = 0; i < 2; i++) { 264 if (timer_request[i]) { 265 CloseHandle(timer_request[i]); 266 timer_request[i] = NULL; 267 } 268 } 269 if (timer_response) { 270 CloseHandle(timer_response); 271 timer_response = NULL; 272 } 273 if (timer_mutex) { 274 CloseHandle(timer_mutex); 275 timer_mutex = NULL; 276 } 277 } 278 279 if (r != LIBUSB_SUCCESS) 280 --concurrent_usage; // Not expected to call libusb_exit if we failed. 281 282 ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 283 CloseHandle(semaphore); 284 return r; 285 } 286 287 static void wince_exit(void) 288 { 289 int i; 290 HANDLE semaphore; 291 TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) 292 293 _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); 294 semaphore = CreateSemaphore(NULL, 1, 1, sem_name); 295 if (semaphore == NULL) { 296 return; 297 } 298 299 // A successful wait brings our semaphore count to 0 (unsignaled) 300 // => any concurent wait stalls until the semaphore release 301 if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { 302 CloseHandle(semaphore); 303 return; 304 } 305 306 // Only works if exits and inits are balanced exactly 307 if (--concurrent_usage < 0) { // Last exit 308 exit_polling(); 309 310 if (timer_thread) { 311 SetEvent(timer_request[1]); // actually the signal to quit the thread. 312 if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) { 313 usbi_dbg("could not wait for timer thread to quit"); 314 TerminateThread(timer_thread, 1); 315 } 316 CloseHandle(timer_thread); 317 timer_thread = NULL; 318 } 319 for (i = 0; i < 2; i++) { 320 if (timer_request[i]) { 321 CloseHandle(timer_request[i]); 322 timer_request[i] = NULL; 323 } 324 } 325 if (timer_response) { 326 CloseHandle(timer_response); 327 timer_response = NULL; 328 } 329 if (timer_mutex) { 330 CloseHandle(timer_mutex); 331 timer_mutex = NULL; 332 } 333 if (driver_handle != INVALID_HANDLE_VALUE) { 334 UkwCloseDriver(driver_handle); 335 driver_handle = INVALID_HANDLE_VALUE; 336 } 337 } 338 339 ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 340 CloseHandle(semaphore); 341 } 342 343 static int wince_get_device_list( 344 struct libusb_context *ctx, 345 struct discovered_devs **discdevs) 346 { 347 UKW_DEVICE devices[MAX_DEVICE_COUNT]; 348 struct discovered_devs * new_devices = *discdevs; 349 DWORD count = 0, i; 350 struct libusb_device *dev = NULL; 351 unsigned char bus_addr, dev_addr; 352 unsigned long session_id; 353 BOOL success; 354 DWORD release_list_offset = 0; 355 int r = LIBUSB_SUCCESS; 356 357 success = UkwGetDeviceList(driver_handle, devices, MAX_DEVICE_COUNT, &count); 358 if (!success) { 359 int libusbErr = translate_driver_error(GetLastError()); 360 usbi_err(ctx, "could not get devices: %s", windows_error_str(0)); 361 return libusbErr; 362 } 363 for(i = 0; i < count; ++i) { 364 release_list_offset = i; 365 success = UkwGetDeviceAddress(devices[i], &bus_addr, &dev_addr, &session_id); 366 if (!success) { 367 r = translate_driver_error(GetLastError()); 368 usbi_err(ctx, "could not get device address for %d: %s", i, windows_error_str(0)); 369 goto err_out; 370 } 371 dev = usbi_get_device_by_session_id(ctx, session_id); 372 if (dev) { 373 usbi_dbg("using existing device for %d/%d (session %ld)", 374 bus_addr, dev_addr, session_id); 375 libusb_ref_device(dev); 376 // Release just this element in the device list (as we already hold a 377 // reference to it). 378 UkwReleaseDeviceList(driver_handle, &devices[i], 1); 379 release_list_offset++; 380 } else { 381 usbi_dbg("allocating new device for %d/%d (session %ld)", 382 bus_addr, dev_addr, session_id); 383 dev = usbi_alloc_device(ctx, session_id); 384 if (!dev) { 385 r = LIBUSB_ERROR_NO_MEM; 386 goto err_out; 387 } 388 r = init_device(dev, devices[i], bus_addr, dev_addr); 389 if (r < 0) 390 goto err_out; 391 r = usbi_sanitize_device(dev); 392 if (r < 0) 393 goto err_out; 394 } 395 new_devices = discovered_devs_append(new_devices, dev); 396 if (!discdevs) { 397 r = LIBUSB_ERROR_NO_MEM; 398 goto err_out; 399 } 400 safe_unref_device(dev); 401 } 402 *discdevs = new_devices; 403 return r; 404 err_out: 405 *discdevs = new_devices; 406 safe_unref_device(dev); 407 // Release the remainder of the unprocessed device list. 408 // The devices added to new_devices already will still be passed up to libusb, 409 // which can dispose of them at its leisure. 410 UkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset); 411 return r; 412 } 413 414 static int wince_open(struct libusb_device_handle *handle) 415 { 416 // Nothing to do to open devices as a handle to it has 417 // been retrieved by wince_get_device_list 418 return LIBUSB_SUCCESS; 419 } 420 421 static void wince_close(struct libusb_device_handle *handle) 422 { 423 // Nothing to do as wince_open does nothing. 424 } 425 426 static int wince_get_device_descriptor( 427 struct libusb_device *device, 428 unsigned char *buffer, int *host_endian) 429 { 430 struct wince_device_priv *priv = _device_priv(device); 431 432 *host_endian = 1; 433 memcpy(buffer, &priv->desc, DEVICE_DESC_LENGTH); 434 return LIBUSB_SUCCESS; 435 } 436 437 static int wince_get_active_config_descriptor( 438 struct libusb_device *device, 439 unsigned char *buffer, size_t len, int *host_endian) 440 { 441 struct wince_device_priv *priv = _device_priv(device); 442 DWORD actualSize = len; 443 *host_endian = 0; 444 if (!UkwGetConfigDescriptor(priv->dev, UKW_ACTIVE_CONFIGURATION, buffer, len, &actualSize)) { 445 return translate_driver_error(GetLastError()); 446 } 447 return actualSize; 448 } 449 450 static int wince_get_config_descriptor( 451 struct libusb_device *device, 452 uint8_t config_index, 453 unsigned char *buffer, size_t len, int *host_endian) 454 { 455 struct wince_device_priv *priv = _device_priv(device); 456 DWORD actualSize = len; 457 *host_endian = 0; 458 if (!UkwGetConfigDescriptor(priv->dev, config_index, buffer, len, &actualSize)) { 459 return translate_driver_error(GetLastError()); 460 } 461 return actualSize; 462 } 463 464 static int wince_get_configuration( 465 struct libusb_device_handle *handle, 466 int *config) 467 { 468 struct wince_device_priv *priv = _device_priv(handle->dev); 469 UCHAR cv = 0; 470 if (!UkwGetConfig(priv->dev, &cv)) { 471 return translate_driver_error(GetLastError()); 472 } 473 (*config) = cv; 474 return LIBUSB_SUCCESS; 475 } 476 477 static int wince_set_configuration( 478 struct libusb_device_handle *handle, 479 int config) 480 { 481 struct wince_device_priv *priv = _device_priv(handle->dev); 482 // Setting configuration 0 places the device in Address state. 483 // This should correspond to the "unconfigured state" required by 484 // libusb when the specified configuration is -1. 485 UCHAR cv = (config < 0) ? 0 : config; 486 if (!UkwSetConfig(priv->dev, cv)) { 487 return translate_driver_error(GetLastError()); 488 } 489 return LIBUSB_SUCCESS; 490 } 491 492 static int wince_claim_interface( 493 struct libusb_device_handle *handle, 494 int interface_number) 495 { 496 struct wince_device_priv *priv = _device_priv(handle->dev); 497 if (!UkwClaimInterface(priv->dev, interface_number)) { 498 return translate_driver_error(GetLastError()); 499 } 500 return LIBUSB_SUCCESS; 501 } 502 503 static int wince_release_interface( 504 struct libusb_device_handle *handle, 505 int interface_number) 506 { 507 struct wince_device_priv *priv = _device_priv(handle->dev); 508 if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, 0)) { 509 return translate_driver_error(GetLastError()); 510 } 511 if (!UkwReleaseInterface(priv->dev, interface_number)) { 512 return translate_driver_error(GetLastError()); 513 } 514 return LIBUSB_SUCCESS; 515 } 516 517 static int wince_set_interface_altsetting( 518 struct libusb_device_handle *handle, 519 int interface_number, int altsetting) 520 { 521 struct wince_device_priv *priv = _device_priv(handle->dev); 522 if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, altsetting)) { 523 return translate_driver_error(GetLastError()); 524 } 525 return LIBUSB_SUCCESS; 526 } 527 528 static int wince_clear_halt( 529 struct libusb_device_handle *handle, 530 unsigned char endpoint) 531 { 532 struct wince_device_priv *priv = _device_priv(handle->dev); 533 if (!UkwClearHaltHost(priv->dev, endpoint)) { 534 return translate_driver_error(GetLastError()); 535 } 536 if (!UkwClearHaltDevice(priv->dev, endpoint)) { 537 return translate_driver_error(GetLastError()); 538 } 539 return LIBUSB_SUCCESS; 540 } 541 542 static int wince_reset_device( 543 struct libusb_device_handle *handle) 544 { 545 struct wince_device_priv *priv = _device_priv(handle->dev); 546 if (!UkwResetDevice(priv->dev)) { 547 return translate_driver_error(GetLastError()); 548 } 549 return LIBUSB_SUCCESS; 550 } 551 552 static int wince_kernel_driver_active( 553 struct libusb_device_handle *handle, 554 int interface_number) 555 { 556 struct wince_device_priv *priv = _device_priv(handle->dev); 557 BOOL result = FALSE; 558 if (!UkwKernelDriverActive(priv->dev, interface_number, &result)) { 559 return translate_driver_error(GetLastError()); 560 } 561 return result ? 1 : 0; 562 } 563 564 static int wince_detach_kernel_driver( 565 struct libusb_device_handle *handle, 566 int interface_number) 567 { 568 struct wince_device_priv *priv = _device_priv(handle->dev); 569 if (!UkwDetachKernelDriver(priv->dev, interface_number)) { 570 return translate_driver_error(GetLastError()); 571 } 572 return LIBUSB_SUCCESS; 573 } 574 575 static int wince_attach_kernel_driver( 576 struct libusb_device_handle *handle, 577 int interface_number) 578 { 579 struct wince_device_priv *priv = _device_priv(handle->dev); 580 if (!UkwAttachKernelDriver(priv->dev, interface_number)) { 581 return translate_driver_error(GetLastError()); 582 } 583 return LIBUSB_SUCCESS; 584 } 585 586 static void wince_destroy_device( 587 struct libusb_device *dev) 588 { 589 struct wince_device_priv *priv = _device_priv(dev); 590 UkwReleaseDeviceList(driver_handle, &priv->dev, 1); 591 } 592 593 static void wince_clear_transfer_priv( 594 struct usbi_transfer *itransfer) 595 { 596 struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); 597 struct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd); 598 // No need to cancel transfer as it is either complete or abandoned 599 wfd.itransfer = NULL; 600 CloseHandle(wfd.handle); 601 usbi_free_fd(&transfer_priv->pollable_fd); 602 } 603 604 static int wince_cancel_transfer( 605 struct usbi_transfer *itransfer) 606 { 607 struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); 608 struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); 609 struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); 610 611 if (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT)) { 612 return translate_driver_error(GetLastError()); 613 } 614 return LIBUSB_SUCCESS; 615 } 616 617 static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer) 618 { 619 struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); 620 struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); 621 struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); 622 struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); 623 BOOL direction_in, ret; 624 struct winfd wfd; 625 DWORD flags; 626 HANDLE eventHandle; 627 PUKW_CONTROL_HEADER setup = NULL; 628 const BOOL control_transfer = transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL; 629 630 transfer_priv->pollable_fd = INVALID_WINFD; 631 if (control_transfer) { 632 setup = (PUKW_CONTROL_HEADER) transfer->buffer; 633 direction_in = setup->bmRequestType & LIBUSB_ENDPOINT_IN; 634 } else { 635 direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; 636 } 637 flags = direction_in ? UKW_TF_IN_TRANSFER : UKW_TF_OUT_TRANSFER; 638 flags |= UKW_TF_SHORT_TRANSFER_OK; 639 640 eventHandle = CreateEvent(NULL, FALSE, FALSE, NULL); 641 if (eventHandle == NULL) { 642 usbi_err(ctx, "Failed to create event for async transfer"); 643 return LIBUSB_ERROR_NO_MEM; 644 } 645 646 wfd = usbi_create_fd(eventHandle, direction_in ? RW_READ : RW_WRITE, itransfer, &wince_cancel_transfer); 647 if (wfd.fd < 0) { 648 CloseHandle(eventHandle); 649 return LIBUSB_ERROR_NO_MEM; 650 } 651 652 transfer_priv->pollable_fd = wfd; 653 if (control_transfer) { 654 // Split out control setup header and data buffer 655 DWORD bufLen = transfer->length - sizeof(UKW_CONTROL_HEADER); 656 PVOID buf = (PVOID) &transfer->buffer[sizeof(UKW_CONTROL_HEADER)]; 657 658 ret = UkwIssueControlTransfer(priv->dev, flags, setup, buf, bufLen, &transfer->actual_length, wfd.overlapped); 659 } else { 660 ret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer, 661 transfer->length, &transfer->actual_length, wfd.overlapped); 662 } 663 if (!ret) { 664 int libusbErr = translate_driver_error(GetLastError()); 665 usbi_err(ctx, "UkwIssue%sTransfer failed: error %d", 666 control_transfer ? "Control" : "Bulk", GetLastError()); 667 wince_clear_transfer_priv(itransfer); 668 return libusbErr; 669 } 670 usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT); 671 itransfer->flags |= USBI_TRANSFER_UPDATED_FDS; 672 673 return LIBUSB_SUCCESS; 674 } 675 676 static int wince_submit_iso_transfer(struct usbi_transfer *itransfer) 677 { 678 return LIBUSB_ERROR_NOT_SUPPORTED; 679 } 680 681 static int wince_submit_transfer( 682 struct usbi_transfer *itransfer) 683 { 684 struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); 685 686 switch (transfer->type) { 687 case LIBUSB_TRANSFER_TYPE_CONTROL: 688 case LIBUSB_TRANSFER_TYPE_BULK: 689 case LIBUSB_TRANSFER_TYPE_INTERRUPT: 690 return wince_submit_control_or_bulk_transfer(itransfer); 691 case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: 692 return wince_submit_iso_transfer(itransfer); 693 default: 694 usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); 695 return LIBUSB_ERROR_INVALID_PARAM; 696 } 697 } 698 699 static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) 700 { 701 struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); 702 struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); 703 struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); 704 int status; 705 706 usbi_dbg("handling I/O completion with errcode %d", io_result); 707 708 if (io_result == ERROR_NOT_SUPPORTED && 709 transfer->type != LIBUSB_TRANSFER_TYPE_CONTROL) { 710 /* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper 711 * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the 712 * endpoint isn't actually stalled. 713 * 714 * One example of this is that some devices will occasionally fail to reply to an IN 715 * token. The WinCE USB layer carries on with the transaction until it is completed 716 * (or cancelled) but then completes it with USB_ERROR_STALL. 717 * 718 * This code therefore needs to confirm that there really is a stall error, by both 719 * checking the pipe status and requesting the endpoint status from the device. 720 */ 721 BOOL halted = FALSE; 722 usbi_dbg("checking I/O completion with errcode ERROR_NOT_SUPPORTED is really a stall"); 723 if (UkwIsPipeHalted(priv->dev, transfer->endpoint, &halted)) { 724 /* Pipe status retrieved, so now request endpoint status by sending a GET_STATUS 725 * control request to the device. This is done synchronously, which is a bit 726 * naughty, but this is a special corner case. 727 */ 728 WORD wStatus = 0; 729 DWORD written = 0; 730 UKW_CONTROL_HEADER ctrlHeader; 731 ctrlHeader.bmRequestType = LIBUSB_REQUEST_TYPE_STANDARD | 732 LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_ENDPOINT; 733 ctrlHeader.bRequest = LIBUSB_REQUEST_GET_STATUS; 734 ctrlHeader.wValue = 0; 735 ctrlHeader.wIndex = transfer->endpoint; 736 ctrlHeader.wLength = sizeof(wStatus); 737 if (UkwIssueControlTransfer(priv->dev, 738 UKW_TF_IN_TRANSFER | UKW_TF_SEND_TO_ENDPOINT, 739 &ctrlHeader, &wStatus, sizeof(wStatus), &written, NULL)) { 740 if (written == sizeof(wStatus) && 741 (wStatus & STATUS_HALT_FLAG) == 0) { 742 if (!halted || UkwClearHaltHost(priv->dev, transfer->endpoint)) { 743 usbi_dbg("Endpoint doesn't appear to be stalled, overriding error with success"); 744 io_result = ERROR_SUCCESS; 745 } else { 746 usbi_dbg("Endpoint doesn't appear to be stalled, but the host is halted, changing error"); 747 io_result = ERROR_IO_DEVICE; 748 } 749 } 750 } 751 } 752 } 753 754 switch(io_result) { 755 case ERROR_SUCCESS: 756 itransfer->transferred += io_size; 757 status = LIBUSB_TRANSFER_COMPLETED; 758 break; 759 case ERROR_CANCELLED: 760 usbi_dbg("detected transfer cancel"); 761 status = LIBUSB_TRANSFER_CANCELLED; 762 break; 763 case ERROR_NOT_SUPPORTED: 764 case ERROR_GEN_FAILURE: 765 usbi_dbg("detected endpoint stall"); 766 status = LIBUSB_TRANSFER_STALL; 767 break; 768 case ERROR_SEM_TIMEOUT: 769 usbi_dbg("detected semaphore timeout"); 770 status = LIBUSB_TRANSFER_TIMED_OUT; 771 break; 772 case ERROR_OPERATION_ABORTED: 773 if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { 774 usbi_dbg("detected timeout"); 775 status = LIBUSB_TRANSFER_TIMED_OUT; 776 } else { 777 usbi_dbg("detected operation aborted"); 778 status = LIBUSB_TRANSFER_CANCELLED; 779 } 780 break; 781 default: 782 usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error: %s", windows_error_str(io_result)); 783 status = LIBUSB_TRANSFER_ERROR; 784 break; 785 } 786 wince_clear_transfer_priv(itransfer); 787 if (status == LIBUSB_TRANSFER_CANCELLED) { 788 usbi_handle_transfer_cancellation(itransfer); 789 } else { 790 usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); 791 } 792 } 793 794 static void wince_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) 795 { 796 struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); 797 798 switch (transfer->type) { 799 case LIBUSB_TRANSFER_TYPE_CONTROL: 800 case LIBUSB_TRANSFER_TYPE_BULK: 801 case LIBUSB_TRANSFER_TYPE_INTERRUPT: 802 case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: 803 wince_transfer_callback (itransfer, io_result, io_size); 804 break; 805 default: 806 usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); 807 } 808 } 809 810 static int wince_handle_events( 811 struct libusb_context *ctx, 812 struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) 813 { 814 struct wince_transfer_priv* transfer_priv = NULL; 815 POLL_NFDS_TYPE i = 0; 816 BOOL found = FALSE; 817 struct usbi_transfer *transfer; 818 DWORD io_size, io_result; 819 820 usbi_mutex_lock(&ctx->open_devs_lock); 821 for (i = 0; i < nfds && num_ready > 0; i++) { 822 823 usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); 824 825 if (!fds[i].revents) { 826 continue; 827 } 828 829 num_ready--; 830 831 // Because a Windows OVERLAPPED is used for poll emulation, 832 // a pollable fd is created and stored with each transfer 833 usbi_mutex_lock(&ctx->flying_transfers_lock); 834 list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { 835 transfer_priv = usbi_transfer_get_os_priv(transfer); 836 if (transfer_priv->pollable_fd.fd == fds[i].fd) { 837 found = TRUE; 838 break; 839 } 840 } 841 usbi_mutex_unlock(&ctx->flying_transfers_lock); 842 843 if (found && HasOverlappedIoCompleted(transfer_priv->pollable_fd.overlapped)) { 844 io_result = (DWORD)transfer_priv->pollable_fd.overlapped->Internal; 845 io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; 846 usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); 847 // let handle_callback free the event using the transfer wfd 848 // If you don't use the transfer wfd, you run a risk of trying to free a 849 // newly allocated wfd that took the place of the one from the transfer. 850 wince_handle_callback(transfer, io_result, io_size); 851 } else if (found) { 852 usbi_err(ctx, "matching transfer for fd %x has not completed", fds[i]); 853 return LIBUSB_ERROR_OTHER; 854 } else { 855 usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); 856 return LIBUSB_ERROR_NOT_FOUND; 857 } 858 } 859 860 usbi_mutex_unlock(&ctx->open_devs_lock); 861 return LIBUSB_SUCCESS; 862 } 863 864 /* 865 * Monotonic and real time functions 866 */ 867 unsigned __stdcall wince_clock_gettime_threaded(void* param) 868 { 869 LARGE_INTEGER hires_counter, li_frequency; 870 LONG nb_responses; 871 int timer_index; 872 873 // Init - find out if we have access to a monotonic (hires) timer 874 if (!QueryPerformanceFrequency(&li_frequency)) { 875 usbi_dbg("no hires timer available on this platform"); 876 hires_frequency = 0; 877 hires_ticks_to_ps = UINT64_C(0); 878 } else { 879 hires_frequency = li_frequency.QuadPart; 880 // The hires frequency can go as high as 4 GHz, so we'll use a conversion 881 // to picoseconds to compute the tv_nsecs part in clock_gettime 882 hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; 883 usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); 884 } 885 886 // Signal wince_init() that we're ready to service requests 887 if (ReleaseSemaphore(timer_response, 1, NULL) == 0) { 888 usbi_dbg("unable to release timer semaphore: %s", windows_error_str(0)); 889 } 890 891 // Main loop - wait for requests 892 while (1) { 893 timer_index = WaitForMultipleObjects(2, timer_request, FALSE, INFINITE) - WAIT_OBJECT_0; 894 if ( (timer_index != 0) && (timer_index != 1) ) { 895 usbi_dbg("failure to wait on requests: %s", windows_error_str(0)); 896 continue; 897 } 898 if (request_count[timer_index] == 0) { 899 // Request already handled 900 ResetEvent(timer_request[timer_index]); 901 // There's still a possiblity that a thread sends a request between the 902 // time we test request_count[] == 0 and we reset the event, in which case 903 // the request would be ignored. The simple solution to that is to test 904 // request_count again and process requests if non zero. 905 if (request_count[timer_index] == 0) 906 continue; 907 } 908 switch (timer_index) { 909 case 0: 910 WaitForSingleObject(timer_mutex, INFINITE); 911 // Requests to this thread are for hires always 912 if (QueryPerformanceCounter(&hires_counter) != 0) { 913 timer_tp.tv_sec = (long)(hires_counter.QuadPart / hires_frequency); 914 timer_tp.tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps); 915 } else { 916 // Fallback to real-time if we can't get monotonic value 917 // Note that real-time clock does not wait on the mutex or this thread. 918 wince_clock_gettime(USBI_CLOCK_REALTIME, &timer_tp); 919 } 920 ReleaseMutex(timer_mutex); 921 922 nb_responses = InterlockedExchange((LONG*)&request_count[0], 0); 923 if ( (nb_responses) 924 && (ReleaseSemaphore(timer_response, nb_responses, NULL) == 0) ) { 925 usbi_dbg("unable to release timer semaphore: %s", windows_error_str(0)); 926 } 927 continue; 928 case 1: // time to quit 929 usbi_dbg("timer thread quitting"); 930 return 0; 931 } 932 } 933 usbi_dbg("ERROR: broken timer thread"); 934 return 1; 935 } 936 937 static int wince_clock_gettime(int clk_id, struct timespec *tp) 938 { 939 FILETIME filetime; 940 ULARGE_INTEGER rtime; 941 DWORD r; 942 SYSTEMTIME st; 943 switch(clk_id) { 944 case USBI_CLOCK_MONOTONIC: 945 if (hires_frequency != 0) { 946 while (1) { 947 InterlockedIncrement((LONG*)&request_count[0]); 948 SetEvent(timer_request[0]); 949 r = WaitForSingleObject(timer_response, TIMER_REQUEST_RETRY_MS); 950 switch(r) { 951 case WAIT_OBJECT_0: 952 WaitForSingleObject(timer_mutex, INFINITE); 953 *tp = timer_tp; 954 ReleaseMutex(timer_mutex); 955 return LIBUSB_SUCCESS; 956 case WAIT_TIMEOUT: 957 usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); 958 break; // Retry until successful 959 default: 960 usbi_dbg("WaitForSingleObject failed: %s", windows_error_str(0)); 961 return LIBUSB_ERROR_OTHER; 962 } 963 } 964 } 965 // Fall through and return real-time if monotonic was not detected @ timer init 966 case USBI_CLOCK_REALTIME: 967 // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx 968 // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 969 // Note however that our resolution is bounded by the Windows system time 970 // functions and is at best of the order of 1 ms (or, usually, worse) 971 GetSystemTime(&st); 972 SystemTimeToFileTime(&st, &filetime); 973 rtime.LowPart = filetime.dwLowDateTime; 974 rtime.HighPart = filetime.dwHighDateTime; 975 rtime.QuadPart -= epoch_time; 976 tp->tv_sec = (long)(rtime.QuadPart / 10000000); 977 tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); 978 return LIBUSB_SUCCESS; 979 default: 980 return LIBUSB_ERROR_INVALID_PARAM; 981 } 982 } 983 984 const struct usbi_os_backend wince_backend = { 985 "Windows CE", 986 0, 987 wince_init, 988 wince_exit, 989 990 wince_get_device_list, 991 NULL, /* hotplug_poll */ 992 wince_open, 993 wince_close, 994 995 wince_get_device_descriptor, 996 wince_get_active_config_descriptor, 997 wince_get_config_descriptor, 998 NULL, /* get_config_descriptor_by_value() */ 999 1000 wince_get_configuration, 1001 wince_set_configuration, 1002 wince_claim_interface, 1003 wince_release_interface, 1004 1005 wince_set_interface_altsetting, 1006 wince_clear_halt, 1007 wince_reset_device, 1008 1009 wince_kernel_driver_active, 1010 wince_detach_kernel_driver, 1011 wince_attach_kernel_driver, 1012 1013 wince_destroy_device, 1014 1015 wince_submit_transfer, 1016 wince_cancel_transfer, 1017 wince_clear_transfer_priv, 1018 1019 wince_handle_events, 1020 1021 wince_clock_gettime, 1022 sizeof(struct wince_device_priv), 1023 sizeof(struct wince_device_handle_priv), 1024 sizeof(struct wince_transfer_priv), 1025 0, 1026 }; 1027