Skip to content
Snippets Groups Projects
softGlue.iocsh 12.1 KiB
Newer Older
mooney's avatar
mooney committed
# BEGIN softGlue.iocsh ----------------------------------------------------------
# This must run after industryPack.cmd, from the iocsh

epicsEnvSet("IPCARRIER", "0")
epicsEnvSet("IPSLOT", "2")
epicsEnvSet("PORT1", "SGIO_1")
epicsEnvSet("PORT2", "SGIO_2")
epicsEnvSet("PORT3", "SGIO_3")
epicsEnvSet("SPORT", "SOFTGLUE")
epicsEnvSet("PREFIX", "yyy:")
epicsEnvSet("INSTANCE", "softGlue:")
epicsEnvSet("CONFIG", "SG")
epicsEnvSet("READEVENT", "10")


#devAsynSoftGlueDebug=1
#drvIP_EP201Debug=1

################################################################################
#    Initialize the FPGA
#-----------------------
#    Write content to the FPGA.    This command will fail if the FPGA already
#    has content loaded, as it will after a soft reboot.  To load new FPGA
#    content, you must power cycle the ioc.
#
#    initIP_EP200_FPGA(ushort carrier, ushort slot, char *filename)
#    carrier:  IP-carrier number (numbering begins at 0)
#    slot:     IP-slot number (numbering begins at 0)
#    filename: Name of the FPGA-content hex file to load into the FPGA.
#

#    standard softGlue 2.2
#initIP_EP200_FPGA($(IPCARRIER), $(IPSLOT), "$(SOFTGLUE)/softGlueApp/Db/SoftGlue_2_2.hex")
#    standard softGlue 2.2 plus two shift registers
#initIP_EP200_FPGA($(IPCARRIER), $(IPSLOT), "$(SOFTGLUE)/softGlueApp/Db/SoftGlue_2_2_Octupole_0_0.hex")
#    standard softGlue 2.2 plus two up/down counters plus two quadrature decoders
#initIP_EP200_FPGA($(IPCARRIER), $(IPSLOT), "$(SOFTGLUE)/softGlueApp/Db/SoftGlue_2_2_Encoder.hex")
#    standard softGlue 2.2 plus four four-output demultiplexers
#initIP_EP200_FPGA($(IPCARRIER), $(IPSLOT), "$(SOFTGLUE)/softGlueApp/Db/SoftGlue_2_2_demux4.hex")
#    standard softGlue 2.2 plus two 32-bit up/down counters plus two quadrature decoders plus
#    one 32-bit mgnitude comparator plus 1 8-bit up/down counter.
mooney's avatar
mooney committed
initIP_EP200_FPGA($(IPCARRIER), $(IPSLOT), "$(SOFTGLUE)/softGlueApp/Db/SoftGlue_2_2_encoder_ave.hex")
mooney's avatar
mooney committed

################################################################################
#    Initialize basic field I/O 
#------------------------------
#    int initIP_EP200(ushort carrier, ushort slot, char *portName1,
#        char *portName2, char *portName3, int sopcBase)
#    carrier:   IP-carrier number (numbering begins at 0)
#    slot:      IP-slot number (numbering begins at 0)
#    portName1: Name of asyn port for component at sopcBase
#    portName2: Name of asyn port for component at sopcBase+0x10
#    portName3: Name of asyn port for component at sopcBase+0x20
#    sopcBase:  must agree with FPGA content (0x800000)
initIP_EP200($(IPCARRIER), $(IPSLOT), "$(PORT1)", "$(PORT2)", "$(PORT3)", 0x800000)

################################################################################
#    Initialize field-I/O interrupt support
#------------------------------------------
#    int initIP_EP200_Int(ushort carrier, ushort slot, int intVectorBase,
#        int risingMaskMS, int risingMaskLS, int fallingMaskMS,
#        int fallingMaskLS)
#    carrier:       IP-carrier number (numbering begins at 0)
#    slot:          IP-slot number (numbering begins at 0)
#    intVectorBase: must agree with the FPGA content loaded (0x90 for softGlue
#                   2.1 and higher; 0x80 for softGlue 2.0 and lower).  softGlue
#                   uses three vectors, for example, 0x90, 0x91, 0x92.
#    risingMaskMS:  interrupt on 0->1 for I/O pins 33-48
#    risingMaskLS:  interrupt on 0->1 for I/O pins 1-32
#    fallingMaskMS: interrupt on 1->0 for I/O pins 33-48
#    fallingMaskLS: interrupt on 1->0 for I/O pins 1-32
initIP_EP200_Int($(IPCARRIER), $(IPSLOT), 0x90, 0x0, 0x0, 0x0, 0x0)

################################################################################
#    Set field-I/O data direction
#--------------------------------
#    int initIP_EP200_IO(ushort carrier, ushort slot, ushort moduleType,
#        ushort dataDir)
#    carrier:    IP-carrier number (numbering begins at 0)
#    slot:       IP-slot number (numbering begins at 0)
#    moduleType: one of [201, 202, 203, 204]
#    dataDir:    Bit mask, in which only the first 9 bits are significant.  The
#                meaning of each bit depends on moduleType, as shown in the
#                table below.  If a bit is set, the corresponding field I/O pins
#                are outputs.  Note that for the 202 and 204 modules, all I/O
#                is differential, and I/O pin N is paired with pin N+1.  For the
#                203 module, pins 25/26 through 47/48 are differential pairs.
#
#    -------------------------------------------------------------------
#    |  Correspondence between dataDir bits (0-8) and I/O pins (1-48)  |
#    -------------------------------------------------------------------
#    |             |  201          |  202/204           |  203         | 
#    -------------------------------------------------------------------
#    | bit 0       |  pins 1-8     |  pins 1, 3,25,27   |  pins 25,27  | 
#    | bit 1       |  pins 9-16    |  pins 5, 7,29,31   |  pins 29,31  | 
#    | bit 2       |  pins 17-24   |  pins 9,11,33,35   |  pins 33,35  | 
#    | bit 3       |  pins 25-32   |  pins 13,15,37,39  |  pins 37,39  | 
#    |             |               |                    |              |
#    | bit 4       |  pins 33-40   |  pins 17,19,41,43  |  pins 41,43  | 
#    | bit 5       |  pins 41-48   |  pins 21,23,45,47  |  pins 45,47  | 
#    | bit 6       |         x     |            x       |  pins 1-8    | 
#    | bit 7       |         x     |            x       |  pins 9-16   | 
#    |             |               |                    |              |
#    | bit 8       |         x     |            x       |  pins 17-24  | 
#    -------------------------------------------------------------------
#    Examples:
#    1. For the IP-EP201, moduleType is 201, and dataDir == 0x3c would mean
#       that I/O bits 17-48 are outputs.
#    2. For the IP-EP202 (IP-EP204), moduleType is 202(204), and dataDir == 0x13
#       would mean that I/O bits 1,3,25,27, 5,7,29,31, 17,19,41,43 are outputs.
#    3. For the IP-EP203, moduleType is 203, and dataDir == 0x??? would mean
#       that I/O bits 1-8, 25,27, 29,31, 33,35, 45,47 are outputs.
#initIP_EP200_IO($(IPCARRIER), $(IPSLOT), 201, 0x3c)
initIP_EP200_IO($(IPCARRIER), $(IPSLOT), 201, 0xc)
#initIP_EP200_IO($(IPCARRIER), $(IPSLOT), 202, 0x13)

#-------------------------------------------------------------------------------
#    For backward compatibility with softGlue 2.1 and earlier, the following
#    command can be used to initialize an IP_EP201 module, instead of the
#    above calls to initIP_EP200(), initIP_EP200_Int(), and initIP_EP200_IO().
#    This won't work for any other IP_EP200 module
#
#    int initIP_EP201(char *portName, ushort carrier, ushort slot,
#        int msecPoll, int dataDir, int sopcOffset, int interruptVector,
#        int risingMask, int fallingMask)
#    portName: Name of asyn port for component at sopcOffset
#    carrier:         IP-carrier number (numbering begins at 0)
#    slot:            IP-slot number (numbering begins at 0)
#    msecPoll:        Time interval between driver polls of field I/O bits
#    dataDir:         Data direction for I/O bits, explained below.
#    sopcOffset:      SOPC offset (must be as in example below).
#    interruptVector: Must agree with the FPGA content loaded (0x90, 0x91,
#                     0x92 for softGlue 2.1 and higher; 0x80, 0x81, 0x82 for
#                     softGlue 2.0 and lower).
#    risingMask:      16-bit mask: if a bit is 1, the corresponding I/O bit will
#                     generate an interrupt when its value goes from 0 to 1.
#                     Bit 0 corresponds to field I/O pin 1, bit 1 to pin 2, etc.
#    fallingMask:     Similar to risingMask, but for 1-to-0 transitions.
#
#                     Note that the user can overwrite risingMask and
#                     fallingMask at run time, with menu selections, and
#                     probably has those selections autosaved.
#    dataDir is a bit mask in which only bits 0 and 8 are significant.
#         for sopcOffset 0x800000
#             If bit 0 of dataDir is set, I/O bits 1-8 are outputs.
#             If bit 8 of dataDir is set, I/O bits 9-16 are outputs.
#         for sopcOffset 0x800010
#             If bit 0 of dataDir is set, I/O bits 17-24 are outputs.
#             If bit 8 of dataDir is set, I/O bits 25-32 are outputs.
#         for sopcOffset 0x800020
#             If bit 0 of dataDir is set, I/O bits 33-40 are outputs.
#             If bit 8 of dataDir is set, I/O bits 41-48 are outputs.
#!initIP_EP201("$(PORT1)",$(IPCARRIER),$(IPSLOT),1000000,0x101,0x800000,0x90,0x00,0x00)
#!initIP_EP201("$(PORT2)",$(IPCARRIER),$(IPSLOT),1000000,0x101,0x800010,0x91,0x00,0x00)
#!initIP_EP201("$(PORT3)",$(IPCARRIER),$(IPSLOT),1000000,0x101,0x800020,0x92,0x00,0x00)

################################################################################
#    Initialize softGlue signal-name support
#-------------------------------------------
#    All instances of a single-register component are initialized with a single
#    call, as follows:
#
#initIP_EP201SingleRegisterPort(char *portName, ushort carrier, ushort slot)
#
# For example:
# initIP_EP201SingleRegisterPort("$(SPORT)", $(IPCARRIER), $(IPSLOT))
initIP_EP201SingleRegisterPort("$(SPORT)", $(IPCARRIER), $(IPSLOT))


################################################################################
#    Load databases
#------------------
#    Load a single database that all database fragments supporting
#    single-register components can use to show which signals are connected
#    together.  This database is not needed for the functioning of the
#    components, it's purely for the user interface.
dbLoadRecords("$(SOFTGLUE)/db/softGlue_SignalShow.db","P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

#    Load a set of database fragments for each single-register component.
# This database contains the records for standard softGlue, and must be loaded
# for all .hex files above 
dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAContent.db", "P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

# This database contains the additional records needed for
# SoftGlue_2_2_Octupole_0_0.hex
#dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAContent_octupole.db", "P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

# This database contains the additional records needed for
# SoftGlue_2_2_Encoder.hex
#dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAContent_Encoder.db", "P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

# This database contains the additional records needed for
# SoftGlue_2_2_demux4.hex
#dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAContent_4DEMUX4.db", "P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

# This database contains the additional records needed for
# SoftGlue_2_2_encoder_ave.hex
dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAContent_EncoderAvg.db", "P=$(PREFIX),H=$(INSTANCE),PORT=$(SPORT),READEVENT=$(READEVENT)")

#    Interrupt support.
dbLoadRecords("$(SOFTGLUE)/db/softGlue_FPGAInt.db","P=$(PREFIX),H=$(INSTANCE),PORT1=$(PORT1),PORT2=$(PORT2),PORT3=$(PORT3),FIFO=10")

#    Some stuff just for convenience: software clock and pulse generators, and
#    a couple of busy records.
dbLoadRecords("$(SOFTGLUE)/db/softGlue_convenience.db", "P=$(PREFIX),H=$(INSTANCE)")

# Menu of softGlue circuits
# configMenu example.  See create_manual_set() command after iocInit.
dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=$(PREFIX),CONFIG=$(CONFIG)")
# Note that the request file MUST be named $(CONFIG)Menu.req.  If the macro
# CONFIGMENU is defined with any value, backup (".savB") and sequence files
# (".savN") will not be written.  We don't want these for configMenu.
doAfterIocInit("create_manual_set('$(CONFIG)Menu.req','P=$(PREFIX),CONFIG=$(CONFIG),H=$(INSTANCE),CONFIGMENU=1')")

# Register included example of a custom softGlue interrupt-service routine.
# This is for interrupts that occur too closely spaced in time for softGlue's
# normal interrupt service (an output link to an EPICS record) to handle.
#sampleCustomInterruptPrepare($(IPCARRIER), $(IPSLOT), 0x800010, 0x1)

# END softGlue.cmd ------------------------------------------------------------