mrfioc2  2.3.0
Functions | Variables
drvemIocsh.h File Reference
#include <initHooks.h>
#include <shareLib.h>
Include dependency graph for drvemIocsh.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void epicsShareFunc mrmEvrSetupPCI (const char *id, const char *pcispec)
 
void epicsShareFunc mrmEvrSetupVME (const char *id, int slot, int base, int level, int vector)
 
void epicsShareFunc mrmEvrDumpMap (const char *id, int evt, int ram)
 
void epicsShareFunc mrmEvrForward (const char *id, const char *events_iocsh)
 Setup Event forwarding to downstream link. More...
 
void epicsShareFunc mrmEvrLoopback (const char *id, int rxLoopback, int txLoopback)
 
void epicsShareFunc mrmEvrInithooks (initHookState state)
 
long epicsShareFunc mrmEvrReport (int level)
 
void epicsShareFunc mrmEvrProbe (const char *id)
 

Variables

epicsShareExtern int evrmrmVerb
 Extra noise control. More...
 

Function Documentation

◆ mrmEvrDumpMap()

void epicsShareFunc mrmEvrDumpMap ( const char *  id,
int  evt,
int  ram 
)

Definition at line 870 of file drvemSetup.cpp.

871 {
872 try {
874  if(!obj)
875  throw std::runtime_error("Object not found");
876  EVRMRM *card=dynamic_cast<EVRMRM*>(obj);
877  if(!card)
878  throw std::runtime_error("Not a MRM EVR");
879 
880  printf("Print ram #%d\n",ram);
881  if(evt>=0){
882  // Print a single event
883  printRamEvt(card,evt,ram);
884  return;
885  }
886  for(evt=0;evt<=255;evt++){
887  printRamEvt(card,evt,ram);
888  }
889 } catch(std::exception& e) {
890  printf("Error: %s\n",e.what());
891 }
892 }
Modular Register Map Event Receivers.
Definition: drvem.h:86
Base object inspection.
Definition: object.h:378
static Object * getObject(const std::string &name)
Definition: object.cpp:107

◆ mrmEvrForward()

void epicsShareFunc mrmEvrForward ( const char *  id,
const char *  events_iocsh 
)

Setup Event forwarding to downstream link.

Control which events will be forwarded to the downstream event link when they are received on the upstream link. Useful when daisy chaining EVRs.

When invoked with the second argument as NULL or "" the current forward mapping is printed.

The second argument to this function is a comma seperated list of event numbers and/or the special token 'all'. If a token is prefixed with '-' then the mapping is cleared, otherwise it is set.

After a cold boot, no events are forwarded until/unless mrmrEvrForward is called.

> mrmEvrForward("EVR1") # Prints current mappings
Events forwarded: ...
> mrmEvrForward("EVR1", "-all") # Clear all forward mappings
# Clear all forward mappings except timestamp transmission
> mrmEvrForward("EVR1", "-all, 0x70, 0x71, 0x7A, 0x7D")
# Forward all except 42
> mrmEvrForward("EVR1", "all, -42")
Parameters
idEVR identifier
eventsA string with a comma seperated list of event specifiers

Definition at line 924 of file drvemSetup.cpp.

925 {
926  char *events=events_iocsh ? epicsStrDup(events_iocsh) : 0;
927 try {
929  if(!obj)
930  throw std::runtime_error("Object not found");
931  EVRMRM *card=dynamic_cast<EVRMRM*>(obj);
932  if(!card)
933  throw std::runtime_error("Not a MRM EVR");
934 
935  if(!events || strlen(events)==0) {
936  // Just print current mappings
937  printf("Events forwarded: ");
938  for(unsigned int i=1; i<256; i++) {
939  if(card->specialMapped(i, ActionEvtFwd)) {
940  printf("%d ", i);
941  }
942  }
943  printf("\n");
944  free(events);
945  return;
946  }
947 
948  // update mappings
949 
950  const char sep[]=", ";
951  char *save=0;
952 
953  for(char *tok=strtok_r(events, sep, &save);
954  tok!=NULL;
955  tok = strtok_r(0, sep, &save)
956  )
957  {
958  if(strcmp(tok, "-all")==0) {
959  for(unsigned int i=1; i<256; i++)
960  card->specialSetMap(i, ActionEvtFwd, false);
961 
962  } else if(strcmp(tok, "all")==0) {
963  for(unsigned int i=1; i<256; i++)
964  card->specialSetMap(i, ActionEvtFwd, true);
965 
966  } else {
967  char *end=0;
968  long e=strtol(tok, &end, 0);
969  if(*end || e==LONG_MAX || e==LONG_MIN) {
970  printf("Unable to parse event spec '%s'\n", tok);
971  } else if(e>255 || e<-255 || e==0) {
972  printf("Invalid event %ld\n", e);
973  } else if(e>0) {
974  card->specialSetMap(e, ActionEvtFwd, true);
975  } else if(e<0) {
976  card->specialSetMap(-e, ActionEvtFwd, false);
977  }
978 
979  }
980  }
981 
982 
983  free(events);
984 } catch(std::exception& e) {
985  printf("Error: %s\n",e.what());
986  free(events);
987 }
988 }
virtual bool specialMapped(epicsUInt32 code, epicsUInt32 func) const OVERRIDE FINAL
Definition: drvem.cpp:505
Modular Register Map Event Receivers.
Definition: drvem.h:86
virtual void specialSetMap(epicsUInt32 code, epicsUInt32 func, bool) OVERRIDE FINAL
Definition: drvem.cpp:524
Base object inspection.
Definition: object.h:378
static Object * getObject(const std::string &name)
Definition: object.cpp:107
#define ActionEvtFwd
Definition: evrRegMap.h:365

◆ mrmEvrInithooks()

void epicsShareFunc mrmEvrInithooks ( initHookState  state)

Definition at line 722 of file drvemSetup.cpp.

723 {
724  epicsUInt8 lvl;
725  switch(state)
726  {
727  case initHookAfterInterruptAccept:
728  // Register hook to disable interrupts on IOC shutdown
729  epicsAtExit(&evrShutdown, NULL);
730  // First enable interrupts for each EVR
731  mrf::Object::visitObjects(&enableIRQ,0);
732  // Then enable all used levels
733  for(lvl=1; lvl<=7; ++lvl)
734  {
735  if (vme_level_mask&(1<<(lvl-1))) {
736  if(devEnableInterruptLevelVME(lvl))
737  {
738  printf("Failed to enable interrupt level %d\n",lvl);
739  return;
740  }
741  }
742 
743  }
744 
745  break;
746  default:
747  break;
748  }
749 }
static void visitObjects(bool(*)(Object *, void *), void *)
Definition: object.cpp:150

◆ mrmEvrLoopback()

void epicsShareFunc mrmEvrLoopback ( const char *  id,
int  rxLoopback,
int  txLoopback 
)

Definition at line 992 of file drvemSetup.cpp.

993 {
994 try {
996  if(!obj)
997  throw std::runtime_error("Object not found");
998  EVRMRM *card=dynamic_cast<EVRMRM*>(obj);
999  if(!card){
1000  throw std::runtime_error("Not a MRM EVR");
1001  }
1002 
1003  epicsUInt32 control = NAT_READ32(card->base,Control);
1004  control &= ~(Control_txloop|Control_rxloop);
1005  if (rxLoopback) control |= Control_rxloop;
1006  if (txLoopback) control |= Control_txloop;
1007  NAT_WRITE32(card->base,Control, control);
1008 
1009 } catch(std::exception& e) {
1010  printf("Error: %s\n",e.what());
1011 }
1012 }
volatile unsigned char *const base
Definition: drvem.h:223
#define Control_rxloop
Definition: evrRegMap.h:60
Modular Register Map Event Receivers.
Definition: drvem.h:86
Base object inspection.
Definition: object.h:378
static Object * getObject(const std::string &name)
Definition: object.cpp:107
#define Control_txloop
Definition: evrRegMap.h:58
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
#define NAT_WRITE32(base, offset, value)
Definition: mrfCommonIO.h:148

◆ mrmEvrProbe()

void epicsShareFunc mrmEvrProbe ( const char *  id)

◆ mrmEvrReport()

long epicsShareFunc mrmEvrReport ( int  level)

Definition at line 371 of file drvemSetup.cpp.

372 {
373  printf("=== Begin MRF EVR support ===\n");
374  mrf::Object::visitObjects(&reportCard, (void*)&level);
375  printf("=== End MRF EVR support ===\n");
376  return 0;
377 }
static void visitObjects(bool(*)(Object *, void *), void *)
Definition: object.cpp:150

◆ mrmEvrSetupPCI()

void epicsShareFunc mrmEvrSetupPCI ( const char *  id,
const char *  pcispec 
)

Definition at line 440 of file drvemSetup.cpp.

441 {
442 try {
443  bus_configuration bus;
444 
445  bus.busType = busType_pci;
446 
447  if(mrf::Object::getObject(id)){
448  printf("Object ID %s already in use\n",id);
449  return;
450  }
451 
452  /* Linux only
453  * kernel driver interface version.
454  * 0 - Broken
455  * 1 - Use of irqcontrol callback to avoid races for plx pci bridges
456  * 2 - Use of new PCI master enable register to avoid races for soft pci bridges
457  */
458  int kifacever = -1;
459  if(checkUIOVersion(1,2,&kifacever))
460  return;
461 
462  const epicsPCIDevice *cur=0;
463 
464  if( devPCIFindSpec(mrmevrs, pcispec, &cur,0) ){
465  printf("PCI Device not found on %s\n",
466  pcispec);
467  return;
468  }
469 
470  printf("Device %s %x:%x.%x slot=%s\n",id,cur->bus,cur->device,cur->function,cur->slot);
471  printf("Using IRQ %u\n",cur->irq);
472 
473  bus.pci.dev = cur;
474 
475  const EVRMRM::Config *conf = NULL;
476  switch(cur->id.sub_device) {
477  case PCI_DEVICE_ID_MRF_PMCEVR_230: conf = &pmc_evr_230; break;
478  case PCI_DEVICE_ID_MRF_PXIEVR_230: conf = &cpci_evr_230; break;
479  case PCI_DEVICE_ID_MRF_EVRTG_300: conf = &cpci_evrtg_300; break;
480  case PCI_DEVICE_ID_MRF_CPCIEVR300: conf = &cpci_evr_300; break;
481  case PCI_DEVICE_ID_MRF_EVRMTCA300: conf = &mtca_evr_300; break;
482  // ambiguity
483  case PCI_DEVICE_ID_MRF_EVRTG_300E: // aka PCI_SUBDEVICE_ID_PCIE_EVR_300
484  switch (cur->id.device) {
485  case PCI_DEVICE_ID_EC_30: conf = &cpci_evrtg_300; break;
486  case PCI_DEVICE_ID_XILINX_DEV: conf = &pcie_evr_300; break;
487  }
488  break;
489  }
490 
491  if(!conf) {
492  printf("Unknown PCI EVR variant, making assumptions...\n");
493  conf = &cpci_evr_unknown;
494  }
495 
496  volatile epicsUInt8 *plx = 0, *evr = 0;
497  epicsUInt32 evrlen = 0;
498 
499  if(devPCIToLocalAddr(cur,0,(volatile void**)(void *)&evr,DEVLIB_MAP_UIO1TO1))
500  {
501  printf("PCI error: Failed to map BAR 0\n");
502  return;
503  }
504  if(!evr){
505  printf("PCI error: BAR 0 mapped to zero? (%08lx)\n", (unsigned long)evr);
506  return;
507  }
508  if( devPCIBarLen(cur,0,&evrlen) ) {
509  printf("PCI error: Can't find BAR #0 length\n");
510  return;
511  }
512 
513  switch(cur->id.device) {
516  plx = evr;
517 
518  if(devPCIToLocalAddr(cur,2,(volatile void**)(void *)&evr,DEVLIB_MAP_UIO1TO1))
519  {
520  printf("PCI error: Failed to map BAR 2\n");
521  return;
522  }
523  if(!evr){
524  printf("PCI error: BAR 2 mapped to zero? (%08lx)\n", (unsigned long)evr);
525  return;
526  }
527  if( devPCIBarLen(cur,0,&evrlen) ) {
528  printf("PCI error: Can't find BAR #0 length\n");
529  return;
530  }
531  }
532 
533  // handle various PCI to local bus bridges
534  switch(cur->id.device) {
536  printf("Setup PLX PCI 9030\n");
537  /* Use the PLX device on the EVR to swap access on
538  * little endian systems so we don't have no worry about
539  * byte order :)
540  */
541 #if EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG
542  BITSET(LE,32, plx, LAS0BRD, LAS0BRD_ENDIAN);
543 #elif EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE
544  BITCLR(LE,32, plx, LAS0BRD, LAS0BRD_ENDIAN);
545 #endif
546 
547  // Disable interrupts on device
548 
549  NAT_WRITE32(evr, IRQEnable, 0);
550 
551 #ifndef __linux__
552  /* Enable active high interrupt1 through the PLX to the PCI bus.
553  */
557 #endif
558  break;
559 
561 #if EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG
562  BITSET(LE,8, plx, BIGEND9056, BIGEND9056_BIG);
563 #elif EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE
564  BITCLR(LE,8, plx, BIGEND9056, BIGEND9056_BIG);
565 #endif
566 
567  // Disable interrupts on device
568 
569  NAT_WRITE32(evr, IRQEnable, 0);
570 
571 #ifndef __linux__
573 #endif
574  break;
575 
576  case PCI_DEVICE_ID_EC_30:
579  /* the endianness the 300 series devices w/o PLX bridge
580  * is a little tricky to setup. byte order swapping is controlled
581  * through the EVR's Control register and access to this register
582  * is subject to byte order swapping...
583  */
584 
585  // Disable EVR and set byte order to big endian
586  NAT_WRITE32(evr, Control, 0);
587  // Enable byte order swapping if necessary
588 #if EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE
589  BE_WRITE32(evr, Control, 0x02000000);
590 #endif
591 
592  // Disable interrupts on device
593  NAT_WRITE32(evr, IRQEnable, 0);
594 
595 #ifndef __linux__
597 #endif
598  break;
599  default:
600  printf("Unknown PCI bridge %04x\n", cur->id.device);
601  return;
602  }
603 
604  checkVersion(evr, 3, 6);
605 
606  // Acknowledge missed interrupts
607  //TODO: This avoids a spurious FIFO Full
608  NAT_WRITE32(evr, IRQFlag, NAT_READ32(evr, IRQFlag));
609 
610  // Install ISR
611 
612  EVRMRM *receiver=new EVRMRM(id,bus,conf,evr,evrlen);
613 
614  void *arg=receiver;
615 #ifdef __linux__
616  receiver->isrLinuxPvt = (void*)cur;
617 #endif
618 
619  if(devPCIConnectInterrupt(cur, &EVRMRM::isr_pci, arg, 0)){
620  printf("Failed to install ISR\n");
621  delete receiver;
622  return;
623  }else{
624  // Interrupts will be enabled during iocInit()
625  }
626 
627 
628 #ifndef __linux__
629  if(receiver->version()>=MRFVersion(0, 0xa)) {
630  // RTOS doesn't need this, so always enable
631  WRITE32(evr, PCI_MIE, EVG_MIE_ENABLE);
632  }
633 #else
634  if(receiver->version()>=MRFVersion(0, 0xa) && kifacever>=2) {
635  // PCI master enable supported by firmware and kernel module.
636  // the kernel will set this bit when devPCIEnableInterrupt() is called
637  } else if(cur->id.device==PCI_DEVICE_ID_PLX_9030 ||
638  cur->id.device==PCI_DEVICE_ID_PLX_9056) {
639  // PLX based devices don't need special handling
640  WRITE32(evr, PCI_MIE, EVG_MIE_ENABLE);
641  } else if(receiver->version()<MRFVersion(0, 0xa)) {
642  // old firmware and (maybe) old kernel module.
643  // this will still work, so just complain
644  printf("Warning: this configuration of FW and SW is known to have race conditions in interrupt handling.\n"
645  " Please consider upgrading to FW version 0xA.\n");
646  if(kifacever<2)
647  printf(" Also upgrade the linux kernel module to interface version 2.");
648  } else if(receiver->version()>=MRFVersion(0, 0xa) && kifacever<2) {
649  // New firmware w/ old kernel module, this won't work
650  throw std::runtime_error("FW version 0xA for this device requires a linux kernel module w/ interface version 2");
651  } else {
652  throw std::logic_error("logic error in FW/kernel module compatibility check.");
653  }
654 
655  /* ask the kernel module to enable interrupts */
656  printf("Enabling interrupts\n");
657  if(devPCIEnableInterrupt(cur)) {
658  printf("Failed to enable interrupt\n");
659  delete receiver;
660  return;
661  }
662 #endif
663 
664 } catch(std::exception& e) {
665  printf("Error: %s\n",e.what());
666 }
667  errlogFlush();
668 }
enum busType busType
#define BITSET32(base, offset, mask)
Definition: mrfCommonIO.h:124
#define BITCLR(ord, len, base, offset, mask)
Definition: mrfBitOps.h:26
#define LE_WRITE16(base, offset, value)
Definition: mrfCommonIO.h:199
#define IRQ_PCIee
Definition: mrf.h:119
#define PCI_DEVICE_ID_MRF_PMCEVR_230
Definition: mrmpci.h:33
#define IRQEnable
Definition: mrf.h:115
#define PCI_DEVICE_ID_MRF_EVRMTCA300
Definition: uio_mrf.c:74
#define LAS0BRD
Definition: mrf.h:41
static void isr_pci(void *)
Definition: drvem.cpp:1107
#define BE_WRITE32(base, offset, value)
Definition: mrfCommonIO.h:170
Modular Register Map Event Receivers.
Definition: drvem.h:86
#define PCI_DEVICE_ID_MRF_PXIEVR_230
Definition: mrmpci.h:34
#define BIGEND9056
Definition: mrf.h:74
static Object * getObject(const std::string &name)
Definition: object.cpp:107
#define BIGEND9056_BIG
Definition: plx9056.h:21
#define PCI_DEVICE_ID_XILINX_DEV
Definition: uio_mrf.c:48
#define PCI_DEVICE_ID_EC_30
Definition: uio_mrf.c:46
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
#define IRQFlag
Definition: mrf.h:106
struct configuration_pci pci
const epicsPCIDevice * dev
#define LAS0BRD_ENDIAN
Definition: plx9030.h:24
#define INTCSR9056
Definition: mrf.h:77
#define PCI_DEVICE_ID_MRF_EVRTG_300E
Definition: mrmpci.h:36
#define PCI_DEVICE_ID_MRF_EVRTG_300
Definition: mrmpci.h:35
#define INTCSR_INT1_Polarity
Definition: plx9030.h:29
#define EVG_MIE_ENABLE
Definition: evgRegMap.h:64
#define NAT_WRITE32(base, offset, value)
Definition: mrfCommonIO.h:148
virtual MRFVersion version() const OVERRIDE FINAL
Firmware Version.
Definition: drvem.cpp:415
#define INTCSR
Definition: mrf.h:46
#define BITSET(ord, len, base, offset, mask)
Definition: mrfBitOps.h:21
void checkVersion(volatile epicsUInt8 *base, const MRFVersion &required, const MRFVersion &recommended)
Definition: evgInit.cpp:165
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
#define PCI_DEVICE_ID_PLX_9056
Definition: uio_mrf.c:51
#define INTCSR9056_LCL_Enable
Definition: plx9056.h:25
#define PCI_DEVICE_ID_PLX_9030
Definition: uio_mrf.c:50
#define INTCSR_INT1_Enable
Definition: plx9030.h:28
#define INTCSR_PCI_Enable
Definition: plx9030.h:34
#define INTCSR9056_PCI_Enable
Definition: plx9056.h:24
#define PCI_DEVICE_ID_MRF_CPCIEVR300
Definition: mrmpci.h:50

◆ mrmEvrSetupVME()

void epicsShareFunc mrmEvrSetupVME ( const char *  id,
int  slot,
int  base,
int  level,
int  vector 
)

Definition at line 753 of file drvemSetup.cpp.

754 {
755 try {
756  bus_configuration bus;
757  const EVRMRM::Config *conf = &vme_evrrf_230;
758 
759  bus.busType = busType_vme;
760  bus.vme.slot = slot;
761  bus.vme.address = base;
762  bus.vme.irqLevel = level;
763  bus.vme.irqVector = vector;
764 
765  if(mrf::Object::getObject(id)){
766  printf("ID %s already in use\n",id);
767  return;
768  }
769 
770  struct VMECSRID info;
771 
772  volatile unsigned char* csr=devCSRTestSlot(vmeevrs,slot,&info);
773  if(!csr){
774  printf("No EVR in slot %d\n",slot);
775  return;
776  }
777 
778  printf("Setting up EVR in VME Slot %d\n",slot);
779 
780  printf("Found vendor: %08x board: %08x rev.: %08x\n",
781  info.vendor, info.board, info.revision);
782 
783  // Set base address
784 
785  /* Use function 0 for 16-bit addressing (length 0x00800 bytes)
786  * and function 1 for 24-bit addressing (length 0x10000 bytes)
787  * and function 2 for 32-bit addressing (length 0x40000 bytes)
788  *
789  * All expose the same registers, but not all registers are
790  * visible through functions 0 or 1.
791  */
792 
793  CSRSetBase(csr, 2, base, VME_AM_EXT_SUP_DATA);
794 
795  {
796  epicsUInt32 temp=CSRRead32((csr) + CSR_FN_ADER(2));
797 
798  if(temp != CSRADER((epicsUInt32)base,VME_AM_EXT_SUP_DATA)) {
799  printf("Failed to set CSR Base address in ADER2. Check VME bus and card firmware version.\n");
800  return;
801  }
802  }
803 
804  volatile unsigned char* evr;
805  char *Description = allocSNPrintf(40, "EVR-%d '%s' slot %d",
806  info.board & MRF_BID_SERIES_MASK,
807  id, slot);
808 
809  if(devRegisterAddress(Description, atVMEA32, base, EVR_REGMAP_SIZE, (volatile void**)(void *)&evr))
810  {
811  printf("Failed to map address %08x\n",base);
812  return;
813  }
814 
815  epicsUInt32 junk;
816  if(devReadProbe(sizeof(junk), (volatile void*)(evr+U32_FWVersion), (void*)&junk)) {
817  printf("Failed to read from MRM registers (but could read CSR registers)\n");
818  return;
819  }
820 
821  checkVersion(evr, 4, 5);
822 
823  // Read offset from start of CSR to start of user (card specific) CSR.
824  size_t user_offset=CSRRead24(csr+CR_BEG_UCSR);
825  // Currently that value read from the UCSR pointer is
826  // actually little endian.
827  user_offset= (( user_offset & 0x00ff0000 ) >> 16 ) |
828  (( user_offset & 0x0000ff00 ) ) |
829  (( user_offset & 0x000000ff ) << 16 );
830  volatile unsigned char* user_csr=csr+user_offset;
831 
832  NAT_WRITE32(evr, IRQEnable, 0); // Disable interrupts
833 
834  EVRMRM *receiver=new EVRMRM(id, bus, conf, evr, EVR_REGMAP_SIZE);
835 
836  if(level>0 && vector>=0) {
837  CSRWrite8(user_csr+UCSR_IRQ_LEVEL, level&0x7);
838  CSRWrite8(user_csr+UCSR_IRQ_VECTOR, vector&0xff);
839 
840  printf("Using IRQ %d:%2d\n",
841  CSRRead8(user_csr+UCSR_IRQ_LEVEL),
842  CSRRead8(user_csr+UCSR_IRQ_VECTOR)
843  );
844 
845  // Acknowledge missed interrupts
846  //TODO: This avoids a spurious FIFO Full
847  NAT_WRITE32(evr, IRQFlag, NAT_READ32(evr, IRQFlag));
848 
849  level&=0x7;
850  // VME IRQ level will be enabled later during iocInit()
851  vme_level_mask|=1<<(level-1);
852 
853  if(devConnectInterruptVME(vector&0xff, &EVRMRM::isr_vme, receiver))
854  {
855  printf("Failed to connection VME IRQ %d\n",vector&0xff);
856  delete receiver;
857  return;
858  }
859 
860  // Interrupts will be enabled during iocInit()
861  }
862 
863 } catch(std::exception& e) {
864  printf("Error: %s\n",e.what());
865 }
866  errlogFlush();
867 }
struct configuration_vme vme
enum busType busType
#define U32_FWVersion
Definition: evrRegMap.h:136
#define IRQEnable
Definition: mrf.h:115
static void isr_vme(void *)
Definition: drvem.cpp:1121
Modular Register Map Event Receivers.
Definition: drvem.h:86
#define UCSR_IRQ_LEVEL
Definition: mrfcsr.h:59
#define MRF_BID_SERIES_MASK
Definition: mrfcsr.h:31
char * allocSNPrintf(size_t N, const char *fmt,...)
Definition: mrfCommon.cpp:59
static Object * getObject(const std::string &name)
Definition: object.cpp:107
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
#define IRQFlag
Definition: mrf.h:106
#define EVR_REGMAP_SIZE
Definition: evrRegMap.h:380
#define NAT_WRITE32(base, offset, value)
Definition: mrfCommonIO.h:148
#define UCSR_IRQ_VECTOR
Definition: mrfcsr.h:60
void checkVersion(volatile epicsUInt8 *base, const MRFVersion &required, const MRFVersion &recommended)
Definition: evgInit.cpp:165

Variable Documentation

◆ evrmrmVerb

epicsShareExtern int evrmrmVerb

Extra noise control.

Controls level of extra diagnositic output from the EVR MRM device support. Error messages are always printed.

0 - No output 1 - Basic Startup 2 - Extended startup some "write" 3 - All "write" (output record processing) 4 - Some "read" (input record processing) and IRQ

Definition at line 33 of file drvemIocsh.h.