1 /* 2 * Windows CE backend for libusb 1.0 3 * Copyright © 2011-2013 RealVNC Ltd. 4 * Portions taken from Windows backend, which is 5 * Copyright © 2009-2010 Pete Batard <pbatard@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 #pragma once 25 26 #include "windows_common.h" 27 28 #include <windows.h> 29 #include "poll_windows.h" 30 31 #define MAX_DEVICE_COUNT 256 32 33 // This is a modified dump of the types in the ceusbkwrapper.h library header 34 // with functions transformed into extern pointers. 35 // 36 // This backend dynamically loads ceusbkwrapper.dll and doesn't include 37 // ceusbkwrapper.h directly to simplify the build process. The kernel 38 // side wrapper driver is built using the platform image build tools, 39 // which makes it difficult to reference directly from the libusb build 40 // system. 41 struct UKW_DEVICE_PRIV; 42 typedef struct UKW_DEVICE_PRIV *UKW_DEVICE; 43 typedef UKW_DEVICE *PUKW_DEVICE, *LPUKW_DEVICE; 44 45 typedef struct { 46 UINT8 bLength; 47 UINT8 bDescriptorType; 48 UINT16 bcdUSB; 49 UINT8 bDeviceClass; 50 UINT8 bDeviceSubClass; 51 UINT8 bDeviceProtocol; 52 UINT8 bMaxPacketSize0; 53 UINT16 idVendor; 54 UINT16 idProduct; 55 UINT16 bcdDevice; 56 UINT8 iManufacturer; 57 UINT8 iProduct; 58 UINT8 iSerialNumber; 59 UINT8 bNumConfigurations; 60 } UKW_DEVICE_DESCRIPTOR, *PUKW_DEVICE_DESCRIPTOR, *LPUKW_DEVICE_DESCRIPTOR; 61 62 typedef struct { 63 UINT8 bmRequestType; 64 UINT8 bRequest; 65 UINT16 wValue; 66 UINT16 wIndex; 67 UINT16 wLength; 68 } UKW_CONTROL_HEADER, *PUKW_CONTROL_HEADER, *LPUKW_CONTROL_HEADER; 69 70 // Collection of flags which can be used when issuing transfer requests 71 /* Indicates that the transfer direction is 'in' */ 72 #define UKW_TF_IN_TRANSFER 0x00000001 73 /* Indicates that the transfer direction is 'out' */ 74 #define UKW_TF_OUT_TRANSFER 0x00000000 75 /* Specifies that the transfer should complete as soon as possible, 76 * even if no OVERLAPPED structure has been provided. */ 77 #define UKW_TF_NO_WAIT 0x00000100 78 /* Indicates that transfers shorter than the buffer are ok */ 79 #define UKW_TF_SHORT_TRANSFER_OK 0x00000200 80 #define UKW_TF_SEND_TO_DEVICE 0x00010000 81 #define UKW_TF_SEND_TO_INTERFACE 0x00020000 82 #define UKW_TF_SEND_TO_ENDPOINT 0x00040000 83 /* Don't block when waiting for memory allocations */ 84 #define UKW_TF_DONT_BLOCK_FOR_MEM 0x00080000 85 86 /* Value to use when dealing with configuration values, such as UkwGetConfigDescriptor, 87 * to specify the currently active configuration for the device. */ 88 #define UKW_ACTIVE_CONFIGURATION -1 89 90 DLL_DECLARE_HANDLE(ceusbkwrapper); 91 DLL_DECLARE_FUNC(WINAPI, HANDLE, UkwOpenDriver, ()); 92 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceList, (HANDLE, LPUKW_DEVICE, DWORD, LPDWORD)); 93 DLL_DECLARE_FUNC(WINAPI, void, UkwReleaseDeviceList, (HANDLE, LPUKW_DEVICE, DWORD)); 94 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceAddress, (UKW_DEVICE, unsigned char*, unsigned char*, unsigned long*)); 95 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceDescriptor, (UKW_DEVICE, LPUKW_DEVICE_DESCRIPTOR)); 96 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfigDescriptor, (UKW_DEVICE, DWORD, LPVOID, DWORD, LPDWORD)); 97 DLL_DECLARE_FUNC(WINAPI, void, UkwCloseDriver, (HANDLE)); 98 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwCancelTransfer, (UKW_DEVICE, LPOVERLAPPED, DWORD)); 99 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueControlTransfer, (UKW_DEVICE, DWORD, LPUKW_CONTROL_HEADER, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); 100 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClaimInterface, (UKW_DEVICE, DWORD)); 101 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwReleaseInterface, (UKW_DEVICE, DWORD)); 102 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetInterfaceAlternateSetting, (UKW_DEVICE, DWORD, DWORD)); 103 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltHost, (UKW_DEVICE, UCHAR)); 104 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltDevice, (UKW_DEVICE, UCHAR)); 105 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfig, (UKW_DEVICE, PUCHAR)); 106 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetConfig, (UKW_DEVICE, UCHAR)); 107 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwResetDevice, (UKW_DEVICE)); 108 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwKernelDriverActive, (UKW_DEVICE, DWORD, PBOOL)); 109 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwAttachKernelDriver, (UKW_DEVICE, DWORD)); 110 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwDetachKernelDriver, (UKW_DEVICE, DWORD)); 111 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueBulkTransfer, (UKW_DEVICE, DWORD, UCHAR, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); 112 DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIsPipeHalted, (UKW_DEVICE, UCHAR, LPBOOL)); 113 114 // Used to determine if an endpoint status really is halted on a failed transfer. 115 #define STATUS_HALT_FLAG 0x1 116 117 struct wince_device_priv { 118 UKW_DEVICE dev; 119 UKW_DEVICE_DESCRIPTOR desc; 120 }; 121 122 struct wince_transfer_priv { 123 struct winfd pollable_fd; 124 uint8_t interface_number; 125 }; 126 127