ad4183b5f8182e3b999345092b830f0795f694e7
[openocd.git] / src / target / adi_v5_jtag.c
1 /***************************************************************************
2 * Copyright (C) 2006 by Magnus Lundin
3 * lundin@mlu.mine.nu
4 *
5 * Copyright (C) 2008 by Spencer Oliver
6 * spen@spen-soft.co.uk
7 *
8 * Copyright (C) 2009 by Oyvind Harboe
9 * oyvind.harboe@zylin.com
10 *
11 * Copyright (C) 2009-2010 by David Brownell
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 ***************************************************************************/
26
27 /**
28 * @file
29 * This file implements JTAG transport support for cores implementing
30 the ARM Debug Interface version 5 (ADIv5).
31 */
32
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36
37 #include "arm.h"
38 #include "arm_adi_v5.h"
39 #include <helper/time_support.h>
40 #include <helper/list.h>
41
42 /*#define DEBUG_WAIT*/
43
44 /* JTAG instructions/registers for JTAG-DP and SWJ-DP */
45 #define JTAG_DP_ABORT 0x8
46 #define JTAG_DP_DPACC 0xA
47 #define JTAG_DP_APACC 0xB
48 #define JTAG_DP_IDCODE 0xE
49
50 /* three-bit ACK values for DPACC and APACC reads */
51 #define JTAG_ACK_OK_FAULT 0x2
52 #define JTAG_ACK_WAIT 0x1
53
54 static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack);
55
56 #ifdef DEBUG_WAIT
57 static const char *dap_reg_name(int instr, int reg_addr)
58 {
59 char *reg_name = "UNK";
60
61 if (instr == JTAG_DP_DPACC) {
62 switch (reg_addr) {
63 case DP_ABORT:
64 reg_name = "ABORT";
65 break;
66 case DP_CTRL_STAT:
67 reg_name = "CTRL/STAT";
68 break;
69 case DP_SELECT:
70 reg_name = "SELECT";
71 break;
72 case DP_RDBUFF:
73 reg_name = "RDBUFF";
74 break;
75 case DP_DLCR:
76 reg_name = "DLCR";
77 break;
78 default:
79 reg_name = "UNK";
80 break;
81 }
82 }
83
84 if (instr == JTAG_DP_APACC) {
85 switch (reg_addr) {
86 case MEM_AP_REG_CSW:
87 reg_name = "CSW";
88 break;
89 case MEM_AP_REG_TAR:
90 reg_name = "TAR";
91 break;
92 case MEM_AP_REG_DRW:
93 reg_name = "DRW";
94 break;
95 case MEM_AP_REG_BD0:
96 reg_name = "BD0";
97 break;
98 case MEM_AP_REG_BD1:
99 reg_name = "BD1";
100 break;
101 case MEM_AP_REG_BD2:
102 reg_name = "BD2";
103 break;
104 case MEM_AP_REG_BD3:
105 reg_name = "BD3";
106 break;
107 case MEM_AP_REG_CFG:
108 reg_name = "CFG";
109 break;
110 case MEM_AP_REG_BASE:
111 reg_name = "BASE";
112 break;
113 case AP_REG_IDR:
114 reg_name = "IDR";
115 break;
116 default:
117 reg_name = "UNK";
118 break;
119 }
120 }
121
122 return reg_name;
123 }
124 #endif
125
126 struct dap_cmd {
127 struct list_head lh;
128 uint8_t instr;
129 uint8_t reg_addr;
130 uint8_t RnW;
131 uint8_t *invalue;
132 uint8_t ack;
133 uint32_t memaccess_tck;
134 uint32_t dp_select;
135
136 struct scan_field fields[2];
137 uint8_t out_addr_buf;
138 uint8_t invalue_buf[4];
139 uint8_t outvalue_buf[4];
140 };
141
142 static void log_dap_cmd(const char *header, struct dap_cmd *el)
143 {
144 #ifdef DEBUG_WAIT
145 LOG_DEBUG("%s: %2s %6s %5s 0x%08x 0x%08x %2s", header,
146 el->instr == JTAG_DP_APACC ? "AP" : "DP",
147 dap_reg_name(el->instr, el->reg_addr),
148 el->RnW == DPAP_READ ? "READ" : "WRITE",
149 buf_get_u32(el->outvalue_buf, 0, 32),
150 buf_get_u32(el->invalue, 0, 32),
151 el->ack == JTAG_ACK_OK_FAULT ? "OK" :
152 (el->ack == JTAG_ACK_WAIT ? "WAIT" : "INVAL"));
153 #endif
154 }
155
156 static struct dap_cmd *dap_cmd_new(uint8_t instr,
157 uint8_t reg_addr, uint8_t RnW,
158 uint8_t *outvalue, uint8_t *invalue,
159 uint32_t memaccess_tck)
160 {
161 struct dap_cmd *cmd;
162
163 cmd = (struct dap_cmd *)calloc(1, sizeof(struct dap_cmd));
164 if (cmd != NULL) {
165 INIT_LIST_HEAD(&cmd->lh);
166 cmd->instr = instr;
167 cmd->reg_addr = reg_addr;
168 cmd->RnW = RnW;
169 if (outvalue != NULL)
170 memcpy(cmd->outvalue_buf, outvalue, 4);
171 cmd->invalue = (invalue != NULL) ? invalue : cmd->invalue_buf;
172 cmd->memaccess_tck = memaccess_tck;
173 }
174
175 return cmd;
176 }
177
178 static void flush_journal(struct list_head *lh)
179 {
180 struct dap_cmd *el, *tmp;
181
182 list_for_each_entry_safe(el, tmp, lh, lh) {
183 list_del(&el->lh);
184 free(el);
185 }
186 }
187
188 /***************************************************************************
189 *
190 * DPACC and APACC scanchain access through JTAG-DP (or SWJ-DP)
191 *
192 ***************************************************************************/
193
194 static int adi_jtag_dp_scan_cmd(struct adiv5_dap *dap, struct dap_cmd *cmd, uint8_t *ack)
195 {
196 struct jtag_tap *tap = dap->tap;
197 int retval;
198
199 retval = arm_jtag_set_instr(tap, cmd->instr, NULL, TAP_IDLE);
200 if (retval != ERROR_OK)
201 return retval;
202
203 /* Scan out a read or write operation using some DP or AP register.
204 * For APACC access with any sticky error flag set, this is discarded.
205 */
206 cmd->fields[0].num_bits = 3;
207 buf_set_u32(&cmd->out_addr_buf, 0, 3, ((cmd->reg_addr >> 1) & 0x6) | (cmd->RnW & 0x1));
208 cmd->fields[0].out_value = &cmd->out_addr_buf;
209 cmd->fields[0].in_value = (ack != NULL) ? ack : &cmd->ack;
210
211 /* NOTE: if we receive JTAG_ACK_WAIT, the previous operation did not
212 * complete; data we write is discarded, data we read is unpredictable.
213 * When overrun detect is active, STICKYORUN is set.
214 */
215
216 cmd->fields[1].num_bits = 32;
217 cmd->fields[1].out_value = cmd->outvalue_buf;
218 cmd->fields[1].in_value = cmd->invalue;
219
220 jtag_add_dr_scan(tap, 2, cmd->fields, TAP_IDLE);
221
222 /* Add specified number of tck clocks after starting memory bus
223 * access, giving the hardware time to complete the access.
224 * They provide more time for the (MEM) AP to complete the read ...
225 * See "Minimum Response Time" for JTAG-DP, in the ADIv5 spec.
226 */
227 if (cmd->instr == JTAG_DP_APACC) {
228 if (((cmd->reg_addr == MEM_AP_REG_DRW)
229 || ((cmd->reg_addr & 0xF0) == MEM_AP_REG_BD0))
230 && (cmd->memaccess_tck != 0))
231 jtag_add_runtest(cmd->memaccess_tck, TAP_IDLE);
232 }
233
234 return ERROR_OK;
235 }
236
237 static int adi_jtag_dp_scan_cmd_sync(struct adiv5_dap *dap, struct dap_cmd *cmd, uint8_t *ack)
238 {
239 int retval;
240
241 retval = adi_jtag_dp_scan_cmd(dap, cmd, ack);
242 if (retval != ERROR_OK)
243 return retval;
244
245 return jtag_execute_queue();
246 }
247
248 /**
249 * Scan DPACC or APACC using target ordered uint8_t buffers. No endianness
250 * conversions are performed. See section 4.4.3 of the ADIv5 spec, which
251 * discusses operations which access these registers.
252 *
253 * Note that only one scan is performed. If RnW is set, a separate scan
254 * will be needed to collect the data which was read; the "invalue" collects
255 * the posted result of a preceding operation, not the current one.
256 *
257 * @param dap the DAP
258 * @param instr JTAG_DP_APACC (AP access) or JTAG_DP_DPACC (DP access)
259 * @param reg_addr two significant bits; A[3:2]; for APACC access, the
260 * SELECT register has more addressing bits.
261 * @param RnW false iff outvalue will be written to the DP or AP
262 * @param outvalue points to a 32-bit (little-endian) integer
263 * @param invalue NULL, or points to a 32-bit (little-endian) integer
264 * @param ack points to where the three bit JTAG_ACK_* code will be stored
265 * @param memaccess_tck number of idle cycles to add after AP access
266 */
267
268 static int adi_jtag_dp_scan(struct adiv5_dap *dap,
269 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
270 uint8_t *outvalue, uint8_t *invalue,
271 uint32_t memaccess_tck, uint8_t *ack)
272 {
273 struct dap_cmd *cmd;
274 int retval;
275
276 cmd = dap_cmd_new(instr, reg_addr, RnW, outvalue, invalue, memaccess_tck);
277 if (cmd != NULL)
278 cmd->dp_select = dap->select;
279 else
280 return ERROR_JTAG_DEVICE_ERROR;
281
282 retval = adi_jtag_dp_scan_cmd(dap, cmd, ack);
283 if (retval == ERROR_OK)
284 list_add_tail(&cmd->lh, &dap->cmd_journal);
285
286 return retval;
287 }
288
289 /**
290 * Scan DPACC or APACC out and in from host ordered uint32_t buffers.
291 * This is exactly like adi_jtag_dp_scan(), except that endianness
292 * conversions are performed (so the types of invalue and outvalue
293 * must be different).
294 */
295 static int adi_jtag_dp_scan_u32(struct adiv5_dap *dap,
296 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
297 uint32_t outvalue, uint32_t *invalue,
298 uint32_t memaccess_tck, uint8_t *ack)
299 {
300 uint8_t out_value_buf[4];
301 int retval;
302
303 buf_set_u32(out_value_buf, 0, 32, outvalue);
304
305 retval = adi_jtag_dp_scan(dap, instr, reg_addr, RnW,
306 out_value_buf, (uint8_t *)invalue, memaccess_tck, ack);
307 if (retval != ERROR_OK)
308 return retval;
309
310 if (invalue)
311 jtag_add_callback(arm_le_to_h_u32,
312 (jtag_callback_data_t) invalue);
313
314 return retval;
315 }
316
317 static int adi_jtag_finish_read(struct adiv5_dap *dap)
318 {
319 int retval = ERROR_OK;
320
321 if (dap->last_read != NULL) {
322 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
323 DP_RDBUFF, DPAP_READ, 0, dap->last_read, 0, NULL);
324 dap->last_read = NULL;
325 }
326
327 return retval;
328 }
329
330 static int adi_jtag_scan_inout_check_u32(struct adiv5_dap *dap,
331 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
332 uint32_t outvalue, uint32_t *invalue, uint32_t memaccess_tck)
333 {
334 int retval;
335
336 /* Issue the read or write */
337 retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
338 RnW, outvalue, NULL, memaccess_tck, NULL);
339 if (retval != ERROR_OK)
340 return retval;
341
342 /* For reads, collect posted value; RDBUFF has no other effect.
343 * Assumes read gets acked with OK/FAULT, and CTRL_STAT says "OK".
344 */
345 if ((RnW == DPAP_READ) && (invalue != NULL)) {
346 retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
347 DP_RDBUFF, DPAP_READ, 0, invalue, 0, NULL);
348 if (retval != ERROR_OK)
349 return retval;
350 }
351
352 return jtag_execute_queue();
353 }
354
355 static int jtagdp_overrun_check(struct adiv5_dap *dap)
356 {
357 int retval;
358 struct dap_cmd *el, *tmp, *prev = NULL;
359 int found_wait = 0;
360 int64_t time_now;
361 LIST_HEAD(replay_list);
362
363 /* make sure all queued transactions are complete */
364 retval = jtag_execute_queue();
365 if (retval != ERROR_OK)
366 goto done;
367
368 /* skip all completed transactions up to the first WAIT */
369 list_for_each_entry(el, &dap->cmd_journal, lh) {
370 if (el->ack == JTAG_ACK_OK_FAULT) {
371 log_dap_cmd("LOG", el);
372 } else if (el->ack == JTAG_ACK_WAIT) {
373 found_wait = 1;
374 break;
375 } else {
376 LOG_ERROR("Invalid ACK (%1x) in DAP response", el->ack);
377 log_dap_cmd("ERR", el);
378 retval = ERROR_JTAG_DEVICE_ERROR;
379 goto done;
380 }
381 }
382
383 /*
384 * If we found a stalled transaction and a previous transaction
385 * exists, check if it's a READ access.
386 */
387 if (found_wait && el != list_first_entry(&dap->cmd_journal, struct dap_cmd, lh)) {
388 prev = list_entry(el->lh.prev, struct dap_cmd, lh);
389 if (prev->RnW == DPAP_READ) {
390 log_dap_cmd("PND", prev);
391 /* search for the next OK transaction, it contains
392 * the result of the previous READ */
393 tmp = el;
394 list_for_each_entry_from(tmp, &dap->cmd_journal, lh) {
395 if (tmp->ack == JTAG_ACK_OK_FAULT) {
396 /* recover the read value */
397 log_dap_cmd("FND", tmp);
398 if (el->invalue != el->invalue_buf) {
399 uint32_t invalue = le_to_h_u32(tmp->invalue);
400 memcpy(el->invalue, &invalue, sizeof(uint32_t));
401 }
402 prev = NULL;
403 break;
404 }
405 }
406
407 if (prev != NULL) {
408 log_dap_cmd("LST", el);
409
410 /*
411 * At this point we're sure that no previous
412 * transaction completed and the DAP/AP is still
413 * in busy state. We know that the next "OK" scan
414 * will return the READ result we need to recover.
415 * To complete the READ, we just keep polling RDBUFF
416 * until the WAIT condition clears
417 */
418 tmp = dap_cmd_new(JTAG_DP_DPACC,
419 DP_RDBUFF, DPAP_READ, NULL, NULL, 0);
420 if (tmp == NULL) {
421 retval = ERROR_JTAG_DEVICE_ERROR;
422 goto done;
423 }
424 /* synchronously retry the command until it succeeds */
425 time_now = timeval_ms();
426 do {
427 retval = adi_jtag_dp_scan_cmd_sync(dap, tmp, NULL);
428 if (retval != ERROR_OK)
429 break;
430 if (tmp->ack == JTAG_ACK_OK_FAULT) {
431 log_dap_cmd("FND", tmp);
432 if (el->invalue != el->invalue_buf) {
433 uint32_t invalue = le_to_h_u32(tmp->invalue);
434 memcpy(el->invalue, &invalue, sizeof(uint32_t));
435 }
436 break;
437 }
438 if (tmp->ack != JTAG_ACK_WAIT) {
439 LOG_ERROR("Invalid ACK (%1x) in DAP response", tmp->ack);
440 log_dap_cmd("ERR", tmp);
441 retval = ERROR_JTAG_DEVICE_ERROR;
442 break;
443 }
444
445 } while (timeval_ms() - time_now < 1000);
446
447 if (retval == ERROR_OK) {
448 /* timeout happened */
449 if (tmp->ack != JTAG_ACK_OK_FAULT) {
450 LOG_ERROR("Timeout during WAIT recovery");
451 dap->select = DP_SELECT_INVALID;
452 jtag_ap_q_abort(dap, NULL);
453 /* clear the sticky overrun condition */
454 adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
455 DP_CTRL_STAT, DPAP_WRITE,
456 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
457 retval = ERROR_JTAG_DEVICE_ERROR;
458 }
459 }
460
461 /* we're done with this command, release it */
462 free(tmp);
463
464 if (retval != ERROR_OK)
465 goto done;
466
467 }
468 /* make el->invalue point to the default invalue
469 * so that we can safely retry it without clobbering
470 * the result we just recovered */
471 el->invalue = el->invalue_buf;
472 }
473 }
474
475 /* move all remaining transactions over to the replay list */
476 list_for_each_entry_safe_from(el, tmp, &dap->cmd_journal, lh) {
477 log_dap_cmd("REP", el);
478 list_move_tail(&el->lh, &replay_list);
479 }
480
481 /* we're done with the journal, flush it */
482 flush_journal(&dap->cmd_journal);
483
484 /* check for overrun condition in the last batch of transactions */
485 if (found_wait) {
486 LOG_INFO("DAP transaction stalled (WAIT) - slowing down");
487 /* clear the sticky overrun condition */
488 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
489 DP_CTRL_STAT, DPAP_WRITE,
490 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
491 if (retval != ERROR_OK)
492 goto done;
493
494 /* restore SELECT register first */
495 if (!list_empty(&replay_list)) {
496 el = list_first_entry(&replay_list, struct dap_cmd, lh);
497 tmp = dap_cmd_new(JTAG_DP_DPACC,
498 DP_SELECT, DPAP_WRITE, (uint8_t *)&el->dp_select, NULL, 0);
499 if (tmp == NULL) {
500 retval = ERROR_JTAG_DEVICE_ERROR;
501 goto done;
502 }
503 list_add(&tmp->lh, &replay_list);
504
505 dap->select = DP_SELECT_INVALID;
506 }
507
508 list_for_each_entry_safe(el, tmp, &replay_list, lh) {
509 time_now = timeval_ms();
510 do {
511 retval = adi_jtag_dp_scan_cmd_sync(dap, el, NULL);
512 if (retval != ERROR_OK)
513 break;
514 log_dap_cmd("REC", el);
515 if (el->ack == JTAG_ACK_OK_FAULT) {
516 if (el->invalue != el->invalue_buf) {
517 uint32_t invalue = le_to_h_u32(el->invalue);
518 memcpy(el->invalue, &invalue, sizeof(uint32_t));
519 }
520 break;
521 }
522 if (el->ack != JTAG_ACK_WAIT) {
523 LOG_ERROR("Invalid ACK (%1x) in DAP response", el->ack);
524 log_dap_cmd("ERR", el);
525 retval = ERROR_JTAG_DEVICE_ERROR;
526 break;
527 }
528 } while (timeval_ms() - time_now < 1000);
529
530 if (retval == ERROR_OK) {
531 if (el->ack != JTAG_ACK_OK_FAULT) {
532 LOG_ERROR("Timeout during WAIT recovery");
533 dap->select = DP_SELECT_INVALID;
534 jtag_ap_q_abort(dap, NULL);
535 /* clear the sticky overrun condition */
536 adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
537 DP_CTRL_STAT, DPAP_WRITE,
538 dap->dp_ctrl_stat | SSTICKYORUN, NULL, 0);
539 retval = ERROR_JTAG_DEVICE_ERROR;
540 break;
541 }
542 } else
543 break;
544 }
545 }
546
547 done:
548 flush_journal(&replay_list);
549 flush_journal(&dap->cmd_journal);
550 return retval;
551 }
552
553 static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
554 {
555 int retval;
556 uint32_t ctrlstat, pwrmask;
557
558 /* too expensive to call keep_alive() here */
559
560 /* Post CTRL/STAT read; discard any previous posted read value
561 * but collect its ACK status.
562 */
563 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
564 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat, 0);
565 if (retval != ERROR_OK)
566 goto done;
567
568 /* REVISIT also STICKYCMP, for pushed comparisons (nyet used) */
569
570 /* Check for STICKYERR */
571 if (ctrlstat & SSTICKYERR) {
572 LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
573 /* Check power to debug regions */
574 pwrmask = CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ;
575 if (!dap->ignore_syspwrupack)
576 pwrmask |= CSYSPWRUPACK;
577 if ((ctrlstat & pwrmask) != pwrmask) {
578 LOG_ERROR("Debug regions are unpowered, an unexpected reset might have happened");
579 dap->do_reconnect = true;
580 }
581
582 if (ctrlstat & SSTICKYERR)
583 LOG_ERROR("JTAG-DP STICKY ERROR");
584 if (ctrlstat & SSTICKYORUN)
585 LOG_DEBUG("JTAG-DP STICKY OVERRUN");
586
587 /* Clear Sticky Error Bits */
588 retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
589 DP_CTRL_STAT, DPAP_WRITE,
590 dap->dp_ctrl_stat | SSTICKYERR, NULL, 0);
591 if (retval != ERROR_OK)
592 goto done;
593
594 retval = ERROR_JTAG_DEVICE_ERROR;
595 }
596
597 done:
598 flush_journal(&dap->cmd_journal);
599 return retval;
600 }
601
602 /*--------------------------------------------------------------------------*/
603
604 static int jtag_connect(struct adiv5_dap *dap)
605 {
606 dap->do_reconnect = false;
607 return dap_dp_init(dap);
608 }
609
610 static int jtag_check_reconnect(struct adiv5_dap *dap)
611 {
612 if (dap->do_reconnect)
613 return jtag_connect(dap);
614
615 return ERROR_OK;
616 }
617
618 static int jtag_dp_q_read(struct adiv5_dap *dap, unsigned reg,
619 uint32_t *data)
620 {
621 int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC, reg,
622 DPAP_READ, 0, dap->last_read, 0, NULL);
623 dap->last_read = data;
624 return retval;
625 }
626
627 static int jtag_dp_q_write(struct adiv5_dap *dap, unsigned reg,
628 uint32_t data)
629 {
630 int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
631 reg, DPAP_WRITE, data, dap->last_read, 0, NULL);
632 dap->last_read = NULL;
633 return retval;
634 }
635
636 /** Select the AP register bank matching bits 7:4 of reg. */
637 static int jtag_ap_q_bankselect(struct adiv5_ap *ap, unsigned reg)
638 {
639 struct adiv5_dap *dap = ap->dap;
640 uint32_t sel = ((uint32_t)ap->ap_num << 24) | (reg & 0x000000F0);
641
642 if (sel == dap->select)
643 return ERROR_OK;
644
645 dap->select = sel;
646
647 return jtag_dp_q_write(dap, DP_SELECT, sel);
648 }
649
650 static int jtag_ap_q_read(struct adiv5_ap *ap, unsigned reg,
651 uint32_t *data)
652 {
653 int retval = jtag_check_reconnect(ap->dap);
654 if (retval != ERROR_OK)
655 return retval;
656
657 retval = jtag_ap_q_bankselect(ap, reg);
658 if (retval != ERROR_OK)
659 return retval;
660
661 retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
662 DPAP_READ, 0, ap->dap->last_read, ap->memaccess_tck, NULL);
663 ap->dap->last_read = data;
664
665 return retval;
666 }
667
668 static int jtag_ap_q_write(struct adiv5_ap *ap, unsigned reg,
669 uint32_t data)
670 {
671 int retval = jtag_check_reconnect(ap->dap);
672 if (retval != ERROR_OK)
673 return retval;
674
675 retval = jtag_ap_q_bankselect(ap, reg);
676 if (retval != ERROR_OK)
677 return retval;
678
679 retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
680 DPAP_WRITE, data, ap->dap->last_read, ap->memaccess_tck, NULL);
681 ap->dap->last_read = NULL;
682 return retval;
683 }
684
685 static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack)
686 {
687 /* for JTAG, this is the only valid ABORT register operation */
688 int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_ABORT,
689 0, DPAP_WRITE, 1, NULL, 0, NULL);
690 if (retval != ERROR_OK)
691 return retval;
692
693 return jtag_execute_queue();
694 }
695
696 static int jtag_dp_run(struct adiv5_dap *dap)
697 {
698 int retval;
699 int retval2 = ERROR_OK;
700
701 retval = adi_jtag_finish_read(dap);
702 if (retval != ERROR_OK)
703 goto done;
704 retval2 = jtagdp_overrun_check(dap);
705 retval = jtagdp_transaction_endcheck(dap);
706
707 done:
708 return (retval2 != ERROR_OK) ? retval2 : retval;
709 }
710
711 static int jtag_dp_sync(struct adiv5_dap *dap)
712 {
713 return jtagdp_overrun_check(dap);
714 }
715
716 /* FIXME don't export ... just initialize as
717 * part of DAP setup
718 */
719 const struct dap_ops jtag_dp_ops = {
720 .connect = jtag_connect,
721 .queue_dp_read = jtag_dp_q_read,
722 .queue_dp_write = jtag_dp_q_write,
723 .queue_ap_read = jtag_ap_q_read,
724 .queue_ap_write = jtag_ap_q_write,
725 .queue_ap_abort = jtag_ap_q_abort,
726 .run = jtag_dp_run,
727 .sync = jtag_dp_sync,
728 };
729
730
731 static const uint8_t swd2jtag_bitseq[] = {
732 /* More than 50 TCK/SWCLK cycles with TMS/SWDIO high,
733 * putting both JTAG and SWD logic into reset state.
734 */
735 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
736 /* Switching equence disables SWD and enables JTAG
737 * NOTE: bits in the DP's IDCODE can expose the need for
738 * the old/deprecated sequence (0xae 0xde).
739 */
740 0x3c, 0xe7,
741 /* At least 50 TCK/SWCLK cycles with TMS/SWDIO high,
742 * putting both JTAG and SWD logic into reset state.
743 * NOTE: some docs say "at least 5".
744 */
745 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
746 };
747
748 /** Put the debug link into JTAG mode, if the target supports it.
749 * The link's initial mode may be either SWD or JTAG.
750 *
751 * @param target Enters JTAG mode (if possible).
752 *
753 * Note that targets implemented with SW-DP do not support JTAG, and
754 * that some targets which could otherwise support it may have been
755 * configured to disable JTAG signaling
756 *
757 * @return ERROR_OK or else a fault code.
758 */
759 int dap_to_jtag(struct target *target)
760 {
761 int retval;
762
763 LOG_DEBUG("Enter JTAG mode");
764
765 /* REVISIT it's nasty to need to make calls to a "jtag"
766 * subsystem if the link isn't in JTAG mode...
767 */
768
769 retval = jtag_add_tms_seq(8 * sizeof(swd2jtag_bitseq),
770 swd2jtag_bitseq, TAP_RESET);
771 if (retval == ERROR_OK)
772 retval = jtag_execute_queue();
773
774 /* REVISIT set up the DAP's ops vector for JTAG mode. */
775
776 return retval;
777 }

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)