OSDN Git Service

a854ab28d8b451009243c4abad0010e91e23dba1
[mingw/mingw-org-wsl.git] / include / ddk / usbcamdi.h
1 /**
2  * @file usbcamdi.h
3  * @copy 2012 MinGW.org project
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  * 
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  * 
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24
25 /*
26  * USB Camera driver interface.
27  */
28
29 #ifndef __USBCAMDI_H
30 #define __USBCAMDI_H
31 #pragma GCC system_header
32
33 #if !defined(__USB_H) && !defined(__USBDI_H)
34 #error include usb.h or usbdi.h before usbcamdi.h
35 #else
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 #pragma pack(push,4)
42
43 #include "ntddk.h"
44
45 #if defined(_BATTERYCLASS_)
46   #define USBCAMAPI DECLSPEC_EXPORT
47 #else
48   #define USBCAMAPI DECLSPEC_IMPORT
49 #endif
50
51
52 /* FIXME: Unknown definition */
53 typedef PVOID PHW_STREAM_REQUEST_BLOCK;
54
55 DEFINE_GUID(GUID_USBCAMD_INTERFACE,
56   0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
57
58 #define USBCAMD_PROCESSPACKETEX_DropFrame             0x0002 
59 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill      0x0004 
60 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill   0x0008 
61
62 #define USBCAMD_DATA_PIPE                 0x0001
63 #define USBCAMD_MULTIPLEX_PIPE            0x0002
64 #define USBCAMD_SYNC_PIPE                 0x0004
65 #define USBCAMD_DONT_CARE_PIPE            0x0008
66
67 #define USBCAMD_VIDEO_STREAM              0x1
68 #define USBCAMD_STILL_STREAM              0x2
69 #define USBCAMD_VIDEO_STILL_STREAM        (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
70
71 #define USBCAMD_STOP_STREAM               0x00000001
72 #define USBCAMD_START_STREAM              0x00000000
73
74 typedef struct _pipe_config_descriptor {
75   CHAR  StreamAssociation;
76   UCHAR  PipeConfigFlags;
77 } USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
78
79 typedef enum {
80         USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
81         USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
82         USBCAMD_CamControlFlag_AssociatedFormat = 4,
83         USBCAMD_CamControlFlag_EnableDeviceEvents = 8
84 } USBCAMD_CamControlFlags;
85
86 typedef NTSTATUS DDKAPI
87 (*PCAM_ALLOCATE_BW_ROUTINE)(
88   PDEVICE_OBJECT  BusDeviceObject,
89   PVOID  DeviceContext,
90   PULONG  RawFrameLength,
91   PVOID  Format);
92
93 typedef NTSTATUS DDKAPI
94 (*PCAM_ALLOCATE_BW_ROUTINE_EX)(
95   PDEVICE_OBJECT  BusDeviceObject,
96   PVOID  DeviceContext,
97   PULONG  RawFrameLength,
98   PVOID  Format,
99   ULONG  StreamNumber);
100
101 typedef NTSTATUS DDKAPI
102 (*PCAM_CONFIGURE_ROUTINE)(
103   PDEVICE_OBJECT  BusDeviceObject,
104   PVOID  DeviceContext,
105   PUSBD_INTERFACE_INFORMATION  Interface,
106   PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor,
107   PLONG  DataPipeIndex,
108   PLONG  SyncPipeIndex);
109
110 typedef NTSTATUS DDKAPI
111 (*PCAM_CONFIGURE_ROUTINE_EX)(
112   PDEVICE_OBJECT  BusDeviceObject,
113   PVOID  DeviceContext,
114   PUSBD_INTERFACE_INFORMATION  Interface,
115   PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor,
116   ULONG  PipeConfigListSize,
117   PUSBCAMD_Pipe_Config_Descriptor  PipeConfig,
118   PUSB_DEVICE_DESCRIPTOR  DeviceDescriptor);
119
120 typedef NTSTATUS DDKAPI
121 (*PCAM_FREE_BW_ROUTINE)(
122   PDEVICE_OBJECT  BusDeviceObject,
123   PVOID  DeviceContext);
124
125 typedef NTSTATUS DDKAPI
126 (*PCAM_FREE_BW_ROUTINE_EX)(
127   PDEVICE_OBJECT  BusDeviceObject,
128   PVOID  DeviceContext,
129   ULONG  StreamNumber);
130
131 typedef NTSTATUS DDKAPI
132 (*PCAM_INITIALIZE_ROUTINE)(
133   PDEVICE_OBJECT  BusDeviceObject,
134   PVOID  DeviceContext);
135
136 typedef VOID DDKAPI
137 (*PCAM_NEW_FRAME_ROUTINE)(
138   PVOID  DeviceContext,
139   PVOID  FrameContext); 
140
141 typedef VOID DDKAPI
142 (*PCAM_NEW_FRAME_ROUTINE_EX)(
143   PVOID  DeviceContext,
144   PVOID  FrameContext,
145   ULONG  StreamNumber,
146   PULONG  FrameLength);
147
148 typedef NTSTATUS DDKAPI
149 (*PCAM_PROCESS_RAW_FRAME_ROUTINE)(
150   PDEVICE_OBJECT  BusDeviceObject,
151   PVOID  DeviceContext,
152   PVOID  FrameContext,
153   PVOID  FrameBuffer,
154   ULONG  FrameLength,
155   PVOID  RawFrameBuffer,
156   ULONG  RawFrameLength,
157   ULONG  NumberOfPackets,
158   PULONG  BytesReturned);
159
160 typedef NTSTATUS DDKAPI
161 (*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
162   PDEVICE_OBJECT  BusDeviceObject,
163   PVOID  DeviceContext,
164   PVOID  FrameContext,
165   PVOID  FrameBuffer,
166   ULONG  FrameLength,
167   PVOID  RawFrameBuffer,
168   ULONG  RawFrameLength,
169   ULONG  NumberOfPackets,
170   PULONG  BytesReturned,
171   ULONG  ActualRawFrameLength,
172   ULONG  StreamNumber);
173
174 typedef ULONG DDKAPI
175 (*PCAM_PROCESS_PACKET_ROUTINE)(
176   PDEVICE_OBJECT  BusDeviceObject,
177   PVOID  DeviceContext,
178   PVOID  CurrentFrameContext,
179   PUSBD_ISO_PACKET_DESCRIPTOR  SyncPacket,
180   PVOID  SyncBuffer,
181   PUSBD_ISO_PACKET_DESCRIPTOR  DataPacket,
182   PVOID  DataBuffer,
183   PBOOLEAN  FrameComplete,
184   PBOOLEAN  NextFrameIsStill); 
185
186 typedef ULONG DDKAPI
187 (*PCAM_PROCESS_PACKET_ROUTINE_EX)(
188   PDEVICE_OBJECT  BusDeviceObject,
189   PVOID  DeviceContext,
190   PVOID  CurrentFrameContext,
191   PUSBD_ISO_PACKET_DESCRIPTOR  SyncPacket,
192   PVOID  SyncBuffer,
193   PUSBD_ISO_PACKET_DESCRIPTOR  DataPacket,
194   PVOID  DataBuffer,
195   PBOOLEAN  FrameComplete,
196   PULONG  PacketFlag,
197   PULONG  ValidDataOffset);
198
199 typedef NTSTATUS DDKAPI
200 (*PCAM_STATE_ROUTINE)(
201   PDEVICE_OBJECT  BusDeviceObject,
202   PVOID  DeviceContext);
203
204 typedef NTSTATUS DDKAPI
205 (*PCAM_START_CAPTURE_ROUTINE)(
206   PDEVICE_OBJECT  BusDeviceObject,
207   PVOID  DeviceContext);
208
209 typedef NTSTATUS DDKAPI
210 (*PCAM_START_CAPTURE_ROUTINE_EX)(
211   PDEVICE_OBJECT  BusDeviceObject,
212   PVOID  DeviceContext,
213   ULONG  StreamNumber);
214
215 typedef NTSTATUS DDKAPI
216 (*PCAM_STOP_CAPTURE_ROUTINE)(
217   PDEVICE_OBJECT  BusDeviceObject,
218   PVOID  DeviceContext);
219
220 typedef NTSTATUS DDKAPI
221 (*PCAM_STOP_CAPTURE_ROUTINE_EX)(
222   PDEVICE_OBJECT  BusDeviceObject,
223   PVOID  DeviceContext,
224   ULONG  StreamNumber);
225
226 typedef struct _USBCAMD_DEVICE_DATA {
227         ULONG  Sig;
228         PCAM_INITIALIZE_ROUTINE  CamInitialize;
229         PCAM_INITIALIZE_ROUTINE  CamUnInitialize;
230         PCAM_PROCESS_PACKET_ROUTINE  CamProcessUSBPacket;
231         PCAM_NEW_FRAME_ROUTINE  CamNewVideoFrame;
232         PCAM_PROCESS_RAW_FRAME_ROUTINE  CamProcessRawVideoFrame;
233         PCAM_START_CAPTURE_ROUTINE  CamStartCapture;
234         PCAM_STOP_CAPTURE_ROUTINE  CamStopCapture;
235         PCAM_CONFIGURE_ROUTINE  CamConfigure;
236         PCAM_STATE_ROUTINE  CamSaveState;
237         PCAM_STATE_ROUTINE  CamRestoreState;
238         PCAM_ALLOCATE_BW_ROUTINE  CamAllocateBandwidth;
239         PCAM_FREE_BW_ROUTINE  CamFreeBandwidth;
240 } USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA;
241
242 typedef struct _USBCAMD_DEVICE_DATA2 {
243         ULONG  Sig;
244         PCAM_INITIALIZE_ROUTINE  CamInitialize;
245         PCAM_INITIALIZE_ROUTINE  CamUnInitialize;
246         PCAM_PROCESS_PACKET_ROUTINE_EX  CamProcessUSBPacketEx;
247         PCAM_NEW_FRAME_ROUTINE_EX  CamNewVideoFrameEx;
248         PCAM_PROCESS_RAW_FRAME_ROUTINE_EX  CamProcessRawVideoFrameEx;
249         PCAM_START_CAPTURE_ROUTINE_EX  CamStartCaptureEx;
250         PCAM_STOP_CAPTURE_ROUTINE_EX  CamStopCaptureEx;
251         PCAM_CONFIGURE_ROUTINE_EX  CamConfigureEx;
252         PCAM_STATE_ROUTINE  CamSaveState;
253         PCAM_STATE_ROUTINE  CamRestoreState;
254         PCAM_ALLOCATE_BW_ROUTINE_EX  CamAllocateBandwidthEx;
255         PCAM_FREE_BW_ROUTINE_EX  CamFreeBandwidthEx;
256 } USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2;
257
258 USBCAMAPI
259 ULONG
260 DDKAPI
261 USBCAMD_InitializeNewInterface(
262   /*IN*/ PVOID  DeviceContext,
263   /*IN*/ PVOID  DeviceData,
264   /*IN*/ ULONG  Version,
265   /*IN*/ ULONG  CamControlFlag);
266
267 typedef VOID DDKAPI
268 (*PCOMMAND_COMPLETE_FUNCTION)(
269   PVOID  DeviceContext,
270   PVOID  CommandContext,
271   NTSTATUS  NtStatus);
272
273 typedef NTSTATUS DDKAPI
274 (*PFNUSBCAMD_BulkReadWrite)(
275   /*IN*/ PVOID  DeviceContext,
276   /*IN*/ USHORT  PipeIndex,
277   /*IN*/ PVOID  Buffer,
278   /*IN*/ ULONG  BufferLength,
279   /*IN*/ PCOMMAND_COMPLETE_FUNCTION  CommandComplete,
280   /*IN*/ PVOID  CommandContext);
281
282 typedef NTSTATUS DDKAPI
283 (*PFNUSBCAMD_SetIsoPipeState)(
284   /*IN*/ PVOID  DeviceContext,
285   /*IN*/ ULONG  PipeStateFlags);
286
287 typedef NTSTATUS DDKAPI
288 (*PFNUSBCAMD_CancelBulkReadWrite)(
289   /*IN*/ PVOID  DeviceContext,
290   /*IN*/ ULONG  PipeIndex);
291
292 typedef NTSTATUS DDKAPI
293 (*PFNUSBCAMD_SetVideoFormat)( 
294   /*IN*/ PVOID  DeviceContext,
295   /*IN*/ PHW_STREAM_REQUEST_BLOCK  pSrb);
296
297 typedef NTSTATUS DDKAPI
298 (*PFNUSBCAMD_WaitOnDeviceEvent)(
299   /*IN*/ PVOID  DeviceContext,
300   /*IN*/ ULONG  PipeIndex,
301   /*IN*/ PVOID  Buffer,
302   /*IN*/ ULONG  BufferLength,
303   /*IN*/ PCOMMAND_COMPLETE_FUNCTION  EventComplete,
304   /*IN*/ PVOID  EventContext,
305   /*IN*/ BOOLEAN  LoopBack);
306
307 USBCAMAPI
308 PVOID
309 DDKAPI
310 USBCAMD_AdapterReceivePacket(
311   /*IN*/ PHW_STREAM_REQUEST_BLOCK  Srb,
312   /*IN*/ PUSBCAMD_DEVICE_DATA  DeviceData,
313   /*IN*/ PDEVICE_OBJECT  *DeviceObject,
314   /*IN*/ BOOLEAN  NeedsCompletion);
315
316 USBCAMAPI
317 NTSTATUS
318 DDKAPI
319 USBCAMD_ControlVendorCommand(
320   /*IN*/ PVOID  DeviceContext,
321   /*IN*/ UCHAR  Request,
322   /*IN*/ USHORT  Value,
323   /*IN*/ USHORT  Index,
324   /*IN*/ PVOID  Buffer,
325   /*IN OUT*/ PULONG  BufferLength,
326   /*IN*/ BOOLEAN  GetData,
327   /*IN*/ PCOMMAND_COMPLETE_FUNCTION  CommandComplete,
328   /*IN*/ PVOID  CommandContext);
329
330 typedef VOID DDKAPI
331 (*PADAPTER_RECEIVE_PACKET_ROUTINE)(
332   /*IN*/ PHW_STREAM_REQUEST_BLOCK  Srb);
333
334 USBCAMAPI
335 ULONG
336 DDKAPI
337 USBCAMD_DriverEntry(
338   PVOID  Context1,
339   PVOID  Context2,
340   ULONG  DeviceContextSize,
341   ULONG  FrameContextSize,
342   PADAPTER_RECEIVE_PACKET_ROUTINE  ReceivePacket);
343
344 USBCAMAPI
345 NTSTATUS
346 DDKAPI
347 USBCAMD_GetRegistryKeyValue(
348   /*IN*/ HANDLE  Handle,
349   /*IN*/ PWCHAR  KeyNameString,
350   /*IN*/ ULONG  KeyNameStringLength,
351   /*IN*/ PVOID  Data,
352   /*IN*/ ULONG  DataLength);
353
354 USBCAMAPI
355 NTSTATUS
356 DDKAPI
357 USBCAMD_SelectAlternateInterface(
358   /*IN*/ PVOID  DeviceContext,
359   /*IN OUT*/ PUSBD_INTERFACE_INFORMATION  RequestInterface);
360
361 #define USBCAMD_VERSION_200               0x200
362
363 typedef struct _USBCAMD_INTERFACE {
364   INTERFACE  Interface;
365   PFNUSBCAMD_WaitOnDeviceEvent  USBCAMD_WaitOnDeviceEvent;
366   PFNUSBCAMD_BulkReadWrite  USBCAMD_BulkReadWrite;
367   PFNUSBCAMD_SetVideoFormat  USBCAMD_SetVideoFormat;
368   PFNUSBCAMD_SetIsoPipeState  USBCAMD_SetIsoPipeState;
369   PFNUSBCAMD_CancelBulkReadWrite  USBCAMD_CancelBulkReadWrite;
370 } USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE;
371
372 typedef VOID DDKAPI
373 (*PSTREAM_RECEIVE_PACKET)(
374   /*IN*/ PVOID  Srb,
375   /*IN*/ PVOID  DeviceContext,
376   /*IN*/ PBOOLEAN  Completed);
377
378 #if defined(DEBUG_LOG)
379
380 USBCAMAPI
381 VOID
382 DDKAPI
383 USBCAMD_Debug_LogEntry(
384   /*IN*/ CHAR  *Name,
385   /*IN*/ ULONG  Info1,
386   /*IN*/ ULONG  Info2,
387   /*IN*/ ULONG  Info3);
388
389 #define ILOGENTRY(sig, info1, info2, info3) \
390   USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
391
392 #else
393
394 #define ILOGENTRY(sig, info1, info2, info3)
395
396 #endif /* DEBUG_LOG */
397
398 #pragma pack(pop)
399
400 #ifdef __cplusplus
401 }
402 #endif
403
404 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */
405
406
407 #endif /* __USBCAMDI_H */