X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=decoders%2Fjtag%2Fjtag.py;h=4e27ce8477cdb09d48214f7143e81b093efbccce;hb=2dc6d41c64a8235308e61b4f9b509c7fecb2b502;hp=4c7779780e74094d8a47fbde022c577de67e6e65;hpb=e5edf39f10053515fb044314adf83820ad118c57;p=libsigrokdecode.git diff --git a/decoders/jtag/jtag.py b/decoders/jtag/jtag.py index 4c77797..4e27ce8 100644 --- a/decoders/jtag/jtag.py +++ b/decoders/jtag/jtag.py @@ -26,8 +26,8 @@ class Decoder(srd.Decoder): 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'] @@ -36,19 +36,22 @@ class Decoder(srd.Decoder): {'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 = [] @@ -104,7 +107,7 @@ class Decoder(srd.Decoder): 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) @@ -131,14 +134,16 @@ class Decoder(srd.Decoder): 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 = [] @@ -154,8 +159,8 @@ class Decoder(srd.Decoder): 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): @@ -165,11 +170,11 @@ class Decoder(srd.Decoder): 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