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