Mercurial > avr_jtag
comparison py_avrjtag/jtagdev.py @ 8:074e860d7d31
jtagdev is a desktop client to communicate with jtag device through Arduino.
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Sun, 22 Feb 2009 22:30:20 +0800 |
parents | |
children | cc106f278d7d |
comparison
equal
deleted
inserted
replaced
7:61f27549de57 | 8:074e860d7d31 |
---|---|
1 import tms_ptns | |
2 import cmd_proto | |
3 | |
4 class jtagdev(object): | |
5 ST_REST = 0 | |
6 ST_IDLE = 1 | |
7 ST_SHIFT_DR = 2 | |
8 ST_SHIFT_IR = 3 | |
9 | |
10 def __init__(self, fo): | |
11 self.fo = fo | |
12 self.state = self.IDLE | |
13 self.seq = 0 | |
14 pass | |
15 | |
16 def _send_cmd(self, code, data): | |
17 cmd = cmd_proto.cmd(self.seq, code, data) | |
18 frame = cmd.to_frame() | |
19 | |
20 self.fo.write(frame) | |
21 self.fo.flush() | |
22 pass | |
23 | |
24 def _send_nbits_data_cmd(self, code, nbits, data): | |
25 nbits_data = cmd_proto.prepend_nbits(nbits, data) | |
26 self._send_cmd(code, nbits_data) | |
27 pass | |
28 | |
29 def _send_tms(self, ptn, nbits): | |
30 self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TMS, | |
31 nbits, ptn) | |
32 pass | |
33 | |
34 def wait_reply(self, tmo=None): | |
35 import select | |
36 | |
37 if tmo is None: | |
38 select.select((self.fo,), (), ()) | |
39 else: | |
40 select.select((self.fo,), (), (), tmo) | |
41 pass | |
42 frame = self.fo.read() | |
43 cmd = cmd_proto.cmd() | |
44 cmd.from_frame(frame) | |
45 return cmd | |
46 | |
47 def idle(self): | |
48 self.seq = (self.seq + 1) % 256 | |
49 | |
50 ptn, nbits = tms_ptns.TMS_IDLE_SEQ | |
51 self.send_tms(ptn, nbits) | |
52 | |
53 self.state = self.ST_IDLE | |
54 pass | |
55 | |
56 def go_shift_IR(self): | |
57 if self.state == self.ST_SHIFT_IR: | |
58 return | |
59 | |
60 if self.state == self.ST_IDLE: | |
61 ptn, ptn_nbits = tms_ptns.TMS_CAP_IR | |
62 self.send_tms(ptn, nbits) | |
63 elif self.state == self.ST_SHIFT_DR: | |
64 ptn, ptn_nbits = tms_ptns.TMS_SHIFT_DR_2_CAP_IR | |
65 self.send_tms(ptn, nbits) | |
66 else: | |
67 raise RuntimeError, 'Transite to shift IR state from invalid state' | |
68 self.state = self.ST_SHIFT_IR | |
69 pass | |
70 | |
71 def go_shift_DR(self): | |
72 if self.state == self.ST_SHIFT_DR: | |
73 return | |
74 | |
75 if self.state == self.ST_IDLE: | |
76 ptn, ptn_nbits = tms_ptns.TMS_CAP_DR | |
77 self.send_tms(ptn, nbits) | |
78 elif self.state == self.ST_SHIFT_IR: | |
79 ptn, ptn_nbits = tms_ptns.TMS_SHIFT_IR_2_CAP_DR | |
80 self.send_tms(ptn, nbits) | |
81 else: | |
82 raise RuntimeError, 'Transite to shift DR state from invalid state' | |
83 pass | |
84 self.state = self.ST_SHIFT_DR | |
85 pass | |
86 | |
87 def shift_IR(self, data, nbits): | |
88 self.seq = (self.seq + 1) % 256 | |
89 | |
90 if self.state != self.ST_SHIFT_IR: | |
91 raise RuntimeError, 'Invalid state' | |
92 | |
93 self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI, | |
94 nbits, data) | |
95 pass | |
96 | |
97 def shift_DR(self, data, nbits): | |
98 self.seq = (self.seq + 1) % 256 | |
99 | |
100 if self.state != self.ST_SHIFT_DR: | |
101 raise RuntimeError, 'Invalid state' | |
102 | |
103 self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI, | |
104 nbits, data) | |
105 pass | |
106 | |
107 def shift_DR_n_out(self, data, nbits): | |
108 self.seq = (self.seq + 1) % 256 | |
109 | |
110 if self.state != self.ST_SHIFT_DR: | |
111 raise RuntimeError, 'Invalid state' | |
112 | |
113 self._send_nbits_data_cmd(cmd_proto.CPCMD_SHIFT_TDI_TDO, | |
114 nbits, data) | |
115 pass | |
116 | |
117 def reset(self): | |
118 self._send_cmd(cmd_proto.CPCMD_TRST, '') | |
119 self.state = self.ST_RESET | |
120 pass | |
121 pass | |
122 | |
123 def _extract_nbits_data(nbits_data): | |
124 nbits = ord(nbits_data[0]) | (ord(nbits_data[1] << 8)) | |
125 return nbits, nbits_data[2:] | |
126 | |
127 def _get_bit(data, bit_idx): | |
128 byte_off = bit_idx / 8 | |
129 bit_off = bit_idx % 8 | |
130 return (ord(data[byte_off]) >> bit_off) & 0x1 | |
131 | |
132 def identify_components(dev): | |
133 dev.go_shift_IR() | |
134 reply = dev.wait_reply() | |
135 if reply.code != cmd_proto.CPCMD_ACK: | |
136 raise RutimeError, 'invliad reply code 0x%02x' % (reply.code) | |
137 | |
138 dev.go_shift_DR() | |
139 dev.shift_DR('\xff' * 253, 253 * 8) | |
140 reply = dev.wait_reply() | |
141 if reply.code != cmd_proto.CPCMD_DATA: | |
142 raise RutimeError, 'invliad reply code 0x%02x' % (reply.code) | |
143 | |
144 nbits, data = _extract_nbits_data(reply.data) | |
145 | |
146 components = [] | |
147 i = 0 | |
148 while i < nbits: | |
149 bit = _get_bit(data, i) | |
150 if bit == 0: | |
151 components.append(0) | |
152 i = i + 1 | |
153 else: | |
154 comp_id = 0 | |
155 for j in range(32): | |
156 bit = _get_bit(data, i + j) | |
157 comp_id = comp_id | (bit << j) | |
158 pass | |
159 if comp_id == 0xffffffff: | |
160 break | |
161 components.append(comp_id) | |
162 i = i + 32 | |
163 pass | |
164 pass | |
165 return components |