[CMAKE]
[reactos.git] / drivers / bluetooth / fbtusb / include / fbtusb.h
1 // Copyright (c) 2004, Antony C. Roberts
2
3 // Use of this file is subject to the terms
4 // described in the LICENSE.TXT file that
5 // accompanies this file.
6 //
7 // Your use of this file indicates your
8 // acceptance of the terms described in
9 // LICENSE.TXT.
10 //
11 // http://www.freebt.net
12
13 #ifndef _FREEBT_H
14 #define _FREEBT_H
15
16 #include <initguid.h>
17 #include <wdm.h>
18 #include <wmilib.h>
19 #include <wmistr.h>
20 #include <windef.h>
21 #include "usbdi.h"
22 #include "usbdlib.h"
23
24 // Pull in all the command, event and structure definitions
25 #include "fbtHciDefs.h"
26
27 // Standard USB Wireless/Bluetooth class, etc
28 #define FREEBT_USB_STDCLASS 0xE0 // Wireless Controller
29 #define FREEBT_USB_STDSUBCLASS 0x01 // RF Controller
30 #define FREEBT_USB_STDPROTOCOL 0x01 // Bluetooth Programming
31
32 // Recommended Bluetooth Endpoints
33 #define FREEBT_STDENDPOINT_HCICMD 0x00 // HCI Command
34 #define FREEBT_STDENDPOINT_HCIEVENT 0x81 // HCI Event
35 #define FREEBT_STDENDPOINT_ACLIN 0x82 // HCI Data In
36 #define FREEBT_STDENDPOINT_ACLOUT 0x02 // HCI Data Out
37 #define FREEBT_STDENDPOINT_AUDIOIN 0x83 // SCO In
38 #define FREEBT_STDENDPOINT_AUDIOOUT 0x03 // SCO Out
39
40
41 #define OBTTAG (ULONG) 'OBTU'
42
43 #undef ExAllocatePool
44 #define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, OBTTAG);
45
46 #if DBG
47
48 #define FreeBT_DbgPrint(level, _x_) \
49 if((level) <= DebugLevel) { \
50 DbgPrint _x_; \
51 }
52
53 #else
54
55 #define FreeBT_DbgPrint(level, _x_)
56
57 #endif
58
59 typedef struct _GLOBALS
60 {
61 UNICODE_STRING FreeBT_RegistryPath;
62
63 } GLOBALS;
64
65 #define IDLE_INTERVAL 5000
66
67 typedef enum _PIPETYPE
68 {
69 HciCommandPipe,
70 HciEventPipe,
71 AclDataIn,
72 AclDataOut,
73 SCODataIn,
74 SCODataOut
75
76 } FREEBT_PIPETYPE;
77
78 typedef enum _DEVSTATE
79 {
80 NotStarted, // not started
81 Stopped, // device stopped
82 Working, // started and working
83 PendingStop, // stop pending
84 PendingRemove, // remove pending
85 SurpriseRemoved, // removed by surprise
86 Removed // removed
87
88 } DEVSTATE;
89
90 typedef enum _QUEUE_STATE
91 {
92 HoldRequests, // device is not started yet
93 AllowRequests, // device is ready to process
94 FailRequests // fail both existing and queued up requests
95
96 } QUEUE_STATE;
97
98 typedef enum _WDM_VERSION
99 {
100 WinXpOrBetter,
101 Win2kOrBetter,
102 WinMeOrBetter,
103 Win98OrBetter
104
105 } WDM_VERSION;
106
107 #define INITIALIZE_PNP_STATE(_Data_) \
108 (_Data_)->DeviceState = NotStarted;\
109 (_Data_)->PrevDevState = NotStarted;
110
111 #define SET_NEW_PNP_STATE(_Data_, _state_) \
112 (_Data_)->PrevDevState = (_Data_)->DeviceState;\
113 (_Data_)->DeviceState = (_state_);
114
115 #define RESTORE_PREVIOUS_PNP_STATE(_Data_) \
116 (_Data_)->DeviceState = (_Data_)->PrevDevState;
117
118
119 // registry path used for parameters
120 // global to all instances of the driver
121 #define FREEBT_REGISTRY_PARAMETERS_PATH L"\\REGISTRY\\Machine\\System\\CurrentControlSet\\SERVICES\\BULKUSB\\Parameters"
122
123 typedef struct _FREEBT_PIPE_CONTEXT
124 {
125 BOOLEAN PipeOpen;
126 FREEBT_PIPETYPE PipeType;
127
128 } FREEBT_PIPE_CONTEXT, *PFREEBT_PIPE_CONTEXT;
129
130 // A structure representing the instance information associated with
131 // this particular device.
132 typedef struct _DEVICE_EXTENSION
133 {
134 // Functional Device Object
135 PDEVICE_OBJECT FunctionalDeviceObject;
136
137 // Device object we call when submitting Urbs
138 PDEVICE_OBJECT TopOfStackDeviceObject;
139
140 // The bus driver object
141 PDEVICE_OBJECT PhysicalDeviceObject;
142
143 // Name buffer for our named Functional device object link
144 // The name is generated based on the driver's class GUID
145 UNICODE_STRING InterfaceName;
146
147 // Bus drivers set the appropriate values in this structure in response
148 // to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
149 // alter the capabilities set by the bus driver.
150 DEVICE_CAPABILITIES DeviceCapabilities;
151
152 // Configuration Descriptor
153 PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
154
155 // Interface Information structure
156 PUSBD_INTERFACE_INFORMATION UsbInterface;
157
158 // Pipe context for the driver
159 PFREEBT_PIPE_CONTEXT PipeContext;
160
161 // current state of device
162 DEVSTATE DeviceState;
163
164 // state prior to removal query
165 DEVSTATE PrevDevState;
166
167 // obtain and hold this lock while changing the device state,
168 // the queue state and while processing the queue.
169 KSPIN_LOCK DevStateLock;
170
171 // current system power state
172 SYSTEM_POWER_STATE SysPower;
173
174 // current device power state
175 DEVICE_POWER_STATE DevPower;
176
177 // Pending I/O queue state
178 QUEUE_STATE QueueState;
179
180 // Pending I/O queue
181 LIST_ENTRY NewRequestsQueue;
182
183 // I/O Queue Lock
184 KSPIN_LOCK QueueLock;
185
186 KEVENT RemoveEvent;
187
188 KEVENT StopEvent;
189
190 ULONG OutStandingIO;
191
192 KSPIN_LOCK IOCountLock;
193
194 // Selective Suspend variables
195 LONG SSEnable;
196 LONG SSRegistryEnable;
197 PUSB_IDLE_CALLBACK_INFO IdleCallbackInfo;
198 PIRP PendingIdleIrp;
199 LONG IdleReqPend;
200 LONG FreeIdleIrpCount;
201 KSPIN_LOCK IdleReqStateLock;
202 KEVENT NoIdleReqPendEvent;
203
204 // Default power state to power down to on self-susped
205 ULONG PowerDownLevel;
206
207 // remote wakeup variables
208 PIRP WaitWakeIrp;
209 LONG FlagWWCancel;
210 LONG FlagWWOutstanding;
211 LONG WaitWakeEnable;
212
213 // Open handle count
214 LONG OpenHandleCount;
215
216 // Selective suspend model uses timers, dpcs and work item.
217 KTIMER Timer;
218
219 KDPC DeferredProcCall;
220
221 // This event is cleared when a DPC/Work Item is queued.
222 // and signaled when the work-item completes.
223 // This is essential to prevent the driver from unloading
224 // while we have DPC or work-item queued up.
225 KEVENT NoDpcWorkItemPendingEvent;
226
227 // WMI information
228 WMILIB_CONTEXT WmiLibInfo;
229
230 // WDM version
231 WDM_VERSION WdmVersion;
232
233 // Pipe type
234 FREEBT_PIPETYPE PipeType;
235
236 // User accessible object name
237 WCHAR wszDosDeviceName[50];
238
239 // A never triggered event used for delaying execution
240 KEVENT DelayEvent;
241
242 // Significant pipes
243 USBD_PIPE_INFORMATION EventPipe;
244 USBD_PIPE_INFORMATION DataInPipe;
245 USBD_PIPE_INFORMATION DataOutPipe;
246 USBD_PIPE_INFORMATION AudioInPipe;
247 USBD_PIPE_INFORMATION AudioOutPipe;
248
249 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
250
251
252 typedef struct _IRP_COMPLETION_CONTEXT
253 {
254 PDEVICE_EXTENSION DeviceExtension;
255 PKEVENT Event;
256
257 } IRP_COMPLETION_CONTEXT, *PIRP_COMPLETION_CONTEXT;
258
259 extern GLOBALS Globals;
260 extern ULONG DebugLevel;
261
262 #endif