Mercurial > avr_jtag
view py_avrjtag/cmd_proto.py @ 13:1ea479d26fce tip
Make sure shifting phase and add bypass.py.
- shifting phase is started after entering SHIFT state
Transition from CAP to SHIFT does not induce shifting.
- shifting phase is stoped after leaving SHIFT state.
Transition from SHIFT to EXIT1 also induce a bit of shifting.
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Wed, 25 Feb 2009 20:08:29 +0800 |
parents | cc106f278d7d |
children |
line wrap: on
line source
import struct CPCMD_PING = 1 CPCMD_SHIFT_TDI = 2 CPCMD_SHIFT_TMS = 3 CPCMD_SHIFT_TDI_TDO = 4 CPCMD_TRST = 5 CPCMD_PONG = 6 CPCMD_DATA = 7 CPCMD_ACK = 8 CPCMD_NAK = 9 def csum_add(csum, c): return (((csum << 3) | (csum >> 5)) ^ c) & 0xff class cmd(object): OFF_SEQ = 2 OFF_DSZ = 3 OFF_CODE = 4 FRAME_OVERHEAD = 5 def __init__(self, seq=0, code=0, data=''): if len(data) >= 255: raise ValueError, 'data length (%d) >= 255' % (len(data)) self.seq = seq self.code = code self.data = data pass def to_frame(self): csum = 0 csum = csum_add(0, self.code) for c in self.data: csum = csum_add(csum, ord(c)) pass csum = csum_add(csum, 0) frame = struct.pack('BBBBB', ord('J'), ord('C'), self.seq, len(self.data) + 1, self.code) frame = frame + self.data + chr(csum) return frame def from_frame(self, frame): if frame[:2] != 'JC': return -1 csum = 0 for c in frame[self.OFF_CODE:]: csum = csum_add(csum, ord(c)) pass if csum: return -1 data_sz = ord(frame[self.OFF_DSZ]) if data_sz != (len(frame) - self.FRAME_OVERHEAD): return -1 if not data_sz: return -1 self.seq = ord(frame[self.OFF_SEQ]) self.code = ord(frame[self.OFF_CODE]) self.data = frame[self.OFF_CODE + 1:-1] pass def __repr__(self): return '<%s {seq: %d, code: %d, data: %s}>' % \ (self.__class__.__name__, self.seq, self.code, repr(self.data)) pass def prepend_nbits(nbits, data): r = chr(nbits & 0xff) + chr(nbits >> 8) + data return r