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.
26 * USB Camera driver interface.
31 #pragma GCC system_header
33 #if !defined(__USB_H) && !defined(__USBDI_H)
34 #error include usb.h or usbdi.h before usbcamdi.h
45 #if defined(_BATTERYCLASS_)
46 #define USBCAMAPI DECLSPEC_EXPORT
48 #define USBCAMAPI DECLSPEC_IMPORT
52 /* FIXME: Unknown definition */
53 typedef PVOID PHW_STREAM_REQUEST_BLOCK;
55 DEFINE_GUID(GUID_USBCAMD_INTERFACE,
56 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
58 #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002
59 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004
60 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008
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
67 #define USBCAMD_VIDEO_STREAM 0x1
68 #define USBCAMD_STILL_STREAM 0x2
69 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
71 #define USBCAMD_STOP_STREAM 0x00000001
72 #define USBCAMD_START_STREAM 0x00000000
74 typedef struct _pipe_config_descriptor {
75 CHAR StreamAssociation;
76 UCHAR PipeConfigFlags;
77 } USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
80 USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
81 USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
82 USBCAMD_CamControlFlag_AssociatedFormat = 4,
83 USBCAMD_CamControlFlag_EnableDeviceEvents = 8
84 } USBCAMD_CamControlFlags;
86 typedef NTSTATUS DDKAPI
87 (*PCAM_ALLOCATE_BW_ROUTINE)(
88 PDEVICE_OBJECT BusDeviceObject,
90 PULONG RawFrameLength,
93 typedef NTSTATUS DDKAPI
94 (*PCAM_ALLOCATE_BW_ROUTINE_EX)(
95 PDEVICE_OBJECT BusDeviceObject,
97 PULONG RawFrameLength,
101 typedef NTSTATUS DDKAPI
102 (*PCAM_CONFIGURE_ROUTINE)(
103 PDEVICE_OBJECT BusDeviceObject,
105 PUSBD_INTERFACE_INFORMATION Interface,
106 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
108 PLONG SyncPipeIndex);
110 typedef NTSTATUS DDKAPI
111 (*PCAM_CONFIGURE_ROUTINE_EX)(
112 PDEVICE_OBJECT BusDeviceObject,
114 PUSBD_INTERFACE_INFORMATION Interface,
115 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
116 ULONG PipeConfigListSize,
117 PUSBCAMD_Pipe_Config_Descriptor PipeConfig,
118 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
120 typedef NTSTATUS DDKAPI
121 (*PCAM_FREE_BW_ROUTINE)(
122 PDEVICE_OBJECT BusDeviceObject,
123 PVOID DeviceContext);
125 typedef NTSTATUS DDKAPI
126 (*PCAM_FREE_BW_ROUTINE_EX)(
127 PDEVICE_OBJECT BusDeviceObject,
131 typedef NTSTATUS DDKAPI
132 (*PCAM_INITIALIZE_ROUTINE)(
133 PDEVICE_OBJECT BusDeviceObject,
134 PVOID DeviceContext);
137 (*PCAM_NEW_FRAME_ROUTINE)(
142 (*PCAM_NEW_FRAME_ROUTINE_EX)(
148 typedef NTSTATUS DDKAPI
149 (*PCAM_PROCESS_RAW_FRAME_ROUTINE)(
150 PDEVICE_OBJECT BusDeviceObject,
155 PVOID RawFrameBuffer,
156 ULONG RawFrameLength,
157 ULONG NumberOfPackets,
158 PULONG BytesReturned);
160 typedef NTSTATUS DDKAPI
161 (*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
162 PDEVICE_OBJECT BusDeviceObject,
167 PVOID RawFrameBuffer,
168 ULONG RawFrameLength,
169 ULONG NumberOfPackets,
170 PULONG BytesReturned,
171 ULONG ActualRawFrameLength,
175 (*PCAM_PROCESS_PACKET_ROUTINE)(
176 PDEVICE_OBJECT BusDeviceObject,
178 PVOID CurrentFrameContext,
179 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
181 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
183 PBOOLEAN FrameComplete,
184 PBOOLEAN NextFrameIsStill);
187 (*PCAM_PROCESS_PACKET_ROUTINE_EX)(
188 PDEVICE_OBJECT BusDeviceObject,
190 PVOID CurrentFrameContext,
191 PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
193 PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
195 PBOOLEAN FrameComplete,
197 PULONG ValidDataOffset);
199 typedef NTSTATUS DDKAPI
200 (*PCAM_STATE_ROUTINE)(
201 PDEVICE_OBJECT BusDeviceObject,
202 PVOID DeviceContext);
204 typedef NTSTATUS DDKAPI
205 (*PCAM_START_CAPTURE_ROUTINE)(
206 PDEVICE_OBJECT BusDeviceObject,
207 PVOID DeviceContext);
209 typedef NTSTATUS DDKAPI
210 (*PCAM_START_CAPTURE_ROUTINE_EX)(
211 PDEVICE_OBJECT BusDeviceObject,
215 typedef NTSTATUS DDKAPI
216 (*PCAM_STOP_CAPTURE_ROUTINE)(
217 PDEVICE_OBJECT BusDeviceObject,
218 PVOID DeviceContext);
220 typedef NTSTATUS DDKAPI
221 (*PCAM_STOP_CAPTURE_ROUTINE_EX)(
222 PDEVICE_OBJECT BusDeviceObject,
226 typedef struct _USBCAMD_DEVICE_DATA {
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;
242 typedef struct _USBCAMD_DEVICE_DATA2 {
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;
261 USBCAMD_InitializeNewInterface(
262 /*IN*/ PVOID DeviceContext,
263 /*IN*/ PVOID DeviceData,
264 /*IN*/ ULONG Version,
265 /*IN*/ ULONG CamControlFlag);
268 (*PCOMMAND_COMPLETE_FUNCTION)(
270 PVOID CommandContext,
273 typedef NTSTATUS DDKAPI
274 (*PFNUSBCAMD_BulkReadWrite)(
275 /*IN*/ PVOID DeviceContext,
276 /*IN*/ USHORT PipeIndex,
278 /*IN*/ ULONG BufferLength,
279 /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete,
280 /*IN*/ PVOID CommandContext);
282 typedef NTSTATUS DDKAPI
283 (*PFNUSBCAMD_SetIsoPipeState)(
284 /*IN*/ PVOID DeviceContext,
285 /*IN*/ ULONG PipeStateFlags);
287 typedef NTSTATUS DDKAPI
288 (*PFNUSBCAMD_CancelBulkReadWrite)(
289 /*IN*/ PVOID DeviceContext,
290 /*IN*/ ULONG PipeIndex);
292 typedef NTSTATUS DDKAPI
293 (*PFNUSBCAMD_SetVideoFormat)(
294 /*IN*/ PVOID DeviceContext,
295 /*IN*/ PHW_STREAM_REQUEST_BLOCK pSrb);
297 typedef NTSTATUS DDKAPI
298 (*PFNUSBCAMD_WaitOnDeviceEvent)(
299 /*IN*/ PVOID DeviceContext,
300 /*IN*/ ULONG PipeIndex,
302 /*IN*/ ULONG BufferLength,
303 /*IN*/ PCOMMAND_COMPLETE_FUNCTION EventComplete,
304 /*IN*/ PVOID EventContext,
305 /*IN*/ BOOLEAN LoopBack);
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);
319 USBCAMD_ControlVendorCommand(
320 /*IN*/ PVOID DeviceContext,
321 /*IN*/ UCHAR Request,
325 /*IN OUT*/ PULONG BufferLength,
326 /*IN*/ BOOLEAN GetData,
327 /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete,
328 /*IN*/ PVOID CommandContext);
331 (*PADAPTER_RECEIVE_PACKET_ROUTINE)(
332 /*IN*/ PHW_STREAM_REQUEST_BLOCK Srb);
340 ULONG DeviceContextSize,
341 ULONG FrameContextSize,
342 PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket);
347 USBCAMD_GetRegistryKeyValue(
348 /*IN*/ HANDLE Handle,
349 /*IN*/ PWCHAR KeyNameString,
350 /*IN*/ ULONG KeyNameStringLength,
352 /*IN*/ ULONG DataLength);
357 USBCAMD_SelectAlternateInterface(
358 /*IN*/ PVOID DeviceContext,
359 /*IN OUT*/ PUSBD_INTERFACE_INFORMATION RequestInterface);
361 #define USBCAMD_VERSION_200 0x200
363 typedef struct _USBCAMD_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;
373 (*PSTREAM_RECEIVE_PACKET)(
375 /*IN*/ PVOID DeviceContext,
376 /*IN*/ PBOOLEAN Completed);
378 #if defined(DEBUG_LOG)
383 USBCAMD_Debug_LogEntry(
389 #define ILOGENTRY(sig, info1, info2, info3) \
390 USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
394 #define ILOGENTRY(sig, info1, info2, info3)
396 #endif /* DEBUG_LOG */
404 #endif /* !defined(__USB_H) && !defined(__USBDI_H) */
407 #endif /* __USBCAMDI_H */