Add TRST support to xsvf tools. Courtesy of Dick Hollenbeck <dick@softplc.com>

git-svn-id: svn://svn.berlios.de/openocd/trunk@1357 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
kc8apf 2009-01-23 07:05:04 +00:00
parent 44a7b25487
commit 4dcad08940
2 changed files with 44 additions and 3 deletions

View File

@ -57,6 +57,11 @@ outputFilename = sys.argv[2]
doCOMMENTs = True # Save XCOMMENTs in the output xsvf file doCOMMENTs = True # Save XCOMMENTs in the output xsvf file
#doCOMMENTs = False # Save XCOMMENTs in the output xsvf file #doCOMMENTs = False # Save XCOMMENTs in the output xsvf file
# pick your file encoding
file_encoding = 'ISO-8859-1'
#file_encoding = 'utf-8'
xrepeat = 0 # argument to XREPEAT, gives retry count for masked compares xrepeat = 0 # argument to XREPEAT, gives retry count for masked compares
@ -74,7 +79,8 @@ StateTxt = ("RESET","IDLE",
(XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO, (XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO,
XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC, XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC,
XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,LCOUNT,LDELAY,LSDR) = range(28) XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,
LCOUNT,LDELAY,LSDR,XTRST) = range(29)
#Note: LCOUNT, LDELAY, and LSDR are Lattice extensions to SVF and provide a way to loop back #Note: LCOUNT, LDELAY, and LSDR are Lattice extensions to SVF and provide a way to loop back
# and check a completion status, essentially waiting on a part until it signals that it is done. # and check a completion status, essentially waiting on a part until it signals that it is done.
@ -90,6 +96,8 @@ LSDR 1 TDI (0)
TDO (1); TDO (1);
""" """
#XTRST is an opcode Xilinx seemed to have missed and it comes from the SVF TRST statement.
LineNumber = 1 LineNumber = 1
def s_ident(scanner, token): return ("ident", token.upper(), LineNumber) def s_ident(scanner, token): return ("ident", token.upper(), LineNumber)
@ -127,8 +135,13 @@ scanner = re.Scanner([
re.MULTILINE re.MULTILINE
) )
# open the file using the given encoding
file = open( sys.argv[1], encoding=file_encoding )
# read all svf file input into string "input" # read all svf file input into string "input"
input = open( sys.argv[1] ).read() input = file.read()
file.close()
# Lexer: # Lexer:
# create a list of tuples containing (tokenType, tokenValue, LineNumber) # create a list of tuples containing (tokenType, tokenValue, LineNumber)
@ -368,6 +381,8 @@ run_state_allowed = ('IRPAUSE', 'DRPAUSE', 'RESET', 'IDLE')
enddr_state_allowed = ('DRPAUSE', 'IDLE') enddr_state_allowed = ('DRPAUSE', 'IDLE')
endir_state_allowed = ('IRPAUSE', 'IDLE') endir_state_allowed = ('IRPAUSE', 'IDLE')
trst_mode_allowed = ('ON', 'OFF', 'Z', 'ABSENT')
enddr_state = IDLE enddr_state = IDLE
endir_state = IDLE endir_state = IDLE
@ -681,6 +696,19 @@ try:
if tokVal != ';': if tokVal != ';':
raise ParseError( tokLn, tokVal, "Expecting ';' after FREQUENCY cycles HZ") raise ParseError( tokLn, tokVal, "Expecting ';' after FREQUENCY cycles HZ")
elif tokVal == 'TRST':
nextTok()
if tokVal not in trst_mode_allowed:
raise ParseError( tokLn, tokVal, "Expecting 'ON|OFF|Z|ABSENT' after TRST")
trst_mode = tokVal
nextTok()
if tokVal != ';':
raise ParseError( tokLn, tokVal, "Expecting ';' after TRST trst_mode")
obuf = bytearray( 2 )
obuf[0] = XTRST
obuf[1] = trst_mode_allowed.index( trst_mode ) # use the index as the binary argument to XTRST opcode
output.write( obuf )
else: else:
raise ParseError( tokLn, tokVal, "Unknown token '%s'" % tokVal) raise ParseError( tokLn, tokVal, "Unknown token '%s'" % tokVal)

View File

@ -39,7 +39,8 @@ Xsdrsize = 0
(XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO, (XCOMPLETE,XTDOMASK,XSIR,XSDR,XRUNTEST,hole0,hole1,XREPEAT,XSDRSIZE,XSDRTDO,
XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC, XSETSDRMASKS,XSDRINC,XSDRB,XSDRC,XSDRE,XSDRTDOB,XSDRTDOC,
XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,LCOUNT,LDELAY,LSDR) = range(28) XSDRTDOE,XSTATE,XENDIR,XENDDR,XSIR2,XCOMMENT,XWAIT,XWAITSTATE,
LCOUNT,LDELAY,LSDR,XTRST) = range(29)
(RESET,IDLE, (RESET,IDLE,
@ -51,6 +52,10 @@ State = ("RESET","IDLE",
"DRSELECT","DRCAPTURE","DRSHIFT","DREXIT1","DRPAUSE","DREXIT2","DRUPDATE", "DRSELECT","DRCAPTURE","DRSHIFT","DREXIT1","DRPAUSE","DREXIT2","DRUPDATE",
"IRSELECT","IRCAPTURE","IRSHIFT","IREXIT1","IRPAUSE","IREXIT2","IRUPDATE") "IRSELECT","IRCAPTURE","IRSHIFT","IREXIT1","IRPAUSE","IREXIT2","IRUPDATE")
trst_mode_allowed = ('ON', 'OFF', 'Z', 'ABSENT')
Setsdrmasks = 0 Setsdrmasks = 0
SetsdrmasksOnesCount = 0 SetsdrmasksOnesCount = 0
@ -229,6 +234,14 @@ def ShowOpcode( op, f ):
tdo = bytes2hexString( f, Xsdrsize ) tdo = bytes2hexString( f, Xsdrsize )
print("LSDR 0x%s 0x%s" % (tdi, tdo) ) print("LSDR 0x%s 0x%s" % (tdi, tdo) )
elif op == XTRST:
# the argument is a single byte and it is the index into "trst_mode_allowed"
trst_mode = ReadByte(f)
if trst_mode <= 3:
print("TRST %s" % trst_mode_allowed[trst_mode] )
else:
print("TRST 0x%02X" % trst_mode );
else: else:
print("UNKNOWN op 0x%02X %d" % (op, op)) print("UNKNOWN op 0x%02X %d" % (op, op))
exit(1) exit(1)