Commit fea8c6d4 authored by Matthieu Cattin's avatar Matthieu Cattin

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

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