Mercurial > avr_jtag
diff py_avrjtag/jtagdev.py @ 10:cc106f278d7d
Get identify of components
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Tue, 24 Feb 2009 13:32:04 +0800 |
parents | 074e860d7d31 |
children | 520f45b72ba7 |
line wrap: on
line diff
--- a/py_avrjtag/jtagdev.py Sun Feb 22 22:43:26 2009 +0800 +++ b/py_avrjtag/jtagdev.py Tue Feb 24 13:32:04 2009 +0800 @@ -2,14 +2,16 @@ import cmd_proto class jtagdev(object): - ST_REST = 0 + ST_RESET = 0 ST_IDLE = 1 ST_SHIFT_DR = 2 ST_SHIFT_IR = 3 + ST_EXIT1_DR = 4 + ST_EXIT1_IR = 5 def __init__(self, fo): self.fo = fo - self.state = self.IDLE + self.state = self.ST_IDLE self.seq = 0 pass @@ -34,21 +36,41 @@ def wait_reply(self, tmo=None): import select - if tmo is None: - select.select((self.fo,), (), ()) - else: - select.select((self.fo,), (), (), tmo) + frame = '' + while True: + if tmo == None: + rlist, wlist, xlist = select.select((self.fo,), (), ()) + else: + rlist, wlist, xlist = select.select((self.fo,), (), (), tmo) + pass + if not rlist: + break + frame = frame + self.fo.read() + if len(frame) >= 4 and \ + len(frame) >= (ord(frame[3]) + + cmd_proto.cmd.FRAME_OVERHEAD): + break + tmo = 0.05 pass - frame = self.fo.read() + + if not frame: + return None + cmd = cmd_proto.cmd() - cmd.from_frame(frame) + r = cmd.from_frame(frame) + if r: + return None return cmd def idle(self): self.seq = (self.seq + 1) % 256 - ptn, nbits = tms_ptns.TMS_IDLE_SEQ - self.send_tms(ptn, nbits) + if self.state == self.ST_RESET: + ptn, nbits = tms_ptns.TMS_RESET_2_IDLE + else: + ptn, nbits = tms_ptns.TMS_IDLE_SEQ + pass + self._send_tms(ptn, nbits) self.state = self.ST_IDLE pass @@ -58,11 +80,11 @@ return if self.state == self.ST_IDLE: - ptn, ptn_nbits = tms_ptns.TMS_CAP_IR - self.send_tms(ptn, nbits) - elif self.state == self.ST_SHIFT_DR: - ptn, ptn_nbits = tms_ptns.TMS_SHIFT_DR_2_CAP_IR - self.send_tms(ptn, nbits) + ptn, ptn_nbits = tms_ptns.TMS_SHIFT_IR + self._send_tms(ptn, ptn_nbits) + elif self.state == self.ST_EXIT1_DR: + ptn, ptn_nbits = tms_ptns.TMS_EXIT1_DR_2_SHIFT_IR + self._send_tms(ptn, ptn_nbits) else: raise RuntimeError, 'Transite to shift IR state from invalid state' self.state = self.ST_SHIFT_IR @@ -73,11 +95,11 @@ return if self.state == self.ST_IDLE: - ptn, ptn_nbits = tms_ptns.TMS_CAP_DR - self.send_tms(ptn, nbits) - elif self.state == self.ST_SHIFT_IR: - ptn, ptn_nbits = tms_ptns.TMS_SHIFT_IR_2_CAP_DR - self.send_tms(ptn, nbits) + ptn, ptn_nbits = tms_ptns.TMS_SHIFT_DR + self._send_tms(ptn, ptn_nbits) + elif self.state == self.ST_EXIT1_IR: + ptn, ptn_nbits = tms_ptns.TMS_EXIT1_IR_2_SHIFT_DR + self._send_tms(ptn, ptn_nbits) else: raise RuntimeError, 'Transite to shift DR state from invalid state' pass @@ -92,6 +114,7 @@ self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI, nbits, data) + self.state = self.ST_EXIT1_IR pass def shift_DR(self, data, nbits): @@ -102,6 +125,7 @@ self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI, nbits, data) + self.state = self.ST_EXIT1_DR pass def shift_DR_n_out(self, data, nbits): @@ -112,6 +136,7 @@ self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI_TDO, nbits, data) + self.state = self.ST_EXIT1_DR pass def reset(self): @@ -121,7 +146,7 @@ pass def _extract_nbits_data(nbits_data): - nbits = ord(nbits_data[0]) | (ord(nbits_data[1] << 8)) + nbits = ord(nbits_data[0]) | (ord(nbits_data[1]) << 8) return nbits, nbits_data[2:] def _get_bit(data, bit_idx): @@ -133,13 +158,24 @@ dev.go_shift_IR() reply = dev.wait_reply() if reply.code != cmd_proto.CPCMD_ACK: - raise RutimeError, 'invliad reply code 0x%02x' % (reply.code) + raise RuntimeError, 'invalid reply code 0x%02x' % (reply.code) + + dev.shift_IR('\x02', 4) + reply = dev.wait_reply() + if reply.code != cmd_proto.CPCMD_ACK: + raise RuntimeError, 'invalid reply code 0x%02x' % (reply.code) dev.go_shift_DR() - dev.shift_DR('\xff' * 253, 253 * 8) reply = dev.wait_reply() + if reply.code != cmd_proto.CPCMD_ACK: + raise RuntimeError, 'invalid reply code 0x%02x' % (reply.code) + + dev.shift_DR_n_out('\xff' * 252, 252 * 8) + reply = dev.wait_reply() + if not reply: + raise RuntimeError, 'Invalid replied message' if reply.code != cmd_proto.CPCMD_DATA: - raise RutimeError, 'invliad reply code 0x%02x' % (reply.code) + raise RuntimeError, 'invalid replied code 0x%02x %s' % (reply.code, repr(reply)) nbits, data = _extract_nbits_data(reply.data)