1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
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. *
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. *
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 ***************************************************************************/
29 /* project specific includes */
33 #include "configuration.h"
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
49 static void bitbang_stableclocks(int num_cycles
);
52 bitbang_interface_t
*bitbang_interface
;
54 /* DANGER!!!! clock absolutely *MUST* be 0 in idle or reset won't work!
56 * Set this to 1 and str912 reset halt will fail.
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. "#&¤"#¤&"#&"#&
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.
72 #define CLOCK_IDLE() 0
75 /* The bitbang driver leaves the TCK 0 when in idle */
76 static void bitbang_end_state(tap_state_t state
)
78 if (tap_is_state_stable(state
))
79 tap_set_end_state(state
);
82 LOG_ERROR("BUG: %i is not a valid end state", state
);
87 static void bitbang_state_move(void)
90 u8 tms_scan
= tap_get_tms_path(tap_get_state(), tap_get_end_state());
92 for (i
= 0; i
< 7; i
++)
94 tms
= (tms_scan
>> i
) & 1;
95 bitbang_interface
->write(0, tms
, 0);
96 bitbang_interface
->write(1, tms
, 0);
98 bitbang_interface
->write(CLOCK_IDLE(), tms
, 0);
100 tap_set_state(tap_get_end_state());
103 static void bitbang_path_move(pathmove_command_t
*cmd
)
105 int num_states
= cmd
->num_states
;
112 if (tap_state_transition(tap_get_state(), false) == cmd
->path
[state_count
])
116 else if (tap_state_transition(tap_get_state(), true) == cmd
->path
[state_count
])
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
]));
126 bitbang_interface
->write(0, tms
, 0);
127 bitbang_interface
->write(1, tms
, 0);
129 tap_set_state(cmd
->path
[state_count
]);
134 bitbang_interface
->write(CLOCK_IDLE(), tms
, 0);
136 tap_set_end_state(tap_get_state());
139 static void bitbang_runtest(int num_cycles
)
143 tap_state_t saved_end_state
= tap_get_end_state();
145 /* only do a state_move when we're not already in IDLE */
146 if (tap_get_state() != TAP_IDLE
)
148 bitbang_end_state(TAP_IDLE
);
149 bitbang_state_move();
152 /* execute num_cycles */
153 for (i
= 0; i
< num_cycles
; i
++)
155 bitbang_interface
->write(0, 0, 0);
156 bitbang_interface
->write(1, 0, 0);
158 bitbang_interface
->write(CLOCK_IDLE(), 0, 0);
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();
167 static void bitbang_stableclocks(int num_cycles
)
169 int tms
= (tap_get_state() == TAP_RESET
? 1 : 0);
172 /* send num_cycles clocks onto the cable */
173 for (i
= 0; i
< num_cycles
; i
++)
175 bitbang_interface
->write(1, tms
, 0);
176 bitbang_interface
->write(0, tms
, 0);
182 static void bitbang_scan(int ir_scan
, enum scan_type type
, u8
*buffer
, int scan_size
)
184 tap_state_t saved_end_state
= tap_get_end_state();
187 if (!((!ir_scan
&& (tap_get_state() == TAP_DRSHIFT
)) || (ir_scan
&& (tap_get_state() == TAP_IRSHIFT
))))
190 bitbang_end_state(TAP_IRSHIFT
);
192 bitbang_end_state(TAP_DRSHIFT
);
194 bitbang_state_move();
195 bitbang_end_state(saved_end_state
);
198 for (bit_cnt
= 0; bit_cnt
< scan_size
; bit_cnt
++)
201 int tms
=(bit_cnt
==scan_size
-1) ? 1 : 0;
204 int bcval
=1<<(bit_cnt
% 8);
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
211 if ((type
!= SCAN_IN
) && (buffer
[bytec
] & bcval
))
214 bitbang_interface
->write(0, tms
, tdi
);
217 val
=bitbang_interface
->read();
219 bitbang_interface
->write(1, tms
, tdi
);
221 if (type
!= SCAN_OUT
)
224 buffer
[bytec
] |= bcval
;
226 buffer
[bytec
] &= ~bcval
;
230 /* TAP_DRSHIFT & TAP_IRSHIFT are illegal end states, so we always transition to the pause
231 * state which is a legal stable state from which statemove will work.
235 bitbang_interface
->write(0, 0, 0);
236 bitbang_interface
->write(1, 0, 0);
237 bitbang_interface
->write(CLOCK_IDLE(), 0, 0);
240 tap_set_state(TAP_IRPAUSE
);
242 tap_set_state(TAP_DRPAUSE
);
244 if (tap_get_state() != tap_get_end_state())
245 bitbang_state_move();
248 int bitbang_execute_queue(void)
250 jtag_command_t
*cmd
= jtag_command_queue
; /* currently processed command */
256 if (!bitbang_interface
)
258 LOG_ERROR("BUG: Bitbang interface called, but not yet initialized");
262 /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
263 * that wasn't handled by a caller-provided error handler
267 if(bitbang_interface
->blink
)
268 bitbang_interface
->blink(1);
275 #ifdef _DEBUG_JTAG_IO_
276 LOG_DEBUG("end_state: %s", tap_state_name(cmd
->cmd
.end_state
->end_state
) );
278 if (cmd
->cmd
.end_state
->end_state
!= TAP_INVALID
)
279 bitbang_end_state(cmd
->cmd
.end_state
->end_state
);
282 #ifdef _DEBUG_JTAG_IO_
283 LOG_DEBUG("reset trst: %i srst %i", cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
285 if ((cmd
->cmd
.reset
->trst
== 1) || (cmd
->cmd
.reset
->srst
&& (jtag_reset_config
& RESET_SRST_PULLS_TRST
)))
287 tap_set_state(TAP_RESET
);
289 bitbang_interface
->reset(cmd
->cmd
.reset
->trst
, cmd
->cmd
.reset
->srst
);
292 #ifdef _DEBUG_JTAG_IO_
293 LOG_DEBUG("runtest %i cycles, end in %s", cmd
->cmd
.runtest
->num_cycles
, tap_state_name(cmd
->cmd
.runtest
->end_state
) );
295 if (cmd
->cmd
.runtest
->end_state
!= TAP_INVALID
)
296 bitbang_end_state(cmd
->cmd
.runtest
->end_state
);
297 bitbang_runtest(cmd
->cmd
.runtest
->num_cycles
);
300 case JTAG_STABLECLOCKS
:
301 /* this is only allowed while in a stable state. A check for a stable
302 * state was done in jtag_add_clocks()
304 bitbang_stableclocks(cmd
->cmd
.stableclocks
->num_cycles
);
308 #ifdef _DEBUG_JTAG_IO_
309 LOG_DEBUG("statemove end in %s", tap_state_name(cmd
->cmd
.statemove
->end_state
));
311 if (cmd
->cmd
.statemove
->end_state
!= TAP_INVALID
)
312 bitbang_end_state(cmd
->cmd
.statemove
->end_state
);
313 bitbang_state_move();
316 #ifdef _DEBUG_JTAG_IO_
317 LOG_DEBUG("pathmove: %i states, end in %s", cmd
->cmd
.pathmove
->num_states
,
318 tap_state_name(cmd
->cmd
.pathmove
->path
[cmd
->cmd
.pathmove
->num_states
- 1]));
320 bitbang_path_move(cmd
->cmd
.pathmove
);
323 #ifdef _DEBUG_JTAG_IO_
324 LOG_DEBUG("%s scan end in %s", (cmd
->cmd
.scan
->ir_scan
) ? "IR" : "DR", tap_state_name(cmd
->cmd
.scan
->end_state
) );
326 if (cmd
->cmd
.scan
->end_state
!= TAP_INVALID
)
327 bitbang_end_state(cmd
->cmd
.scan
->end_state
);
328 scan_size
= jtag_build_buffer(cmd
->cmd
.scan
, &buffer
);
329 type
= jtag_scan_type(cmd
->cmd
.scan
);
330 bitbang_scan(cmd
->cmd
.scan
->ir_scan
, type
, buffer
, scan_size
);
331 if (jtag_read_buffer(buffer
, cmd
->cmd
.scan
) != ERROR_OK
)
332 retval
= ERROR_JTAG_QUEUE_FAILED
;
337 #ifdef _DEBUG_JTAG_IO_
338 LOG_DEBUG("sleep %i", cmd
->cmd
.sleep
->us
);
340 jtag_sleep(cmd
->cmd
.sleep
->us
);
343 LOG_ERROR("BUG: unknown JTAG command type encountered");
348 if(bitbang_interface
->blink
)
349 bitbang_interface
->blink(0);
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)