xvsf player fixes by Dick Hollenbeck <dick@softplc.com>
[openocd.git] / src / jtag / bitbang.c
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include "bitbang.h"
28
29 /* project specific includes */
30 #include "log.h"
31 #include "types.h"
32 #include "jtag.h"
33 #include "configuration.h"
34
35 /* system includes */
36 #include <string.h>
37 #include <stdlib.h>
38 #include <unistd.h>
39
40
41 /**
42 * Function bitbang_stableclocks
43 * issues a number of clock cycles while staying in a stable state.
44 * Because the TMS value required to stay in the RESET state is a 1, whereas
45 * the TMS value required to stay in any of the other stable states is a 0,
46 * this function checks the current stable state to decide on the value of TMS
47 * to use.
48 */
49 static void bitbang_stableclocks(int num_cycles);
50
51
52 bitbang_interface_t *bitbang_interface;
53
54 /* DANGER!!!! clock absolutely *MUST* be 0 in idle or reset won't work!
55 *
56 * Set this to 1 and str912 reset halt will fail.
57 *
58 * If someone can submit a patch with an explanation it will be greatly
59 * appreciated, but as far as I can tell (ØH) DCLK is generated upon
60 * clk=0 in TAP_IDLE. Good luck deducing that from the ARM documentation!
61 * The ARM documentation uses the term "DCLK is asserted while in the TAP_IDLE
62 * state". With hardware there is no such thing as *while* in a state. There
63 * are only edges. So clk => 0 is in fact a very subtle state transition that
64 * happens *while* in the TAP_IDLE state. "#&¤"#¤&"#&"#&
65 *
66 * For "reset halt" the last thing that happens before srst is asserted
67 * is that the breakpoint is set up. If DCLK is not wiggled one last
68 * time before the reset, then the breakpoint is not set up and
69 * "reset halt" will fail to halt.
70 *
71 */
72 #define CLOCK_IDLE() 0
73
74 int bitbang_execute_queue(void);
75
76
77
78 /* The bitbang driver leaves the TCK 0 when in idle */
79
80 void bitbang_end_state(enum tap_state state)
81 {
82 if (tap_move_map[state] != -1)
83 end_state = state;
84 else
85 {
86 LOG_ERROR("BUG: %i is not a valid end state", state);
87 exit(-1);
88 }
89 }
90
91 void bitbang_state_move(void) {
92
93 int i=0, tms=0;
94 u8 tms_scan = TAP_MOVE(cur_state, end_state);
95
96 for (i = 0; i < 7; i++)
97 {
98 tms = (tms_scan >> i) & 1;
99 bitbang_interface->write(0, tms, 0);
100 bitbang_interface->write(1, tms, 0);
101 }
102 bitbang_interface->write(CLOCK_IDLE(), tms, 0);
103
104 cur_state = end_state;
105 }
106
107 void bitbang_path_move(pathmove_command_t *cmd)
108 {
109 int num_states = cmd->num_states;
110 int state_count;
111 int tms = 0;
112
113 state_count = 0;
114 while (num_states)
115 {
116 if (tap_transitions[cur_state].low == cmd->path[state_count])
117 {
118 tms = 0;
119 }
120 else if (tap_transitions[cur_state].high == cmd->path[state_count])
121 {
122 tms = 1;
123 }
124 else
125 {
126 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
127 exit(-1);
128 }
129
130 bitbang_interface->write(0, tms, 0);
131 bitbang_interface->write(1, tms, 0);
132
133 cur_state = cmd->path[state_count];
134 state_count++;
135 num_states--;
136 }
137
138 bitbang_interface->write(CLOCK_IDLE(), tms, 0);
139
140 end_state = cur_state;
141 }
142
143 void bitbang_runtest(int num_cycles)
144 {
145 int i;
146
147 enum tap_state saved_end_state = end_state;
148
149 /* only do a state_move when we're not already in IDLE */
150 if (cur_state != TAP_IDLE)
151 {
152 bitbang_end_state(TAP_IDLE);
153 bitbang_state_move();
154 }
155
156 /* execute num_cycles */
157 for (i = 0; i < num_cycles; i++)
158 {
159 bitbang_interface->write(0, 0, 0);
160 bitbang_interface->write(1, 0, 0);
161 }
162 bitbang_interface->write(CLOCK_IDLE(), 0, 0);
163
164 /* finish in end_state */
165 bitbang_end_state(saved_end_state);
166 if (cur_state != end_state)
167 bitbang_state_move();
168 }
169
170
171 static void bitbang_stableclocks(int num_cycles)
172 {
173 int tms = (cur_state == TAP_RESET ? 1 : 0);
174 int i;
175
176 /* send num_cycles clocks onto the cable */
177 for (i = 0; i < num_cycles; i++)
178 {
179 bitbang_interface->write(1, tms, 0);
180 bitbang_interface->write(0, tms, 0);
181 }
182 }
183
184
185
186 void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
187 {
188 enum tap_state saved_end_state = end_state;
189 int bit_cnt;
190
191 if (!((!ir_scan && (cur_state == TAP_DRSHIFT)) || (ir_scan && (cur_state == TAP_IRSHIFT))))
192 {
193 if (ir_scan)
194 bitbang_end_state(TAP_IRSHIFT);
195 else
196 bitbang_end_state(TAP_DRSHIFT);
197
198 bitbang_state_move();
199 bitbang_end_state(saved_end_state);
200 }
201
202 for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)
203 {
204 int val=0;
205 int tms=(bit_cnt==scan_size-1) ? 1 : 0;
206 int tdi;
207 int bytec=bit_cnt/8;
208 int bcval=1<<(bit_cnt % 8);
209
210 /* if we're just reading the scan, but don't care about the output
211 * default to outputting 'low', this also makes valgrind traces more readable,
212 * as it removes the dependency on an uninitialised value
213 */
214 tdi=0;
215 if ((type != SCAN_IN) && (buffer[bytec] & bcval))
216 tdi=1;
217
218 bitbang_interface->write(0, tms, tdi);
219
220 if (type!=SCAN_OUT)
221 val=bitbang_interface->read();
222
223 bitbang_interface->write(1, tms, tdi);
224
225 if (type != SCAN_OUT)
226 {
227 if (val)
228 buffer[bytec] |= bcval;
229 else
230 buffer[bytec] &= ~bcval;
231 }
232 }
233
234 /* TAP_DRSHIFT & TAP_IRSHIFT are illegal end states, so we always transition to the pause
235 * state which is a legal stable state from which statemove will work.
236 *
237 * Exit1 -> Pause
238 */
239 bitbang_interface->write(0, 0, 0);
240 bitbang_interface->write(1, 0, 0);
241 bitbang_interface->write(CLOCK_IDLE(), 0, 0);
242
243 if (ir_scan)
244 cur_state = TAP_IRPAUSE;
245 else
246 cur_state = TAP_DRPAUSE;
247
248 if (cur_state != end_state)
249 bitbang_state_move();
250 }
251
252 int bitbang_execute_queue(void)
253 {
254 jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
255 int scan_size;
256 enum scan_type type;
257 u8 *buffer;
258 int retval;
259
260 if (!bitbang_interface)
261 {
262 LOG_ERROR("BUG: Bitbang interface called, but not yet initialized");
263 exit(-1);
264 }
265
266 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
267 * that wasn't handled by a caller-provided error handler
268 */
269 retval = ERROR_OK;
270
271 if(bitbang_interface->blink)
272 bitbang_interface->blink(1);
273
274 while (cmd)
275 {
276 switch (cmd->type)
277 {
278 case JTAG_END_STATE:
279 #ifdef _DEBUG_JTAG_IO_
280 LOG_DEBUG("end_state: %s", jtag_state_name(cmd->cmd.end_state->end_state) );
281 #endif
282 if (cmd->cmd.end_state->end_state != -1)
283 bitbang_end_state(cmd->cmd.end_state->end_state);
284 break;
285 case JTAG_RESET:
286 #ifdef _DEBUG_JTAG_IO_
287 LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
288 #endif
289 if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
290 {
291 cur_state = TAP_RESET;
292 }
293 bitbang_interface->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
294 break;
295 case JTAG_RUNTEST:
296 #ifdef _DEBUG_JTAG_IO_
297 LOG_DEBUG("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, jtag_state_name(cmd->cmd.runtest->end_state) );
298 #endif
299 if (cmd->cmd.runtest->end_state != -1)
300 bitbang_end_state(cmd->cmd.runtest->end_state);
301 bitbang_runtest(cmd->cmd.runtest->num_cycles);
302 break;
303
304 case JTAG_STABLECLOCKS:
305 /* this is only allowed while in a stable state. A check for a stable
306 * state was done in jtag_add_clocks()
307 */
308 bitbang_stableclocks(cmd->cmd.stableclocks->num_cycles);
309 break;
310
311 case JTAG_STATEMOVE:
312 #ifdef _DEBUG_JTAG_IO_
313 LOG_DEBUG("statemove end in %s", jtag_state_name(cmd->cmd.statemove->end_state));
314 #endif
315 if (cmd->cmd.statemove->end_state != -1)
316 bitbang_end_state(cmd->cmd.statemove->end_state);
317 bitbang_state_move();
318 break;
319 case JTAG_PATHMOVE:
320 #ifdef _DEBUG_JTAG_IO_
321 LOG_DEBUG("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
322 jtag_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
323 #endif
324 bitbang_path_move(cmd->cmd.pathmove);
325 break;
326 case JTAG_SCAN:
327 #ifdef _DEBUG_JTAG_IO_
328 LOG_DEBUG("%s scan end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", jtag_state_name(cmd->cmd.scan->end_state) );
329 #endif
330 if (cmd->cmd.scan->end_state != -1)
331 bitbang_end_state(cmd->cmd.scan->end_state);
332 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
333 type = jtag_scan_type(cmd->cmd.scan);
334 bitbang_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
335 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
336 retval = ERROR_JTAG_QUEUE_FAILED;
337 if (buffer)
338 free(buffer);
339 break;
340 case JTAG_SLEEP:
341 #ifdef _DEBUG_JTAG_IO_
342 LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
343 #endif
344 jtag_sleep(cmd->cmd.sleep->us);
345 break;
346 default:
347 LOG_ERROR("BUG: unknown JTAG command type encountered");
348 exit(-1);
349 }
350 cmd = cmd->next;
351 }
352 if(bitbang_interface->blink)
353 bitbang_interface->blink(0);
354
355 return retval;
356 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)