def test2(): timeStart = clock() nn = getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI') for i in range(0,10000): print(str(i)) sleep(0.001) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.FPGA_HARD_RESET'), 0x1)
def initJtagRegAddrs(): global ADDR_JTAG_LENGTH global ADDR_JTAG_TMS global ADDR_JTAG_TDO global ADDR_JTAG_TDI ADDR_JTAG_LENGTH = getNode( 'GEM_AMC.SLOW_CONTROL.SCA.JTAG.NUM_BITS').real_address ADDR_JTAG_TMS = getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TMS').real_address ADDR_JTAG_TDO = getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDO').real_address
def checkStatus(ohList): rxReady = parseInt(readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.STATUS.READY'))) criticalError = parseInt(readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.STATUS.CRITICAL_ERROR'))) statusGood = True for i in ohList: if not check_bit(rxReady, i): printRed("OH #%d is not ready: RX ready = %d, critical error = %d" % (i, (rxReady >> i) & 0x1, (criticalError >> i) & 0x1)) statusGood = False return statusGood
def fpga_remove_hard_reset(ohList): subheading('Disabling monitoring') monMask = readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF')) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), 0xffffffff) sleep(0.01) subheading('Asserting FPGA Hard Reset (and keeping it in reset)') sendScaCommand(ohList, 0x2, 0x10, 0x4, 0xffffffff, False) subheading('Restoring monitoring') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), monMask)
def set_direction(ohMask, directionMask): subheading('Disabling monitoring') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), 0xffffffff) sleep(0.01) ohList = getOHlist(ohMask) subheading('Setting the GPIO direction mask to ' + hex(directionMask)) sendScaCommand(ohList, 0x2, 0x20, 0x4, directionMask, False)
def set_output(ohMask, outputData): subheading('Disabling monitoring') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), 0xffffffff) sleep(0.01) ohList = getOHlist(ohMask) subheading('Setting the GPIO output to ' + hex(outputData)) sendScaCommand(ohList, 0x2, 0x10, 0x4, outputData, False)
def sca_reset(ohMask): subheading('Reseting the SCA') # Set the sca reset mask if it exists scaResetMaskNode = getNode('GEM_AMC.SLOW_CONTROL.SCA.CTRL.SCA_RESET_ENABLE_MASK') if scaResetMaskNode is not None: origMask = readReg(scaResetMaskNode) writeReg(scaResetMaskNode, ohMask) else: print("No SCA_RESET_ENABLE_MASK register detected, reset will be applied to all links") writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.CTRL.MODULE_RESET'), 0x1) # Reset the sca reset mask if it exists if scaResetMaskNode is not None: writeReg(scaResetMaskNode, int(origMask,16)) checkStatus(getOHlist(ohMask))
def read_input(ohMask): subheading('Disabling monitoring') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), 0xffffffff) sleep(0.01) ohList = getOHlist(ohMask) subheading('Reading the GPIO input') readData = sendScaCommand(ohList, 0x2, 0x1, 0x1, 0x0, True) idx = 0 for oh in ohList: print('OH %d GPIO Input = ' %(oh) + hex(readData[idx])) idx += 1
def enableJtag(ohMask, freqDiv=None): subheading('Disabling SCA ADC monitoring') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.ADC_MONITORING.MONITORING_OFF'), 0xffffffff) sleep(0.01) subheading('Enable JTAG module with mask ' + hex(ohMask)) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.ENABLE_MASK'), ohMask) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.SHIFT_MSB'), 0x0) writeReg( getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.EXPERT.EXEC_ON_EVERY_TDO'), 0x0) writeReg( getNode( 'GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.EXPERT.NO_SCA_LENGTH_UPDATE'), 0x0) writeReg( getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.EXPERT.SHIFT_TDO_ASYNC'), 0x0) if freqDiv is not None: subheading('Setting JTAG CLK frequency to ' + str(20 / (freqDiv)) + 'MHz (divider value = ' + hex((freqDiv - 1) << 24) + ')') ohList = [] for i in range(0, 12): if check_bit(ohMask, i): ohList.append(i) sendScaCommand(ohList, 0x13, 0x90, 0x4, (freqDiv - 1) << 24, False)
def test1(): timeStart = clock() nn = getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI') for i in range(0,1000000): #print(str(i)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD_CHANNEL'), 0x02) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD_COMMAND'), 0x10) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD_LENGTH'), 0x4) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD_DATA'), 0x0) #readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI')) wReg(ADDR_JTAG_TMS, 0x00000000) #sleep(0.01) #print('execute') #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD_EXECUTE'), 0x1) totalTime = clock() - timeStart printCyan('time took = ' + str(totalTime))
def sendScaCommand(ohList, sca_channel, sca_command, data_length, data, doRead): #print('fake send: channel ' + hex(sca_channel) + ', command ' + hex(sca_command) + ', length ' + hex(data_length) + ', data ' + hex(data) + ', doRead ' + str(doRead)) #return d = data writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD.SCA_CMD_CHANNEL'), sca_channel) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD.SCA_CMD_COMMAND'), sca_command) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD.SCA_CMD_LENGTH'), data_length) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD.SCA_CMD_DATA'), d) writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_CMD.SCA_CMD_EXECUTE'), 0x1) reply = [] if doRead: for i in ohList: reply.append(parseInt(readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.MANUAL_CONTROL.SCA_REPLY_OH%d.SCA_RPY_DATA' % i)))) return reply
def fpga_single_hard_reset(): subheading('Issuing FPGA Hard Reset') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.CTRL.OH_FPGA_HARD_RESET'), 0x1)
def sca_reset(ohList): subheading('Reseting the SCA') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.CTRL.MODULE_RESET'), 0x1) checkStatus(ohList)
def jtagCommand(restoreIdle, ir, irLen, dr, drLen, drReadOhList): totalLen = 0 if ir is not None: totalLen += irLen + 6 # instruction register length plus 6 TMS bits required to get to the IR shift state and back to IDLE if dr is not None: totalLen += drLen + 5 # data register length plus 5 TMS bits required to get to the DR shift state and back to IDLE if restoreIdle: totalLen += 6 if totalLen > 128: raise ValueError( 'JTAG command request needs more than 128 bits -- not possible. Please break up your command into smaller pieces.' ) tms = 0 tdo = 0 len = 0 readIdx = 0 if restoreIdle: tms = 0b011111 len = 6 if ir is not None: tms |= 0b0011 << len # go to IR SHIFT state len += 4 tdo |= ir << len tms |= 0b1 << (irLen - 1 + len) # exit IR shift len += irLen tms |= 0b01 << len # update IR and go to IDLE len += 2 if dr is not None: tms |= 0b001 << len # go to DR SHIFT state len += 3 readIdx = len tdo |= dr << len tms |= 0b1 << (drLen - 1 + len) # exit DR shift len += drLen tms |= 0b01 << len # update DR and go to IDLE len += 2 debug('Length = ' + str(len)) debug('TMS = ' + binary(tms, len)) debug('TDO = ' + binary(tdo, len)) debug('Read start index = ' + str(readIdx)) debugCyan('Setting command length = ' + str(len)) fw_len = len if len < 128 else 0 # in firmware 0 means 128 bits #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.NUM_BITS'), fw_len) wReg(ADDR_JTAG_LENGTH, fw_len) # ================= SENDING LENGTH COMMAND JUST FOR TEST!! =================== #debugCyan('Setting config registers: bit number = ' + hex(fw_len)) #sendScaCommand(0x13, 0x80, 0x4, 0xc00 | (fw_len << 24), False) # TX falling edge, shift LSB first, and set length # ============================================================================ #raw_input("press any key to send tms and tdo") debugCyan('Setting TMS 0 = ' + binary(tms & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TMS'), tms0) wReg(ADDR_JTAG_TMS, tms & 0xffffffff) debugCyan('Setting TDO 0 = ' + binary(tdo & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDO'), tdo0) wReg(ADDR_JTAG_TDO, tdo & 0xffffffff) if len > 32: tms = tms >> 32 debugCyan('Setting TMS 1 = ' + binary(tms & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TMS'), tms1) wReg(ADDR_JTAG_TMS, tms & 0xffffffff) #raw_input("press any key to send the last TDO") tdo = tdo >> 32 debugCyan('Setting TDO 1 = ' + binary(tdo & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDO'), tdo1) wReg(ADDR_JTAG_TDO, tdo & 0xffffffff) if len > 64: tms = tms >> 32 debugCyan('Setting TMS 2 = ' + binary(tms & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TMS'), tms2) wReg(ADDR_JTAG_TMS, tms & 0xffffffff) tdo = tdo >> 32 debugCyan('Setting TDO 2 = ' + binary(tdo & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDO'), tdo2) wReg(ADDR_JTAG_TDO, tdo & 0xffffffff) if len > 96: tms = tms >> 32 debugCyan('Setting TMS 3 = ' + binary(tms & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TMS'), tms3) wReg(ADDR_JTAG_TMS, tms & 0xffffffff) tdo = tdo >> 32 debugCyan('Setting TDO 3 = ' + binary(tdo & 0xffffffff, 32)) #writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDO'), tdo3) wReg(ADDR_JTAG_TDO, tdo & 0xffffffff) # ================= SENDING JTAG GO COMMAND JUST FOR TEST!! =================== #debugCyan('JTAG GO!') #sendScaCommand(0x13, 0xa2, 0x1, 0x0, False) # ============================================================================ #raw_input("Press any key to read TDI...") readValues = {} if drReadOhList == False: return readValues for i in drReadOhList: debugCyan('Read TDI 0') tdi = parseInt( readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI_OH%d' % i))) #tdi0_fast = parseInt(rReg(parseInt(ADDR_JTAG_TDI))) #print('normal tdi read = ' + hex(tdi0) + ', fast C tdi read = ' + hex(tdi0_fast) + ', parsed = ' + '{0:#010x}'.format(tdi0_fast)) debug('tdi = ' + hex(tdi)) if len > 32: debugCyan('Read TDI 1') tdi1 = parseInt( readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI_OH%d' % i))) tdi |= tdi1 << 32 debug('tdi1 = ' + hex(tdi1)) debug('tdi = ' + hex(tdi)) if len > 64: debugCyan('Read TDI 2') tdi2 = parseInt( readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI_OH%d' % i))) tdi |= tdi2 << 64 debug('tdi2 = ' + hex(tdi2)) debug('tdi = ' + hex(tdi)) if len > 96: debugCyan('Read TDI 3') tdi3 = parseInt( readReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.TDI_OH%d' % i))) tdi |= tdi3 << 96 debug('tdi3 = ' + hex(tdi3)) debug('tdi = ' + hex(tdi)) readValue = (tdi >> readIdx) & (0xffffffffffffffffffffffffffffffff >> (128 - drLen)) readValues[i] = readValue debug('Read pos = ' + str(readIdx)) debug('Read = ' + hex(readValue)) return readValues
def disableJtag(): subheading('Disabling JTAG module') writeReg(getNode('GEM_AMC.SLOW_CONTROL.SCA.JTAG.CTRL.ENABLE_MASK'), 0x0)