master
  1/*
  2 * usbcamdi.h
  3 *
  4 * USB Camera driver interface.
  5 *
  6 * This file is part of the ReactOS PSDK package.
  7 *
  8 * Contributors:
  9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
 10 *
 11 * THIS SOFTWARE IS NOT COPYRIGHTED
 12 *
 13 * This source code is offered for use in the public domain. You may
 14 * use, modify or distribute it freely.
 15 *
 16 * This code is distributed in the hope that it will be useful but
 17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 18 * DISCLAIMED. This includes but is not limited to warranties of
 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 20 *
 21 */
 22
 23#if !defined(__USB_H) && !defined(__USBDI_H)
 24
 25#ifdef __cplusplus
 26extern "C" {
 27#endif
 28
 29#if defined(_BATTERYCLASS_)
 30# define USBCAMAPI
 31#else
 32# define USBCAMAPI DECLSPEC_IMPORT
 33#endif
 34
 35typedef struct _pipe_config_descriptor {
 36  CHAR StreamAssociation;
 37  UCHAR PipeConfigFlags;
 38} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
 39
 40#define USBCAMD_DATA_PIPE                 0x0001
 41#define USBCAMD_MULTIPLEX_PIPE            0x0002
 42#define USBCAMD_SYNC_PIPE                 0x0004
 43#define USBCAMD_DONT_CARE_PIPE            0x0008
 44
 45#define USBCAMD_VIDEO_STREAM              0x1
 46#define USBCAMD_STILL_STREAM              0x2
 47#define USBCAMD_VIDEO_STILL_STREAM        (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
 48
 49#define USBCAMD_PROCESSPACKETEX_DropFrame             0x0002
 50#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill      0x0004
 51#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill   0x0008
 52
 53#define USBCAMD_STOP_STREAM               0x00000001
 54#define USBCAMD_START_STREAM              0x00000000
 55
 56typedef enum {
 57  USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
 58  USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
 59  USBCAMD_CamControlFlag_AssociatedFormat = 4,
 60  USBCAMD_CamControlFlag_EnableDeviceEvents = 8
 61} USBCAMD_CamControlFlags;
 62
 63typedef NTSTATUS
 64(NTAPI *PCOMMAND_COMPLETE_FUNCTION)(
 65  PVOID DeviceContext,
 66  PVOID CommandContext,
 67  NTSTATUS NtStatus);
 68
 69typedef VOID
 70(NTAPI *PSTREAM_RECEIVE_PACKET)(
 71  PVOID Srb,
 72  PVOID DeviceContext,
 73  PBOOLEAN Completed);
 74
 75typedef NTSTATUS
 76(NTAPI *PCAM_INITIALIZE_ROUTINE)(
 77  PDEVICE_OBJECT BusDeviceObject,
 78  PVOID DeviceContext);
 79
 80typedef NTSTATUS
 81(NTAPI *PCAM_CONFIGURE_ROUTINE)(
 82  PDEVICE_OBJECT BusDeviceObject,
 83  PVOID DeviceContext,
 84  PUSBD_INTERFACE_INFORMATION Interface,
 85  PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
 86  PLONG DataPipeIndex,
 87  PLONG SyncPipeIndex);
 88
 89typedef NTSTATUS
 90(NTAPI *PCAM_CONFIGURE_ROUTINE_EX)(
 91  PDEVICE_OBJECT BusDeviceObject,
 92  PVOID DeviceContext,
 93  PUSBD_INTERFACE_INFORMATION Interface,
 94  PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
 95  ULONG PipeConfigListSize,
 96  PUSBCAMD_Pipe_Config_Descriptor PipeConfig,
 97  PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
 98
 99typedef NTSTATUS
100(NTAPI *PCAM_START_CAPTURE_ROUTINE)(
101  PDEVICE_OBJECT BusDeviceObject,
102  PVOID DeviceContext);
103
104typedef NTSTATUS
105(NTAPI *PCAM_START_CAPTURE_ROUTINE_EX)(
106  PDEVICE_OBJECT BusDeviceObject,
107  PVOID DeviceContext,
108  ULONG StreamNumber);
109
110typedef NTSTATUS
111(NTAPI *PCAM_ALLOCATE_BW_ROUTINE)(
112  PDEVICE_OBJECT BusDeviceObject,
113  PVOID DeviceContext,
114  PULONG RawFrameLength,
115  PVOID Format);
116
117typedef NTSTATUS
118(NTAPI *PCAM_ALLOCATE_BW_ROUTINE_EX)(
119  PDEVICE_OBJECT BusDeviceObject,
120  PVOID DeviceContext,
121  PULONG RawFrameLength,
122  PVOID Format,
123  ULONG StreamNumber);
124
125typedef NTSTATUS
126(NTAPI *PCAM_FREE_BW_ROUTINE)(
127  PDEVICE_OBJECT BusDeviceObject,
128  PVOID DeviceContext);
129
130typedef NTSTATUS
131(NTAPI *PCAM_FREE_BW_ROUTINE_EX)(
132  PDEVICE_OBJECT BusDeviceObject,
133  PVOID DeviceContext,
134  ULONG StreamNumber);
135
136typedef VOID
137(NTAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)(
138  PHW_STREAM_REQUEST_BLOCK Srb);
139
140typedef NTSTATUS
141(NTAPI *PCAM_STOP_CAPTURE_ROUTINE)(
142  PDEVICE_OBJECT BusDeviceObject,
143  PVOID DeviceContext);
144
145typedef NTSTATUS
146(NTAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)(
147  PDEVICE_OBJECT BusDeviceObject,
148  PVOID DeviceContext,
149  ULONG StreamNumber);
150
151typedef ULONG
152(NTAPI *PCAM_PROCESS_PACKET_ROUTINE)(
153  PDEVICE_OBJECT BusDeviceObject,
154  PVOID DeviceContext,
155  PVOID CurrentFrameContext,
156  PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
157  PVOID SyncBuffer,
158  PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
159  PVOID DataBuffer,
160  PBOOLEAN FrameComplete,
161  PBOOLEAN NextFrameIsStill);
162
163typedef ULONG
164(NTAPI *PCAM_PROCESS_PACKET_ROUTINE_EX)(
165  PDEVICE_OBJECT BusDeviceObject,
166  PVOID DeviceContext,
167  PVOID CurrentFrameContext,
168  PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket,
169  PVOID SyncBuffer,
170  PUSBD_ISO_PACKET_DESCRIPTOR DataPacket,
171  PVOID DataBuffer,
172  PBOOLEAN FrameComplete,
173  PULONG PacketFlag,
174  PULONG ValidDataOffset);
175
176typedef VOID
177(NTAPI *PCAM_NEW_FRAME_ROUTINE)(
178  PVOID DeviceContext,
179  PVOID FrameContext);
180
181typedef VOID
182(NTAPI *PCAM_NEW_FRAME_ROUTINE_EX)(
183  PVOID DeviceContext,
184  PVOID FrameContext,
185  ULONG StreamNumber,
186  PULONG FrameLength);
187
188typedef NTSTATUS
189(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE)(
190  PDEVICE_OBJECT BusDeviceObject,
191  PVOID DeviceContext,
192  PVOID FrameContext,
193  PVOID FrameBuffer,
194  ULONG FrameLength,
195  PVOID RawFrameBuffer,
196  ULONG RawFrameLength,
197  ULONG NumberOfPackets,
198  PULONG BytesReturned);
199
200typedef NTSTATUS
201(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
202  PDEVICE_OBJECT BusDeviceObject,
203  PVOID DeviceContext,
204  PVOID FrameContext,
205  PVOID FrameBuffer,
206  ULONG FrameLength,
207  PVOID RawFrameBuffer,
208  ULONG RawFrameLength,
209  ULONG NumberOfPackets,
210  PULONG BytesReturned,
211  ULONG ActualRawFrameLength,
212  ULONG StreamNumber);
213
214typedef NTSTATUS
215(NTAPI *PCAM_STATE_ROUTINE)(
216  PDEVICE_OBJECT BusDeviceObject,
217  PVOID DeviceContext);
218
219#if defined(DEBUG_LOG)
220
221USBCAMAPI
222VOID
223NTAPI
224USBCAMD_Debug_LogEntry(
225  CHAR *Name,
226  ULONG Info1,
227  ULONG Info2,
228  ULONG Info3);
229
230#define ILOGENTRY(sig, info1, info2, info3) \
231  USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
232
233#else
234
235#define ILOGENTRY(sig, info1, info2, info3)
236
237#endif /* DEBUG_LOG */
238
239typedef struct _USBCAMD_DEVICE_DATA {
240  ULONG Sig;
241  PCAM_INITIALIZE_ROUTINE CamInitialize;
242  PCAM_INITIALIZE_ROUTINE CamUnInitialize;
243  PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket;
244  PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame;
245  PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame;
246  PCAM_START_CAPTURE_ROUTINE CamStartCapture;
247  PCAM_STOP_CAPTURE_ROUTINE CamStopCapture;
248  PCAM_CONFIGURE_ROUTINE CamConfigure;
249  PCAM_STATE_ROUTINE CamSaveState;
250  PCAM_STATE_ROUTINE CamRestoreState;
251  PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth;
252  PCAM_FREE_BW_ROUTINE CamFreeBandwidth;
253} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA;
254
255typedef struct _USBCAMD_DEVICE_DATA2 {
256  ULONG Sig;
257  PCAM_INITIALIZE_ROUTINE CamInitialize;
258  PCAM_INITIALIZE_ROUTINE CamUnInitialize;
259  PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx;
260  PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx;
261  PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx;
262  PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx;
263  PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx;
264  PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx;
265  PCAM_STATE_ROUTINE CamSaveState;
266  PCAM_STATE_ROUTINE CamRestoreState;
267  PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx;
268  PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx;
269} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2;
270
271DEFINE_GUID(GUID_USBCAMD_INTERFACE,
272  0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
273
274typedef NTSTATUS
275(NTAPI *PFNUSBCAMD_SetVideoFormat)(
276  PVOID DeviceContext,
277  PHW_STREAM_REQUEST_BLOCK pSrb);
278
279typedef NTSTATUS
280(NTAPI *PFNUSBCAMD_WaitOnDeviceEvent)(
281  PVOID DeviceContext,
282  ULONG PipeIndex,
283  PVOID Buffer,
284  ULONG BufferLength,
285  PCOMMAND_COMPLETE_FUNCTION EventComplete,
286  PVOID EventContext,
287  BOOLEAN LoopBack);
288
289typedef NTSTATUS
290(NTAPI *PFNUSBCAMD_CancelBulkReadWrite)(
291  PVOID DeviceContext,
292  ULONG PipeIndex);
293
294typedef NTSTATUS
295(NTAPI *PFNUSBCAMD_SetIsoPipeState)(
296  PVOID DeviceContext,
297  ULONG PipeStateFlags);
298
299typedef NTSTATUS
300(NTAPI *PFNUSBCAMD_BulkReadWrite)(
301  PVOID DeviceContext,
302  USHORT PipeIndex,
303  PVOID Buffer,
304  ULONG BufferLength,
305  PCOMMAND_COMPLETE_FUNCTION CommandComplete,
306  PVOID CommandContext);
307
308#define USBCAMD_VERSION_200               0x200
309
310typedef struct _USBCAMD_INTERFACE {
311  INTERFACE Interface;
312  PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent;
313  PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite;
314  PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat;
315  PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState;
316  PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite;
317} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE;
318
319/* FIXME : Do we need USBCAMAPI here ? */
320
321USBCAMAPI
322ULONG
323NTAPI
324USBCAMD_DriverEntry(
325  PVOID Context1,
326  PVOID Context2,
327  ULONG DeviceContextSize,
328  ULONG FrameContextSize,
329  PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket);
330
331USBCAMAPI
332PVOID
333NTAPI
334USBCAMD_AdapterReceivePacket(
335  PHW_STREAM_REQUEST_BLOCK Srb,
336  PUSBCAMD_DEVICE_DATA DeviceData,
337  PDEVICE_OBJECT *DeviceObject,
338  BOOLEAN NeedsCompletion);
339
340USBCAMAPI
341NTSTATUS
342NTAPI
343USBCAMD_ControlVendorCommand(
344  PVOID DeviceContext,
345  UCHAR Request,
346  USHORT Value,
347  USHORT Index,
348  PVOID Buffer,
349  PULONG BufferLength,
350  BOOLEAN GetData,
351  PCOMMAND_COMPLETE_FUNCTION CommandComplete,
352  PVOID CommandContext);
353
354USBCAMAPI
355NTSTATUS
356NTAPI
357USBCAMD_SelectAlternateInterface(
358  PVOID DeviceContext,
359  PUSBD_INTERFACE_INFORMATION RequestInterface);
360
361USBCAMAPI
362NTSTATUS
363NTAPI
364USBCAMD_GetRegistryKeyValue(
365  HANDLE Handle,
366  PWCHAR KeyNameString,
367  ULONG KeyNameStringLength,
368  PVOID Data,
369  ULONG DataLength);
370
371USBCAMAPI
372ULONG
373NTAPI
374USBCAMD_InitializeNewInterface(
375  PVOID DeviceContext,
376  PVOID DeviceData,
377  ULONG Version,
378  ULONG CamControlFlag);
379
380#ifdef __cplusplus
381}
382#endif
383
384#endif /* !defined(__USB_H) && !defined(__USBDI_H) */