⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bacc.h

📁 BCAM 1394 Driver
💻 H
字号:
//-----------------------------------------------------------------------------
//  Company:  Basler Vision Technologies
//  Section:  Vision Components
//  Project:  1394 Driver
//  Subproject:  Bus ACCess Driver
//  $Header: bacc.h, 11, 17.09.2003 17:15:51, Nebelung, H.$
//-----------------------------------------------------------------------------
/**
  \file     bacc.h
  \brief   <type brief description here>
 *
 * <type long description here>
 *
 */
//-----------------------------------------------------------------------------

#ifndef BACC_H
#define BACC_H

#if defined(DRIVER)
  #include <wdm.h>
  #include <1394.h>
#else
  #include <basetyps.h>
  #include <winnt.h>
  #include <winioctl.h>
#endif


#define FILE_BACC_DEVICE 0x8080

/*
 * Explicitly specify structure member alignment, to become independent
 * of any alignment that may be in effect when this file is included.
 */
#pragma pack(push, 4)

/**
* Typesafe version of standard macro
*/
#define _CTL_CODE( DeviceType, Function, Method, Access ) (\
    (ULONG)(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) ) \
)

/* Function ordinal numbers, used to construct driver control codes */
enum BaccOrd
{
  BaccOrdGetTopology = 0x800,
  BaccOrdGetDriverVersionString,
  BaccOrdGetResources,
  BaccOrdReadQuad,
  BaccOrdWriteQuad,
  BaccOrdFireBusReset,
  BaccOrdGetBusResetNotification,
  BaccOrdReadBlock,
  BaccOrdWriteBlock,
};


/**
 * \brief IOCTL_BACC_GET_DRIVER_VERSION_STRING
 * Get a string denoting the current driver version. 
 * \return Version string
 */
#define IOCTL_BACC_GET_DRIVER_VERSION_STRING \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdGetDriverVersionString, METHOD_BUFFERED, FILE_ANY_ACCESS)

/**
 * \brief IOCTL_BACC_GET_TOPOLOGY
 * Get the bus topology
 * \return BaccResGetTopology
 */
#define IOCTL_BACC_GET_TOPOLOGY \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdGetTopology, METHOD_BUFFERED, FILE_ANY_ACCESS)


/// Flagbits
typedef enum _Flagbits
{
  FB_Dcam1_0 = 0x1,
  FB_Dcam1_2 = 0x2,
  FB_Dcam1_3 = 0x4,
  FB_Bcam    = 0x8,
  FB_Sbp2    = 0x10,
  FB_Pc      = 0x20,
} FLAGBITS;

/// Maximum number of ports per node
#define MAX_PORTS (3+6+6+6)
/// Number of ports stored in a DWORD
#define PORTS_PER_DWORD 16
/// Bits used for a port
#define PORT_MASK 0x3
/// Number of char in names
#define MAX_STRING 64
/// Describes a 1394 bus node
typedef struct _NODE
{
  ULONG Flags;              ///< root, ...
  ULONG ID;                 ///< the device node number
  ULONG LinkActive;         ///< One if device's link and transaction layer are active, zero otherwise
  ULONG Speed;              ///< Transfer rate 100, 200, 400 mbit/s
  ULARGE_INTEGER NUID;           ///< Node Unique ID
  ULONG Ports[ (MAX_PORTS - 1) / PORTS_PER_DWORD + 1 ]; ///< connected type, 2bit per entry
  CHAR  Vendor[ MAX_STRING + 1 ]; ///< Vendor leaf
  CHAR  Model[ MAX_STRING + 1 ]; ///< Model leaf
} NODE;


#if defined(DRIVER)

/// Set connection state of a port
void SetPortState( NODE *pn, size_t _P, ULONG v );

/// Connection state of a port
ULONG GetPortState( NODE *pn, size_t _P );

#endif

/// Result of GetTopology
typedef struct _BaccResGetTopology
{
  ULONG Status;       ///< Zero if ok, non-zero if wrong size
  ULONG Size;         ///< Size of this struct
  ULONG NumNodes;     ///< Number of nodes
  NODE  Node[1];      ///< Array of nodes
} BaccResGetTopology;

typedef ULONG QUADLET;
typedef struct
{
  // ULONG Bus = 0x3ff; //local bus
  USHORT NodeID;
  USHORT Adr_High;
  ULONG  Adr_Low;
} ADDRESS;
/**
* \brief IOCTL_BACC_WRITE_QUAD
* Write a quadlet in IEEE1394 Address Space
*/
#define IOCTL_BACC_WRITE_QUAD \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdWriteQuad, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct 
{
  ADDRESS Adr;
  QUADLET Data;
} BaccArgWriteQuad;

/**
* \brief IOCTL_BACC_WRITE_BLOCK
* Write a quadlet in IEEE1394 Address Space
*/
#define IOCTL_BACC_WRITE_BLOCK \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdWriteBlock, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct 
{
  ADDRESS Adr;
  QUADLET Data[1];
} BaccArgWriteBlock;



/**
* \brief IOCTL_BACC_READ_QUAD
* Read a quadlet from IEEE1394 Address Space
* \return BaccResReadQuad
*/
#define IOCTL_BACC_READ_QUAD \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdReadQuad, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct 
{
  ADDRESS Adr;
} BaccArgReadQuad;
typedef struct
{
  QUADLET Data;
} BaccResReadQuad;

/**
* \brief IOCTL_BACC_READ_BLOCK
* Read a block of quadlets from IEEE1394 Address Space
* \return Array of quadlets
*/
#define IOCTL_BACC_READ_BLOCK \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdReadBlock, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct 
{
  ADDRESS Adr;
  ULONG NumQuadlets;
} BaccArgReadBlock;

/**
* \brief IOCTL_BACC_GET_RESOURCES
* Get the isochronous resources of a node
* \return BaccResGetResources
*/
#define IOCTL_BACC_GET_RESOURCES \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdGetResources, METHOD_BUFFERED, FILE_ANY_ACCESS)
/// Argument of a GetResouces call
typedef struct
{
  ULONG Speed;       ///< Transfer rate: 0=100,1=200,2=400...
} BaccArgGetResources;
/// Result of a GetResources call
typedef struct
{
  ULONG BytesPerFrame;  ///< available bytes per frame
  ULONG Channels;       ///< number of available channels
  ULARGE_INTEGER ChSet;  ///< bitmap of available channels
} BaccResGetResources;

/**
* \brief IOCTL_BACC_FIRE_BUS_RESET
* Fire a bus reset
*/
#define IOCTL_BACC_FIRE_BUS_RESET \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdFireBusReset, METHOD_BUFFERED, FILE_ANY_ACCESS)

/**
* \brief IOCTL_BACC_GET_BUS_RESET_NOTIFICATION
* Get notified on a bus reset
*/
#define IOCTL_BACC_GET_BUS_RESET_NOTIFICATION \
  _CTL_CODE(FILE_BACC_DEVICE, BaccOrdGetBusResetNotification, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#ifdef DRIVER

struct _NODE_INFO;
typedef struct _NODE_INFO *PNODE_INFO;

//
// This is used to keep track of pending irp's for
// notification of bus resets.
//
typedef struct _BUS_RESET_IRP {
    LIST_ENTRY      BusResetIrpList;
    PIRP            Irp;
} BUS_RESET_IRP, *PBUS_RESET_IRP;

typedef struct
{
  PDEVICE_OBJECT StackDeviceObject;    ///< Attached to in AddDevice()
  PDEVICE_OBJECT PortDeviceObject;     ///< 
  PDEVICE_OBJECT PhysicalDeviceObject; ///< Passed in AddDevice()

  UNICODE_STRING SymbolicLinkName;

  BOOLEAN IsShuttingDown;

  ULONG GenerationCount;

  ULONG NumNodes;
  PNODE_INFO NodeList;
  LIST_ENTRY BusResetIrps;

  KSPIN_LOCK ResetSpinLock;

  IO_REMOVE_LOCK RemoveLock;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


NTSTATUS DriverEntry( PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath );
NTSTATUS BaccDispatchPnp( PDEVICE_OBJECT pDevObj, PIRP pIrp );
NTSTATUS BaccDispatchIoControl( PDEVICE_OBJECT pDevObj, PIRP pIrp );
NTSTATUS BaccRetrieveGenerationCount( PDEVICE_OBJECT pDevObj, PIRP pIrp );
NTSTATUS BaccGetBusResetNotification( PDEVICE_OBJECT pDevObj, PIRP pIrp, ULONG flags );
VOID FreeNodeInfo( PNODE_INFO p);
VOID ClearNodeInfoList( PDEVICE_EXTENSION pDevExt );
NTSTATUS SubmitIrpSynch( PDEVICE_OBJECT pDevObj, PIRP pIrp, PIRB pIrb );
NTSTATUS SubmitIrpAsync( PDEVICE_OBJECT pDevObj, PIRP pIrp, PIRB pIrb );
NTSTATUS CopyTextualDesc( PANSI_STRING pAnsiStr, PTEXTUAL_LEAF pTxtDsc );
ULONG MIN( ULONG a, ULONG b );

#endif /* defined (DRIVER) */

#pragma pack(pop)
#endif /* !defined(BACC_H) */

/**
 * Device class GUIDs. These are used to identify device interfaces. GUID definitions must
 * be outside the section protected from multiple inclusion, for reasons explained in the
 * DDK docs (but not easily understood).
 */
#include "bacc_guid.h"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -