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

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)