mrfioc2  2.3.0
drvemIocsh.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2010 Brookhaven Science Associates, as Operator of
3 * Brookhaven National Laboratory.
4 * Copyright (c) 2015 Paul Scherrer Institute (PSI), Villigen, Switzerland
5 * mrfioc2 is distributed subject to a Software License Agreement found
6 * in file LICENSE that is included with this distribution.
7 \*************************************************************************/
8 /*
9  * Author: Michael Davidsaver <mdavidsaver@gmail.com>
10  */
11 
12 #include <cstdio>
13 #include <cstring>
14 
15 #include <stdexcept>
16 #include <sstream>
17 #include <map>
18 
19 #include <epicsString.h>
20 #include <errlog.h>
21 #include <drvSup.h>
22 #include <iocsh.h>
23 #include <initHooks.h>
24 #include <epicsExit.h>
25 
26 #include <devLibPCI.h>
27 #include <devcsr.h>
28 #include <epicsInterrupt.h>
29 #include <epicsThread.h>
30 #include <mrfCommonIO.h>
31 #include <mrfBitOps.h>
32 
33 #include "drvem.h"
34 #include "mrfcsr.h"
35 #include "mrmpci.h"
36 
37 #include <epicsExport.h>
38 
39 #include "drvemIocsh.h"
40 
41 // for htons() et al.
42 #ifdef _WIN32
43  #include <Winsock2.h>
44 #endif
45 
46 #include "evrRegMap.h"
47 #include "plx9030.h"
48 #include "plx9056.h"
49 #include "latticeEC30.h"
50 
51 #ifdef _WIN32
52  #define strtok_r(strToken,strDelimit,lasts ) (*(lasts) = strtok((strToken),(strDelimit)))
53 #endif
54 
55 
56 
57 static const iocshArg mrmEvrSetupPCIArg0 = { "name",iocshArgString};
58 static const iocshArg mrmEvrSetupPCIArg1 = { "PCI id or slot=#",iocshArgString};
59 static const iocshArg * const mrmEvrSetupPCIArgs[2] =
60 {&mrmEvrSetupPCIArg0,&mrmEvrSetupPCIArg1};
61 static const iocshFuncDef mrmEvrSetupPCIFuncDef =
62  {"mrmEvrSetupPCI",2,mrmEvrSetupPCIArgs};
63 static void mrmEvrSetupPCICallFunc(const iocshArgBuf *args)
64 {
65  mrmEvrSetupPCI(args[0].sval,args[1].sval);
66 }
67 
68 static const iocshArg mrmEvrSetupVMEArg0 = { "name",iocshArgString};
69 static const iocshArg mrmEvrSetupVMEArg1 = { "Bus number",iocshArgInt};
70 static const iocshArg mrmEvrSetupVMEArg2 = { "A32 base address",iocshArgInt};
71 static const iocshArg mrmEvrSetupVMEArg3 = { "IRQ Level 1-7 (0 - disable)",iocshArgInt};
72 static const iocshArg mrmEvrSetupVMEArg4 = { "IRQ vector 0-255",iocshArgInt};
73 static const iocshArg * const mrmEvrSetupVMEArgs[5] =
74 {&mrmEvrSetupVMEArg0,&mrmEvrSetupVMEArg1,&mrmEvrSetupVMEArg2,&mrmEvrSetupVMEArg3,&mrmEvrSetupVMEArg4};
75 static const iocshFuncDef mrmEvrSetupVMEFuncDef =
76  {"mrmEvrSetupVME",5,mrmEvrSetupVMEArgs};
77 static void mrmEvrSetupVMECallFunc(const iocshArgBuf *args)
78 {
79  mrmEvrSetupVME(args[0].sval,args[1].ival,args[2].ival,args[3].ival,args[4].ival);
80 }
81 
82 
83 static const iocshArg mrmEvrDumpMapArg0 = { "name",iocshArgString};
84 static const iocshArg mrmEvrDumpMapArg1 = { "Event code",iocshArgInt};
85 static const iocshArg mrmEvrDumpMapArg2 = { "Mapping select 0 or 1",iocshArgInt};
86 static const iocshArg * const mrmEvrDumpMapArgs[3] =
87 {&mrmEvrDumpMapArg0,&mrmEvrDumpMapArg1,&mrmEvrDumpMapArg2};
88 static const iocshFuncDef mrmEvrDumpMapFuncDef =
89  {"mrmEvrDumpMap",3,mrmEvrDumpMapArgs};
90 static void mrmEvrDumpMapCallFunc(const iocshArgBuf *args)
91 {
92  mrmEvrDumpMap(args[0].sval,args[1].ival,args[2].ival);
93 }
94 
95 
96 static const iocshArg mrmEvrForwardArg0 = { "name",iocshArgString};
97 static const iocshArg mrmEvrForwardArg1 = { "Event spec string",iocshArgString};
98 static const iocshArg * const mrmEvrForwardArgs[2] =
99 {&mrmEvrForwardArg0,&mrmEvrForwardArg1};
100 static const iocshFuncDef mrmEvrForwardFuncDef =
101  {"mrmEvrForward",2,mrmEvrForwardArgs};
102 static void mrmEvrForwardCallFunc(const iocshArgBuf *args)
103 {
104  mrmEvrForward(args[0].sval,args[1].sval);
105 }
106 
107 static const iocshArg mrmEvrLoopbackArg0 = { "name",iocshArgString};
108 static const iocshArg mrmEvrLoopbackArg1 = { "RX-loopback",iocshArgInt};
109 static const iocshArg mrmEvrLoopbackArg2 = { "TX-loopback",iocshArgInt};
110 static const iocshArg * const mrmEvrLoopbackArgs[3] =
111  {&mrmEvrLoopbackArg0,&mrmEvrLoopbackArg1,&mrmEvrLoopbackArg2};
112 static const iocshFuncDef mrmEvrLoopbackFuncDef =
113  {"mrmEvrLoopback",3,mrmEvrLoopbackArgs};
114 
115 static void mrmEvrLoopbackCallFunc(const iocshArgBuf *args)
116 {
117  mrmEvrLoopback(args[0].sval,args[1].ival,args[2].ival);
118 }
119 
120 static
121 void mrmsetupreg()
122 {
123  initHookRegister(&mrmEvrInithooks);
124  iocshRegister(&mrmEvrSetupPCIFuncDef,mrmEvrSetupPCICallFunc);
125  iocshRegister(&mrmEvrSetupVMEFuncDef,mrmEvrSetupVMECallFunc);
126  iocshRegister(&mrmEvrDumpMapFuncDef,mrmEvrDumpMapCallFunc);
127  iocshRegister(&mrmEvrForwardFuncDef,mrmEvrForwardCallFunc);
128  iocshRegister(&mrmEvrLoopbackFuncDef,mrmEvrLoopbackCallFunc);
129 }
130 
131 
132 static
133 drvet drvEvrMrm = {
134  2,
135  (DRVSUPFUN)mrmEvrReport,
136  NULL
137 };
138 extern "C"{
139 epicsExportRegistrar(mrmsetupreg);
140 epicsExportAddress (drvet, drvEvrMrm);
141 }
void epicsShareFunc mrmEvrLoopback(const char *id, int rxLoopback, int txLoopback)
Definition: drvemSetup.cpp:992
long epicsShareFunc mrmEvrReport(int level)
Definition: drvemSetup.cpp:371
void epicsShareFunc mrmEvrSetupVME(const char *id, int slot, int base, int level, int vector)
Definition: drvemSetup.cpp:753
void epicsShareFunc mrmEvrSetupPCI(const char *id, const char *pcispec)
Definition: drvemSetup.cpp:440
void epicsShareFunc mrmEvrDumpMap(const char *id, int evt, int ram)
Definition: drvemSetup.cpp:870
Definition: evrdump.c:37
epicsExportRegistrar(mrmsetupreg)
void epicsShareFunc mrmEvrInithooks(initHookState state)
Definition: drvemSetup.cpp:722
epicsExportAddress(drvet, drvEvrMrm)
void epicsShareFunc mrmEvrForward(const char *id, const char *events_iocsh)
Setup Event forwarding to downstream link.
Definition: drvemSetup.cpp:924