arm: Mis-aligned data issue fix.
[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-2010 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 * This programming interface allows DAP pipelined operations through a
47 * transaction queue. This primarily affects AP operations (such as using
48 * a MEM-AP to access memory or registers). If the current transaction has
49 * not finished by the time the next one must begin, and the ORUNDETECT bit
50 * is set in the DP_CTRL_STAT register, the SSTICKYORUN status is set and
51 * further AP operations will fail. There are two basic methods to avoid
52 * such overrun errors. One involves polling for status instead of using
53 * transaction piplining. The other involves adding delays to ensure the
54 * AP has enough time to complete one operation before starting the next
55 * one. (For JTAG these delays are controlled by memaccess_tck.)
56 */
57
58 /*
59 * Relevant specifications from ARM include:
60 *
61 * ARM(tm) Debug Interface v5 Architecture Specification ARM IHI 0031A
62 * CoreSight(tm) v1.0 Architecture Specification ARM IHI 0029B
63 *
64 * CoreSight(tm) DAP-Lite TRM, ARM DDI 0316D
65 * Cortex-M3(tm) TRM, ARM DDI 0337G
66 */
67
68 #ifdef HAVE_CONFIG_H
69 #include "config.h"
70 #endif
71
72 #include "jtag/interface.h"
73 #include "arm.h"
74 #include "arm_adi_v5.h"
75 #include <helper/time_support.h>
76
77 /* ARM ADI Specification requires at least 10 bits used for TAR autoincrement */
78
79 /*
80 uint32_t tar_block_size(uint32_t address)
81 Return the largest block starting at address that does not cross a tar block size alignment boundary
82 */
83 static uint32_t max_tar_block_size(uint32_t tar_autoincr_block, uint32_t address)
84 {
85 return (tar_autoincr_block - ((tar_autoincr_block - 1) & address)) >> 2;
86 }
87
88 /***************************************************************************
89 * *
90 * DP and MEM-AP register access through APACC and DPACC *
91 * *
92 ***************************************************************************/
93
94 /**
95 * Select one of the APs connected to the specified DAP. The
96 * selection is implicitly used with future AP transactions.
97 * This is a NOP if the specified AP is already selected.
98 *
99 * @param dap The DAP
100 * @param apsel Number of the AP to (implicitly) use with further
101 * transactions. This normally identifies a MEM-AP.
102 */
103 void dap_ap_select(struct adiv5_dap *dap, uint8_t ap)
104 {
105 uint32_t new_ap = (ap << 24) & 0xFF000000;
106
107 if (new_ap != dap->ap_current) {
108 dap->ap_current = new_ap;
109 /* Switching AP invalidates cached values.
110 * Values MUST BE UPDATED BEFORE AP ACCESS.
111 */
112 dap->ap_bank_value = -1;
113 dap->ap_csw_value = -1;
114 dap->ap_tar_value = -1;
115 }
116 }
117
118 /**
119 * Queue transactions setting up transfer parameters for the
120 * currently selected MEM-AP.
121 *
122 * Subsequent transfers using registers like AP_REG_DRW or AP_REG_BD2
123 * initiate data reads or writes using memory or peripheral addresses.
124 * If the CSW is configured for it, the TAR may be automatically
125 * incremented after each transfer.
126 *
127 * @todo Rename to reflect it being specifically a MEM-AP function.
128 *
129 * @param dap The DAP connected to the MEM-AP.
130 * @param csw MEM-AP Control/Status Word (CSW) register to assign. If this
131 * matches the cached value, the register is not changed.
132 * @param tar MEM-AP Transfer Address Register (TAR) to assign. If this
133 * matches the cached address, the register is not changed.
134 *
135 * @return ERROR_OK if the transaction was properly queued, else a fault code.
136 */
137 int dap_setup_accessport(struct adiv5_dap *dap, uint32_t csw, uint32_t tar)
138 {
139 int retval;
140
141 csw = csw | CSW_DBGSWENABLE | CSW_MASTER_DEBUG | CSW_HPROT;
142 if (csw != dap->ap_csw_value) {
143 /* LOG_DEBUG("DAP: Set CSW %x",csw); */
144 retval = dap_queue_ap_write(dap, AP_REG_CSW, csw);
145 if (retval != ERROR_OK)
146 return retval;
147 dap->ap_csw_value = csw;
148 }
149 if (tar != dap->ap_tar_value) {
150 /* LOG_DEBUG("DAP: Set TAR %x",tar); */
151 retval = dap_queue_ap_write(dap, AP_REG_TAR, tar);
152 if (retval != ERROR_OK)
153 return retval;
154 dap->ap_tar_value = tar;
155 }
156 /* Disable TAR cache when autoincrementing */
157 if (csw & CSW_ADDRINC_MASK)
158 dap->ap_tar_value = -1;
159 return ERROR_OK;
160 }
161
162 /**
163 * Asynchronous (queued) read of a word from memory or a system register.
164 *
165 * @param dap The DAP connected to the MEM-AP performing the read.
166 * @param address Address of the 32-bit word to read; it must be
167 * readable by the currently selected MEM-AP.
168 * @param value points to where the word will be stored when the
169 * transaction queue is flushed (assuming no errors).
170 *
171 * @return ERROR_OK for success. Otherwise a fault code.
172 */
173 int mem_ap_read_u32(struct adiv5_dap *dap, uint32_t address,
174 uint32_t *value)
175 {
176 int retval;
177
178 /* Use banked addressing (REG_BDx) to avoid some link traffic
179 * (updating TAR) when reading several consecutive addresses.
180 */
181 retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_OFF,
182 address & 0xFFFFFFF0);
183 if (retval != ERROR_OK)
184 return retval;
185
186 return dap_queue_ap_read(dap, AP_REG_BD0 | (address & 0xC), value);
187 }
188
189 /**
190 * Synchronous read of a word from memory or a system register.
191 * As a side effect, this flushes any queued transactions.
192 *
193 * @param dap The DAP connected to the MEM-AP performing the read.
194 * @param address Address of the 32-bit word to read; it must be
195 * readable by the currently selected MEM-AP.
196 * @param value points to where the result will be stored.
197 *
198 * @return ERROR_OK for success; *value holds the result.
199 * Otherwise a fault code.
200 */
201 int mem_ap_read_atomic_u32(struct adiv5_dap *dap, uint32_t address,
202 uint32_t *value)
203 {
204 int retval;
205
206 retval = mem_ap_read_u32(dap, address, value);
207 if (retval != ERROR_OK)
208 return retval;
209
210 return dap_run(dap);
211 }
212
213 /**
214 * Asynchronous (queued) write of a word to memory or a system register.
215 *
216 * @param dap The DAP connected to the MEM-AP.
217 * @param address Address to be written; it must be writable by
218 * the currently selected MEM-AP.
219 * @param value Word that will be written to the address when transaction
220 * queue is flushed (assuming no errors).
221 *
222 * @return ERROR_OK for success. Otherwise a fault code.
223 */
224 int mem_ap_write_u32(struct adiv5_dap *dap, uint32_t address,
225 uint32_t value)
226 {
227 int retval;
228
229 /* Use banked addressing (REG_BDx) to avoid some link traffic
230 * (updating TAR) when writing several consecutive addresses.
231 */
232 retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_OFF,
233 address & 0xFFFFFFF0);
234 if (retval != ERROR_OK)
235 return retval;
236
237 return dap_queue_ap_write(dap, AP_REG_BD0 | (address & 0xC),
238 value);
239 }
240
241 /**
242 * Synchronous write of a word to memory or a system register.
243 * As a side effect, this flushes any queued transactions.
244 *
245 * @param dap The DAP connected to the MEM-AP.
246 * @param address Address to be written; it must be writable by
247 * the currently selected MEM-AP.
248 * @param value Word that will be written.
249 *
250 * @return ERROR_OK for success; the data was written. Otherwise a fault code.
251 */
252 int mem_ap_write_atomic_u32(struct adiv5_dap *dap, uint32_t address,
253 uint32_t value)
254 {
255 int retval = mem_ap_write_u32(dap, address, value);
256
257 if (retval != ERROR_OK)
258 return retval;
259
260 return dap_run(dap);
261 }
262
263 /*****************************************************************************
264 * *
265 * mem_ap_write_buf(struct adiv5_dap *dap, uint8_t *buffer, int count, uint32_t address) *
266 * *
267 * Write a buffer in target order (little endian) *
268 * *
269 *****************************************************************************/
270 int mem_ap_write_buf_u32(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
271 {
272 int wcount, blocksize, writecount, errorcount = 0, retval = ERROR_OK;
273 uint32_t adr = address;
274 const uint8_t *pBuffer = buffer;
275
276 count >>= 2;
277 wcount = count;
278
279 /* if we have an unaligned access - reorder data */
280 if (adr & 0x3u) {
281 for (writecount = 0; writecount < count; writecount++) {
282 int i;
283 uint32_t outvalue;
284 memcpy(&outvalue, pBuffer, sizeof(uint32_t));
285
286 for (i = 0; i < 4; i++) {
287 *((uint8_t *)pBuffer + (adr & 0x3)) = outvalue;
288 outvalue >>= 8;
289 adr++;
290 }
291 pBuffer += sizeof(uint32_t);
292 }
293 }
294
295 while (wcount > 0) {
296 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
297 blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
298 if (wcount < blocksize)
299 blocksize = wcount;
300
301 /* handle unaligned data at 4k boundary */
302 if (blocksize == 0)
303 blocksize = 1;
304
305 retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE, address);
306 if (retval != ERROR_OK)
307 return retval;
308
309 for (writecount = 0; writecount < blocksize; writecount++) {
310 uint32_t tmp;
311 tmp = buf_get_u32(buffer + 4 * writecount, 0, 32);
312 retval = dap_queue_ap_write(dap, AP_REG_DRW, tmp);
313 if (retval != ERROR_OK)
314 break;
315 }
316
317 retval = dap_run(dap);
318 if (retval == ERROR_OK) {
319 wcount = wcount - blocksize;
320 address = address + 4 * blocksize;
321 buffer = buffer + 4 * blocksize;
322 } else
323 errorcount++;
324
325 if (errorcount > 1) {
326 LOG_WARNING("Block write error address 0x%" PRIx32 ", wcount 0x%x", address, wcount);
327 return retval;
328 }
329 }
330
331 return retval;
332 }
333
334 static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
335 const uint8_t *buffer, int count, uint32_t address)
336 {
337 int retval = ERROR_OK;
338 int wcount, blocksize, writecount, i;
339
340 wcount = count >> 1;
341
342 while (wcount > 0) {
343 int nbytes;
344
345 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
346 blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
347
348 if (wcount < blocksize)
349 blocksize = wcount;
350
351 /* handle unaligned data at 4k boundary */
352 if (blocksize == 0)
353 blocksize = 1;
354
355 retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
356 if (retval != ERROR_OK)
357 return retval;
358 writecount = blocksize;
359
360 do {
361 nbytes = MIN((writecount << 1), 4);
362
363 if (nbytes < 4) {
364 retval = mem_ap_write_buf_u16(dap, buffer,
365 nbytes, address);
366 if (retval != ERROR_OK) {
367 LOG_WARNING("Block write error address "
368 "0x%" PRIx32 ", count 0x%x",
369 address, count);
370 return retval;
371 }
372
373 address += nbytes >> 1;
374 } else {
375 uint32_t outvalue;
376 memcpy(&outvalue, buffer, sizeof(uint32_t));
377
378 for (i = 0; i < nbytes; i++) {
379 *((uint8_t *)buffer + (address & 0x3)) = outvalue;
380 outvalue >>= 8;
381 address++;
382 }
383
384 memcpy(&outvalue, buffer, sizeof(uint32_t));
385 retval = dap_queue_ap_write(dap,
386 AP_REG_DRW, outvalue);
387 if (retval != ERROR_OK)
388 break;
389
390 retval = dap_run(dap);
391 if (retval != ERROR_OK) {
392 LOG_WARNING("Block write error address "
393 "0x%" PRIx32 ", count 0x%x",
394 address, count);
395 return retval;
396 }
397 }
398
399 buffer += nbytes >> 1;
400 writecount -= nbytes >> 1;
401
402 } while (writecount);
403 wcount -= blocksize;
404 }
405
406 return retval;
407 }
408
409 int mem_ap_write_buf_u16(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
410 {
411 int retval = ERROR_OK;
412
413 if (count >= 4)
414 return mem_ap_write_buf_packed_u16(dap, buffer, count, address);
415
416 while (count > 0) {
417 retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
418 if (retval != ERROR_OK)
419 return retval;
420 uint16_t svalue;
421 memcpy(&svalue, buffer, sizeof(uint16_t));
422 uint32_t outvalue = (uint32_t)svalue << 8 * (address & 0x3);
423 retval = dap_queue_ap_write(dap, AP_REG_DRW, outvalue);
424 if (retval != ERROR_OK)
425 break;
426
427 retval = dap_run(dap);
428 if (retval != ERROR_OK)
429 break;
430
431 count -= 2;
432 address += 2;
433 buffer += 2;
434 }
435
436 return retval;
437 }
438
439 static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
440 const uint8_t *buffer, int count, uint32_t address)
441 {
442 int retval = ERROR_OK;
443 int wcount, blocksize, writecount, i;
444
445 wcount = count;
446
447 while (wcount > 0) {
448 int nbytes;
449
450 /* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
451 blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
452
453 if (wcount < blocksize)
454 blocksize = wcount;
455
456 retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
457 if (retval != ERROR_OK)
458 return retval;
459 writecount = blocksize;
460
461 do {
462 nbytes = MIN(writecount, 4);
463
464 if (nbytes < 4) {
465 retval = mem_ap_write_buf_u8(dap, buffer, nbytes, address);
466 if (retval != ERROR_OK) {
467 LOG_WARNING("Block write error address "
468 "0x%" PRIx32 ", count 0x%x",
469 address, count);
470 return retval;
471 }
472
473 address += nbytes;
474 } else {
475 uint32_t outvalue;
476 memcpy(&outvalue, buffer, sizeof(uint32_t));
477
478 for (i = 0; i < nbytes; i++) {
479 *((uint8_t *)buffer + (address & 0x3)) = outvalue;
480 outvalue >>= 8;
481 address++;
482 }
483
484 memcpy(&outvalue, buffer, sizeof(uint32_t));
485 retval = dap_queue_ap_write(dap,
486 AP_REG_DRW, outvalue);
487 if (retval != ERROR_OK)
488 break;
489
490 retval = dap_run(dap);
491 if (retval != ERROR_OK) {
492 LOG_WARNING("Block write error address "
493 "0x%" PRIx32 ", count 0x%x",
494 address, count);
495 return retval;
496 }
497 }
498
499 buffer += nbytes;
500 writecount -= nbytes;
501
502 } while (writecount);
503 wcount -= blocksize;
504 }
505
506 return retval;
507 }
508
509 int mem_ap_write_buf_u8(struct adiv5_dap *dap, const uint8_t *buffer, int count, uint32_t address)
510 {
511 int retval = ERROR_OK;
512
513 if (count >= 4)
514 return mem_ap_write_buf_packed_u8(dap, buffer, count, address);
515
516 while (count > 0) {
517 retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
518 if (retval != ERROR_OK)
519 return retval;
520 uint32_t outvalue = (uint32_t)*buffer << 8 * (address & 0x3);
521 retval = dap_queue_ap_write(dap, AP_REG_DRW, outvalue);
522 if (retval != ERROR_OK)
523 break;
524
525 retval = dap_run(dap);
526 if (retval != ERROR_OK)
527 break;
528
529 count--;
530 address++;
531 buffer++;
532 }
533
534 return retval;
535 }
536
537 /* FIXME don't import ... this is a temporary workaround for the
538 * mem_ap_read_buf_u32() mess, until it's no longer JTAG-specific.
539 */
540 extern int adi_jtag_dp_scan(struct adiv5_dap *dap,
541 uint8_t instr, uint8_t reg_addr, uint8_t RnW,
542 uint8_t *outvalue, uint8_t *invalue, uint8_t *ack);
543
544 /**
545 * Synchronously read a block of 32-bit words into a buffer
546 * @param dap The DAP connected to the MEM-AP.
547 * @param buffer where the words will be stored (in host byte order).
548 * @param count How many words to read.
549 * @param address Memory address from which to read words; all the
550 * words must be readable by the currently selected MEM-AP.
551 */
552 int mem_ap_read_buf_u32(struct adiv5_dap *dap, uint8_t *buffer,
553 int count, uint32_t address)
554 {
555 int wcount, blocksize, readcount, errorcount = 0, retval = ERROR_OK;
556 uint32_t adr = address;
557 uint8_t *pBuffer = buffer;
558
559 count >>= 2;
560 wcount = count;
561
562 while (wcount > 0) {
563 /* Adjust to read blocks within boundaries aligned to the
564 * TAR autoincrement size (at least 2^10). Autoincrement
565 * mode avoids an extra per-word roundtrip to update TAR.
566 */
567 blocksize = max_tar_block_size(dap->tar_autoincr_block,
568 address);
569 if (wcount < blocksize)
570 blocksize = wcount;
571
572 /* handle unaligned data at 4k boundary */
573 if (blocksize == 0)
574 blocksize = 1;
575
576 retval = dap_setup_accessport(dap, CSW_32BIT | CSW_ADDRINC_SINGLE,
577 address);
578 if (retval != ERROR_OK)
579 return retval;
580
581 /* FIXME remove these three calls to adi_jtag_dp_scan(),
582 * so this routine becomes transport-neutral. Be careful
583 * not to cause performance problems with JTAG; would it
584 * suffice to loop over dap_queue_ap_read(), or would that
585 * be slower when JTAG is the chosen transport?
586 */
587
588 /* Scan out first read */
589 retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
590 DPAP_READ, 0, NULL, NULL);
591 if (retval != ERROR_OK)
592 return retval;
593 for (readcount = 0; readcount < blocksize - 1; readcount++) {
594 /* Scan out next read; scan in posted value for the
595 * previous one. Assumes read is acked "OK/FAULT",
596 * and CTRL_STAT says that meant "OK".
597 */
598 retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
599 DPAP_READ, 0, buffer + 4 * readcount,
600 &dap->ack);
601 if (retval != ERROR_OK)
602 return retval;
603 }
604
605 /* Scan in last posted value; RDBUFF has no other effect,
606 * assuming ack is OK/FAULT and CTRL_STAT says "OK".
607 */
608 retval = adi_jtag_dp_scan(dap, JTAG_DP_DPACC, DP_RDBUFF,
609 DPAP_READ, 0, buffer + 4 * readcount,
610 &dap->ack);
611 if (retval != ERROR_OK)
612 return retval;
613
614 retval = dap_run(dap);
615 if (retval != ERROR_OK) {
616 errorcount++;
617 if (errorcount <= 1) {
618 /* try again */
619 continue;
620 }
621 LOG_WARNING("Block read error address 0x%" PRIx32, address);
622 return retval;
623 }
624 wcount = wcount - blocksize;
625 address += 4 * blocksize;
626 buffer += 4 * blocksize;
627 }
628
629 /* if we have an unaligned access - reorder data */
630 if (adr & 0x3u) {
631 for (readcount = 0; readcount < count; readcount++) {
632 int i;
633 uint32_t data;
634 memcpy(&data, pBuffer, sizeof(uint32_t));
635
636 for (i = 0; i < 4; i++) {
637 *((uint8_t *)pBuffer) =
638 (data >> 8 * (adr & 0x3));
639 pBuffer++;
640 adr++;
641 }
642 }
643 }
644
645 return retval;
646 }
647
648 static int mem_ap_read_buf_packed_u16(struct adiv5_dap *dap,
649 uint8_t *buffer, int count, uint32_t address)
650 {
651 uint32_t invalue;
652 int retval = ERROR_OK;
653 int wcount, blocksize, readcount, i;
654
655 wcount = count >> 1;
656
657 while (wcount > 0) {
658 int nbytes;
659
660 /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
661 blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
662 if (wcount < blocksize)
663 blocksize = wcount;
664
665 retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_PACKED, address);
666 if (retval != ERROR_OK)
667 return retval;
668
669 /* handle unaligned data at 4k boundary */
670 if (blocksize == 0)
671 blocksize = 1;
672 readcount = blocksize;
673
674 do {
675 retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
676 if (retval != ERROR_OK)
677 return retval;
678 retval = dap_run(dap);
679 if (retval != ERROR_OK) {
680 LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
681 return retval;
682 }
683
684 nbytes = MIN((readcount << 1), 4);
685
686 for (i = 0; i < nbytes; i++) {
687 *((uint8_t *)buffer) = (invalue >> 8 * (address & 0x3));
688 buffer++;
689 address++;
690 }
691
692 readcount -= (nbytes >> 1);
693 } while (readcount);
694 wcount -= blocksize;
695 }
696
697 return retval;
698 }
699
700 /**
701 * Synchronously read a block of 16-bit halfwords into a buffer
702 * @param dap The DAP connected to the MEM-AP.
703 * @param buffer where the halfwords will be stored (in host byte order).
704 * @param count How many halfwords to read.
705 * @param address Memory address from which to read words; all the
706 * words must be readable by the currently selected MEM-AP.
707 */
708 int mem_ap_read_buf_u16(struct adiv5_dap *dap, uint8_t *buffer,
709 int count, uint32_t address)
710 {
711 uint32_t invalue, i;
712 int retval = ERROR_OK;
713
714 if (count >= 4)
715 return mem_ap_read_buf_packed_u16(dap, buffer, count, address);
716
717 while (count > 0) {
718 retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
719 if (retval != ERROR_OK)
720 return retval;
721 retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
722 if (retval != ERROR_OK)
723 break;
724
725 retval = dap_run(dap);
726 if (retval != ERROR_OK)
727 break;
728
729 if (address & 0x1) {
730 for (i = 0; i < 2; i++) {
731 *((uint8_t *)buffer) = (invalue >> 8 * (address & 0x3));
732 buffer++;
733 address++;
734 }
735 } else {
736 uint16_t svalue = (invalue >> 8 * (address & 0x3));
737 memcpy(buffer, &svalue, sizeof(uint16_t));
738 address += 2;
739 buffer += 2;
740 }
741 count -= 2;
742 }
743
744 return retval;
745 }
746
747 /* FIX!!! is this a potential performance bottleneck w.r.t. requiring too many
748 * roundtrips when jtag_execute_queue() has a large overhead(e.g. for USB)s?
749 *
750 * The solution is to arrange for a large out/in scan in this loop and
751 * and convert data afterwards.
752 */
753 static int mem_ap_read_buf_packed_u8(struct adiv5_dap *dap,
754 uint8_t *buffer, int count, uint32_t address)
755 {
756 uint32_t invalue;
757 int retval = ERROR_OK;
758 int wcount, blocksize, readcount, i;
759
760 wcount = count;
761
762 while (wcount > 0) {
763 int nbytes;
764
765 /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
766 blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
767
768 if (wcount < blocksize)
769 blocksize = wcount;
770
771 retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_PACKED, address);
772 if (retval != ERROR_OK)
773 return retval;
774 readcount = blocksize;
775
776 do {
777 retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
778 if (retval != ERROR_OK)
779 return retval;
780 retval = dap_run(dap);
781 if (retval != ERROR_OK) {
782 LOG_WARNING("Block read error address 0x%" PRIx32 ", count 0x%x", address, count);
783 return retval;
784 }
785
786 nbytes = MIN(readcount, 4);
787
788 for (i = 0; i < nbytes; i++) {
789 *((uint8_t *)buffer) = (invalue >> 8 * (address & 0x3));
790 buffer++;
791 address++;
792 }
793
794 readcount -= nbytes;
795 } while (readcount);
796 wcount -= blocksize;
797 }
798
799 return retval;
800 }
801
802 /**
803 * Synchronously read a block of bytes into a buffer
804 * @param dap The DAP connected to the MEM-AP.
805 * @param buffer where the bytes will be stored.
806 * @param count How many bytes to read.
807 * @param address Memory address from which to read data; all the
808 * data must be readable by the currently selected MEM-AP.
809 */
810 int mem_ap_read_buf_u8(struct adiv5_dap *dap, uint8_t *buffer,
811 int count, uint32_t address)
812 {
813 uint32_t invalue;
814 int retval = ERROR_OK;
815
816 if (count >= 4)
817 return mem_ap_read_buf_packed_u8(dap, buffer, count, address);
818
819 while (count > 0) {
820 retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
821 if (retval != ERROR_OK)
822 return retval;
823 retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
824 if (retval != ERROR_OK)
825 return retval;
826 retval = dap_run(dap);
827 if (retval != ERROR_OK)
828 break;
829
830 *((uint8_t *)buffer) = (invalue >> 8 * (address & 0x3));
831 count--;
832 address++;
833 buffer++;
834 }
835
836 return retval;
837 }
838
839 /*--------------------------------------------------------------------*/
840 /* Wrapping function with selection of AP */
841 /*--------------------------------------------------------------------*/
842 int mem_ap_sel_read_u32(struct adiv5_dap *swjdp, uint8_t ap,
843 uint32_t address, uint32_t *value)
844 {
845 dap_ap_select(swjdp, ap);
846 return mem_ap_read_u32(swjdp, address, value);
847 }
848
849 int mem_ap_sel_write_u32(struct adiv5_dap *swjdp, uint8_t ap,
850 uint32_t address, uint32_t value)
851 {
852 dap_ap_select(swjdp, ap);
853 return mem_ap_write_u32(swjdp, address, value);
854 }
855
856 int mem_ap_sel_read_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
857 uint32_t address, uint32_t *value)
858 {
859 dap_ap_select(swjdp, ap);
860 return mem_ap_read_atomic_u32(swjdp, address, value);
861 }
862
863 int mem_ap_sel_write_atomic_u32(struct adiv5_dap *swjdp, uint8_t ap,
864 uint32_t address, uint32_t value)
865 {
866 dap_ap_select(swjdp, ap);
867 return mem_ap_write_atomic_u32(swjdp, address, value);
868 }
869
870 int mem_ap_sel_read_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
871 uint8_t *buffer, int count, uint32_t address)
872 {
873 dap_ap_select(swjdp, ap);
874 return mem_ap_read_buf_u8(swjdp, buffer, count, address);
875 }
876
877 int mem_ap_sel_read_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
878 uint8_t *buffer, int count, uint32_t address)
879 {
880 dap_ap_select(swjdp, ap);
881 return mem_ap_read_buf_u16(swjdp, buffer, count, address);
882 }
883
884 int mem_ap_sel_read_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
885 uint8_t *buffer, int count, uint32_t address)
886 {
887 dap_ap_select(swjdp, ap);
888 return mem_ap_read_buf_u32(swjdp, buffer, count, address);
889 }
890
891 int mem_ap_sel_write_buf_u8(struct adiv5_dap *swjdp, uint8_t ap,
892 const uint8_t *buffer, int count, uint32_t address)
893 {
894 dap_ap_select(swjdp, ap);
895 return mem_ap_write_buf_u8(swjdp, buffer, count, address);
896 }
897
898 int mem_ap_sel_write_buf_u16(struct adiv5_dap *swjdp, uint8_t ap,
899 const uint8_t *buffer, int count, uint32_t address)
900 {
901 dap_ap_select(swjdp, ap);
902 return mem_ap_write_buf_u16(swjdp, buffer, count, address);
903 }
904
905 int mem_ap_sel_write_buf_u32(struct adiv5_dap *swjdp, uint8_t ap,
906 const uint8_t *buffer, int count, uint32_t address)
907 {
908 dap_ap_select(swjdp, ap);
909 return mem_ap_write_buf_u32(swjdp, buffer, count, address);
910 }
911
912 #define MDM_REG_STAT 0x00
913 #define MDM_REG_CTRL 0x04
914 #define MDM_REG_ID 0xfc
915
916 #define MDM_STAT_FMEACK (1<<0)
917 #define MDM_STAT_FREADY (1<<1)
918 #define MDM_STAT_SYSSEC (1<<2)
919 #define MDM_STAT_SYSRES (1<<3)
920 #define MDM_STAT_FMEEN (1<<5)
921 #define MDM_STAT_BACKDOOREN (1<<6)
922 #define MDM_STAT_LPEN (1<<7)
923 #define MDM_STAT_VLPEN (1<<8)
924 #define MDM_STAT_LLSMODEXIT (1<<9)
925 #define MDM_STAT_VLLSXMODEXIT (1<<10)
926 #define MDM_STAT_CORE_HALTED (1<<16)
927 #define MDM_STAT_CORE_SLEEPDEEP (1<<17)
928 #define MDM_STAT_CORESLEEPING (1<<18)
929
930 #define MEM_CTRL_FMEIP (1<<0)
931 #define MEM_CTRL_DBG_DIS (1<<1)
932 #define MEM_CTRL_DBG_REQ (1<<2)
933 #define MEM_CTRL_SYS_RES_REQ (1<<3)
934 #define MEM_CTRL_CORE_HOLD_RES (1<<4)
935 #define MEM_CTRL_VLLSX_DBG_REQ (1<<5)
936 #define MEM_CTRL_VLLSX_DBG_ACK (1<<6)
937 #define MEM_CTRL_VLLSX_STAT_ACK (1<<7)
938
939 /**
940 *
941 */
942 int dap_syssec_kinetis_mdmap(struct adiv5_dap *dap)
943 {
944 uint32_t val;
945 int retval;
946 enum reset_types jtag_reset_config = jtag_get_reset_config();
947
948 dap_ap_select(dap, 1);
949
950 /* first check mdm-ap id register */
951 retval = dap_queue_ap_read(dap, MDM_REG_ID, &val);
952 if (retval != ERROR_OK)
953 return retval;
954 dap_run(dap);
955
956 if (val != 0x001C0000) {
957 LOG_DEBUG("id doesn't match %08X != 0x001C0000", val);
958 dap_ap_select(dap, 0);
959 return ERROR_FAIL;
960 }
961
962 /* read and parse status register
963 * it's important that the device is out of
964 * reset here
965 */
966 retval = dap_queue_ap_read(dap, MDM_REG_STAT, &val);
967 if (retval != ERROR_OK)
968 return retval;
969 dap_run(dap);
970
971 LOG_DEBUG("MDM_REG_STAT %08X", val);
972
973 if ((val & (MDM_STAT_SYSSEC|MDM_STAT_FREADY)) != (MDM_STAT_FREADY)) {
974 LOG_DEBUG("MDMAP: system is secured, masserase needed");
975
976 if (!(val & MDM_STAT_FMEEN))
977 LOG_DEBUG("MDMAP: masserase is disabled");
978 else {
979 /* we need to assert reset */
980 if (jtag_reset_config & RESET_HAS_SRST) {
981 /* default to asserting srst */
982 adapter_assert_reset();
983 } else {
984 LOG_DEBUG("SRST not configured");
985 dap_ap_select(dap, 0);
986 return ERROR_FAIL;
987 }
988
989 while (1) {
990 retval = dap_queue_ap_write(dap, MDM_REG_CTRL, MEM_CTRL_FMEIP);
991 if (retval != ERROR_OK)
992 return retval;
993 dap_run(dap);
994 /* read status register and wait for ready */
995 retval = dap_queue_ap_read(dap, MDM_REG_STAT, &val);
996 if (retval != ERROR_OK)
997 return retval;
998 dap_run(dap);
999 LOG_DEBUG("MDM_REG_STAT %08X", val);
1000
1001 if ((val & 1))
1002 break;
1003 }
1004
1005 while (1) {
1006 retval = dap_queue_ap_write(dap, MDM_REG_CTRL, 0);
1007 if (retval != ERROR_OK)
1008 return retval;
1009 dap_run(dap);
1010 /* read status register */
1011 retval = dap_queue_ap_read(dap, MDM_REG_STAT, &val);
1012 if (retval != ERROR_OK)
1013 return retval;
1014 dap_run(dap);
1015 LOG_DEBUG("MDM_REG_STAT %08X", val);
1016 /* read control register and wait for ready */
1017 retval = dap_queue_ap_read(dap, MDM_REG_CTRL, &val);
1018 if (retval != ERROR_OK)
1019 return retval;
1020 dap_run(dap);
1021 LOG_DEBUG("MDM_REG_CTRL %08X", val);
1022
1023 if (val == 0x00)
1024 break;
1025 }
1026 }
1027 }
1028
1029 dap_ap_select(dap, 0);
1030
1031 return ERROR_OK;
1032 }
1033
1034 /** */
1035 struct dap_syssec_filter {
1036 /** */
1037 uint32_t idcode;
1038 /** */
1039 int (*dap_init)(struct adiv5_dap *dap);
1040 };
1041
1042 /** */
1043 static struct dap_syssec_filter dap_syssec_filter_data[] = {
1044 { 0x4BA00477, dap_syssec_kinetis_mdmap }
1045 };
1046
1047 /**
1048 *
1049 */
1050 int dap_syssec(struct adiv5_dap *dap)
1051 {
1052 unsigned int i;
1053 struct jtag_tap *tap;
1054
1055 for (i = 0; i < sizeof(dap_syssec_filter_data); i++) {
1056 tap = dap->jtag_info->tap;
1057
1058 while (tap != NULL) {
1059 if (tap->hasidcode && (dap_syssec_filter_data[i].idcode == tap->idcode)) {
1060 LOG_DEBUG("DAP: mdmap_init for idcode: %08x", tap->idcode);
1061 dap_syssec_filter_data[i].dap_init(dap);
1062 }
1063 tap = tap->next_tap;
1064 }
1065 }
1066
1067 return ERROR_OK;
1068 }
1069
1070 /*--------------------------------------------------------------------------*/
1071
1072
1073 /* FIXME don't import ... just initialize as
1074 * part of DAP transport setup
1075 */
1076 extern const struct dap_ops jtag_dp_ops;
1077
1078 /*--------------------------------------------------------------------------*/
1079
1080 /**
1081 * Initialize a DAP. This sets up the power domains, prepares the DP
1082 * for further use, and arranges to use AP #0 for all AP operations
1083 * until dap_ap-select() changes that policy.
1084 *
1085 * @param dap The DAP being initialized.
1086 *
1087 * @todo Rename this. We also need an initialization scheme which account
1088 * for SWD transports not just JTAG; that will need to address differences
1089 * in layering. (JTAG is useful without any debug target; but not SWD.)
1090 * And this may not even use an AHB-AP ... e.g. DAP-Lite uses an APB-AP.
1091 */
1092 int ahbap_debugport_init(struct adiv5_dap *dap)
1093 {
1094 uint32_t ctrlstat;
1095 int cnt = 0;
1096 int retval;
1097
1098 LOG_DEBUG(" ");
1099
1100 /* JTAG-DP or SWJ-DP, in JTAG mode
1101 * ... for SWD mode this is patched as part
1102 * of link switchover
1103 */
1104 if (!dap->ops)
1105 dap->ops = &jtag_dp_ops;
1106
1107 /* Default MEM-AP setup.
1108 *
1109 * REVISIT AP #0 may be an inappropriate default for this.
1110 * Should we probe, or take a hint from the caller?
1111 * Presumably we can ignore the possibility of multiple APs.
1112 */
1113 dap->ap_current = !0;
1114 dap_ap_select(dap, 0);
1115
1116 /* DP initialization */
1117
1118 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
1119 if (retval != ERROR_OK)
1120 return retval;
1121
1122 retval = dap_queue_dp_write(dap, DP_CTRL_STAT, SSTICKYERR);
1123 if (retval != ERROR_OK)
1124 return retval;
1125
1126 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
1127 if (retval != ERROR_OK)
1128 return retval;
1129
1130 dap->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ;
1131 retval = dap_queue_dp_write(dap, DP_CTRL_STAT, dap->dp_ctrl_stat);
1132 if (retval != ERROR_OK)
1133 return retval;
1134
1135 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &ctrlstat);
1136 if (retval != ERROR_OK)
1137 return retval;
1138 retval = dap_run(dap);
1139 if (retval != ERROR_OK)
1140 return retval;
1141
1142 /* Check that we have debug power domains activated */
1143 while (!(ctrlstat & CDBGPWRUPACK) && (cnt++ < 10)) {
1144 LOG_DEBUG("DAP: wait CDBGPWRUPACK");
1145 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &ctrlstat);
1146 if (retval != ERROR_OK)
1147 return retval;
1148 retval = dap_run(dap);
1149 if (retval != ERROR_OK)
1150 return retval;
1151 alive_sleep(10);
1152 }
1153
1154 while (!(ctrlstat & CSYSPWRUPACK) && (cnt++ < 10)) {
1155 LOG_DEBUG("DAP: wait CSYSPWRUPACK");
1156 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, &ctrlstat);
1157 if (retval != ERROR_OK)
1158 return retval;
1159 retval = dap_run(dap);
1160 if (retval != ERROR_OK)
1161 return retval;
1162 alive_sleep(10);
1163 }
1164
1165 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
1166 if (retval != ERROR_OK)
1167 return retval;
1168 /* With debug power on we can activate OVERRUN checking */
1169 dap->dp_ctrl_stat = CDBGPWRUPREQ | CSYSPWRUPREQ | CORUNDETECT;
1170 retval = dap_queue_dp_write(dap, DP_CTRL_STAT, dap->dp_ctrl_stat);
1171 if (retval != ERROR_OK)
1172 return retval;
1173 retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
1174 if (retval != ERROR_OK)
1175 return retval;
1176
1177 dap_syssec(dap);
1178
1179 return ERROR_OK;
1180 }
1181
1182 /* CID interpretation -- see ARM IHI 0029B section 3
1183 * and ARM IHI 0031A table 13-3.
1184 */
1185 static const char *class_description[16] = {
1186 "Reserved", "ROM table", "Reserved", "Reserved",
1187 "Reserved", "Reserved", "Reserved", "Reserved",
1188 "Reserved", "CoreSight component", "Reserved", "Peripheral Test Block",
1189 "Reserved", "OptimoDE DESS",
1190 "Generic IP component", "PrimeCell or System component"
1191 };
1192
1193 static bool is_dap_cid_ok(uint32_t cid3, uint32_t cid2, uint32_t cid1, uint32_t cid0)
1194 {
1195 return cid3 == 0xb1 && cid2 == 0x05
1196 && ((cid1 & 0x0f) == 0) && cid0 == 0x0d;
1197 }
1198
1199 int dap_get_debugbase(struct adiv5_dap *dap, int ap,
1200 uint32_t *out_dbgbase, uint32_t *out_apid)
1201 {
1202 uint32_t ap_old;
1203 int retval;
1204 uint32_t dbgbase, apid;
1205
1206 /* AP address is in bits 31:24 of DP_SELECT */
1207 if (ap >= 256)
1208 return ERROR_COMMAND_SYNTAX_ERROR;
1209
1210 ap_old = dap->ap_current;
1211 dap_ap_select(dap, ap);
1212
1213 retval = dap_queue_ap_read(dap, AP_REG_BASE, &dbgbase);
1214 if (retval != ERROR_OK)
1215 return retval;
1216 retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
1217 if (retval != ERROR_OK)
1218 return retval;
1219 retval = dap_run(dap);
1220 if (retval != ERROR_OK)
1221 return retval;
1222
1223 /* Excavate the device ID code */
1224 struct jtag_tap *tap = dap->jtag_info->tap;
1225 while (tap != NULL) {
1226 if (tap->hasidcode)
1227 break;
1228 tap = tap->next_tap;
1229 }
1230 if (tap == NULL || !tap->hasidcode)
1231 return ERROR_OK;
1232
1233 dap_ap_select(dap, ap_old);
1234
1235 /* The asignment happens only here to prevent modification of these
1236 * values before they are certain. */
1237 *out_dbgbase = dbgbase;
1238 *out_apid = apid;
1239
1240 return ERROR_OK;
1241 }
1242
1243 int dap_lookup_cs_component(struct adiv5_dap *dap, int ap,
1244 uint32_t dbgbase, uint8_t type, uint32_t *addr)
1245 {
1246 uint32_t ap_old;
1247 uint32_t romentry, entry_offset = 0, component_base, devtype;
1248 int retval = ERROR_FAIL;
1249
1250 if (ap >= 256)
1251 return ERROR_COMMAND_SYNTAX_ERROR;
1252
1253 ap_old = dap->ap_current;
1254 dap_ap_select(dap, ap);
1255
1256 do {
1257 retval = mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) |
1258 entry_offset, &romentry);
1259 if (retval != ERROR_OK)
1260 return retval;
1261
1262 component_base = (dbgbase & 0xFFFFF000)
1263 + (romentry & 0xFFFFF000);
1264
1265 if (romentry & 0x1) {
1266 retval = mem_ap_read_atomic_u32(dap,
1267 (component_base & 0xfffff000) | 0xfcc,
1268 &devtype);
1269 if (retval != ERROR_OK)
1270 return retval;
1271 if ((devtype & 0xff) == type) {
1272 *addr = component_base;
1273 retval = ERROR_OK;
1274 break;
1275 }
1276 }
1277 entry_offset += 4;
1278 } while (romentry > 0);
1279
1280 dap_ap_select(dap, ap_old);
1281
1282 return retval;
1283 }
1284
1285 static int dap_info_command(struct command_context *cmd_ctx,
1286 struct adiv5_dap *dap, int ap)
1287 {
1288 int retval;
1289 uint32_t dbgbase = 0, apid = 0; /* Silence gcc by initializing */
1290 int romtable_present = 0;
1291 uint8_t mem_ap;
1292 uint32_t ap_old;
1293
1294 retval = dap_get_debugbase(dap, ap, &dbgbase, &apid);
1295 if (retval != ERROR_OK)
1296 return retval;
1297
1298 ap_old = dap->ap_current;
1299 dap_ap_select(dap, ap);
1300
1301 /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
1302 mem_ap = ((apid&0x10000) && ((apid&0x0F) != 0));
1303 command_print(cmd_ctx, "AP ID register 0x%8.8" PRIx32, apid);
1304 if (apid) {
1305 switch (apid&0x0F) {
1306 case 0:
1307 command_print(cmd_ctx, "\tType is JTAG-AP");
1308 break;
1309 case 1:
1310 command_print(cmd_ctx, "\tType is MEM-AP AHB");
1311 break;
1312 case 2:
1313 command_print(cmd_ctx, "\tType is MEM-AP APB");
1314 break;
1315 default:
1316 command_print(cmd_ctx, "\tUnknown AP type");
1317 break;
1318 }
1319
1320 /* NOTE: a MEM-AP may have a single CoreSight component that's
1321 * not a ROM table ... or have no such components at all.
1322 */
1323 if (mem_ap)
1324 command_print(cmd_ctx, "AP BASE 0x%8.8" PRIx32, dbgbase);
1325 } else
1326 command_print(cmd_ctx, "No AP found at this ap 0x%x", ap);
1327
1328 romtable_present = ((mem_ap) && (dbgbase != 0xFFFFFFFF));
1329 if (romtable_present) {
1330 uint32_t cid0, cid1, cid2, cid3, memtype, romentry;
1331 uint16_t entry_offset;
1332
1333 /* bit 16 of apid indicates a memory access port */
1334 if (dbgbase & 0x02)
1335 command_print(cmd_ctx, "\tValid ROM table present");
1336 else
1337 command_print(cmd_ctx, "\tROM table in legacy format");
1338
1339 /* Now we read ROM table ID registers, ref. ARM IHI 0029B sec */
1340 retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF0, &cid0);
1341 if (retval != ERROR_OK)
1342 return retval;
1343 retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF4, &cid1);
1344 if (retval != ERROR_OK)
1345 return retval;
1346 retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFF8, &cid2);
1347 if (retval != ERROR_OK)
1348 return retval;
1349 retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFFC, &cid3);
1350 if (retval != ERROR_OK)
1351 return retval;
1352 retval = mem_ap_read_u32(dap, (dbgbase&0xFFFFF000) | 0xFCC, &memtype);
1353 if (retval != ERROR_OK)
1354 return retval;
1355 retval = dap_run(dap);
1356 if (retval != ERROR_OK)
1357 return retval;
1358
1359 if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
1360 command_print(cmd_ctx, "\tCID3 0x%2.2x"
1361 ", CID2 0x%2.2x"
1362 ", CID1 0x%2.2x"
1363 ", CID0 0x%2.2x",
1364 (unsigned) cid3, (unsigned)cid2,
1365 (unsigned) cid1, (unsigned) cid0);
1366 if (memtype & 0x01)
1367 command_print(cmd_ctx, "\tMEMTYPE system memory present on bus");
1368 else
1369 command_print(cmd_ctx, "\tMEMTYPE System memory not present. "
1370 "Dedicated debug bus.");
1371
1372 /* Now we read ROM table entries from dbgbase&0xFFFFF000) | 0x000 until we get 0x00000000 */
1373 entry_offset = 0;
1374 do {
1375 retval = mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) | entry_offset, &romentry);
1376 if (retval != ERROR_OK)
1377 return retval;
1378 command_print(cmd_ctx, "\tROMTABLE[0x%x] = 0x%" PRIx32 "", entry_offset, romentry);
1379 if (romentry & 0x01) {
1380 uint32_t c_cid0, c_cid1, c_cid2, c_cid3;
1381 uint32_t c_pid0, c_pid1, c_pid2, c_pid3, c_pid4;
1382 uint32_t component_base;
1383 unsigned part_num;
1384 char *type, *full;
1385
1386 component_base = (dbgbase & 0xFFFFF000) + (romentry & 0xFFFFF000);
1387
1388 /* IDs are in last 4K section */
1389 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFE0, &c_pid0);
1390 if (retval != ERROR_OK)
1391 return retval;
1392 c_pid0 &= 0xff;
1393 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFE4, &c_pid1);
1394 if (retval != ERROR_OK)
1395 return retval;
1396 c_pid1 &= 0xff;
1397 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFE8, &c_pid2);
1398 if (retval != ERROR_OK)
1399 return retval;
1400 c_pid2 &= 0xff;
1401 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFEC, &c_pid3);
1402 if (retval != ERROR_OK)
1403 return retval;
1404 c_pid3 &= 0xff;
1405 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFD0, &c_pid4);
1406 if (retval != ERROR_OK)
1407 return retval;
1408 c_pid4 &= 0xff;
1409
1410 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFF0, &c_cid0);
1411 if (retval != ERROR_OK)
1412 return retval;
1413 c_cid0 &= 0xff;
1414 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFF4, &c_cid1);
1415 if (retval != ERROR_OK)
1416 return retval;
1417 c_cid1 &= 0xff;
1418 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFF8, &c_cid2);
1419 if (retval != ERROR_OK)
1420 return retval;
1421 c_cid2 &= 0xff;
1422 retval = mem_ap_read_atomic_u32(dap, component_base + 0xFFC, &c_cid3);
1423 if (retval != ERROR_OK)
1424 return retval;
1425 c_cid3 &= 0xff;
1426
1427 command_print(cmd_ctx, "\t\tComponent base address 0x%" PRIx32 ","
1428 "start address 0x%" PRIx32, component_base,
1429 /* component may take multiple 4K pages */
1430 component_base - 0x1000*(c_pid4 >> 4));
1431 command_print(cmd_ctx, "\t\tComponent class is 0x%x, %s",
1432 (int) (c_cid1 >> 4) & 0xf,
1433 /* See ARM IHI 0029B Table 3-3 */
1434 class_description[(c_cid1 >> 4) & 0xf]);
1435
1436 /* CoreSight component? */
1437 if (((c_cid1 >> 4) & 0x0f) == 9) {
1438 uint32_t devtype;
1439 unsigned minor;
1440 char *major = "Reserved", *subtype = "Reserved";
1441
1442 retval = mem_ap_read_atomic_u32(dap,
1443 (component_base & 0xfffff000) | 0xfcc,
1444 &devtype);
1445 if (retval != ERROR_OK)
1446 return retval;
1447 minor = (devtype >> 4) & 0x0f;
1448 switch (devtype & 0x0f) {
1449 case 0:
1450 major = "Miscellaneous";
1451 switch (minor) {
1452 case 0:
1453 subtype = "other";
1454 break;
1455 case 4:
1456 subtype = "Validation component";
1457 break;
1458 }
1459 break;
1460 case 1:
1461 major = "Trace Sink";
1462 switch (minor) {
1463 case 0:
1464 subtype = "other";
1465 break;
1466 case 1:
1467 subtype = "Port";
1468 break;
1469 case 2:
1470 subtype = "Buffer";
1471 break;
1472 }
1473 break;
1474 case 2:
1475 major = "Trace Link";
1476 switch (minor) {
1477 case 0:
1478 subtype = "other";
1479 break;
1480 case 1:
1481 subtype = "Funnel, router";
1482 break;
1483 case 2:
1484 subtype = "Filter";
1485 break;
1486 case 3:
1487 subtype = "FIFO, buffer";
1488 break;
1489 }
1490 break;
1491 case 3:
1492 major = "Trace Source";
1493 switch (minor) {
1494 case 0:
1495 subtype = "other";
1496 break;
1497 case 1:
1498 subtype = "Processor";
1499 break;
1500 case 2:
1501 subtype = "DSP";
1502 break;
1503 case 3:
1504 subtype = "Engine/Coprocessor";
1505 break;
1506 case 4:
1507 subtype = "Bus";
1508 break;
1509 }
1510 break;
1511 case 4:
1512 major = "Debug Control";
1513 switch (minor) {
1514 case 0:
1515 subtype = "other";
1516 break;
1517 case 1:
1518 subtype = "Trigger Matrix";
1519 break;
1520 case 2:
1521 subtype = "Debug Auth";
1522 break;
1523 }
1524 break;
1525 case 5:
1526 major = "Debug Logic";
1527 switch (minor) {
1528 case 0:
1529 subtype = "other";
1530 break;
1531 case 1:
1532 subtype = "Processor";
1533 break;
1534 case 2:
1535 subtype = "DSP";
1536 break;
1537 case 3:
1538 subtype = "Engine/Coprocessor";
1539 break;
1540 }
1541 break;
1542 }
1543 command_print(cmd_ctx, "\t\tType is 0x%2.2x, %s, %s",
1544 (unsigned) (devtype & 0xff),
1545 major, subtype);
1546 /* REVISIT also show 0xfc8 DevId */
1547 }
1548
1549 if (!is_dap_cid_ok(cid3, cid2, cid1, cid0))
1550 command_print(cmd_ctx,
1551 "\t\tCID3 0%2.2x"
1552 ", CID2 0%2.2x"
1553 ", CID1 0%2.2x"
1554 ", CID0 0%2.2x",
1555 (int) c_cid3,
1556 (int) c_cid2,
1557 (int)c_cid1,
1558 (int)c_cid0);
1559 command_print(cmd_ctx,
1560 "\t\tPeripheral ID[4..0] = hex "
1561 "%2.2x %2.2x %2.2x %2.2x %2.2x",
1562 (int) c_pid4, (int) c_pid3, (int) c_pid2,
1563 (int) c_pid1, (int) c_pid0);
1564
1565 /* Part number interpretations are from Cortex
1566 * core specs, the CoreSight components TRM
1567 * (ARM DDI 0314H), CoreSight System Design
1568 * Guide (ARM DGI 0012D) and ETM specs; also
1569 * from chip observation (e.g. TI SDTI).
1570 */
1571 part_num = (c_pid0 & 0xff);
1572 part_num |= (c_pid1 & 0x0f) << 8;
1573 switch (part_num) {
1574 case 0x000:
1575 type = "Cortex-M3 NVIC";
1576 full = "(Interrupt Controller)";
1577 break;
1578 case 0x001:
1579 type = "Cortex-M3 ITM";
1580 full = "(Instrumentation Trace Module)";
1581 break;
1582 case 0x002:
1583 type = "Cortex-M3 DWT";
1584 full = "(Data Watchpoint and Trace)";
1585 break;
1586 case 0x003:
1587 type = "Cortex-M3 FBP";
1588 full = "(Flash Patch and Breakpoint)";
1589 break;
1590 case 0x00c:
1591 type = "Cortex-M4 SCS";
1592 full = "(System Control Space)";
1593 break;
1594 case 0x00d:
1595 type = "CoreSight ETM11";
1596 full = "(Embedded Trace)";
1597 break;
1598 /* case 0x113: what? */
1599 case 0x120: /* from OMAP3 memmap */
1600 type = "TI SDTI";
1601 full = "(System Debug Trace Interface)";
1602 break;
1603 case 0x343: /* from OMAP3 memmap */
1604 type = "TI DAPCTL";
1605 full = "";
1606 break;
1607 case 0x906:
1608 type = "Coresight CTI";
1609 full = "(Cross Trigger)";
1610 break;
1611 case 0x907:
1612 type = "Coresight ETB";
1613 full = "(Trace Buffer)";
1614 break;
1615 case 0x908:
1616 type = "Coresight CSTF";
1617 full = "(Trace Funnel)";
1618 break;
1619 case 0x910:
1620 type = "CoreSight ETM9";
1621 full = "(Embedded Trace)";
1622 break;
1623 case 0x912:
1624 type = "Coresight TPIU";
1625 full = "(Trace Port Interface Unit)";
1626 break;
1627 case 0x921:
1628 type = "Cortex-A8 ETM";
1629 full = "(Embedded Trace)";
1630 break;
1631 case 0x922:
1632 type = "Cortex-A8 CTI";
1633 full = "(Cross Trigger)";
1634 break;
1635 case 0x923:
1636 type = "Cortex-M3 TPIU";
1637 full = "(Trace Port Interface Unit)";
1638 break;
1639 case 0x924:
1640 type = "Cortex-M3 ETM";
1641 full = "(Embedded Trace)";
1642 break;
1643 case 0x925:
1644 type = "Cortex-M4 ETM";
1645 full = "(Embedded Trace)";
1646 break;
1647 case 0x930:
1648 type = "Cortex-R4 ETM";
1649 full = "(Embedded Trace)";
1650 break;
1651 case 0x9a1:
1652 type = "Cortex-M4 TPUI";
1653 full = "(Trace Port Interface Unit)";
1654 break;
1655 case 0xc08:
1656 type = "Cortex-A8 Debug";
1657 full = "(Debug Unit)";
1658 break;
1659 default:
1660 type = "-*- unrecognized -*-";
1661 full = "";
1662 break;
1663 }
1664 command_print(cmd_ctx, "\t\tPart is %s %s",
1665 type, full);
1666 } else {
1667 if (romentry)
1668 command_print(cmd_ctx, "\t\tComponent not present");
1669 else
1670 command_print(cmd_ctx, "\t\tEnd of ROM table");
1671 }
1672 entry_offset += 4;
1673 } while (romentry > 0);
1674 } else
1675 command_print(cmd_ctx, "\tNo ROM table present");
1676 dap_ap_select(dap, ap_old);
1677
1678 return ERROR_OK;
1679 }
1680
1681 COMMAND_HANDLER(handle_dap_info_command)
1682 {
1683 struct target *target = get_current_target(CMD_CTX);
1684 struct arm *arm = target_to_arm(target);
1685 struct adiv5_dap *dap = arm->dap;
1686 uint32_t apsel;
1687
1688 switch (CMD_ARGC) {
1689 case 0:
1690 apsel = dap->apsel;
1691 break;
1692 case 1:
1693 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1694 break;
1695 default:
1696 return ERROR_COMMAND_SYNTAX_ERROR;
1697 }
1698
1699 return dap_info_command(CMD_CTX, dap, apsel);
1700 }
1701
1702 COMMAND_HANDLER(dap_baseaddr_command)
1703 {
1704 struct target *target = get_current_target(CMD_CTX);
1705 struct arm *arm = target_to_arm(target);
1706 struct adiv5_dap *dap = arm->dap;
1707
1708 uint32_t apsel, baseaddr;
1709 int retval;
1710
1711 switch (CMD_ARGC) {
1712 case 0:
1713 apsel = dap->apsel;
1714 break;
1715 case 1:
1716 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1717 /* AP address is in bits 31:24 of DP_SELECT */
1718 if (apsel >= 256)
1719 return ERROR_COMMAND_SYNTAX_ERROR;
1720 break;
1721 default:
1722 return ERROR_COMMAND_SYNTAX_ERROR;
1723 }
1724
1725 dap_ap_select(dap, apsel);
1726
1727 /* NOTE: assumes we're talking to a MEM-AP, which
1728 * has a base address. There are other kinds of AP,
1729 * though they're not common for now. This should
1730 * use the ID register to verify it's a MEM-AP.
1731 */
1732 retval = dap_queue_ap_read(dap, AP_REG_BASE, &baseaddr);
1733 if (retval != ERROR_OK)
1734 return retval;
1735 retval = dap_run(dap);
1736 if (retval != ERROR_OK)
1737 return retval;
1738
1739 command_print(CMD_CTX, "0x%8.8" PRIx32, baseaddr);
1740
1741 return retval;
1742 }
1743
1744 COMMAND_HANDLER(dap_memaccess_command)
1745 {
1746 struct target *target = get_current_target(CMD_CTX);
1747 struct arm *arm = target_to_arm(target);
1748 struct adiv5_dap *dap = arm->dap;
1749
1750 uint32_t memaccess_tck;
1751
1752 switch (CMD_ARGC) {
1753 case 0:
1754 memaccess_tck = dap->memaccess_tck;
1755 break;
1756 case 1:
1757 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], memaccess_tck);
1758 break;
1759 default:
1760 return ERROR_COMMAND_SYNTAX_ERROR;
1761 }
1762 dap->memaccess_tck = memaccess_tck;
1763
1764 command_print(CMD_CTX, "memory bus access delay set to %" PRIi32 " tck",
1765 dap->memaccess_tck);
1766
1767 return ERROR_OK;
1768 }
1769
1770 COMMAND_HANDLER(dap_apsel_command)
1771 {
1772 struct target *target = get_current_target(CMD_CTX);
1773 struct arm *arm = target_to_arm(target);
1774 struct adiv5_dap *dap = arm->dap;
1775
1776 uint32_t apsel, apid;
1777 int retval;
1778
1779 switch (CMD_ARGC) {
1780 case 0:
1781 apsel = 0;
1782 break;
1783 case 1:
1784 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1785 /* AP address is in bits 31:24 of DP_SELECT */
1786 if (apsel >= 256)
1787 return ERROR_COMMAND_SYNTAX_ERROR;
1788 break;
1789 default:
1790 return ERROR_COMMAND_SYNTAX_ERROR;
1791 }
1792
1793 dap->apsel = apsel;
1794 dap_ap_select(dap, apsel);
1795
1796 retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
1797 if (retval != ERROR_OK)
1798 return retval;
1799 retval = dap_run(dap);
1800 if (retval != ERROR_OK)
1801 return retval;
1802
1803 command_print(CMD_CTX, "ap %" PRIi32 " selected, identification register 0x%8.8" PRIx32,
1804 apsel, apid);
1805
1806 return retval;
1807 }
1808
1809 COMMAND_HANDLER(dap_apid_command)
1810 {
1811 struct target *target = get_current_target(CMD_CTX);
1812 struct arm *arm = target_to_arm(target);
1813 struct adiv5_dap *dap = arm->dap;
1814
1815 uint32_t apsel, apid;
1816 int retval;
1817
1818 switch (CMD_ARGC) {
1819 case 0:
1820 apsel = dap->apsel;
1821 break;
1822 case 1:
1823 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
1824 /* AP address is in bits 31:24 of DP_SELECT */
1825 if (apsel >= 256)
1826 return ERROR_COMMAND_SYNTAX_ERROR;
1827 break;
1828 default:
1829 return ERROR_COMMAND_SYNTAX_ERROR;
1830 }
1831
1832 dap_ap_select(dap, apsel);
1833
1834 retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
1835 if (retval != ERROR_OK)
1836 return retval;
1837 retval = dap_run(dap);
1838 if (retval != ERROR_OK)
1839 return retval;
1840
1841 command_print(CMD_CTX, "0x%8.8" PRIx32, apid);
1842
1843 return retval;
1844 }
1845
1846 static const struct command_registration dap_commands[] = {
1847 {
1848 .name = "info",
1849 .handler = handle_dap_info_command,
1850 .mode = COMMAND_EXEC,
1851 .help = "display ROM table for MEM-AP "
1852 "(default currently selected AP)",
1853 .usage = "[ap_num]",
1854 },
1855 {
1856 .name = "apsel",
1857 .handler = dap_apsel_command,
1858 .mode = COMMAND_EXEC,
1859 .help = "Set the currently selected AP (default 0) "
1860 "and display the result",
1861 .usage = "[ap_num]",
1862 },
1863 {
1864 .name = "apid",
1865 .handler = dap_apid_command,
1866 .mode = COMMAND_EXEC,
1867 .help = "return ID register from AP "
1868 "(default currently selected AP)",
1869 .usage = "[ap_num]",
1870 },
1871 {
1872 .name = "baseaddr",
1873 .handler = dap_baseaddr_command,
1874 .mode = COMMAND_EXEC,
1875 .help = "return debug base address from MEM-AP "
1876 "(default currently selected AP)",
1877 .usage = "[ap_num]",
1878 },
1879 {
1880 .name = "memaccess",
1881 .handler = dap_memaccess_command,
1882 .mode = COMMAND_EXEC,
1883 .help = "set/get number of extra tck for MEM-AP memory "
1884 "bus access [0-255]",
1885 .usage = "[cycles]",
1886 },
1887 COMMAND_REGISTRATION_DONE
1888 };
1889
1890 const struct command_registration dap_command_handlers[] = {
1891 {
1892 .name = "dap",
1893 .mode = COMMAND_EXEC,
1894 .help = "DAP command group",
1895 .usage = "",
1896 .chain = dap_commands,
1897 },
1898 COMMAND_REGISTRATION_DONE
1899 };

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)