92ba6cc0aa755f5f1b87971e5403dbaf371de2fe
[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 /* The bitbang driver leaves the TCK 0 when in idle */
78
79 void bitbang_end_state(tap_state_t state)
80 {
81 if (tap_is_state_stable(state))
82 tap_set_end_state(state);
83 else
84 {
85 LOG_ERROR("BUG: %i is not a valid end state", state);
86 exit(-1);
87 }
88 }
89
90 void bitbang_state_move(void)
91 {
92 int i=0, tms=0;
93 u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
94
95 for (i = 0; i < 7; i++)
96 {
97 tms = (tms_scan >> i) & 1;
98 bitbang_interface->write(0, tms, 0);
99 bitbang_interface->write(1, tms, 0);
100 }
101 bitbang_interface->write(CLOCK_IDLE(), tms, 0);
102
103 tap_set_state(tap_get_end_state());
104 }
105
106 void bitbang_path_move(pathmove_command_t *cmd)
107 {
108 int num_states = cmd->num_states;
109 int state_count;
110 int tms = 0;
111
112 state_count = 0;
113 while (num_states)
114 {
115 if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count])
116 {
117 tms = 0;
118 }
119 else if (tap_state_transition(tap_get_state(), true) == cmd->path[state_count])
120 {
121 tms = 1;
122 }
123 else
124 {
125 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
126 exit(-1);
127 }
128
129 bitbang_interface->write(0, tms, 0);
130 bitbang_interface->write(1, tms, 0);
131
132 tap_set_state(cmd->path[state_count]);
133 state_count++;
134 num_states--;
135 }
136
137 bitbang_interface->write(CLOCK_IDLE(), tms, 0);
138
139 tap_set_end_state(tap_get_state());
140 }
141
142 void bitbang_runtest(int num_cycles)
143 {
144 int i;
145
146 tap_state_t saved_end_state = tap_get_end_state();
147
148 /* only do a state_move when we're not already in IDLE */
149 if (tap_get_state() != TAP_IDLE)
150 {
151 bitbang_end_state(TAP_IDLE);
152 bitbang_state_move();
153 }
154
155 /* execute num_cycles */
156 for (i = 0; i < num_cycles; i++)
157 {
158 bitbang_interface->write(0, 0, 0);
159 bitbang_interface->write(1, 0, 0);
160 }
161 bitbang_interface->write(CLOCK_IDLE(), 0, 0);
162
163 /* finish in end_state */
164 bitbang_end_state(saved_end_state);
165 if (tap_get_state() != tap_get_end_state())
166 bitbang_state_move();
167 }
168
169
170 static void bitbang_stableclocks(int num_cycles)
171 {
172 int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
173 int i;
174
175 /* send num_cycles clocks onto the cable */
176 for (i = 0; i < num_cycles; i++)
177 {
178 bitbang_interface->write(1, tms, 0);
179 bitbang_interface->write(0, tms, 0);
180 }
181 }
182
183
184
185 void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
186 {
187 tap_state_t saved_end_state = tap_get_end_state();
188 int bit_cnt;
189
190 if (!((!ir_scan && (tap_get_state() == TAP_DRSHIFT)) || (ir_scan && (tap_get_state() == TAP_IRSHIFT))))
191 {
192 if (ir_scan)
193 bitbang_end_state(TAP_IRSHIFT);
194 else
195 bitbang_end_state(TAP_DRSHIFT);
196
197 bitbang_state_move();
198 bitbang_end_state(saved_end_state);
199 }
200
201 for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)
202 {
203 int val=0;
204 int tms=(bit_cnt==scan_size-1) ? 1 : 0;
205 int tdi;
206 int bytec=bit_cnt/8;
207 int bcval=1<<(bit_cnt % 8);
208
209 /* if we're just reading the scan, but don't care about the output
210 * default to outputting 'low', this also makes valgrind traces more readable,
211 * as it removes the dependency on an uninitialised value
212 */
213 tdi=0;
214 if ((type != SCAN_IN) && (buffer[bytec] & bcval))
215 tdi=1;
216
217 bitbang_interface->write(0, tms, tdi);
218
219 if (type!=SCAN_OUT)
220 val=bitbang_interface->read();
221
222 bitbang_interface->write(1, tms, tdi);
223
224 if (type != SCAN_OUT)
225 {
226 if (val)
227 buffer[bytec] |= bcval;
228 else
229 buffer[bytec] &= ~bcval;
230 }
231 }
232
233 /* TAP_DRSHIFT & TAP_IRSHIFT are illegal end states, so we always transition to the pause
234 * state which is a legal stable state from which statemove will work.
235 *
236 * Exit1 -> Pause
237 */
238 bitbang_interface->write(0, 0, 0);
239 bitbang_interface->write(1, 0, 0);
240 bitbang_interface->write(CLOCK_IDLE(), 0, 0);
241
242 if (ir_scan)
243 tap_set_state(TAP_IRPAUSE);
244 else
245 tap_set_state(TAP_DRPAUSE);
246
247 if (tap_get_state() != tap_get_end_state())
248 bitbang_state_move();
249 }
250
251 int bitbang_execute_queue(void)
252 {
253 jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
254 int scan_size;
255 enum scan_type type;
256 u8 *buffer;
257 int retval;
258
259 if (!bitbang_interface)
260 {
261 LOG_ERROR("BUG: Bitbang interface called, but not yet initialized");
262 exit(-1);
263 }
264
265 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
266 * that wasn't handled by a caller-provided error handler
267 */
268 retval = ERROR_OK;
269
270 if(bitbang_interface->blink)
271 bitbang_interface->blink(1);
272
273 while (cmd)
274 {
275 switch (cmd->type)
276 {
277 case JTAG_END_STATE:
278 #ifdef _DEBUG_JTAG_IO_
279 LOG_DEBUG("end_state: %s", tap_state_name(cmd->cmd.end_state->end_state) );
280 #endif
281 if (cmd->cmd.end_state->end_state != -1)
282 bitbang_end_state(cmd->cmd.end_state->end_state);
283 break;
284 case JTAG_RESET:
285 #ifdef _DEBUG_JTAG_IO_
286 LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
287 #endif
288 if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
289 {
290 tap_set_state(TAP_RESET);
291 }
292 bitbang_interface->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
293 break;
294 case JTAG_RUNTEST:
295 #ifdef _DEBUG_JTAG_IO_
296 LOG_DEBUG("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(cmd->cmd.runtest->end_state) );
297 #endif
298 if (cmd->cmd.runtest->end_state != -1)
299 bitbang_end_state(cmd->cmd.runtest->end_state);
300 bitbang_runtest(cmd->cmd.runtest->num_cycles);
301 break;
302
303 case JTAG_STABLECLOCKS:
304 /* this is only allowed while in a stable state. A check for a stable
305 * state was done in jtag_add_clocks()
306 */
307 bitbang_stableclocks(cmd->cmd.stableclocks->num_cycles);
308 break;
309
310 case JTAG_STATEMOVE:
311 #ifdef _DEBUG_JTAG_IO_
312 LOG_DEBUG("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
313 #endif
314 if (cmd->cmd.statemove->end_state != -1)
315 bitbang_end_state(cmd->cmd.statemove->end_state);
316 bitbang_state_move();
317 break;
318 case JTAG_PATHMOVE:
319 #ifdef _DEBUG_JTAG_IO_
320 LOG_DEBUG("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
321 tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
322 #endif
323 bitbang_path_move(cmd->cmd.pathmove);
324 break;
325 case JTAG_SCAN:
326 #ifdef _DEBUG_JTAG_IO_
327 LOG_DEBUG("%s scan end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", tap_state_name(cmd->cmd.scan->end_state) );
328 #endif
329 if (cmd->cmd.scan->end_state != -1)
330 bitbang_end_state(cmd->cmd.scan->end_state);
331 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
332 type = jtag_scan_type(cmd->cmd.scan);
333 bitbang_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
334 if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
335 retval = ERROR_JTAG_QUEUE_FAILED;
336 if (buffer)
337 free(buffer);
338 break;
339 case JTAG_SLEEP:
340 #ifdef _DEBUG_JTAG_IO_
341 LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
342 #endif
343 jtag_sleep(cmd->cmd.sleep->us);
344 break;
345 default:
346 LOG_ERROR("BUG: unknown JTAG command type encountered");
347 exit(-1);
348 }
349 cmd = cmd->next;
350 }
351 if(bitbang_interface->blink)
352 bitbang_interface->blink(0);
353
354 return retval;
355 }

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)