3 * @copy 2012 MinGW.org project
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:
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
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.
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
27 #pragma GCC system_header
31 * USB Camera driver interface.
34 #if !defined(__USB_H) && !defined(__USBDI_H)
35 #error include usb.h or usbdi.h before usbcamdi.h
46 #if defined(_BATTERYCLASS_)
47 #define USBCAMAPI DECLSPEC_EXPORT
49 #define USBCAMAPI DECLSPEC_IMPORT
53 /* FIXME: Unknown definition */
54 typedef PVOID PHW_STREAM_REQUEST_BLOCK;
56 DEFINE_GUID(GUID_USBCAMD_INTERFACE,
57 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
59 #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002
60 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004
61 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008
63 #define USBCAMD_DATA_PIPE 0x0001
64 #define USBCAMD_MULTIPLEX_PIPE 0x0002
65 #define USBCAMD_SYNC_PIPE 0x0004
66 #define USBCAMD_DONT_CARE_PIPE 0x0008
68 #define USBCAMD_VIDEO_STREAM 0x1
69 #define USBCAMD_STILL_STREAM 0x2
70 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
72 #define USBCAMD_STOP_STREAM 0x00000001
73 #define USBCAMD_START_STREAM 0x00000000
75 typedef struct _pipe_config_descriptor {
76 CHAR StreamAssociation;
77 UCHAR PipeConfigFlags;
78 } USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
81 USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
82 USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
83 USBCAMD_CamControlFlag_AssociatedFormat = 4,
84 USBCAMD_CamControlFlag_EnableDeviceEvents = 8
85 } USBCAMD_CamControlFlags;
87 typedef NTSTATUS DDKAPI
88 (*PCAM_ALLOCATE_BW_ROUTINE)(
89 PDEVICE_OBJECT BusDeviceObject,
91 PULONG RawFrameLength,
94 typedef NTSTATUS DDKAPI
95 (*PCAM_ALLOCATE_BW_ROUTINE_EX)(
96 PDEVICE_OBJECT BusDeviceObject,
98 PULONG RawFrameLength,
102 typedef NTSTATUS DDKAPI
103 (*PCAM_CONFIGURE_ROUTINE)(
104 PDEVICE_OBJECT BusDeviceObject,
106 PUSBD_INTERFACE_INFORMATION Interface,
107 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
109 PLONG SyncPipeIndex);
111 typedef NTSTATUS DDKAPI
112 (*PCAM_CONFIGURE_ROUTINE_EX)(
113 PDEVICE_OBJECT BusDeviceObject,
115 PUSBD_INTERFACE_INFORMATION Interface,
116 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
117 ULONG PipeConfigListSize,
118 PUSBCAMD_Pipe_Config_Descriptor PipeConfig,
119 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
121 typedef NTSTATUS DDKAPI
122 (*PCAM_FREE_BW_ROUTINE)(
123 PDEVICE_OBJECT BusDeviceObject,
124 PVOID DeviceContext);
126 typedef NTSTATUS DDKAPI
127 (*PCAM_FREE_BW_ROUTINE_EX)(
128 PDEVICE_OBJECT BusDeviceObject,
132 typedef NTSTATUS DDKAPI
133 (*PCAM_INITIALIZE_ROUTINE)(
134 PDEVICE_OBJECT BusDeviceObject,
135 PVOID DeviceContext);
138 (*PCAM_NEW_FRAME_ROUTINE)(
143 (*PCAM_NEW_FRAME_ROUTINE_EX)(
149 typedef NTSTATUS DDKAPI
150 (*PCAM_PROCESS_RAW_FRAME_ROUTINE)(
151 PDEVICE_OBJECT BusDeviceObject,
156 PVOID RawFrameBuffer,
157 ULONG RawFrameLength,
158 ULONG NumberOfPackets,
159 PULONG BytesReturned);
161 typedef NTSTATUS DDKAPI
162 (*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
163 PDEVICE_OBJECT BusDeviceObject,
168 PVOID RawFrameBuffer,
169 ULONG RawFrameLength,
170 ULONG NumberOfPackets,
171 PULONG BytesReturned,
172 ULONG ActualRawFrameLength,
176 (*PCAM_PROCESS_PACKET_ROUTINE)(
177 PDEVICE_OBJECT BusDeviceObject,
179 PVOID CurrentFrameContext,
180 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
182 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
184 PBOOLEAN FrameComplete,
185 PBOOLEAN NextFrameIsStill);
188 (*PCAM_PROCESS_PACKET_ROUTINE_EX)(
189 PDEVICE_OBJECT BusDeviceObject,
191 PVOID CurrentFrameContext,
192 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
194 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
196 PBOOLEAN FrameComplete,
198 PULONG ValidDataOffset);
200 typedef NTSTATUS DDKAPI
201 (*PCAM_STATE_ROUTINE)(
202 PDEVICE_OBJECT BusDeviceObject,
203 PVOID DeviceContext);
205 typedef NTSTATUS DDKAPI
206 (*PCAM_START_CAPTURE_ROUTINE)(
207 PDEVICE_OBJECT BusDeviceObject,
208 PVOID DeviceContext);
210 typedef NTSTATUS DDKAPI
211 (*PCAM_START_CAPTURE_ROUTINE_EX)(
212 PDEVICE_OBJECT BusDeviceObject,
216 typedef NTSTATUS DDKAPI
217 (*PCAM_STOP_CAPTURE_ROUTINE)(
218 PDEVICE_OBJECT BusDeviceObject,
219 PVOID DeviceContext);
221 typedef NTSTATUS DDKAPI
222 (*PCAM_STOP_CAPTURE_ROUTINE_EX)(
223 PDEVICE_OBJECT BusDeviceObject,
227 typedef struct _USBCAMD_DEVICE_DATA {
229 PCAM_INITIALIZE_ROUTINE CamInitialize;
230 PCAM_INITIALIZE_ROUTINE CamUnInitialize;
231 PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket;
232 PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame;
233 PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame;
234 PCAM_START_CAPTURE_ROUTINE CamStartCapture;
235 PCAM_STOP_CAPTURE_ROUTINE CamStopCapture;
236 PCAM_CONFIGURE_ROUTINE CamConfigure;
237 PCAM_STATE_ROUTINE CamSaveState;
238 PCAM_STATE_ROUTINE CamRestoreState;
239 PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth;
240 PCAM_FREE_BW_ROUTINE CamFreeBandwidth;
241 } USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA;
243 typedef struct _USBCAMD_DEVICE_DATA2 {
245 PCAM_INITIALIZE_ROUTINE CamInitialize;
246 PCAM_INITIALIZE_ROUTINE CamUnInitialize;
247 PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx;
248 PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx;
249 PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx;
250 PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx;
251 PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx;
252 PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx;
253 PCAM_STATE_ROUTINE CamSaveState;
254 PCAM_STATE_ROUTINE CamRestoreState;
255 PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx;
256 PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx;
257 } USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2;
262 USBCAMD_InitializeNewInterface(
263 /*IN*/ PVOID DeviceContext,
264 /*IN*/ PVOID DeviceData,
265 /*IN*/ ULONG Version,
266 /*IN*/ ULONG CamControlFlag);
269 (*PCOMMAND_COMPLETE_FUNCTION)(
271 PVOID CommandContext,
274 typedef NTSTATUS DDKAPI
275 (*PFNUSBCAMD_BulkReadWrite)(
276 /*IN*/ PVOID DeviceContext,
277 /*IN*/ USHORT PipeIndex,
279 /*IN*/ ULONG BufferLength,
280 /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete,
281 /*IN*/ PVOID CommandContext);
283 typedef NTSTATUS DDKAPI
284 (*PFNUSBCAMD_SetIsoPipeState)(
285 /*IN*/ PVOID DeviceContext,
286 /*IN*/ ULONG PipeStateFlags);
288 typedef NTSTATUS DDKAPI
289 (*PFNUSBCAMD_CancelBulkReadWrite)(
290 /*IN*/ PVOID DeviceContext,
291 /*IN*/ ULONG PipeIndex);
293 typedef NTSTATUS DDKAPI
294 (*PFNUSBCAMD_SetVideoFormat)(
295 /*IN*/ PVOID DeviceContext,
296 /*IN*/ PHW_STREAM_REQUEST_BLOCK pSrb);
298 typedef NTSTATUS DDKAPI
299 (*PFNUSBCAMD_WaitOnDeviceEvent)(
300 /*IN*/ PVOID DeviceContext,
301 /*IN*/ ULONG PipeIndex,
303 /*IN*/ ULONG BufferLength,
304 /*IN*/ PCOMMAND_COMPLETE_FUNCTION EventComplete,
305 /*IN*/ PVOID EventContext,
306 /*IN*/ BOOLEAN LoopBack);
311 USBCAMD_AdapterReceivePacket(
312 /*IN*/ PHW_STREAM_REQUEST_BLOCK Srb,
313 /*IN*/ PUSBCAMD_DEVICE_DATA DeviceData,
314 /*IN*/ PDEVICE_OBJECT *DeviceObject,
315 /*IN*/ BOOLEAN NeedsCompletion);
320 USBCAMD_ControlVendorCommand(
321 /*IN*/ PVOID DeviceContext,
322 /*IN*/ UCHAR Request,
326 /*IN OUT*/ PULONG BufferLength,
327 /*IN*/ BOOLEAN GetData,
328 /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete,
329 /*IN*/ PVOID CommandContext);
332 (*PADAPTER_RECEIVE_PACKET_ROUTINE)(
333 /*IN*/ PHW_STREAM_REQUEST_BLOCK Srb);
341 ULONG DeviceContextSize,
342 ULONG FrameContextSize,
343 PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket);
348 USBCAMD_GetRegistryKeyValue(
349 /*IN*/ HANDLE Handle,
350 /*IN*/ PWCHAR KeyNameString,
351 /*IN*/ ULONG KeyNameStringLength,
353 /*IN*/ ULONG DataLength);
358 USBCAMD_SelectAlternateInterface(
359 /*IN*/ PVOID DeviceContext,
360 /*IN OUT*/ PUSBD_INTERFACE_INFORMATION RequestInterface);
362 #define USBCAMD_VERSION_200 0x200
364 typedef struct _USBCAMD_INTERFACE {
366 PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent;
367 PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite;
368 PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat;
369 PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState;
370 PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite;
371 } USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE;
374 (*PSTREAM_RECEIVE_PACKET)(
376 /*IN*/ PVOID DeviceContext,
377 /*IN*/ PBOOLEAN Completed);
379 #if defined(DEBUG_LOG)
384 USBCAMD_Debug_LogEntry(
390 #define ILOGENTRY(sig, info1, info2, info3) \
391 USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
395 #define ILOGENTRY(sig, info1, info2, info3)
397 #endif /* DEBUG_LOG */
405 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */
408 #endif /* __USBCAMDI_H */