#ifndef __PCICC32_H__
#define __PCICC32_H__
//-------------------------------------------------------------------------
// WINNT driver for PCICC32 interface from ARW Elektronik, Germany --------
// IO definitions and common data structures between application and driver
//
// (c) 2000,2001 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// what who when
// started AR 16.04.2000
// added irq functionality AR 24.02.2001
// added until 'not Q' read/write mode AR 03.03.2001
// added AUTOREAD AR 17.03.2001
//
//-------------------------------------------------------------------------
// INCLUDES
//
// #include <devioctl.h> must be declared before inclusion when used for driver
// #include <winioctl.h> must be declared before inclusion when used for applications
//-------------------------------------------------------------------------
// DEFINES
//
//----------------------------------------------------------------------------------------
// macros for simple CAMAC NAF address calculation
//
#define NAF(n, a, f) ((ULONG)((n << 10) + (a << 6) + ((f & 0xf) << 2)))
// to get a compatible view to WIN95 driver
#define USER_CONTROL_CODE(x) (x)
// VPCIC32D_ATTACH_CC32 and VPCIC32D_DETACH_CC32 are incompatible to WINNT - please use read and write commands
// get the interrupt and timeout status from a CC32 interface (0x00220008)
#define PCICC32_GET_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(2),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// clear the timeout status of a CC32 interface (0x0022000C)
#define PCICC32_CLEAR_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(3),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// set the access parameter for this file (0x00220010)
#define PCICC32_SET_ACCESS_PARA CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(4),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// allow or inhibit CC32 interrupt requests (0x00220014)
#define PCICC32_CONTROL_INTERRUPTS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(5),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// requests thru blocking io the status of a pending or a rising interrupt (0x0022001C)
#define PCICC32_INSTALL_IRQ_BLOCK CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(7),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// requests to access the PLX LCR for test and debug (0x00220020)
#define PCICC32_ACCESS_LCR CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(8),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// set to check for control-code overflow
#define PCICC32_LAST_CTL_CODE PCICC32_ACCESS_LCR
// mask bits for interrupt status
#define LAM_IRQ 0x00FFFFFF // there was a LAM responible for the timeout
#define CONNECTION_TIMEOUT 0x08000000 // irq raised through a connection timout
#define LAM_BUS_OR 0x10000000 // a LAM-BUS-OR is pending
#define LAM_NOT_OR 0x20000000 // a LAM-NOT-OR is pending
#define LAM_AND_OR 0x40000000 // a LAM-AND-OR is pending
#define LAM_FF 0x80000000 // the LAM-Flip-Flop was set
// switches for PCICC32_ACCESS_COMMAND.wAccessType
#define WORD_ACCESS (UCHAR)2 // word
#define LONG_ACCESS (UCHAR)4 // long
// define bits for PCICC32_ACCESS_COMMAND.wBlockTransfer
#define UNTIL_NOT_Q 0x0001 // read/write unttil 'not Q' switch
#define AUTOREAD 0x0002 // PCIADA data pipelining access tuner switch
// data lane size constants for PCICC32_ACCESS_LCR
#define BYTE_ACCESS (UCHAR)1 // write byte wise (illegal)
#define WORD_ACCESS (UCHAR)2 // word
#define LONG_ACCESS (UCHAR)4 // long
// PCICC32_ACCESS_LCR access constants
#define LCR_READ 0 // read only access
#define LCR_WRITE 1 // write and read back access
#define LCR_OR 2 // read, bitwise 'or' content and read back access
#define LCR_AND 3 // read, bitwise 'and' content and read back access
#define LCR_WRITE_ONLY 4 // do not read back after write
// this structure is output from VPCIC32_GET_STATUS call
typedef struct
{
ULONG dwInterface; // CC32 module number (for compatibility to win95/98 only - not used)
USHORT bTimeout; // denotes a pending PCIADA timeout
USHORT bInterrupt; // denotes a pending LAM interrupt
} PCICC32_STATUS;
// this structure sets the access parameter for following reads or writes to this path
typedef struct
{
ULONG dwInterface; // CC32 module number (for compatibility to win95/98 only - not used)
USHORT wAccessType; // set the current access type (WORD_ACCESS, LONG_ACCESS)
USHORT wBlockTransfer; // set AUTOREAD or UNTIL_NOT_Q
} PCICC32_ACCESS_COMMAND;
// this structure is used to control the interrupts
typedef struct
{
ULONG dwInterface; // CC32 module number (for compatibility to win95/98 only - not used)
USHORT wEnable; // a 1 allows, a 0 inhibits interrupt requests
} PCICC32_IRQ_CONTROL;
// this structure returns from a blocking interrupt status call
typedef struct
{
ULONG dwInterface; // CC32 module number (for compatibility to win95/98 only - not used)
ULONG dwInterruptFlags; // the return status at the return of the blocking call
} PCICC32_IRQ_RESPONSE;
// structure to access the local configuration space of PLX chip (test / debug only) with PCICC32_ACCESS_LCR
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
ULONG dwContent; // content to write, and, or
USHORT wRegisterAddress; // address offset of LCR register
UCHAR bAccessMode; // LCR_READ, write, or, and
UCHAR bBytesLane; // the data access width
} PCICC32_LCR_ACCESS;
#endif // __PCICC32_H__