def getVFATID(OH_NUM, vfat_slot): # try: vfat_id1 = 0x000000ff & parseInt( readReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.GEB.VFATS.VFAT' + str(vfat_slot) + '.ChipID1'))) vfat_id2 = 0x000000ff & parseInt( readReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.GEB.VFATS.VFAT' + str(vfat_slot) + '.ChipID0'))) vfat_id = (vfat_id1 << 8) + vfat_id2 if vfat_id == 0: return 0 return vfat_id
def configureT1(OH_NUM, MODE, TYPE, INTERVAL, NUMBER, Silent=False): if not Silent: print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.MODE'), MODE) print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.TYPE'), TYPE) print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.INTERVAL'), INTERVAL) print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.NUMBER'), NUMBER) else: writeReg(getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.MODE'), MODE) writeReg(getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.TYPE'), TYPE) writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.INTERVAL'), INTERVAL) writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.NUMBER'), NUMBER)
def readBlock(register, nwords, debug=False): """ read block 'register' returns 'nwords' values in the register """ global gRetries nRetries = 0 m_node = getNode(register) if m_node is None: print colors.MAGENTA,"NODE %s NOT FOUND" %(register),colors.ENDC return 0x0 p = (c_uint32*nwords)() words = [] if (debug): print "reading %d words from register %s"%(nwords,register) res = rBlock(m_node.real_address,p,len(p)) if (res == 0): words = list(p) if (debug): print "ReadBlock result:\n" print words return words else: print colors.RED, "error encountered, retried read operation (%d)"%(nRetries),colors.ENDC nRetries += 1 return words
def writeRegister(self, register, value, debug=False): """ write value 'value' into register 'register' using remote procedure call """ global gRetries nRetries = 0 #m_node = self.getNode(register) m_node = getNode(register) if m_node is None: print colors.MAGENTA,"NODE %s NOT FOUND"%(register),colors.ENDC return 0x0 if debug: print "Trying to write\n" print m_node.output() while (nRetries < gMAX_RETRIES): rsp = writeReg(m_node, value) if "permission" in rsp: print colors.MAGENTA,"NO WRITE PERMISSION",colors.ENDC return elif "Error" in rsp: print colors.MAGENTA,"write error encountered (%s), retrying operation (%d,%d)"%(register,nRetries,gRetries),colors.ENDC return elif "0xdeaddead" in rsp: print colors.MAGENTA,"0xdeaddead found (%s), retrying operation (%d,%d)"%(register,nRetries,gRetries),colors.ENDC return else: return
def writeRegister(self, register, value, debug=False): """ write value 'value' into register 'register' using remote procedure call """ global gRetries nRetries = 0 #m_node = self.getNode(register) m_node = getNode(register) if m_node is None: print colors.MAGENTA, "NODE %s NOT FOUND" % (register), colors.ENDC return 0x0 if debug: print "Trying to write\n" print m_node.output() while (nRetries < gMAX_RETRIES): rsp = writeReg(m_node, value) if "permission" in rsp: print colors.MAGENTA, "NO WRITE PERMISSION", colors.ENDC return elif "Error" in rsp: print colors.MAGENTA, "write error encountered (%s), retrying operation (%d,%d)" % ( register, nRetries, gRetries), colors.ENDC return elif "0xdeaddead" in rsp: print colors.MAGENTA, "0xdeaddead found (%s), retrying operation (%d,%d)" % ( register, nRetries, gRetries), colors.ENDC return else: return
def readBlock(register, nwords, debug=False): """ read block 'register' returns 'nwords' values in the register """ global gRetries nRetries = 0 m_node = getNode(register) if m_node is None: print colors.MAGENTA, "NODE %s NOT FOUND" % (register), colors.ENDC return 0x0 p = (c_uint32 * nwords)() words = [] if (debug): print "reading %d words from register %s" % (nwords, register) res = rBlock(m_node.real_address, p, len(p)) if (res == 0): words = list(p) if (debug): print "ReadBlock result:\n" print words return words else: print colors.RED, "error encountered, retried read operation (%d)" % ( nRetries), colors.ENDC nRetries += 1 return words
def readRegister(self, register, debug=False): """ read register 'register' using remote procedure call returns value of the register """ global gRetries nRetries = 0 m_node = getNode(register) if m_node is None: print colors.MAGENTA,"NODE %s NOT FOUND" %(register),colors.ENDC return 0x0 elif 'r' not in m_node.permission: print colors.MAGENTA,"No read permission for register %s" %(register),colors.ENDC return 0x0 if debug: print "Trying to read\n" print m_node.output() while (nRetries<gRetries): res = rReg(parseInt(m_node.real_address)) if res == 0xdeaddead: print colors.MAGENTA,"Bus error encountered while reading (%s), retrying operation (%d,%d)"%(register,nRetries,gRetries),colors.ENDC continue else: if m_node.mask is not None: shift_amount=0 for bit in reversed('{0:b}'.format(m_node.mask)): if bit=='0': shift_amount+=1 else: break fin_res = (res&m_node.mask)>>shift_amount else: fin_res = res if debug: print "Read register result: %s" %(fin_res) return fin_res return 0xdeaddead
def T1On(OH_NUM): prevent_infiteloop = 0 while parseInt( readReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.MONITOR'))) != 1: print 'MONITOR:', readReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.MONITOR')) prevent_infiteloop += 1 print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.T1Controller.TOGGLE'), 0xffffffff) if prevent_infiteloop > 10: printRed( 'T1Controller Error - Will not toggle T1Controller Monitor') return False return True
def verifyTCReset(OH_NUM): nSbits = readReg( getNode('GEM_AMC.TRIGGER.OH' + str(OH_NUM) + '.TRIGGER_CNT')) try: parseInt(nSbits) except: return False, nSbits if parseInt(nSbits) != 0: #Hot channels? return False, nSbits else: return True, 0
def scaInit(args, isReset=False): ohList = getOHlist(args.ohMask) parseXML() hostname = socket.gethostname() if 'eagle' in hostname: pass else: hostname = args.cardName rpc_connect(args.cardName) initJtagRegAddrs() heading("Hola, I'm SCA controller tester :)") if not checkStatus(ohList): if not isReset: exit() writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.LINK_ENABLE_MASK'), args.ohMask) return ohList
def readRegister(self, register, debug=False): """ read register 'register' using remote procedure call returns value of the register """ global gRetries nRetries = 0 m_node = getNode(register) if m_node is None: print colors.MAGENTA, "NODE %s NOT FOUND" % (register), colors.ENDC return 0x0 elif 'r' not in m_node.permission: print colors.MAGENTA, "No read permission for register %s" % ( register), colors.ENDC return 0x0 if debug: print "Trying to read\n" print m_node.output() while (nRetries < gRetries): res = rReg(parseInt(m_node.real_address)) if res == 0xdeaddead: print colors.MAGENTA, "Bus error encountered while reading (%s), retrying operation (%d,%d)" % ( register, nRetries, gRetries), colors.ENDC continue else: if m_node.mask is not None: shift_amount = 0 for bit in reversed('{0:b}'.format(m_node.mask)): if bit == '0': shift_amount += 1 else: break fin_res = (res & m_node.mask) >> shift_amount else: fin_res = res if debug: print "Read register result: %s" % (fin_res) return fin_res return 0xdeaddead
def setVFATRunMode(OH_NUM, VFAT_SLOT, Silent=False): if int(OH_NUM) < 0 or int(OH_NUM) > 3 or int(VFAT_SLOT) < 0 or int( VFAT_SLOT) > 23: return False REG_PATH = 'GEM_AMC.OH.OH' + str(OH_NUM) + '.GEB.VFATS.VFAT' + str( VFAT_SLOT) + '.' try: if not Silent: print writeReg(getNode(REG_PATH + 'ContReg0'), CONTREG0) print writeReg(getNode(REG_PATH + 'ContReg1'), CONTREG1) print writeReg(getNode(REG_PATH + 'ContReg2'), CONTREG2) print writeReg(getNode(REG_PATH + 'ContReg3'), CONTREG3) print writeReg(getNode(REG_PATH + 'IPreampIn'), IPREAMPIN) print writeReg(getNode(REG_PATH + 'IPreampFeed'), IPREAMPFEED) print writeReg(getNode(REG_PATH + 'IPreampOut'), IPREAMPOUT) print writeReg(getNode(REG_PATH + 'IShaper'), ISHAPER) print writeReg(getNode(REG_PATH + 'IShaperFeed'), ISHAPERFEED) print writeReg(getNode(REG_PATH + 'IComp'), ICOMP) print writeReg(getNode(REG_PATH + 'VThreshold1'), VTHRESHOLD1) print writeReg(getNode(REG_PATH + 'VCal'), VCAL) print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.CONTROL.TRIGGER'), 1) else: writeReg(getNode(REG_PATH + 'ContReg0'), CONTREG0) writeReg(getNode(REG_PATH + 'ContReg1'), CONTREG1) writeReg(getNode(REG_PATH + 'ContReg2'), CONTREG2) writeReg(getNode(REG_PATH + 'ContReg3'), CONTREG3) writeReg(getNode(REG_PATH + 'IPreampIn'), IPREAMPIN) writeReg(getNode(REG_PATH + 'IPreampFeed'), IPREAMPFEED) writeReg(getNode(REG_PATH + 'IPreampOut'), IPREAMPOUT) writeReg(getNode(REG_PATH + 'IShaper'), ISHAPER) writeReg(getNode(REG_PATH + 'IShaperFeed'), ISHAPERFEED) writeReg(getNode(REG_PATH + 'IComp'), ICOMP) writeReg(getNode(REG_PATH + 'VThreshold1'), VTHRESHOLD1) writeReg(getNode(REG_PATH + 'VCal'), VCAL) writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.CONTROL.TRIGGER'), 1) return True except: return False
def activateChannel(OH_NUM, vfat_slot, channel): print writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.GEB.VFATS.VFAT' + str(vfat_slot) + '.VFATChannels.ChanReg' + str(channel)), 64)
def clearChannel(OH_NUM, vfat_slot, channel): writeReg( getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.GEB.VFATS.VFAT' + str(vfat_slot) + '.VFATChannels.ChanReg' + str(channel)), 0)
def main(): instructions = "" ohMask = 0 ohList = [] if len(sys.argv) < 4: print( 'Usage: sca.py <card_name> <oh_mask> <instructions>. If running on the card, put `local` instead of hostname' ) print('instructions:') print(' r: SCA reset will be done') print(' h: FPGA hard reset will be done') print(' hh: FPGA hard reset will be asserted and held') print(' fpga-id: FPGA ID will be read through JTAG') print(' sysmon: Read FPGA sysmon data repeatedly') print( ' program-fpga: Program OH FPGA with a bitfile or an MCS file. Requires a parameter "bit" or "mcs" and a filename' ) return else: ohMask = parseInt(sys.argv[2]) ohList = getOHlist(ohMask) instructions = sys.argv[3] parseXML() hostname = socket.gethostname() if 'eagle' in hostname: pass else: rpc_connect(sys.argv[1]) initJtagRegAddrs() heading("Hola, I'm SCA controller tester :)") if not checkStatus(ohList): if not 'r' in instructions: exit() writeReg( getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.LINK_ENABLE_MASK'), ohMask) if instructions == 'r': sca_reset(ohList) elif instructions == 'hh': fpga_keep_hard_reset(ohList) elif instructions == 'h': fpga_single_hard_reset() elif instructions == 'fpga-id': read_fpga_id(ohMask) elif instructions == 'sysmon': run_sysmon(ohMask) elif instructions == 'program-fpga': hostname = socket.gethostname() if 'eagle' in hostname: from reg_interface.arm.program_fpga import program_fpga else: printRed("This method should only be called from the card!!") return if len(sys.argv) < 5: printRed('Usage: sca.py local program-fpga <file-type> <filename>') printRed('file-type can be "mcs" or "bit"') return ftype = sys.argv[4] filename = sys.argv[5] program_fpga(ohMask, ftype, filename) elif instructions == 'test1': test1() elif instructions == 'test2': test2() elif instructions == 'compare-mcs-bit': if len(sys.argv) < 5: print( "Usage: sca.py local compare-mcs-bit <mcs_filename> <bit_filename>" ) return mcsFilename = sys.argv[3] bitFilename = sys.argv[4] compare_mcs_bit(mcsFilename, bitFilename) elif instructions == 'gpio-set-direction': if len(sys.argv) < 4: print('Usage: sca.py local gpio-set-direction <direction-mask>') print( 'direction-mask is a 32 bit number where each bit represents a GPIO channel -- if a given bit is high it means that this GPIO channel will be set to OUTPUT mode, and otherwise it will be set to INPUT mode' ) return directionMask = parseInt(sys.argv[3]) gpio.set_direction(ohMask, directionMask) elif instructions == 'gpio-set-output': if len(sys.argv) < 4: print('Usage: sca.py local gpio-set-output <output-data>') print( 'output-data is a 32 bit number representing the 32 GPIO channels state' ) return outputData = parseInt(sys.argv[3]) gpio.set_output(ohMask, outputData) elif instructions == 'gpio-read-input': gpio.read_input(ohMask)
def unmaskVFAT(OH_NUM, vfat_slot): SBitMask = getNode('GEM_AMC.OH.OH' + str(OH_NUM) + '.CONTROL.VFAT.SBIT_MASK') vmask = (0xffffffff) ^ (0x1 << int(vfat_slot)) writeReg(SBitMask, vmask) return
def resetTriggerCounters(): writeReg(getNode('GEM_AMC.TRIGGER.CTRL.CNT_RESET'), 1) writeReg(getNode('GEM_AMC.TRIGGER.CTRL.CNT_RESET'), 0)
f = open(args.filename, "w") parseXML() hostname = socket.gethostname() if hostname[0:4] == "eagle": print("This script is running on" + str(hostname) + ".") pass else: print( "This script is not running on an eagle machine. rpc_connect(\"" + str(args.cardName) + "\") will be called.") rpc_connect(args.cardName) writeReg(getNode("GEM_AMC.GEM_SYSTEM.CTRL.LINK_RESET"), 0x1) sleeptime = args.sleeptime if sleeptime < 250.: print("Warning, sleeptime will be increased to 250 microseconds") sleeptime = 250. time.sleep(sleeptime / 1000000.) crc_error_cnt_before = readAddress( getNode("GEM_AMC.SLOW_CONTROL.VFAT3.CRC_ERROR_CNT").real_address) packet_error_cnt_before = readAddress( getNode("GEM_AMC.SLOW_CONTROL.VFAT3.PACKET_ERROR_CNT").real_address) bitstuffing_error_cnt_before = readAddress( getNode( "GEM_AMC.SLOW_CONTROL.VFAT3.BITSTUFFING_ERROR_CNT").real_address)