#ifndef __PCIVME_H__
#define __PCIVME_H__
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// IO definitions and common data structures between application and driver
//
// (c) 1999-2004 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
//
// $Log: pcivme.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.4 2002/10/27 17:02:30 klaus
// File addressing bug > 2 Gbtye circumvent
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 15.06.99
//
//-------------------------------------------------------------------------
// 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
//
// to get a compatible view to WIN95 driver
#define USER_CONTROL_CODE(x) (0x800 + x)
// initialise a dedicated VMEMM hardware
#define PCIVME_INIT_HARDWARE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(0),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// de-initialise a dedicated VMEMM hardware
#define PCIVME_DEINIT_HARDWARE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(1),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// get a static status info from a dedicted VMEMM+PCIADA hardware
#define PCIVME_GET_STATIC_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(4),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// get dynamically changing status from PCIADA+VMEMM
#define PCIVME_GET_DYNAMIC_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(5),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// read a vector in case of interrupt from VMEMM or PCIADA
#define PCIVME_READ_VECTOR CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(6),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// access VIC68A registers direct
#define PCIVME_ACCESS_VIC68A CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(7),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// enable or disable interrupts from user space
#define PCIVME_CONTROL_INTERRUPTS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(9),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// generate a (undivisible) test-and-set instruction
#define PCIVME_TAS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(10),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// generate a reset on VME BUS for a dedicated VMEMM interface
#define PCIVME_RESET CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(12),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// set the access parameter for this file (vmemm)
#define PCIVME_SET_ACCESS_PARA CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(13),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// my last usefull control code - change each time you add a ctl_code
#define PCIVME_LAST_CTL_CODE PCIVME_SET_ACCESS_PARA
// to make standard entries for not compatible WIN95 call codes
#define PCIVME_INCOMPATIBLE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(255),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// to get a compatible view to WIN95 driver
#define VPCIVMED_INIT_HARDWARE PCIVME_INIT_HARDWARE
#define VPCIVMED_DEINIT_HARDWARE PCIVME_DEINIT_HARDWARE
#define VPCIVMED_ATTACH_WINDOW PCIVME_INCOMPATIBLE // no compatibility!
#define VPCIVMED_DETACH_WINDOW PCIVME_INCOMPATIBLE // no compatibility!
#define VPCIVMED_GET_STATIC_STATUS PCIVME_GET_STATIC_STATUS
#define VPCIVMED_GET_DYNAMIC_STATUS PCIVME_GET_DYNAMIC_STATUS
#define VPCIVMED_READ_VECTOR PCIVME_READ_VECTOR
#define VPCIVMED_ACCESS_VIC68A PCIVME_ACCESS_VIC68A
#define VPCIVMED_CONTROL_INTERRUPTS PCIVME_CONTROL_INTERRUPTS
#define VPCIVMED_TAS PCIVME_TAS
#define VPCIVMED_GET_PCIADA_STATUS PCIVME_GET_PCIADA_STATUS
#define VPCIVMED_RESET PCIVME_RESET
// switches for PCIVME_(DE)INIT_HARDWARE ------------------------
#define LCR (UCHAR)0 // destination is LCR register
#define IFR (UCHAR)1 // destination is VME-Interface register
#define VIC (UCHAR)2 // destination is VIC68A register
#define STOP (UCHAR)255 // this command stops the init machine
#define BYTE_ACCESS (UCHAR)1 // write byte wise
#define WORD_ACCESS (UCHAR)2 // word
#define LONG_ACCESS (UCHAR)4 // long
// switches for PCIVME_ACCESS_VIC68A --------------------------
#define VIC68A_READ 0 // read only access
#define VIC68A_WRITE 1 // write and read back access
#define VIC68A_OR 2 // read, bitwise 'or' content and read back access
#define VIC68A_AND 3 // read, bitwise 'and' content and read back access
#define VIC68A_WRITE_ONLY 4 // do not read back after write
// switches for the PCIVME_RESET ------------------------------
#define VME_RESET_CMD 0 // raise a VME reset only
#define LOCAL_RESET_CMD 1 // raise a local reset only
#define GLOBAL_RESET_CMD 2 // raise a global reset
#define POLL_RESET_CMD 3 // ask if reset is finished
#define BOGUSADDRESS 0xFFFFFFFF // compatibilty to WIN95
#ifndef PHYSICAL_ADDRESS
#define PHYSICAL_ADDRESS LARGE_INTEGER
#endif
//-------------------------------------------------------------------------
// TYPEDEFS
//
typedef struct // one command element to initialize interface or deinitialize
{
UCHAR range; // 0 = lcr, 1 = vme-interface, -1 = stop, default = vme-if
UCHAR type; // 1 = byte access, 2 = word access, 4 = dword access, default byte
USHORT offset; // offset into interface address range for initialisation
ULONG value; // value to initialize
} PCIVME_INIT_ELEMENT;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
PCIVME_INIT_ELEMENT sVie[8]; // at least one zero element must be the last
} PCIVME_INIT_COMMAND;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
UCHAR bAddressModifier; // set the current modifier
UCHAR bAccessType; // set the current access type (1,2,4)
UCHAR bIncrement; // set the current byte increment count
ULONG dwAccessBase; // base address of seek operation (extended modifiers only, else must = 0)
} PCIVME_ACCESS_COMMAND;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wRegisterAddress; // address offset of vic68a register
USHORT wAccessMode; // read, write, or, and
UCHAR bContent; // content to write, and, or
} PCIVME_VIC68A_ACTION;
// includes static information about driver parameters ------
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
ULONG dwLinkCount; // how often this interface is requested
USHORT wNumMemWindows; // aus der aktuellen konfiguration
USHORT wNumIOPorts;
USHORT wNumIRQs;
USHORT wNumDMAs;
USHORT wModuleType; // von der angeschlossenen hardware gelesen
USHORT wFPGAVersion;
USHORT wModuleNumber;
USHORT wWordMode;
USHORT wSysControl; // if the associated VMEMM has slot 1 function
USHORT wConnected; // is the VMEMM connected (obsolete sometimes)
PHYSICAL_ADDRESS pvLcr; // physikalische adresse des lcr
PHYSICAL_ADDRESS pvIfr; // physikalische adresse des interfaces ohne vme
ULONG dwDriverVersion; // highWord.lowWord
ULONG dwDriverVariant; // show customized variants here
} PCIVME_STATIC_STATUS;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wVMEMM_connected; // status: VMEMM is connected and powered
USHORT wVMEMM_enable; // status: VMEMM access is enabled
USHORT wPCIADAIrq; // status: PCIADA timeout IRQ pending
USHORT wVMEMMIrq; // status: VMEMM IRQ pending
} PCIVME_DYNAMIC_STATUS;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
ULONG dwAddress; // tas to address
USHORT wModifier; // VME address modifier for this window
UCHAR bContent; // byte content to store and get back
} PCIVME_TAS_STRUCT;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wCommand; // the appropriate reset command
} PCIVME_RESET_COMMAND;
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wResult;
} PCIVME_RESET_RESULT; // polling result: in progress if (wResult != 0)
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wEnable; // a 1 enables the queue filling, a 0 disables
} PCIVME_IRQ_CONTROL;
typedef struct // to request vectors from a interface
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wRequestCount; // maximum number of vectors to requests
BOOLEAN bPoll; // no blocking allowed - poll always
} PCIVME_VECTOR_REQUEST;
typedef struct // the response to the above request
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wPendingCount; // represents the number of vectors pending
USHORT wCount; // actual delivered count of vectors
BOOLEAN bOverflow; // there was a irq overflow @ this channel
UCHAR bStatusID; // base of following vector array
} PCIVME_VECTOR_RESPONSE;
#endif // __PCIVME_H__