Blame |
Last modification |
View Log
| RSS feed
//-------------------------------------------------------------------------------------------
// pcilib.c - interface hardware dependend functions to interface to the pvmon
//
// (c) 1999-2002 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: pcilibLx.c,v $
// Revision 1.4 2002/10/20 18:07:48 klaus
// mostly working alpha version
//
// Revision 1.3 2002/10/20 11:49:33 klaus
// first parts working
//
// Revision 1.2 2002/10/19 09:44:36 klaus
// first success compiling project
//
// Revision 1.1.1.1 2002/10/18 22:14:29 klaus
//
//-------------------------------------------------------------------------------------------
// INCLUDES
//
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <../driver/pcivme.h>
#include <../driver/vic.h>
#include <../driver/vme.h>
#include <../lib/pcivme_ni.h>
#include <pcilibLx.h>
#include <mbuffer.h>
//-------------------------------------------------------------------------------------------
// DEFINES
//
//-------------------------------------------------------------------------------------------
// TYPEDEFS
//
//-------------------------------------------------------------------------------------------
// GLOBALS
//
static int storedError
= 0;
static int nLocalWordMode
= 0; // initial 32 bit mode
//--------------------------------------------------------------------------
// LOCALS
//
//-------------------------------------------------------------------------------------------
// FUNCTIONS
//
//-------------------------------------------------------------------------------------------
// set word mode
//
int setWordMode
(int nMode
)
{
nLocalWordMode
= nMode
;
return nLocalWordMode
;
}
//-------------------------------------------------------------------------------------------
// set interface special registers - VIC68A
//
unsigned long _SetRegister
(int nIfcHandle
, unsigned long Address
, unsigned long Value
)
{
__u8 ubContent
= (__u8
)Value
;
VMEaccessVIC
(nIfcHandle
, VIC68A_WRITE
, Address
, &ubContent
);
return ubContent
;
}
//-------------------------------------------------------------------------------------------
// function to get special interface registers - VIC68A
//
unsigned long _GetRegister
(int nIfcHandle
, unsigned long Address
)
{
__u8 ubContent
;
VMEaccessVIC
(nIfcHandle
, VIC68A_READ
, Address
, &ubContent
);
return ubContent
;
}
//-------------------------------------------------------------------------------------------
// init the interface with the current properties
//
int Init_Interface
(char *szDevicePath
, char AdrMode
, int *nIfcHandle
)
{
return VMEopen
(szDevicePath
, AdrMode
, nIfcHandle
);
}
//-------------------------------------------------------------------------------------------
// deinit the current interface
//
void DeInit_Interface
(int nIfcHandle
)
{
VMEclose
(nIfcHandle
);
}
//-------------------------------------------------------------------------------------------
// check if an error occured
//
int GetError
(int nIfcHandle
)
{
int error
;
if ((error
= GetLastError
(nIfcHandle
)))
storedError
= error
;
else
storedError
= VMEerror
(nIfcHandle
);
return storedError
;
}
//-------------------------------------------------------------------------------------------
// clear a pending error
//
void ClearError
(int nIfcHandle
)
{
storedError
= 0;
}
//-------------------------------------------------------------------------------------------
// read elements and split a long access into 2 word accesses if word data path
//
char ReadByte
(int nIfcHandle
, unsigned long adr
, unsigned short modifier
)
{
__u8 c
;
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, BYTE_ACCESS
);
storedError
= VMEread
(nIfcHandle
, adr
, BYTE_ACCESS
, 1, &c
);
return c
;
}
short ReadWord
(int nIfcHandle
, unsigned long adr
, unsigned short modifier
)
{
__u16 w
;
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, WORD_ACCESS
);
storedError
= VMEread
(nIfcHandle
, adr
, WORD_ACCESS
, 1, &w
);
return w
;
}
long ReadLong
(int nIfcHandle
, unsigned long adr
, unsigned short modifier
)
{
__u32 l
;
if (nLocalWordMode
)
{
__u16 partl
, parth
;
// lese high anteil von adresse +0
parth
= ReadWord
(nIfcHandle
, adr
, modifier
);
// lese low anteil von adresse +2
partl
= ReadWord
(nIfcHandle
, adr
+ sizeof(__u16
), modifier
);
l
= (parth
<< 16) | partl
;
}
else
{
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, LONG_ACCESS
);
storedError
= VMEread
(nIfcHandle
, adr
, LONG_ACCESS
, 1, &l
);
}
return l
;
}
//-------------------------------------------------------------------------------------------
// write a byte/word/long and split a long access into 2 word accesses if word data path
//
void WriteByte
(int nIfcHandle
, unsigned long adr
, char value
, unsigned short modifier
)
{
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, BYTE_ACCESS
);
storedError
= VMEwrite
(nIfcHandle
, adr
, BYTE_ACCESS
, 1, &value
);
}
void WriteWord
(int nIfcHandle
, unsigned long adr
, short value
, unsigned short modifier
)
{
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, WORD_ACCESS
);
storedError
= VMEwrite
(nIfcHandle
, adr
, WORD_ACCESS
, 1, &value
);
}
void WriteLong
(int nIfcHandle
, unsigned long adr
, long value
, unsigned short modifier
)
{
if (nLocalWordMode
)
{
__u16 part
;
// high anteil auf adresse +0
part
= (value
>> 16) & 0xffff;
WriteWord
(nIfcHandle
, adr
, part
, modifier
);
// low anteil auf adresse +2
part
= value
& 0xffff;
WriteWord
(nIfcHandle
, adr
+ sizeof(__u16
), part
, modifier
);
}
else
{
setAccessProperties
(nIfcHandle
, (__u8
)modifier
, LONG_ACCESS
);
storedError
= VMEwrite
(nIfcHandle
, adr
, LONG_ACCESS
, 1, &value
);
}
}
//-------------------------------------------------------------------------------------------
// check for a pending SYSFAIL
//
unsigned short PollSfail
(int nIfcHandle
)
{
BOOLEAN bResult
;
VMEsysfailGet
(nIfcHandle
, &bResult
);
return (unsigned short)bResult
;
}
//-------------------------------------------------------------------------------------------
// clear a interface set SYSFAIL
//
void ClrSfail
(int nIfcHandle
)
{
VMEsysfailSet
(nIfcHandle
, 0);
}
//-------------------------------------------------------------------------------------------
// set a SYSFAIL
//
void SetSfail
(int nIfcHandle
)
{
VMEsysfailSet
(nIfcHandle
, 1);
}
//-------------------------------------------------------------------------------------------
// read a interrupt vector as byte/word/long (if supported)
//
char ReadVectorByte
(int nIfcHandle
)
{
__u8 ubVector
;
VMEinterrupt
(nIfcHandle
, &ubVector
);
return ubVector
;
}
short ReadVectorWord
(int nIfcHandle
)
{
printf("Word read of a vector not available!\n");
return 0;
}
long ReadVectorLong
(int nIfcHandle
)
{
printf("Longword read of a vector not available!\n");
return 0;
}
//-------------------------------------------------------------------------------------------
// emulate a 68K TAS (read/modify/write) instruction
//
char TAS
(int nIfcHandle
, unsigned long adr
, unsigned short modifier
)
{
__u8 ubResult
= 0x80;
VMETAS
(nIfcHandle
, adr
, &ubResult
);
return ubResult
; // check if a read reads a lock
}
//-------------------------------------------------------------------------------------------
// generate a SYSRESET on the vmebus and re-init the interface
//
void Reset_VME
(int nIfcHandle
)
{
VMEreset
(nIfcHandle
);
}
//-------------------------------------------------------------------------------------------
// print out some interface special info
//
void GetInterfaceInfo
(int nIfcHandle
, char type
)
{
switch (type
)
{
}
}
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------