Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
P
pts
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
misc
pts
Commits
f78c441c
Commit
f78c441c
authored
Jul 29, 2011
by
Samuel Iglesias Gonsalvez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tps/test: reorder the tests to put the EEPROM one at the first position
parent
ea6fe368
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
1641 additions
and
1650 deletions
+1641
-1650
test01.bin
test/spec/firmwares/test01.bin
+0
-0
test02.bin
test/spec/firmwares/test02.bin
+0
-0
test00.py
test/spec/python/test00.py
+306
-160
test01.py
test/spec/python/test01.py
+51
-1177
test02.py
test/spec/python/test02.py
+1283
-312
tps.sh
tps.sh
+1
-1
No files found.
test/spec/firmwares/test01.bin
View file @
f78c441c
No preview for this file type
test/spec/firmwares/test0
0
.bin
→
test/spec/firmwares/test0
2
.bin
View file @
f78c441c
No preview for this file type
test/spec/python/test00.py
View file @
f78c441c
...
...
@@ -13,176 +13,322 @@ import os
from
tpsexcept
import
*
"""
test0
0: checks voltage of the power pins in FMC connector
.
test0
2: checks the EEPROM of the GENNUM chip
.
"""
BASE_GPIO
=
0x40000
BASE_MINIC
=
0xc0000
GPIO_CODR
=
0x0
GPIO_SODR
=
0x4
GPIO_PSR
=
0xc
class
COpenCoresI2C
:
R_PREL
=
0x0
R_PREH
=
0x4
R_CTR
=
0x8
R_TXR
=
0xC
R_RXR
=
0xC
R_CR
=
0x10
R_SR
=
0x10
CTR_EN
=
(
1
<<
7
)
CR_STA
=
(
1
<<
7
)
CR_STO
=
(
1
<<
6
)
CR_WR
=
(
1
<<
4
)
CR_RD
=
(
1
<<
5
)
CR_NACK
=
(
1
<<
3
)
SR_RXACK
=
(
1
<<
7
)
SR_TIP
=
(
1
<<
1
)
def
wr_reg
(
self
,
addr
,
val
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
addr
,
4
,
val
)
def
rd_reg
(
self
,
addr
):
return
self
.
bus
.
iread
(
0
,
self
.
base
+
addr
,
4
)
def
__init__
(
self
,
bus
,
base
,
prescaler
):
self
.
bus
=
bus
;
self
.
base
=
base
;
self
.
wr_reg
(
self
.
R_CTR
,
0
);
self
.
wr_reg
(
self
.
R_PREL
,
(
prescaler
&
0xff
))
self
.
wr_reg
(
self
.
R_PREH
,
(
prescaler
>>
8
))
self
.
wr_reg
(
self
.
R_CTR
,
self
.
CTR_EN
);
def
wait_busy
(
self
):
while
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_TIP
):
pass
def
start
(
self
,
addr
,
write_mode
):
addr
=
addr
<<
1
if
(
write_mode
==
False
):
addr
=
addr
|
1
;
self
.
wr_reg
(
self
.
R_TXR
,
addr
);
self
.
wr_reg
(
self
.
R_CR
,
self
.
CR_STA
|
self
.
CR_WR
);
self
.
wait_busy
()
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
TpsError
(
'Failed I2C communication. No ACK upon address (device 0x
%
x not connected?)'
%
addr
)
def
write
(
self
,
data
,
last
):
self
.
wr_reg
(
self
.
R_TXR
,
data
);
cmd
=
self
.
CR_WR
;
if
(
last
):
cmd
=
cmd
|
self
.
CR_STO
;
self
.
wr_reg
(
self
.
R_CR
,
cmd
);
self
.
wait_busy
();
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
TpsError
(
'Failed I2C communication. No ACK upon write'
)
def
read
(
self
,
last
):
cmd
=
self
.
CR_RD
;
if
(
last
):
cmd
=
cmd
|
self
.
CR_STO
|
self
.
CR_NACK
;
self
.
wr_reg
(
self
.
R_CR
,
cmd
);
self
.
wait_busy
();
return
self
.
rd_reg
(
self
.
R_RXR
);
class
ADC_AD7997
:
CONVER_R
=
0x00
;
CONFIG_R
=
0x02
;
CH8
=
(
1
<<
11
);
CH7
=
(
1
<<
10
);
CH6
=
(
1
<<
9
);
CH5
=
(
1
<<
8
);
CH4
=
(
1
<<
7
);
CH3
=
(
1
<<
6
);
CH2
=
(
1
<<
5
);
CH1
=
(
1
<<
4
);
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
def
wr_reg16
(
self
,
addr
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
tmp
=
(
value
>>
8
)
&
0xFF
;
self
.
i2c
.
write
(
value
,
False
);
tmp
=
value
&
0xFF
;
self
.
i2c
.
write
(
value
,
True
)
def
wr_reg8
(
self
,
addr
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg16
(
self
,
addr
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
tmp_MSB
=
self
.
i2c
.
read
(
False
);
tmp_LSB
=
self
.
i2c
.
read
(
True
);
value
=
(
tmp_MSB
<<
8
)
|
tmp_LSB
;
return
value
;
def
rd_reg8
(
self
,
addr
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
def
adc_value
(
value
)
:
return
str
(
2.495
*
(
0x3FF
&
(
value
>>
2
))
/
1024
);
# 10 bits
def
adc_convert_to_real_value
(
nr_value
,
value
)
:
ratio
=
{
'8'
:
0.6666
,
'7'
:
0.1666
,
'6'
:
0.52381
};
return
str
(
float
(
value
)
/
ratio
[
str
(
nr_value
)])
def
main
(
default_directory
=
'.'
):
class
EEPROM_GENNUM
:
LB_CTL
=
0x804
;
TWI_CTRL
=
0x900
;
TWI_STATUS
=
0x904
;
TWI_IRT_STATUS
=
0x910
;
I2C_ADDR
=
0x908
;
I2C_DATA
=
0x90C
;
def
__init__
(
self
,
gennum
):
self
.
gennum
=
gennum
;
def
i2c_read
(
self
,
i2c_addr
,
offset
,
length
,
read_data
):
"""Read from I2C
"""
# Shut off EEPROM_INIT state machine if not done so */
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
LB_CTL
,
4
)
#print 'LB_CTL=%.8X' % tmp
if
tmp
&
0x10000
==
0
:
tmp
|=
0x10000
self
.
gennum
.
iwrite
(
4
,
self
.
LB_CTL
,
4
,
tmp
)
# Init I2C clock Fpci/(22*Fscl)=(DIV_A+1)*(DIV_B+1)
# CLR_FIFO=1, SLVMON=0, HOLD=0, ACKEN=1, NEA=1, MS=1, RW=0
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384E
)
# Read back from register to guarantee the mode change
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_CTRL
,
4
)
# Wait until I2C bus is idle
i
=
2000000
while
i
>
0
:
i
-=
1
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
#print 'TWI_STATUS=%.8X' % tmp
#time.sleep(.5)
if
tmp
&
0x100
==
0
:
#print 'I2C bus is idle'
break
# Read to clear TWI_IRT_STATUS
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
# Write word offset
tmp
=
(
0xFF
&
offset
)
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
tmp
)
# Write device address
tmp
=
(
0x7F
&
i2c_addr
)
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
tmp
)
# Wait for transfer complete status
i
=
2000000
while
i
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
if
tmp
&
0x1
:
break
elif
tmp
&
0xC
:
raise
TpsError
(
'NACK detected or TIMEOUT, IRT_STATUS = 0x
%
x!!'
%
tmp
)
sys
.
exit
()
i
-=
1
if
i
==
0
:
raise
TpsError
(
'ERROR, completion status not detected!!'
)
sys
.
exit
()
# Change to read mode
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384F
)
# Perform sequential page read from the start address
error_flag
=
0
total_transfer
=
0
while
length
>
0
and
error_flag
==
0
:
# Transfer bigger than I2C fifo (8 bytes) are split
if
length
>
8
:
transfer_len
=
8
length
-=
8
else
:
transfer_len
=
length
length
=
0
# Update expected receive data size
self
.
gennum
.
iwrite
(
4
,
0x914
,
4
,
transfer_len
)
# Write device address
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
(
0x7F
&
i2c_addr
))
# Wait until transfer is completed
j
=
2000000
while
j
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
if
tmp
&
0x1
:
#print 'Transfer completed'
break
j
-=
1
if
j
==
0
:
error_flag
=
1
raise
TpsWarning
(
'ERROR, completion status not detected!!'
)
# Read data from fifo
while
transfer_len
>
0
:
read_data
.
append
(
0xFF
&
self
.
gennum
.
iread
(
4
,
self
.
I2C_DATA
,
4
))
transfer_len
-=
1
total_transfer
+=
1
# End of read
return
total_transfer
#
def
i2c_write
(
self
,
i2c_addr
,
offset
,
length
,
write_data
):
"""Write to I2C
"""
path_fpga_loader
=
'../firmwares/fpga_loader'
;
path_firmware
=
'../firmwares/test00.bin'
;
firmware_loader
=
os
.
path
.
join
(
default_directory
,
path_fpga_loader
)
bitstream
=
os
.
path
.
join
(
default_directory
,
path_firmware
)
os
.
system
(
firmware_loader
+
' '
+
bitstream
)
# Shut off EEPROM_INIT state machine if not done so */
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
LB_CTL
,
4
)
if
tmp
&
0x10000
==
0
:
tmp
|=
0x10000
self
.
gennum
.
iwrite
(
4
,
self
.
LB_CTL
,
4
,
tmp
)
time
.
sleep
(
2
);
gennum
=
rr
.
Gennum
();
# Read to clear TWI_IRT_STATUS
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
# Read to clear TWI_STATUS
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
# Init I2C clock Fpci/(22*Fscl)=(DIV_A+1)*(DIV_B+1)
# CLR_FIFO=1, SLVMON=0, HOLD=0, ACKEN=1, NEA=1, MS=1, RW=0
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384E
)
# Read back from register to guarantee the mode change
self
.
gennum
.
iread
(
4
,
self
.
TWI_CTRL
,
4
)
# Wait until I2C bus is idle
i
=
2000000
while
i
>
0
:
i
-=
1
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
if
tmp
&
0x100
==
0
:
break
# Perform sequential page write from the start address
error_flag
=
0
total_transfer
=
0
while
length
>
0
and
error_flag
==
0
:
# Write word offset
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
(
0xFF
&
offset
))
i
=
6
# fifo size - 2
while
i
>
0
and
length
>
0
:
tmp
=
(
0xFF
&
write_data
[
total_transfer
])
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
tmp
)
total_transfer
+=
1
offset
+=
1
i
-=
1
length
-=
1
# Reaches the page write address boundary, thus need to start
# the offset at the next page (page size = 8)
if
offset
&
7
==
0
:
break
# Write device address
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
(
0x7F
&
i2c_addr
))
#print 'Write I2C address'
# Wait until transfer is completed
i
=
2000000
while
i
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
time
.
sleep
(
0.01
)
if
tmp
&
0x1
:
#print 'Transfer completed!'
tmp
=
self
.
gennum
.
iread
(
4
,
0x914
,
4
)
#print 'TR_SIZE=%d' % tmp
break
elif
tmp
&
0xC
:
raise
TpsWarning
(
'NACK detected or TIMEOUT, IRT_STATUS = 0x
%
x!!'
%
tmp
)
tmp
=
self
.
gennum
.
iread
(
4
,
0x914
,
4
)
return
total_transfer
i
-=
1
return
total_transfer
i2c
=
COpenCoresI2C
(
gennum
,
0x40000
,
99
);
# Prescaler value calculated using 50 MHz clock
def
eeprom_dump_to_screen
(
self
):
""" Dump the content of the EEPROM to the screen
"""
# The address of the AD7997 is 0x23, pin 15 connected to GND.
adc
=
ADC_AD7997
(
i2c
,
0x23
);
eeprom_data
=
[]
nb_rec
=
42
self
.
i2c_read
(
0x56
,
0
,
nb_rec
*
6
,
eeprom_data
)
for
i
in
range
(
0
,
nb_rec
*
6
,
6
):
addr
=
eeprom_data
[
i
]
+
(
eeprom_data
[
i
+
1
]
<<
8
)
data
=
eeprom_data
[
i
+
2
]
+
(
eeprom_data
[
i
+
3
]
<<
8
)
+
(
eeprom_data
[
i
+
4
]
<<
16
)
+
(
eeprom_data
[
i
+
5
]
<<
24
)
if
addr
==
0xFFFF
:
break
print
'[
%.2
d]=
%.4
X
%.8
X'
%
(
i
/
6
,
addr
,
data
)
print
''
for
i
in
range
(
0
,
len
(
eeprom_data
)):
print
'[
%.2
d]=
%.2
X'
%
(
i
,
eeprom_data
[
i
])
if
eeprom_data
[
i
+
1
]
==
0xFF
and
eeprom_data
[
i
+
2
]
==
0xFF
:
break
return
0
value8
=
adc_value
(
adc
.
rd_reg16
(
0xF0
));
value7
=
adc_value
(
adc
.
rd_reg16
(
0xE0
));
value6
=
adc_value
(
adc
.
rd_reg16
(
0xD0
));
value5
=
adc_value
(
adc
.
rd_reg16
(
0xC0
));
value4
=
adc_value
(
adc
.
rd_reg16
(
0xB0
));
value3
=
adc_value
(
adc
.
rd_reg16
(
0xA0
));
value2
=
adc_value
(
adc
.
rd_reg16
(
0x90
));
value1
=
adc_value
(
adc
.
rd_reg16
(
0x80
));
def
eeprom_dump_to_file
(
self
,
file_name
):
"""Dump the content of the EEPROM to a file
"""
# Check the values of the ADC.
if
(
float
(
value8
)
<
1.58
)
or
(
float
(
value8
)
>
1.75
)
:
raise
TpsError
(
"Error in VS_VADJ (2.5V) measured "
+
adc_convert_to_real_value
(
8
,
value8
)
+
"V."
)
print
"VS_VADJ = "
+
adc_convert_to_real_value
(
8
,
value8
)
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'w+'
)
eeprom_data
=
[]
nb_rec
=
100
self
.
i2c_read
(
0x56
,
0
,
nb_rec
*
6
,
eeprom_data
)
for
i
in
range
(
0
,
nb_rec
*
6
,
6
):
addr
=
eeprom_data
[
i
]
+
(
eeprom_data
[
i
+
1
]
<<
8
)
data
=
eeprom_data
[
i
+
2
]
+
(
eeprom_data
[
i
+
3
]
<<
8
)
+
(
eeprom_data
[
i
+
4
]
<<
16
)
+
(
eeprom_data
[
i
+
5
]
<<
24
)
print
>>
file
,
'
%.4
X
%.8
X'
%
(
addr
,
data
)
if
addr
==
0xFFFF
:
break
return
0
if
(
float
(
value7
)
<
1.88
)
or
(
float
(
value7
)
>
2.13
):
raise
TpsError
(
"Error in VS_P12V_x (12V) measured "
+
adc_convert_to_real_value
(
7
,
value7
)
+
"V."
)
print
"VS_P12V_x = "
+
adc_convert_to_real_value
(
7
,
value7
)
def
file_dump_to_screen
(
self
,
file_name
):
"""Dump the content of a file to the screen
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
for
line
in
file
:
addr
,
data
=
line
.
split
()
print
addr
+
' '
+
data
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
print
''
for
i
in
range
(
0
,
len
(
file_data
)):
print
'[
%.2
d]=
%.2
X'
%
(
i
,
file_data
[
i
])
return
0
if
(
float
(
value6
)
<
1.64
)
or
(
float
(
value6
)
>
1.82
):
raise
TpsError
(
"Error in VS_P3V3_x (3.3V) measured "
+
adc_convert_to_real_value
(
6
,
value6
)
+
"V."
)
print
"VS_P3V3_x = "
+
adc_convert_to_real_value
(
6
,
value6
)
def
file_dump_to_eeprom
(
self
,
file_name
):
"""Dump the content of a file to the EEPROM
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
# Write EEPROM
#print len(file_data)
#print file_data
written
=
self
.
i2c_write
(
0x56
,
0
,
len
(
file_data
),
file_data
)
if
written
==
len
(
file_data
):
print
'EEPROM written with '
+
file_name
+
' content!'
else
:
raise
TpsError
(
"ERROR writting to the EEPROM: Written lenght doesn't correspond with the length of the file."
)
return
0
def
compare_eeprom_with_file
(
self
,
file_name
):
"""Compare the content of a file to the EEPROM
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
eeprom_data
=
[]
nb_rec
=
0
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
nb_rec
+=
1
# Read EEPROM
self
.
i2c_read
(
0x56
,
0
,
(
nb_rec
+
1
)
*
6
,
eeprom_data
)
# Compare
for
i
in
range
(
0
,
len
(
file_data
)):
if
file_data
[
i
]
==
eeprom_data
[
i
]:
print
'EEPROM=
%.2
X, FILE=
%.2
X => OK'
%
(
eeprom_data
[
i
],
file_data
[
i
])
else
:
raise
TpsError
(
'EEPROM=
%.2
X, FILE=
%.2
X => ERROR'
%
(
eeprom_data
[
i
],
file_data
[
i
]))
def
file_dump_to_gennum
(
self
,
file_name
):
if
file_name
==
""
:
file_name
=
"./gn4124_diff.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
file_addr
=
[]
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
file_data
.
append
(
int
(
data
,
16
))
file_addr
.
append
(
int
(
addr
,
16
))
# Write Gennum configuration space
for
i
in
range
(
0
,
len
(
file_data
)):
self
.
gennum
.
iwrite
(
4
,
file_addr
[
i
],
4
,
file_data
[
i
])
print
' '
print
'Gennum configuration space written with '
+
file_name
+
' content!'
print
' '
def
main
(
default_directory
=
'.'
):
gennum
=
rr
.
Gennum
();
eeprom
=
EEPROM_GENNUM
(
gennum
);
eeprom
.
file_dump_to_gennum
(
default_directory
+
"/gn4124_diff.dat"
);
eeprom
.
eeprom_dump_to_file
(
"/tmp/eeprom.dat"
);
eeprom
.
file_dump_to_eeprom
(
default_directory
+
"/eeprom_test_A.dat"
);
eeprom
.
eeprom_dump_to_screen
();
eeprom
.
compare_eeprom_with_file
(
default_directory
+
"/eeprom_test_A.dat"
);
eeprom
.
file_dump_to_eeprom
(
"/tmp/eeprom.dat"
);
eeprom
.
eeprom_dump_to_screen
();
eeprom
.
compare_eeprom_with_file
(
"/tmp/eeprom.dat"
);
if
__name__
==
'__main__'
:
main
();
test/spec/python/test01.py
View file @
f78c441c
...
...
@@ -2,64 +2,26 @@
# coding: utf8
# Copyright CERN, 2011
# Author:
Carlos Gil Soriano <cgilsori
@cern.ch>
# Author:
Samuel Iglesias Gonsalvez <siglesia
@cern.ch>
# Licence: GPL v2 or later.
# Website: http://www.ohwr.org
import
sys
import
rr
import
time
import
os
import
errno
from
tpsexcept
import
*
# jdgc
from
tpsexcept
import
*
"""
test0
1: checks the low speed pins of FMC connector (low count connector)
.
test0
0: checks voltage of the power pins in FMC connector
.
"""
tests_path
=
'.'
default_log_path
=
'.'
# Mapping for seven slaves!
BASE_I2C_B
=
0x20000
BASE_GPIO0
=
0x40000
BASE_GPIO1
=
0x60000
BASE_GPIO2
=
0x80000
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
=
0x00
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
=
0x01
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
=
0x02
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
=
0x03
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
=
0x04
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
=
0x05
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
=
0x06
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
=
0x07
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_64bits
=
0x08
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_64bits
=
0x09
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_64bits
=
0x0A
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_64bits
=
0x0B
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_96bits
=
0x0C
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_96bits
=
0x0D
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_96bits
=
0x0E
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_96bits
=
0x0F
testStatus
=
{}
gpio_0_to_tester
=
[
'LA17N'
,
'LA19N'
,
'LA19P'
,
'LA20P'
,
'LA20N'
,
'LA14N'
,
'LA14P'
,
'LA17P'
,
'LA13N'
,
'LA13P'
,
'LA15P'
,
'LA15N'
,
'LA16P'
,
'LA32N'
,
'LA33P'
,
'LA33N'
,
'LA7P'
,
'LA5P'
,
'LA7N'
,
'LA8N'
,
'LA8P'
,
'LA6N'
,
'LA12P'
,
'LA9N'
,
'LA16N'
,
'LA12N'
,
'LA11P'
,
'LA10N'
,
'LA11N'
,
'LA10P'
,
'LA9P'
,
'LA5N'
]
gpio_1_to_tester
=
[
'LA27P'
,
'LA23N'
,
'LA22P'
,
'LA22N'
,
'LA18N'
,
'LA18P'
,
'LA23P'
,
'LA21P'
,
'LA24P'
,
'LA25N'
,
'TCK_TO_FMC'
,
'LA25P'
,
'LA27N'
,
'LA26P'
,
'LA21N'
,
'LA26N'
,
'LA32P'
,
'LA30N'
,
'GA1'
,
'LA31N'
,
'LA30P'
,
'GA0'
,
'TRST_TO_FMC'
,
'TMS_TO_FMC'
,
'LA29P'
,
'LA29N'
,
'TDO_FROM_FMC'
,
'LA31P'
,
'LA28N'
,
'LA28P'
,
'TDI_TO_FMC'
,
'LA24N'
]
gpio_2_to_tester
=
[
'CLK0_M2C_N'
,
'CLK0_M2C_P'
,
'PRSNT_M2C_L'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'M2C_DIR'
,
'PG_C2M'
,
'LA1P'
,
'LA6P'
,
'LA1N'
,
'LA3N'
,
'LA4P'
,
'LA3P'
,
'VREF_A_M2C'
,
'CLK1_M2C_N'
,
'CLK1_M2C_P'
,
'LA0P'
,
'LA2P'
,
'LA0N'
,
'LA2N'
,
'LA4N'
]
gpio_0_to_FMC
=
[
'D21'
,
'H23'
,
'H22'
,
'G21'
,
'G22'
,
'C19'
,
'C18'
,
'D20'
,
'D18'
,
'D17'
,
'H19'
,
'H20'
,
'G18'
,
'H38'
,
'G36'
,
'G37'
,
'H13'
,
'D11'
,
'H14'
,
'G13'
,
'G12'
,
'C11'
,
'G15'
,
'D15'
,
'G19'
,
'G16'
,
'H16'
,
'C15'
,
'H17'
,
'C14'
,
'D14'
,
'D12'
]
gpio_1_to_FMC
=
[
'C26'
,
'D24'
,
'G24'
,
'G25'
,
'C23'
,
'C22'
,
'D23'
,
'H25'
,
'H28'
,
'G28'
,
'D29'
,
'G27'
,
'C27'
,
'D26'
,
'H26'
,
'D27'
,
'H37'
,
'H35'
,
'D35'
,
'G34'
,
'H34'
,
'C34'
,
'D34'
,
'D33'
,
'G30'
,
'G31'
,
'D31'
,
'G33'
,
'H32'
,
'H31'
,
'D30'
,
'H29'
]
gpio_2_to_FMC
=
[
'H5'
,
'H4'
,
'H2'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'B1'
,
'D1'
,
'D8'
,
'C10'
,
'D9'
,
'G10'
,
'H10'
,
'G9'
,
'H1'
,
'G3'
,
'G2'
,
'G6'
,
'H7'
,
'G7'
,
'H8'
,
'H11'
]
i2c_addr_to_schematicID
=
{
0x27
:
'IC1'
,
0x24
:
'IC2'
,
0x22
:
'IC3'
,
0x26
:
'IC4'
,
0x21
:
'IC5'
,
0x25
:
'IC6'
}
BASE_GPIO
=
0x40000
BASE_MINIC
=
0xc0000
GPIO_CODR
=
0x0
GPIO_SODR
=
0x4
GPIO_PSR
=
0xc
class
COpenCoresI2C
:
R_PREL
=
0x0
R_PREH
=
0x4
...
...
@@ -108,7 +70,7 @@ class COpenCoresI2C:
self
.
wait_busy
()
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
Exception
(
'No ACK upon address (device 0x
%
x not connected?)'
%
(
addr
>>
1
)
)
raise
TpsError
(
'Failed I2C communication. No ACK upon address (device 0x
%
x not connected?)'
%
addr
)
def
write
(
self
,
data
,
last
):
self
.
wr_reg
(
self
.
R_TXR
,
data
);
...
...
@@ -118,7 +80,7 @@ class COpenCoresI2C:
self
.
wr_reg
(
self
.
R_CR
,
cmd
);
self
.
wait_busy
();
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
Exception
(
'
No ACK upon write'
)
raise
TpsError
(
'Failed I2C communication.
No ACK upon write'
)
def
read
(
self
,
last
):
cmd
=
self
.
CR_RD
;
...
...
@@ -129,9 +91,6 @@ class COpenCoresI2C:
return
self
.
rd_reg
(
self
.
R_RXR
);
# To be done
#class EEPROM_2AA64T:
class
ADC_AD7997
:
CONVER_R
=
0x00
;
CONFIG_R
=
0x02
;
...
...
@@ -174,1141 +133,56 @@ class ADC_AD7997:
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
## To be done
class
SWITCH_ADN4600
:
# Only basic mode is implemented
RST
=
0x0
;
XPT_CFG
=
0x1
;
XPT_STAT_0
=
0x50
;
XPT_STAT_1
=
0x51
;
XPT_STAT_2
=
0x52
;
XPT_STAT_3
=
0x53
XPT_STAT_4
=
0x54
;
XPT_STAT_5
=
0x55
;
XPT_STAT_6
=
0x56
;
XPT_STAT_7
=
0x57
RX0_CONF
=
0x80
;
RX1_CONF
=
0x88
;
RX2_CONF
=
0x90
;
RX3_CONF
=
0x98
;
RX4_CONF
=
0xA0
;
RX5_CONF
=
0xA8
;
RX6_CONF
=
0xB0
;
RX7_CONF
=
0xB8
;
TX0_CONF
=
0xC0
;
TX1_CONF
=
0xC8
;
TX2_CONF
=
0xD0
;
TX3_CONF
=
0xD8
;
TX4_CONF
=
0xE0
;
TX5_CONF
=
0xE8
;
TX6_CONF
=
0xF0
;
TX7_CONF
=
0xF8
;
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
def
wr_reg8
(
self
,
bank
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg8
(
self
,
bank
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
def
passby_input_output
(
self
,
channel_input
,
channel_output
):
pass
class
EXPANDER_MCP23017
:
IODIRA
=
0x0
;
IODIRB
=
0x01
IPOLA
=
0x02
;
IPOLB
=
0x03
;
GPINTENA
=
0x04
;
GPINTENB
=
0x05
;
DEFVALA
=
0x06
;
DEFVALB
=
0x07
;
INTCONA
=
0x08
;
INTCONB
=
0x09
;
# Shared register between the two ports
IOCONA
=
0x0A
;
IOCONB
=
0x0B
;
GPPUA
=
0x0C
;
GPPUB
=
0x0D
;
INTFA
=
0x0E
;
INTFB
=
0x0F
;
INTCAPA
=
0x10
;
INTCAPB
=
0x11
;
GPIOA
=
0x12
;
GPIOB
=
0x13
;
OLATA
=
0x14
;
OLATB
=
0x15
;
IOCON_BANK
=
7
;
IOCON_MIRROR
=
6
;
IOCON_SEQOP
=
5
;
IOCON_DISSLW
=
4
;
IOCON_HAEN
=
3
;
IOCON_ODR
=
2
;
IOCON_INTPOL
=
1
;
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
cfg_value
=
(
0
<<
EXPANDER_MCP23017
.
IOCON_BANK
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_MIRROR
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_SEQOP
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_DISSLW
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_HAEN
)
+
(
0
<<
EXPANDER_MCP23017
.
IOCON_ODR
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_INTPOL
);
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IOCONA
,
False
);
self
.
i2c
.
write
(
cfg_value
,
True
);
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IOCONB
,
False
);
self
.
i2c
.
write
(
cfg_value
,
True
);
# Setup every port as input
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# 1 means input
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# Setup input polarity register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IPOLA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# 0 means no change in polarity at output
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IPOLB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup interrupt-on-change control register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# 0 means no interrupt
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup default comparre register for interrupt-on-change
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# In case that interrupt-on-change is used
self
.
i2c
.
start
(
self
.
addr
,
True
);
# this is the default interrupt msimatch value
self
.
i2c
.
write
(
self
.
GPINTENB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup interrupt control register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# If 0 is select it means that comparison takes places
self
.
i2c
.
start
(
self
.
addr
,
True
);
# against DEFVAL. Otherwise, against last value (OLAT)
self
.
i2c
.
write
(
self
.
INTCONB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup pull-up resistor configuration register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONA
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# 1 means using 100K as pull-up
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONB
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
def
set_input
(
self
,
bank
,
boolean
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
if
(
bank
==
EXPANDER_MCP23017
.
GPIOA
):
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
else
:
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
if
(
boolean
):
self
.
i2c
.
write
(
0xFF
,
True
);
else
:
self
.
i2c
.
write
(
0x00
,
True
);
def
set_input_masked
(
self
,
bank
,
mask
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
if
(
bank
==
EXPANDER_MCP23017
.
GPIOA
):
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
else
:
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
self
.
i2c
.
write
(
mask
,
True
);
def
wr_reg8
(
self
,
bank
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg8
(
self
,
bank
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
class
GPIO_slave
:
R_GPIO_DIR
=
0x0
R_GPIO_IOBUF
=
0x4
R_GPIO_CTR
=
0x8
def
__init__
(
self
,
bus
,
base
):
self
.
bus
=
bus
;
self
.
base
=
base
;
if
(
self
.
base
==
BASE_GPIO0
):
self
.
name
=
'GPIO_0'
elif
(
self
.
base
==
BASE_GPIO1
):
# if (self.base == BASE_GPIO1):
self
.
name
=
'GPIO_1'
elif
(
self
.
base
==
BASE_GPIO2
):
self
.
name
=
'GPIO_2'
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0xFFFFFFFF
)
def
rd_GPIO_CTR
(
self
):
return
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_CTR
,
4
)
def
set_GPIO_inout
(
self
,
value
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
value
)
def
wr_GPIO_block
(
self
,
value
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0x00000000
)
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
,
value
)
def
rd_GPIO_block
(
self
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0xFFFFFFFF
)
return
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
)
def
wr_GPIO_block_custom
(
self
,
mask
,
value
):
wr_mask
=
mask
^
0xFFFFFFFF
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
wr_mask
)
# According to IOBUF spec, 0 means write into the pad
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
,
value
&
mask
)
def
rd_GPIO_block_custom
(
self
,
mask
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
mask
)
# According to IOBUF spec, 0 means write into the pad
value
=
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
)
return
(
value
&
mask
)
def
mkdir_p
(
path
):
try
:
os
.
makedirs
(
path
)
except
OSError
as
exc
:
if
exc
.
errno
==
errno
.
EEXIST
:
pass
else
:
raise
def
FMC_roll_test_CC_16bits
(
i2c_block
,
i2c_block_mask
,
gpio_block
,
gpio_block_mask
,
offset
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
if
offset
!=
0
|
offset
!=
16
:
raise
Exception
(
"Bad offset"
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0xFFFF
else
:
expected
=
0xFFFF
^
(
1
<<
(
i
+
offset
))
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
expected
=
expected
&
gpio_block_mask
gpio_block
.
wr_GPIO_block
(
expected
)
rcv_byte1
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte1
<<
8
)
|
rcv_byte0
expected
=
expected
>>
offset
header_msg
=
"
%.4
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
16
,
header_msg
,
gpio_block
,
offset
)
# LOOK AT THIS PART!!
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
groundShorts
=
[]
vsupplyShorts
=
[]
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0x0000
else
:
expected
=
0x0000
^
(
1
<<
(
i
+
offset
))
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
expected
=
expected
&
gpio_block_mask
gpio_block
.
wr_GPIO_block
(
expected
)
rcv_byte1
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte1
<<
8
)
|
rcv_byte0
expected
=
expected
>>
offset
header_msg
=
"
%.4
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
16
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
groundShorts
=
[]
vsupplyShorts
=
[]
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC
(
i2c_block_upper
,
i2c_block_upper_mask
,
i2c_block_lower
,
i2c_block_lower_mask
,
gpio_block
,
gpio_block_mask
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRB))
# print "IODIRA\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
(
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0xFFFFFFFF
else
:
expected
=
0xFFFFFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
wr_GPIO_block
(
expected
&
gpio_block_mask
)
rcv_byte3
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte2
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
rcv_byte1
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte3
<<
24
)
|
(
rcv_byte2
<<
16
)
|
(
rcv_byte1
<<
8
)
|
rcv_byte0
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
gpio_trans_list
=
[]
if
gpio_block
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_block
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_block
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
bits_tested
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
groundedPins_string
=
''
vsupplyShorts_string
=
''
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
print
"---- Grounded pins:
\t
"
+
groundedPins_string
if
len
(
vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
print
"---- Vcc tied pins:
\t
"
+
vsupplyShorts_string
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
(
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0x00000000
else
:
expected
=
0x00000000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
wr_GPIO_block
(
expected
&
gpio_block_mask
)
#print "Reading Back\t" + hex(gpio_block.rd_GPIO_block() & gpio_block_mask)
rcv_byte3
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte2
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
rcv_byte1
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte3
<<
24
)
|
(
rcv_byte2
<<
16
)
|
(
rcv_byte1
<<
8
)
|
rcv_byte0
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC_16bits_i2c_writing
(
i2c_block
,
i2c_block_mask
,
gpio_block
,
gpio_block_mask
,
offset
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
if
offset
!=
0
|
offset
!=
16
:
raise
Exception
(
"Bad offset"
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0xFFFF
else
:
expected
=
0xFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_A
=
((
0xFF00
)
&
i2c_block_mask
)
>>
8
mask_B
=
(
0x00FF
)
&
i2c_block_mask
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte1
=
(
0xFF00
&
expected
)
>>
8
wr_byte0
=
(
0x00FF
&
expected
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
>>
offset
received
=
received
expected
=
expected
&
i2c_block_mask
header_msg
=
"
%.4
X"
%
expected
gpio_block_mask_tmp
=
(
gpio_block_mask
>>
offset
)
&
0x0000FFFF
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask_tmp
,
16
,
header_msg
,
gpio_block
,
offset
)
return
self
.
i2c
.
read
(
True
);
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
def
adc_value
(
value
)
:
return
str
(
2.495
*
(
0x3FF
&
(
value
>>
2
))
/
1024
);
# 10 bits
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0x0000
else
:
expected
=
0x0000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_A
=
((
0xFF00
)
&
i2c_block_mask
)
>>
8
mask_B
=
(
0x00FF
)
&
i2c_block_mask
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte1
=
(
0xFF00
&
expected
)
>>
8
wr_byte0
=
(
0x00FF
&
expected
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
>>
offset
received
=
received
expected
=
expected
&
i2c_block_mask
header_msg
=
"
%.4
X"
%
expected
gpio_block_mask_tmp
=
(
gpio_block_mask
>>
offset
)
&
0x0000FFFF
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask_tmp
,
16
,
header_msg
,
gpio_block
,
offset
)
groundShorts_tmp
=
sorted
(
set
(
groundShorts
))
vsupplyShorts_tmp
=
sorted
(
set
(
vsupplyShorts
))
groundShorts
=
[]
vsupplyShorts
=
[]
# for index in groundShorts_tmp:
# print "groundShorts\t" + str(index)
# groundShorts.append(index + offset)
# for index in vsupplyShorts_tmp:
# print "vsupplyShorts\t" + str(index)
# vsupplyShorts.append(index + offset)
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC_i2c_writing
(
i2c_block_upper
,
i2c_block_upper_mask
,
i2c_block_lower
,
i2c_block_lower_mask
,
gpio_block
,
gpio_block_mask
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRB))
# print "IODIRA\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0xFFFFFFFF
else
:
expected
=
0xFFFFFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_upper_A
=
((
0xFF00
)
&
i2c_block_upper_mask
)
>>
8
mask_upper_B
=
(
0x00FF
)
&
i2c_block_upper_mask
mask_lower_A
=
((
0xFF00
)
&
i2c_block_lower_mask
)
>>
8
mask_lower_B
=
(
0x00FF
)
&
i2c_block_lower_mask
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte3
=
(
0xFF000000
&
expected
)
>>
24
wr_byte2
=
(
0x00FF0000
&
expected
)
>>
16
wr_byte1
=
(
0x0000FF00
&
expected
)
>>
8
wr_byte0
=
(
0x000000FF
&
expected
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte3
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte2
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
received
=
received
expected
=
expected
&
gpio_block_mask
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0x00000000
else
:
expected
=
0x00000000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_upper_A
=
((
0xFF00
)
&
i2c_block_upper_mask
)
>>
8
mask_upper_B
=
(
0x00FF
)
&
i2c_block_upper_mask
mask_lower_A
=
((
0xFF00
)
&
i2c_block_lower_mask
)
>>
8
mask_lower_B
=
(
0x00FF
)
&
i2c_block_lower_mask
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte3
=
(
0xFF000000
&
expected
)
>>
24
wr_byte2
=
(
0x00FF0000
&
expected
)
>>
16
wr_byte1
=
(
0x0000FF00
&
expected
)
>>
8
wr_byte0
=
(
0x000000FF
&
expected
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte3
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte2
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
received
=
received
expected
=
expected
&
gpio_block_mask
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
#Needs rework here
def
analyse_Shortcircuit
(
expected
,
received
,
mask
,
amountOfPins
,
header_msg
,
gpio_bank
,
offset
):
discrepancies
=
expected
^
received
tmp_groundShorts
=
[]
tmp_vsupplyShorts
=
[]
global
groundShorts
,
vsupplyShorts
for
i
in
xrange
(
amountOfPins
):
if
((
mask
&
(
1
<<
i
))
==
0
):
pass
elif
((
discrepancies
&
(
1
<<
i
))
==
(
1
<<
i
)):
#Discrepancy detected at position i
if
((
expected
&
(
1
<<
i
))
==
(
1
<<
i
)):
#It was a ground short
tmp_groundShorts
.
append
(
i
)
groundShorts
.
append
(
i
)
else
:
#It was vsupply short
tmp_vsupplyShorts
.
append
(
i
)
vsupplyShorts
.
append
(
i
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
groundedPins_string
=
''
vsupplyShorts_string
=
''
if
gpio_bank
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_bank
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_bank
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
amountOfPins
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
tmp_groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
if
len
(
tmp_vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
if
len
(
tmp_groundShorts
)
==
0
|
len
(
tmp_vsupplyShorts
)
==
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Test OK!"
elif
len
(
tmp_groundShorts
)
!=
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Grounded pins:
\t
"
+
groundedPins_string
elif
len
(
tmp_vsupplyShorts
)
!=
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Vcc tied pins:
\t
"
+
vsupplyShorts_string
#Just to improve human-readabilty
groundShorts
.
reverse
()
vsupplyShorts
.
reverse
()
# if (len(groundShorts) != 0):
# print header_msg + "\tYes\tGround shorts in pins:\t" + str(groundShorts);
#
# if (len(vsupplyShorts) != 0):
# print header_msg + "\tYes\tVCC shorts in pins:\t" + str(vsupplyShorts);
#
# if ( (len(groundShorts) == 0) & (len(vsupplyShorts) == 0)):
# print header_msg + "\tNo"
# return
#else:
# raise Exception("Shortcircuits detected!")
def
get_filename
(
gpio_bank_list
,
i2c_list
):
filename
=
''
for
k
in
sorted
(
gpio_bank_list
):
filename
+=
'_'
+
k
.
name
for
l
in
sorted
(
i2c_list
):
filename
+=
'_'
+
i2c_addr_to_schematicID
[
l
.
addr
]
return
filename
def
show_test_results
(
gpio_bank
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
):
if
(
offset
==
0
):
if
(
bits_tested
!=
16
|
bits_tested
!=
32
|
bits_tested
!=
64
|
bits_tested
!=
96
):
raise
Exception
(
"show_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
==
16
):
if
(
bits_tested
!=
16
):
raise
Exception
(
"show_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
!=
0
|
offset
!=
16
):
raise
Exception
(
"show_test_results: bad 'offset'"
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
groundedPins_string
=
""
vsupplyShorts_string
=
""
okPins_string
=
""
gpio_trans_list
=
[]
if
gpio_bank
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_bank
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_bank
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
bits_tested
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
print
"---- Grounded pins:
\t
"
+
groundedPins_string
if
len
(
vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
print
"---- Vcc tied pins:
\t
"
+
vsupplyShorts_string
def
summary_results
(
testStatus
):
loopback_log
=
os
.
path
.
join
(
default_log_path
,
'./log/test_fmc/loopback/'
)
mkdir_p
(
loopback_log
)
string
=
''
for
i
in
sorted
(
testStatus
.
keys
()):
string_tmp
=
' '
+
i
.
replace
(
'_'
,
' '
)
+
' '
string
+=
string_tmp
[:
30
]
+
testStatus
[
i
]
+
"
\n
"
for
i
in
sorted
(
testStatus
.
keys
()):
if
testStatus
[
i
]
==
'Fail'
:
raise
TpsError
(
"FMC connector failure"
)
print
string
filename
=
"Summary_FMC_tets.txt"
file
=
open
(
os
.
path
.
join
(
loopback_log
,
filename
),
'w'
)
file
.
write
(
string
)
def
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
):
# We store data in log subfolder
fmc_pinout_log
=
os
.
path
.
join
(
default_log_path
,
'./log/test_fmc/loopback/FMC_pinout'
)
mkdir_p
(
fmc_pinout_log
)
if
(
offset
==
0
):
if
(
bits_tested
!=
16
|
bits_tested
!=
32
|
bits_tested
!=
64
|
bits_tested
!=
96
):
raise
Exception
(
"write_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
==
16
):
if
(
bits_tested
!=
16
):
raise
Exception
(
"write_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
!=
0
|
offset
!=
16
):
raise
Exception
(
"write_test_results: bad 'offset'"
)
number_of_gpios
=
len
(
gpio_bank_list
)
# if number_of_gpios != (bits_tested/32):
# raise Exception("'bits_tested' are incompatible with GPIO assigment")
filename
=
"FMC"
# print "offset:\t" + str(offset)
filename
+=
get_filename
(
gpio_bank_list
,
i2c_list
)
filename
+=
'_'
+
"
%.2
X"
%
test_id
+
'.txt'
# This file generation must be revised !!!
# yes indeed!!! jdgc
gpio_pinout
=
os
.
path
.
join
(
tests_path
,
'./log/test_fmc/loopback/GPIO_pinout/'
)
mkdir_p
(
gpio_pinout
)
file
=
open
(
os
.
path
.
join
(
gpio_pinout
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'GPIO pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
for
k
in
range
(
number_of_gpios
-
1
,
-
1
,
-
1
):
file
.
write
(
'--'
+
gpio_bank_list
[
k
]
.
name
+
'
\n
'
)
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
((
i
+
32
*
k
)
in
groundShorts
and
(
i
+
32
*
k
)
in
vsupplyShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
Shortcircuit'
+
'
\n
'
)
elif
((
i
+
32
*
k
)
in
groundShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
Grounded'
+
'
\n
'
)
elif
((
i
+
32
*
k
)
in
vsupplyShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
VCC tied'
+
'
\n
'
)
else
:
file
.
write
(
str
(
i
)
+
'
\t\t
OK'
+
'
\n
'
)
file
.
close
()
tester_pinout
=
os
.
path
.
join
(
tests_path
,
'./log/test_fmc/loopback/tester_pinout/'
)
mkdir_p
(
tester_pinout
)
file
=
open
(
os
.
path
.
join
(
tester_pinout
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'Tester pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
gpio_order
=
[]
for
k
in
xrange
(
number_of_gpios
):
if
gpio_bank_list
[
k
]
.
name
==
'GPIO_0'
:
gpio_order
.
append
(
gpio_0_to_tester
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_1'
:
gpio_order
.
append
(
gpio_1_to_tester
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_2'
:
gpio_order
.
append
(
gpio_2_to_tester
)
else
:
raise
Exception
(
"Bad 'gpio_block_name_list'"
)
for
k
in
xrange
(
number_of_gpios
):
translation_dict
=
{}
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
(
i
in
groundShorts
and
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Shortcircuit'
elif
(
i
in
groundShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Grounded'
elif
(
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'VCC tied'
else
:
translation_dict
[
gpio_order
[
k
][
i
]]
=
'OK'
file
.
write
(
'--'
+
gpio_bank_list
[
k
]
.
name
+
'
\n
'
)
for
k
in
sorted
(
translation_dict
.
keys
()):
file
.
write
(
k
+
'
\t\t
'
+
translation_dict
[
k
]
+
'
\n
'
)
file
.
close
()
gpio_order
=
[]
for
k
in
xrange
(
number_of_gpios
):
if
gpio_bank_list
[
k
]
.
name
==
'GPIO_0'
:
gpio_order
.
append
(
gpio_0_to_FMC
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_1'
:
gpio_order
.
append
(
gpio_1_to_FMC
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_2'
:
gpio_order
.
append
(
gpio_2_to_FMC
)
else
:
raise
Exception
(
"Bad 'gpio_block_name_list'"
)
file
=
open
(
os
.
path
.
join
(
fmc_pinout_log
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'FMC pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
translation_dict
=
{}
for
k
in
xrange
(
number_of_gpios
):
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
(
i
in
groundShorts
and
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Shortcircuit'
elif
(
i
in
groundShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Grounded'
elif
(
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'VCC tied'
else
:
translation_dict
[
gpio_order
[
k
][
i
]]
=
'OK'
for
k
in
sorted
(
translation_dict
.
keys
()):
file
.
write
(
k
+
'
\t\t
'
+
translation_dict
[
k
]
+
'
\n
'
)
file
.
close
()
def
main
(
default_directory
=
'.'
,
default_log
=
'.'
):
def
adc_convert_to_real_value
(
nr_value
,
value
)
:
ratio
=
{
'8'
:
0.6666
,
'7'
:
0.1666
,
'6'
:
0.52381
};
return
str
(
float
(
value
)
/
ratio
[
str
(
nr_value
)])
def
main
(
default_directory
=
'.'
):
global
default_log_path
,
tests_path
tests_path
=
default_directory
default_log_path
=
default_log
path_fpga_loader
=
'../firmwares/fpga_loader'
;
path_firmware
=
'../firmwares/test01.bin'
;
path_fpga_loader
=
'../firmwares/fpga_loader'
;
path_firmware
=
'../firmwares/test01.bin'
;
firmware_loader
=
os
.
path
.
join
(
default_directory
,
path_fpga_loader
)
bitstream
=
os
.
path
.
join
(
default_directory
,
path_firmware
)
os
.
system
(
firmware_loader
+
' '
+
bitstream
)
firmware_loader
=
os
.
path
.
join
(
default_directory
,
path_fpga_loader
)
bitstream
=
os
.
path
.
join
(
default_directory
,
path_firmware
)
os
.
system
(
firmware_loader
+
' '
+
bitstream
)
time
.
sleep
(
2
);
gennum
=
rr
.
Gennum
();
GPIO_BLOCK_0_MASK
=
0xFFFFFFFF
# Take care! Here 1 means write into the pad
GPIO_BLOCK_1_MASK
=
0xBB1BFBFF
GPIO_BLOCK_2_MASK
=
0x80FC0000
gpio_block_0
=
GPIO_slave
(
gennum
,
BASE_GPIO0
);
# It corresponds to 0x27 and 0x24 I2C addresses
gpio_block_1
=
GPIO_slave
(
gennum
,
BASE_GPIO1
);
# It corresponds to 0x22 and 0x26 I2C addresses
gpio_block_2
=
GPIO_slave
(
gennum
,
BASE_GPIO2
);
# It corresponds to 0x22 and 0x26 I2C addresses
i2c_B
=
COpenCoresI2C
(
gennum
,
BASE_I2C_B
,
99
);
time
.
sleep
(
2
);
gennum
=
rr
.
Gennum
();
expander_IC1
=
EXPANDER_MCP23017
(
i2c_B
,
0x27
);
expander_IC1_MASK
=
0xFFFF
expander_IC2
=
EXPANDER_MCP23017
(
i2c_B
,
0x24
);
expander_IC2_MASK
=
0xFFFF
expander_IC3
=
EXPANDER_MCP23017
(
i2c_B
,
0x22
);
expander_IC3_MASK
=
0xBB1B
expander_IC4
=
EXPANDER_MCP23017
(
i2c_B
,
0x26
);
expander_IC4_MASK
=
0xFBFF
expander_IC5
=
EXPANDER_MCP23017
(
i2c_B
,
0x21
);
expander_IC5_MASK
=
0x80FC
expander_IC6
=
EXPANDER_MCP23017
(
i2c_B
,
0x25
);
expander_IC6_MASK
=
0x0000
i2c
=
COpenCoresI2C
(
gennum
,
0x40000
,
99
);
# Prescaler value calculated using 50 MHz clock
# This four lines are gor testing porpouses
#groundShorts = []
#vsupplyShorts = []
#analyse_Shortcircuit(0xFBFBAABB, 0xDEADBABE, 0xFFFFFFFF, 32, "GPIO 1")
#write_test_results([gpio_block_1], [expander_IC3, expander_IC4], FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits, 32, 0)
#groundShorts = []
#vsupplyShorts = []
#analyse_Shortcircuit(0xFFFF, 0xBABE, 0xFFFF, 16, "GPIO 1")
#write_test_results([gpio_block_1], [expander_IC3], FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits, 16, 0)
# The address of the AD7997 is 0x23, pin 15 connected to GND.
adc
=
ADC_AD7997
(
i2c
,
0x23
);
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC1
,
expander_IC1_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
16
,
'GPIO_0'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
0
,
'GPIO_0'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC3
,
expander_IC3_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
16
,
'GPIO_1'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
0
,
'GPIO_1'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC5
,
expander_IC5_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
16
,
'GPIO_2'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
0
,
'GPIO_2'
)
value8
=
adc_value
(
adc
.
rd_reg16
(
0xF0
));
value7
=
adc_value
(
adc
.
rd_reg16
(
0xE0
));
value6
=
adc_value
(
adc
.
rd_reg16
(
0xD0
));
value5
=
adc_value
(
adc
.
rd_reg16
(
0xC0
));
value4
=
adc_value
(
adc
.
rd_reg16
(
0xB0
));
value3
=
adc_value
(
adc
.
rd_reg16
(
0xA0
));
value2
=
adc_value
(
adc
.
rd_reg16
(
0x90
));
value1
=
adc_value
(
adc
.
rd_reg16
(
0x80
));
FMC_roll_test_CC_i2c_writing
(
expander_IC1
,
expander_IC1_MASK
,
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
'GPIO_0'
)
FMC_roll_test_CC_i2c_writing
(
expander_IC3
,
expander_IC3_MASK
,
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
'GPIO_1'
)
FMC_roll_test_CC_i2c_writing
(
expander_IC5
,
expander_IC5_MASK
,
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
'GPIO_2'
)
# Check the values of the ADC.
if
(
float
(
value8
)
<
1.58
)
or
(
float
(
value8
)
>
1.75
)
:
raise
TpsError
(
"Error in VS_VADJ (2.5V) measured "
+
adc_convert_to_real_value
(
8
,
value8
)
+
"V."
)
print
"VS_VADJ = "
+
adc_convert_to_real_value
(
8
,
value8
)
FMC_roll_test_CC_16bits
(
expander_IC1
,
expander_IC1_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
16
,
'GPIO_0'
)
FMC_roll_test_CC_16bits
(
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
0
,
'GPIO_0'
)
FMC_roll_test_CC_16bits
(
expander_IC3
,
expander_IC3_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
16
,
'GPIO_1'
)
FMC_roll_test_CC_16bits
(
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
0
,
'GPIO_1'
)
FMC_roll_test_CC_16bits
(
expander_IC5
,
expander_IC5_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
16
,
'GPIO_2'
)
FMC_roll_test_CC_16bits
(
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
0
,
'GPIO_2'
)
if
(
float
(
value7
)
<
1.88
)
or
(
float
(
value7
)
>
2.13
):
raise
TpsError
(
"Error in VS_P12V_x (12V) measured "
+
adc_convert_to_real_value
(
7
,
value7
)
+
"V."
)
print
"VS_P12V_x = "
+
adc_convert_to_real_value
(
7
,
value7
)
FMC_roll_test_CC
(
expander_IC1
,
expander_IC1_MASK
,
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
'GPIO_0'
)
FMC_roll_test_CC
(
expander_IC3
,
expander_IC3_MASK
,
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
'GPIO_1'
)
FMC_roll_test_CC
(
expander_IC5
,
expander_IC5_MASK
,
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
'GPIO_2'
)
if
(
float
(
value6
)
<
1.64
)
or
(
float
(
value6
)
>
1.82
):
raise
TpsError
(
"Error in VS_P3V3_x (3.3V) measured "
+
adc_convert_to_real_value
(
6
,
value6
)
+
"V."
)
print
"VS_P3V3_x = "
+
adc_convert_to_real_value
(
6
,
value6
)
summary_results
(
testStatus
)
if
__name__
==
'__main__'
:
main
();
groundShorts
=
[]
vsupplyShorts
=
[]
if
__name__
==
'__main__'
:
main
(
default_directory
=
'.'
,
default_log
=
'.'
)
test/spec/python/test02.py
View file @
f78c441c
...
...
@@ -2,319 +2,1249 @@
# coding: utf8
# Copyright CERN, 2011
# Author:
Samuel Iglesias Gonsalvez <siglesia
@cern.ch>
# Author:
Carlos Gil Soriano <cgilsori
@cern.ch>
# Licence: GPL v2 or later.
# Website: http://www.ohwr.org
import
sys
import
rr
import
time
import
os
from
tpsexcept
import
*
import
errno
from
tpsexcept
import
*
# jdgc
"""
test0
2: checks the EEPROM of the GENNUM chip
.
test0
1: checks the low speed pins of FMC connector (low count connector)
.
"""
class
EEPROM_GENNUM
:
LB_CTL
=
0x804
;
TWI_CTRL
=
0x900
;
TWI_STATUS
=
0x904
;
TWI_IRT_STATUS
=
0x910
;
I2C_ADDR
=
0x908
;
I2C_DATA
=
0x90C
;
def
__init__
(
self
,
gennum
):
self
.
gennum
=
gennum
;
def
i2c_read
(
self
,
i2c_addr
,
offset
,
length
,
read_data
):
"""Read from I2C
"""
# Shut off EEPROM_INIT state machine if not done so */
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
LB_CTL
,
4
)
#print 'LB_CTL=%.8X' % tmp
if
tmp
&
0x10000
==
0
:
tmp
|=
0x10000
self
.
gennum
.
iwrite
(
4
,
self
.
LB_CTL
,
4
,
tmp
)
# Init I2C clock Fpci/(22*Fscl)=(DIV_A+1)*(DIV_B+1)
# CLR_FIFO=1, SLVMON=0, HOLD=0, ACKEN=1, NEA=1, MS=1, RW=0
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384E
)
# Read back from register to guarantee the mode change
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_CTRL
,
4
)
# Wait until I2C bus is idle
i
=
2000000
while
i
>
0
:
i
-=
1
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
#print 'TWI_STATUS=%.8X' % tmp
#time.sleep(.5)
if
tmp
&
0x100
==
0
:
#print 'I2C bus is idle'
break
# Read to clear TWI_IRT_STATUS
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
# Write word offset
tmp
=
(
0xFF
&
offset
)
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
tmp
)
# Write device address
tmp
=
(
0x7F
&
i2c_addr
)
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
tmp
)
# Wait for transfer complete status
i
=
2000000
while
i
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
if
tmp
&
0x1
:
break
elif
tmp
&
0xC
:
raise
TpsError
(
'NACK detected or TIMEOUT, IRT_STATUS = 0x
%
x!!'
%
tmp
)
sys
.
exit
()
i
-=
1
if
i
==
0
:
raise
TpsError
(
'ERROR, completion status not detected!!'
)
sys
.
exit
()
# Change to read mode
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384F
)
# Perform sequential page read from the start address
error_flag
=
0
total_transfer
=
0
while
length
>
0
and
error_flag
==
0
:
# Transfer bigger than I2C fifo (8 bytes) are split
if
length
>
8
:
transfer_len
=
8
length
-=
8
tests_path
=
'.'
default_log_path
=
'.'
# Mapping for seven slaves!
BASE_I2C_B
=
0x20000
BASE_GPIO0
=
0x40000
BASE_GPIO1
=
0x60000
BASE_GPIO2
=
0x80000
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
=
0x00
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
=
0x01
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
=
0x02
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
=
0x03
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
=
0x04
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
=
0x05
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
=
0x06
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
=
0x07
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_64bits
=
0x08
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_64bits
=
0x09
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_64bits
=
0x0A
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_64bits
=
0x0B
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_96bits
=
0x0C
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_96bits
=
0x0D
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_96bits
=
0x0E
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_96bits
=
0x0F
testStatus
=
{}
gpio_0_to_tester
=
[
'LA17N'
,
'LA19N'
,
'LA19P'
,
'LA20P'
,
'LA20N'
,
'LA14N'
,
'LA14P'
,
'LA17P'
,
'LA13N'
,
'LA13P'
,
'LA15P'
,
'LA15N'
,
'LA16P'
,
'LA32N'
,
'LA33P'
,
'LA33N'
,
'LA7P'
,
'LA5P'
,
'LA7N'
,
'LA8N'
,
'LA8P'
,
'LA6N'
,
'LA12P'
,
'LA9N'
,
'LA16N'
,
'LA12N'
,
'LA11P'
,
'LA10N'
,
'LA11N'
,
'LA10P'
,
'LA9P'
,
'LA5N'
]
gpio_1_to_tester
=
[
'LA27P'
,
'LA23N'
,
'LA22P'
,
'LA22N'
,
'LA18N'
,
'LA18P'
,
'LA23P'
,
'LA21P'
,
'LA24P'
,
'LA25N'
,
'TCK_TO_FMC'
,
'LA25P'
,
'LA27N'
,
'LA26P'
,
'LA21N'
,
'LA26N'
,
'LA32P'
,
'LA30N'
,
'GA1'
,
'LA31N'
,
'LA30P'
,
'GA0'
,
'TRST_TO_FMC'
,
'TMS_TO_FMC'
,
'LA29P'
,
'LA29N'
,
'TDO_FROM_FMC'
,
'LA31P'
,
'LA28N'
,
'LA28P'
,
'TDI_TO_FMC'
,
'LA24N'
]
gpio_2_to_tester
=
[
'CLK0_M2C_N'
,
'CLK0_M2C_P'
,
'PRSNT_M2C_L'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'M2C_DIR'
,
'PG_C2M'
,
'LA1P'
,
'LA6P'
,
'LA1N'
,
'LA3N'
,
'LA4P'
,
'LA3P'
,
'VREF_A_M2C'
,
'CLK1_M2C_N'
,
'CLK1_M2C_P'
,
'LA0P'
,
'LA2P'
,
'LA0N'
,
'LA2N'
,
'LA4N'
]
gpio_0_to_FMC
=
[
'D21'
,
'H23'
,
'H22'
,
'G21'
,
'G22'
,
'C19'
,
'C18'
,
'D20'
,
'D18'
,
'D17'
,
'H19'
,
'H20'
,
'G18'
,
'H38'
,
'G36'
,
'G37'
,
'H13'
,
'D11'
,
'H14'
,
'G13'
,
'G12'
,
'C11'
,
'G15'
,
'D15'
,
'G19'
,
'G16'
,
'H16'
,
'C15'
,
'H17'
,
'C14'
,
'D14'
,
'D12'
]
gpio_1_to_FMC
=
[
'C26'
,
'D24'
,
'G24'
,
'G25'
,
'C23'
,
'C22'
,
'D23'
,
'H25'
,
'H28'
,
'G28'
,
'D29'
,
'G27'
,
'C27'
,
'D26'
,
'H26'
,
'D27'
,
'H37'
,
'H35'
,
'D35'
,
'G34'
,
'H34'
,
'C34'
,
'D34'
,
'D33'
,
'G30'
,
'G31'
,
'D31'
,
'G33'
,
'H32'
,
'H31'
,
'D30'
,
'H29'
]
gpio_2_to_FMC
=
[
'H5'
,
'H4'
,
'H2'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'open'
,
'B1'
,
'D1'
,
'D8'
,
'C10'
,
'D9'
,
'G10'
,
'H10'
,
'G9'
,
'H1'
,
'G3'
,
'G2'
,
'G6'
,
'H7'
,
'G7'
,
'H8'
,
'H11'
]
i2c_addr_to_schematicID
=
{
0x27
:
'IC1'
,
0x24
:
'IC2'
,
0x22
:
'IC3'
,
0x26
:
'IC4'
,
0x21
:
'IC5'
,
0x25
:
'IC6'
}
class
COpenCoresI2C
:
R_PREL
=
0x0
R_PREH
=
0x4
R_CTR
=
0x8
R_TXR
=
0xC
R_RXR
=
0xC
R_CR
=
0x10
R_SR
=
0x10
CTR_EN
=
(
1
<<
7
)
CR_STA
=
(
1
<<
7
)
CR_STO
=
(
1
<<
6
)
CR_WR
=
(
1
<<
4
)
CR_RD
=
(
1
<<
5
)
CR_NACK
=
(
1
<<
3
)
SR_RXACK
=
(
1
<<
7
)
SR_TIP
=
(
1
<<
1
)
def
wr_reg
(
self
,
addr
,
val
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
addr
,
4
,
val
)
def
rd_reg
(
self
,
addr
):
return
self
.
bus
.
iread
(
0
,
self
.
base
+
addr
,
4
)
def
__init__
(
self
,
bus
,
base
,
prescaler
):
self
.
bus
=
bus
;
self
.
base
=
base
;
self
.
wr_reg
(
self
.
R_CTR
,
0
);
self
.
wr_reg
(
self
.
R_PREL
,
(
prescaler
&
0xff
))
self
.
wr_reg
(
self
.
R_PREH
,
(
prescaler
>>
8
))
self
.
wr_reg
(
self
.
R_CTR
,
self
.
CTR_EN
);
def
wait_busy
(
self
):
while
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_TIP
):
pass
def
start
(
self
,
addr
,
write_mode
):
addr
=
addr
<<
1
if
(
write_mode
==
False
):
addr
=
addr
|
1
;
self
.
wr_reg
(
self
.
R_TXR
,
addr
);
self
.
wr_reg
(
self
.
R_CR
,
self
.
CR_STA
|
self
.
CR_WR
);
self
.
wait_busy
()
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
Exception
(
'No ACK upon address (device 0x
%
x not connected?)'
%
(
addr
>>
1
))
def
write
(
self
,
data
,
last
):
self
.
wr_reg
(
self
.
R_TXR
,
data
);
cmd
=
self
.
CR_WR
;
if
(
last
):
cmd
=
cmd
|
self
.
CR_STO
;
self
.
wr_reg
(
self
.
R_CR
,
cmd
);
self
.
wait_busy
();
if
(
self
.
rd_reg
(
self
.
R_SR
)
&
self
.
SR_RXACK
):
raise
Exception
(
'No ACK upon write'
)
def
read
(
self
,
last
):
cmd
=
self
.
CR_RD
;
if
(
last
):
cmd
=
cmd
|
self
.
CR_STO
|
self
.
CR_NACK
;
self
.
wr_reg
(
self
.
R_CR
,
cmd
);
self
.
wait_busy
();
return
self
.
rd_reg
(
self
.
R_RXR
);
# To be done
#class EEPROM_2AA64T:
class
ADC_AD7997
:
CONVER_R
=
0x00
;
CONFIG_R
=
0x02
;
CH8
=
(
1
<<
11
);
CH7
=
(
1
<<
10
);
CH6
=
(
1
<<
9
);
CH5
=
(
1
<<
8
);
CH4
=
(
1
<<
7
);
CH3
=
(
1
<<
6
);
CH2
=
(
1
<<
5
);
CH1
=
(
1
<<
4
);
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
def
wr_reg16
(
self
,
addr
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
tmp
=
(
value
>>
8
)
&
0xFF
;
self
.
i2c
.
write
(
value
,
False
);
tmp
=
value
&
0xFF
;
self
.
i2c
.
write
(
value
,
True
)
def
wr_reg8
(
self
,
addr
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg16
(
self
,
addr
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
tmp_MSB
=
self
.
i2c
.
read
(
False
);
tmp_LSB
=
self
.
i2c
.
read
(
True
);
value
=
(
tmp_MSB
<<
8
)
|
tmp_LSB
;
return
value
;
def
rd_reg8
(
self
,
addr
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
addr
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
## To be done
class
SWITCH_ADN4600
:
# Only basic mode is implemented
RST
=
0x0
;
XPT_CFG
=
0x1
;
XPT_STAT_0
=
0x50
;
XPT_STAT_1
=
0x51
;
XPT_STAT_2
=
0x52
;
XPT_STAT_3
=
0x53
XPT_STAT_4
=
0x54
;
XPT_STAT_5
=
0x55
;
XPT_STAT_6
=
0x56
;
XPT_STAT_7
=
0x57
RX0_CONF
=
0x80
;
RX1_CONF
=
0x88
;
RX2_CONF
=
0x90
;
RX3_CONF
=
0x98
;
RX4_CONF
=
0xA0
;
RX5_CONF
=
0xA8
;
RX6_CONF
=
0xB0
;
RX7_CONF
=
0xB8
;
TX0_CONF
=
0xC0
;
TX1_CONF
=
0xC8
;
TX2_CONF
=
0xD0
;
TX3_CONF
=
0xD8
;
TX4_CONF
=
0xE0
;
TX5_CONF
=
0xE8
;
TX6_CONF
=
0xF0
;
TX7_CONF
=
0xF8
;
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
def
wr_reg8
(
self
,
bank
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg8
(
self
,
bank
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
def
passby_input_output
(
self
,
channel_input
,
channel_output
):
pass
class
EXPANDER_MCP23017
:
IODIRA
=
0x0
;
IODIRB
=
0x01
IPOLA
=
0x02
;
IPOLB
=
0x03
;
GPINTENA
=
0x04
;
GPINTENB
=
0x05
;
DEFVALA
=
0x06
;
DEFVALB
=
0x07
;
INTCONA
=
0x08
;
INTCONB
=
0x09
;
# Shared register between the two ports
IOCONA
=
0x0A
;
IOCONB
=
0x0B
;
GPPUA
=
0x0C
;
GPPUB
=
0x0D
;
INTFA
=
0x0E
;
INTFB
=
0x0F
;
INTCAPA
=
0x10
;
INTCAPB
=
0x11
;
GPIOA
=
0x12
;
GPIOB
=
0x13
;
OLATA
=
0x14
;
OLATB
=
0x15
;
IOCON_BANK
=
7
;
IOCON_MIRROR
=
6
;
IOCON_SEQOP
=
5
;
IOCON_DISSLW
=
4
;
IOCON_HAEN
=
3
;
IOCON_ODR
=
2
;
IOCON_INTPOL
=
1
;
def
__init__
(
self
,
i2c
,
addr
):
self
.
i2c
=
i2c
;
self
.
addr
=
addr
;
cfg_value
=
(
0
<<
EXPANDER_MCP23017
.
IOCON_BANK
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_MIRROR
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_SEQOP
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_DISSLW
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_HAEN
)
+
(
0
<<
EXPANDER_MCP23017
.
IOCON_ODR
)
+
(
1
<<
EXPANDER_MCP23017
.
IOCON_INTPOL
);
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IOCONA
,
False
);
self
.
i2c
.
write
(
cfg_value
,
True
);
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IOCONB
,
False
);
self
.
i2c
.
write
(
cfg_value
,
True
);
# Setup every port as input
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# 1 means input
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# Setup input polarity register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IPOLA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# 0 means no change in polarity at output
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
IPOLB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup interrupt-on-change control register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# 0 means no interrupt
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup default comparre register for interrupt-on-change
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
GPINTENA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# In case that interrupt-on-change is used
self
.
i2c
.
start
(
self
.
addr
,
True
);
# this is the default interrupt msimatch value
self
.
i2c
.
write
(
self
.
GPINTENB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup interrupt control register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONA
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# If 0 is select it means that comparison takes places
self
.
i2c
.
start
(
self
.
addr
,
True
);
# against DEFVAL. Otherwise, against last value (OLAT)
self
.
i2c
.
write
(
self
.
INTCONB
,
False
);
self
.
i2c
.
write
(
0x00
,
True
);
# Setup pull-up resistor configuration register
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONA
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
# 1 means using 100K as pull-up
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
self
.
INTCONB
,
False
);
self
.
i2c
.
write
(
0xFF
,
True
);
def
set_input
(
self
,
bank
,
boolean
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
if
(
bank
==
EXPANDER_MCP23017
.
GPIOA
):
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
else
:
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
if
(
boolean
):
self
.
i2c
.
write
(
0xFF
,
True
);
else
:
self
.
i2c
.
write
(
0x00
,
True
);
def
set_input_masked
(
self
,
bank
,
mask
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
if
(
bank
==
EXPANDER_MCP23017
.
GPIOA
):
self
.
i2c
.
write
(
self
.
IODIRA
,
False
);
else
:
self
.
i2c
.
write
(
self
.
IODIRB
,
False
);
self
.
i2c
.
write
(
mask
,
True
);
def
wr_reg8
(
self
,
bank
,
value
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
# write cycle
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
write
(
value
,
True
);
def
rd_reg8
(
self
,
bank
):
self
.
i2c
.
start
(
self
.
addr
,
True
);
self
.
i2c
.
write
(
bank
,
False
);
self
.
i2c
.
start
(
self
.
addr
,
False
);
return
self
.
i2c
.
read
(
True
);
class
GPIO_slave
:
R_GPIO_DIR
=
0x0
R_GPIO_IOBUF
=
0x4
R_GPIO_CTR
=
0x8
def
__init__
(
self
,
bus
,
base
):
self
.
bus
=
bus
;
self
.
base
=
base
;
if
(
self
.
base
==
BASE_GPIO0
):
self
.
name
=
'GPIO_0'
elif
(
self
.
base
==
BASE_GPIO1
):
# if (self.base == BASE_GPIO1):
self
.
name
=
'GPIO_1'
elif
(
self
.
base
==
BASE_GPIO2
):
self
.
name
=
'GPIO_2'
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0xFFFFFFFF
)
def
rd_GPIO_CTR
(
self
):
return
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_CTR
,
4
)
def
set_GPIO_inout
(
self
,
value
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
value
)
def
wr_GPIO_block
(
self
,
value
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0x00000000
)
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
,
value
)
def
rd_GPIO_block
(
self
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
0xFFFFFFFF
)
return
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
)
def
wr_GPIO_block_custom
(
self
,
mask
,
value
):
wr_mask
=
mask
^
0xFFFFFFFF
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
wr_mask
)
# According to IOBUF spec, 0 means write into the pad
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
,
value
&
mask
)
def
rd_GPIO_block_custom
(
self
,
mask
):
self
.
bus
.
iwrite
(
0
,
self
.
base
+
self
.
R_GPIO_DIR
,
4
,
mask
)
# According to IOBUF spec, 0 means write into the pad
value
=
self
.
bus
.
iread
(
0
,
self
.
base
+
self
.
R_GPIO_IOBUF
,
4
)
return
(
value
&
mask
)
def
mkdir_p
(
path
):
try
:
os
.
makedirs
(
path
)
except
OSError
as
exc
:
if
exc
.
errno
==
errno
.
EEXIST
:
pass
else
:
raise
def
FMC_roll_test_CC_16bits
(
i2c_block
,
i2c_block_mask
,
gpio_block
,
gpio_block_mask
,
offset
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
if
offset
!=
0
|
offset
!=
16
:
raise
Exception
(
"Bad offset"
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0xFFFF
else
:
expected
=
0xFFFF
^
(
1
<<
(
i
+
offset
))
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
expected
=
expected
&
gpio_block_mask
gpio_block
.
wr_GPIO_block
(
expected
)
rcv_byte1
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte1
<<
8
)
|
rcv_byte0
expected
=
expected
>>
offset
header_msg
=
"
%.4
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
16
,
header_msg
,
gpio_block
,
offset
)
# LOOK AT THIS PART!!
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
groundShorts
=
[]
vsupplyShorts
=
[]
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0x0000
else
:
expected
=
0x0000
^
(
1
<<
(
i
+
offset
))
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
expected
=
expected
&
gpio_block_mask
gpio_block
.
wr_GPIO_block
(
expected
)
rcv_byte1
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte1
<<
8
)
|
rcv_byte0
expected
=
expected
>>
offset
header_msg
=
"
%.4
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
16
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
groundShorts
=
[]
vsupplyShorts
=
[]
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC
(
i2c_block_upper
,
i2c_block_upper_mask
,
i2c_block_lower
,
i2c_block_lower_mask
,
gpio_block
,
gpio_block_mask
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRB))
# print "IODIRA\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
(
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0xFFFFFFFF
else
:
expected
=
0xFFFFFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
wr_GPIO_block
(
expected
&
gpio_block_mask
)
rcv_byte3
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte2
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
rcv_byte1
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte3
<<
24
)
|
(
rcv_byte2
<<
16
)
|
(
rcv_byte1
<<
8
)
|
rcv_byte0
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
gpio_trans_list
=
[]
if
gpio_block
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_block
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_block
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
bits_tested
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
groundedPins_string
=
''
vsupplyShorts_string
=
''
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
print
"---- Grounded pins:
\t
"
+
groundedPins_string
if
len
(
vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
print
"---- Vcc tied pins:
\t
"
+
vsupplyShorts_string
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
"
%.2
X"
%
(
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_gpio_to_i2c_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0x00000000
else
:
expected
=
0x00000000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0x00000000
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
wr_GPIO_block
(
expected
&
gpio_block_mask
)
#print "Reading Back\t" + hex(gpio_block.rd_GPIO_block() & gpio_block_mask)
rcv_byte3
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte2
=
i2c_block_upper
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
rcv_byte1
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOA
)
rcv_byte0
=
i2c_block_lower
.
rd_reg8
(
EXPANDER_MCP23017
.
GPIOB
)
received
=
0
received
=
(
rcv_byte3
<<
24
)
|
(
rcv_byte2
<<
16
)
|
(
rcv_byte1
<<
8
)
|
rcv_byte0
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC_16bits_i2c_writing
(
i2c_block
,
i2c_block_mask
,
gpio_block
,
gpio_block_mask
,
offset
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
if
offset
!=
0
|
offset
!=
16
:
raise
Exception
(
"Bad offset"
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0xFFFF
else
:
expected
=
0xFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_A
=
((
0xFF00
)
&
i2c_block_mask
)
>>
8
mask_B
=
(
0x00FF
)
&
i2c_block_mask
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte1
=
(
0xFF00
&
expected
)
>>
8
wr_byte0
=
(
0x00FF
&
expected
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
>>
offset
received
=
received
expected
=
expected
&
i2c_block_mask
header_msg
=
"
%.4
X"
%
expected
gpio_block_mask_tmp
=
(
gpio_block_mask
>>
offset
)
&
0x0000FFFF
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask_tmp
,
16
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_16bits
bits_tested
=
16
offset
=
offset
for
i
in
range
(
-
1
,
16
):
if
i
==
-
1
:
expected
=
0x0000
else
:
expected
=
0x0000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_A
=
((
0xFF00
)
&
i2c_block_mask
)
>>
8
mask_B
=
(
0x00FF
)
&
i2c_block_mask
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte1
=
(
0xFF00
&
expected
)
>>
8
wr_byte0
=
(
0x00FF
&
expected
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
>>
offset
received
=
received
expected
=
expected
&
i2c_block_mask
header_msg
=
"
%.4
X"
%
expected
gpio_block_mask_tmp
=
(
gpio_block_mask
>>
offset
)
&
0x0000FFFF
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask_tmp
,
16
,
header_msg
,
gpio_block
,
offset
)
groundShorts_tmp
=
sorted
(
set
(
groundShorts
))
vsupplyShorts_tmp
=
sorted
(
set
(
vsupplyShorts
))
groundShorts
=
[]
vsupplyShorts
=
[]
# for index in groundShorts_tmp:
# print "groundShorts\t" + str(index)
# groundShorts.append(index + offset)
# for index in vsupplyShorts_tmp:
# print "vsupplyShorts\t" + str(index)
# vsupplyShorts.append(index + offset)
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
def
FMC_roll_test_CC_i2c_writing
(
i2c_block_upper
,
i2c_block_upper_mask
,
i2c_block_lower
,
i2c_block_lower_mask
,
gpio_block
,
gpio_block_mask
,
device
)
:
print
"----------------------------------------"
print
"-- SPEC Manufacturing test suite --"
print
"----------------------------------------"
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
0xFF
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
0xFF
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
# print "IODIRA\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_upper.rd_reg8(EXPANDER_MCP23017.IODIRB))
# print "IODIRA\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRA))
# print "IODIRB\t" + hex(i2c_block_lower.rd_reg8(EXPANDER_MCP23017.IODIRB))
time
.
sleep
(
0.1
)
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
)
+
"
\t
Rolling one grounded pin among vsuppply pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
global
groundShorts
,
vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_0_TEST_ID_CC_i2c_to_gpio_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0xFFFFFFFF
else
:
expected
=
0xFFFFFFFF
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_upper_A
=
((
0xFF00
)
&
i2c_block_upper_mask
)
>>
8
mask_upper_B
=
(
0x00FF
)
&
i2c_block_upper_mask
mask_lower_A
=
((
0xFF00
)
&
i2c_block_lower_mask
)
>>
8
mask_lower_B
=
(
0x00FF
)
&
i2c_block_lower_mask
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte3
=
(
0xFF000000
&
expected
)
>>
24
wr_byte2
=
(
0x00FF0000
&
expected
)
>>
16
wr_byte1
=
(
0x0000FF00
&
expected
)
>>
8
wr_byte0
=
(
0x000000FF
&
expected
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte3
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte2
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
received
=
received
expected
=
expected
&
gpio_block_mask
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
print
"
\n
- Device
\t
"
+
device
print
"- Test code
\t
"
+
hex
(
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
)
+
"
\t
Rolling one vsupply pin among grounded pins"
print
"- Additional
\t
gpio_block_mask:
\t
"
+
hex
(
gpio_block_mask
)
print
"Expected:
\t
"
+
"Received:
\t
"
+
"Mask
\t\t
"
+
"Info
\t
"
# print "Vector\t\tShortcircuit"
# global groundShorts, vsupplyShorts
groundShorts
=
[]
vsupplyShorts
=
[]
gpio_bank_list
=
[
gpio_block
]
i2c_list
=
[
i2c_block_upper
,
i2c_block_lower
]
test_id
=
FMC_SPEC_ROLL_1_TEST_ID_CC_i2c_to_gpio_32bits
bits_tested
=
32
offset
=
0
for
i
in
range
(
-
1
,
32
):
if
i
==
-
1
:
expected
=
0x00000000
else
:
expected
=
0x00000000
^
(
1
<<
i
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
mask_upper_A
=
((
0xFF00
)
&
i2c_block_upper_mask
)
>>
8
mask_upper_B
=
(
0x00FF
)
&
i2c_block_upper_mask
mask_lower_A
=
((
0xFF00
)
&
i2c_block_lower_mask
)
>>
8
mask_lower_B
=
(
0x00FF
)
&
i2c_block_lower_mask
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
False
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
False
)
wr_byte3
=
(
0xFF000000
&
expected
)
>>
24
wr_byte2
=
(
0x00FF0000
&
expected
)
>>
16
wr_byte1
=
(
0x0000FF00
&
expected
)
>>
8
wr_byte0
=
(
0x000000FF
&
expected
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte3
)
i2c_block_upper
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte2
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOA
,
wr_byte1
)
i2c_block_lower
.
wr_reg8
(
EXPANDER_MCP23017
.
GPIOB
,
wr_byte0
)
received
=
gpio_block
.
rd_GPIO_block
()
received
=
received
expected
=
expected
&
gpio_block_mask
header_msg
=
"
%.8
X"
%
expected
analyse_Shortcircuit
(
expected
,
received
,
gpio_block_mask
,
32
,
header_msg
,
gpio_block
,
offset
)
groundShorts
=
sorted
(
set
(
groundShorts
))
vsupplyShorts
=
sorted
(
set
(
vsupplyShorts
))
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
)
show_test_results
(
gpio_block
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
)
if
(
len
(
groundShorts
)
==
0
)
&
(
len
(
vsupplyShorts
)
==
0
):
print
"---- Test OK!
\n
"
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'OK'
else
:
testStatus
[
get_filename
(
gpio_bank_list
,
i2c_list
)]
=
'Fail'
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_upper
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOA
,
True
)
i2c_block_lower
.
set_input
(
EXPANDER_MCP23017
.
GPIOB
,
True
)
gpio_block
.
set_GPIO_inout
(
0xFFFFFFFF
)
#Needs rework here
def
analyse_Shortcircuit
(
expected
,
received
,
mask
,
amountOfPins
,
header_msg
,
gpio_bank
,
offset
):
discrepancies
=
expected
^
received
tmp_groundShorts
=
[]
tmp_vsupplyShorts
=
[]
global
groundShorts
,
vsupplyShorts
for
i
in
xrange
(
amountOfPins
):
if
((
mask
&
(
1
<<
i
))
==
0
):
pass
elif
((
discrepancies
&
(
1
<<
i
))
==
(
1
<<
i
)):
#Discrepancy detected at position i
if
((
expected
&
(
1
<<
i
))
==
(
1
<<
i
)):
#It was a ground short
tmp_groundShorts
.
append
(
i
)
groundShorts
.
append
(
i
)
else
:
transfer_len
=
length
length
=
0
# Update expected receive data size
self
.
gennum
.
iwrite
(
4
,
0x914
,
4
,
transfer_len
)
# Write device address
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
(
0x7F
&
i2c_addr
))
# Wait until transfer is completed
j
=
2000000
while
j
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
if
tmp
&
0x1
:
#print 'Transfer completed'
break
j
-=
1
if
j
==
0
:
error_flag
=
1
raise
TpsWarning
(
'ERROR, completion status not detected!!'
)
# Read data from fifo
while
transfer_len
>
0
:
read_data
.
append
(
0xFF
&
self
.
gennum
.
iread
(
4
,
self
.
I2C_DATA
,
4
))
transfer_len
-=
1
total_transfer
+=
1
# End of read
return
total_transfer
#
def
i2c_write
(
self
,
i2c_addr
,
offset
,
length
,
write_data
):
"""Write to I2C
"""
# Shut off EEPROM_INIT state machine if not done so */
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
LB_CTL
,
4
)
if
tmp
&
0x10000
==
0
:
tmp
|=
0x10000
self
.
gennum
.
iwrite
(
4
,
self
.
LB_CTL
,
4
,
tmp
)
# Read to clear TWI_IRT_STATUS
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
# Read to clear TWI_STATUS
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
# Init I2C clock Fpci/(22*Fscl)=(DIV_A+1)*(DIV_B+1)
# CLR_FIFO=1, SLVMON=0, HOLD=0, ACKEN=1, NEA=1, MS=1, RW=0
self
.
gennum
.
iwrite
(
4
,
self
.
TWI_CTRL
,
4
,
0x384E
)
# Read back from register to guarantee the mode change
self
.
gennum
.
iread
(
4
,
self
.
TWI_CTRL
,
4
)
# Wait until I2C bus is idle
i
=
2000000
while
i
>
0
:
i
-=
1
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_STATUS
,
4
)
if
tmp
&
0x100
==
0
:
break
# Perform sequential page write from the start address
error_flag
=
0
total_transfer
=
0
while
length
>
0
and
error_flag
==
0
:
# Write word offset
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
(
0xFF
&
offset
))
i
=
6
# fifo size - 2
while
i
>
0
and
length
>
0
:
tmp
=
(
0xFF
&
write_data
[
total_transfer
])
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_DATA
,
4
,
tmp
)
total_transfer
+=
1
offset
+=
1
i
-=
1
length
-=
1
# Reaches the page write address boundary, thus need to start
# the offset at the next page (page size = 8)
if
offset
&
7
==
0
:
break
# Write device address
self
.
gennum
.
iwrite
(
4
,
self
.
I2C_ADDR
,
4
,
(
0x7F
&
i2c_addr
))
#print 'Write I2C address'
# Wait until transfer is completed
i
=
2000000
while
i
>
0
:
tmp
=
self
.
gennum
.
iread
(
4
,
self
.
TWI_IRT_STATUS
,
4
)
time
.
sleep
(
0.01
)
if
tmp
&
0x1
:
#print 'Transfer completed!'
tmp
=
self
.
gennum
.
iread
(
4
,
0x914
,
4
)
#print 'TR_SIZE=%d' % tmp
break
elif
tmp
&
0xC
:
raise
TpsWarning
(
'NACK detected or TIMEOUT, IRT_STATUS = 0x
%
x!!'
%
tmp
)
tmp
=
self
.
gennum
.
iread
(
4
,
0x914
,
4
)
return
total_transfer
i
-=
1
return
total_transfer
def
eeprom_dump_to_screen
(
self
):
""" Dump the content of the EEPROM to the screen
"""
eeprom_data
=
[]
nb_rec
=
42
self
.
i2c_read
(
0x56
,
0
,
nb_rec
*
6
,
eeprom_data
)
for
i
in
range
(
0
,
nb_rec
*
6
,
6
):
addr
=
eeprom_data
[
i
]
+
(
eeprom_data
[
i
+
1
]
<<
8
)
data
=
eeprom_data
[
i
+
2
]
+
(
eeprom_data
[
i
+
3
]
<<
8
)
+
(
eeprom_data
[
i
+
4
]
<<
16
)
+
(
eeprom_data
[
i
+
5
]
<<
24
)
if
addr
==
0xFFFF
:
break
print
'[
%.2
d]=
%.4
X
%.8
X'
%
(
i
/
6
,
addr
,
data
)
print
''
for
i
in
range
(
0
,
len
(
eeprom_data
)):
print
'[
%.2
d]=
%.2
X'
%
(
i
,
eeprom_data
[
i
])
if
eeprom_data
[
i
+
1
]
==
0xFF
and
eeprom_data
[
i
+
2
]
==
0xFF
:
break
return
0
def
eeprom_dump_to_file
(
self
,
file_name
):
"""Dump the content of the EEPROM to a file
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'w+'
)
eeprom_data
=
[]
nb_rec
=
100
self
.
i2c_read
(
0x56
,
0
,
nb_rec
*
6
,
eeprom_data
)
for
i
in
range
(
0
,
nb_rec
*
6
,
6
):
addr
=
eeprom_data
[
i
]
+
(
eeprom_data
[
i
+
1
]
<<
8
)
data
=
eeprom_data
[
i
+
2
]
+
(
eeprom_data
[
i
+
3
]
<<
8
)
+
(
eeprom_data
[
i
+
4
]
<<
16
)
+
(
eeprom_data
[
i
+
5
]
<<
24
)
print
>>
file
,
'
%.4
X
%.8
X'
%
(
addr
,
data
)
if
addr
==
0xFFFF
:
break
return
0
def
file_dump_to_screen
(
self
,
file_name
):
"""Dump the content of a file to the screen
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
for
line
in
file
:
addr
,
data
=
line
.
split
()
print
addr
+
' '
+
data
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
print
''
for
i
in
range
(
0
,
len
(
file_data
)):
print
'[
%.2
d]=
%.2
X'
%
(
i
,
file_data
[
i
])
return
0
def
file_dump_to_eeprom
(
self
,
file_name
):
"""Dump the content of a file to the EEPROM
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
# Write EEPROM
#print len(file_data)
#print file_data
written
=
self
.
i2c_write
(
0x56
,
0
,
len
(
file_data
),
file_data
)
if
written
==
len
(
file_data
):
print
'EEPROM written with '
+
file_name
+
' content!'
else
:
raise
TpsError
(
"ERROR writting to the EEPROM: Written lenght doesn't correspond with the length of the file."
)
return
0
def
compare_eeprom_with_file
(
self
,
file_name
):
"""Compare the content of a file to the EEPROM
"""
if
file_name
==
""
:
file_name
=
"eeprom.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
eeprom_data
=
[]
nb_rec
=
0
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
for
i
in
range
(
2
,
0
,
-
1
):
#print addr[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
addr
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
for
i
in
range
(
4
,
0
,
-
1
):
#print data[(i-1)*2:(i-1)*2+2]
file_data
.
append
(
int
(
data
[(
i
-
1
)
*
2
:(
i
-
1
)
*
2
+
2
],
16
))
nb_rec
+=
1
# Read EEPROM
self
.
i2c_read
(
0x56
,
0
,
(
nb_rec
+
1
)
*
6
,
eeprom_data
)
# Compare
for
i
in
range
(
0
,
len
(
file_data
)):
if
file_data
[
i
]
==
eeprom_data
[
i
]:
print
'EEPROM=
%.2
X, FILE=
%.2
X => OK'
%
(
eeprom_data
[
i
],
file_data
[
i
])
else
:
raise
TpsError
(
'EEPROM=
%.2
X, FILE=
%.2
X => ERROR'
%
(
eeprom_data
[
i
],
file_data
[
i
]))
def
file_dump_to_gennum
(
self
,
file_name
):
if
file_name
==
""
:
file_name
=
"./gn4124_diff.dat"
file
=
open
(
file_name
,
'r+'
)
file_data
=
[]
file_addr
=
[]
# Read file
for
line
in
file
:
addr
,
data
=
line
.
split
()
file_data
.
append
(
int
(
data
,
16
))
file_addr
.
append
(
int
(
addr
,
16
))
# Write Gennum configuration space
for
i
in
range
(
0
,
len
(
file_data
)):
self
.
gennum
.
iwrite
(
4
,
file_addr
[
i
],
4
,
file_data
[
i
])
print
' '
print
'Gennum configuration space written with '
+
file_name
+
' content!'
print
' '
def
main
(
default_directory
=
'.'
):
#It was vsupply short
tmp_vsupplyShorts
.
append
(
i
)
vsupplyShorts
.
append
(
i
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
groundedPins_string
=
''
vsupplyShorts_string
=
''
if
gpio_bank
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_bank
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_bank
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
amountOfPins
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
tmp_groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
if
len
(
tmp_vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
if
len
(
tmp_groundShorts
)
==
0
|
len
(
tmp_vsupplyShorts
)
==
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Test OK!"
elif
len
(
tmp_groundShorts
)
!=
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Grounded pins:
\t
"
+
groundedPins_string
elif
len
(
tmp_vsupplyShorts
)
!=
0
:
print
"
%0.8
X"
%
expected
+
"
\t
%0.8
X"
%
received
+
"
\t
%0.8
X"
%
mask
+
"
\t
Vcc tied pins:
\t
"
+
vsupplyShorts_string
#Just to improve human-readabilty
groundShorts
.
reverse
()
vsupplyShorts
.
reverse
()
# if (len(groundShorts) != 0):
# print header_msg + "\tYes\tGround shorts in pins:\t" + str(groundShorts);
#
# if (len(vsupplyShorts) != 0):
# print header_msg + "\tYes\tVCC shorts in pins:\t" + str(vsupplyShorts);
#
# if ( (len(groundShorts) == 0) & (len(vsupplyShorts) == 0)):
# print header_msg + "\tNo"
# return
#else:
# raise Exception("Shortcircuits detected!")
def
get_filename
(
gpio_bank_list
,
i2c_list
):
filename
=
''
for
k
in
sorted
(
gpio_bank_list
):
filename
+=
'_'
+
k
.
name
for
l
in
sorted
(
i2c_list
):
filename
+=
'_'
+
i2c_addr_to_schematicID
[
l
.
addr
]
return
filename
def
show_test_results
(
gpio_bank
,
bits_tested
,
offset
,
groundShorts
,
vsupplyShorts
):
if
(
offset
==
0
):
if
(
bits_tested
!=
16
|
bits_tested
!=
32
|
bits_tested
!=
64
|
bits_tested
!=
96
):
raise
Exception
(
"show_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
==
16
):
if
(
bits_tested
!=
16
):
raise
Exception
(
"show_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
!=
0
|
offset
!=
16
):
raise
Exception
(
"show_test_results: bad 'offset'"
)
FMCgrounded
=
[]
FMCvsupplytied
=
[]
FMCok
=
[]
groundedPins_string
=
""
vsupplyShorts_string
=
""
okPins_string
=
""
gpio_trans_list
=
[]
if
gpio_bank
.
name
==
'GPIO_0'
:
gpio_trans_list
=
gpio_0_to_FMC
elif
gpio_bank
.
name
==
'GPIO_1'
:
gpio_trans_list
=
gpio_1_to_FMC
elif
gpio_bank
.
name
==
'GPIO_2'
:
gpio_trans_list
=
gpio_2_to_FMC
else
:
raise
Exception
(
"Bad 'gpio_block'"
)
for
i
in
range
(
bits_tested
):
if
i
in
groundShorts
:
FMCgrounded
.
append
(
gpio_trans_list
[
i
+
offset
])
elif
i
in
vsupplyShorts
:
FMCvsupplytied
.
append
(
gpio_trans_list
[
i
+
offset
])
else
:
FMCok
.
append
(
gpio_trans_list
[
i
+
offset
])
FMCgrounded
=
sorted
(
FMCgrounded
)
FMCvsupplytied
=
sorted
(
FMCvsupplytied
)
FMCok
=
sorted
(
FMCok
)
for
i
in
FMCgrounded
:
groundedPins_string
+=
i
+
", "
for
i
in
FMCvsupplytied
:
vsupplyShorts_string
+=
i
+
", "
if
len
(
groundShorts
)
!=
0
:
groundedPins_string
=
groundedPins_string
[:
-
2
]
print
"---- Grounded pins:
\t
"
+
groundedPins_string
if
len
(
vsupplyShorts
)
!=
0
:
vsupplyShorts_string
=
vsupplyShorts_string
[:
-
2
]
print
"---- Vcc tied pins:
\t
"
+
vsupplyShorts_string
def
summary_results
(
testStatus
):
loopback_log
=
os
.
path
.
join
(
default_log_path
,
'./log/test_fmc/loopback/'
)
mkdir_p
(
loopback_log
)
string
=
''
for
i
in
sorted
(
testStatus
.
keys
()):
string_tmp
=
' '
+
i
.
replace
(
'_'
,
' '
)
+
' '
string
+=
string_tmp
[:
30
]
+
testStatus
[
i
]
+
"
\n
"
for
i
in
sorted
(
testStatus
.
keys
()):
if
testStatus
[
i
]
==
'Fail'
:
raise
TpsError
(
"FMC connector failure"
)
print
string
filename
=
"Summary_FMC_tets.txt"
file
=
open
(
os
.
path
.
join
(
loopback_log
,
filename
),
'w'
)
file
.
write
(
string
)
def
write_test_results
(
gpio_bank_list
,
i2c_list
,
test_id
,
bits_tested
,
offset
):
# We store data in log subfolder
fmc_pinout_log
=
os
.
path
.
join
(
default_log_path
,
'./log/test_fmc/loopback/FMC_pinout'
)
mkdir_p
(
fmc_pinout_log
)
if
(
offset
==
0
):
if
(
bits_tested
!=
16
|
bits_tested
!=
32
|
bits_tested
!=
64
|
bits_tested
!=
96
):
raise
Exception
(
"write_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
==
16
):
if
(
bits_tested
!=
16
):
raise
Exception
(
"write_test_results: 'offset' and 'bits_tested' mismatch"
)
else
:
pass
if
(
offset
!=
0
|
offset
!=
16
):
raise
Exception
(
"write_test_results: bad 'offset'"
)
number_of_gpios
=
len
(
gpio_bank_list
)
# if number_of_gpios != (bits_tested/32):
# raise Exception("'bits_tested' are incompatible with GPIO assigment")
filename
=
"FMC"
# print "offset:\t" + str(offset)
filename
+=
get_filename
(
gpio_bank_list
,
i2c_list
)
filename
+=
'_'
+
"
%.2
X"
%
test_id
+
'.txt'
# This file generation must be revised !!!
# yes indeed!!! jdgc
gpio_pinout
=
os
.
path
.
join
(
tests_path
,
'./log/test_fmc/loopback/GPIO_pinout/'
)
mkdir_p
(
gpio_pinout
)
file
=
open
(
os
.
path
.
join
(
gpio_pinout
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'GPIO pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
for
k
in
range
(
number_of_gpios
-
1
,
-
1
,
-
1
):
file
.
write
(
'--'
+
gpio_bank_list
[
k
]
.
name
+
'
\n
'
)
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
((
i
+
32
*
k
)
in
groundShorts
and
(
i
+
32
*
k
)
in
vsupplyShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
Shortcircuit'
+
'
\n
'
)
elif
((
i
+
32
*
k
)
in
groundShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
Grounded'
+
'
\n
'
)
elif
((
i
+
32
*
k
)
in
vsupplyShorts
):
file
.
write
(
str
(
i
)
+
'
\t\t
VCC tied'
+
'
\n
'
)
else
:
file
.
write
(
str
(
i
)
+
'
\t\t
OK'
+
'
\n
'
)
file
.
close
()
tester_pinout
=
os
.
path
.
join
(
tests_path
,
'./log/test_fmc/loopback/tester_pinout/'
)
mkdir_p
(
tester_pinout
)
file
=
open
(
os
.
path
.
join
(
tester_pinout
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'Tester pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
gpio_order
=
[]
for
k
in
xrange
(
number_of_gpios
):
if
gpio_bank_list
[
k
]
.
name
==
'GPIO_0'
:
gpio_order
.
append
(
gpio_0_to_tester
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_1'
:
gpio_order
.
append
(
gpio_1_to_tester
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_2'
:
gpio_order
.
append
(
gpio_2_to_tester
)
else
:
raise
Exception
(
"Bad 'gpio_block_name_list'"
)
for
k
in
xrange
(
number_of_gpios
):
translation_dict
=
{}
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
(
i
in
groundShorts
and
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Shortcircuit'
elif
(
i
in
groundShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Grounded'
elif
(
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'VCC tied'
else
:
translation_dict
[
gpio_order
[
k
][
i
]]
=
'OK'
file
.
write
(
'--'
+
gpio_bank_list
[
k
]
.
name
+
'
\n
'
)
for
k
in
sorted
(
translation_dict
.
keys
()):
file
.
write
(
k
+
'
\t\t
'
+
translation_dict
[
k
]
+
'
\n
'
)
file
.
close
()
gpio_order
=
[]
for
k
in
xrange
(
number_of_gpios
):
if
gpio_bank_list
[
k
]
.
name
==
'GPIO_0'
:
gpio_order
.
append
(
gpio_0_to_FMC
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_1'
:
gpio_order
.
append
(
gpio_1_to_FMC
)
elif
gpio_bank_list
[
k
]
.
name
==
'GPIO_2'
:
gpio_order
.
append
(
gpio_2_to_FMC
)
else
:
raise
Exception
(
"Bad 'gpio_block_name_list'"
)
file
=
open
(
os
.
path
.
join
(
fmc_pinout_log
,
filename
),
'w'
)
file
.
write
(
'DEVICE_ID:
\t
'
+
filename
[:
-
7
]
.
replace
(
'GPIO_'
,
'GPIO'
)
.
replace
(
'_'
,
' '
)
+
'
\n
'
)
file
.
write
(
'TEST_ID:
\t
'
+
"
%.2
X"
%
test_id
+
'
\n
'
)
file
.
write
(
'OUTPUT_MODE:
\t
'
+
'FMC pinout'
+
'
\n
'
)
file
.
write
(
'Pin
\t\t
Status'
+
'
\n
'
)
translation_dict
=
{}
for
k
in
xrange
(
number_of_gpios
):
for
i
in
range
(
bits_tested
+
offset
-
1
,
offset
-
1
,
-
1
):
if
(
i
in
groundShorts
and
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Shortcircuit'
elif
(
i
in
groundShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'Grounded'
elif
(
i
in
vsupplyShorts
):
translation_dict
[
gpio_order
[
k
][
i
]]
=
'VCC tied'
else
:
translation_dict
[
gpio_order
[
k
][
i
]]
=
'OK'
for
k
in
sorted
(
translation_dict
.
keys
()):
file
.
write
(
k
+
'
\t\t
'
+
translation_dict
[
k
]
+
'
\n
'
)
file
.
close
()
def
main
(
default_directory
=
'.'
,
default_log
=
'.'
):
global
default_log_path
,
tests_path
tests_path
=
default_directory
default_log_path
=
default_log
path_fpga_loader
=
'../firmwares/fpga_loader'
;
path_firmware
=
'../firmwares/test02.bin'
;
...
...
@@ -323,21 +1253,62 @@ def main (default_directory='.'):
os
.
system
(
firmware_loader
+
' '
+
bitstream
)
time
.
sleep
(
2
);
gennum
=
rr
.
Gennum
();
eeprom
=
EEPROM_GENNUM
(
gennum
);
GPIO_BLOCK_0_MASK
=
0xFFFFFFFF
# Take care! Here 1 means write into the pad
GPIO_BLOCK_1_MASK
=
0xBB1BFBFF
GPIO_BLOCK_2_MASK
=
0x80FC0000
gpio_block_0
=
GPIO_slave
(
gennum
,
BASE_GPIO0
);
# It corresponds to 0x27 and 0x24 I2C addresses
gpio_block_1
=
GPIO_slave
(
gennum
,
BASE_GPIO1
);
# It corresponds to 0x22 and 0x26 I2C addresses
gpio_block_2
=
GPIO_slave
(
gennum
,
BASE_GPIO2
);
# It corresponds to 0x22 and 0x26 I2C addresses
i2c_B
=
COpenCoresI2C
(
gennum
,
BASE_I2C_B
,
99
);
expander_IC1
=
EXPANDER_MCP23017
(
i2c_B
,
0x27
);
expander_IC1_MASK
=
0xFFFF
expander_IC2
=
EXPANDER_MCP23017
(
i2c_B
,
0x24
);
expander_IC2_MASK
=
0xFFFF
expander_IC3
=
EXPANDER_MCP23017
(
i2c_B
,
0x22
);
expander_IC3_MASK
=
0xBB1B
expander_IC4
=
EXPANDER_MCP23017
(
i2c_B
,
0x26
);
expander_IC4_MASK
=
0xFBFF
expander_IC5
=
EXPANDER_MCP23017
(
i2c_B
,
0x21
);
expander_IC5_MASK
=
0x80FC
expander_IC6
=
EXPANDER_MCP23017
(
i2c_B
,
0x25
);
expander_IC6_MASK
=
0x0000
# This four lines are gor testing porpouses
#groundShorts = []
#vsupplyShorts = []
#analyse_Shortcircuit(0xFBFBAABB, 0xDEADBABE, 0xFFFFFFFF, 32, "GPIO 1")
#write_test_results([gpio_block_1], [expander_IC3, expander_IC4], FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_32bits, 32, 0)
#groundShorts = []
#vsupplyShorts = []
#analyse_Shortcircuit(0xFFFF, 0xBABE, 0xFFFF, 16, "GPIO 1")
#write_test_results([gpio_block_1], [expander_IC3], FMC_SPEC_ROLL_0_TEST_ID_CC_gpio_to_i2c_16bits, 16, 0)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC1
,
expander_IC1_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
16
,
'GPIO_0'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
0
,
'GPIO_0'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC3
,
expander_IC3_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
16
,
'GPIO_1'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
0
,
'GPIO_1'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC5
,
expander_IC5_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
16
,
'GPIO_2'
)
FMC_roll_test_CC_16bits_i2c_writing
(
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
0
,
'GPIO_2'
)
eeprom
.
file_dump_to_gennum
(
default_directory
+
"/gn4124_diff.dat"
);
FMC_roll_test_CC_i2c_writing
(
expander_IC1
,
expander_IC1_MASK
,
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
'GPIO_0'
)
FMC_roll_test_CC_i2c_writing
(
expander_IC3
,
expander_IC3_MASK
,
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
'GPIO_1'
)
FMC_roll_test_CC_i2c_writing
(
expander_IC5
,
expander_IC5_MASK
,
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
'GPIO_2'
)
eeprom
.
eeprom_dump_to_file
(
"/tmp/eeprom.dat"
);
FMC_roll_test_CC_16bits
(
expander_IC1
,
expander_IC1_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
16
,
'GPIO_0'
)
FMC_roll_test_CC_16bits
(
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
0
,
'GPIO_0'
)
FMC_roll_test_CC_16bits
(
expander_IC3
,
expander_IC3_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
16
,
'GPIO_1'
)
FMC_roll_test_CC_16bits
(
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
0
,
'GPIO_1'
)
FMC_roll_test_CC_16bits
(
expander_IC5
,
expander_IC5_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
16
,
'GPIO_2'
)
FMC_roll_test_CC_16bits
(
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
0
,
'GPIO_2'
)
eeprom
.
file_dump_to_eeprom
(
default_directory
+
"/eeprom_test_A.dat"
);
eeprom
.
eeprom_dump_to_screen
();
eeprom
.
compare_eeprom_with_file
(
default_directory
+
"/eeprom_test_A.dat"
);
FMC_roll_test_CC
(
expander_IC1
,
expander_IC1_MASK
,
expander_IC2
,
expander_IC2_MASK
,
gpio_block_0
,
GPIO_BLOCK_0_MASK
,
'GPIO_0'
)
FMC_roll_test_CC
(
expander_IC3
,
expander_IC3_MASK
,
expander_IC4
,
expander_IC4_MASK
,
gpio_block_1
,
GPIO_BLOCK_1_MASK
,
'GPIO_1'
)
FMC_roll_test_CC
(
expander_IC5
,
expander_IC5_MASK
,
expander_IC6
,
expander_IC6_MASK
,
gpio_block_2
,
GPIO_BLOCK_2_MASK
,
'GPIO_2'
)
eeprom
.
file_dump_to_eeprom
(
"/tmp/eeprom.dat"
);
eeprom
.
eeprom_dump_to_screen
();
eeprom
.
compare_eeprom_with_file
(
"/tmp/eeprom.dat"
);
summary_results
(
testStatus
)
if
__name__
==
'__main__'
:
main
();
groundShorts
=
[]
vsupplyShorts
=
[]
if
__name__
==
'__main__'
:
main
(
default_directory
=
'.'
,
default_log
=
'.'
)
tps.sh
View file @
f78c441c
...
...
@@ -28,7 +28,7 @@ echo -n "Press enter to continue...\n"
read
tmp
echo
-n
"--------------------------------------------------------------
\n
"
sudo
./tps.py
-b
SPEC
-s
$serial
-e
$extra_serial
-t
./test/spec/python
-l
$LOGDIR
0
2 00 01
03 04 05 06 07 08 09 10 12
sudo
./tps.py
-b
SPEC
-s
$serial
-e
$extra_serial
-t
./test/spec/python
-l
$LOGDIR
0
0 01 02
03 04 05 06 07 08 09 10 12
echo
-n
"Press enter to exit... "
...
...
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