api_version = 1
id = 'jtag'
name = 'JTAG'
- longname = 'Joint Test Action Group'
- desc = 'TODO.'
+ longname = 'Joint Test Action Group (IEEE 1149.1)'
+ desc = 'Protocol for testing, debugging, and flashing ICs.'
license = 'gplv2+'
inputs = ['logic']
outputs = ['jtag']
{'id': 'tdo', 'name': 'TDO', 'desc': 'Test data output'},
{'id': 'tck', 'name': 'TCK', 'desc': 'Test clock'},
{'id': 'tms', 'name': 'TMS', 'desc': 'Test mode select'},
- {'id': 'trst', 'name': 'TRST', 'desc': 'Test reset'},
]
- optional_probes = [] # TODO? SRST?
+ optional_probes = [
+ {'id': 'trst', 'name': 'TRST#', 'desc': 'Test reset'},
+ {'id': 'srst', 'name': 'SRST#', 'desc': 'System reset'},
+ {'id': 'rtck', 'name': 'RTCK', 'desc': 'Return clock signal'},
+ ]
options = {}
annotations = [
- ['ASCII', 'TODO: description'],
+ ['Text', 'Human-readable text'],
]
def __init__(self, **kwargs):
# self.state = 'TEST-LOGIC-RESET'
self.state = 'RUN-TEST/IDLE'
self.oldstate = None
- self.oldpins = (-1, -1, -1, -1, -1)
+ self.oldpins = (-1, -1, -1, -1)
self.oldtck = -1
self.bits_tdi = []
self.bits_tdo = []
else:
raise Exception('Invalid state: %s' % self.state)
- def handle_rising_tck_edge(self, tdi, tdo, tck, tms, trst):
+ def handle_rising_tck_edge(self, tdi, tdo, tck, tms):
# Rising TCK edges always advance the state machine.
self.advance_state_machine(tms)
t = self.state[-2:] + ' TDI'
b = ''.join(map(str, self.bits_tdi))
- s = t + ': ' + b + ', ' + str(len(self.bits_tdi)) + ' bits'
+ h = ' (0x%x' % int('0b' + b, 2) + ')'
+ s = t + ': ' + b + h + ', ' + str(len(self.bits_tdi)) + ' bits'
self.put(self.ss, self.es, self.out_ann, [0, [s]])
self.put(self.ss, self.es, self.out_proto, [t, b])
self.bits_tdi = []
t = self.state[-2:] + ' TDO'
b = ''.join(map(str, self.bits_tdo))
- s = t + ': ' + b + ', ' + str(len(self.bits_tdo)) + ' bits'
+ h = ' (0x%x' % int('0b' + b, 2) + ')'
+ s = t + ': ' + b + h + ', ' + str(len(self.bits_tdo)) + ' bits'
self.put(self.ss, self.es, self.out_ann, [0, [s]])
self.put(self.ss, self.es, self.out_proto, [t, b])
self.bits_tdo = []
self.oldpins = pins
# Get individual pin values into local variables.
- # TODO: Handle optional pins.
- (tdi, tdo, tck, tms, trst) = pins
+ # Unused probes will have a value of > 1.
+ (tdi, tdo, tck, tms, trst, srst, rtck) = pins
# We only care about TCK edges (either rising or falling).
if (self.oldtck == tck):
self.ss, self.es = ss, es
# self.put(self.ss, self.es, self.out_ann,
- # [0, ['tdi:%s, tdo:%s, tck:%s, tms:%s, trst:%s' \
- # % (tdi, tdo, tck, tms, trst)]])
+ # [0, ['tdi:%s, tdo:%s, tck:%s, tms:%s' \
+ # % (tdi, tdo, tck, tms)]])
if (self.oldtck == 0 and tck == 1):
- self.handle_rising_tck_edge(tdi, tdo, tck, tms, trst)
+ self.handle_rising_tck_edge(tdi, tdo, tck, tms)
self.oldtck = tck