mrfioc2  2.3.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
 
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 ()
 
- 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 185 of file evgMrm.h.

Member Enumeration Documentation

◆ ClkSrc

Enumerator
ClkSrcInternal 
ClkSrcRF 
ClkSrcPXIe100 
ClkSrcRecovered 
ClkSrcSplit 
ClkSrcPXIe10 
ClkSrcRecovered_2 

Definition at line 113 of file evgMrm.h.

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

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 73 of file evgMrm.cpp.

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

172  {
175 
176  for(size_t i = 0; i < m_trigEvt.size(); i++)
177  delete m_trigEvt[i];
178 
179  for(size_t i = 0; i < m_muxCounter.size(); i++)
180  delete m_muxCounter[i];
181 
182  for(size_t i = 0; i < m_dbus.size(); i++)
183  delete m_dbus[i];
184 
185  while(!m_input.empty())
186  m_input.erase(m_input.begin());
187 
188  while(!m_output.empty())
189  m_output.erase(m_output.begin());
190 }
const bus_configuration * getBusConfiguration()
Definition: evgMrm.cpp:429
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 186 of file evgMrm.h.

186 { return m_input.begin(); }

◆ enable()

void evgMrm::enable ( epicsUInt16  mode)

Definition at line 244 of file evgMrm.cpp.

244  {
245  if(mode>2)
246  throw std::runtime_error("Unsupported mode");
247 
248  SCOPED_LOCK(m_lock);
249  epicsUInt32 ctrl = NAT_READ32(m_pReg, Control);
250  if(mode!=0)
251  ctrl |= EVG_MASTER_ENA;
252  else
253  ctrl &= ~EVG_MASTER_ENA;
254  if(mode==2)
255  ctrl |= EVG_BCGEN|EVG_DCMST;
256  else
257  ctrl &= ~(EVG_BCGEN|EVG_DCMST);
258 
260 
261  NAT_WRITE32(m_pReg, Control, ctrl);
262 }
#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 264 of file evgMrm.cpp.

264  {
265  epicsUInt32 ctrl = NAT_READ32(m_pReg, Control);
266  if(!(ctrl&EVG_MASTER_ENA)) return 0;
267  else if(!(ctrl&EVG_BCGEN)) return 1;
268  else return 2;
269 }
#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 192 of file evgMrm.cpp.

193 {
194  shadowIrqEnable |= EVG_IRQ_PCIIE | //PCIe interrupt enable,
197  EVG_IRQ_STOP_RAM(0) |
198  EVG_IRQ_STOP_RAM(1) |
199  EVG_IRQ_START_RAM(0) |
201 
202  WRITE32(m_pReg, IrqEnable, shadowIrqEnable);
203 }
#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 187 of file evgMrm.h.

187 { return m_input.end(); }

◆ getBusConfiguration()

const bus_configuration * evgMrm::getBusConfiguration ( )

Definition at line 429 of file evgMrm.cpp.

430 {
431  return &busConfiguration;
432 }

◆ getDbusStatus()

epicsUInt32 evgMrm::getDbusStatus ( ) const

Definition at line 239 of file evgMrm.cpp.

239  {
240  return READ32(m_pReg, Status)>>16;
241 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114

◆ 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 228 of file evgMrm.cpp.

229 {
230  return version().str();
231 }
MRFVersion version() const
Definition: evgMrm.cpp:223

◆ getId()

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

EVG

Definition at line 214 of file evgMrm.cpp.

214  {
215  return m_id;
216 }

◆ getInput()

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

Access functions

Definition at line 416 of file evgMrm.cpp.

416  {
417  evgInput* inp = m_input[ std::pair<epicsUInt32, InputType>(inpNum, type) ];
418  if(!inp)
419  throw std::runtime_error("Input not initialized");
420 
421  return inp;
422 }

◆ getRegAddr()

volatile epicsUInt8 * evgMrm::getRegAddr ( ) const

Definition at line 219 of file evgMrm.cpp.

219  {
220  return m_pReg;
221 }

◆ getResetMxc()

bool evgMrm::getResetMxc ( ) const
inline

Definition at line 92 of file evgMrm.h.

92 {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 234 of file evgMrm.cpp.

234  {
235  return MRF_VERSION;
236 }

◆ getTimerEvent()

epicsEvent * evgMrm::getTimerEvent ( )

Definition at line 425 of file evgMrm.cpp.

425  {
426  return &m_timerEvent;
427 }

◆ init_cb()

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

Definition at line 206 of file evgMrm.cpp.

206  {
207  callbackSetPriority(priority, ptr);
208  callbackSetCallback(fn, ptr);
209  callbackSetUser(valptr, ptr);
210  (ptr)->timer=NULL;
211 }

◆ isr()

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

Interrupt and Callback

Definition at line 315 of file evgMrm.cpp.

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

◆ isr_pci()

void evgMrm::isr_pci ( void *  arg)
static

Definition at line 280 of file evgMrm.cpp.

280  {
281  evgMrm *evg = static_cast<evgMrm*>(arg);
282 
283  // Call to the generic implementation
284  evg->isr(evg, true);
285 
286 #if defined(__linux__) || defined(_WIN32)
287 
291  if(devPCIEnableInterrupt(evg->m_pciDevice)) {
292  printf("PCI: Failed to enable interrupt\n");
293  return;
294  }
295 #endif
296 }
const epicsPCIDevice * m_pciDevice
Definition: evgMrm.h:155
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:315
Definition: evgMrm.h:56

◆ isr_poll()

void evgMrm::isr_poll ( void *  arg)
static

Definition at line 307 of file evgMrm.cpp.

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

◆ isr_vme()

void evgMrm::isr_vme ( void *  arg)
static

Definition at line 299 of file evgMrm.cpp.

299  {
300  evgMrm *evg = static_cast<evgMrm*>(arg);
301 
302  // Call to the generic implementation
303  evg->isr(evg, false);
304 }
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:315
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:223

◆ postSoftSecondsSrc()

void evgMrm::postSoftSecondsSrc ( )
virtual

Reimplemented from TimeStampSource.

Definition at line 393 of file evgMrm.cpp.

394 {
395  tickSecond();
396  scanIoRequest(ioScanTimestamp);
397 }
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:149
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 374 of file evgMrm.cpp.

374  {
375  void* pVoid;
376  callbackGetUser(pVoid, pCallback);
377  evgMrm* evg = static_cast<evgMrm*>(pVoid);
378 
379  {
380  interruptLock ig;
381  if(evg->irqExtInp_queued==2) {
382  evg->shadowIrqEnable |= EVG_IRQ_EXT_INP;
383  WRITE32(evg->getRegAddr(), IrqEnable, evg->shadowIrqEnable);
384  }
385  evg->irqExtInp_queued=0;
386  }
387 
388  evg->tickSecond();
389  scanIoRequest(evg->ioScanTimestamp);
390 }
#define EVG_IRQ_EXT_INP
Definition: evgRegMap.h:57
volatile epicsUInt8 * getRegAddr() const
Definition: evgMrm.cpp:219
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:149
void tickSecond()
Call just after the start of each second.
Definition: mrmtimesrc.cpp:160
unsigned char irqExtInp_queued
Definition: evgMrm.h:147
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
Definition: evgMrm.h:56

◆ resetMxc()

void evgMrm::resetMxc ( bool  reset)

Definition at line 272 of file evgMrm.cpp.

272  {
273  if(reset) {
274  SCOPED_LOCK(m_lock);
275  BITSET32(m_pReg, Control, EVG_MXC_RESET);
276  }
277 }
#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 400 of file evgMrm.cpp.

400  {
401  if(evtCode > 255)
402  throw std::runtime_error("Event Code out of range. Valid range: 0 - 255.");
403 
404  SCOPED_LOCK(m_lock);
405 
406  while(READ32(m_pReg, SwEvent) & SwEvent_Pend) {}
407 
408  WRITE32(m_pReg, SwEvent,
409  (evtCode<<SwEvent_Code_SHIFT)
410  |SwEvent_Ena);
411 }
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:113

◆ show()

void evgMrm::show ( int  lvl)

Definition at line 434 of file evgMrm.cpp.

435 {
436 }

◆ timeErrorScan()

IOSCANPVT evgMrm::timeErrorScan ( ) const
inline

Definition at line 96 of file evgMrm.h.

96 { return ioScanTimestamp; }
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:149

◆ 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 223 of file evgMrm.cpp.

224 {
225  return MRFVersion(READ32(m_pReg, FPGAVersion));
226 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define FPGAVersion
Definition: mrf.h:133

◆ writeonly()

epicsUInt32 evgMrm::writeonly ( ) const
inline

Definition at line 138 of file evgMrm.h.

138 { return 0; }

Member Data Documentation

◆ ioScanTimestamp

IOSCANPVT evgMrm::ioScanTimestamp

Definition at line 149 of file evgMrm.h.

◆ irqExtInp_cb

CALLBACK evgMrm::irqExtInp_cb

Definition at line 145 of file evgMrm.h.

◆ irqExtInp_queued

unsigned char evgMrm::irqExtInp_queued

Definition at line 147 of file evgMrm.h.

◆ m_buftx

mrmDataBufTx evgMrm::m_buftx

Definition at line 151 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 155 of file evgMrm.h.


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