mrfioc2  2.6.0
Classes | Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
evgMrm Class Reference

#include <evgMrm.h>

Inheritance diagram for evgMrm:
Inheritance graph
[legend]
Collaboration diagram for evgMrm:
Collaboration graph
[legend]

Classes

struct  Config
 

Public Types

enum  ClkSrc {
  ClkSrcInternal =0, ClkSrcRF =1, ClkSrcPXIe100 =2, ClkSrcRecovered =4,
  ClkSrcSplit =5, ClkSrcPXIe10 =6, ClkSrcRecovered_2 =7
}
 
typedef Input_t::iterator inputs_iterator
 
- Public Types inherited from mrf::Object
typedef m_obj_children_t::const_iterator child_iterator
 
typedef std::map< std::string, std::string > create_args_t
 
typedef Object *(* create_factory_t) (const std::string &name, const std::string &klass, const create_args_t &args)
 

Public Member Functions

 evgMrm (const std::string &id, const Config *conf, bus_configuration &busConfig, volatile epicsUInt8 *const base, const epicsPCIDevice *pciDevice)
 
 ~evgMrm ()
 
void enableIRQ ()
 
virtual void lock () const
 
virtual void unlock () const
 
const std::string getId () const
 
volatile epicsUInt8 * getRegAddr () const
 
MRFVersion version () const
 
std::string getFwVersionStr () const
 
std::string getSwVersion () const
 
std::string getCommitHash () const
 
void enable (epicsUInt16)
 
epicsUInt16 enabled () const
 
bool getResetMxc () const
 
void resetMxc (bool reset)
 
epicsUInt32 getDbusStatus () const
 
IOSCANPVT timeErrorScan () const
 
virtual void postSoftSecondsSrc ()
 
epicsFloat64 getFrequency () const
 
void setRFFreq (epicsFloat64)
 
epicsFloat64 getRFFreq () const
 
void setRFDiv (epicsUInt32)
 
epicsUInt32 getRFDiv () const
 
void setFracSynFreq (epicsFloat64)
 
epicsFloat64 getFracSynFreq () const
 
void setSource (epicsUInt16)
 
epicsUInt16 getSource () const
 
bool pllLocked () const
 
void setEvtCode (epicsUInt32)
 
epicsUInt32 writeonly () const
 
evgInputgetInput (epicsUInt32, InputType)
 
epicsEvent * getTimerEvent ()
 
const bus_configurationgetBusConfiguration ()
 
void show (int lvl)
 
inputs_iterator beginInputs ()
 
inputs_iterator endInputs ()
 
EVRMRMgetEvruMrm () const
 
EVRMRMgetEvrdMrm () const
 
- Public Member Functions inherited from mrf::ObjectInst< evgMrm >
virtual propertyBasegetPropertyBase (const char *pname, const std::type_info &ptype)
 
virtual void visitProperties (bool(*cb)(propertyBase *, void *), void *arg)
 
- Public Member Functions inherited from mrf::Object
const std::string & name () const
 
const Objectparent () const
 
child_iterator beginChild () const
 
child_iterator endChild () const
 
template<typename P >
mrf::auto_ptr< property< P > > getProperty (const char *pname)
 
- Public Member Functions inherited from TimeStampSource
 TimeStampSource (double period)
 
virtual ~TimeStampSource ()
 
void resyncSecond ()
 Call to re-initialize timestamp counter from system time. More...
 
void tickSecond ()
 Call just after the start of each second. More...
 
bool validSeconds () const
 Whether tickSecond() has been called for the past 5 seconds. More...
 
double deltaSeconds () const
 last difference between More...
 
void softSecondsSrc (bool enable)
 enable sending of event 125 by software timer. Simulation of external HW clock More...
 
bool isSoftSeconds () const
 
std::string nextSecond () const
 
- Public Member Functions inherited from MRMSPI
 MRMSPI (volatile unsigned char *base)
 
virtual ~MRMSPI ()
 
virtual void select (unsigned id) OVERRIDE FINAL
 Select numbered device. 0 clears selection. More...
 
virtual epicsUInt8 cycle (epicsUInt8 in) OVERRIDE FINAL
 
- Public Member Functions inherited from mrf::SPIInterface
 SPIInterface ()
 
virtual ~SPIInterface ()
 
virtual void cycles (size_t nops, const Operation *ops)
 
double timeout () const
 timeout in seconds for an individual cycle() More...
 
void setTimeout (double t)
 

Static Public Member Functions

static void isr (evgMrm *evg, bool pci)
 
static void isr_pci (void *)
 
static void isr_vme (void *)
 
static void isr_poll (void *)
 
static void init_cb (CALLBACK *, int, void(*)(CALLBACK *), void *)
 
static void process_inp_cb (CALLBACK *)
 
- Static Public Member Functions inherited from mrf::ObjectInst< evgMrm >
static int initObject ()
 
- Static Public Member Functions inherited from mrf::Object
static ObjectgetObject (const std::string &name)
 
static ObjectgetCreateObject (const std::string &name, const std::string &klass, const create_args_t &args=create_args_t())
 
static void addFactory (const std::string &klass, create_factory_t fn)
 
static void visitObjects (bool(*)(Object *, void *), void *)
 

Public Attributes

epicsMutex m_lock
 
CALLBACK irqExtInp_cb
 
unsigned char irqExtInp_queued
 
IOSCANPVT ioScanTimestamp
 
mrmDataBufTx m_buftx
 
const epicsPCIDevice * m_pciDevice
 

Additional Inherited Members

- Protected Member Functions inherited from mrf::ObjectInst< evgMrm >
 ObjectInst (const std::string &n)
 
 ObjectInst (const std::string &n, A &a)
 
virtual ~ObjectInst ()
 
- Protected Member Functions inherited from mrf::Object
 Object (const std::string &n, const Object *par=0)
 
virtual ~Object ()=0
 
- Protected Attributes inherited from mrf::SPIInterface
epicsMutex mutex
 

Detailed Description

Definition at line 56 of file evgMrm.h.

Member Typedef Documentation

◆ inputs_iterator

typedef Input_t::iterator evgMrm::inputs_iterator

Definition at line 186 of file evgMrm.h.

Member Enumeration Documentation

◆ ClkSrc

Enumerator
ClkSrcInternal 
ClkSrcRF 
ClkSrcPXIe100 
ClkSrcRecovered 
ClkSrcSplit 
ClkSrcPXIe10 
ClkSrcRecovered_2 

Definition at line 114 of file evgMrm.h.

114  {
115  ClkSrcInternal=0,
116  ClkSrcRF=1,
117  ClkSrcPXIe100=2,
118  ClkSrcRecovered=4, // fanout mode
119  ClkSrcSplit=5, // split, external on downstream, recovered on upstream
120  ClkSrcPXIe10=6,
122  };

Constructor & Destructor Documentation

◆ evgMrm()

evgMrm::evgMrm ( const std::string &  id,
const Config conf,
bus_configuration busConfig,
volatile epicsUInt8 *const  base,
const epicsPCIDevice *  pciDevice 
)

Definition at line 77 of file evgMrm.cpp.

81  :
83  TimeStampSource(1.0),
84  MRMSPI(pReg+U32_SPIDData),
86  m_buftx(id+":BUFTX",pReg+U32_DataBufferControl, pReg+U8_DataBuffer_base),
87  m_pciDevice(pciDevice),
88  m_id(id),
89  m_pReg(pReg),
90  busConfiguration(busConfig),
91  m_RFref(0),
92  m_fracSynFreq(0),
93  m_RFDiv(1u),
94  m_ClkSrc(ClkSrcInternal),
95  m_seq(this, pReg),
96  m_acTrig(id+":AcTrig", pReg),
97  shadowIrqEnable(READ32(m_pReg, IrqEnable))
98 {
99  epicsUInt32 v, isevr;
100 
101  v = READ32(m_pReg, FPGAVersion);
102  isevr=v&FPGAVersion_TYPE_MASK;
103  isevr>>=FPGAVersion_TYPE_SHIFT;
104 
105  if(isevr!=0x2)
106  throw std::runtime_error("Address does not correspond to an EVG");
107 
108  for(int i = 0; i < evgNumEvtTrig; i++) {
109  std::ostringstream name;
110  name<<id<<":TrigEvt"<<i;
111  m_trigEvt.push_back(new evgTrigEvt(name.str(), i, pReg));
112  }
113 
114  for(int i = 0; i < evgNumMxc; i++) {
115  std::ostringstream name;
116  name<<id<<":Mxc"<<i;
117  m_muxCounter.push_back(new evgMxc(name.str(), i, this));
118  }
119 
120  for(int i = 0; i < evgNumDbusBit; i++) {
121  std::ostringstream name;
122  name<<id<<":Dbus"<<i;
123  m_dbus.push_back(new evgDbus(name.str(), i, pReg));
124  }
125 
126  for(unsigned i = 0; i < conf->numFrontInp; i++) {
127  std::ostringstream name;
128  name<<id<<":FrontInp"<<i;
129  m_input[ std::pair<epicsUInt32, InputType>(i, FrontInp) ] =
130  new evgInput(name.str(), i, FrontInp, pReg + U32_FrontInMap(i));
131  }
132 
133  for(unsigned i = 0; i < conf->numUnivInp; i++) {
134  std::ostringstream name;
135  name<<id<<":UnivInp"<<i;
136  m_input[ std::pair<epicsUInt32, InputType>(i, UnivInp) ] =
137  new evgInput(name.str(), i, UnivInp, pReg + U32_UnivInMap(i));
138  }
139 
140  for(unsigned i = 0; i < conf->numRearInp; i++) {
141  std::ostringstream name;
142  name<<id<<":RearInp"<<i;
143  m_input[ std::pair<epicsUInt32, InputType>(i, RearInp) ] =
144  new evgInput(name.str(), i, RearInp, pReg + U32_RearInMap(i));
145  }
146 
147  for(int i = 0; i < evgNumFrontOut; i++) {
148  std::ostringstream name;
149  name<<id<<":FrontOut"<<i;
150  m_output[std::pair<epicsUInt32, evgOutputType>(i, FrontOut)] =
151  new evgOutput(name.str(), i, FrontOut, pReg + U16_FrontOutMap(i));
152  }
153 
154  for(int i = 0; i < evgNumUnivOut; i++) {
155  std::ostringstream name;
156  name<<id<<":UnivOut"<<i;
157  m_output[std::pair<epicsUInt32, evgOutputType>(i, UnivOut)] =
158  new evgOutput(name.str(), i, UnivOut, pReg + U16_UnivOutMap(i));
159  }
160 
161  init_cb(&irqExtInp_cb, priorityHigh, &evgMrm::process_inp_cb, this);
162 
163  scanIoInit(&ioScanTimestamp);
164 
165  if(busConfig.busType==busType_pci)
166  mrf::SPIDevice::registerDev(id+":FLASH", mrf::SPIDevice(this, 1));
167 
168  if(pciDevice->id.sub_device==PCI_DEVICE_ID_MRF_MTCA_EVM_300) {
169  printf("EVM automatically creating '%s:FCT', '%s:EVRD', and '%s:EVRU'\n", id.c_str(), id.c_str(), id.c_str());
170  fct.reset(new FCT(this, id+":FCT", pReg+0x10000));
171  evrd.reset(new EVRMRM(id+":EVRD", busConfig, &evm_evrd_conf, pReg+0x20000, 0x10000));
172  evru.reset(new EVRMRM(id+":EVRU", busConfig, &evm_evru_conf, pReg+0x30000, 0x10000));
173  }
174 }
enum busType busType
#define PCI_DEVICE_ID_MRF_MTCA_EVM_300
Definition: uio_mrf.c:67
#define U16_FrontOutMap(n)
Definition: evgRegMap.h:194
#define U32_FrontInMap(n)
Definition: evgRegMap.h:206
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
static void registerDev(const std::string &name, const SPIDevice &)
Definition: spi.cpp:86
#define U16_UnivOutMap(n)
Definition: evgRegMap.h:200
TimeStampSource(double period)
Definition: mrmtimesrc.cpp:143
MRMSPI(volatile unsigned char *base)
Definition: mrmspi.cpp:36
#define evgNumMxc
Definition: evgRegMap.h:282
Modular Register Map Event Receivers.
Definition: drvem.h:94
static void process_inp_cb(CALLBACK *)
Definition: evgMrm.cpp:383
Definition: fct.h:19
mrmDataBufTx m_buftx
Definition: evgMrm.h:152
#define evgNumUnivOut
Definition: evgRegMap.h:286
CALLBACK irqExtInp_cb
Definition: evgMrm.h:146
#define U8_DataBuffer_base
Definition: evgRegMap.h:224
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:150
#define FPGAVersion
Definition: mrf.h:133
unsigned char irqExtInp_queued
Definition: evgMrm.h:148
#define U32_DataBufferControl
Definition: evgRegMap.h:96
const epicsPCIDevice * m_pciDevice
Definition: evgMrm.h:156
Definition: evgDbus.h:7
#define U32_UnivInMap(n)
Definition: evgRegMap.h:212
#define evgNumFrontOut
Definition: evgRegMap.h:285
const std::string & name() const
Definition: object.h:393
#define FPGAVersion_TYPE_SHIFT
Definition: evgRegMap.h:107
static void init_cb(CALLBACK *, int, void(*)(CALLBACK *), void *)
Definition: evgMrm.cpp:210
#define evgNumDbusBit
Definition: evgRegMap.h:284
#define evgNumEvtTrig
Definition: evgRegMap.h:283
#define U32_SPIDData
Definition: mrmspi.cpp:23
#define U32_RearInMap(n)
Definition: evgRegMap.h:219
#define FPGAVersion_TYPE_MASK
Definition: evgRegMap.h:104
Definition: evgMxc.h:9

◆ ~evgMrm()

evgMrm::~evgMrm ( )

Definition at line 176 of file evgMrm.cpp.

176  {
179 
180  for(size_t i = 0; i < m_trigEvt.size(); i++)
181  delete m_trigEvt[i];
182 
183  for(size_t i = 0; i < m_muxCounter.size(); i++)
184  delete m_muxCounter[i];
185 
186  for(size_t i = 0; i < m_dbus.size(); i++)
187  delete m_dbus[i];
188 
189  while(!m_input.empty())
190  m_input.erase(m_input.begin());
191 
192  while(!m_output.empty())
193  m_output.erase(m_output.begin());
194 }
const bus_configuration * getBusConfiguration()
Definition: evgMrm.cpp:438
static void unregisterDev(const std::string &name)
Definition: spi.cpp:93
const std::string & name() const
Definition: object.h:393

Member Function Documentation

◆ beginInputs()

inputs_iterator evgMrm::beginInputs ( )
inline

Definition at line 187 of file evgMrm.h.

187 { return m_input.begin(); }

◆ enable()

void evgMrm::enable ( epicsUInt16  mode)

Definition at line 253 of file evgMrm.cpp.

253  {
254  if(mode>2)
255  throw std::runtime_error("Unsupported mode");
256 
257  SCOPED_LOCK(m_lock);
258  epicsUInt32 ctrl = NAT_READ32(m_pReg, Control);
259  if(mode!=0)
260  ctrl |= EVG_MASTER_ENA;
261  else
262  ctrl &= ~EVG_MASTER_ENA;
263  if(mode==2)
264  ctrl |= EVG_BCGEN|EVG_DCMST;
265  else
266  ctrl &= ~(EVG_BCGEN|EVG_DCMST);
267 
269 
270  NAT_WRITE32(m_pReg, Control, ctrl);
271 }
#define EVG_DIS_EVT_REC
Definition: evgRegMap.h:267
epicsMutex m_lock
Definition: evgMrm.h:79
#define EVG_DCMST
Definition: evgRegMap.h:271
#define EVG_REV_PWD_DOWN
Definition: evgRegMap.h:268
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
#define EVG_BCGEN
Definition: evgRegMap.h:270
#define EVG_MASTER_ENA
Definition: evgRegMap.h:266
#define NAT_WRITE32(base, offset, value)
Definition: mrfCommonIO.h:148
#define EVG_MXC_RESET
Definition: evgRegMap.h:269

◆ enabled()

epicsUInt16 evgMrm::enabled ( ) const

Definition at line 273 of file evgMrm.cpp.

273  {
274  epicsUInt32 ctrl = NAT_READ32(m_pReg, Control);
275  if(!(ctrl&EVG_MASTER_ENA)) return 0;
276  else if(!(ctrl&EVG_BCGEN)) return 1;
277  else return 2;
278 }
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
#define EVG_BCGEN
Definition: evgRegMap.h:270
#define EVG_MASTER_ENA
Definition: evgRegMap.h:266

◆ enableIRQ()

void evgMrm::enableIRQ ( )

Definition at line 196 of file evgMrm.cpp.

197 {
198  shadowIrqEnable |= EVG_IRQ_PCIIE | //PCIe interrupt enable,
201  EVG_IRQ_STOP_RAM(0) |
202  EVG_IRQ_STOP_RAM(1) |
203  EVG_IRQ_START_RAM(0) |
205 
206  WRITE32(m_pReg, IrqEnable, shadowIrqEnable);
207 }
#define EVG_IRQ_EXT_INP
Definition: evgRegMap.h:57
#define EVG_IRQ_STOP_RAM(N)
Definition: evgRegMap.h:54
#define EVG_IRQ_PCIIE
Definition: evgRegMap.h:52
#define EVG_IRQ_START_RAM(N)
Definition: evgRegMap.h:56
#define EVG_IRQ_ENABLE
Definition: evgRegMap.h:51
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ endInputs()

inputs_iterator evgMrm::endInputs ( )
inline

Definition at line 188 of file evgMrm.h.

188 { return m_input.end(); }

◆ getBusConfiguration()

const bus_configuration * evgMrm::getBusConfiguration ( )

Definition at line 438 of file evgMrm.cpp.

439 {
440  return &busConfiguration;
441 }

◆ getCommitHash()

std::string evgMrm::getCommitHash ( ) const

Definition at line 243 of file evgMrm.cpp.

243  {
244  return __COMMIT_HASH;
245 }
#define __COMMIT_HASH
Definition: evgMrm.cpp:44

◆ getDbusStatus()

epicsUInt32 evgMrm::getDbusStatus ( ) const

Definition at line 248 of file evgMrm.cpp.

248  {
249  return READ32(m_pReg, Status)>>16;
250 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114

◆ getEvrdMrm()

EVRMRM* evgMrm::getEvrdMrm ( ) const
inline

Definition at line 203 of file evgMrm.h.

203 { return evrd.get(); } // EVRD MRM accessor

◆ getEvruMrm()

EVRMRM* evgMrm::getEvruMrm ( ) const
inline

Definition at line 202 of file evgMrm.h.

202 { return evru.get(); } // EVRU MRM accessor

◆ getFracSynFreq()

epicsFloat64 evgMrm::getFracSynFreq ( ) const

Definition at line 91 of file evgEvtClk.cpp.

91  {
92  return FracSynthAnalyze(READ32(m_pReg, FracSynthWord), 24.0, 0);
93 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
epicsShareExtern epicsFloat64 FracSynthAnalyze(epicsUInt32 ControlWord, epicsFloat64 ReferenceFreq, epicsInt32 PrintFlag)
Definition: mrfFracSynth.c:844

◆ getFrequency()

epicsFloat64 evgMrm::getFrequency ( ) const

Definition at line 15 of file evgEvtClk.cpp.

15  {
16  epicsUInt16 cur = getSource();
17  switch(cur) {
18  case ClkSrcPXIe100:
19  return 100;
20  // case ClkSrcPXIe10: ??
21  case ClkSrcRF:
22  case ClkSrcSplit:
23  return getRFFreq()/getRFDiv();
24  default:
25  return m_fracSynFreq;
26  }
27 }
epicsUInt32 getRFDiv() const
Definition: evgEvtClk.cpp:59
epicsUInt16 getSource() const
Definition: evgEvtClk.cpp:114
epicsFloat64 getRFFreq() const
Definition: evgEvtClk.cpp:41

◆ getFwVersionStr()

std::string evgMrm::getFwVersionStr ( ) const

Definition at line 232 of file evgMrm.cpp.

233 {
234  return version().str();
235 }
MRFVersion version() const
Definition: evgMrm.cpp:227

◆ getId()

const std::string evgMrm::getId ( ) const

EVG

Definition at line 218 of file evgMrm.cpp.

218  {
219  return m_id;
220 }

◆ getInput()

evgInput * evgMrm::getInput ( epicsUInt32  inpNum,
InputType  type 
)

Access functions

Definition at line 425 of file evgMrm.cpp.

425  {
426  evgInput* inp = m_input[ std::pair<epicsUInt32, InputType>(inpNum, type) ];
427  if(!inp)
428  throw std::runtime_error("Input not initialized");
429 
430  return inp;
431 }

◆ getRegAddr()

volatile epicsUInt8 * evgMrm::getRegAddr ( ) const

Definition at line 223 of file evgMrm.cpp.

223  {
224  return m_pReg;
225 }

◆ getResetMxc()

bool evgMrm::getResetMxc ( ) const
inline

Definition at line 93 of file evgMrm.h.

93 {return true;}

◆ getRFDiv()

epicsUInt32 evgMrm::getRFDiv ( ) const

Definition at line 59 of file evgEvtClk.cpp.

59  {
60  return m_RFDiv;
61 }

◆ getRFFreq()

epicsFloat64 evgMrm::getRFFreq ( ) const

Definition at line 41 of file evgEvtClk.cpp.

41  {
42  return m_RFref;
43 }

◆ getSource()

epicsUInt16 evgMrm::getSource ( ) const

Definition at line 114 of file evgEvtClk.cpp.

114  {
115  epicsUInt32 cur = READ32(m_pReg, ClockControl);
116  cur &= ClockControl_Sel_MASK;
117  return cur >> ClockControl_Sel_SHIFT;
118 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define ClockControl_Sel_SHIFT
Definition: evgRegMap.h:119
#define ClockControl_Sel_MASK
Definition: evgRegMap.h:118

◆ getSwVersion()

std::string evgMrm::getSwVersion ( ) const

Definition at line 238 of file evgMrm.cpp.

238  {
239  return MRF_VERSION;
240 }
#define MRF_VERSION
Definition: version.h:2

◆ getTimerEvent()

epicsEvent * evgMrm::getTimerEvent ( )

Definition at line 434 of file evgMrm.cpp.

434  {
435  return &m_timerEvent;
436 }

◆ init_cb()

void evgMrm::init_cb ( CALLBACK *  ptr,
int  priority,
void(*)(CALLBACK *)  fn,
void *  valptr 
)
static

Definition at line 210 of file evgMrm.cpp.

210  {
211  callbackSetPriority(priority, ptr);
212  callbackSetCallback(fn, ptr);
213  callbackSetUser(valptr, ptr);
214  (ptr)->timer=NULL;
215 }

◆ isr()

void evgMrm::isr ( evgMrm evg,
bool  pci 
)
static

Interrupt and Callback

Definition at line 324 of file evgMrm.cpp.

324  {
325 try{
326  epicsUInt32 flags = READ32(evg->m_pReg, IrqFlag);
327  epicsUInt32 active = flags & evg->shadowIrqEnable;
328 
329 #if defined(vxWorks) || defined(__rtems__)
330  if(!active) {
331 # ifdef __rtems__
332  if(!pci)
333  printk("evgMrm::isr with no active VME IRQ 0x%08x 0x%08x\n", flags, evg->shadowIrqEnable);
334 #else
335  (void)pci;
336 # endif
337  // this is a shared interrupt
338  return;
339  }
340  // Note that VME devices do not normally shared interrupts
341 #else
342  // for Linux, shared interrupts are detected by the kernel module
343  // so any notifications to userspace are real interrupts by this device
344  (void)pci;
345 #endif
346 
347  if(active & EVG_IRQ_START_RAM(0)) {
348  evg->m_seq.doStartOfSequence(0);
349  }
350 
351  if(active & EVG_IRQ_START_RAM(1)) {
352  evg->m_seq.doStartOfSequence(1);
353  }
354 
355  if(active & EVG_IRQ_STOP_RAM(0)) {
356  evg->m_seq.doEndOfSequence(0);
357  }
358 
359  if(active & EVG_IRQ_STOP_RAM(1)) {
360  evg->m_seq.doEndOfSequence(1);
361  }
362 
363  if(active & EVG_IRQ_EXT_INP) {
364  if(evg->irqExtInp_queued==0) {
365  callbackRequest(&evg->irqExtInp_cb);
366  evg->irqExtInp_queued=1;
367  } else if(evg->irqExtInp_queued==1) {
368  evg->shadowIrqEnable &= ~EVG_IRQ_EXT_INP;
369  evg->irqExtInp_queued=2;
370  }
371  }
372 
373  WRITE32(evg->getRegAddr(), IrqEnable, evg->shadowIrqEnable);
374  WRITE32(evg->m_pReg, IrqFlag, flags); // Clear the interrupt causes
375  READ32(evg->m_pReg, IrqFlag); // Make sure the clear completes before returning
376 
377 }catch(...){
378  epicsInterruptContextMessage("c++ Exception in ISR!!!\n");
379 }
380 }
#define EVG_IRQ_EXT_INP
Definition: evgRegMap.h:57
#define EVG_IRQ_STOP_RAM(N)
Definition: evgRegMap.h:54
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define EVG_IRQ_START_RAM(N)
Definition: evgRegMap.h:56
void doStartOfSequence(unsigned i)
Call from ISR.
Definition: mrmSeq.cpp:759
volatile epicsUInt8 * getRegAddr() const
Definition: evgMrm.cpp:223
CALLBACK irqExtInp_cb
Definition: evgMrm.h:146
void doEndOfSequence(unsigned i)
Call from ISR.
Definition: mrmSeq.cpp:775
unsigned char irqExtInp_queued
Definition: evgMrm.h:148
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ isr_pci()

void evgMrm::isr_pci ( void *  arg)
static

Definition at line 289 of file evgMrm.cpp.

289  {
290  evgMrm *evg = static_cast<evgMrm*>(arg);
291 
292  // Call to the generic implementation
293  evg->isr(evg, true);
294 
295 #if defined(__linux__) || defined(_WIN32)
296 
300  if(devPCIEnableInterrupt(evg->m_pciDevice)) {
301  printf("PCI: Failed to enable interrupt\n");
302  return;
303  }
304 #endif
305 }
const epicsPCIDevice * m_pciDevice
Definition: evgMrm.h:156
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:324
Definition: evgMrm.h:56

◆ isr_poll()

void evgMrm::isr_poll ( void *  arg)
static

Definition at line 316 of file evgMrm.cpp.

316  {
317  evgMrm *evg = static_cast<evgMrm*>(arg);
318 
319  // Call to the generic implementation
320  evg->isr(evg, true);
321 }
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:324
Definition: evgMrm.h:56

◆ isr_vme()

void evgMrm::isr_vme ( void *  arg)
static

Definition at line 308 of file evgMrm.cpp.

308  {
309  evgMrm *evg = static_cast<evgMrm*>(arg);
310 
311  // Call to the generic implementation
312  evg->isr(evg, false);
313 }
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:324
Definition: evgMrm.h:56

◆ lock()

virtual void evgMrm::lock ( ) const
inlinevirtual

Implements mrf::Object.

Definition at line 78 of file evgMrm.h.

78 {};

◆ pllLocked()

bool evgMrm::pllLocked ( ) const

Definition at line 120 of file evgEvtClk.cpp.

121 {
122  epicsUInt32 cur = READ32(m_pReg, ClockControl);
123  epicsUInt32 mask = 0;
124  if(version()>=MRFVersion(2, 7, 0))
126  return (cur&mask)==mask;
127 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define ClockControl_cglock
Definition: evgRegMap.h:123
#define ClockControl_plllock
Definition: evgRegMap.h:117
MRFVersion version() const
Definition: evgMrm.cpp:227

◆ postSoftSecondsSrc()

void evgMrm::postSoftSecondsSrc ( )
virtual

Reimplemented from TimeStampSource.

Definition at line 402 of file evgMrm.cpp.

403 {
404  tickSecond();
405  scanIoRequest(ioScanTimestamp);
406 }
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:150
void tickSecond()
Call just after the start of each second.
Definition: mrmtimesrc.cpp:160

◆ process_inp_cb()

void evgMrm::process_inp_cb ( CALLBACK *  pCallback)
static

Definition at line 383 of file evgMrm.cpp.

383  {
384  void* pVoid;
385  callbackGetUser(pVoid, pCallback);
386  evgMrm* evg = static_cast<evgMrm*>(pVoid);
387 
388  {
389  interruptLock ig;
390  if(evg->irqExtInp_queued==2) {
391  evg->shadowIrqEnable |= EVG_IRQ_EXT_INP;
392  WRITE32(evg->getRegAddr(), IrqEnable, evg->shadowIrqEnable);
393  }
394  evg->irqExtInp_queued=0;
395  }
396 
397  evg->tickSecond();
398  scanIoRequest(evg->ioScanTimestamp);
399 }
#define EVG_IRQ_EXT_INP
Definition: evgRegMap.h:57
volatile epicsUInt8 * getRegAddr() const
Definition: evgMrm.cpp:223
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:150
void tickSecond()
Call just after the start of each second.
Definition: mrmtimesrc.cpp:160
unsigned char irqExtInp_queued
Definition: evgMrm.h:148
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
Definition: evgMrm.h:56

◆ resetMxc()

void evgMrm::resetMxc ( bool  reset)

Definition at line 281 of file evgMrm.cpp.

281  {
282  if(reset) {
283  SCOPED_LOCK(m_lock);
284  BITSET32(m_pReg, Control, EVG_MXC_RESET);
285  }
286 }
#define BITSET32(base, offset, mask)
Definition: mrfCommonIO.h:124
epicsMutex m_lock
Definition: evgMrm.h:79
#define EVG_MXC_RESET
Definition: evgRegMap.h:269

◆ setEvtCode()

void evgMrm::setEvtCode ( epicsUInt32  evtCode)
virtual

Implements TimeStampSource.

Definition at line 409 of file evgMrm.cpp.

409  {
410  if(evtCode > 255)
411  throw std::runtime_error("Event Code out of range. Valid range: 0 - 255.");
412 
413  SCOPED_LOCK(m_lock);
414 
415  while(READ32(m_pReg, SwEvent) & SwEvent_Pend) {}
416 
417  WRITE32(m_pReg, SwEvent,
418  (evtCode<<SwEvent_Code_SHIFT)
419  |SwEvent_Ena);
420 }
epicsMutex m_lock
Definition: evgMrm.h:79
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define SwEvent_Code_SHIFT
Definition: evgRegMap.h:91
#define SwEvent_Ena
Definition: evgRegMap.h:88
#define SwEvent_Pend
Definition: evgRegMap.h:89
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setFracSynFreq()

void evgMrm::setFracSynFreq ( epicsFloat64  freq)

Definition at line 64 of file evgEvtClk.cpp.

64  {
65  epicsFloat64 error;
66 
67  epicsUInt32 controlWord = FracSynthControlWord (freq, MRF_FRAC_SYNTH_REF, 0, &error);
68  if ((!controlWord) || (error > 100.0)) {
69  char err[80];
70  sprintf(err, "Cannot set event clock speed to %f MHz.\n", freq);
71  std::string strErr(err);
72  throw std::runtime_error(strErr);
73  }
74  epicsUInt32 uSecDivider = (epicsUInt16)freq;
75 
76  epicsUInt32 oldControlWord=READ32(m_pReg, FracSynthWord),
77  olduSecDivider=READ32(m_pReg, uSecDiv);
78 
79  /* Changing the control word disturbes the phase of the synthesiser
80  which will cause a glitch. Don't change the control word unless needed.*/
81  if(controlWord != oldControlWord || uSecDivider!=olduSecDivider){
82  WRITE32(m_pReg, FracSynthWord, controlWord);
83  epicsUInt32 uSecDivider = (epicsUInt16)freq;
84  WRITE32(m_pReg, uSecDiv, uSecDivider);
85  }
86 
87  m_fracSynFreq = FracSynthAnalyze(READ32(m_pReg, FracSynthWord), 24.0, 0);
88 }
epicsShareExtern epicsUInt32 FracSynthControlWord(epicsFloat64 DesiredFreq, epicsFloat64 ReferenceFreq, epicsInt32 debugFlag, epicsFloat64 *Error)
Definition: mrfFracSynth.c:552
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define MRF_FRAC_SYNTH_REF
Definition: mrfCommon.h:99
epicsShareExtern epicsFloat64 FracSynthAnalyze(epicsUInt32 ControlWord, epicsFloat64 ReferenceFreq, epicsInt32 PrintFlag)
Definition: mrfFracSynth.c:844
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setRFDiv()

void evgMrm::setRFDiv ( epicsUInt32  rfDiv)

Definition at line 46 of file evgEvtClk.cpp.

46  {
47  if(rfDiv < 1 || rfDiv == 13 || rfDiv > 32) {
48  char err[80];
49  sprintf(err, "Invalid RF Divider %d. Valid range is 1 - 12, 14 - 32", rfDiv);
50  std::string strErr(err);
51  throw std::runtime_error(strErr);
52  }
53  m_RFDiv = rfDiv;
54 
55  recalcRFDiv();
56 }

◆ setRFFreq()

void evgMrm::setRFFreq ( epicsFloat64  RFref)

Definition at line 30 of file evgEvtClk.cpp.

30  {
31  if(RFref < 50.0f || RFref > 1600.0f) {
32  std::ostringstream strm;
33  strm<<"Cannot set RF frequency to "<<RFref<<" MHz. Valid range is 50 - 1600.";
34  throw std::runtime_error(strm.str());
35  }
36 
37  m_RFref = RFref;
38 }

◆ setSource()

void evgMrm::setSource ( epicsUInt16  clkSrc)

Definition at line 96 of file evgEvtClk.cpp.

96  {
97  switch(clkSrc) {
98  case ClkSrcInternal:
99  case ClkSrcRF:
100  case ClkSrcPXIe100:
101  case ClkSrcRecovered:
102  case ClkSrcSplit:
103  case ClkSrcPXIe10:
104  case ClkSrcRecovered_2:
105  m_ClkSrc = (ClkSrc)clkSrc;
106 
107  recalcRFDiv();
108  return;
109  }
110 
111  throw std::invalid_argument("Invalid clock source");
112 }
ClkSrc
Definition: evgMrm.h:114

◆ show()

void evgMrm::show ( int  lvl)

Definition at line 443 of file evgMrm.cpp.

444 {
445 }

◆ timeErrorScan()

IOSCANPVT evgMrm::timeErrorScan ( ) const
inline

Definition at line 97 of file evgMrm.h.

97 { return ioScanTimestamp; }
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:150

◆ unlock()

virtual void evgMrm::unlock ( ) const
inlinevirtual

Implements mrf::Object.

Definition at line 79 of file evgMrm.h.

79 {};

◆ version()

MRFVersion evgMrm::version ( ) const

Definition at line 227 of file evgMrm.cpp.

228 {
229  return MRFVersion(READ32(m_pReg, FPGAVersion));
230 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define FPGAVersion
Definition: mrf.h:133

◆ writeonly()

epicsUInt32 evgMrm::writeonly ( ) const
inline

Definition at line 139 of file evgMrm.h.

139 { return 0; }

Member Data Documentation

◆ ioScanTimestamp

IOSCANPVT evgMrm::ioScanTimestamp

Definition at line 150 of file evgMrm.h.

◆ irqExtInp_cb

CALLBACK evgMrm::irqExtInp_cb

Definition at line 146 of file evgMrm.h.

◆ irqExtInp_queued

unsigned char evgMrm::irqExtInp_queued

Definition at line 148 of file evgMrm.h.

◆ m_buftx

mrmDataBufTx evgMrm::m_buftx

Definition at line 152 of file evgMrm.h.

◆ m_lock

epicsMutex evgMrm::m_lock

Definition at line 79 of file evgMrm.h.

◆ m_pciDevice

const epicsPCIDevice* evgMrm::m_pciDevice

Definition at line 156 of file evgMrm.h.


The documentation for this class was generated from the following files: