Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
P
Production Test Suite
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
9
Issues
9
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Production Test Suite
Commits
e6795d0e
Commit
e6795d0e
authored
Dec 18, 2013
by
Matthieu Cattin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
svec many: Change interrupt scheme, now uses two stages (eic + vic).
parent
d4c3f1fc
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
89 additions
and
98 deletions
+89
-98
rr2vv.py
common/rr2vv.py
+4
-1
fmc_adc_svec.py
test/fmcadc100m14b4cha/python/fmc_adc_svec.py
+39
-66
svec_test01.py
test/fmcadc100m14b4cha/python/svec_test01.py
+4
-0
svec_test02.py
test/fmcadc100m14b4cha/python/svec_test02.py
+42
-31
No files found.
common/rr2vv.py
View file @
e6795d0e
...
...
@@ -36,8 +36,11 @@ class VME_rr_compatible(VME):
raise
BusWarning
(
"Warning: VME __init__: Bad lun, default to 0"
)
def
iread
(
self
,
bar
,
offset
,
width
):
return
self
.
vv_read
(
offset
)
data
=
self
.
vv_read
(
offset
)
#print("vv_read : offset:0x%4x data:0x%08x"%(offset, data))
return
data
def
iwrite
(
self
,
bar
,
offset
,
width
,
datum
):
#print("vv_write: offset:0x%4x data:0x%08x"%(offset, datum))
return
self
.
vv_write
(
offset
,
datum
)
test/fmcadc100m14b4cha/python/fmc_adc_svec.py
View file @
e6795d0e
...
...
@@ -14,15 +14,16 @@ import random
import
math
# Import specific modules
from
sdb
import
*
from
csr
import
*
from
onewire
import
*
from
gn4124
import
*
from
ds18b20
import
*
from
i2c
import
*
from
vic
import
*
# Import register maps
from
svec_carrier_csr
import
*
from
svec_irq_controller_regs
import
*
# Global constants
LED_COLOR
=
{
"OFF"
:
0x0
,
"GREEN"
:
0x1
,
"RED"
:
0x2
,
"ORANGE"
:
0x3
}
...
...
@@ -39,10 +40,11 @@ class FmcAdc100mSvecOperationError(Exception):
class
CFmcAdc100mSvec
:
# Wishbone core base addresses
SDB_ADDR
=
0x0
I2C_ADDR
=
0x1000
ONEWIRE_ADDR
=
0x1100
CSR_ADDR
=
0x1200
IRQ_CONTROLLER
_ADDR
=
0x1300
VIC
_ADDR
=
0x1300
# Onewire core port
DS18B20_PORT
=
0
...
...
@@ -54,11 +56,13 @@ class CFmcAdc100mSvec:
self
.
bus
=
bus
# 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
.
onewire
=
COpenCoresOneWire
(
self
.
bus
,
self
.
ONEWIRE_ADDR
,
624
,
124
)
self
.
ds18b20
=
CDS18B20
(
self
.
onewire
,
self
.
DS18B20_PORT
)
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
ct
=
self
.
get_carrier_type
()
...
...
@@ -68,6 +72,18 @@ class CFmcAdc100mSvec:
# Release the mezzanines software reset
self
.
set_sw_rst
(
0
,
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
# Check if the expected bitstream loaded
...
...
@@ -82,6 +98,14 @@ class CFmcAdc100mSvec:
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)
...
...
@@ -168,10 +192,12 @@ class CFmcAdc100mSvec:
self
.
csr
.
set_field
(
'RST'
,
'FMC0'
,
0
)
time
.
sleep
(
0.001
)
self
.
csr
.
set_field
(
'RST'
,
'FMC0'
,
1
)
time
.
sleep
(
0.001
)
elif
slot
==
1
:
self
.
csr
.
set_field
(
'RST'
,
'FMC1'
,
0
)
time
.
sleep
(
0.001
)
self
.
csr
.
set_field
(
'RST'
,
'FMC1'
,
1
)
time
.
sleep
(
0.001
)
else
:
raise
FmcAdc100mSvecOperationError
(
"Slot number out of range [0:1]"
)
except
CSRDeviceOperationError
as
e
:
...
...
@@ -236,69 +262,16 @@ class CFmcAdc100mSvec:
#======================================================================
# Interrupt controller core
# 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
)
# Vectored Interrupt Controller (VIC)
# Clears interrupt
def
clear_interrupt
(
self
,
irq
):
try
:
self
.
irq_controller
.
set_reg
(
'STATUS'
,
irq
)
return
self
.
irq_controller
.
get_reg
(
'STATUS'
)
except
CSRDeviceOperationError
as
e
:
raise
FmcAdc100mSvecOperationError
(
e
)
# Get current interrupt vector address
def
vic_get_current_vector_addr
(
self
):
return
self
.
vic
.
get_int_vector_addr
()
# Set acquisition end interrupt mask
def
set_irq_acq_end_mask
(
self
,
slot
,
value
):
try
:
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
)
# Acknowledge current vector
def
vic_ack_current_vector
(
self
):
self
.
vic
.
int_ack
()
# Set trigger interrupt mask
def
set_irq_trig_mask
(
self
,
slot
,
value
):
try
:
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
)
# Get raw interrupt status
def
vic_get_raw_status
(
self
):
return
self
.
vic
.
get_raw_int_status
()
test/fmcadc100m14b4cha/python/svec_test01.py
View file @
e6795d0e
...
...
@@ -115,6 +115,10 @@ def main (default_directory='.'):
error
[
i
]
=
"Wrong device mounted on system management I2C bus or soldering issues, address is:0x
%.2
X expected:0x
%.2
X"
%
(
periph_addr
[
0
],
EEPROM_ADDR
)
continue
# Timetag core
fmc
[
i
]
.
print_utc_core_regs
()
# LEDs
print
(
'
\n
Blinking LEDs'
)
for
j
in
range
(
3
):
...
...
test/fmcadc100m14b4cha/python/svec_test02.py
View file @
e6795d0e
...
...
@@ -55,7 +55,7 @@ def main (default_directory='.'):
print
"Initialising device.
\n
"
# Load FMC ADC firmware
ask
=
'
N
'
ask
=
''
while
((
ask
!=
"Y"
)
and
(
ask
!=
"N"
))
:
ask
=
raw_input
(
"Do you want to load the firmware:
%
s? [y,n]"
%
(
FMC_ADC_BITSTREAM
))
ask
=
ask
.
upper
()
...
...
@@ -79,6 +79,11 @@ def main (default_directory='.'):
# Test carrier periherals
print
(
'
\n
-------------------------------------------------------------'
)
print
(
'[Carrier]'
)
# Reset mezzanines
#carrier.sw_rst(0)
#carrier.sw_rst(1)
carrier
.
print_unique_id
()
carrier
.
print_temp
()
...
...
@@ -94,6 +99,9 @@ def main (default_directory='.'):
except
FmcAdc100mOperationError
as
e
:
raise
PtsCritical
(
"Mezzanine
%
d init failed, test stopped:
%
s"
%
(
i
+
1
,
e
))
carrier
.
vic
.
print_regs
()
# Test mezzanines peripherals
error
=
[
''
,
''
]
for
i
in
range
(
2
):
...
...
@@ -101,53 +109,56 @@ def main (default_directory='.'):
print
(
'
\n
-------------------------------------------------------------'
)
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
print
(
''
)
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_pre_trig_samples
(
500
)
fmc
[
i
]
.
set_post_trig_samples
(
500
)
fmc
[
i
]
.
set_shots
(
1
)
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
())
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."
# Wait f
rom
interrupt
# Wait f
or
interrupt
ret
=
bus
.
vv_irqwait
()
print
(
'[irq wait] irq source reg = 0x
%.8
X'
%
ret
)
ret
=
carrier
.
get_irq_status
()
print
(
'irq status = 0x
%.8
X'
%
ret
)
time
.
sleep
(
1
)
ret
=
carrier
.
clear_interrupt
(
ret
)
print
(
'Clear interrupt, irq status = 0x
%.8
X'
%
ret
)
#carrier.print_irq_controller_regs()
time
.
sleep
(
1
)
# Disable trigger interrupt
print
(
'Disable trigger interrupt'
)
carrier
.
set_irq_trig_mask
(
i
,
0
)
carrier
.
print_irq_controller_regs
()
print
(
'[irq wait] Vector Address Register (VAR) = 0x
%.8
X'
%
ret
)
print
(
'Check if interrupt is TRIGGER'
)
irq_src
=
fmc
[
i
]
.
get_eic_src
()
irq_vect
=
carrier
.
vic_get_current_vector_addr
()
print
(
"FMC
%
d EIC irq source :
%.8
X"
%
(
i
,
irq_src
))
print
(
"VIC current vector : 0x
%08
X"
%
irq_vect
)
if
(
irq_vect
==
carrier
.
fmc_eic_addr
[
i
]):
if
(
fmc
[
i
]
.
get_trig_status
()):
fmc
[
i
]
.
clear_trig_irq
()
carrier
.
vic_ack_current_vector
()
print
(
"FMC
%
d EIC irq source :
%.8
X"
%
(
i
,
fmc
[
i
]
.
get_eic_src
()))
else
:
raise
FmcAdc100mSvecOperationError
(
"Bad IRQ source : 0x
%08
X"
%
irq_src
)
else
:
raise
FmcAdc100mSvecOperationError
(
"Bad IRQ vector. expected:0x
%08
X got:0x
%08
X"
%
(
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
:
raise
PtsError
(
"Mezzanine
%
d
onewire
test failed:
%
s"
%
(
i
+
1
,
e
))
raise
PtsError
(
"Mezzanine
%
d
interrupts
test failed:
%
s"
%
(
i
+
1
,
e
))
print
(
''
)
print
"==> End of test
%02
d"
%
TEST_NB
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment