|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
61883.h
Abstract:
The public header for clients of the 61883 Class.
Author:
WGJ PSB
--*/
// // Class GUID // // {7EBEFBC0-3200-11d2-B4C2-00A0C9697D07} DEFINE_GUID(GUID_61883_CLASS, 0x7ebefbc0, 0x3200, 0x11d2, 0xb4, 0xc2, 0x0, 0xa0, 0xc9, 0x69, 0x7d, 0x7);
// // IOCTL Definitions // #define IOCTL_61883_CLASS CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x91, \ METHOD_IN_DIRECT, \ FILE_ANY_ACCESS \ )
// // Current 61883 DDI Version // #define CURRENT_61883_DDI_VERSION 0x2
// // INIT_61883_HEADER Macro // #define INIT_61883_HEADER( Av61883, Request ) \ (Av61883)->Function = Request; \ (Av61883)->Version = CURRENT_61883_DDI_VERSION;
// // 61883 I/O Request Functions // enum {
Av61883_GetUnitInfo, Av61883_SetUnitInfo,
Av61883_SetPlug, Av61883_GetPlugHandle, Av61883_GetPlugState, Av61883_Connect, Av61883_Disconnect,
Av61883_AttachFrame, Av61883_CancelFrame, Av61883_Talk, Av61883_Listen, Av61883_Stop,
Av61883_SendFcpRequest, Av61883_GetFcpResponse,
Av61883_GetFcpRequest, Av61883_SendFcpResponse,
Av61883_SetFcpNotify,
Av61883_CreatePlug, Av61883_DeletePlug,
Av61883_BusResetNotify, Av61883_BusReset,
Av61883_SetUnitDirectory,
Av61883_MonitorPlugs,
Av61883_MAX };
// // Plug States // #define CMP_PLUG_STATE_IDLE 0 #define CMP_PLUG_STATE_READY 1 #define CMP_PLUG_STATE_SUSPENDED 2 #define CMP_PLUG_STATE_ACTIVE 3
// // Connect Speeds (not the same as 1394 speed flags!!) // #define CMP_SPEED_S100 0x00 #define CMP_SPEED_S200 0x01 #define CMP_SPEED_S400 0x02
// // CIP Frame Flags // #define CIP_VALIDATE_FIRST_SOURCE 0x00000001 #define CIP_VALIDATE_ALL_SOURCE 0x00000002 #define CIP_STRIP_SOURCE_HEADER 0x00000004 #define CIP_USE_SOURCE_HEADER_TIMESTAMP 0x00000008 #define CIP_DV_STYLE_SYT 0x00000010 #define CIP_AUDIO_STYLE_SYT 0x00000020 #define CIP_RESET_FRAME_ON_DISCONTINUITY 0x00000040
// // CIP Status Codes // #define CIP_STATUS_SUCCESS 0x00000000 #define CIP_STATUS_CORRUPT_FRAME 0x00000001 #define CIP_STATUS_FIRST_FRAME 0x00000002
// // CIP Talk Flags // #define CIP_TALK_USE_SPH_TIMESTAMP 0x00000001 #define CIP_TALK_DOUBLE_BUFFER 0x00000002
// // Plug Location // typedef enum { CMP_PlugLocal = 0, CMP_PlugRemote } CMP_PLUG_LOCATION;
// // Plug Type // typedef enum { CMP_PlugOut = 0, // oPCR CMP_PlugIn // iPCR } CMP_PLUG_TYPE;
// // Connect Type // typedef enum { CMP_Broadcast = 0, CMP_PointToPoint } CMP_CONNECT_TYPE;
typedef struct _OPCR { ULONG Payload:10; ULONG OverheadID:4; ULONG DataRate:2; ULONG Channel:6; ULONG Reserved:2; ULONG PPCCounter:6; ULONG BCCCounter:1; ULONG OnLine:1; } OPCR, *POPCR;
typedef struct _IPCR { ULONG Reserved0:16; ULONG Channel:6; ULONG Reserved1:2; ULONG PPCCounter:6; ULONG BCCCounter:1; ULONG OnLine:1; } IPCR, *PIPCR;
typedef struct _AV_PCR { union { OPCR oPCR; IPCR iPCR; ULONG ulongData; }; } AV_PCR, *PAV_PCR;
// // Client Request Structures //
// // Local or Device Unit Info // #define RETRIEVE_DEVICE_UNIT_INFO 0x00000000 // Retrieve Info from Device #define RETRIEVE_LOCAL_UNIT_INFO 0x00000001 // Retrieve Info from Local Node
// // DiagLevel's used for controlling various behavior // #define DIAGLEVEL_NONE 0x00000000 // Nothing. #define DIAGLEVEL_IGNORE_OPLUG 0x00000001 // Will not program the oPCR #define DIAGLEVEL_IGNORE_IPLUG 0x00000002 // Will not program the iPCR #define DIAGLEVEL_SET_CHANNEL_63 0x00000004 // Resets channel to 63 when oPCR/iPCR is disconnected #define DIAGLEVEL_IPCR_IGNORE_FREE 0x00000008 // Will not free isoch resources when iPCR is disconnected // and local oPCR is not specified #define DIAGLEVEL_HIDE_OPLUG 0x00000010 // Hides the oMPR & oPCR in an exclusive address range #define DIAGLEVEL_IPCR_ALWAYS_ALLOC 0x00000020 // Will always allocate when connecting to iPCR with no // oPCR specified, regardless if iPCR has existing connection #define DIAGLEVEL_SPECIFY_BLOCKSIZE 0x00000040 // This flag is specified when we detect an invalid max_rec or // want to specify the block size. If this flag is set, all async // transactions will be transmitted upto 512 byte blocks (S100)
// // GetUnitInfo nLevel's // #define GET_UNIT_INFO_IDS 0x00000001 // Retrieves IDs of Unit #define GET_UNIT_INFO_CAPABILITIES 0x00000002 // Retrieves Capabilities of Unit #define GET_UNIT_INFO_ISOCH_PARAMS 0x00000003 // Retrieves parameters for isoch #define GET_UNIT_BUS_GENERATION_NODE 0x00000004 // Retrieves current generation/node #define GET_UNIT_DDI_VERSION 0x00000005 // Retrieves 61883 DDI Version #define GET_UNIT_DIAG_LEVEL 0x00000006 // Retrieves the currently set DiagLevel flags
// // Hardware Flags // #define AV_HOST_DMA_DOUBLE_BUFFERING_ENABLED 0x00000001
typedef struct _GET_UNIT_IDS {
// // UniqueID // OUT LARGE_INTEGER UniqueID;
// // VendorID // OUT ULONG VendorID;
// // ModelID // OUT ULONG ModelID;
// // VendorText Length // OUT ULONG ulVendorLength;
// // VendorText String // OUT PWSTR VendorText;
// // ModelText Length // OUT ULONG ulModelLength;
// // ModelText String // OUT PWSTR ModelText;
// // UnitModelID // OUT ULONG UnitModelID;
// // UnitModelText Length // OUT ULONG ulUnitModelLength;
// // UnitModelText String // OUT PWSTR UnitModelText;
} GET_UNIT_IDS, *PGET_UNIT_IDS;
typedef struct _GET_UNIT_CAPABILITIES {
// // Number of Output Plugs supported by device // OUT ULONG NumOutputPlugs;
// // Number of Input Plugs supported by device // OUT ULONG NumInputPlugs;
// // MaxDataRate // OUT ULONG MaxDataRate;
// // CTS Flags // OUT ULONG CTSFlags;
// // Hardware Flags // OUT ULONG HardwareFlags;
} GET_UNIT_CAPABILITIES, *PGET_UNIT_CAPABILITIES;
// // UnitIsochParams // typedef struct _UNIT_ISOCH_PARAMS {
IN OUT ULONG RX_NumPackets;
IN OUT ULONG RX_NumDescriptors;
IN OUT ULONG TX_NumPackets;
IN OUT ULONG TX_NumDescriptors;
} UNIT_ISOCH_PARAMS, *PUNIT_ISOCH_PARAMS;
// // Unit Generation/Node Info // typedef struct _BUS_GENERATION_NODE {
OUT ULONG GenerationCount;
OUT NODE_ADDRESS LocalNodeAddress;
OUT NODE_ADDRESS DeviceNodeAddress;
} BUS_GENERATION_NODE, *PBUS_GENERATION_NODE;
// // Unit DDI Version // typedef struct _UNIT_DDI_VERSION {
OUT ULONG Version;
} UNIT_DDI_VERSION, *PUNIT_DDI_VERSION;
// // UnitDiagLevel // typedef struct _UNIT_DIAG_LEVEL {
IN ULONG DiagLevel;
} UNIT_DIAG_LEVEL, *PUNIT_DIAG_LEVEL;
// // GetUnitInfo // typedef struct _GET_UNIT_INFO {
IN ULONG nLevel;
IN OUT PVOID Information;
} GET_UNIT_INFO, *PGET_UNIT_INFO;
// // SetUnitInfo nLevel's // #define SET_UNIT_INFO_DIAG_LEVEL 0x00000001 // Sets the diag level for 61883 #define SET_UNIT_INFO_ISOCH_PARAMS 0x00000002 // Sets the parameters for isoch #define SET_CMP_ADDRESS_RANGE_TYPE 0x00000003 // Sets the type of CMP address range
// // CMP Address Range Type // #define CMP_ADDRESS_TYPE_GLOBAL 0x00000001 // Global CMP for this instance - default #define CMP_ADDRESS_TYPE_EXCLUSIVE 0x00000002 // Exclusive CMP for this instance
// // SetCmpAddressRange // typedef struct _SET_CMP_ADDRESS_TYPE {
IN ULONG Type;
} SET_CMP_ADDRESS_TYPE, *PSET_CMP_ADDRESS_TYPE;
// // SetUnitInfo // typedef struct _SET_UNIT_INFO {
IN ULONG nLevel;
IN OUT PVOID Information;
} SET_UNIT_INFO, *PSET_UNIT_INFO;
// // GetPlugHandle // typedef struct _CMP_GET_PLUG_HANDLE {
// // Requested Plug Number // IN ULONG PlugNum;
// // Requested Plug Type // IN CMP_PLUG_TYPE Type;
// // Returned Plug Handle // OUT HANDLE hPlug;
} CMP_GET_PLUG_HANDLE, *PCMP_GET_PLUG_HANDLE;
// // GetPlugState // typedef struct _CMP_GET_PLUG_STATE {
// // Plug Handle // IN HANDLE hPlug;
// // Current State // OUT ULONG State;
// // Current Data Rate // OUT ULONG DataRate;
// // Current Payload Size // OUT ULONG Payload;
// // Number of Broadcast Connections // OUT ULONG BC_Connections;
// // Number of Point to Point Connections // OUT ULONG PP_Connections;
} CMP_GET_PLUG_STATE, *PCMP_GET_PLUG_STATE;
// // CipDataFormat // typedef struct _CIP_DATA_FORMAT {
// // FMT and FDF either known, or discovered // via AV/C command // UCHAR FMT; UCHAR FDF_hi; UCHAR FDF_mid; UCHAR FDF_lo;
// // SPH as defined by IEC-61883 // BOOLEAN bHeader;
// // QPC as defined by IEC-61883 // UCHAR Padding;
// // DBS as defined by IEC-61883 // UCHAR BlockSize;
// // FN as defined by IEC-61883 // UCHAR Fraction;
// // BlockPeriod - TX Only // ULONG BlockPeriod;
} CIP_DATA_FORMAT, *PCIP_DATA_FORMAT;
// // Connect // typedef struct _CMP_CONNECT {
// // Output Plug Handle // IN HANDLE hOutputPlug;
// // Input Plug Handle // IN HANDLE hInputPlug;
// // Requested Connect Type // IN CMP_CONNECT_TYPE Type;
// // Requested Data Format - TX Only // IN CIP_DATA_FORMAT Format;
// // Returned Connect Handle // OUT HANDLE hConnect;
} CMP_CONNECT, *PCMP_CONNECT;
// // Disconnect // typedef struct _CMP_DISCONNECT {
// // Connect Handle to Disconnect // IN HANDLE hConnect;
} CMP_DISCONNECT, *PCMP_DISCONNECT;
// // CIP Frame typedef // typedef struct _CIP_FRAME CIP_FRAME, *PCIP_FRAME;
// // ValidateInfo Struct. returned on pfnValidate. // typedef struct _CIP_VALIDATE_INFO {
// // Connection Handle // HANDLE hConnect;
// // Validate Context // PVOID Context;
// // TimeStamp for current source packet // CYCLE_TIME TimeStamp;
// // Packet offset for current source packet // PUCHAR Packet;
} CIP_VALIDATE_INFO, *PCIP_VALIDATE_INFO;
// // NotifyInfo Struct. returned on pfnNotify // typedef struct _CIP_NOTIFY_INFO {
// // Connection Handle // HANDLE hConnect;
// // Notify Context // PVOID Context;
// // Frame // PCIP_FRAME Frame;
} CIP_NOTIFY_INFO, *PCIP_NOTIFY_INFO;
// // Validate & Notify Routines // typedef ULONG (*PCIP_VALIDATE_ROUTINE) ( IN PCIP_VALIDATE_INFO ValidateInfo );
typedef ULONG (*PCIP_NOTIFY_ROUTINE) ( IN PCIP_NOTIFY_INFO NotifyInfo );
// // CIP Frame Struct // struct _CIP_FRAME {
IN PCIP_FRAME pNext; // chain multiple frames together
IN ULONG Flags; //specify flag options
IN PCIP_VALIDATE_ROUTINE pfnValidate; //backdoor
IN PVOID ValidateContext;
IN PCIP_NOTIFY_ROUTINE pfnNotify; //completion
IN PVOID NotifyContext;
OUT CYCLE_TIME Timestamp;
OUT ULONG Status;
IN OUT PUCHAR Packet; //the locked buffer
OUT ULONG CompletedBytes; };
// // CIP Attach Frame Structure // typedef struct _CIP_ATTACH_FRAME {
HANDLE hConnect; // Connect Handle
ULONG FrameLength; // Frame Length
ULONG SourceLength; // Source Length
PCIP_FRAME Frame; // Frame
} CIP_ATTACH_FRAME, *PCIP_ATTACH_FRAME;
// // CIP Cancel Frame Structure // typedef struct _CIP_CANCEL_FRAME {
IN HANDLE hConnect;
IN PCIP_FRAME Frame;
} CIP_CANCEL_FRAME, *PCIP_CANCEL_FRAME;
// // CIP Talk Structure // typedef struct _CIP_TALK {
// // Connect Handle // IN HANDLE hConnect;
} CIP_TALK, *PCIP_TALK;
// // CIP Listen Structure // typedef struct _CIP_LISTEN {
// // Connect Handle // IN HANDLE hConnect;
} CIP_LISTEN, *PCIP_LISTEN;
// // CIP Stop Structure // typedef struct _CIP_STOP {
// // Connect Handle // IN HANDLE hConnect;
} CIP_STOP, *PCIP_STOP;
// // FCP Frame Format // typedef struct _FCP_FRAME { UCHAR ctype:4; UCHAR cts:4; UCHAR payload[511]; } FCP_FRAME, *PFCP_FRAME;
// Legacy FCP structs typedef struct _FCP_SEND_REQUEST FCP_REQUEST, *PFCP_REQUEST; typedef struct _FCP_GET_RESPONSE FCP_RESPONSE, *PFCP_RESPONSE;
// // FCP Send Request Structure // typedef struct _FCP_SEND_REQUEST { IN NODE_ADDRESS NodeAddress; IN ULONG Length; IN PFCP_FRAME Frame; } FCP_SEND_REQUEST, *PFCP_SEND_REQUEST;
// // FCP Get Response Structure // typedef struct _FCP_GET_RESPONSE { OUT NODE_ADDRESS NodeAddress; IN OUT ULONG Length; IN OUT PFCP_FRAME Frame; } FCP_GET_RESPONSE, *PFCP_GET_RESPONSE;
// // FCP Get Request Structure // typedef struct _FCP_GET_REQUEST { OUT NODE_ADDRESS NodeAddress; IN OUT ULONG Length; IN OUT PFCP_FRAME Frame; } FCP_GET_REQUEST, *PFCP_GET_REQUEST;
// // FCP Send Response Structure // typedef struct _FCP_SEND_RESPONSE { IN NODE_ADDRESS NodeAddress; IN ULONG Length; IN PFCP_FRAME Frame; } FCP_SEND_RESPONSE, *PFCP_SEND_RESPONSE;
// // Set FCP Notify Flags // #define DEREGISTER_FCP_NOTIFY 0x00000000
#define REGISTER_FCP_RESPONSE_NOTIFY 0x00000001 #define REGISTER_FCP_REQUEST_NOTIFY 0x00000002
// // Set FCP Notify Structure // typedef struct _SET_FCP_NOTIFY {
// // Flags // IN ULONG Flags;
// // Node Address // IN NODE_ADDRESS NodeAddress;
} SET_FCP_NOTIFY, *PSET_FCP_NOTIFY;
// // Plug Notify Routine // typedef struct _CMP_NOTIFY_INFO {
HANDLE hPlug;
AV_PCR Pcr;
PVOID Context;
} CMP_NOTIFY_INFO, *PCMP_NOTIFY_INFO;
// // Plug Notify Routine // typedef void (*PCMP_NOTIFY_ROUTINE) ( IN PCMP_NOTIFY_INFO NotifyInfo );
// // CreatePlug // typedef struct _CMP_CREATE_PLUG {
// Type of plug to create IN CMP_PLUG_TYPE PlugType;
// PCR Settings IN AV_PCR Pcr;
// Notification Routine for Register IN PCMP_NOTIFY_ROUTINE pfnNotify;
// Notification Context IN PVOID Context;
// Plug Number OUT ULONG PlugNum;
// Plug Handle OUT HANDLE hPlug;
} CMP_CREATE_PLUG, *PCMP_CREATE_PLUG;
// // DeletePlug // typedef struct _CMP_DELETE_PLUG {
// Plug Handle IN HANDLE hPlug;
} CMP_DELETE_PLUG, *PCMP_DELETE_PLUG;
// // SetPlug // typedef struct _CMP_SET_PLUG {
// Plug Handle IN HANDLE hPlug;
// PCR Settings IN AV_PCR Pcr;
} CMP_SET_PLUG, *PCMP_SET_PLUG;
// // Bus Reset Notify Routine // typedef void (*PBUS_RESET_ROUTINE) ( IN PVOID Context, IN PBUS_GENERATION_NODE BusResetInfo );
#define REGISTER_BUS_RESET_NOTIFY 0x1 #define DEREGISTER_BUS_RESET_NOTIFY 0x2
// // BusResetNotify // typedef struct _BUS_RESET_NOTIFY {
IN ULONG Flags;
IN PBUS_RESET_ROUTINE pfnNotify;
IN PVOID Context;
} BUS_RESET_NOTIFY, *PBUS_RESET_NOTIFY;
// // Flags for Av61883_SetUnitDirectory // #define ADD_UNIT_DIRECTORY_ENTRY 0x1 #define REMOVE_UNIT_DIRECTORY_ENTRY 0x2 #define ISSUE_BUS_RESET_AFTER_MODIFY 0x4
// // Set Unit Directory // typedef struct _SET_UNIT_DIRECTORY {
IN ULONG Flags;
IN ULONG UnitSpecId;
IN ULONG UnitSwVersion;
IN OUT HANDLE hCromEntry;
} SET_UNIT_DIRECTORY, *PSET_UNIT_DIRECTORY;
// // States for Monitoring Plugs // #define MONITOR_STATE_CREATED 0x00000001 // Plug Created #define MONITOR_STATE_REMOVED 0x00000002 // Plug Removed #define MONITOR_STATE_UPDATED 0x00000004 // Plug Contents Updated
// // Monitor Plugs Notify Routine // typedef struct _CMP_MONITOR_INFO {
ULONG State;
ULONG PlugNum;
ULONG PlugType;
AV_PCR Pcr;
PVOID Context;
} CMP_MONITOR_INFO, *PCMP_MONITOR_INFO;
typedef void (*PCMP_MONITOR_ROUTINE) ( IN PCMP_MONITOR_INFO MonitorInfo );
// // Flags for Av61883_MonitorPlugs // #define REGISTER_MONITOR_PLUG_NOTIFY 0x1 #define DEREGISTER_MONITOR_PLUG_NOTIFY 0x2
// // MonitorPlugs (Local only) // typedef struct _CMP_MONITOR_PLUGS {
IN ULONG Flags;
IN PCMP_MONITOR_ROUTINE pfnNotify;
IN PVOID Context;
} CMP_MONITOR_PLUGS, *PCMP_MONITOR_PLUGS;
// // Av61883 Struct // typedef struct _AV_61883_REQUEST {
// // Requested Function // ULONG Function;
// // Selected DDI Version // ULONG Version;
// // Flags // ULONG Flags;
union {
GET_UNIT_INFO GetUnitInfo; SET_UNIT_INFO SetUnitInfo;
CMP_GET_PLUG_HANDLE GetPlugHandle; CMP_GET_PLUG_STATE GetPlugState; CMP_CONNECT Connect; CMP_DISCONNECT Disconnect;
CIP_ATTACH_FRAME AttachFrame; CIP_CANCEL_FRAME CancelFrame; CIP_TALK Talk; CIP_LISTEN Listen; CIP_STOP Stop;
FCP_REQUEST Request; // Legacy FCP_RESPONSE Response; // Legacy
FCP_SEND_REQUEST SendRequest; FCP_GET_RESPONSE GetResponse;
FCP_GET_REQUEST GetRequest; FCP_SEND_RESPONSE SendResponse;
SET_FCP_NOTIFY SetFcpNotify;
CMP_CREATE_PLUG CreatePlug; CMP_DELETE_PLUG DeletePlug; CMP_SET_PLUG SetPlug;
BUS_RESET_NOTIFY BusResetNotify;
SET_UNIT_DIRECTORY SetUnitDirectory;
CMP_MONITOR_PLUGS MonitorPlugs; }; } AV_61883_REQUEST, *PAV_61883_REQUEST;
|