2 * Windows CE backend for libusbx 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
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.
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.
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
26 #include "windows_common.h"
29 #include "poll_windows.h"
31 #define MAX_DEVICE_COUNT 256
33 // This is a modified dump of the types in the ceusbkwrapper.h library header
34 // with functions transformed into extern pointers.
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 libusbx build
41 struct UKW_DEVICE_PRIV
;
42 typedef struct UKW_DEVICE_PRIV
*UKW_DEVICE
;
43 typedef UKW_DEVICE
*PUKW_DEVICE
, *LPUKW_DEVICE
;
47 UINT8 bDescriptorType
;
50 UINT8 bDeviceSubClass
;
51 UINT8 bDeviceProtocol
;
52 UINT8 bMaxPacketSize0
;
59 UINT8 bNumConfigurations
;
60 } UKW_DEVICE_DESCRIPTOR
, *PUKW_DEVICE_DESCRIPTOR
, *LPUKW_DEVICE_DESCRIPTOR
;
68 } UKW_CONTROL_HEADER
, *PUKW_CONTROL_HEADER
, *LPUKW_CONTROL_HEADER
;
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
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
90 DLL_DECLARE(WINAPI
, HANDLE
, UkwOpenDriver
, ());
91 DLL_DECLARE(WINAPI
, BOOL
, UkwGetDeviceList
, (HANDLE
, LPUKW_DEVICE
, DWORD
, LPDWORD
));
92 DLL_DECLARE(WINAPI
, void, UkwReleaseDeviceList
, (HANDLE
, LPUKW_DEVICE
, DWORD
));
93 DLL_DECLARE(WINAPI
, BOOL
, UkwGetDeviceAddress
, (UKW_DEVICE
, unsigned char*, unsigned char*, unsigned long*));
94 DLL_DECLARE(WINAPI
, BOOL
, UkwGetDeviceDescriptor
, (UKW_DEVICE
, LPUKW_DEVICE_DESCRIPTOR
));
95 DLL_DECLARE(WINAPI
, BOOL
, UkwGetConfigDescriptor
, (UKW_DEVICE
, DWORD
, LPVOID
, DWORD
, LPDWORD
));
96 DLL_DECLARE(WINAPI
, void, UkwCloseDriver
, (HANDLE
));
97 DLL_DECLARE(WINAPI
, BOOL
, UkwCancelTransfer
, (UKW_DEVICE
, LPOVERLAPPED
, DWORD
));
98 DLL_DECLARE(WINAPI
, BOOL
, UkwIssueControlTransfer
, (UKW_DEVICE
, DWORD
, LPUKW_CONTROL_HEADER
, LPVOID
, DWORD
, LPDWORD
, LPOVERLAPPED
));
99 DLL_DECLARE(WINAPI
, BOOL
, UkwClaimInterface
, (UKW_DEVICE
, DWORD
));
100 DLL_DECLARE(WINAPI
, BOOL
, UkwReleaseInterface
, (UKW_DEVICE
, DWORD
));
101 DLL_DECLARE(WINAPI
, BOOL
, UkwSetInterfaceAlternateSetting
, (UKW_DEVICE
, DWORD
, DWORD
));
102 DLL_DECLARE(WINAPI
, BOOL
, UkwClearHaltHost
, (UKW_DEVICE
, UCHAR
));
103 DLL_DECLARE(WINAPI
, BOOL
, UkwClearHaltDevice
, (UKW_DEVICE
, UCHAR
));
104 DLL_DECLARE(WINAPI
, BOOL
, UkwGetConfig
, (UKW_DEVICE
, PUCHAR
));
105 DLL_DECLARE(WINAPI
, BOOL
, UkwSetConfig
, (UKW_DEVICE
, UCHAR
));
106 DLL_DECLARE(WINAPI
, BOOL
, UkwResetDevice
, (UKW_DEVICE
));
107 DLL_DECLARE(WINAPI
, BOOL
, UkwKernelDriverActive
, (UKW_DEVICE
, DWORD
, PBOOL
));
108 DLL_DECLARE(WINAPI
, BOOL
, UkwAttachKernelDriver
, (UKW_DEVICE
, DWORD
));
109 DLL_DECLARE(WINAPI
, BOOL
, UkwDetachKernelDriver
, (UKW_DEVICE
, DWORD
));
110 DLL_DECLARE(WINAPI
, BOOL
, UkwIssueBulkTransfer
, (UKW_DEVICE
, DWORD
, UCHAR
, LPVOID
, DWORD
, LPDWORD
, LPOVERLAPPED
));
111 DLL_DECLARE(WINAPI
, BOOL
, UkwIsPipeHalted
, (UKW_DEVICE
, UCHAR
, LPBOOL
));
113 // Used to determine if an endpoint status really is halted on a failed transfer.
114 #define STATUS_HALT_FLAG 0x1
116 struct wince_device_priv
{
118 UKW_DEVICE_DESCRIPTOR desc
;
121 struct wince_device_handle_priv
{
122 // This member isn't used, but only exists to avoid an empty structure
123 // for private data for the device handle.
127 struct wince_transfer_priv
{
128 struct winfd pollable_fd
;
129 uint8_t interface_number
;