/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: avc.h Abstract MS AVC Driver Author: PB 9/24/99 Revision History: Date Who What -------- --------- ------------------------------------------------------------ 9/24/99 PB created 10/13/99 DG added avc protocol support --*/ #if (NTDDI_VERSION >= NTDDI_WINXP) #ifndef _AVC_H_ #define _AVC_H_ #ifdef __cplusplus extern "C" { #endif #ifndef CTL_CODE #pragma message ("CTL_CODE undefined. Include winioctl.h or wdm.h") #endif // ctype values from AVC Digital Interface General Specification, Rev 3.0, Section 5.3.1 typedef enum _tagAvcCommandType { AVC_CTYPE_CONTROL = 0x00, AVC_CTYPE_STATUS = 0x01, AVC_CTYPE_SPEC_INQ = 0x02, AVC_CTYPE_NOTIFY = 0x03, AVC_CTYPE_GEN_INQ = 0x04 } AvcCommandType; // response values from AVC Digital Interface General Specification, Rev 3.0, Section 5.3.2 typedef enum _tagAvcResponseCode { AVC_RESPONSE_NOTIMPL = 0x08, AVC_RESPONSE_ACCEPTED = 0x09, AVC_RESPONSE_REJECTED = 0x0a, AVC_RESPONSE_IN_TRANSITION = 0x0b, AVC_RESPONSE_STABLE = 0x0c, AVC_RESPONSE_IMPLEMENTED = 0x0c, AVC_RESPONSE_CHANGED = 0x0d, AVC_RESPONSE_INTERIM = 0x0f } AvcResponseCode; // subunit type values from Enhancements to AV/C General Specification 3.0, Version 1.1, Section 7. typedef enum _tagAvcSubunitType { AVC_SUBUNITTYPE_VIDEO_MONITOR = 0x00, AVC_SUBUNITTYPE_AUDIO = 0x01, AVC_SUBUNITTYPE_PRINTER = 0x02, AVC_SUBUNITTYPE_DISC_PLAYER = 0x03, AVC_SUBUNITTYPE_TAPE_PLAYER = 0x04, AVC_SUBUNITTYPE_TUNER = 0x05, AVC_SUBUNITTYPE_CA = 0x06, AVC_SUBUNITTYPE_VIDEO_CAMERA = 0x07, AVC_SUBUNITTYPE_PANEL = 0x09, AVC_SUBUNITTYPE_BULLETINBOARD = 0x0A, AVC_SUBUNITTYPE_CAMERASTORAGE = 0x0B, AVC_SUBUNITTYPE_VENDOR_UNIQUE = 0x1c, AVC_SUBUNITTYPE_EXTENDED = 0x1e, AVC_SUBUNITTYPE_EXTENDED_FULL = 0xff, // This is used only in extension bytes AVC_SUBUNITTYPE_UNIT = 0x1f } AvcSubunitType; #ifdef _NTDDK_ #define STATIC_KSMEDIUMSETID_1394SerialBus\ 0x9D46279FL, 0x3432, 0x48F3, 0x88, 0x8A, 0xEE, 0xFF, 0x1B, 0x7E, 0xEE, 0x71 DEFINE_GUIDSTRUCT("9D46279F-3432-48F3-888A-EEFF1B7EEE71", KSMEDIUMSETID_1394SerialBus); #define KSMEDIUMSETID_1394SerialBus DEFINE_GUIDNAMED(KSMEDIUMSETID_1394SerialBus) #define DEFAULT_AVC_TIMEOUT (1000000L) // 100ms in 100 nanosecond units #define DEFAULT_AVC_RETRIES 9 // 10 tries altogether // Max pages available via the SUBUNIT INFO command #define MAX_AVC_SUBUNITINFO_PAGES 8 // Max number of bytes of subunit address information per page #define MAX_AVC_SUBUNITINFO_BYTES 4 // Combined subunit address byte count for all pages #define AVC_SUBUNITINFO_BYTES (MAX_AVC_SUBUNITINFO_PAGES * MAX_AVC_SUBUNITINFO_BYTES) // // IOCTL definitions // #define IOCTL_AVC_CLASS CTL_CODE( \ FILE_DEVICE_UNKNOWN, \ 0x92, \ METHOD_BUFFERED, \ FILE_ANY_ACCESS \ ) typedef enum _tagAVC_FUNCTION { AVC_FUNCTION_COMMAND = 0, // struct AVC_COMMAND_IRB AVC_FUNCTION_GET_PIN_COUNT = 1, // struct AVC_PIN_COUNT AVC_FUNCTION_GET_PIN_DESCRIPTOR = 2, // struct AVC_PIN_DESCRIPTOR AVC_FUNCTION_GET_CONNECTINFO = 3, // struct AVC_PRECONNECT_INFO AVC_FUNCTION_SET_CONNECTINFO = 4, // struct AVC_SETCONNECT_INFO AVC_FUNCTION_ACQUIRE = 5, // struct AVC_PIN_ID AVC_FUNCTION_RELEASE = 6, // struct AVC_PIN_ID AVC_FUNCTION_CLR_CONNECTINFO = 7, // struct AVC_PIN_ID AVC_FUNCTION_GET_EXT_PLUG_COUNTS = 8, // struct AVC_EXT_PLUG_COUNTS AVC_FUNCTION_GET_UNIQUE_ID = 9, // struct AVC_UNIQUE_ID AVC_FUNCTION_GET_REQUEST = 10, // struct AVC_COMMAND_IRB AVC_FUNCTION_SEND_RESPONSE = 11, // struct AVC_COMMAND_IRB AVC_FUNCTION_FIND_PEER_DO = 12, // struct AVC_PEER_DO_LOCATOR AVC_FUNCTION_PEER_DO_LIST = 13, // struct AVC_PEER_DO_LIST AVC_FUNCTION_GET_SUBUNIT_INFO = 14, // struct AVC_SUBUNIT_INFO_BLOCK } AVC_FUNCTION; // Ensure that packing is consistent (/Zp8) #include // This structure is to be included at the head of a more specific AVC function structure typedef struct _AVC_IRB { AVC_FUNCTION Function; } AVC_IRB, *PAVC_IRB; // The maximum number of bytes available for an operand list #define MAX_AVC_OPERAND_BYTES 509 // AVC_COMMAND_IRB // // This structure defines the common components of an AVC command request. It // holds the opcode and operands of a request, and the opcode and operands // of a response (upon completion). The size of the operand list is fixed at // the maximum allowable number of operands given a one-byte Subunit Address. // If the Subunit Address is extended in any way, the maximum permissible // number of operand bytes will be reduced accordingly. // (supported by peer and virtual instances) typedef struct _AVC_COMMAND_IRB { // AVC_FUNCTION_COMMAND #ifdef __cplusplus AVC_IRB Common; #else AVC_IRB; #endif UCHAR SubunitAddrFlag : 1; // set to 1 if a SubunitAddr address is specified UCHAR AlternateOpcodesFlag : 1; // set to 1 if the AlternateOpcodes address is specified UCHAR TimeoutFlag : 1; // set to 1 if Timeout specified UCHAR RetryFlag : 1; // set to 1 if Retries specified // On command request, this struct will use the CommandType // On command response, this struct will use ResponseCode union { UCHAR CommandType; UCHAR ResponseCode; }; PUCHAR SubunitAddr; // set according to the target device object if not specified PUCHAR AlternateOpcodes; // set to the address of an array of alternate opcodes (byte 0 // is the count of alternate opcodes that follow) LARGE_INTEGER Timeout; // Defaults to DEFAULT_AVC_TIMEOUT if not specified UCHAR Retries; // Defaults to DEFAULT_AVC_RETRIES if not specified // The total amount of time a request will wait if the subunit is not responsive is: // Timeout * (Retries+1) UCHAR Opcode; ULONG OperandLength; // set to the actual length of the operand list UCHAR Operands[MAX_AVC_OPERAND_BYTES]; NODE_ADDRESS NodeAddress; // Used by virtual devices, ignored otherwise ULONG Generation; // Used by virtual devices, ignored otherwise } AVC_COMMAND_IRB, *PAVC_COMMAND_IRB; // For AVC_FUNCTION_GET_PIN_COUNT (supported by peer instance only) // typedef struct _AVC_PIN_COUNT { ULONG PinCount; // The pin count } AVC_PIN_COUNT, *PAVC_PIN_COUNT; // Dataformat Intersection handler used in struct AVC_PIN_DESCRIPTOR typedef __checkReturn __drv_maxIRQL(PASSIVE_LEVEL) NTSTATUS (*PFNAVCINTERSECTHANDLER)( __in PVOID Context, __in ULONG PinId, __in PKSDATARANGE DataRange, __in PKSDATARANGE MatchingDataRange, __in ULONG DataBufferSize, __out_bcount_opt(DataBufferSize) PVOID Data, __out PULONG DataSize ); // For AVC_FUNCTION_GET_PIN_DESCRIPTOR (supported by peer instance only) // typedef struct _AVC_PIN_DESCRIPTOR { ULONG PinId; // The pin number KSPIN_DESCRIPTOR PinDescriptor; PFNAVCINTERSECTHANDLER IntersectHandler; PVOID Context; } AVC_PIN_DESCRIPTOR, *PAVC_PIN_DESCRIPTOR; #define AVCCONNECTINFO_MAX_SUBUNITADDR_LEN AVC_SUBUNITINFO_BYTES typedef enum _KSPIN_FLAG_AVC { KSPIN_FLAG_AVCMASK = 0x03, // the mask to isolate the AV/C defined bit flags KSPIN_FLAG_AVC_PERMANENT = 0x01, // part of the AV/C Connect Status bit flag KSPIN_FLAG_AVC_CONNECTED = 0x02, // part of the AV/C Connect Status bit flag KSPIN_FLAG_AVC_PCRONLY = 0x04, // no subunit plug control KSPIN_FLAG_AVC_FIXEDPCR = 0x08, // implies KSPIN_FLAG_AVC_PERMANENT } KSPIN_FLAG_AVC; typedef struct _AVCPRECONNECTINFO { // Unique ID of the target unit GUID DeviceID; UCHAR SubunitAddress[AVCCONNECTINFO_MAX_SUBUNITADDR_LEN]; ULONG SubunitPlugNumber; KSPIN_DATAFLOW DataFlow; // KSPIN_FLAG_AVC_... ULONG Flags; // Undefined if !(Flags & KSPIN_FLAG_AVC_FIXEDPCR) ULONG UnitPlugNumber; } AVCPRECONNECTINFO, *PAVCPRECONNECTINFO; // For AVC_FUNCTION_GET_CONNECTINFO (supported by peer instance only) // typedef struct _AVC_PRECONNECT_INFO { ULONG PinId; // The pin number AVCPRECONNECTINFO ConnectInfo; } AVC_PRECONNECT_INFO, *PAVC_PRECONNECT_INFO; typedef struct _AVCCONNECTINFO { // Unique ID of the target unit GUID DeviceID; UCHAR SubunitAddress[AVCCONNECTINFO_MAX_SUBUNITADDR_LEN]; ULONG SubunitPlugNumber; KSPIN_DATAFLOW DataFlow; // NULL if intra-unit connection HANDLE hPlug; // Undefined if hPlug == NULL ULONG UnitPlugNumber; } AVCCONNECTINFO, *PAVCCONNECTINFO; // For AVC_FUNCTION_SET_CONNECTINFO (supported by peer instance only) // typedef struct _AVC_SETCONNECT_INFO { ULONG PinId; // The pin number AVCCONNECTINFO ConnectInfo; } AVC_SETCONNECT_INFO, *PAVC_SETCONNECT_INFO; // For AVC_FUNCTION_ACQUIRE or AVC_FUNCTION_RELEASE or AVC_FUNCTION_CLR_CONNECTINFO (supported by peer instance only) // typedef struct _AVC_PIN_ID { ULONG PinId; // The pin ID } AVC_PIN_ID, *PAVC_PIN_ID; // For AVC_FUNCTION_GET_EXT_PLUG_COUNTS (supported by peer instance only) // typedef struct _AVC_EXT_PLUG_COUNTS { ULONG ExtInputs; ULONG ExtOutputs; } AVC_EXT_PLUG_COUNTS, *PAVC_EXT_PLUG_COUNTS; // For AVC_FUNCTION_GET_UNIQUE_ID (supported by peer instance only) // typedef struct _AVC_UNIQUE_ID { // Unique ID of the target unit GUID DeviceID; } AVC_UNIQUE_ID, *PAVC_UNIQUE_ID; // For AVC_FUNCTION_FIND_PEER_DO // typedef struct _AVC_PEER_DO_LOCATOR { // 1394 NodeAddress identifying target for query NODE_ADDRESS NodeAddress; ULONG Generation; PDEVICE_OBJECT DeviceObject; } AVC_PEER_DO_LOCATOR, *PAVC_PEER_DO_LOCATOR; // For AVC_FUNCTION_PEER_DO_LIST // typedef struct _AVC_PEER_DO_LIST { // Counted array of referenced device objects (allocated by target) ULONG Count; __field_ecount(Count) PDEVICE_OBJECT *Objects; } AVC_PEER_DO_LIST, *PAVC_PEER_DO_LIST; // For AVC_FUNCTION_GET_SUBUNIT_INFO // typedef struct _AVC_SUBUNIT_INFO_BLOCK { // Array of bytes to hold subunit info (see AV/C SUBUNIT_INFO unit command for format) UCHAR Info[AVC_SUBUNITINFO_BYTES]; } AVC_SUBUNIT_INFO_BLOCK, *PAVC_SUBUNIT_INFO_BLOCK; typedef struct _AVC_MULTIFUNC_IRB { #ifdef __cplusplus AVC_IRB Common; #else AVC_IRB; #endif union { AVC_PIN_COUNT PinCount; // AVC_FUNCTION_GET_PIN_COUNT AVC_PIN_DESCRIPTOR PinDescriptor; // AVC_FUNCTION_GET_PIN_DESCRIPTOR AVC_PRECONNECT_INFO PreConnectInfo; // AVC_FUNCTION_GET_CONNECTINFO AVC_SETCONNECT_INFO SetConnectInfo; // AVC_FUNCTION_SET_CONNECTINFO AVC_PIN_ID PinId; // AVC_FUNCTION_ACQUIRE or // AVC_FUNCTION_RELEASE or // AVC_FUNCTION_CLR_CONNECTINFO AVC_EXT_PLUG_COUNTS ExtPlugCounts; // AVC_FUNCTION_GET_EXT_PLUG_COUNTS AVC_UNIQUE_ID UniqueID; // AVC_FUNCTION_GET_UNIQUE_ID AVC_PEER_DO_LOCATOR PeerLocator; // AVC_FUNCTION_FIND_PEER_DO AVC_PEER_DO_LIST PeerList; // AVC_FUNCTION_PEER_DO_LIST AVC_SUBUNIT_INFO_BLOCK Subunits; // AVC_FUNCTION_GET_SUBUNIT_INFO }; } AVC_MULTIFUNC_IRB, *PAVC_MULTIFUNC_IRB; #include #endif // _NTDDK_ // // IOCTL definitions for Virtual Unit control (from user mode) // #define IOCTL_AVC_UPDATE_VIRTUAL_SUBUNIT_INFO CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x000, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AVC_REMOVE_VIRTUAL_SUBUNIT_INFO CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x001, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AVC_BUS_RESET CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x002, METHOD_BUFFERED, FILE_ANY_ACCESS) // Ensure that packing is consistent (/Zp8) #include typedef struct _AVC_SUBUNIT_ADDR_SPEC { ULONG Flags; UCHAR SubunitAddress[1]; } AVC_SUBUNIT_ADDR_SPEC, *PAVC_SUBUNIT_ADDR_SPEC; // Flags, when used with IOCTL_AVC_UPDATE_VIRTUAL_SUBUNIT_INFO // and IOCTL_AVC_REMOVE_VIRTUAL_SUBUNIT_INFO #define AVC_SUBUNIT_ADDR_PERSISTENT 0x00000001 #define AVC_SUBUNIT_ADDR_TRIGGERBUSRESET 0x00000002 #include #ifdef __cplusplus } #endif #endif // _AVC_H_ #ifndef AVC_GUIDS_DEFINED #define AVC_GUIDS_DEFINED // {616EF4D0-23CE-446d-A568-C31EB01913D0} DEFINE_GUID(GUID_VIRTUAL_AVC_CLASS, 0x616ef4d0, 0x23ce, 0x446d, 0xa5, 0x68, 0xc3, 0x1e, 0xb0, 0x19, 0x13, 0xd0); // {095780C3-48A1-4570-BD95-46707F78C2DC} DEFINE_GUID(GUID_AVC_CLASS, 0x095780c3, 0x48a1, 0x4570, 0xbd, 0x95, 0x46, 0x70, 0x7f, 0x78, 0xc2, 0xdc); #endif #endif