/*********************************************************************
Name: v792n.c
Created by: Jimmy Ngai
Contents: V792N 16ch. QDC
Based on v792.c by Pierre-Andre Amaudruz
$Id: $
*********************************************************************/
#include <stdio.h>
#include <string.h>
#include <signal.h>
#if defined(OS_LINUX)
#include <unistd.h>
#endif
#include "v792n.h"
WORD v792n_Read16(MVME_INTERFACE *mvme, DWORD base, int offset)
{
int cmode;
WORD data;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
data = mvme_read_value(mvme, base+offset);
mvme_set_dmode(mvme, cmode);
return data;
}
void v792n_Write16(MVME_INTERFACE *mvme, DWORD base, int offset, WORD value)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+offset, value);
mvme_set_dmode(mvme, cmode);
}
DWORD v792n_Read32(MVME_INTERFACE *mvme, DWORD base, int offset)
{
int cmode;
DWORD data;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D32);
data = mvme_read_value(mvme, base+offset);
mvme_set_dmode(mvme, cmode);
return data;
}
void v792n_Write32(MVME_INTERFACE *mvme, DWORD base, int offset, DWORD value)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D32);
mvme_write_value(mvme, base+offset, value);
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
int v792n_DataReady(MVME_INTERFACE *mvme, DWORD base)
{
int data_ready, cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
data_ready = mvme_read_value(mvme, base+V792N_CSR1_RO) & 0x1;
mvme_set_dmode(mvme, cmode);
return data_ready;
}
/*****************************************************************/
int v792n_isEvtReady(MVME_INTERFACE *mvme, DWORD base)
{
int csr;
csr = v792n_CSR1Read(mvme, base);
return (csr & 0x100);
}
/*****************************************************************/
int v792n_isBusy(MVME_INTERFACE *mvme, DWORD base)
{
int status, busy, timeout, cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
timeout = 1000;
do {
status = mvme_read_value(mvme, base+V792N_CSR1_RO);
busy = status & 0x4;
timeout--;
} while (busy || timeout);
mvme_set_dmode(mvme, cmode);
return (busy != 0 ? 1 : 0);
}
/*****************************************************************/
/*
Read single event, return event length (number of entries)
Uses single vme access! (1us/D32)
*/
int v792n_EventRead(MVME_INTERFACE *mvme, DWORD base, DWORD *pdest, int *nentry)
{
#define USE_BLT_READ_2
#ifdef USE_SINGLE_READ
DWORD hdata;
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D32);
*nentry = 0;
if (v792n_DataReady(mvme, base)) {
do {
hdata = mvme_read_value(mvme, base);
} while (!(hdata & 0x02000000)); // skip up to the header
pdest[*nentry] = hdata;
*nentry += 1;
do {
pdest[*nentry] = mvme_read_value(mvme, base);
*nentry += 1;
} while (!(pdest[*nentry-1] & 0x04000000)); // copy until the trailer
nentry--;
}
mvme_set_dmode(mvme, cmode);
#endif // USE_SINGLE_READ
#ifdef USE_BLT_READ_1
DWORD hdata, data[V792N_MAX_CHANNELS+2];
int cam, cmode, cnt, i;
mvme_get_am(mvme, &cam);
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D32);
*nentry = 0;
if (v792n_DataReady(mvme, base)) {
do {
hdata = mvme_read_value(mvme, base);
} while (!(hdata & 0x02000000)); // skip up to the header
mvme_set_am(mvme, MVME_AM_A32_NB);
mvme->blt_mode = MVME_BLT_BLT32;
cnt = (hdata >> 8) & 0x3F;
mvme_read(mvme, data, base, (cnt+1)*4);
pdest[0] = hdata;
for (i=1;i<=cnt+1;i++)
pdest[i] = data[i-1];
*nentry = cnt + 2;
}
mvme_set_am(mvme, cam);
mvme_set_dmode(mvme, cmode);
#endif // USE_BLT_READ_1
#ifdef USE_BLT_READ_2
DWORD hdata;
int cam, cmode, cnt;
mvme_get_am(mvme, &cam);
mvme_get_dmode(mvme, &cmode);
*nentry = 0;
// if (v792n_DataReady(mvme, base)) {
mvme_set_am(mvme, MVME_AM_A32_NB);
mvme->blt_mode = MVME_BLT_BLT32;
mvme_read(mvme, pdest, base, (V792N_MAX_CHANNELS+2)*4);
cnt = (pdest[0] >> 8) & 0x3F;
*nentry = cnt + 2;
// }
mvme_set_am(mvme, cam);
mvme_set_dmode(mvme, cmode);
#endif //USE_BLT_READ_2
return *nentry;
}
/*****************************************************************/
/*
Read nentry of data from the data buffer. Will use the DMA engine
if size is larger than 127 bytes.
*/
int v792n_DataRead(MVME_INTERFACE *mvme, DWORD base, DWORD *pdest, int *nentry)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D32);
// *nentry = 128;
if (v792n_DataReady(mvme, base)) {
mvme_read(mvme, pdest, base, *nentry*4);
}
mvme_set_dmode(mvme, cmode);
return *nentry;
}
/*****************************************************************/
void v792n_DataClear(MVME_INTERFACE *mvme, DWORD base)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_BIT_SET2_RW, 0x4);
mvme_write_value(mvme, base+V792N_BIT_CLEAR2_WO, 0x4);
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_EvtCntRead(MVME_INTERFACE *mvme, DWORD base, DWORD *evtcnt)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
*evtcnt = mvme_read_value(mvme, base+V792N_EVT_CNT_L_RO);
*evtcnt += (mvme_read_value(mvme, base+V792N_EVT_CNT_H_RO) << 16);
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_EvtCntReset(MVME_INTERFACE *mvme, DWORD base)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_EVT_CNT_RST_WO, 1);
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_IntSet(MVME_INTERFACE *mvme, DWORD base, int level, int vector)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_INT_VECTOR_WO, (vector & 0xFF));
mvme_write_value(mvme, base+V792N_INT_LEVEL_WO, (level & 0x7));
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_IntEnable(MVME_INTERFACE *mvme, DWORD base, int level)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_EVTRIG_REG_RW, (level & 0x1F));
/* Use the trigger buffer for int enable/disable
mvme_write_value(mvme, base+V792N_INT_LEVEL_WO, (level & 0x7));
*/
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_IntDisable(MVME_INTERFACE *mvme, DWORD base)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_EVTRIG_REG_RW, 0);
/* Use the trigger buffer for int enable/disable
Setting a level 0 reboot the VMIC !
mvme_write_value(mvme, base+V792N_INT_LEVEL_WO, 0);
*/
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_EvtTriggerSet(MVME_INTERFACE *mvme, DWORD base, int count)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_EVTRIG_REG_RW, (count & 0x1F));
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_SingleShotReset(MVME_INTERFACE *mvme, DWORD base)
{
int cmode;
mvme_get_dmode(mvme, &cmode);
mvme_set_dmode(mvme, MVME_DMODE_D16);
mvme_write_value(mvme, base+V792N_SINGLE_RST_WO, 1);
mvme_set_dmode(mvme, cmode);
}
/*****************************************************************/
void v792n_SoftReset(MVME_INTERFACE *mvme, DWORD base)
{
... 407 more lines ...
|