Commit 672b3205 authored by Matthieu Cattin's avatar Matthieu Cattin

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

parent 8164fabb
......@@ -124,8 +124,10 @@ class CGN4124:
# Wait for interrupt
def wait_irq(self, verbose=False):
if verbose:
print("[GN4124] Waiting IRQ...")
print("[GN4124] Waiting interrupt...")
ret = self.bus.irqwait()
if verbose:
print("[GN4124] Interrupt occured")
# re-enable the interrupt
self.bus.irqena()
return ret
......
......@@ -29,6 +29,7 @@ from si57x import *
# Import register maps
from utc_core_regs import *
from fmc_adc_eic_regs import *
from fmcadc100m_csr import *
......@@ -57,11 +58,12 @@ class FmcAdc100mOperationError(Exception):
class CFmcAdc100m:
UTC_CORE_ADDR = 0x0
FMC_EIC_ADDR = 0x0
UTC_CORE_ADDR = 0x100
# FOR SVEC ONLY
DDR_DAT_ADDR = 0x0100
DDR_ADR_ADDR = 0x0200
DDR_DAT_ADDR = 0x1000
DDR_ADR_ADDR = 0x200
FMC_SYS_I2C_ADDR = 0x1000
EEPROM_ADDR = 0x50
......@@ -115,6 +117,7 @@ class CFmcAdc100m:
try:
# Objects declaration
self.fmc_eic = CCSR(self.bus, self.adc_mezz_offset + self.FMC_EIC_ADDR, FMC_ADC_EIC_REGS)
self.utc_core = CCSR(self.bus, self.adc_mezz_offset + self.UTC_CORE_ADDR, UTC_CORE_REGS)
self.fmc_sys_i2c = COpenCoresI2C(self.bus, self.adc_core_offset + self.FMC_SYS_I2C_ADDR, 249)
......@@ -205,6 +208,83 @@ class CFmcAdc100m:
print("Test pattern : %.4X") % self.adc_cfg.get_testpat()
print("Test pattern status : %.1X") % self.adc_cfg.get_testpat_stat()
#======================================================================
# FMC-ADC Enhanced Interrupt Controller (EIC)
# Print FMC-ADC EIC register map
def print_eic_regs(self):
self.fmc_eic.print_reg_map()
# Enable trigger interrupt
def enable_trig_irq(self):
try:
self.fmc_eic.set_field('IER', 'TRIG', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Disable trigger interrupt
def disable_trig_irq(self):
try:
self.fmc_eic.set_field('IDR', 'TRIG', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Clear trigger interrupt
def clear_trig_irq(self):
try:
self.fmc_eic.set_field('ISR', 'TRIG', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Enable acquisition end interrupt
def enable_acq_end_irq(self):
try:
self.fmc_eic.set_field('IER', 'ACQ_END', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Disable acquisition end interrupt
def disable_acq_end_irq(self):
try:
self.fmc_eic.set_field('IDR', 'ACQ_END', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Clear acquisition end interrupt
def clear_acq_end_irq(self):
try:
self.fmc_eic.set_field('ISR', 'ACQ_END', 1)
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Get FMC-ADC EIC enable mask
def get_eic_en_mask(self):
try:
return self.fmc_eic.get_reg('IMR')
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Get FMC-ADC interrupt source
def get_eic_src(self):
try:
return self.fmc_eic.get_reg('ISR')
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Get trigger interrupt status
def get_trig_status(self):
try:
return self.fmc_eic.get_field('ISR', 'TRIG')
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
# Get end of acq interrupt status
def get_acq_end_status(self):
try:
return self.fmc_eic.get_field('ISR', 'ACQ_END')
except CSRDeviceOperationError as e:
raise FmcAdc100mSpecOperationError(e)
#======================================================================
# UTC core
......
......@@ -233,8 +233,9 @@ if __name__ == "__main__":
sine = SineWaveform()
carrier = CFmcAdc100mSpec(spec, 0x1)
# Enable DMA interrupts (finished, error)
carrier.set_irq_en_mask(0x3)
# Enable DMA interrupts
carrier.enable_dma_done_irq()
carrier.enable_dma_error_irq()
# Set UTC
current_time = time.time()
......
......@@ -93,12 +93,12 @@ def acq_channels(fmc, carrier):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8, False)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
return channels_data
......
......@@ -97,12 +97,12 @@ def get_channels_mean(fmc, carrier):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8, False)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
# calculate mean value for each channel
channels_mean = []
......
......@@ -141,12 +141,12 @@ def acq_channels(fmc, carrier):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,1.0,16) for item in channels_data]
return channels_data
......
......@@ -171,7 +171,9 @@ def main (default_directory='.'):
sine = SineWaveform()
# Enables DMA interrupts
print('Set IRQ enable mask: %.4X')%spec_fmc.set_irq_en_mask(0x3)
spec_fmc.enable_dma_done_irq()
spec_fmc.enable_dma_error_irq()
print('Set IRQ enable mask: %.4X'%spec_fmc.get_dma_eic_en_mask())
# Initialise fmc adc
fmc_adc_init(spec, fmc)
......
......@@ -104,12 +104,12 @@ def acq_channels(fmc, carrier, adc_fs, pause):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,adc_fs,16) for item in channels_data]
return channels_data
......
......@@ -146,12 +146,12 @@ def acq_get_data(spec_fmc, fmc, adc_fs, adc_nbits=16):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
spec_fmc.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
spec_fmc.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = spec_fmc.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
spec_fmc.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
spec_fmc.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,adc_fs,adc_nbits) for item in channels_data]
return channels_data
......
......@@ -117,12 +117,12 @@ def acq_channels(fmc, spec_fmc):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
spec_fmc.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
spec_fmc.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = spec_fmc.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
spec_fmc.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
spec_fmc.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
return channels_data
......
......@@ -216,7 +216,7 @@ def main (default_directory = '.'):
print "GN4124 local bus freq: ", carrier.gnum.get_local_bus_freq()
# Enable "DMA finished" IRQ
carrier.set_irq_en_mask(0x1)
carrier.enable_dma_done_irq()
# Initialise fmc adc
fmc_adc_init(spec, fmc)
......
......@@ -191,12 +191,12 @@ def acq_channel(carrier, fmc, ch, adc_fs, adc_nbits=16, pause=0.01):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,adc_fs,adc_nbits) for item in channels_data]
#plot_all(channels_data, [mean(channels_data[0::4]),mean(channels_data[1::4]),mean(channels_data[2::4]),mean(channels_data[3::4])], 0.1)
......
......@@ -165,12 +165,12 @@ def acq_channel(carrier, fmc, ch, adc_fs, adc_nbits=16, pause=0.01):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt_without_offset(item,adc_fs,adc_nbits) for item in channels_data]
channel_data = channels_data[ch-1::4]
......@@ -241,7 +241,11 @@ def main (default_directory = '.'):
AWG_BAUD = 57600
CALIBR_FILENAME = "calibration_data.txt"
CALIBR_FILENAME = os.path.join(default_directory, CALIBR_FILENAME)
CALIBR_BIN_FILENAME = "calibration_data.bin"
CALIBR_BIN_FILENAME = os.path.join(default_directory, CALIBR_BIN_FILENAME)
EEPROM_BIN_FILENAME = "eeprom_content.out"
EEPROM_BIN_FILENAME = os.path.join(default_directory, EEPROM_BIN_FILENAME)
EEPROM_SIZE = 8192 # in Bytes
......@@ -337,14 +341,25 @@ def main (default_directory = '.'):
f_eeprom.close()
# Get calibration data
print "Get calibration data from EEPROM."
eeprom_data = open(EEPROM_BIN_FILENAME, "rb").read()
int_use_data = ipmi_get_internal_use_data(eeprom_data)
#print("Extract calibration binary file to: %s"%(CALIBR_BIN_FILENAME))
cmd = 'sdb-read -e 0x200 ' + EEPROM_BIN_FILENAME + ' calib > ' + CALIBR_BIN_FILENAME
print("Exctract calibration binary file, cmd: %s"%(cmd))
os.system(cmd)
print "Get calibration data from binary file."
calibr_data = []
f_calibr_data = open(CALIBR_BIN_FILENAME, "rb")
try:
byte = f_calibr_data.read(1)
while byte != "":
calibr_data.append(ord(byte))
byte = f_calibr_data.read(1)
finally:
f_eeprom.close()
# Re-arrange correction data into 16-bit number (from bytes)
eeprom_corr_data = []
for i in range(0,len(int_use_data),2):
eeprom_corr_data.append((int_use_data[i+1] << 8) + (int_use_data[i]))
for i in range(0,len(calibr_data),2):
eeprom_corr_data.append((calibr_data[i+1] << 8) + (calibr_data[i]))
print "0x%04X" % eeprom_corr_data[-1]
print "Calibration data length (16-bit): %d" % len(eeprom_corr_data)
print "Correction data from eeprom:"
......
......@@ -91,12 +91,12 @@ def acq_channels(fmc, carrier):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
return 0
def print_temp(temp):
......
......@@ -174,12 +174,12 @@ def acq_channel(carrier, fmc, ch, adc_fs, adc_nbits=16, pause=0.01):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt_without_offset(item,adc_fs,adc_nbits) for item in channels_data]
channel_data = channels_data[ch-1::4]
......
......@@ -95,7 +95,7 @@ def acq_channels(fmc, carrier):
print("Trigger position: 0x%8X" % trig_pos)
#carrier.print_irq_controller_regs()
# Enable "DMA done" interrupt
carrier.set_irq_en_mask(0x1)
carrier.enable_dma_done_irq()
#carrier.print_irq_controller_regs()
raw_input("hit any key to start dma.")
# Read ACQ_LENGTH samples after the trigger for all channels
......@@ -103,8 +103,8 @@ def acq_channels(fmc, carrier):
channels_data = carrier.get_data(0, ACQ_LENGTH*8)
#for carrier_addr in range(0,10*4096, 4096):
# channels_data = carrier.get_data(carrier_addr, 0x1000)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
return channels_data
......
......@@ -156,7 +156,7 @@ def clear_ddr(carrier, verbose=False):
pattern = 0x0
length = 2**27-(128*4096)
# Enable "DMA done" interrupt
carrier.set_irq_dma_done_mask(1)
carrier.enable_dma_done_irq()
#carrier.print_irq_controller_regs()
# Test number of dma transfer required (max dma size limitation of gnurabbit driver)
dma_required = int(math.ceil((MEMORY_SIZE<<3)/float(254*DMA_ITEM_SIZE*DMA_MAX_ITEMS)))
......@@ -176,7 +176,7 @@ def clear_ddr(carrier, verbose=False):
# Incerment dma start address
start_byte_addr += dma_length
# Disable "DMA done" interrupt
carrier.set_irq_dma_done_mask(0)
carrier.disable_dma_done_irq()
# Returns calibration data from fmc eeprom
......@@ -206,7 +206,7 @@ def get_calibr_data(fmc, eeprom_bin_filename, calibr_bin_filename, verbose=False
# Get calibration data
#print("Extract calibration binary file to: %s"%(CALIBR_BIN_FILENAME))
cmd = 'sdb-read -e 0x1000 ' + eeprom_bin_filename + ' calibration.sdb > ' + calibr_bin_filename
cmd = 'sdb-read -e 0x200 ' + eeprom_bin_filename + ' calib > ' + calibr_bin_filename
if verbose:
print("Exctract calibration binary file, cmd: %s"%(cmd))
os.system(cmd)
......@@ -333,11 +333,11 @@ def make_acq(carrier, fmc, verbose=False):
# Make sure no acquisition is running
fmc.stop_acq()
# Enables acquisition end interrupt
carrier.set_irq_acq_end_mask(1)
#carrier.set_irq_trig_mask(1)
fmc.enable_acq_end_irq()
#fmc.enable_trig_irq()
if verbose:
print("IRQ mask : %.8X"%carrier.get_irq_en_mask())
print("IRQ source : %.8X"%carrier.get_irq_source())
print("IRQ mask : %.8X"%fmc.get_eic_en_mask())
print("IRQ source : %.8X"%fmc.get_eic_src())
# Start acquisition
if verbose:
print("Starting acquisition...")
......@@ -352,20 +352,26 @@ def make_acq(carrier, fmc, verbose=False):
###########################
# Wait for trigger interrupt
#carrier.gnum.wait_irq()
#carrier.gnum.wait_irq)
# Wait for acquisition end interrupt
carrier.gnum.wait_irq()
irq_src = carrier.get_irq_source()
irq_src = fmc.get_eic_src()
irq_vect = carrier.vic_get_current_vector_addr()
if verbose:
print("IRQ source : %.8X"%irq_src)
if(irq_src & carrier.IRQ_SRC_ACQ_END):
carrier.clear_irq_source(carrier.IRQ_SRC_ACQ_END)
if verbose:
print("IRQ source : %.8X"%carrier.get_irq_source())
print("FMC EIC irq source : %.8X"%irq_src)
print("VIC current vector : 0x%08X"%irq_vect)
if(irq_vect == carrier.fmc_eic_addr):
if(fmc.get_acq_end_status()):
fmc.clear_acq_end_irq()
carrier.vic_ack_current_vector()
if verbose:
print("IRQ source : 0x%08X"%fmc.get_eic_src())
else:
raise PtsError("Bad IRQ source.")
else:
raise PtsError("Bad IRQ source. expected:0x08 got:0x%02X" %(irq_src))
raise PtsError("Bad IRQ vector. expected:0x%08X got:0x%08X" %(carrier.fmc_eic_addr, irq_vect))
if 'IDLE' != fmc.get_acq_fsm_state():
raise PtsError("Acq FSM not IDLE. Current state:%s"%fmc.get_acq_fsm_state())
......@@ -374,13 +380,13 @@ def make_acq(carrier, fmc, verbose=False):
print("Acquisition finished.")
# Disables acquisition end interrupt
carrier.set_irq_acq_end_mask(0)
fmc.disable_acq_end_irq()
# Make a linked list dma
def make_dma(carrier, start_byte_addr, length_bytes, in_range, verbose=False):
# Enable "DMA done" interrupt
carrier.set_irq_dma_done_mask(1)
carrier.enable_dma_done_irq()
#carrier.print_irq_controller_regs()
# Test number of dma transfer required (max dma size limitation of gnurabbit driver)
dma_required = int(math.ceil(length_bytes/float(DMA_ITEM_SIZE*DMA_MAX_ITEMS)))
......@@ -402,7 +408,7 @@ def make_dma(carrier, start_byte_addr, length_bytes, in_range, verbose=False):
# Incerment dma start address
start_byte_addr += dma_length
# Disable "DMA done" interrupt
carrier.set_irq_dma_done_mask(0)
carrier.disable_dma_done_irq()
#carrier.print_irq_controller_regs()
return data
......
......@@ -103,12 +103,12 @@ def acq_channels(fmc, carrier, adc_fs, pause):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,adc_fs,16) for item in channels_data]
return channels_data
......
......@@ -114,12 +114,12 @@ def acq_channels(fmc, carrier, adc_fs, pause):
return 1
# Retrieve data trough DMA
trig_pos = fmc.get_trig_pos()
# Enable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x1)
# Enable "DMA done" interrupt
carrier.enable_dma_done_irq()
# Read ACQ_LENGTH samples after the trigger for all channels
channels_data = carrier.get_data((trig_pos<<3), ACQ_LENGTH*8)
# Disable "DMA done" iinterrupt
carrier.set_irq_en_mask(0x0)
# Disable "DMA done" interrupt
carrier.disable_dma_done_irq()
channels_data = [hex2signed(item) for item in channels_data]
channels_data = [digital2volt(item,adc_fs,16) for item in channels_data]
return channels_data
......
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