ARM: ADIv5 code shrinkage, cleanup
[openocd.git] / src / target / arm_adi_v5.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, write to the *
25 * Free Software Foundation, Inc., *
26 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
27 ***************************************************************************/
28
29 /**
30 * @file
31 * This file implements support for the ARM Debug Interface version 5 (ADIv5)
32 * debugging architecture. Compared with previous versions, this includes
33 * a low pin-count Serial Wire Debug (SWD) alternative to JTAG for message
34 * transport, and focusses on memory mapped resources as defined by the
35 * CoreSight architecture.
36 *
37 * A key concept in ADIv5 is the Debug Access Port, or DAP. A DAP has two
38 * basic components: a Debug Port (DP) transporting messages to and from a
39 * debugger, and an Access Port (AP) accessing resources. Three types of DP
40 * are defined. One uses only JTAG for communication, and is called JTAG-DP.
41 * One uses only SWD for communication, and is called SW-DP. The third can
42 * use either SWD or JTAG, and is called SWJ-DP. The most common type of AP
43 * is used to access memory mapped resources and is called a MEM-AP. Also a
44 * JTAG-AP is also defined, bridging to JTAG resources; those are uncommon.
45 *
46 * @todo Remove modality (queued/nonqueued, via DAP trans_mode) from all
47 * procedure interfaces. Modal programming interfaces are very error prone.
48 * Procedures should be either queued, or synchronous. Otherwise input
49 * and output constraints are context-sensitive, and it's hard to know
50 * what a block of code will do just by reading it.
51 */
52
53 /*
54 * Relevant specifications from ARM include:
55 *
56 * ARM(tm) Debug Interface v5 Architecture Specification ARM IHI 0031A
57 * CoreSight(tm) v1.0 Architecture Specification ARM IHI 0029B
58 *
59 * CoreSight(tm) DAP-Lite TRM, ARM DDI 0316D
60 * Cortex-M3(tm) TRM, ARM DDI 0337G
61 */
62
63 #ifdef HAVE_CONFIG_H
64 #include "config.h"
65 #endif
66
67 #include "arm_adi_v5.h"
68 #include <helper/time_support.h>
69
70 /*
71 * Transaction Mode:
72 * swjdp->trans_mode = TRANS_MODE_COMPOSITE;
73 * Uses Overrun checking mode and does not do actual JTAG send/receive or transaction
74 * result checking until swjdp_end_transaction()
75 * This must be done before using or deallocating any return variables.
76 * swjdp->trans_mode == TRANS_MODE_ATOMIC
77 * All reads and writes to the AHB bus are checked for valid completion, and return values
78 * are immediatley available.
79 */
80
81
82 /* ARM ADI Specification requires at least 10 bits used for TAR autoincrement */
83
84 /*
85 uint32_t tar_block_size(uint32_t address)
86 Return the largest block starting at address that does not cross a tar block size alignment boundary
87 */
88 static uint32_t max_tar_block_size(uint32_t tar_autoincr_block, uint32_t address)
89 {
90 return (tar_autoincr_block - ((tar_autoincr_block - 1) & address)) >> 2;
91 }
92
93 /***************************************************************************
94 * *
95 * DPACC and APACC scanchain access through JTAG-DP *
96 * *
97 ***************************************************************************/
98
99 /**
100 * Scan DPACC or APACC using target ordered uint8_t buffers. No endianness
101 * conversions are performed. See section 4.4.3 of the ADIv5 spec, which
102 * discusses operations which access these registers.
103 *
104 * Note that only one scan is performed. If RnW is set, a separate scan
105 * will be needed to collect the data which was read; the "invalue" collects
106 * the posted result of a preceding operation, not the current one.
107 *
108 * @param swjdp the DAP
109 * @param instr JTAG_DP_APACC (AP access) or JTAG_DP_DPACC (DP access)
110 * @param reg_addr two significant bits; A[3:2]; for APACC access, the
111 * SELECT register has more addressing bits.
112 * @param RnW false iff outvalue will be written to the DP or AP
113 * @param outvalue points to a 32-bit (little-endian) integer
114 * @param invalue NULL, or points to a 32-bit (little-endian) integer
115 * @param ack points to where the three bit JTAG_ACK_* code will be stored
116 */
117 static int adi_jtag_dp_scan(struct swjdp_common *swjdp,
118 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
119 uint8_t *outvalue, uint8_t *invalue, uint8_t *ack)
120 {
121 struct arm_jtag *jtag_info = swjdp->jtag_info;
122 struct scan_field fields[2];
123 uint8_t out_addr_buf;
124
125 jtag_set_end_state(TAP_IDLE);
126 arm_jtag_set_instr(jtag_info, instr, NULL);
127
128 /* Add specified number of tck clocks before accessing memory bus */
129
130 /* REVISIT these TCK cycles should be *AFTER* updating APACC, since
131 * they provide more time for the (MEM) AP to complete the read ...
132 * See "Minimum Response Time" for JTAG-DP, in the ADIv5 spec.
133 */
134 if ((instr == JTAG_DP_APACC)
135 && ((reg_addr == AP_REG_DRW)
136 || ((reg_addr & 0xF0) == AP_REG_BD0))
137 && (swjdp->memaccess_tck != 0))
138 jtag_add_runtest(swjdp->memaccess_tck, jtag_set_end_state(TAP_IDLE));
139
140 /* Scan out a read or write operation using some DP or AP register.
141 * For APACC access with any sticky error flag set, this is discarded.
142 */
143 fields[0].tap = jtag_info->tap;
144 fields[0].num_bits = 3;
145 buf_set_u32(&out_addr_buf, 0, 3, ((reg_addr >> 1) & 0x6) | (RnW & 0x1));
146 fields[0].out_value = &out_addr_buf;
147 fields[0].in_value = ack;
148
149 /* NOTE: if we receive JTAG_ACK_WAIT, the previous operation did not
150 * complete; data we write is discarded, data we read is unpredictable.
151 * When overrun detect is active, STICKYORUN is set.
152 */
153
154 fields[1].tap = jtag_info->tap;
155 fields[1].num_bits = 32;
156 fields[1].out_value = outvalue;
157 fields[1].in_value = invalue;
158
159 jtag_add_dr_scan(2, fields, jtag_get_end_state());
160
161 return jtag_get_error();
162 }
163
164 /**
165 * Scan DPACC or APACC out and in from host ordered uint32_t buffers.
166 * This is exactly like adi_jtag_dp_scan(), except that endianness
167 * conversions are performed (so the types of invalue and outvalue
168 * must be different).
169 */
170 static int adi_jtag_dp_scan_u32(struct swjdp_common *swjdp,
171 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
172 uint32_t outvalue, uint32_t *invalue, uint8_t *ack)
173 {
174 uint8_t out_value_buf[4];
175 int retval;
176
177 buf_set_u32(out_value_buf, 0, 32, outvalue);
178
179 retval = adi_jtag_dp_scan(swjdp, instr, reg_addr, RnW,
180 out_value_buf, (uint8_t *)invalue, ack);
181 if (retval != ERROR_OK)
182 return retval;
183
184 if (invalue)
185 jtag_add_callback(arm_le_to_h_u32,
186 (jtag_callback_data_t) invalue);
187
188 return retval;
189 }
190
191 /* scan_inout_check adds one extra inscan for DPAP_READ commands to read variables */
192 static int scan_inout_check(struct swjdp_common *swjdp,
193 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
194 uint8_t *outvalue, uint8_t *invalue)
195 {
196 adi_jtag_dp_scan(swjdp, instr, reg_addr, RnW, outvalue, NULL, NULL);
197
198 if ((RnW == DPAP_READ) && (invalue != NULL))
199 adi_jtag_dp_scan(swjdp, JTAG_DP_DPACC,
200 DP_RDBUFF, DPAP_READ, 0, invalue, &swjdp->ack);
201
202 /* In TRANS_MODE_ATOMIC all JTAG_DP_APACC transactions wait for
203 * ack = OK/FAULT and the check CTRL_STAT
204 */
205 if ((instr == JTAG_DP_APACC)
206 && (swjdp->trans_mode == TRANS_MODE_ATOMIC))
207 return jtagdp_transaction_endcheck(swjdp);
208
209 return ERROR_OK;
210 }
211
212 static int scan_inout_check_u32(struct swjdp_common *swjdp,
213 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
214 uint32_t outvalue, uint32_t *invalue)
215 {
216 /* Issue the read or write */
217 adi_jtag_dp_scan_u32(swjdp, instr, reg_addr, RnW, outvalue, NULL, NULL);
218
219 /* For reads, collect posted value; RDBUFF has no other effect.
220 * Assumes read gets acked with OK/FAULT, and CTRL_STAT says "OK".
221 */
222 if ((RnW == DPAP_READ) && (invalue != NULL))
223 adi_jtag_dp_scan_u32(swjdp, JTAG_DP_DPACC,
224 DP_RDBUFF, DPAP_READ, 0, invalue, &swjdp->ack);
225
226 /* In TRANS_MODE_ATOMIC all JTAG_DP_APACC transactions wait for
227 * ack = OK/FAULT and then check CTRL_STAT
228 */
229 if ((instr == JTAG_DP_APACC)
230 && (swjdp->trans_mode == TRANS_MODE_ATOMIC))
231 return jtagdp_transaction_endcheck(swjdp);
232
233 return ERROR_OK;
234 }
235
236 int jtagdp_transaction_endcheck(struct swjdp_common *swjdp)
237 {
238 int retval;
239 uint32_t ctrlstat;
240
241 /* too expensive to call keep_alive() here */
242
243 #if 0
244 /* Danger!!!! BROKEN!!!! */
245 scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
246 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
247 /* Danger!!!! BROKEN!!!! Why will jtag_execute_queue() fail here????
248 R956 introduced the check on return value here and now Michael Schwingen reports
249 that this code no longer works....
250
251 https://lists.berlios.de/pipermail/openocd-development/2008-September/003107.html
252 */
253 if ((retval = jtag_execute_queue()) != ERROR_OK)
254 {
255 LOG_ERROR("BUG: Why does this fail the first time????");
256 }
257 /* Why??? second time it works??? */
258 #endif
259
260 /* Post CTRL/STAT read; discard any previous posted read value
261 * but collect its ACK status.
262 */
263 scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
264 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
265 if ((retval = jtag_execute_queue()) != ERROR_OK)
266 return retval;
267
268 swjdp->ack = swjdp->ack & 0x7;
269
270 /* common code path avoids calling timeval_ms() */
271 if (swjdp->ack != JTAG_ACK_OK_FAULT)
272 {
273 long long then = timeval_ms();
274
275 while (swjdp->ack != JTAG_ACK_OK_FAULT)
276 {
277 if (swjdp->ack == JTAG_ACK_WAIT)
278 {
279 if ((timeval_ms()-then) > 1000)
280 {
281 /* NOTE: this would be a good spot
282 * to use JTAG_DP_ABORT.
283 */
284 LOG_WARNING("Timeout (1000ms) waiting "
285 "for ACK=OK/FAULT "
286 "in JTAG-DP transaction");
287 return ERROR_JTAG_DEVICE_ERROR;
288 }
289 }
290 else
291 {
292 LOG_WARNING("Invalid ACK %#x "
293 "in JTAG-DP transaction",
294 swjdp->ack);
295 return ERROR_JTAG_DEVICE_ERROR;
296 }
297
298 scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
299 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
300 if ((retval = jtag_execute_queue()) != ERROR_OK)
301 return retval;
302 swjdp->ack = swjdp->ack & 0x7;
303 }
304 }
305
306 /* REVISIT also STICKYCMP, for pushed comparisons (nyet used) */
307
308 /* Check for STICKYERR and STICKYORUN */
309 if (ctrlstat & (SSTICKYORUN | SSTICKYERR))
310 {
311 LOG_DEBUG("jtag-dp: CTRL/STAT error, 0x%" PRIx32, ctrlstat);
312 /* Check power to debug regions */
313 if ((ctrlstat & 0xf0000000) != 0xf0000000)
314 ahbap_debugport_init(swjdp);
315 else
316 {
317 uint32_t mem_ap_csw, mem_ap_tar;
318
319 /* Maybe print information about last intended
320 * MEM-AP access; but not if autoincrementing.
321 * *Real* CSW and TAR values are always shown.
322 */
323 if (swjdp->ap_tar_value != (uint32_t) -1)
324 LOG_DEBUG("MEM-AP Cached values: "
325 "ap_bank 0x%" PRIx32
326 ", ap_csw 0x%" PRIx32
327 ", ap_tar 0x%" PRIx32,
328 swjdp->ap_bank_value,
329 swjdp->ap_csw_value,
330 swjdp->ap_tar_value);
331
332 if (ctrlstat & SSTICKYORUN)
333 LOG_ERROR("JTAG-DP OVERRUN - check clock, "
334 "memaccess, or reduce jtag speed");
335
336 if (ctrlstat & SSTICKYERR)
337 LOG_ERROR("JTAG-DP STICKY ERROR");
338
339 /* Clear Sticky Error Bits */
340 scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
341 DP_CTRL_STAT, DPAP_WRITE,
342 swjdp->dp_ctrl_stat | SSTICKYORUN
343 | SSTICKYERR, NULL);
344 scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
345 DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
346 if ((retval = jtag_execute_queue()) != ERROR_OK)
347 return retval;
348
349 LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
350
351 dap_ap_read_reg_u32(swjdp, AP_REG_CSW, &mem_ap_csw);
352 dap_ap_read_reg_u32(swjdp, AP_REG_TAR, &mem_ap_tar);
353 if ((retval = jtag_execute_queue()) != ERROR_OK)
354 return retval;
355 LOG_ERROR("MEM_AP_CSW 0x%" PRIx32 ", MEM_AP_TAR 0x%"
356 PRIx32, mem_ap_csw, mem_ap_tar);
357
358 }
359 if ((retval = jtag_execute_queue()) != ERROR_OK)
360 return retval;
361 return ERROR_JTAG_DEVICE_ERROR;
362 }
363
364 return ERROR_OK;
365 }
366
367 /***************************************************************************
368 * *
369 * DP and MEM-AP register access through APACC and DPACC *
370 * *
371 ***************************************************************************/
372
373 static int dap_dp_write_reg(struct swjdp_common *swjdp,
374 uint32_t value, uint8_t reg_addr)
375 {
376 return scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
377 reg_addr, DPAP_WRITE, value, NULL);
378 }
379
380 static int dap_dp_read_reg(struct swjdp_common *swjdp,
381 uint32_t *value, uint8_t reg_addr)
382 {
383 return scan_inout_check_u32(swjdp, JTAG_DP_DPACC,
384 reg_addr, DPAP_READ, 0, value);
385 }
386
387 /**
388 * Select one of the APs connected to the specified DAP. The
389 * selection is implicitly used with future AP transactions.
390 * This is a NOP if the specified AP is already selected.
391 *
392 * @param swjdp The DAP
393 * @param apsel Number of the AP to (implicitly) use with further
394 * transactions. This normally identifies a MEM-AP.
395 */
396 void dap_ap_select(struct swjdp_common *swjdp,uint8_t apsel)
397 {
398 uint32_t select = (apsel << 24) & 0xFF000000;
399
400 if (select != swjdp->apsel)
401 {
402 swjdp->apsel = select;
403 /* Switching AP invalidates cached values.
404 * Values MUST BE UPDATED BEFORE AP ACCESS.
405 */
406 swjdp->ap_bank_value = -1;
407 swjdp->ap_csw_value = -1;
408 swjdp->ap_tar_value = -1;
409 }
410 }
411
412 /** Select the AP register bank matching bits 7:4 of ap_reg. */
413 static int dap_ap_bankselect(struct swjdp_common *swjdp, uint32_t ap_reg)
414 {
415 uint32_t select = (ap_reg & 0x000000F0);
416
417 if (select != swjdp->ap_bank_value)
418 {
419 swjdp->ap_bank_value = select;
420 select |= swjdp->apsel;
421 return dap_dp_write_reg(swjdp, select, DP_SELECT);
422 } else
423 return ERROR_OK;
424 }
425
426 static int dap_ap_write_reg(struct swjdp_common *swjdp,
427 uint32_t reg_addr, uint8_t *out_value_buf)
428 {
429 int retval;
430
431 retval = dap_ap_bankselect(swjdp, reg_addr);
432 if (retval != ERROR_OK)
433 return retval;
434
435 return scan_inout_check(swjdp, JTAG_DP_APACC, reg_addr,
436 DPAP_WRITE, out_value_buf, NULL);
437 }
438
439 /**
440 * Write an AP register value.
441 * This is synchronous iff the mode is set to ATOMIC, in which
442 * case any queued transactions are flushed.
443 *
444 * @param swjdp The DAP whose currently selected AP will be written.
445 * @param reg_addr Eight bit AP register address.
446 * @param value Word to be written at reg_addr
447 *
448 * @return In synchronous mode: ERROR_OK for success, and the register holds
449 * the specified value; else a fault code. In asynchronous mode, a status
450 * code reflecting whether the transaction was properly queued.
451 */
452 int dap_ap_write_reg_u32(struct swjdp_common *swjdp,
453 uint32_t reg_addr, uint32_t value)
454 {
455 uint8_t out_value_buf[4];
456
457 buf_set_u32(out_value_buf, 0, 32, value);
458 return dap_ap_write_reg(swjdp,
459 reg_addr, out_value_buf);
460 }
461
462 /**
463 * Read an AP register value.
464 * This is synchronous iff the mode is set to ATOMIC, in which
465 * case any queued transactions are flushed.
466 *
467 * @param swjdp The DAP whose currently selected AP will be read.
468 * @param reg_addr Eight bit AP register address.
469 * @param value Points to where the 32-bit (little-endian) word will be stored.
470 *
471 * @return In synchronous mode: ERROR_OK for success, and *value holds
472 * the specified value; else a fault code. In asynchronous mode, a status
473 * code reflecting whether the transaction was properly queued.
474 */
475 int dap_ap_read_reg_u32(struct swjdp_common *swjdp,
476 uint32_t reg_addr, uint32_t *value)
477 {
478 int retval;
479
480 retval = dap_ap_bankselect(swjdp, reg_addr);
481 if (retval != ERROR_OK)
482 return retval;
483
484 return scan_inout_check_u32(swjdp, JTAG_DP_APACC, reg_addr,
485 DPAP_READ, 0, value);
486 }
487
488 /**
489 * Set up transfer parameters for the currently selected MEM-AP.
490 * This is synchronous iff the mode is set to ATOMIC, in which
491 * case any queued transactions are flushed.
492 *
493 * Subsequent transfers using registers like AP_REG_DRW or AP_REG_BD2
494 * initiate data reads or writes using memory or peripheral addresses.
495 * If the CSW is configured for it, the TAR may be automatically
496 * incremented after each transfer.
497 *
498 * @todo Rename to reflect it being specifically a MEM-AP function.
499 *
500 * @param swjdp The DAP connected to the MEM-AP.
501 * @param csw MEM-AP Control/Status Word (CSW) register to assign. If this
502 * matches the cached value, the register is not changed.
503 * @param tar MEM-AP Transfer Address Register (TAR) to assign. If this
504 * matches the cached address, the register is not changed.
505 *
506 * @return In synchronous mode: ERROR_OK for success, and the AP is set
507 * up as requested else a fault code. In asynchronous mode, a status
508 * code reflecting whether the transaction was properly queued.
509 */
510 int dap_setup_accessport(struct swjdp_common *swjdp, uint32_t csw, uint32_t tar)
511 {
512 int retval;
513
514 csw = csw | CSW_DBGSWENABLE | CSW_MASTER_DEBUG | CSW_HPROT;
515 if (csw != swjdp->ap_csw_value)
516 {
517 /* LOG_DEBUG("DAP: Set CSW %x",csw); */
518 retval = dap_ap_write_reg_u32(swjdp, AP_REG_CSW, csw);
519 if (retval != ERROR_OK)
520 return retval;
521 swjdp->ap_csw_value = csw;
522 }
523 if (tar != swjdp->ap_tar_value)
524 {
525 /* LOG_DEBUG("DAP: Set TAR %x",tar); */
526 retval = dap_ap_write_reg_u32(swjdp, AP_REG_TAR, tar);
527 if (retval != ERROR_OK)
528 return retval;
529 swjdp->ap_tar_value = tar;
530 }
531 /* Disable TAR cache when autoincrementing */
532 if (csw & CSW_ADDRINC_MASK)
533 swjdp->ap_tar_value = -1;
534 return ERROR_OK;
535 }
536
537 /**
538 * Asynchronous (queued) read of a word from memory or a system register.
539 *
540 * @param swjdp The DAP connected to the MEM-AP performing the read.
541 * @param address Address of the 32-bit word to read; it must be
542 * readable by the currently selected MEM-AP.
543 * @param value points to where the word will be stored when the
544 * transaction queue is flushed (assuming no errors).
545 *
546 * @return ERROR_OK for success. Otherwise a fault code.
547 */
548 int mem_ap_read_u32(struct swjdp_common *swjdp, uint32_t address,
549 uint32_t *value)
550 {
551 int retval;
552
553 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
554
555 /* Use banked addressing (REG_BDx) to avoid some link traffic
556 * (updating TAR) when reading several consecutive addresses.
557 */
558 retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF,
559 address & 0xFFFFFFF0);
560 if (retval != ERROR_OK)
561 return retval;
562
563 return dap_ap_read_reg_u32(swjdp, AP_REG_BD0 | (address & 0xC), value);
564 }
565
566 /**
567 * Synchronous read of a word from memory or a system register.
568 * As a side effect, this flushes any queued transactions.
569 *
570 * @param swjdp The DAP connected to the MEM-AP performing the read.
571 * @param address Address of the 32-bit word to read; it must be
572 * readable by the currently selected MEM-AP.
573 * @param value points to where the result will be stored.
574 *
575 * @return ERROR_OK for success; *value holds the result.
576 * Otherwise a fault code.
577 */
578 int mem_ap_read_atomic_u32(struct swjdp_common *swjdp, uint32_t address,
579 uint32_t *value)
580 {
581 int retval;
582
583 retval = mem_ap_read_u32(swjdp, address, value);
584 if (retval != ERROR_OK)
585 return retval;
586
587 return jtagdp_transaction_endcheck(swjdp);
588 }
589
590 /**
591 * Asynchronous (queued) write of a word to memory or a system register.
592 *
593 * @param swjdp The DAP connected to the MEM-AP.
594 * @param address Address to be written; it must be writable by
595 * the currently selected MEM-AP.
596 * @param value Word that will be written to the address when transaction
597 * queue is flushed (assuming no errors).
598 *
599 * @return ERROR_OK for success. Otherwise a fault code.
600 */
601 int mem_ap_write_u32(struct swjdp_common *swjdp, uint32_t address,
602 uint32_t value)
603 {
604 int retval;
605
606 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
607
608 /* Use banked addressing (REG_BDx) to avoid some link traffic
609 * (updating TAR) when writing several consecutive addresses.
610 */
611 retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF,
612 address & 0xFFFFFFF0);
613 if (retval != ERROR_OK)
614 return retval;
615
616 return dap_ap_write_reg_u32(swjdp, AP_REG_BD0 | (address & 0xC),
617 value);
618 }
619
620 /**
621 * Synchronous write of a word to memory or a system register.
622 * As a side effect, this flushes any queued transactions.
623 *
624 * @param swjdp The DAP connected to the MEM-AP.
625 * @param address Address to be written; it must be writable by
626 * the currently selected MEM-AP.
627 * @param value Word that will be written.
628 *
629 * @return ERROR_OK for success; the data was written. Otherwise a fault code.
630 */
631 int mem_ap_write_atomic_u32(struct swjdp_common *swjdp, uint32_t address,
632 uint32_t value)
633 {
634 int retval = mem_ap_write_u32(swjdp, address, value);
635
636 if (retval != ERROR_OK)
637 return retval;
638
639 return jtagdp_transaction_endcheck(swjdp);
640 }
641
642 /*****************************************************************************
643 * *
644 * mem_ap_write_buf(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address) *
645 * *
646 * Write a buffer in target order (little endian) *
647 * *
648 *****************************************************************************/
649 int mem_ap_write_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
650 {
651 int wcount, blocksize, writecount, errorcount = 0, retval = ERROR_OK;
652 uint32_t adr = address;
653 uint8_t* pBuffer = buffer;
654
655 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
656
657 count >>= 2;
658 wcount = count;
659
660 /* if we have an unaligned access - reorder data */
661 if (adr & 0x3u)
662 {
663 for (writecount = 0; writecount < count; writecount++)
664 {
665 int i;
666 uint32_t outvalue;
667 memcpy(&outvalue, pBuffer, sizeof(uint32_t));
668
669 for (i = 0; i < 4; i++)
670 {
671 *((uint8_t*)pBuffer + (adr & 0x3)) = outvalue;
672 outvalue >>= 8;
673 adr++;
674 }
675 pBuffer += sizeof(uint32_t);
676 }
677 }
678
679 while (wcount > 0)
680 {
681 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
682 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
683 if (wcount < blocksize)
684 blocksize = wcount;
685
686 /* handle unaligned data at 4k boundary */
687 if (blocksize == 0)
688 blocksize = 1;
689
690 dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
691
692 for (writecount = 0; writecount < blocksize; writecount++)
693 {
694 dap_ap_write_reg(swjdp, AP_REG_DRW, buffer + 4 * writecount);
695 }
696
697 if (jtagdp_transaction_endcheck(swjdp) == ERROR_OK)
698 {
699 wcount = wcount - blocksize;
700 address = address + 4 * blocksize;
701 buffer = buffer + 4 * blocksize;
702 }
703 else
704 {
705 errorcount++;
706 }
707
708 if (errorcount > 1)
709 {
710 LOG_WARNING("Block write error address 0x%" PRIx32 ", wcount 0x%x", address, wcount);
711 return ERROR_JTAG_DEVICE_ERROR;
712 }
713 }
714
715 return retval;
716 }
717
718 static int mem_ap_write_buf_packed_u16(struct swjdp_common *swjdp,
719 uint8_t *buffer, int count, uint32_t address)
720 {
721 int retval = ERROR_OK;
722 int wcount, blocksize, writecount, i;
723
724 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
725
726 wcount = count >> 1;
727
728 while (wcount > 0)
729 {
730 int nbytes;
731
732 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
733 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
734
735 if (wcount < blocksize)
736 blocksize = wcount;
737
738 /* handle unaligned data at 4k boundary */
739 if (blocksize == 0)
740 blocksize = 1;
741
742 dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_PACKED, address);
743 writecount = blocksize;
744
745 do
746 {
747 nbytes = MIN((writecount << 1), 4);
748
749 if (nbytes < 4)
750 {
751 if (mem_ap_write_buf_u16(swjdp, buffer,
752 nbytes, address) != ERROR_OK)
753 {
754 LOG_WARNING("Block write error address "
755 "0x%" PRIx32 ", count 0x%x",
756 address, count);
757 return ERROR_JTAG_DEVICE_ERROR;
758 }
759
760 address += nbytes >> 1;
761 }
762 else
763 {
764 uint32_t outvalue;
765 memcpy(&outvalue, buffer, sizeof(uint32_t));
766
767 for (i = 0; i < nbytes; i++)
768 {
769 *((uint8_t*)buffer + (address & 0x3)) = outvalue;
770 outvalue >>= 8;
771 address++;
772 }
773
774 memcpy(&outvalue, buffer, sizeof(uint32_t));
775 dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
776 if (jtagdp_transaction_endcheck(swjdp) != ERROR_OK)
777 {
778 LOG_WARNING("Block write error address "
779 "0x%" PRIx32 ", count 0x%x",
780 address, count);
781 return ERROR_JTAG_DEVICE_ERROR;
782 }
783 }
784
785 buffer += nbytes >> 1;
786 writecount -= nbytes >> 1;
787
788 } while (writecount);
789 wcount -= blocksize;
790 }
791
792 return retval;
793 }
794
795 int mem_ap_write_buf_u16(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
796 {
797 int retval = ERROR_OK;
798
799 if (count >= 4)
800 return mem_ap_write_buf_packed_u16(swjdp, buffer, count, address);
801
802 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
803
804 while (count > 0)
805 {
806 dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
807 uint16_t svalue;
808 memcpy(&svalue, buffer, sizeof(uint16_t));
809 uint32_t outvalue = (uint32_t)svalue << 8 * (address & 0x3);
810 dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
811 retval = jtagdp_transaction_endcheck(swjdp);
812 count -= 2;
813 address += 2;
814 buffer += 2;
815 }
816
817 return retval;
818 }
819
820 static int mem_ap_write_buf_packed_u8(struct swjdp_common *swjdp,
821 uint8_t *buffer, int count, uint32_t address)
822 {
823 int retval = ERROR_OK;
824 int wcount, blocksize, writecount, i;
825
826 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
827
828 wcount = count;
829
830 while (wcount > 0)
831 {
832 int nbytes;
833
834 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
835 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
836
837 if (wcount < blocksize)
838 blocksize = wcount;
839
840 dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_PACKED, address);
841 writecount = blocksize;
842
843 do
844 {
845 nbytes = MIN(writecount, 4);
846
847 if (nbytes < 4)
848 {
849 if (mem_ap_write_buf_u8(swjdp, buffer, nbytes, address) != ERROR_OK)
850 {
851 LOG_WARNING("Block write error address "
852 "0x%" PRIx32 ", count 0x%x",
853 address, count);
854 return ERROR_JTAG_DEVICE_ERROR;
855 }
856
857 address += nbytes;
858 }
859 else
860 {
861 uint32_t outvalue;
862 memcpy(&outvalue, buffer, sizeof(uint32_t));
863
864 for (i = 0; i < nbytes; i++)
865 {
866 *((uint8_t*)buffer + (address & 0x3)) = outvalue;
867 outvalue >>= 8;
868 address++;
869 }
870
871 memcpy(&outvalue, buffer, sizeof(uint32_t));
872 dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
873 if (jtagdp_transaction_endcheck(swjdp) != ERROR_OK)
874 {
875 LOG_WARNING("Block write error address "
876 "0x%" PRIx32 ", count 0x%x",
877 address, count);
878 return ERROR_JTAG_DEVICE_ERROR;
879 }
880 }
881
882 buffer += nbytes;
883 writecount -= nbytes;
884
885 } while (writecount);
886 wcount -= blocksize;
887 }
888
889 return retval;
890 }
891
892 int mem_ap_write_buf_u8(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
893 {
894 int retval = ERROR_OK;
895
896 if (count >= 4)
897 return mem_ap_write_buf_packed_u8(swjdp, buffer, count, address);
898
899 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
900
901 while (count > 0)
902 {
903 dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
904 uint32_t outvalue = (uint32_t)*buffer << 8 * (address & 0x3);
905 dap_ap_write_reg_u32(swjdp, AP_REG_DRW, outvalue);
906 retval = jtagdp_transaction_endcheck(swjdp);
907 count--;
908 address++;
909 buffer++;
910 }
911
912 return retval;
913 }
914
915 /*********************************************************************************
916 * *
917 * mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address) *
918 * *
919 * Read block fast in target order (little endian) into a buffer *
920 * *
921 **********************************************************************************/
922 int mem_ap_read_buf_u32(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
923 {
924 int wcount, blocksize, readcount, errorcount = 0, retval = ERROR_OK;
925 uint32_t adr = address;
926 uint8_t* pBuffer = buffer;
927
928 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
929
930 count >>= 2;
931 wcount = count;
932
933 while (wcount > 0)
934 {
935 /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
936 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
937 if (wcount < blocksize)
938 blocksize = wcount;
939
940 /* handle unaligned data at 4k boundary */
941 if (blocksize == 0)
942 blocksize = 1;
943
944 dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
945
946 /* Scan out first read */
947 adi_jtag_dp_scan(swjdp, JTAG_DP_APACC, AP_REG_DRW,
948 DPAP_READ, 0, NULL, NULL);
949 for (readcount = 0; readcount < blocksize - 1; readcount++)
950 {
951 /* Scan out next read; scan in posted value for the
952 * previous one. Assumes read is acked "OK/FAULT",
953 * and CTRL_STAT says that meant "OK".
954 */
955 adi_jtag_dp_scan(swjdp, JTAG_DP_APACC, AP_REG_DRW,
956 DPAP_READ, 0, buffer + 4 * readcount,
957 &swjdp->ack);
958 }
959
960 /* Scan in last posted value; RDBUFF has no other effect,
961 * assuming ack is OK/FAULT and CTRL_STAT says "OK".
962 */
963 adi_jtag_dp_scan(swjdp, JTAG_DP_DPACC, DP_RDBUFF,
964 DPAP_READ, 0, buffer + 4 * readcount,
965 &swjdp->ack);
966 if (jtagdp_transaction_endcheck(swjdp) == ERROR_OK)
967 {
968 wcount = wcount - blocksize;
969 address += 4 * blocksize;
970 buffer += 4 * blocksize;
971 }
972 else
973 {
974 errorcount++;
975 }
976
977 if (errorcount > 1)
978 {
979 LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
980 return ERROR_JTAG_DEVICE_ERROR;
981 }
982 }
983
984 /* if we have an unaligned access - reorder data */
985 if (adr & 0x3u)
986 {
987 for (readcount = 0; readcount < count; readcount++)
988 {
989 int i;
990 uint32_t data;
991 memcpy(&data, pBuffer, sizeof(uint32_t));
992
993 for (i = 0; i < 4; i++)
994 {
995 *((uint8_t*)pBuffer) = (data >> 8 * (adr & 0x3));
996 pBuffer++;
997 adr++;
998 }
999 }
1000 }
1001
1002 return retval;
1003 }
1004
1005 static int mem_ap_read_buf_packed_u16(struct swjdp_common *swjdp,
1006 uint8_t *buffer, int count, uint32_t address)
1007 {
1008 uint32_t invalue;
1009 int retval = ERROR_OK;
1010 int wcount, blocksize, readcount, i;
1011
1012 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
1013
1014 wcount = count >> 1;
1015
1016 while (wcount > 0)
1017 {
1018 int nbytes;
1019
1020 /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
1021 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
1022 if (wcount < blocksize)
1023 blocksize = wcount;
1024
1025 dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_PACKED, address);
1026
1027 /* handle unaligned data at 4k boundary */
1028 if (blocksize == 0)
1029 blocksize = 1;
1030 readcount = blocksize;
1031
1032 do
1033 {
1034 dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue);
1035 if (jtagdp_transaction_endcheck(swjdp) != ERROR_OK)
1036 {
1037 LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
1038 return ERROR_JTAG_DEVICE_ERROR;
1039 }
1040
1041 nbytes = MIN((readcount << 1), 4);
1042
1043 for (i = 0; i < nbytes; i++)
1044 {
1045 *((uint8_t*)buffer) = (invalue >> 8 * (address & 0x3));
1046 buffer++;
1047 address++;
1048 }
1049
1050 readcount -= (nbytes >> 1);
1051 } while (readcount);
1052 wcount -= blocksize;
1053 }
1054
1055 return retval;
1056 }
1057
1058 int mem_ap_read_buf_u16(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
1059 {
1060 uint32_t invalue, i;
1061 int retval = ERROR_OK;
1062
1063 if (count >= 4)
1064 return mem_ap_read_buf_packed_u16(swjdp, buffer, count, address);
1065
1066 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
1067
1068 while (count > 0)
1069 {
1070 dap_setup_accessport(swjdp, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
1071 dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue);
1072 retval = jtagdp_transaction_endcheck(swjdp);
1073 if (address & 0x1)
1074 {
1075 for (i = 0; i < 2; i++)
1076 {
1077 *((uint8_t*)buffer) = (invalue >> 8 * (address & 0x3));
1078 buffer++;
1079 address++;
1080 }
1081 }
1082 else
1083 {
1084 uint16_t svalue = (invalue >> 8 * (address & 0x3));
1085 memcpy(buffer, &svalue, sizeof(uint16_t));
1086 address += 2;
1087 buffer += 2;
1088 }
1089 count -= 2;
1090 }
1091
1092 return retval;
1093 }
1094
1095 /* FIX!!! is this a potential performance bottleneck w.r.t. requiring too many
1096 * roundtrips when jtag_execute_queue() has a large overhead(e.g. for USB)s?
1097 *
1098 * The solution is to arrange for a large out/in scan in this loop and
1099 * and convert data afterwards.
1100 */
1101 static int mem_ap_read_buf_packed_u8(struct swjdp_common *swjdp,
1102 uint8_t *buffer, int count, uint32_t address)
1103 {
1104 uint32_t invalue;
1105 int retval = ERROR_OK;
1106 int wcount, blocksize, readcount, i;
1107
1108 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
1109
1110 wcount = count;
1111
1112 while (wcount > 0)
1113 {
1114 int nbytes;
1115
1116 /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
1117 blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
1118
1119 if (wcount < blocksize)
1120 blocksize = wcount;
1121
1122 dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_PACKED, address);
1123 readcount = blocksize;
1124
1125 do
1126 {
1127 dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue);
1128 if (jtagdp_transaction_endcheck(swjdp) != ERROR_OK)
1129 {
1130 LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
1131 return ERROR_JTAG_DEVICE_ERROR;
1132 }
1133
1134 nbytes = MIN(readcount, 4);
1135
1136 for (i = 0; i < nbytes; i++)
1137 {
1138 *((uint8_t*)buffer) = (invalue >> 8 * (address & 0x3));
1139 buffer++;
1140 address++;
1141 }
1142
1143 readcount -= nbytes;
1144 } while (readcount);
1145 wcount -= blocksize;
1146 }
1147
1148 return retval;
1149 }
1150
1151 int mem_ap_read_buf_u8(struct swjdp_common *swjdp, uint8_t *buffer, int count, uint32_t address)
1152 {
1153 uint32_t invalue;
1154 int retval = ERROR_OK;
1155
1156 if (count >= 4)
1157 return mem_ap_read_buf_packed_u8(swjdp, buffer, count, address);
1158
1159 swjdp->trans_mode = TRANS_MODE_COMPOSITE;
1160
1161 while (count > 0)
1162 {
1163 dap_setup_accessport(swjdp, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
1164 dap_ap_read_reg_u32(swjdp, AP_REG_DRW, &invalue);
1165 retval = jtagdp_transaction_endcheck(swjdp);
1166 *((uint8_t*)buffer) = (invalue >> 8 * (address & 0x3));
1167 count--;
1168 address++;
1169 buffer++;
1170 }
1171
1172 return retval;
1173 }
1174
1175 /**
1176 * Initialize a DAP. This sets up the power domains, prepares the DP
1177 * for further use, and arranges to use AP #0 for all AP operations
1178 * until dap_ap-select() changes that policy.
1179 *
1180 * @param swjdp The DAP being initialized.
1181 *
1182 * @todo Rename this. We also need an initialization scheme which account
1183 * for SWD transports not just JTAG; that will need to address differences
1184 * in layering. (JTAG is useful without any debug target; but not SWD.)
1185 * And this may not even use an AHB-AP ... e.g. DAP-Lite uses an APB-AP.
1186 */
1187 int ahbap_debugport_init(struct swjdp_common *swjdp)
1188 {
1189 uint32_t idreg, romaddr, dummy;
1190 uint32_t ctrlstat;
1191 int cnt = 0;
1192 int retval;
1193
1194 LOG_DEBUG(" ");
1195
1196 /* Default MEM-AP setup.
1197 *
1198 * REVISIT AP #0 may be an inappropriate default for this.
1199 * Should we probe, or take a hint from the caller?
1200 * Presumably we can ignore the possibility of multiple APs.
1201 */
1202 swjdp->apsel = !0;
1203 dap_ap_select(swjdp, 0);
1204
1205 /* DP initialization */
1206 swjdp->trans_mode = TRANS_MODE_ATOMIC;
1207 dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
1208 dap_dp_write_reg(swjdp, SSTICKYERR, DP_CTRL_STAT);
1209 dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
1210
1211 swjdp->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ;
1212
1213 dap_dp_write_reg(swjdp, swjdp->dp_ctrl_stat, DP_CTRL_STAT);
1214 dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
1215 if ((retval = jtag_execute_queue()) != ERROR_OK)
1216 return retval;
1217
1218 /* Check that we have debug power domains activated */
1219 while (!(ctrlstat & CDBGPWRUPACK) && (cnt++ < 10))
1220 {
1221 LOG_DEBUG("DAP: wait CDBGPWRUPACK");
1222 dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
1223 if ((retval = jtag_execute_queue()) != ERROR_OK)
1224 return retval;
1225 alive_sleep(10);
1226 }
1227
1228 while (!(ctrlstat & CSYSPWRUPACK) && (cnt++ < 10))
1229 {
1230 LOG_DEBUG("DAP: wait CSYSPWRUPACK");
1231 dap_dp_read_reg(swjdp, &ctrlstat, DP_CTRL_STAT);
1232 if ((retval = jtag_execute_queue()) != ERROR_OK)
1233 return retval;
1234 alive_sleep(10);
1235 }
1236
1237 dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
1238 /* With debug power on we can activate OVERRUN checking */
1239 swjdp->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ | CORUNDETECT;
1240 dap_dp_write_reg(swjdp, swjdp->dp_ctrl_stat, DP_CTRL_STAT);
1241 dap_dp_read_reg(swjdp, &dummy, DP_CTRL_STAT);
1242
1243 /*
1244 * REVISIT this isn't actually *initializing* anything in an AP,
1245 * and doesn't care if it's a MEM-AP at all (much less AHB-AP).
1246 * Should it? If the ROM address is valid, is this the right
1247 * place to scan the table and do any topology detection?
1248 */
1249 dap_ap_read_reg_u32(swjdp, AP_REG_IDR, &idreg);
1250 dap_ap_read_reg_u32(swjdp, AP_REG_BASE, &romaddr);
1251
1252 LOG_DEBUG("MEM-AP #%d ID Register 0x%" PRIx32
1253 ", Debug ROM Address 0x%" PRIx32,
1254 swjdp->apsel, idreg, romaddr);
1255
1256 return ERROR_OK;
1257 }
1258
1259 /* CID interpretation -- see ARM IHI 0029B section 3
1260 * and ARM IHI 0031A table 13-3.
1261 */
1262 static const char *class_description[16] ={
1263 "Reserved", "ROM table", "Reserved", "Reserved",
1264 "Reserved", "Reserved", "Reserved", "Reserved",
1265 "Reserved", "CoreSight component", "Reserved", "Peripheral Test Block",
1266 "Reserved", "OptimoDE DESS",
1267 "Generic IP component", "PrimeCell or System component"
1268 };
1269
1270 static bool
1271 is_dap_cid_ok(uint32_t cid3, uint32_t cid2, uint32_t cid1, uint32_t cid0)
1272 {
1273 return cid3 == 0xb1 && cid2 == 0x05
1274 && ((cid1 & 0x0f) == 0) && cid0 == 0x0d;
1275 }
1276
1277 int dap_info_command(struct command_context *cmd_ctx,
1278 struct swjdp_common *swjdp, int apsel)
1279 {
1280
1281 uint32_t dbgbase, apid;
1282 int romtable_present = 0;
1283 uint8_t mem_ap;
1284 uint32_t apselold;
1285
1286 /* AP address is in bits 31:24 of DP_SELECT */
1287 if (apsel >= 256)
1288 return ERROR_INVALID_ARGUMENTS;
1289
1290 apselold = swjdp->apsel;
1291 dap_ap_select(swjdp, apsel);
1292 dap_ap_read_reg_u32(swjdp, AP_REG_BASE, &dbgbase);
1293 dap_ap_read_reg_u32(swjdp, AP_REG_IDR, &apid);
1294 jtagdp_transaction_endcheck(swjdp);
1295 /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
1296 mem_ap = ((apid&0x10000) && ((apid&0x0F) != 0));
1297 command_print(cmd_ctx, "AP ID register 0x%8.8" PRIx32, apid);
1298 if (apid)
1299 {
1300 switch (apid&0x0F)
1301 {
1302 case 0:
1303 command_print(cmd_ctx, "\tType is JTAG-AP");
1304 break;
1305 case 1:
1306 command_print(cmd_ctx, "\tType is MEM-AP AHB");
1307 break;
1308 case 2:
1309 command_print(cmd_ctx, "\tType is MEM-AP APB");
1310 break;
1311 default:
1312 command_print(cmd_ctx, "\tUnknown AP type");
1313 break;
1314 }
1315
1316 /* NOTE: a MEM-AP may have a single CoreSight component that's
1317 * not a ROM table ... or have no such components at all.
1318 */
1319 if (mem_ap)
1320 command_print(cmd_ctx, "AP BASE 0x%8.8" PRIx32,
1321 dbgbase);
1322 }
1323 else
1324 {
1325 command_print(cmd_ctx, "No AP found at this apsel 0x%x", apsel);
1326 }
1327
1328 romtable_present = ((mem_ap) && (dbgbase != 0xFFFFFFFF));
1329 if (romtable_present)
1330 {
1331 uint32_t cid0,cid1,cid2,cid3,memtype,romentry;
1332 uint16_t entry_offset;
1333
1334 /* bit 16 of apid indicates a memory access port */
1335 if (dbgbase & 0x02)
1336 command_print(cmd_ctx, "\tValid ROM table present");
1337 else
1338 command_print(cmd_ctx, "\tROM table in legacy format");
1339
1340 /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
1341 mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000) | 0xFF0, &cid0);
1342 mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000) | 0xFF4, &cid1);
1343 mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000) | 0xFF8, &cid2);
1344 mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000) | 0xFFC, &cid3);
1345 mem_ap_read_u32(swjdp, (dbgbase&0xFFFFF000) | 0xFCC, &memtype);
1346 jtagdp_transaction_endcheck(swjdp);
1347 if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
1348 command_print(cmd_ctx, "\tCID3 0x%2.2" PRIx32
1349 ", CID2 0x%2.2" PRIx32
1350 ", CID1 0x%2.2" PRIx32
1351 ", CID0 0x%2.2" PRIx32,
1352 cid3, cid2, cid1, cid0);
1353 if (memtype & 0x01)
1354 command_print(cmd_ctx, "\tMEMTYPE system memory present on bus");
1355 else
1356 command_print(cmd_ctx, "\tMEMTYPE System memory not present. "
1357 "Dedicated debug bus.");
1358
1359 /* Now we read ROM table entries from dbgbase&0xFFFFF000) | 0x000 until we get 0x00000000 */
1360 entry_offset = 0;
1361 do
1362 {
1363 mem_ap_read_atomic_u32(swjdp, (dbgbase&0xFFFFF000) | entry_offset, &romentry);
1364 command_print(cmd_ctx, "\tROMTABLE[0x%x] = 0x%" PRIx32 "",entry_offset,romentry);
1365 if (romentry&0x01)
1366 {
1367 uint32_t c_cid0, c_cid1, c_cid2, c_cid3;
1368 uint32_t c_pid0, c_pid1, c_pid2, c_pid3, c_pid4;
1369 uint32_t component_start, component_base;
1370 unsigned part_num;
1371 char *type, *full;
1372
1373 component_base = (uint32_t)((dbgbase & 0xFFFFF000)
1374 + (int)(romentry & 0xFFFFF000));
1375 mem_ap_read_atomic_u32(swjdp,
1376 (component_base & 0xFFFFF000) | 0xFE0, &c_pid0);
1377 mem_ap_read_atomic_u32(swjdp,
1378 (component_base & 0xFFFFF000) | 0xFE4, &c_pid1);
1379 mem_ap_read_atomic_u32(swjdp,
1380 (component_base & 0xFFFFF000) | 0xFE8, &c_pid2);
1381 mem_ap_read_atomic_u32(swjdp,
1382 (component_base & 0xFFFFF000) | 0xFEC, &c_pid3);
1383 mem_ap_read_atomic_u32(swjdp,
1384 (component_base & 0xFFFFF000) | 0xFD0, &c_pid4);
1385 mem_ap_read_atomic_u32(swjdp,
1386 (component_base & 0xFFFFF000) | 0xFF0, &c_cid0);
1387 mem_ap_read_atomic_u32(swjdp,
1388 (component_base & 0xFFFFF000) | 0xFF4, &c_cid1);
1389 mem_ap_read_atomic_u32(swjdp,
1390 (component_base & 0xFFFFF000) | 0xFF8, &c_cid2);
1391 mem_ap_read_atomic_u32(swjdp,
1392 (component_base & 0xFFFFF000) | 0xFFC, &c_cid3);
1393 component_start = component_base - 0x1000*(c_pid4 >> 4);
1394
1395 command_print(cmd_ctx, "\t\tComponent base address 0x%" PRIx32
1396 ", start address 0x%" PRIx32,
1397 component_base, component_start);
1398 command_print(cmd_ctx, "\t\tComponent class is 0x%x, %s",
1399 (int) (c_cid1 >> 4) & 0xf,
1400 /* See ARM IHI 0029B Table 3-3 */
1401 class_description[(c_cid1 >> 4) & 0xf]);
1402
1403 /* CoreSight component? */
1404 if (((c_cid1 >> 4) & 0x0f) == 9) {
1405 uint32_t devtype;
1406 unsigned minor;
1407 char *major = "Reserved", *subtype = "Reserved";
1408
1409 mem_ap_read_atomic_u32(swjdp,
1410 (component_base & 0xfffff000) | 0xfcc,
1411 &devtype);
1412 minor = (devtype >> 4) & 0x0f;
1413 switch (devtype & 0x0f) {
1414 case 0:
1415 major = "Miscellaneous";
1416 switch (minor) {
1417 case 0:
1418 subtype = "other";
1419 break;
1420 case 4:
1421 subtype = "Validation component";
1422 break;
1423 }
1424 break;
1425 case 1:
1426 major = "Trace Sink";
1427 switch (minor) {
1428 case 0:
1429 subtype = "other";
1430 break;
1431 case 1:
1432 subtype = "Port";
1433 break;
1434 case 2:
1435 subtype = "Buffer";
1436 break;
1437 }
1438 break;
1439 case 2:
1440 major = "Trace Link";
1441 switch (minor) {
1442 case 0:
1443 subtype = "other";
1444 break;
1445 case 1:
1446 subtype = "Funnel, router";
1447 break;
1448 case 2:
1449 subtype = "Filter";
1450 break;
1451 case 3:
1452 subtype = "FIFO, buffer";
1453 break;
1454 }
1455 break;
1456 case 3:
1457 major = "Trace Source";
1458 switch (minor) {
1459 case 0:
1460 subtype = "other";
1461 break;
1462 case 1:
1463 subtype = "Processor";
1464 break;
1465 case 2:
1466 subtype = "DSP";
1467 break;
1468 case 3:
1469 subtype = "Engine/Coprocessor";
1470 break;
1471 case 4:
1472 subtype = "Bus";
1473 break;
1474 }
1475 break;
1476 case 4:
1477 major = "Debug Control";
1478 switch (minor) {
1479 case 0:
1480 subtype = "other";
1481 break;
1482 case 1:
1483 subtype = "Trigger Matrix";
1484 break;
1485 case 2:
1486 subtype = "Debug Auth";
1487 break;
1488 }
1489 break;
1490 case 5:
1491 major = "Debug Logic";
1492 switch (minor) {
1493 case 0:
1494 subtype = "other";
1495 break;
1496 case 1:
1497 subtype = "Processor";
1498 break;
1499 case 2:
1500 subtype = "DSP";
1501 break;
1502 case 3:
1503 subtype = "Engine/Coprocessor";
1504 break;
1505 }
1506 break;
1507 }
1508 command_print(cmd_ctx, "\t\tType is 0x%2.2x, %s, %s",
1509 (unsigned) (devtype & 0xff),
1510 major, subtype);
1511 /* REVISIT also show 0xfc8 DevId */
1512 }
1513
1514 if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
1515 command_print(cmd_ctx, "\t\tCID3 0x%2.2" PRIx32
1516 ", CID2 0x%2.2" PRIx32
1517 ", CID1 0x%2.2" PRIx32
1518 ", CID0 0x%2.2" PRIx32,
1519 c_cid3, c_cid2, c_cid1, c_cid0);
1520 command_print(cmd_ctx, "\t\tPeripheral ID[4..0] = hex "
1521 "%2.2x %2.2x %2.2x %2.2x %2.2x",
1522 (int) c_pid4,
1523 (int) c_pid3, (int) c_pid2,
1524 (int) c_pid1, (int) c_pid0);
1525
1526 /* Part number interpretations are from Cortex
1527 * core specs, the CoreSight components TRM
1528 * (ARM DDI 0314H), and ETM specs; also from
1529 * chip observation (e.g. TI SDTI).
1530 */
1531 part_num = c_pid0 & 0xff;
1532 part_num |= (c_pid1 & 0x0f) << 8;
1533 switch (part_num) {
1534 case 0x000:
1535 type = "Cortex-M3 NVIC";
1536 full = "(Interrupt Controller)";
1537 break;
1538 case 0x001:
1539 type = "Cortex-M3 ITM";
1540 full = "(Instrumentation Trace Module)";
1541 break;
1542 case 0x002:
1543 type = "Cortex-M3 DWT";
1544 full = "(Data Watchpoint and Trace)";
1545 break;
1546 case 0x003:
1547 type = "Cortex-M3 FBP";
1548 full = "(Flash Patch and Breakpoint)";
1549 break;
1550 case 0x00d:
1551 type = "CoreSight ETM11";
1552 full = "(Embedded Trace)";
1553 break;
1554 // case 0x113: what?
1555 case 0x120: /* from OMAP3 memmap */
1556 type = "TI SDTI";
1557 full = "(System Debug Trace Interface)";
1558 break;
1559 case 0x343: /* from OMAP3 memmap */
1560 type = "TI DAPCTL";
1561 full = "";
1562 break;
1563 case 0x4e0:
1564 type = "Cortex-M3 ETM";
1565 full = "(Embedded Trace)";
1566 break;
1567 case 0x906:
1568 type = "Coresight CTI";
1569 full = "(Cross Trigger)";
1570 break;
1571 case 0x907:
1572 type = "Coresight ETB";
1573 full = "(Trace Buffer)";
1574 break;
1575 case 0x908:
1576 type = "Coresight CSTF";
1577 full = "(Trace Funnel)";
1578 break;
1579 case 0x910:
1580 type = "CoreSight ETM9";
1581 full = "(Embedded Trace)";
1582 break;
1583 case 0x912:
1584 type = "Coresight TPIU";
1585 full = "(Trace Port Interface Unit)";
1586 break;
1587 case 0x921:
1588 type = "Cortex-A8 ETM";
1589 full = "(Embedded Trace)";
1590 break;
1591 case 0x922:
1592 type = "Cortex-A8 CTI";
1593 full = "(Cross Trigger)";
1594 break;
1595 case 0x923:
1596 type = "Cortex-M3 TPIU";
1597 full = "(Trace Port Interface Unit)";
1598 break;
1599 case 0xc08:
1600 type = "Cortex-A8 Debug";
1601 full = "(Debug Unit)";
1602 break;
1603 default:
1604 type = "-*- unrecognized -*-";
1605 full = "";
1606 break;
1607 }
1608 command_print(cmd_ctx, "\t\tPart is %s %s",
1609 type, full);
1610 }
1611 else
1612 {
1613 if (romentry)
1614 command_print(cmd_ctx, "\t\tComponent not present");
1615 else
1616 command_print(cmd_ctx, "\t\tEnd of ROM table");
1617 }
1618 entry_offset += 4;
1619 } while (romentry > 0);
1620 }
1621 else
1622 {
1623 command_print(cmd_ctx, "\tNo ROM table present");
1624 }
1625 dap_ap_select(swjdp, apselold);
1626
1627 return ERROR_OK;
1628 }
1629
1630 DAP_COMMAND_HANDLER(dap_baseaddr_command)
1631 {
1632 uint32_t apsel, apselsave, baseaddr;
1633 int retval;
1634
1635 apselsave = swjdp->apsel;
1636 switch (CMD_ARGC) {
1637 case 0:
1638 apsel = swjdp->apsel;
1639 break;
1640 case 1:
1641 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1642 /* AP address is in bits 31:24 of DP_SELECT */
1643 if (apsel >= 256)
1644 return ERROR_INVALID_ARGUMENTS;
1645 break;
1646 default:
1647 return ERROR_COMMAND_SYNTAX_ERROR;
1648 }
1649
1650 if (apselsave != apsel)
1651 dap_ap_select(swjdp, apsel);
1652
1653 /* NOTE: assumes we're talking to a MEM-AP, which
1654 * has a base address. There are other kinds of AP,
1655 * though they're not common for now. This should
1656 * use the ID register to verify it's a MEM-AP.
1657 */
1658 dap_ap_read_reg_u32(swjdp, AP_REG_BASE, &baseaddr);
1659 retval = jtagdp_transaction_endcheck(swjdp);
1660 command_print(CMD_CTX, "0x%8.8" PRIx32, baseaddr);
1661
1662 if (apselsave != apsel)
1663 dap_ap_select(swjdp, apselsave);
1664
1665 return retval;
1666 }
1667
1668 DAP_COMMAND_HANDLER(dap_memaccess_command)
1669 {
1670 uint32_t memaccess_tck;
1671
1672 switch (CMD_ARGC) {
1673 case 0:
1674 memaccess_tck = swjdp->memaccess_tck;
1675 break;
1676 case 1:
1677 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], memaccess_tck);
1678 break;
1679 default:
1680 return ERROR_COMMAND_SYNTAX_ERROR;
1681 }
1682 swjdp->memaccess_tck = memaccess_tck;
1683
1684 command_print(CMD_CTX, "memory bus access delay set to %" PRIi32 " tck",
1685 swjdp->memaccess_tck);
1686
1687 return ERROR_OK;
1688 }
1689
1690 DAP_COMMAND_HANDLER(dap_apsel_command)
1691 {
1692 uint32_t apsel, apid;
1693 int retval;
1694
1695 switch (CMD_ARGC) {
1696 case 0:
1697 apsel = 0;
1698 break;
1699 case 1:
1700 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1701 /* AP address is in bits 31:24 of DP_SELECT */
1702 if (apsel >= 256)
1703 return ERROR_INVALID_ARGUMENTS;
1704 break;
1705 default:
1706 return ERROR_COMMAND_SYNTAX_ERROR;
1707 }
1708
1709 dap_ap_select(swjdp, apsel);
1710 dap_ap_read_reg_u32(swjdp, AP_REG_IDR, &apid);
1711 retval = jtagdp_transaction_endcheck(swjdp);
1712 command_print(CMD_CTX, "ap %" PRIi32 " selected, identification register 0x%8.8" PRIx32,
1713 apsel, apid);
1714
1715 return retval;
1716 }
1717
1718 DAP_COMMAND_HANDLER(dap_apid_command)
1719 {
1720 uint32_t apsel, apselsave, apid;
1721 int retval;
1722
1723 apselsave = swjdp->apsel;
1724 switch (CMD_ARGC) {
1725 case 0:
1726 apsel = swjdp->apsel;
1727 break;
1728 case 1:
1729 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1730 /* AP address is in bits 31:24 of DP_SELECT */
1731 if (apsel >= 256)
1732 return ERROR_INVALID_ARGUMENTS;
1733 break;
1734 default:
1735 return ERROR_COMMAND_SYNTAX_ERROR;
1736 }
1737
1738 if (apselsave != apsel)
1739 dap_ap_select(swjdp, apsel);
1740
1741 dap_ap_read_reg_u32(swjdp, AP_REG_IDR, &apid);
1742 retval = jtagdp_transaction_endcheck(swjdp);
1743 command_print(CMD_CTX, "0x%8.8" PRIx32, apid);
1744 if (apselsave != apsel)
1745 dap_ap_select(swjdp, apselsave);
1746
1747 return retval;
1748 }

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)