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