Commit 8f91e0f5 authored by Matthieu Cattin's avatar Matthieu Cattin

svec many: Change interrupt scheme, now uses two stages (eic + vic).

parent 51a96037
...@@ -14,15 +14,16 @@ import random ...@@ -14,15 +14,16 @@ import random
import math import math
# Import specific modules # Import specific modules
from sdb import *
from csr import * from csr import *
from onewire import * from onewire import *
from gn4124 import * from gn4124 import *
from ds18b20 import * from ds18b20 import *
from i2c import * from i2c import *
from vic import *
# Import register maps # Import register maps
from svec_carrier_csr import * from svec_carrier_csr import *
from svec_irq_controller_regs import *
# Global constants # Global constants
LED_COLOR = {"OFF":0x0, "GREEN":0x1, "RED":0x2, "ORANGE":0x3} LED_COLOR = {"OFF":0x0, "GREEN":0x1, "RED":0x2, "ORANGE":0x3}
...@@ -39,10 +40,11 @@ class FmcAdc100mSvecOperationError(Exception): ...@@ -39,10 +40,11 @@ class FmcAdc100mSvecOperationError(Exception):
class CFmcAdc100mSvec: class CFmcAdc100mSvec:
# Wishbone core base addresses # Wishbone core base addresses
SDB_ADDR = 0x0
I2C_ADDR = 0x1000 I2C_ADDR = 0x1000
ONEWIRE_ADDR = 0x1100 ONEWIRE_ADDR = 0x1100
CSR_ADDR = 0x1200 CSR_ADDR = 0x1200
IRQ_CONTROLLER_ADDR = 0x1300 VIC_ADDR = 0x1300
# Onewire core port # Onewire core port
DS18B20_PORT = 0 DS18B20_PORT = 0
...@@ -54,11 +56,13 @@ class CFmcAdc100mSvec: ...@@ -54,11 +56,13 @@ class CFmcAdc100mSvec:
self.bus = bus self.bus = bus
# Objects declaration # Objects declaration
self.sdb_csr = CCSR(self.bus, self.SDB_ADDR)
self.sdb = CSDB(self.sdb_csr)
self.i2c = COpenCoresI2C(self.bus, self.I2C_ADDR, 249) self.i2c = COpenCoresI2C(self.bus, self.I2C_ADDR, 249)
self.onewire = COpenCoresOneWire(self.bus, self.ONEWIRE_ADDR, 624, 124) self.onewire = COpenCoresOneWire(self.bus, self.ONEWIRE_ADDR, 624, 124)
self.ds18b20 = CDS18B20(self.onewire, self.DS18B20_PORT) self.ds18b20 = CDS18B20(self.onewire, self.DS18B20_PORT)
self.csr = CCSR(self.bus, self.CSR_ADDR, CARRIER_CSR) self.csr = CCSR(self.bus, self.CSR_ADDR, CARRIER_CSR)
self.irq_controller = CCSR(self.bus, self.IRQ_CONTROLLER_ADDR, IRQ_CONTROLLER_REGS) self.vic = CVic(self.bus, self.VIC_ADDR)
# Check if bitstream is properly loaded by reading a register # Check if bitstream is properly loaded by reading a register
ct = self.get_carrier_type() ct = self.get_carrier_type()
...@@ -68,6 +72,18 @@ class CFmcAdc100mSvec: ...@@ -68,6 +72,18 @@ class CFmcAdc100mSvec:
# Release the mezzanines software reset # Release the mezzanines software reset
self.set_sw_rst(0,1) self.set_sw_rst(0,1)
self.set_sw_rst(1,1) self.set_sw_rst(1,1)
time.sleep(0.001) # gives time for ddr core to calibrates
# Configure VIC
#self.vic.print_regs()
self.vic.set_polarity(1) # output active high
#self.vic.enable_emu_edge(750) # emulate edge sensitive output (pulse width = 750 * 1/sys_clk = 6us)
self.vic.enable_int(0) # enable interrupts from fmc0 eic
self.vic.enable_int(1) # enable interrupts from fmc1 eic
self.vic.enable_module()
self.fmc_eic_addr = []
self.fmc_eic_addr.append(self.vic.get_vector_addr(0))
self.fmc_eic_addr.append(self.vic.get_vector_addr(1))
# TODO # TODO
# Check if the expected bitstream loaded # Check if the expected bitstream loaded
...@@ -82,6 +98,14 @@ class CFmcAdc100mSvec: ...@@ -82,6 +98,14 @@ class CFmcAdc100mSvec:
raise FmcAdc100mSvecOperationError("Mezzanine in slot 2 not present or PRSNT_M2C_L line faulty.") raise FmcAdc100mSvecOperationError("Mezzanine in slot 2 not present or PRSNT_M2C_L line faulty.")
#======================================================================
# SDB records
# Dump SDB records
def sdb_dump(self):
self.sdb.dump()
#====================================================================== #======================================================================
# Control and status registers (CSR) # Control and status registers (CSR)
...@@ -168,10 +192,12 @@ class CFmcAdc100mSvec: ...@@ -168,10 +192,12 @@ class CFmcAdc100mSvec:
self.csr.set_field('RST', 'FMC0', 0) self.csr.set_field('RST', 'FMC0', 0)
time.sleep(0.001) time.sleep(0.001)
self.csr.set_field('RST', 'FMC0', 1) self.csr.set_field('RST', 'FMC0', 1)
time.sleep(0.001)
elif slot == 1: elif slot == 1:
self.csr.set_field('RST', 'FMC1', 0) self.csr.set_field('RST', 'FMC1', 0)
time.sleep(0.001) time.sleep(0.001)
self.csr.set_field('RST', 'FMC1', 1) self.csr.set_field('RST', 'FMC1', 1)
time.sleep(0.001)
else: else:
raise FmcAdc100mSvecOperationError("Slot number out of range [0:1]") raise FmcAdc100mSvecOperationError("Slot number out of range [0:1]")
except CSRDeviceOperationError as e: except CSRDeviceOperationError as e:
...@@ -236,69 +262,16 @@ class CFmcAdc100mSvec: ...@@ -236,69 +262,16 @@ class CFmcAdc100mSvec:
#====================================================================== #======================================================================
# Interrupt controller core # Vectored Interrupt Controller (VIC)
# Print IRQ controller register map
def print_irq_controller_regs(self):
self.irq_controller.print_reg_map()
# Set IRQ enable mask
def set_irq_en_mask(self, mask):
try:
self.irq_controller.set_reg('ENABLE', mask)
self.irq_controller.set_reg('DISABLE', ~mask)
return self.irq_controller.get_reg('MASK')
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
# Get IRQ enable mask
def get_irq_en_mask(self):
try:
return self.irq_controller.get_reg('MASK')
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
# Returns IRQ status
def get_irq_status(self):
try:
return self.irq_controller.get_reg('STATUS')
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
# Clears interrupt # Get current interrupt vector address
def clear_interrupt(self, irq): def vic_get_current_vector_addr(self):
try: return self.vic.get_int_vector_addr()
self.irq_controller.set_reg('STATUS', irq)
return self.irq_controller.get_reg('STATUS')
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
# Set acquisition end interrupt mask # Acknowledge current vector
def set_irq_acq_end_mask(self, slot, value): def vic_ack_current_vector(self):
try: self.vic.int_ack()
if slot == 0:
fmc = 'FMC0_ACQ_END'
elif slot == 1:
fmc = 'FMC1_ACQ_END'
else:
raise FmcAdc100mSvecOperationError("Slot number out of range [0:1]")
self.irq_controller.set_field('ENABLE', fmc, value)
self.irq_controller.set_field('DISABLE', fmc, ~value)
return self.irq_controller.get_field('MASK', fmc)
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
# Set trigger interrupt mask # Get raw interrupt status
def set_irq_trig_mask(self, slot, value): def vic_get_raw_status(self):
try: return self.vic.get_raw_int_status()
if slot == 0:
fmc = 'FMC0_ACQ_TRG'
elif slot == 1:
fmc = 'FMC1_ACQ_TRG'
else:
raise FmcAdc100mSvecOperationError("Slot number out of range [0:1]")
self.irq_controller.set_field('ENABLE', fmc, value)
self.irq_controller.set_field('DISABLE', fmc, ~value)
return self.irq_controller.get_field('MASK', fmc)
except CSRDeviceOperationError as e:
raise FmcAdc100mSvecOperationError(e)
...@@ -115,6 +115,10 @@ def main (default_directory='.'): ...@@ -115,6 +115,10 @@ def main (default_directory='.'):
error[i] = "Wrong device mounted on system management I2C bus or soldering issues, address is:0x%.2X expected:0x%.2X" % (periph_addr[0],EEPROM_ADDR) error[i] = "Wrong device mounted on system management I2C bus or soldering issues, address is:0x%.2X expected:0x%.2X" % (periph_addr[0],EEPROM_ADDR)
continue continue
# Timetag core
fmc[i].print_utc_core_regs()
# LEDs # LEDs
print('\nBlinking LEDs') print('\nBlinking LEDs')
for j in range(3): for j in range(3):
......
...@@ -55,7 +55,7 @@ def main (default_directory='.'): ...@@ -55,7 +55,7 @@ def main (default_directory='.'):
print "Initialising device.\n" print "Initialising device.\n"
# Load FMC ADC firmware # Load FMC ADC firmware
ask = 'N' ask = ''
while ((ask != "Y") and (ask != "N")) : while ((ask != "Y") and (ask != "N")) :
ask = raw_input("Do you want to load the firmware: %s? [y,n]"%(FMC_ADC_BITSTREAM)) ask = raw_input("Do you want to load the firmware: %s? [y,n]"%(FMC_ADC_BITSTREAM))
ask = ask.upper() ask = ask.upper()
...@@ -79,6 +79,11 @@ def main (default_directory='.'): ...@@ -79,6 +79,11 @@ def main (default_directory='.'):
# Test carrier periherals # Test carrier periherals
print('\n-------------------------------------------------------------') print('\n-------------------------------------------------------------')
print('[Carrier]') print('[Carrier]')
# Reset mezzanines
#carrier.sw_rst(0)
#carrier.sw_rst(1)
carrier.print_unique_id() carrier.print_unique_id()
carrier.print_temp() carrier.print_temp()
...@@ -94,6 +99,9 @@ def main (default_directory='.'): ...@@ -94,6 +99,9 @@ def main (default_directory='.'):
except FmcAdc100mOperationError as e: except FmcAdc100mOperationError as e:
raise PtsCritical("Mezzanine %d init failed, test stopped: %s" % (i+1, e)) raise PtsCritical("Mezzanine %d init failed, test stopped: %s" % (i+1, e))
carrier.vic.print_regs()
# Test mezzanines peripherals # Test mezzanines peripherals
error = ['',''] error = ['','']
for i in range(2): for i in range(2):
...@@ -101,53 +109,56 @@ def main (default_directory='.'): ...@@ -101,53 +109,56 @@ def main (default_directory='.'):
print('\n-------------------------------------------------------------') print('\n-------------------------------------------------------------')
print('[FMC slot %d]'%(i+1)) print('[FMC slot %d]'%(i+1))
# Disable and clear all interrupts
carrier.set_irq_en_mask(0x0)
ret = carrier.get_irq_status()
carrier.clear_interrupt(ret)
# Enable trigger interrupt
carrier.print_irq_controller_regs()
print('Enable trigger interrupt')
carrier.set_irq_trig_mask(i, 1)
carrier.print_irq_controller_regs()
# Acquisition setup
# hw trig, rising edge, external, sw disable, no delay # hw trig, rising edge, external, sw disable, no delay
print('') print('')
for j in range(100): for j in range(100):
print('Enable trigger interrupt')
fmc[i].enable_trig_irq()
fmc[i].print_eic_regs()
fmc[i].set_trig_config(1, 0, 1, 1, 1, 0, 0) fmc[i].set_trig_config(1, 0, 1, 1, 1, 0, 0)
fmc[i].set_pre_trig_samples(500) fmc[i].set_pre_trig_samples(500)
fmc[i].set_post_trig_samples(500) fmc[i].set_post_trig_samples(500)
fmc[i].set_shots(1) fmc[i].set_shots(1)
fmc[i].stop_acq() fmc[i].stop_acq()
#fmc[i].fmc_adc_csr.print_reg_map()
print "%d: Acquisition FSM state : %s (should be IDLE)" % (j,fmc[i].get_acq_fsm_state()) print "%d: Acquisition FSM state : %s (should be IDLE)" % (j,fmc[i].get_acq_fsm_state())
fmc[i].start_acq() fmc[i].start_acq()
#time.sleep(3) time.sleep(0.001)
print "%d: Acquisition FSM state : %s" % (j,fmc[i].get_acq_fsm_state())
print "Wait for trigger." print "Wait for trigger."
# Wait from interrupt # Wait for interrupt
ret = bus.vv_irqwait() ret = bus.vv_irqwait()
print('[irq wait] irq source reg = 0x%.8X'%ret) print('[irq wait] Vector Address Register (VAR) = 0x%.8X'%ret)
ret = carrier.get_irq_status() print('Check if interrupt is TRIGGER')
print('irq status = 0x%.8X'%ret) irq_src = fmc[i].get_eic_src()
irq_vect = carrier.vic_get_current_vector_addr()
time.sleep(1) print("FMC%d EIC irq source : %.8X"%(i,irq_src))
ret = carrier.clear_interrupt(ret) print("VIC current vector : 0x%08X"%irq_vect)
print('Clear interrupt, irq status = 0x%.8X'%ret) if(irq_vect == carrier.fmc_eic_addr[i]):
#carrier.print_irq_controller_regs() if(fmc[i].get_trig_status()):
time.sleep(1) fmc[i].clear_trig_irq()
carrier.vic_ack_current_vector()
# Disable trigger interrupt print("FMC%d EIC irq source : %.8X"%(i, fmc[i].get_eic_src()))
print('Disable trigger interrupt') else:
carrier.set_irq_trig_mask(i, 0) raise FmcAdc100mSvecOperationError("Bad IRQ source : 0x%08X"%irq_src)
carrier.print_irq_controller_regs() else:
raise FmcAdc100mSvecOperationError("Bad IRQ vector. expected:0x%08X got:0x%08X" %(carrier.fmc_eic_addr[i], irq_vect))
print('Disable trigger interrupt')
fmc[i].disable_trig_irq()
fmc[i].print_eic_regs()
carrier.vic.print_regs()
except FmcAdc100mOperationError as e: except FmcAdc100mOperationError as e:
raise PtsError("Mezzanine %d onewire test failed: %s" % (i+1, e)) raise PtsError("Mezzanine %d interrupts test failed: %s" % (i+1, e))
print('') print('')
print "==> End of test%02d" % TEST_NB print "==> End of test%02d" % TEST_NB
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment