Home | History | Annotate | Download | only in include
      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 (at) 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
     26 extern "C" {
     27 #endif
     28 
     29 #if defined(_BATTERYCLASS_)
     30 # define USBCAMAPI
     31 #else
     32 # define USBCAMAPI DECLSPEC_IMPORT
     33 #endif
     34 
     35 typedef 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 
     56 typedef 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 
     63 typedef NTSTATUS
     64 (NTAPI *PCOMMAND_COMPLETE_FUNCTION)(
     65   PVOID DeviceContext,
     66   PVOID CommandContext,
     67   NTSTATUS NtStatus);
     68 
     69 typedef VOID
     70 (NTAPI *PSTREAM_RECEIVE_PACKET)(
     71   PVOID Srb,
     72   PVOID DeviceContext,
     73   PBOOLEAN Completed);
     74 
     75 typedef NTSTATUS
     76 (NTAPI *PCAM_INITIALIZE_ROUTINE)(
     77   PDEVICE_OBJECT BusDeviceObject,
     78   PVOID DeviceContext);
     79 
     80 typedef 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 
     89 typedef 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 
     99 typedef NTSTATUS
    100 (NTAPI *PCAM_START_CAPTURE_ROUTINE)(
    101   PDEVICE_OBJECT BusDeviceObject,
    102   PVOID DeviceContext);
    103 
    104 typedef NTSTATUS
    105 (NTAPI *PCAM_START_CAPTURE_ROUTINE_EX)(
    106   PDEVICE_OBJECT BusDeviceObject,
    107   PVOID DeviceContext,
    108   ULONG StreamNumber);
    109 
    110 typedef NTSTATUS
    111 (NTAPI *PCAM_ALLOCATE_BW_ROUTINE)(
    112   PDEVICE_OBJECT BusDeviceObject,
    113   PVOID DeviceContext,
    114   PULONG RawFrameLength,
    115   PVOID Format);
    116 
    117 typedef 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 
    125 typedef NTSTATUS
    126 (NTAPI *PCAM_FREE_BW_ROUTINE)(
    127   PDEVICE_OBJECT BusDeviceObject,
    128   PVOID DeviceContext);
    129 
    130 typedef NTSTATUS
    131 (NTAPI *PCAM_FREE_BW_ROUTINE_EX)(
    132   PDEVICE_OBJECT BusDeviceObject,
    133   PVOID DeviceContext,
    134   ULONG StreamNumber);
    135 
    136 typedef VOID
    137 (NTAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)(
    138   PHW_STREAM_REQUEST_BLOCK Srb);
    139 
    140 typedef NTSTATUS
    141 (NTAPI *PCAM_STOP_CAPTURE_ROUTINE)(
    142   PDEVICE_OBJECT BusDeviceObject,
    143   PVOID DeviceContext);
    144 
    145 typedef NTSTATUS
    146 (NTAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)(
    147   PDEVICE_OBJECT BusDeviceObject,
    148   PVOID DeviceContext,
    149   ULONG StreamNumber);
    150 
    151 typedef 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 
    163 typedef 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 
    176 typedef VOID
    177 (NTAPI *PCAM_NEW_FRAME_ROUTINE)(
    178   PVOID DeviceContext,
    179   PVOID FrameContext);
    180 
    181 typedef VOID
    182 (NTAPI *PCAM_NEW_FRAME_ROUTINE_EX)(
    183   PVOID DeviceContext,
    184   PVOID FrameContext,
    185   ULONG StreamNumber,
    186   PULONG FrameLength);
    187 
    188 typedef 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 
    200 typedef 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 
    214 typedef NTSTATUS
    215 (NTAPI *PCAM_STATE_ROUTINE)(
    216   PDEVICE_OBJECT BusDeviceObject,
    217   PVOID DeviceContext);
    218 
    219 #if defined(DEBUG_LOG)
    220 
    221 USBCAMAPI
    222 VOID
    223 NTAPI
    224 USBCAMD_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 
    239 typedef 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 
    255 typedef 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 
    271 DEFINE_GUID(GUID_USBCAMD_INTERFACE,
    272   0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
    273 
    274 typedef NTSTATUS
    275 (NTAPI *PFNUSBCAMD_SetVideoFormat)(
    276   PVOID DeviceContext,
    277   PHW_STREAM_REQUEST_BLOCK pSrb);
    278 
    279 typedef 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 
    289 typedef NTSTATUS
    290 (NTAPI *PFNUSBCAMD_CancelBulkReadWrite)(
    291   PVOID DeviceContext,
    292   ULONG PipeIndex);
    293 
    294 typedef NTSTATUS
    295 (NTAPI *PFNUSBCAMD_SetIsoPipeState)(
    296   PVOID DeviceContext,
    297   ULONG PipeStateFlags);
    298 
    299 typedef 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 
    310 typedef 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 
    321 USBCAMAPI
    322 ULONG
    323 NTAPI
    324 USBCAMD_DriverEntry(
    325   PVOID Context1,
    326   PVOID Context2,
    327   ULONG DeviceContextSize,
    328   ULONG FrameContextSize,
    329   PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket);
    330 
    331 USBCAMAPI
    332 PVOID
    333 NTAPI
    334 USBCAMD_AdapterReceivePacket(
    335   PHW_STREAM_REQUEST_BLOCK Srb,
    336   PUSBCAMD_DEVICE_DATA DeviceData,
    337   PDEVICE_OBJECT *DeviceObject,
    338   BOOLEAN NeedsCompletion);
    339 
    340 USBCAMAPI
    341 NTSTATUS
    342 NTAPI
    343 USBCAMD_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 
    354 USBCAMAPI
    355 NTSTATUS
    356 NTAPI
    357 USBCAMD_SelectAlternateInterface(
    358   PVOID DeviceContext,
    359   PUSBD_INTERFACE_INFORMATION RequestInterface);
    360 
    361 USBCAMAPI
    362 NTSTATUS
    363 NTAPI
    364 USBCAMD_GetRegistryKeyValue(
    365   HANDLE Handle,
    366   PWCHAR KeyNameString,
    367   ULONG KeyNameStringLength,
    368   PVOID Data,
    369   ULONG DataLength);
    370 
    371 USBCAMAPI
    372 ULONG
    373 NTAPI
    374 USBCAMD_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) */
    385