/*********************************************************************
Name: v1720.c
Created by: Pierre-A. Amaudruz / K.Olchanski
Contents: V1720 8 ch. 12bit 250Msps
$Id: v1720.c 4728 2010-05-12 05:34:44Z svn $
*********************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
//#include "midas.h"
#include "v1720drv.h"
#include "mvmestd.h"
// Buffer organization map for number of samples
uint32_t V1720_NSAMPLES_MODE[11] = { (1<<20), (1<<19), (1<<18), (1<<17), (1<<16), (1<<15)
,(1<<14), (1<<13), (1<<12), (1<<11), (1<<10)};
/*****************************************************************/
/*
Read V1720 register value
*/
static uint32_t regRead(MVME_INTERFACE *mvme, uint32_t base, int offset)
{
mvme_set_am(mvme, MVME_AM_A32);
mvme_set_dmode(mvme, MVME_DMODE_D32);
return mvme_read_value(mvme, base + offset);
}
/*****************************************************************/
/*
Write V1720 register value
*/
static void regWrite(MVME_INTERFACE *mvme, uint32_t base, int offset, uint32_t value)
{
mvme_set_am(mvme, MVME_AM_A32);
mvme_set_dmode(mvme, MVME_DMODE_D32);
mvme_write_value(mvme, base + offset, value);
}
/*****************************************************************/
uint32_t v1720_RegisterRead(MVME_INTERFACE *mvme, uint32_t base, int offset)
{
return regRead(mvme, base, offset);
}
/*****************************************************************/
void v1720_RegisterWrite(MVME_INTERFACE *mvme, uint32_t base, int offset, uint32_t value)
{
regWrite(mvme, base, offset, value);
}
/*****************************************************************/
void v1720_Reset(MVME_INTERFACE *mvme, uint32_t base)
{
regWrite(mvme, base, V1720_SW_RESET, 0);
}
/*****************************************************************/
void v1720_TrgCtl(MVME_INTERFACE *mvme, uint32_t base, uint32_t reg, uint32_t mask)
{
regWrite(mvme, base, reg, mask);
}
/*****************************************************************/
void v1720_ChannelCtl(MVME_INTERFACE *mvme, uint32_t base, uint32_t reg, uint32_t mask)
{
regWrite(mvme, base, reg, mask);
}
/*****************************************************************/
void v1720_ChannelSet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t what, uint32_t that)
{
uint32_t reg, mask;
if (what == V1720_CHANNEL_THRESHOLD) mask = 0x0FFF;
if (what == V1720_CHANNEL_OUTHRESHOLD) mask = 0x0FFF;
if (what == V1720_CHANNEL_DAC) mask = 0xFFFF;
reg = what | (channel << 8);
printf("base:0x%x reg:0x%x, this:%x\n", base, reg, that);
regWrite(mvme, base, reg, (that & 0xFFF));
}
/*****************************************************************/
uint32_t v1720_ChannelGet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t what)
{
uint32_t reg, mask;
if (what == V1720_CHANNEL_THRESHOLD) mask = 0x0FFF;
if (what == V1720_CHANNEL_OUTHRESHOLD) mask = 0x0FFF;
if (what == V1720_CHANNEL_DAC) mask = 0xFFFF;
reg = what | (channel << 8);
return regRead(mvme, base, reg);
}
/*****************************************************************/
void v1720_ChannelThresholdSet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t threshold)
{
uint32_t reg;
reg = V1720_CHANNEL_THRESHOLD | (channel << 8);
printf("base:0x%x reg:0x%x, threshold:%x\n", base, reg, threshold);
regWrite(mvme, base, reg, (threshold & 0xFFF));
}
/*****************************************************************/
void v1720_ChannelOUThresholdSet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t threshold)
{
uint32_t reg;
reg = V1720_CHANNEL_OUTHRESHOLD | (channel << 8);
printf("base:0x%x reg:0x%x, outhreshold:%x\n", base, reg, threshold);
regWrite(mvme, base, reg, (threshold & 0xFFF));
}
/*****************************************************************/
void v1720_ChannelDACSet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t dac)
{
uint32_t reg;
reg = V1720_CHANNEL_DAC | (channel << 8);
printf("base:0x%x reg:0x%x, DAC:%x\n", base, reg, dac);
regWrite(mvme, base, reg, (dac & 0xFFFF));
}
/*****************************************************************/
int v1720_ChannelDACGet(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel, uint32_t *dac)
{
uint32_t reg;
int status;
reg = V1720_CHANNEL_DAC | (channel << 8);
*dac = regRead(mvme, base, reg);
reg = V1720_CHANNEL_STATUS | (channel << 8);
status = regRead(mvme, base, reg);
return status;
}
/*****************************************************************/
void v1720_Align64Set(MVME_INTERFACE *mvme, uint32_t base)
{
regWrite(mvme, base, V1720_VME_CONTROL, V1720_ALIGN64);
}
/*****************************************************************/
void v1720_AcqCtl(MVME_INTERFACE *mvme, uint32_t base, uint32_t operation)
{
uint32_t reg;
reg = regRead(mvme, base, V1720_ACQUISITION_CONTROL);
switch (operation) {
case V1720_RUN_START:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg | 0x4));
break;
case V1720_RUN_STOP:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg & ~(0x4)));
break;
case V1720_REGISTER_RUN_MODE:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg & ~(0x3)));
break;
case V1720_SIN_RUN_MODE:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg | 0x01));
break;
case V1720_SIN_GATE_RUN_MODE:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg | 0x02));
break;
case V1720_MULTI_BOARD_SYNC_MODE:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg | 0x03));
break;
case V1720_COUNT_ACCEPTED_TRIGGER:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg | 0x08));
break;
case V1720_COUNT_ALL_TRIGGER:
regWrite(mvme, base, V1720_ACQUISITION_CONTROL, (reg & ~(0x08)));
break;
default:
break;
}
}
/*****************************************************************/
void v1720_info(MVME_INTERFACE *mvme, uint32_t base, int *nchannels, uint32_t *n32word)
{
int i, chanmask;
// Evaluate the event size
// Number of samples per channels
*n32word = V1720_NSAMPLES_MODE[regRead(mvme, base, V1720_BUFFER_ORGANIZATION)];
// times the number of active channels
chanmask = 0xff & regRead(mvme, base, V1720_CHANNEL_EN_MASK);
*nchannels = 0;
for (i=0;i<8;i++) {
if (chanmask & (1<<i))
*nchannels += 1;
}
*n32word *= *nchannels;
*n32word /= 2; // 2 samples per 32bit word
*n32word += 4; // Headers
}
/*****************************************************************/
uint32_t v1720_BufferOccupancy(MVME_INTERFACE *mvme, uint32_t base, uint32_t channel)
{
uint32_t reg;
reg = V1720_BUFFER_OCCUPANCY + (channel<<16);
return regRead(mvme, base, reg);
}
/*****************************************************************/
uint32_t v1720_BufferFree(MVME_INTERFACE *mvme, uint32_t base, int nbuffer)
{
int mode;
mode = regRead(mvme, base, V1720_BUFFER_ORGANIZATION);
if (nbuffer <= (1<< mode) ) {
regWrite(mvme, base, V1720_BUFFER_FREE, nbuffer);
return mode;
} else
return mode;
}
/*****************************************************************/
uint32_t v1720_BufferFreeRead(MVME_INTERFACE *mvme, uint32_t base)
{
return regRead(mvme, base, V1720_BUFFER_FREE);
}
/*****************************************************************/
uint32_t v1720_DataRead(MVME_INTERFACE *mvme, uint32_t base, uint32_t *pdata, uint32_t n32w)
{
uint32_t i;
for (i=0;i<n32w;i++) {
*pdata = regRead(mvme, base, V1720_EVENT_READOUT_BUFFER);
if (*pdata != 0xffffffff)
pdata++;
else
break;
}
return i;
}
/********************************************************************/
/** v1720_DataBlockRead
Read N entries (32bit)
@param mvme vme structure
@param base base address
@param pdest Destination pointer
@return nentry
*/
uint32_t v1720_DataBlockRead(MVME_INTERFACE *mvme, uint32_t base, uint32_t *pdest, uint32_t *nentry)
{
int status;
mvme_set_am( mvme, MVME_AM_A32);
mvme_set_dmode( mvme, MVME_DMODE_D32);
//mvme_set_blt( mvme, MVME_BLT_MBLT64);
//mvme_set_blt( mvme, MVME_BLT_NONE);
mvme_set_blt(mvme, MVME_BLT_BLT32);
//mvme_set_blt( mvme, 0);
// Transfer in MBLT64 (8bytes), nentry is in 32bits(VF48)
// *nentry * 8 / 2
status = mvme_read(mvme, pdest, base+V1720_EVENT_READOUT_BUFFER, 4);
//printf("status = %d\n",status);
if (status != MVME_SUCCESS)
return 0;
return (*nentry);
}
/*****************************************************************/
void v1720_Status(MVME_INTERFACE *mvme, uint32_t base)
{
printf("================================================\n");
printf("V1720 at A32 0x%x\n", (int)base);
printf("Board ID : 0x%x\n", regRead(mvme, base, V1720_BOARD_ID));
printf("Board Info : 0x%x\n", regRead(mvme, base, V1720_BOARD_INFO));
printf("Acquisition status : 0x%8.8x\n", regRead(mvme, base, V1720_ACQUISITION_STATUS));
printf("================================================\n");
}
/*****************************************************************/
/**
Sets all the necessary paramters for a given configuration.
The configuration is provided by the mode argument.
Add your own configuration in the case statement. Let me know
your setting if you want to include it in the distribution.
- <b>Mode 1</b> :
@param *mvme VME structure
@param base Module base address
@param mode Configuration mode number
@return 0: OK. -1: Bad
*/
... 169 more lines ...
|