OpenOCD
cmsis_dap.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2021 by Adrian Negreanu *
5  * groleo@gmail.com *
6  * *
7  * Copyright (C) 2018 by MickaĆ«l Thomas *
8  * mickael9@gmail.com *
9  * *
10  * Copyright (C) 2016 by Maksym Hilliaka *
11  * oter@frozen-team.com *
12  * *
13  * Copyright (C) 2016 by Phillip Pearson *
14  * pp@myelin.co.nz *
15  * *
16  * Copyright (C) 2014 by Paul Fertser *
17  * fercerpav@gmail.com *
18  * *
19  * Copyright (C) 2013 by mike brown *
20  * mike@theshedworks.org.uk *
21  * *
22  * Copyright (C) 2013 by Spencer Oliver *
23  * spen@spen-soft.co.uk *
24  ***************************************************************************/
25 
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29 
30 #include <transport/transport.h>
31 #include "helper/replacements.h"
32 #include <jtag/adapter.h>
33 #include <jtag/swd.h>
34 #include <jtag/interface.h>
35 #include <jtag/commands.h>
36 #include <jtag/tcl.h>
37 #include <target/cortex_m.h>
38 
39 #include "cmsis_dap.h"
40 
41 #define TIMEOUT_MS 6000
42 
43 /* Create a dummy backend for 'backend' command if real one does not build */
44 #if BUILD_CMSIS_DAP_USB == 0
46  .name = "usb_bulk",
47 };
48 #endif
49 
50 #if BUILD_CMSIS_DAP_HID == 0
52  .name = "hid"
53 };
54 #endif
55 
56 #if BUILD_CMSIS_DAP_TCP == 0
58  .name = "tcp"
59 };
60 #endif
61 
62 static const struct cmsis_dap_backend *const cmsis_dap_backends[] = {
66 };
67 
68 /* USB Config */
69 
70 /* Known vid/pid pairs:
71  * VID 0xc251: Keil Software
72  * PID 0xf001: LPC-Link-II CMSIS_DAP
73  * PID 0xf002: OPEN-SDA CMSIS_DAP (Freedom Board)
74  * PID 0x2722: Keil ULINK2 CMSIS-DAP
75  * PID 0x2750: Keil ULINKplus CMSIS-DAP
76  *
77  * VID 0x0d28: mbed Software
78  * PID 0x0204: MBED CMSIS-DAP
79  */
80 
81 #define MAX_USB_IDS 8
82 /* vid = pid = 0 marks the end of the list */
83 static uint16_t cmsis_dap_vid[MAX_USB_IDS + 1] = { 0 };
84 static uint16_t cmsis_dap_pid[MAX_USB_IDS + 1] = { 0 };
85 static int cmsis_dap_backend = -1;
86 static bool swd_mode;
87 static bool cmsis_dap_quirk_mode; /* enable expensive workarounds */
88 
89 /* CMSIS-DAP General Commands */
90 #define CMD_DAP_INFO 0x00
91 #define CMD_DAP_LED 0x01
92 #define CMD_DAP_CONNECT 0x02
93 #define CMD_DAP_DISCONNECT 0x03
94 #define CMD_DAP_WRITE_ABORT 0x08
95 #define CMD_DAP_DELAY 0x09
96 #define CMD_DAP_RESET_TARGET 0x0A
97 
98 /* CMD_INFO */
99 #define INFO_ID_VENDOR 0x01 /* string */
100 #define INFO_ID_PRODUCT 0x02 /* string */
101 #define INFO_ID_SERNUM 0x03 /* string */
102 #define INFO_ID_FW_VER 0x04 /* string */
103 #define INFO_ID_TD_VEND 0x05 /* string */
104 #define INFO_ID_TD_NAME 0x06 /* string */
105 #define INFO_ID_CAPS 0xf0 /* byte */
106 #define INFO_ID_PKT_CNT 0xfe /* byte */
107 #define INFO_ID_PKT_SZ 0xff /* short */
108 #define INFO_ID_SWO_BUF_SZ 0xfd /* word */
109 
110 #define INFO_CAPS_SWD BIT(0)
111 #define INFO_CAPS_JTAG BIT(1)
112 #define INFO_CAPS_SWO_UART BIT(2)
113 #define INFO_CAPS_SWO_MANCHESTER BIT(3)
114 #define INFO_CAPS_ATOMIC_CMDS BIT(4)
115 #define INFO_CAPS_TEST_DOMAIN_TIMER BIT(5)
116 #define INFO_CAPS_SWO_STREAMING_TRACE BIT(6)
117 #define INFO_CAPS_UART_PORT BIT(7)
118 #define INFO_CAPS_USB_COM_PORT BIT(8)
119 #define INFO_CAPS__NUM_CAPS 9
120 
121 /* CMD_LED */
122 #define LED_ID_CONNECT 0x00
123 #define LED_ID_RUN 0x01
124 
125 #define LED_OFF 0x00
126 #define LED_ON 0x01
127 
128 /* CMD_CONNECT */
129 #define CONNECT_DEFAULT 0x00
130 #define CONNECT_SWD 0x01
131 #define CONNECT_JTAG 0x02
132 
133 /* CMSIS-DAP Common SWD/JTAG Commands */
134 #define CMD_DAP_DELAY 0x09
135 #define CMD_DAP_SWJ_PINS 0x10
136 #define CMD_DAP_SWJ_CLOCK 0x11
137 #define CMD_DAP_SWJ_SEQ 0x12
138 
139 /*
140  * PINS
141  * Bit 0: SWCLK/TCK
142  * Bit 1: SWDIO/TMS
143  * Bit 2: TDI
144  * Bit 3: TDO
145  * Bit 5: nTRST
146  * Bit 7: nRESET
147  */
148 
149 #define SWJ_PIN_TCK (1<<0)
150 #define SWJ_PIN_TMS (1<<1)
151 #define SWJ_PIN_TDI (1<<2)
152 #define SWJ_PIN_TDO (1<<3)
153 #define SWJ_PIN_TRST (1<<5)
154 #define SWJ_PIN_SRST (1<<7)
155 
156 /* CMSIS-DAP SWD Commands */
157 #define CMD_DAP_SWD_CONFIGURE 0x13
158 #define CMD_DAP_SWD_SEQUENCE 0x1D
159 
160 /* CMSIS-DAP JTAG Commands */
161 #define CMD_DAP_JTAG_SEQ 0x14
162 #define CMD_DAP_JTAG_CONFIGURE 0x15
163 #define CMD_DAP_JTAG_IDCODE 0x16
164 
165 /* CMSIS-DAP JTAG sequence info masks */
166 /* Number of bits to clock through (0 means 64) */
167 #define DAP_JTAG_SEQ_TCK 0x3F
168 /* TMS will be set during the sequence if this bit is set */
169 #define DAP_JTAG_SEQ_TMS 0x40
170 /* TDO output will be captured if this bit is set */
171 #define DAP_JTAG_SEQ_TDO 0x80
172 
173 
174 /* CMSIS-DAP Transfer Commands */
175 #define CMD_DAP_TFER_CONFIGURE 0x04
176 #define CMD_DAP_TFER 0x05
177 #define CMD_DAP_TFER_BLOCK 0x06
178 #define CMD_DAP_TFER_ABORT 0x07
179 
180 /* DAP_TransferBlock increases the sum of command/response sizes
181  * (due to 16-bit Transfer Count) if used in a small packet.
182  * Prevent using it until we have at least r/w operations. */
183 #define CMD_DAP_TFER_BLOCK_MIN_OPS 4
184 
185 /* DAP Status Code */
186 #define DAP_OK 0
187 #define DAP_ERROR 0xFF
188 
189 /* CMSIS-DAP SWO Commands */
190 #define CMD_DAP_SWO_TRANSPORT 0x17
191 #define CMD_DAP_SWO_MODE 0x18
192 #define CMD_DAP_SWO_BAUDRATE 0x19
193 #define CMD_DAP_SWO_CONTROL 0x1A
194 #define CMD_DAP_SWO_STATUS 0x1B
195 #define CMD_DAP_SWO_DATA 0x1C
196 #define CMD_DAP_SWO_EX_STATUS 0x1E
197 
198 /* SWO transport mode for reading trace data */
199 #define DAP_SWO_TRANSPORT_NONE 0
200 #define DAP_SWO_TRANSPORT_DATA 1
201 #define DAP_SWO_TRANSPORT_WINUSB 2
202 
203 /* SWO trace capture mode */
204 #define DAP_SWO_MODE_OFF 0
205 #define DAP_SWO_MODE_UART 1
206 #define DAP_SWO_MODE_MANCHESTER 2
207 
208 /* SWO trace data capture */
209 #define DAP_SWO_CONTROL_STOP 0
210 #define DAP_SWO_CONTROL_START 1
211 
212 /* SWO trace status */
213 #define DAP_SWO_STATUS_CAPTURE_INACTIVE 0
214 #define DAP_SWO_STATUS_CAPTURE_ACTIVE 1
215 #define DAP_SWO_STATUS_CAPTURE_MASK BIT(0)
216 #define DAP_SWO_STATUS_STREAM_ERROR_MASK BIT(6)
217 #define DAP_SWO_STATUS_BUFFER_OVERRUN_MASK BIT(7)
218 
219 /* CMSIS-DAP Vendor Commands
220  * None as yet... */
221 
222 static const char * const info_caps_str[INFO_CAPS__NUM_CAPS] = {
223  "SWD supported",
224  "JTAG supported",
225  "SWO-UART supported",
226  "SWO-MANCHESTER supported",
227  "Atomic commands supported",
228  "Test domain timer supported",
229  "SWO streaming trace supported",
230  "UART communication port supported",
231  "UART via USB COM port supported",
232 };
233 
234 struct pending_scan_result {
236  unsigned int first;
238  unsigned int length;
240  uint8_t *buffer;
242  unsigned int buffer_offset;
243 };
244 
245 /* Each block in FIFO can contain up to pending_queue_len transfers */
246 static unsigned int pending_queue_len;
247 static unsigned int tfer_max_command_size;
248 static unsigned int tfer_max_response_size;
249 
250 /* pointers to buffers that will receive jtag scan results on the next flush */
251 #define MAX_PENDING_SCAN_RESULTS 256
254 
255 /* queued JTAG sequences that will be executed on the next flush */
256 #define QUEUED_SEQ_BUF_LEN (cmsis_dap_handle->packet_usable_size - 3)
257 static int queued_seq_count;
260 static uint8_t queued_seq_buf[1024]; /* TODO: make dynamic / move into cmsis object */
261 
262 static int queued_retval;
263 
265 
267 
268 
269 static int cmsis_dap_quit(void);
270 
271 static int cmsis_dap_open(void)
272 {
273  const struct cmsis_dap_backend *backend = NULL;
274 
275  struct cmsis_dap *dap = calloc(1, sizeof(struct cmsis_dap));
276  if (!dap) {
277  LOG_ERROR("unable to allocate memory");
278  return ERROR_FAIL;
279  }
280 
281  int retval = ERROR_FAIL;
282  if (cmsis_dap_backend >= 0) {
283  /* Use forced backend */
285  if (backend->open)
287  else
288  LOG_ERROR("Requested CMSIS-DAP backend is disabled by configure");
289 
290  } else {
291  /* Try all backends */
292  for (unsigned int i = 0; i < ARRAY_SIZE(cmsis_dap_backends); i++) {
294  if (!backend->open)
295  continue;
296 
298  if (retval == ERROR_OK)
299  break;
300  }
301  }
302 
303  if (retval != ERROR_OK) {
304  LOG_ERROR("unable to find a matching CMSIS-DAP device");
305  free(dap);
306  return retval;
307  }
308 
309  dap->backend = backend;
310 
311  cmsis_dap_handle = dap;
312 
313  return ERROR_OK;
314 }
315 
316 static void cmsis_dap_close(struct cmsis_dap *dap)
317 {
318  if (dap->backend) {
319  if (dap->backend->close)
320  dap->backend->close(dap);
321  dap->backend = NULL;
322  }
323 
324  free(dap->packet_buffer);
325 
326  for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++) {
327  free(dap->pending_fifo[i].transfers);
328  dap->pending_fifo[i].transfers = NULL;
329  }
330 
331  free(cmsis_dap_handle);
333 }
334 
335 static void cmsis_dap_flush_read(struct cmsis_dap *dap)
336 {
337  unsigned int i;
338  /* Some CMSIS-DAP adapters keep buffered packets over
339  * USB close/open so we need to flush up to 64 old packets
340  * to be sure all buffers are empty */
341  for (i = 0; i < 64; i++) {
342  int retval = dap->backend->read(dap, 10, CMSIS_DAP_BLOCKING);
343  if (retval == ERROR_TIMEOUT_REACHED)
344  break;
345  }
346  if (i)
347  LOG_DEBUG("Flushed %u packets", i);
348 }
349 
350 /* Send a message and receive the reply */
351 static int cmsis_dap_xfer(struct cmsis_dap *dap, int txlen)
352 {
353  if (dap->write_count + dap->read_count) {
354  LOG_ERROR("internal: queue not empty before xfer");
355  }
356  if (dap->pending_fifo_block_count) {
357  LOG_ERROR("pending %u blocks, flushing", dap->pending_fifo_block_count);
358  while (dap->pending_fifo_block_count) {
359  dap->backend->read(dap, 10, CMSIS_DAP_BLOCKING);
361  }
362  dap->pending_fifo_put_idx = 0;
363  dap->pending_fifo_get_idx = 0;
364  }
365 
366  uint8_t current_cmd = dap->command[0];
367  int retval = dap->backend->write(dap, txlen, TIMEOUT_MS);
368  if (retval < 0)
369  return retval;
370 
371  /* get reply */
372  retval = dap->backend->read(dap, TIMEOUT_MS, CMSIS_DAP_BLOCKING);
373  if (retval < 0)
374  return retval;
375 
376  uint8_t *resp = dap->response;
377  if (resp[0] == DAP_ERROR) {
378  LOG_ERROR("CMSIS-DAP command 0x%" PRIx8 " not implemented", current_cmd);
379  return ERROR_NOT_IMPLEMENTED;
380  }
381 
382  if (resp[0] != current_cmd) {
383  LOG_ERROR("CMSIS-DAP command mismatch. Sent 0x%" PRIx8
384  " received 0x%" PRIx8, current_cmd, resp[0]);
385 
386  dap->backend->cancel_all(dap);
388  return ERROR_FAIL;
389  }
390 
391  return ERROR_OK;
392 }
393 
394 static int cmsis_dap_cmd_dap_swj_pins(uint8_t pins, uint8_t mask, uint32_t delay, uint8_t *input)
395 {
396  uint8_t *command = cmsis_dap_handle->command;
397 
399  command[1] = pins;
400  command[2] = mask;
401  h_u32_to_le(&command[3], delay);
402 
403  int retval = cmsis_dap_xfer(cmsis_dap_handle, 7);
404  if (retval != ERROR_OK) {
405  LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
407  }
408 
409  if (input)
410  *input = cmsis_dap_handle->response[1];
411 
412  return ERROR_OK;
413 }
414 
415 static int cmsis_dap_cmd_dap_swj_clock(uint32_t swj_clock)
416 {
417  uint8_t *command = cmsis_dap_handle->command;
418 
419  /* set clock in Hz */
420  swj_clock *= 1000;
421 
423  h_u32_to_le(&command[1], swj_clock);
424 
425  int retval = cmsis_dap_xfer(cmsis_dap_handle, 5);
426  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
427  LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
429  }
430 
431  return ERROR_OK;
432 }
433 
434 /* clock a sequence of bits out on TMS, to change JTAG states */
435 static int cmsis_dap_cmd_dap_swj_sequence(uint8_t s_len, const uint8_t *sequence)
436 {
437  uint8_t *command = cmsis_dap_handle->command;
438 
439 #ifdef CMSIS_DAP_JTAG_DEBUG
440  LOG_DEBUG("cmsis-dap TMS sequence: len=%d", s_len);
441  for (unsigned int i = 0; i < DIV_ROUND_UP(s_len, 8); ++i)
442  printf("%02X ", sequence[i]);
443 
444  printf("\n");
445 #endif
446 
448  command[1] = s_len;
449  bit_copy(&command[2], 0, sequence, 0, s_len);
450 
451  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2 + DIV_ROUND_UP(s_len, 8));
452  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK)
453  return ERROR_FAIL;
454 
455  return ERROR_OK;
456 }
457 
458 static int cmsis_dap_cmd_dap_info(uint8_t info, uint8_t **data)
459 {
460  uint8_t *command = cmsis_dap_handle->command;
461 
462  command[0] = CMD_DAP_INFO;
463  command[1] = info;
464 
465  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
466  if (retval != ERROR_OK) {
467  LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
469  }
470 
471  *data = &cmsis_dap_handle->response[1];
472 
473  return ERROR_OK;
474 }
475 
476 static int cmsis_dap_cmd_dap_led(uint8_t led, uint8_t state)
477 {
478  uint8_t *command = cmsis_dap_handle->command;
479 
480  command[0] = CMD_DAP_LED;
481  command[1] = led;
482  command[2] = state;
483 
484  int retval = cmsis_dap_xfer(cmsis_dap_handle, 3);
485  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
486  LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
488  }
489 
490  return ERROR_OK;
491 }
492 
493 static int cmsis_dap_cmd_dap_connect(uint8_t mode)
494 {
495  uint8_t *command = cmsis_dap_handle->command;
496 
498  command[1] = mode;
499 
500  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
501  if (retval != ERROR_OK) {
502  LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
504  }
505 
506  if (cmsis_dap_handle->response[1] != mode) {
507  LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode);
509  }
510 
511  return ERROR_OK;
512 }
513 
515 {
516  uint8_t *command = cmsis_dap_handle->command;
517 
519 
520  int retval = cmsis_dap_xfer(cmsis_dap_handle, 1);
521  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
522  LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
524  }
525 
526  return ERROR_OK;
527 }
528 
529 static int cmsis_dap_cmd_dap_tfer_configure(uint8_t idle, uint16_t retry_count, uint16_t match_retry)
530 {
531  uint8_t *command = cmsis_dap_handle->command;
532 
534  command[1] = idle;
535  h_u16_to_le(&command[2], retry_count);
536  h_u16_to_le(&command[4], match_retry);
537 
538  int retval = cmsis_dap_xfer(cmsis_dap_handle, 6);
539  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
540  LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
542  }
543 
544  return ERROR_OK;
545 }
546 
547 static int cmsis_dap_cmd_dap_swd_configure(uint8_t cfg)
548 {
549  uint8_t *command = cmsis_dap_handle->command;
550 
552  command[1] = cfg;
553 
554  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
555  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
556  LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
558  }
559 
560  return ERROR_OK;
561 }
562 
563 #if 0
564 static int cmsis_dap_cmd_dap_delay(uint16_t delay_us)
565 {
566  uint8_t *command = cmsis_dap_handle->command;
567 
568  command[0] = CMD_DAP_DELAY;
570 
571  int retval = cmsis_dap_xfer(cmsis_dap_handle, 3);
572  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
573  LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
575  }
576 
577  return ERROR_OK;
578 }
579 #endif
580 
581 static int cmsis_dap_metacmd_targetsel(uint32_t instance_id)
582 {
583  uint8_t *command = cmsis_dap_handle->command;
584  const uint32_t seq_rd = 0x80, seq_wr = 0x00;
585 
586  /* SWD multi-drop requires a transfer ala CMD_DAP_TFER,
587  but with no expectation of an SWD ACK response. In
588  CMSIS-DAP v1.20 and v2.00, CMD_DAP_SWD_SEQUENCE was
589  added to allow this special sequence to be generated.
590  The purpose of this operation is to select the target
591  corresponding to the instance_id that is written */
592 
593  LOG_DEBUG_IO("DP write reg TARGETSEL %" PRIx32, instance_id);
594 
595  size_t idx = 0;
596  command[idx++] = CMD_DAP_SWD_SEQUENCE;
597  command[idx++] = 3; /* sequence count */
598 
599  /* sequence 0: packet request for TARGETSEL */
600  command[idx++] = seq_wr | 8;
601  command[idx++] = SWD_CMD_START | swd_cmd(false, false, DP_TARGETSEL) | SWD_CMD_STOP | SWD_CMD_PARK;
602 
603  /* sequence 1: read Trn ACK Trn, no expectation for target to ACK */
604  command[idx++] = seq_rd | 5;
605 
606  /* sequence 2: WDATA plus parity */
607  command[idx++] = seq_wr | (32 + 1);
608  h_u32_to_le(command + idx, instance_id);
609  idx += 4;
610  command[idx++] = parity_u32(instance_id);
611 
612  int retval = cmsis_dap_xfer(cmsis_dap_handle, idx);
613  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
614  LOG_ERROR("CMSIS-DAP command SWD_Sequence failed.");
616  }
617 
618  return ERROR_OK;
619 }
620 
627 {
628  uint8_t *command = cmsis_dap_handle->command;
629 
631  command[1] = transport;
632 
633  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
634  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
635  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Transport(%d) failed.", transport);
637  }
638 
639  return ERROR_OK;
640 }
641 
646 static int cmsis_dap_cmd_dap_swo_mode(uint8_t mode)
647 {
648  uint8_t *command = cmsis_dap_handle->command;
649 
651  command[1] = mode;
652 
653  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
654  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
655  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Mode(%d) failed.", mode);
657  }
658 
659  return ERROR_OK;
660 }
661 
672  uint32_t in_baudrate,
673  uint32_t *dev_baudrate)
674 {
675  uint8_t *command = cmsis_dap_handle->command;
676 
678  h_u32_to_le(&command[1], in_baudrate);
679 
680  int retval = cmsis_dap_xfer(cmsis_dap_handle, 5);
681  uint32_t rvbr = le_to_h_u32(&cmsis_dap_handle->response[1]);
682  if (retval != ERROR_OK || rvbr == 0) {
683  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Baudrate(%u) -> %u failed.", in_baudrate, rvbr);
684  if (dev_baudrate)
685  *dev_baudrate = 0;
687  }
688 
689  if (dev_baudrate)
690  *dev_baudrate = rvbr;
691 
692  return ERROR_OK;
693 }
694 
701 static int cmsis_dap_cmd_dap_swo_control(uint8_t control)
702 {
703  uint8_t *command = cmsis_dap_handle->command;
704 
706  command[1] = control;
707 
708  int retval = cmsis_dap_xfer(cmsis_dap_handle, 2);
709  if (retval != ERROR_OK || cmsis_dap_handle->response[1] != DAP_OK) {
710  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Control(%d) failed.", control);
712  }
713 
714  return ERROR_OK;
715 }
716 
726  uint8_t *trace_status,
727  size_t *trace_count)
728 {
729  uint8_t *command = cmsis_dap_handle->command;
730 
732 
733  int retval = cmsis_dap_xfer(cmsis_dap_handle, 1);
734  if (retval != ERROR_OK) {
735  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Status failed.");
737  }
738 
739  if (trace_status)
741  if (trace_count)
742  *trace_count = le_to_h_u32(&cmsis_dap_handle->response[2]);
743 
744  return ERROR_OK;
745 }
746 
755  size_t max_trace_count,
756  uint8_t *trace_status,
757  size_t *trace_count,
758  uint8_t *data)
759 {
760  uint8_t *command = cmsis_dap_handle->command;
761 
763  h_u16_to_le(&command[1], max_trace_count);
764 
765  int retval = cmsis_dap_xfer(cmsis_dap_handle, 3);
766  if (retval != ERROR_OK) {
767  LOG_ERROR("CMSIS-DAP: command CMD_SWO_Data failed.");
769  }
770 
772  *trace_count = le_to_h_u16(&cmsis_dap_handle->response[2]);
773 
774  if (*trace_count > 0)
775  memcpy(data, &cmsis_dap_handle->response[4], *trace_count);
776 
777  return ERROR_OK;
778 }
779 
781 {
782  for (unsigned int i = 0; i < MAX_PENDING_REQUESTS; i++)
783  dap->pending_fifo[i].transfer_count = 0;
784 
785  dap->pending_fifo_put_idx = 0;
786  dap->pending_fifo_get_idx = 0;
787  dap->pending_fifo_block_count = 0;
788 }
789 
791 {
792  dap->backend->cancel_all(dap);
795 }
796 
798 {
799  uint8_t *command = dap->command;
800  struct pending_request_block *block = &dap->pending_fifo[dap->pending_fifo_put_idx];
801 
802  assert(dap->write_count + dap->read_count == block->transfer_count);
803 
804  /* Reset packet size check counters for the next packet */
805  dap->write_count = 0;
806  dap->read_count = 0;
807 
808  LOG_DEBUG_IO("Executing %d queued transactions from FIFO index %u%s",
810  cmsis_dap_handle->swd_cmds_differ ? "" : ", same swd ops");
811 
812  if (queued_retval != ERROR_OK) {
813  LOG_DEBUG("Skipping due to previous errors: %d", queued_retval);
814  goto skip;
815  }
816 
817  if (block->transfer_count == 0) {
818  LOG_ERROR("internal: write an empty queue?!");
819  goto skip;
820  }
821 
822  bool block_cmd = !cmsis_dap_handle->swd_cmds_differ
824  block->command = block_cmd ? CMD_DAP_TFER_BLOCK : CMD_DAP_TFER;
825 
826  command[0] = block->command;
827  command[1] = 0x00; /* DAP Index */
828 
829  unsigned int idx;
830  if (block_cmd) {
831  h_u16_to_le(&command[2], block->transfer_count);
832  idx = 4; /* The first transfer will store the common DAP register */
833  } else {
834  command[2] = block->transfer_count;
835  idx = 3;
836  }
837 
838  for (unsigned int i = 0; i < block->transfer_count; i++) {
839  struct pending_transfer_result *transfer = &(block->transfers[i]);
840  uint8_t cmd = transfer->cmd;
841  uint32_t data = transfer->data;
842 
843  LOG_DEBUG_IO("%s %s reg %x %" PRIx32,
844  cmd & SWD_CMD_APNDP ? "AP" : "DP",
845  cmd & SWD_CMD_RNW ? "read" : "write",
846  (cmd & SWD_CMD_A32) >> 1, data);
847 
848  /* When proper WAIT handling is implemented in the
849  * common SWD framework, this kludge can be
850  * removed. However, this might lead to minor
851  * performance degradation as the adapter wouldn't be
852  * able to automatically retry anything (because ARM
853  * has forgotten to implement sticky error flags
854  * clearing). See also comments regarding
855  * cmsis_dap_cmd_dap_tfer_configure() and
856  * cmsis_dap_cmd_dap_swd_configure() in
857  * cmsis_dap_init().
858  */
859  if (!(cmd & SWD_CMD_RNW) &&
860  !(cmd & SWD_CMD_APNDP) &&
861  (cmd & SWD_CMD_A32) >> 1 == DP_CTRL_STAT &&
862  (data & CORUNDETECT)) {
863  LOG_DEBUG("refusing to enable sticky overrun detection");
864  data &= ~CORUNDETECT;
865  }
866 
867  if (!block_cmd || i == 0)
868  command[idx++] = (cmd >> 1) & 0x0f;
869 
870  if (!(cmd & SWD_CMD_RNW)) {
871  h_u32_to_le(&command[idx], data);
872  idx += 4;
873  }
874  }
875 
876  int retval = dap->backend->write(dap, idx, TIMEOUT_MS);
877  if (retval < 0) {
878  queued_retval = retval;
879  goto skip;
880  }
881 
882  unsigned int packet_count = cmsis_dap_quirk_mode ? 1 : dap->packet_count;
883  dap->pending_fifo_put_idx = (dap->pending_fifo_put_idx + 1) % packet_count;
885  if (dap->pending_fifo_block_count > packet_count)
886  LOG_ERROR("internal: too much pending writes %u", dap->pending_fifo_block_count);
887 
888  return;
889 
890 skip:
891  block->transfer_count = 0;
892 }
893 
894 static void cmsis_dap_swd_read_process(struct cmsis_dap *dap, enum cmsis_dap_blocking blocking)
895 {
896  int retval;
897  struct pending_request_block *block = &dap->pending_fifo[dap->pending_fifo_get_idx];
898 
899  if (dap->pending_fifo_block_count == 0) {
900  LOG_ERROR("internal: no pending write when reading?!");
901  return;
902  }
903 
904  if (queued_retval != ERROR_OK) {
905  /* keep reading blocks until the pipeline is empty */
906  retval = dap->backend->read(dap, 10, CMSIS_DAP_BLOCKING);
907  if (retval == ERROR_TIMEOUT_REACHED || retval == 0) {
908  /* timeout means that we flushed the pipeline,
909  * we can safely discard remaining pending requests */
911  return;
912  }
913  goto skip;
914  }
915 
916  /* get reply */
917  retval = dap->backend->read(dap, TIMEOUT_MS, blocking);
918  bool timeout = (retval == ERROR_TIMEOUT_REACHED || retval == 0);
919  if (timeout && blocking == CMSIS_DAP_NON_BLOCKING)
920  return;
921 
922  if (retval <= 0) {
923  LOG_DEBUG("error reading adapter response");
925  if (timeout) {
926  /* timeout means that we flushed the pipeline,
927  * we can safely discard remaining pending requests */
929  return;
930  }
931  goto skip;
932  }
933 
934  uint8_t *resp = dap->response;
935  if (resp[0] != block->command) {
936  LOG_ERROR("CMSIS-DAP command mismatch. Expected 0x%x received 0x%" PRIx8,
937  block->command, resp[0]);
940  return;
941  }
942 
943  unsigned int transfer_count;
944  unsigned int idx;
945  if (block->command == CMD_DAP_TFER_BLOCK) {
946  transfer_count = le_to_h_u16(&resp[1]);
947  idx = 3;
948  } else {
949  transfer_count = resp[1];
950  idx = 2;
951  }
952  if (resp[idx] & 0x08) {
953  LOG_DEBUG("CMSIS-DAP Protocol Error @ %d (wrong parity)", transfer_count);
955  goto skip;
956  }
957  uint8_t ack = resp[idx++] & 0x07;
958  if (ack != SWD_ACK_OK) {
959  LOG_DEBUG("SWD ack not OK @ %d %s", transfer_count,
960  ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK");
962  /* TODO: use results of transfers completed before the error occurred? */
963  goto skip;
964  }
965 
966  if (block->transfer_count != transfer_count) {
967  LOG_ERROR("CMSIS-DAP transfer count mismatch: expected %d, got %d",
971  return;
972  }
973 
974  LOG_DEBUG_IO("Received results of %d queued transactions FIFO index %u, %s mode",
976  blocking ? "blocking" : "nonblocking");
977 
978  for (unsigned int i = 0; i < transfer_count; i++) {
979  struct pending_transfer_result *transfer = &(block->transfers[i]);
980  if (transfer->cmd & SWD_CMD_RNW) {
981  static uint32_t last_read;
982  uint32_t data = le_to_h_u32(&resp[idx]);
983  uint32_t tmp = data;
984  idx += 4;
985 
986  LOG_DEBUG_IO("Read result: %" PRIx32, data);
987 
988  /* Imitate posted AP reads */
989  if ((transfer->cmd & SWD_CMD_APNDP) ||
990  ((transfer->cmd & SWD_CMD_A32) >> 1 == DP_RDBUFF)) {
991  tmp = last_read;
992  last_read = data;
993  }
994 
995  if (transfer->buffer)
996  *(uint32_t *)(transfer->buffer) = tmp;
997  }
998  }
999 
1000 skip:
1001  block->transfer_count = 0;
1002  if (!cmsis_dap_quirk_mode && dap->packet_count > 1)
1003  dap->pending_fifo_get_idx = (dap->pending_fifo_get_idx + 1) % dap->packet_count;
1004  dap->pending_fifo_block_count--;
1005 }
1006 
1007 static int cmsis_dap_swd_run_queue(void)
1008 {
1012 
1014  }
1015 
1018 
1021 
1022  int retval = queued_retval;
1024 
1025  return retval;
1026 }
1027 
1028 static unsigned int cmsis_dap_tfer_cmd_size(unsigned int write_count,
1029  unsigned int read_count, bool block_tfer)
1030 {
1031  unsigned int size;
1032  if (block_tfer) {
1033  size = 5; /* DAP_TransferBlock header */
1034  size += write_count * 4; /* data */
1035  } else {
1036  size = 3; /* DAP_Transfer header */
1037  size += write_count * (1 + 4); /* DAP register + data */
1038  size += read_count; /* DAP register */
1039  }
1040  return size;
1041 }
1042 
1043 static unsigned int cmsis_dap_tfer_resp_size(unsigned int write_count,
1044  unsigned int read_count, bool block_tfer)
1045 {
1046  unsigned int size;
1047  if (block_tfer)
1048  size = 4; /* DAP_TransferBlock response header */
1049  else
1050  size = 3; /* DAP_Transfer response header */
1051 
1052  size += read_count * 4; /* data */
1053  return size;
1054 }
1055 
1056 static void cmsis_dap_swd_queue_cmd(uint8_t cmd, uint32_t *dst, uint32_t data)
1057 {
1058  /* TARGETSEL register write cannot be queued */
1059  if (swd_cmd(false, false, DP_TARGETSEL) == cmd) {
1061 
1063  return;
1064  }
1065 
1066  /* Compute sizes of the DAP Transfer command and the expected response
1067  * for all queued and this operation */
1068  unsigned int write_count = cmsis_dap_handle->write_count;
1069  unsigned int read_count = cmsis_dap_handle->read_count;
1070  bool block_cmd;
1071  if (write_count + read_count < CMD_DAP_TFER_BLOCK_MIN_OPS)
1072  block_cmd = false;
1073  else
1074  block_cmd = !cmsis_dap_handle->swd_cmds_differ
1076 
1077  if (cmd & SWD_CMD_RNW)
1078  read_count++;
1079  else
1080  write_count++;
1081 
1082  unsigned int cmd_size = cmsis_dap_tfer_cmd_size(write_count, read_count,
1083  block_cmd);
1084  unsigned int resp_size = cmsis_dap_tfer_resp_size(write_count, read_count,
1085  block_cmd);
1086  unsigned int max_transfer_count = block_cmd ? 65535 : 255;
1087 
1088  /* Does the DAP Transfer command and also its expected response fit into one packet? */
1089  if (cmd_size > tfer_max_command_size
1090  || resp_size > tfer_max_response_size
1091  || write_count + read_count > max_transfer_count) {
1094 
1095  /* Not enough room in the queue. Run the queue. */
1097 
1098  unsigned int packet_count = cmsis_dap_quirk_mode ? 1 : cmsis_dap_handle->packet_count;
1099  if (cmsis_dap_handle->pending_fifo_block_count >= packet_count)
1101  }
1102 
1104 
1105  if (queued_retval != ERROR_OK)
1106  return;
1107 
1109  struct pending_transfer_result *transfer = &(block->transfers[block->transfer_count]);
1110  transfer->data = data;
1111  transfer->cmd = cmd;
1112  if (block->transfer_count == 0) {
1115  } else if (cmd != cmsis_dap_handle->common_swd_cmd) {
1117  }
1118 
1119  if (cmd & SWD_CMD_RNW) {
1120  /* Queue a read transaction */
1121  transfer->buffer = dst;
1123  } else {
1125  }
1126  block->transfer_count++;
1127 }
1128 
1129 static void cmsis_dap_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
1130 {
1131  assert(!(cmd & SWD_CMD_RNW));
1132  cmsis_dap_swd_queue_cmd(cmd, NULL, value);
1133 }
1134 
1135 static void cmsis_dap_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
1136 {
1137  assert(cmd & SWD_CMD_RNW);
1138  cmsis_dap_swd_queue_cmd(cmd, value, 0);
1139 }
1140 
1142 {
1143  uint8_t *data;
1144 
1145  int retval = cmsis_dap_cmd_dap_info(INFO_ID_SERNUM, &data);
1146  if (retval != ERROR_OK)
1147  return retval;
1148 
1149  if (data[0]) /* strlen */
1150  LOG_INFO("CMSIS-DAP: Serial# = %s", &data[1]);
1151 
1152  return ERROR_OK;
1153 }
1154 
1156 {
1157  uint8_t *data;
1158 
1159  /* INFO_ID_FW_VER - string */
1160  int retval = cmsis_dap_cmd_dap_info(INFO_ID_FW_VER, &data);
1161  if (retval != ERROR_OK)
1162  return retval;
1163 
1164  if (data[0]) /* strlen */
1165  LOG_INFO("CMSIS-DAP: FW Version = %s", &data[1]);
1166 
1167  return ERROR_OK;
1168 }
1169 
1170 static int cmsis_dap_get_caps_info(void)
1171 {
1172  uint8_t *data;
1173 
1174  /* INFO_ID_CAPS - byte */
1175  int retval = cmsis_dap_cmd_dap_info(INFO_ID_CAPS, &data);
1176  if (retval != ERROR_OK)
1177  return retval;
1178 
1179  if (data[0] == 1 || data[0] == 2) {
1180  uint16_t caps = data[1];
1181  if (data[0] == 2)
1182  caps |= (uint16_t)data[2] << 8;
1183 
1185 
1186  for (unsigned int i = 0; i < INFO_CAPS__NUM_CAPS; ++i) {
1187  if (caps & BIT(i))
1188  LOG_INFO("CMSIS-DAP: %s", info_caps_str[i]);
1189  }
1190  }
1191 
1192  return ERROR_OK;
1193 }
1194 
1195 static int cmsis_dap_get_swo_buf_sz(uint32_t *swo_buf_sz)
1196 {
1197  uint8_t *data;
1198 
1199  /* INFO_ID_SWO_BUF_SZ - word */
1201  if (retval != ERROR_OK)
1202  return retval;
1203 
1204  if (data[0] != 4)
1205  return ERROR_FAIL;
1206 
1207  *swo_buf_sz = le_to_h_u32(&data[1]);
1208 
1209  LOG_INFO("CMSIS-DAP: SWO Trace Buffer Size = %u bytes", *swo_buf_sz);
1210 
1211  return ERROR_OK;
1212 }
1213 
1214 static int cmsis_dap_get_status(void)
1215 {
1216  uint8_t d;
1217 
1218  int retval = cmsis_dap_cmd_dap_swj_pins(0, 0, 0, &d);
1219 
1220  if (retval == ERROR_OK) {
1221  LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
1222  (d & SWJ_PIN_TCK) ? 1 : 0,
1223  (d & SWJ_PIN_TMS) ? 1 : 0,
1224  (d & SWJ_PIN_TDI) ? 1 : 0,
1225  (d & SWJ_PIN_TDO) ? 1 : 0,
1226  (d & SWJ_PIN_TRST) ? 1 : 0,
1227  (d & SWJ_PIN_SRST) ? 1 : 0);
1228  }
1229 
1230  return retval;
1231 }
1232 
1234 {
1235  const uint8_t *s;
1236  unsigned int s_len;
1237  int retval;
1238 
1239  if (swd_mode)
1241 
1242  if (cmsis_dap_quirk_mode && seq != LINE_RESET &&
1244  == (SWJ_PIN_SRST | SWJ_PIN_TRST)) {
1245  /* Following workaround deasserts reset on most adapters.
1246  * Do not reconnect if a reset line is active!
1247  * Reconnecting would break connecting under reset. */
1248 
1249  /* First disconnect before connecting, Atmel EDBG needs it for SAMD/R/L/C */
1251 
1252  /* When we are reconnecting, DAP_Connect needs to be rerun, at
1253  * least on Keil ULINK-ME */
1255  if (retval != ERROR_OK)
1256  return retval;
1257  }
1258 
1259  switch (seq) {
1260  case LINE_RESET:
1261  LOG_DEBUG_IO("SWD line reset");
1262  s = swd_seq_line_reset;
1263  s_len = swd_seq_line_reset_len;
1264  break;
1265  case JTAG_TO_SWD:
1266  LOG_DEBUG("JTAG-to-SWD");
1267  s = swd_seq_jtag_to_swd;
1268  s_len = swd_seq_jtag_to_swd_len;
1269  break;
1270  case JTAG_TO_DORMANT:
1271  LOG_DEBUG("JTAG-to-DORMANT");
1274  break;
1275  case SWD_TO_JTAG:
1276  LOG_DEBUG("SWD-to-JTAG");
1277  s = swd_seq_swd_to_jtag;
1278  s_len = swd_seq_swd_to_jtag_len;
1279  break;
1280  case SWD_TO_DORMANT:
1281  LOG_DEBUG("SWD-to-DORMANT");
1284  break;
1285  case DORMANT_TO_SWD:
1286  LOG_DEBUG("DORMANT-to-SWD");
1289  break;
1290  case DORMANT_TO_JTAG:
1291  LOG_DEBUG("DORMANT-to-JTAG");
1294  break;
1295  default:
1296  LOG_ERROR("Sequence %d not supported", seq);
1297  return ERROR_FAIL;
1298  }
1299 
1300  retval = cmsis_dap_cmd_dap_swj_sequence(s_len, s);
1301  if (retval != ERROR_OK)
1302  return retval;
1303 
1304  /* Atmel EDBG needs renew clock setting after SWJ_Sequence
1305  * otherwise default frequency is used */
1307 }
1308 
1309 static int cmsis_dap_swd_open(void)
1310 {
1311  if (!(cmsis_dap_handle->caps & INFO_CAPS_SWD)) {
1312  LOG_ERROR("CMSIS-DAP: SWD not supported");
1313  return ERROR_JTAG_DEVICE_ERROR;
1314  }
1315 
1316  int retval = cmsis_dap_cmd_dap_connect(CONNECT_SWD);
1317  if (retval != ERROR_OK)
1318  return retval;
1319 
1320  /* Add more setup here.??... */
1321 
1322  LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
1323  return ERROR_OK;
1324 }
1325 
1326 static int cmsis_dap_init(void)
1327 {
1328  uint8_t *data;
1329 
1330  int retval = cmsis_dap_open();
1331  if (retval != ERROR_OK)
1332  return retval;
1333 
1335 
1336  retval = cmsis_dap_get_caps_info();
1337  if (retval != ERROR_OK)
1338  return retval;
1339 
1340  retval = cmsis_dap_get_version_info();
1341  if (retval != ERROR_OK)
1342  return retval;
1343 
1344  retval = cmsis_dap_get_serial_info();
1345  if (retval != ERROR_OK)
1346  return retval;
1347 
1348  if (swd_mode) {
1349  retval = cmsis_dap_swd_open();
1350  if (retval != ERROR_OK)
1351  return retval;
1352  } else {
1353  /* Connect in JTAG mode */
1354  if (!(cmsis_dap_handle->caps & INFO_CAPS_JTAG)) {
1355  LOG_ERROR("CMSIS-DAP: JTAG not supported");
1356  return ERROR_JTAG_DEVICE_ERROR;
1357  }
1358 
1360  if (retval != ERROR_OK)
1361  return retval;
1362 
1363  LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
1364  }
1365 
1366  /* Be conservative and suppress submitting multiple HID requests
1367  * until we get packet count info from the adaptor */
1369 
1370  /* INFO_ID_PKT_SZ - short */
1372  if (retval != ERROR_OK)
1373  goto init_err;
1374 
1375  if (data[0] == 2) { /* short */
1376  uint16_t pkt_sz = data[1] + (data[2] << 8);
1377  if (pkt_sz != cmsis_dap_handle->packet_size) {
1380  if (retval != ERROR_OK)
1381  goto init_err;
1382 
1383  LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRIu16, pkt_sz);
1384  }
1385  }
1386 
1387  /* Maximal number of transfers which fit to one packet:
1388  * Limited by response size: 3 bytes of response header + 4 per read
1389  * Plus writes to full command size: 3 bytes cmd header + 1 per read + 5 per write */
1392  unsigned int max_reads = tfer_max_response_size / 4;
1393  pending_queue_len = max_reads + (tfer_max_command_size - max_reads) / 5;
1396 
1397  /* INFO_ID_PKT_CNT - byte */
1399  if (retval != ERROR_OK)
1400  goto init_err;
1401 
1402  if (data[0] == 1) { /* byte */
1403  unsigned int pkt_cnt = data[1];
1404  if (pkt_cnt > 1)
1406 
1407  LOG_DEBUG("CMSIS-DAP: Packet Count = %u", pkt_cnt);
1408  }
1409 
1410  LOG_DEBUG("Allocating FIFO for %u pending packets", cmsis_dap_handle->packet_count);
1411  for (unsigned int i = 0; i < cmsis_dap_handle->packet_count; i++) {
1413  * sizeof(struct pending_transfer_result));
1415  LOG_ERROR("Unable to allocate memory for CMSIS-DAP queue");
1416  retval = ERROR_FAIL;
1417  goto init_err;
1418  }
1419  }
1420 
1421  /* Intentionally not checked for error, just logs an info message
1422  * not vital for further debugging */
1423  (void)cmsis_dap_get_status();
1424 
1425  /* Now try to connect to the target
1426  * TODO: This is all SWD only @ present */
1428  if (retval != ERROR_OK)
1429  goto init_err;
1430 
1431  /* Ask CMSIS-DAP to automatically retry on receiving WAIT for
1432  * up to 64 times. This must be changed to 0 if sticky
1433  * overrun detection is enabled. */
1434  retval = cmsis_dap_cmd_dap_tfer_configure(0, 64, 0);
1435  if (retval != ERROR_OK)
1436  goto init_err;
1437 
1438  if (swd_mode) {
1439  /* Data Phase (bit 2) must be set to 1 if sticky overrun
1440  * detection is enabled */
1441  retval = cmsis_dap_cmd_dap_swd_configure(0); /* 1 TRN, no Data Phase */
1442  if (retval != ERROR_OK)
1443  goto init_err;
1444  }
1445  /* Both LEDs on */
1446  /* Intentionally not checked for error, debugging will work
1447  * without LEDs */
1450 
1451  /* support connecting with srst asserted */
1453 
1456  retval = cmsis_dap_cmd_dap_swj_pins(0, SWJ_PIN_SRST, 0, NULL);
1457  if (retval != ERROR_OK)
1458  goto init_err;
1459  LOG_INFO("Connecting under reset");
1460  }
1461  }
1462  LOG_INFO("CMSIS-DAP: Interface ready");
1463  return ERROR_OK;
1464 
1465 init_err:
1466  cmsis_dap_quit();
1467  return retval;
1468 }
1469 
1470 static int cmsis_dap_swd_init(void)
1471 {
1472  swd_mode = true;
1473  return ERROR_OK;
1474 }
1475 
1476 static int cmsis_dap_quit(void)
1477 {
1479 
1480  /* Both LEDs off */
1483 
1485 
1486  return ERROR_OK;
1487 }
1488 
1489 static int cmsis_dap_reset(int trst, int srst)
1490 {
1491  /* Set both TRST and SRST even if they're not enabled as
1492  * there's no way to tristate them */
1493 
1494  output_pins = 0;
1495  if (!srst)
1497  if (!trst)
1499 
1502  if (retval != ERROR_OK)
1503  LOG_ERROR("CMSIS-DAP: Interface reset failed");
1504  return retval;
1505 }
1506 
1508 {
1509 #if 0
1510  int retval = cmsis_dap_cmd_dap_delay(cmd->cmd.sleep->us);
1511  if (retval != ERROR_OK)
1512 #endif
1513  jtag_sleep(cmd->cmd.sleep->us);
1514 }
1515 
1516 /* Set TMS high for five TCK clocks, to move the TAP to the Test-Logic-Reset state */
1518 {
1519  LOG_INFO("cmsis-dap JTAG TLR_RESET");
1520  uint8_t seq = 0xff;
1521 
1522  int retval = cmsis_dap_cmd_dap_swj_sequence(8, &seq);
1523  if (retval == ERROR_OK)
1525  return retval;
1526 }
1527 
1528 /* Set new end state */
1530 {
1533  else {
1534  LOG_ERROR("BUG: %i is not a valid end state", state);
1535  exit(-1);
1536  }
1537 }
1538 
1539 #ifdef SPRINT_BINARY
1540 static void sprint_binary(char *s, const uint8_t *buf, unsigned int offset, unsigned int len)
1541 {
1542  if (!len)
1543  return;
1544 
1545  /*
1546  buf = { 0x18 } len=5 should result in: 11000
1547  buf = { 0xff 0x18 } len=13 should result in: 11111111 11000
1548  buf = { 0xc0 0x18 } offset=3 len=10 should result in: 11000 11000
1549  i=3 there means i/8 = 0 so c = 0xFF, and
1550  */
1551  for (unsigned int i = offset; i < offset + len; ++i) {
1552  uint8_t c = buf[i / 8], mask = 1 << (i % 8);
1553  if ((i != offset) && !(i % 8))
1554  putchar(' ');
1555  *s++ = (c & mask) ? '1' : '0';
1556  }
1557  *s = 0;
1558 }
1559 #endif
1560 
1561 #ifdef CMSIS_DAP_JTAG_DEBUG
1562 static void debug_parse_cmsis_buf(const uint8_t *cmd, int cmdlen)
1563 {
1564  /* cmd is a usb packet to go to the cmsis-dap interface */
1565  printf("cmsis-dap buffer (%d b): ", cmdlen);
1566  for (int i = 0; i < cmdlen; ++i)
1567  printf(" %02x", cmd[i]);
1568  printf("\n");
1569  switch (cmd[0]) {
1570  case CMD_DAP_JTAG_SEQ: {
1571  printf("cmsis-dap jtag sequence command %02x (n=%d)\n", cmd[0], cmd[1]);
1572  /*
1573  * #1 = number of sequences
1574  * #2 = sequence info 1
1575  * #3...4+n_bytes-1 = sequence 1
1576  * #4+n_bytes = sequence info 2
1577  * #5+n_bytes = sequence 2 (single bit)
1578  */
1579  int pos = 2;
1580  for (int seq = 0; seq < cmd[1]; ++seq) {
1581  uint8_t info = cmd[pos++];
1582  int len = info & DAP_JTAG_SEQ_TCK;
1583  if (len == 0)
1584  len = 64;
1585  printf(" sequence %d starting %d: info %02x (len=%d tms=%d read_tdo=%d): ",
1586  seq, pos, info, len, info & DAP_JTAG_SEQ_TMS, info & DAP_JTAG_SEQ_TDO);
1587  for (int i = 0; i < DIV_ROUND_UP(len, 8); ++i)
1588  printf(" %02x", cmd[pos + i]);
1589  pos += DIV_ROUND_UP(len, 8);
1590  printf("\n");
1591  }
1592  if (pos != cmdlen) {
1593  printf("BUFFER LENGTH MISMATCH looks like %d but %d specified", pos, cmdlen);
1594  exit(-1);
1595  }
1596 
1597  break;
1598  }
1599  default:
1600  LOG_DEBUG("unknown cmsis-dap command %02x", cmd[1]);
1601  break;
1602  }
1603 }
1604 #endif
1605 
1606 static void cmsis_dap_flush(void)
1607 {
1608  if (!queued_seq_count)
1609  return;
1610 
1611  LOG_DEBUG_IO("Flushing %d queued sequences (%d bytes) with %d pending scan results to capture",
1613 
1614  /* prepare CMSIS-DAP packet */
1615  uint8_t *command = cmsis_dap_handle->command;
1619 
1620 #ifdef CMSIS_DAP_JTAG_DEBUG
1621  debug_parse_cmsis_buf(command, queued_seq_buf_end + 2);
1622 #endif
1623 
1624  /* send command to USB device */
1626 
1627  uint8_t *resp = cmsis_dap_handle->response;
1628  if (retval != ERROR_OK || resp[1] != DAP_OK) {
1629  LOG_ERROR("CMSIS-DAP command CMD_DAP_JTAG_SEQ failed.");
1630  exit(-1);
1631  }
1632 
1633 #ifdef CMSIS_DAP_JTAG_DEBUG
1634  LOG_DEBUG_IO("USB response buf:");
1635  for (int c = 0; c < queued_seq_buf_end + 3; ++c)
1636  printf("%02X ", resp[c]);
1637  printf("\n");
1638 #endif
1639 
1640  /* copy scan results into client buffers */
1641  for (int i = 0; i < pending_scan_result_count; ++i) {
1643  LOG_DEBUG_IO("Copying pending_scan_result %d/%d: %d bits from byte %d -> buffer + %d bits",
1644  i, pending_scan_result_count, scan->length, scan->first + 2, scan->buffer_offset);
1645 #ifdef CMSIS_DAP_JTAG_DEBUG
1646  for (uint32_t b = 0; b < DIV_ROUND_UP(scan->length, 8); ++b)
1647  printf("%02X ", resp[2+scan->first+b]);
1648  printf("\n");
1649 #endif
1650  bit_copy(scan->buffer, scan->buffer_offset, &resp[2 + scan->first], 0, scan->length);
1651  }
1652 
1653  /* reset */
1654  queued_seq_count = 0;
1655  queued_seq_buf_end = 0;
1656  queued_seq_tdo_ptr = 0;
1658 }
1659 
1660 /* queue a sequence of bits to clock out TDI / in TDO, executing if the buffer is full.
1661  *
1662  * sequence=NULL means clock out zeros on TDI
1663  * tdo_buffer=NULL means don't capture TDO
1664  */
1665 static void cmsis_dap_add_jtag_sequence(unsigned int s_len, const uint8_t *sequence,
1666  unsigned int s_offset, bool tms,
1667  uint8_t *tdo_buffer, unsigned int tdo_buffer_offset)
1668 {
1669  LOG_DEBUG_IO("[at %d] %u bits, tms %s, seq offset %u, tdo buf %p, tdo offset %u",
1671  s_len, tms ? "HIGH" : "LOW", s_offset, tdo_buffer, tdo_buffer_offset);
1672 
1673  if (s_len == 0)
1674  return;
1675 
1676  if (s_len > 64) {
1677  LOG_DEBUG_IO("START JTAG SEQ SPLIT");
1678  for (unsigned int offset = 0; offset < s_len; offset += 64) {
1679  unsigned int len = s_len - offset;
1680  if (len > 64)
1681  len = 64;
1682  LOG_DEBUG_IO("Splitting long jtag sequence: %u-bit chunk starting at offset %u", len, offset);
1684  len,
1685  sequence,
1686  s_offset + offset,
1687  tms,
1688  tdo_buffer,
1689  !tdo_buffer ? 0 : (tdo_buffer_offset + offset)
1690  );
1691  }
1692  LOG_DEBUG_IO("END JTAG SEQ SPLIT");
1693  return;
1694  }
1695 
1696  unsigned int cmd_len = 1 + DIV_ROUND_UP(s_len, 8);
1697  if (queued_seq_count >= 255 || queued_seq_buf_end + cmd_len > QUEUED_SEQ_BUF_LEN)
1698  /* empty out the buffer */
1699  cmsis_dap_flush();
1700 
1701  ++queued_seq_count;
1702 
1703  /* control byte */
1705  (tms ? DAP_JTAG_SEQ_TMS : 0) |
1706  (tdo_buffer ? DAP_JTAG_SEQ_TDO : 0) |
1707  (s_len == 64 ? 0 : s_len);
1708 
1709  if (sequence)
1710  bit_copy(&queued_seq_buf[queued_seq_buf_end + 1], 0, sequence, s_offset, s_len);
1711  else
1712  memset(&queued_seq_buf[queued_seq_buf_end + 1], 0, DIV_ROUND_UP(s_len, 8));
1713 
1714  queued_seq_buf_end += cmd_len;
1715 
1716  if (tdo_buffer) {
1718  scan->first = queued_seq_tdo_ptr;
1719  queued_seq_tdo_ptr += DIV_ROUND_UP(s_len, 8);
1720  scan->length = s_len;
1721  scan->buffer = tdo_buffer;
1722  scan->buffer_offset = tdo_buffer_offset;
1723  }
1724 }
1725 
1726 /* queue a sequence of bits to clock out TMS, executing if the buffer is full */
1727 static void cmsis_dap_add_tms_sequence(const uint8_t *sequence, int s_len)
1728 {
1729  LOG_DEBUG_IO("%d bits: %02X", s_len, *sequence);
1730  /* we use a series of CMD_DAP_JTAG_SEQ commands to toggle TMS,
1731  because even though it seems ridiculously inefficient, it
1732  allows us to combine TMS and scan sequences into the same
1733  USB packet. */
1734  /* TODO: combine runs of the same tms value */
1735  for (int i = 0; i < s_len; ++i) {
1736  bool bit = (sequence[i / 8] & (1 << (i % 8))) != 0;
1738  }
1739 }
1740 
1741 /* Move to the end state by queuing a sequence to clock into TMS */
1742 static void cmsis_dap_state_move(void)
1743 {
1744  uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1745  uint8_t tms_scan_bits = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1746 
1747  LOG_DEBUG_IO("state move from %s to %s: %d clocks, %02X on tms",
1749  tms_scan_bits, tms_scan);
1750  cmsis_dap_add_tms_sequence(&tms_scan, tms_scan_bits);
1751 
1753 }
1754 
1755 
1756 /* Execute a JTAG scan operation by queueing TMS and TDI/TDO sequences */
1758 {
1759  LOG_DEBUG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN",
1760  jtag_scan_type(cmd->cmd.scan));
1761 
1762  /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
1763  while (cmd->cmd.scan->num_fields > 0
1764  && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 1].num_bits == 0) {
1765  cmd->cmd.scan->num_fields--;
1766  LOG_DEBUG("discarding trailing empty field");
1767  }
1768 
1769  if (!cmd->cmd.scan->num_fields) {
1770  LOG_DEBUG("empty scan, doing nothing");
1771  return;
1772  }
1773 
1774  if (cmd->cmd.scan->ir_scan) {
1775  if (tap_get_state() != TAP_IRSHIFT) {
1778  }
1779  } else {
1780  if (tap_get_state() != TAP_DRSHIFT) {
1783  }
1784  }
1785 
1786  cmsis_dap_end_state(cmd->cmd.scan->end_state);
1787 
1788  struct scan_field *field = cmd->cmd.scan->fields;
1789  unsigned int scan_size = 0;
1790 
1791  for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
1792  scan_size += field->num_bits;
1793  LOG_DEBUG_IO("%s%s field %u/%u %u bits",
1794  field->in_value ? "in" : "",
1795  field->out_value ? "out" : "",
1796  i,
1797  cmd->cmd.scan->num_fields,
1798  field->num_bits);
1799 
1800  if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != tap_get_end_state()) {
1801  LOG_DEBUG_IO("Last field and have to move out of SHIFT state");
1802  /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
1803  * movement. This last field can't have length zero, it was checked above. */
1805  field->num_bits - 1, /* number of bits to clock */
1806  field->out_value, /* output sequence */
1807  0, /* output offset */
1808  false, /* TMS low */
1809  field->in_value,
1810  0);
1811 
1812  /* Clock the last bit out, with TMS high */
1813  uint8_t last_bit = 0;
1814  if (field->out_value)
1815  bit_copy(&last_bit, 0, field->out_value, field->num_bits - 1, 1);
1817  1,
1818  &last_bit,
1819  0,
1820  true,
1821  field->in_value,
1822  field->num_bits - 1);
1824 
1825  /* Now clock one more cycle, with TMS low, to get us into a PAUSE state */
1827  1,
1828  &last_bit,
1829  0,
1830  false,
1831  NULL,
1832  0);
1834  } else {
1835  LOG_DEBUG_IO("Internal field, staying in SHIFT state afterwards");
1836  /* Clocking part of a sequence into DR or IR with TMS=0,
1837  leaving TMS=0 at the end so we can continue later */
1839  field->num_bits,
1840  field->out_value,
1841  0,
1842  false,
1843  field->in_value,
1844  0);
1845  }
1846  }
1847 
1848  if (tap_get_state() != tap_get_end_state()) {
1851  }
1852 
1853  LOG_DEBUG_IO("%s scan, %i bits, end in %s",
1854  (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
1856 }
1857 
1858 static void cmsis_dap_pathmove(int num_states, enum tap_state *path)
1859 {
1860  uint8_t tms0 = 0x00;
1861  uint8_t tms1 = 0xff;
1862 
1863  for (int i = 0; i < num_states; i++) {
1864  if (path[i] == tap_state_transition(tap_get_state(), false))
1865  cmsis_dap_add_tms_sequence(&tms0, 1);
1866  else if (path[i] == tap_state_transition(tap_get_state(), true))
1867  cmsis_dap_add_tms_sequence(&tms1, 1);
1868  else {
1869  LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition.",
1871  exit(-1);
1872  }
1873 
1874  tap_set_state(path[i]);
1875  }
1876 
1878 }
1879 
1881 {
1882  LOG_DEBUG_IO("pathmove: %i states, end in %i",
1883  cmd->cmd.pathmove->num_states,
1884  cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
1885 
1886  cmsis_dap_pathmove(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
1887 }
1888 
1889 static void cmsis_dap_stableclocks(unsigned int num_cycles)
1890 {
1891  uint8_t tms = tap_get_state() == TAP_RESET;
1892  /* TODO: Perform optimizations? */
1893  /* Execute num_cycles. */
1894  for (unsigned int i = 0; i < num_cycles; i++)
1895  cmsis_dap_add_tms_sequence(&tms, 1);
1896 }
1897 
1898 static void cmsis_dap_runtest(unsigned int num_cycles)
1899 {
1900  enum tap_state saved_end_state = tap_get_end_state();
1901 
1902  /* Only do a state_move when we're not already in IDLE. */
1903  if (tap_get_state() != TAP_IDLE) {
1906  }
1907  cmsis_dap_stableclocks(num_cycles);
1908 
1909  /* Finish in end_state. */
1910  cmsis_dap_end_state(saved_end_state);
1911 
1912  if (tap_get_state() != tap_get_end_state())
1914 }
1915 
1917 {
1918  LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles,
1919  cmd->cmd.runtest->end_state);
1920 
1921  cmsis_dap_end_state(cmd->cmd.runtest->end_state);
1922  cmsis_dap_runtest(cmd->cmd.runtest->num_cycles);
1923 }
1924 
1926 {
1927  LOG_DEBUG_IO("stableclocks %u cycles", cmd->cmd.runtest->num_cycles);
1928  cmsis_dap_stableclocks(cmd->cmd.runtest->num_cycles);
1929 }
1930 
1932 {
1933  LOG_DEBUG_IO("TMS: %u bits", cmd->cmd.tms->num_bits);
1934  cmsis_dap_cmd_dap_swj_sequence(cmd->cmd.tms->num_bits, cmd->cmd.tms->bits);
1935 }
1936 
1937 /* TODO: Is there need to call cmsis_dap_flush() for the JTAG_PATHMOVE,
1938  * JTAG_RUNTEST, JTAG_STABLECLOCKS? */
1940 {
1941  switch (cmd->type) {
1942  case JTAG_SLEEP:
1943  cmsis_dap_flush();
1945  break;
1946  case JTAG_TLR_RESET:
1947  cmsis_dap_flush();
1949  break;
1950  case JTAG_SCAN:
1952  break;
1953  case JTAG_PATHMOVE:
1955  break;
1956  case JTAG_RUNTEST:
1958  break;
1959  case JTAG_STABLECLOCKS:
1961  break;
1962  case JTAG_TMS:
1964  break;
1965  default:
1966  LOG_ERROR("BUG: unknown JTAG command type 0x%X encountered", cmd->type);
1967  exit(-1);
1968  }
1969 }
1970 
1971 static int cmsis_dap_execute_queue(struct jtag_command *cmd_queue)
1972 {
1973  struct jtag_command *cmd = cmd_queue;
1974 
1975  while (cmd) {
1977  cmd = cmd->next;
1978  }
1979 
1980  cmsis_dap_flush();
1981 
1982  return ERROR_OK;
1983 }
1984 
1985 static int cmsis_dap_speed(int speed)
1986 {
1987  if (speed == 0) {
1988  LOG_ERROR("RTCK not supported. Set nonzero \"adapter speed\".");
1990  }
1991 
1992  return cmsis_dap_cmd_dap_swj_clock(speed);
1993 }
1994 
1995 static int cmsis_dap_speed_div(int speed, int *khz)
1996 {
1997  *khz = speed;
1998  return ERROR_OK;
1999 }
2000 
2001 static int cmsis_dap_khz(int khz, int *jtag_speed)
2002 {
2003  *jtag_speed = khz;
2004  return ERROR_OK;
2005 }
2006 
2007 static bool calculate_swo_prescaler(unsigned int traceclkin_freq,
2008  uint32_t trace_freq, uint16_t *prescaler)
2009 {
2010  unsigned int presc = (traceclkin_freq + trace_freq / 2) / trace_freq;
2011  if (presc == 0 || presc > TPIU_ACPR_MAX_SWOSCALER + 1)
2012  return false;
2013 
2014  /* Probe's UART speed must be within 3% of the TPIU's SWO baud rate. */
2015  unsigned int max_deviation = (traceclkin_freq * 3) / 100;
2016  if (presc * trace_freq < traceclkin_freq - max_deviation ||
2017  presc * trace_freq > traceclkin_freq + max_deviation)
2018  return false;
2019 
2020  *prescaler = presc;
2021 
2022  return true;
2023 }
2024 
2029  bool trace_enabled,
2030  enum tpiu_pin_protocol pin_protocol,
2031  uint32_t port_size,
2032  unsigned int *swo_freq,
2033  unsigned int traceclkin_hz,
2034  uint16_t *swo_prescaler)
2035 {
2036  int retval;
2037 
2038  if (!trace_enabled) {
2041  if (retval != ERROR_OK) {
2042  LOG_ERROR("Failed to disable the SWO-trace.");
2043  return retval;
2044  }
2045  }
2047  LOG_INFO("SWO-trace disabled.");
2048  return ERROR_OK;
2049  }
2050 
2053  LOG_ERROR("SWO-trace is not supported by the device.");
2054  return ERROR_FAIL;
2055  }
2056 
2057  uint8_t swo_mode;
2058  if (pin_protocol == TPIU_PIN_PROTOCOL_ASYNC_UART &&
2060  swo_mode = DAP_SWO_MODE_UART;
2061  } else if (pin_protocol == TPIU_PIN_PROTOCOL_ASYNC_MANCHESTER &&
2063  swo_mode = DAP_SWO_MODE_MANCHESTER;
2064  } else {
2065  LOG_ERROR("Selected pin protocol is not supported.");
2066  return ERROR_FAIL;
2067  }
2068 
2069  if (*swo_freq == 0) {
2070  LOG_INFO("SWO-trace frequency autodetection not implemented.");
2071  return ERROR_FAIL;
2072  }
2073 
2075  if (retval != ERROR_OK)
2076  return retval;
2077 
2079 
2081  if (retval != ERROR_OK)
2082  return retval;
2083 
2085  if (retval != ERROR_OK)
2086  return retval;
2087 
2088  retval = cmsis_dap_cmd_dap_swo_mode(swo_mode);
2089  if (retval != ERROR_OK)
2090  return retval;
2091 
2092  retval = cmsis_dap_cmd_dap_swo_baudrate(*swo_freq, swo_freq);
2093  if (retval != ERROR_OK)
2094  return retval;
2095 
2096  if (!calculate_swo_prescaler(traceclkin_hz, *swo_freq,
2097  swo_prescaler)) {
2098  LOG_ERROR("SWO frequency is not suitable. Please choose a "
2099  "different frequency or use auto-detection.");
2100  return ERROR_FAIL;
2101  }
2102 
2103  LOG_INFO("SWO frequency: %u Hz.", *swo_freq);
2104  LOG_INFO("SWO prescaler: %u.", *swo_prescaler);
2105 
2107  if (retval != ERROR_OK)
2108  return retval;
2109 
2111 
2112  return ERROR_OK;
2113 }
2114 
2118 static int cmsis_dap_poll_trace(uint8_t *buf, size_t *size)
2119 {
2120  uint8_t trace_status;
2121  size_t trace_count;
2122 
2124  *size = 0;
2125  return ERROR_OK;
2126  }
2127 
2128  int retval = cmsis_dap_cmd_dap_swo_status(&trace_status, &trace_count);
2129  if (retval != ERROR_OK)
2130  return retval;
2132  return ERROR_FAIL;
2133 
2134  *size = trace_count < *size ? trace_count : *size;
2135  size_t read_so_far = 0;
2136  do {
2137  size_t rb = 0;
2138  uint32_t packet_size = cmsis_dap_handle->packet_size - 4 /*data-reply*/;
2139  uint32_t remaining = *size - read_so_far;
2140  if (remaining < packet_size)
2141  packet_size = remaining;
2142  retval = cmsis_dap_cmd_dap_swo_data(
2143  packet_size,
2144  &trace_status,
2145  &rb,
2146  &buf[read_so_far]);
2147  if (retval != ERROR_OK)
2148  return retval;
2150  return ERROR_FAIL;
2151 
2152  read_so_far += rb;
2153  } while (read_so_far < *size);
2154 
2155  return ERROR_OK;
2156 }
2157 
2158 COMMAND_HANDLER(cmsis_dap_handle_info_command)
2159 {
2162 
2163  return ERROR_OK;
2164 }
2165 
2166 COMMAND_HANDLER(cmsis_dap_handle_cmd_command)
2167 {
2168  uint8_t *command = cmsis_dap_handle->command;
2169 
2170  for (unsigned int i = 0; i < CMD_ARGC; i++)
2172 
2173  int retval = cmsis_dap_xfer(cmsis_dap_handle, CMD_ARGC);
2174 
2175  if (retval != ERROR_OK) {
2176  LOG_ERROR("CMSIS-DAP command failed.");
2177  return ERROR_JTAG_DEVICE_ERROR;
2178  }
2179 
2180  uint8_t *resp = cmsis_dap_handle->response;
2181  LOG_INFO("Returned data %02" PRIx8 " %02" PRIx8 " %02" PRIx8 " %02" PRIx8,
2182  resp[1], resp[2], resp[3], resp[4]);
2183 
2184  return ERROR_OK;
2185 }
2186 
2187 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command)
2188 {
2189  if (CMD_ARGC > MAX_USB_IDS * 2) {
2190  LOG_WARNING("ignoring extra IDs in cmsis-dap vid_pid "
2191  "(maximum is %d pairs)", MAX_USB_IDS);
2192  CMD_ARGC = MAX_USB_IDS * 2;
2193  }
2194  if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
2195  LOG_WARNING("incomplete cmsis-dap vid_pid configuration directive");
2196  if (CMD_ARGC < 2)
2198  /* remove the incomplete trailing id */
2199  CMD_ARGC -= 1;
2200  }
2201 
2202  unsigned int i;
2203  for (i = 0; i < CMD_ARGC; i += 2) {
2204  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], cmsis_dap_vid[i >> 1]);
2205  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], cmsis_dap_pid[i >> 1]);
2206  }
2207 
2208  /*
2209  * Explicitly terminate, in case there are multiples instances of
2210  * cmsis_dap_vid_pid.
2211  */
2212  cmsis_dap_vid[i >> 1] = cmsis_dap_pid[i >> 1] = 0;
2213 
2214  return ERROR_OK;
2215 }
2216 
2217 COMMAND_HANDLER(cmsis_dap_handle_backend_command)
2218 {
2219  if (CMD_ARGC != 1)
2221 
2222  if (strcmp(CMD_ARGV[0], "auto") == 0) {
2223  cmsis_dap_backend = -1; /* autoselect */
2224  } else {
2225  for (unsigned int i = 0; i < ARRAY_SIZE(cmsis_dap_backends); i++) {
2226  if (strcasecmp(cmsis_dap_backends[i]->name, CMD_ARGV[0]) == 0) {
2227  if (cmsis_dap_backends[i]->open) {
2228  cmsis_dap_backend = i;
2229  return ERROR_OK;
2230  }
2231 
2232  command_print(CMD, "Requested cmsis-dap backend %s is disabled by configure",
2233  cmsis_dap_backends[i]->name);
2234  return ERROR_NOT_IMPLEMENTED;
2235  }
2236  }
2237 
2238  command_print(CMD, "invalid argument %s to cmsis-dap backend", CMD_ARGV[0]);
2240  }
2241 
2242  return ERROR_OK;
2243 }
2244 
2245 COMMAND_HANDLER(cmsis_dap_handle_quirk_command)
2246 {
2247  if (CMD_ARGC > 1)
2249 
2250  if (CMD_ARGC == 1) {
2252  return ERROR_OK;
2253  }
2254 
2255  command_print(CMD, "%s", cmsis_dap_quirk_mode ? "enabled" : "disabled");
2256 
2257  return ERROR_OK;
2258 }
2259 
2260 static const struct command_registration cmsis_dap_subcommand_handlers[] = {
2261  {
2262  .name = "info",
2263  .handler = &cmsis_dap_handle_info_command,
2264  .mode = COMMAND_EXEC,
2265  .usage = "",
2266  .help = "show cmsis-dap info",
2267  },
2268  {
2269  .name = "cmd",
2270  .handler = &cmsis_dap_handle_cmd_command,
2271  .mode = COMMAND_EXEC,
2272  .usage = "",
2273  .help = "issue cmsis-dap command",
2274  },
2275  {
2276  .name = "vid_pid",
2277  .handler = &cmsis_dap_handle_vid_pid_command,
2278  .mode = COMMAND_CONFIG,
2279  .help = "the vendor ID and product ID of the CMSIS-DAP device",
2280  .usage = "(vid pid)*",
2281  },
2282  {
2283  .name = "backend",
2284  .handler = &cmsis_dap_handle_backend_command,
2285  .mode = COMMAND_CONFIG,
2286  .help = "set the communication backend to use (USB bulk or HID, or TCP).",
2287  .usage = "(auto | usb_bulk | hid | tcp)",
2288  },
2289  {
2290  .name = "quirk",
2291  .handler = &cmsis_dap_handle_quirk_command,
2292  .mode = COMMAND_ANY,
2293  .help = "allow expensive workarounds of known adapter quirks.",
2294  .usage = "[enable | disable]",
2295  },
2296 #if BUILD_CMSIS_DAP_USB
2297  {
2298  .name = "usb",
2300  .mode = COMMAND_ANY,
2301  .help = "USB bulk backend-specific commands",
2302  .usage = "<cmd>",
2303  },
2304 #endif
2305 #if BUILD_CMSIS_DAP_TCP
2306  {
2307  .name = "tcp",
2309  .mode = COMMAND_ANY,
2310  .help = "TCP backend-specific commands",
2311  .usage = "<cmd>",
2312  },
2313 #endif
2315 };
2316 
2317 
2318 static const struct command_registration cmsis_dap_command_handlers[] = {
2319  {
2320  .name = "cmsis-dap",
2321  .mode = COMMAND_ANY,
2322  .help = "perform CMSIS-DAP management",
2323  .usage = "<cmd>",
2325  },
2327 };
2328 
2329 static const struct swd_driver cmsis_dap_swd_driver = {
2331  .switch_seq = cmsis_dap_swd_switch_seq,
2332  .read_reg = cmsis_dap_swd_read_reg,
2333  .write_reg = cmsis_dap_swd_write_reg,
2334  .run = cmsis_dap_swd_run_queue,
2335 };
2336 
2337 static struct jtag_interface cmsis_dap_interface = {
2339  .execute_queue = cmsis_dap_execute_queue,
2340 };
2341 
2343  .name = "cmsis-dap",
2344  .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
2345  .transport_preferred_id = TRANSPORT_SWD,
2346  .commands = cmsis_dap_command_handlers,
2347 
2348  .init = cmsis_dap_init,
2349  .quit = cmsis_dap_quit,
2350  .reset = cmsis_dap_reset,
2351  .speed = cmsis_dap_speed,
2352  .khz = cmsis_dap_khz,
2353  .speed_div = cmsis_dap_speed_div,
2354  .config_trace = cmsis_dap_config_trace,
2355  .poll_trace = cmsis_dap_poll_trace,
2356 
2357  .jtag_ops = &cmsis_dap_interface,
2358  .swd_ops = &cmsis_dap_swd_driver,
2359 };
const char * adapter_get_required_serial(void)
Retrieves the serial number set with command 'adapter serial'.
Definition: adapter.c:302
unsigned int adapter_get_speed_khz(void)
Retrieves the clock speed of the adapter in kHz.
Definition: adapter.c:210
static uint8_t tdo_buffer[ARMJTAGEW_TAP_BUFFER_SIZE]
Definition: arm-jtag-ew.c:511
#define SWD_ACK_FAULT
Definition: arm_adi_v5.h:33
#define DP_CTRL_STAT
Definition: arm_adi_v5.h:50
#define CORUNDETECT
Definition: arm_adi_v5.h:82
#define DP_RDBUFF
Definition: arm_adi_v5.h:58
swd_special_seq
Definition: arm_adi_v5.h:236
@ DORMANT_TO_JTAG
Definition: arm_adi_v5.h:243
@ JTAG_TO_SWD
Definition: arm_adi_v5.h:238
@ DORMANT_TO_SWD
Definition: arm_adi_v5.h:242
@ LINE_RESET
Definition: arm_adi_v5.h:237
@ JTAG_TO_DORMANT
Definition: arm_adi_v5.h:239
@ SWD_TO_DORMANT
Definition: arm_adi_v5.h:241
@ SWD_TO_JTAG
Definition: arm_adi_v5.h:240
#define DP_TARGETSEL
Definition: arm_adi_v5.h:59
#define SWD_ACK_WAIT
Definition: arm_adi_v5.h:32
#define SWD_ACK_OK
Definition: arm_adi_v5.h:31
tpiu_pin_protocol
Definition: arm_tpiu_swo.h:7
@ TPIU_PIN_PROTOCOL_ASYNC_MANCHESTER
asynchronous output with Manchester coding
Definition: arm_tpiu_swo.h:9
@ TPIU_PIN_PROTOCOL_ASYNC_UART
asynchronous output with NRZ coding
Definition: arm_tpiu_swo.h:10
enum arm_mode mode
Definition: armv4_5.c:281
const char * name
Definition: armv4_5.c:76
static void bit_copy(uint8_t *dst, unsigned int dst_offset, const uint8_t *src, unsigned int src_offset, unsigned int bit_count)
Definition: binarybuffer.h:218
static int cmsis_dap_init(void)
Definition: cmsis_dap.c:1326
static int cmsis_dap_cmd_dap_swo_status(uint8_t *trace_status, size_t *trace_count)
Reads the SWO trace status.
Definition: cmsis_dap.c:725
static void cmsis_dap_swd_read_process(struct cmsis_dap *dap, enum cmsis_dap_blocking blocking)
Definition: cmsis_dap.c:894
static void cmsis_dap_swd_write_from_queue(struct cmsis_dap *dap)
Definition: cmsis_dap.c:797
static int cmsis_dap_cmd_dap_swo_data(size_t max_trace_count, uint8_t *trace_status, size_t *trace_count, uint8_t *data)
Reads the captured SWO trace data from Trace Buffer.
Definition: cmsis_dap.c:754
#define DAP_SWO_MODE_MANCHESTER
Definition: cmsis_dap.c:206
#define MAX_PENDING_SCAN_RESULTS
Definition: cmsis_dap.c:251
static int cmsis_dap_get_status(void)
Definition: cmsis_dap.c:1214
static int cmsis_dap_reset(int trst, int srst)
Definition: cmsis_dap.c:1489
static int cmsis_dap_get_caps_info(void)
Definition: cmsis_dap.c:1170
static void cmsis_dap_stableclocks(unsigned int num_cycles)
Definition: cmsis_dap.c:1889
#define INFO_CAPS__NUM_CAPS
Definition: cmsis_dap.c:119
#define CMD_DAP_INFO
Definition: cmsis_dap.c:90
static int queued_retval
Definition: cmsis_dap.c:262
#define INFO_ID_PKT_SZ
Definition: cmsis_dap.c:107
static int cmsis_dap_swd_switch_seq(enum swd_special_seq seq)
Definition: cmsis_dap.c:1233
static uint16_t cmsis_dap_vid[MAX_USB_IDS+1]
Definition: cmsis_dap.c:83
#define INFO_ID_CAPS
Definition: cmsis_dap.c:105
static void cmsis_dap_execute_runtest(struct jtag_command *cmd)
Definition: cmsis_dap.c:1916
static struct jtag_interface cmsis_dap_interface
Definition: cmsis_dap.c:2337
static int cmsis_dap_swd_open(void)
Definition: cmsis_dap.c:1309
#define DAP_SWO_STATUS_CAPTURE_MASK
Definition: cmsis_dap.c:215
#define DAP_JTAG_SEQ_TDO
Definition: cmsis_dap.c:171
static int cmsis_dap_cmd_dap_swo_control(uint8_t control)
Controls the SWO trace data capture.
Definition: cmsis_dap.c:701
static struct cmsis_dap * cmsis_dap_handle
Definition: cmsis_dap.c:266
static int cmsis_dap_cmd_dap_info(uint8_t info, uint8_t **data)
Definition: cmsis_dap.c:458
static struct pending_scan_result pending_scan_results[MAX_PENDING_SCAN_RESULTS]
Definition: cmsis_dap.c:253
static int cmsis_dap_cmd_dap_swj_pins(uint8_t pins, uint8_t mask, uint32_t delay, uint8_t *input)
Definition: cmsis_dap.c:394
static unsigned int cmsis_dap_tfer_cmd_size(unsigned int write_count, unsigned int read_count, bool block_tfer)
Definition: cmsis_dap.c:1028
static int cmsis_dap_cmd_dap_swo_baudrate(uint32_t in_baudrate, uint32_t *dev_baudrate)
Sets the baudrate for capturing SWO trace data.
Definition: cmsis_dap.c:671
const struct cmsis_dap_backend cmsis_dap_usb_backend
Definition: cmsis_dap.c:45
#define CMD_DAP_LED
Definition: cmsis_dap.c:91
static unsigned int tfer_max_response_size
Definition: cmsis_dap.c:248
static void cmsis_dap_end_state(enum tap_state state)
Definition: cmsis_dap.c:1529
static int cmsis_dap_speed_div(int speed, int *khz)
Definition: cmsis_dap.c:1995
#define CMD_DAP_SWJ_CLOCK
Definition: cmsis_dap.c:136
static int cmsis_dap_cmd_dap_swd_configure(uint8_t cfg)
Definition: cmsis_dap.c:547
static bool calculate_swo_prescaler(unsigned int traceclkin_freq, uint32_t trace_freq, uint16_t *prescaler)
Definition: cmsis_dap.c:2007
#define SWJ_PIN_TMS
Definition: cmsis_dap.c:150
#define INFO_CAPS_JTAG
Definition: cmsis_dap.c:111
#define SWJ_PIN_TCK
Definition: cmsis_dap.c:149
#define INFO_ID_SWO_BUF_SZ
Definition: cmsis_dap.c:108
static int queued_seq_buf_end
Definition: cmsis_dap.c:258
#define DAP_OK
Definition: cmsis_dap.c:186
#define DAP_SWO_STATUS_CAPTURE_ACTIVE
Definition: cmsis_dap.c:214
static int queued_seq_count
Definition: cmsis_dap.c:257
static void cmsis_dap_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
Definition: cmsis_dap.c:1129
struct adapter_driver cmsis_dap_adapter_driver
Definition: cmsis_dap.c:2342
static int cmsis_dap_cmd_dap_swj_clock(uint32_t swj_clock)
Definition: cmsis_dap.c:415
static void cmsis_dap_swd_discard_all_pending(struct cmsis_dap *dap)
Definition: cmsis_dap.c:780
static void cmsis_dap_flush(void)
Definition: cmsis_dap.c:1606
static int cmsis_dap_execute_queue(struct jtag_command *cmd_queue)
Definition: cmsis_dap.c:1971
#define CMD_DAP_JTAG_SEQ
Definition: cmsis_dap.c:161
#define CMD_DAP_TFER_CONFIGURE
Definition: cmsis_dap.c:175
#define INFO_CAPS_SWO_UART
Definition: cmsis_dap.c:112
#define TIMEOUT_MS
Definition: cmsis_dap.c:41
#define CMD_DAP_SWO_STATUS
Definition: cmsis_dap.c:194
static bool cmsis_dap_quirk_mode
Definition: cmsis_dap.c:87
#define CMD_DAP_SWD_CONFIGURE
Definition: cmsis_dap.c:157
static int cmsis_dap_quit(void)
Definition: cmsis_dap.c:1476
static bool swd_mode
Definition: cmsis_dap.c:86
static const struct swd_driver cmsis_dap_swd_driver
Definition: cmsis_dap.c:2329
#define DAP_SWO_TRANSPORT_DATA
Definition: cmsis_dap.c:200
#define CMD_DAP_DELAY
Definition: cmsis_dap.c:134
#define CMD_DAP_DISCONNECT
Definition: cmsis_dap.c:93
#define CMD_DAP_SWJ_SEQ
Definition: cmsis_dap.c:137
#define INFO_ID_FW_VER
Definition: cmsis_dap.c:102
static void cmsis_dap_swd_cancel_transfers(struct cmsis_dap *dap)
Definition: cmsis_dap.c:790
#define MAX_USB_IDS
Definition: cmsis_dap.c:81
static int cmsis_dap_cmd_dap_disconnect(void)
Definition: cmsis_dap.c:514
#define CONNECT_SWD
Definition: cmsis_dap.c:130
#define CONNECT_JTAG
Definition: cmsis_dap.c:131
static int cmsis_dap_cmd_dap_tfer_configure(uint8_t idle, uint16_t retry_count, uint16_t match_retry)
Definition: cmsis_dap.c:529
static void cmsis_dap_execute_stableclocks(struct jtag_command *cmd)
Definition: cmsis_dap.c:1925
static uint8_t queued_seq_buf[1024]
Definition: cmsis_dap.c:260
#define DAP_JTAG_SEQ_TMS
Definition: cmsis_dap.c:169
static int cmsis_dap_xfer(struct cmsis_dap *dap, int txlen)
Definition: cmsis_dap.c:351
#define CMD_DAP_SWO_MODE
Definition: cmsis_dap.c:191
#define LED_OFF
Definition: cmsis_dap.c:125
#define INFO_CAPS_SWD
Definition: cmsis_dap.c:110
static int cmsis_dap_get_serial_info(void)
Definition: cmsis_dap.c:1141
static void cmsis_dap_flush_read(struct cmsis_dap *dap)
Definition: cmsis_dap.c:335
static int pending_scan_result_count
Definition: cmsis_dap.c:252
#define INFO_ID_PKT_CNT
Definition: cmsis_dap.c:106
#define LED_ID_RUN
Definition: cmsis_dap.c:123
#define CMD_DAP_CONNECT
Definition: cmsis_dap.c:92
#define CMD_DAP_TFER_BLOCK
Definition: cmsis_dap.c:177
static void cmsis_dap_execute_scan(struct jtag_command *cmd)
Definition: cmsis_dap.c:1757
static void cmsis_dap_execute_command(struct jtag_command *cmd)
Definition: cmsis_dap.c:1939
#define CMD_DAP_SWO_CONTROL
Definition: cmsis_dap.c:193
static int cmsis_dap_swd_run_queue(void)
Definition: cmsis_dap.c:1007
#define INFO_ID_SERNUM
Definition: cmsis_dap.c:101
static int cmsis_dap_cmd_dap_connect(uint8_t mode)
Definition: cmsis_dap.c:493
#define CMD_DAP_TFER
Definition: cmsis_dap.c:176
static unsigned int tfer_max_command_size
Definition: cmsis_dap.c:247
#define CMD_DAP_SWO_TRANSPORT
Definition: cmsis_dap.c:190
static void cmsis_dap_runtest(unsigned int num_cycles)
Definition: cmsis_dap.c:1898
#define CMD_DAP_TFER_BLOCK_MIN_OPS
Definition: cmsis_dap.c:183
static void cmsis_dap_execute_tms(struct jtag_command *cmd)
Definition: cmsis_dap.c:1931
static unsigned int pending_queue_len
Definition: cmsis_dap.c:246
static const struct cmsis_dap_backend *const cmsis_dap_backends[]
Definition: cmsis_dap.c:62
#define INFO_CAPS_SWO_MANCHESTER
Definition: cmsis_dap.c:113
static int queued_seq_tdo_ptr
Definition: cmsis_dap.c:259
static const char *const info_caps_str[INFO_CAPS__NUM_CAPS]
Definition: cmsis_dap.c:222
static const struct command_registration cmsis_dap_subcommand_handlers[]
Definition: cmsis_dap.c:2260
static void cmsis_dap_state_move(void)
Definition: cmsis_dap.c:1742
static int cmsis_dap_cmd_dap_swo_mode(uint8_t mode)
Sets the SWO trace capture mode.
Definition: cmsis_dap.c:646
static void cmsis_dap_swd_queue_cmd(uint8_t cmd, uint32_t *dst, uint32_t data)
Definition: cmsis_dap.c:1056
static uint8_t output_pins
Definition: cmsis_dap.c:264
#define SWJ_PIN_SRST
Definition: cmsis_dap.c:154
#define CMD_DAP_SWD_SEQUENCE
Definition: cmsis_dap.c:158
static int cmsis_dap_cmd_dap_swj_sequence(uint8_t s_len, const uint8_t *sequence)
Definition: cmsis_dap.c:435
static int cmsis_dap_khz(int khz, int *jtag_speed)
Definition: cmsis_dap.c:2001
static int cmsis_dap_metacmd_targetsel(uint32_t instance_id)
Definition: cmsis_dap.c:581
const struct cmsis_dap_backend cmsis_dap_hid_backend
Definition: cmsis_dap.c:51
static int cmsis_dap_backend
Definition: cmsis_dap.c:85
static void cmsis_dap_close(struct cmsis_dap *dap)
Definition: cmsis_dap.c:316
static int cmsis_dap_poll_trace(uint8_t *buf, size_t *size)
Definition: cmsis_dap.c:2118
const struct cmsis_dap_backend cmsis_dap_tcp_backend
Definition: cmsis_dap.c:57
#define CMD_DAP_SWO_BAUDRATE
Definition: cmsis_dap.c:192
static int cmsis_dap_swd_init(void)
Definition: cmsis_dap.c:1470
static void cmsis_dap_execute_sleep(struct jtag_command *cmd)
Definition: cmsis_dap.c:1507
#define LED_ID_CONNECT
Definition: cmsis_dap.c:122
static int cmsis_dap_open(void)
Definition: cmsis_dap.c:271
#define DAP_ERROR
Definition: cmsis_dap.c:187
COMMAND_HANDLER(cmsis_dap_handle_info_command)
Definition: cmsis_dap.c:2158
static int cmsis_dap_speed(int speed)
Definition: cmsis_dap.c:1985
#define QUEUED_SEQ_BUF_LEN
Definition: cmsis_dap.c:256
static int cmsis_dap_cmd_dap_led(uint8_t led, uint8_t state)
Definition: cmsis_dap.c:476
static void cmsis_dap_pathmove(int num_states, enum tap_state *path)
Definition: cmsis_dap.c:1858
static unsigned int cmsis_dap_tfer_resp_size(unsigned int write_count, unsigned int read_count, bool block_tfer)
Definition: cmsis_dap.c:1043
static int cmsis_dap_cmd_dap_swo_transport(uint8_t transport)
Sets the SWO transport mode.
Definition: cmsis_dap.c:626
#define DAP_SWO_CONTROL_STOP
Definition: cmsis_dap.c:209
static void cmsis_dap_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
Definition: cmsis_dap.c:1135
#define SWJ_PIN_TRST
Definition: cmsis_dap.c:153
#define SWJ_PIN_TDI
Definition: cmsis_dap.c:151
static void cmsis_dap_execute_pathmove(struct jtag_command *cmd)
Definition: cmsis_dap.c:1880
static const struct command_registration cmsis_dap_command_handlers[]
Definition: cmsis_dap.c:2318
#define CMD_DAP_SWO_DATA
Definition: cmsis_dap.c:195
#define DAP_SWO_CONTROL_START
Definition: cmsis_dap.c:210
static int cmsis_dap_execute_tlr_reset(struct jtag_command *cmd)
Definition: cmsis_dap.c:1517
static int cmsis_dap_get_swo_buf_sz(uint32_t *swo_buf_sz)
Definition: cmsis_dap.c:1195
#define LED_ON
Definition: cmsis_dap.c:126
static int cmsis_dap_config_trace(bool trace_enabled, enum tpiu_pin_protocol pin_protocol, uint32_t port_size, unsigned int *swo_freq, unsigned int traceclkin_hz, uint16_t *swo_prescaler)
Definition: cmsis_dap.c:2028
#define DAP_SWO_MODE_UART
Definition: cmsis_dap.c:205
static void cmsis_dap_add_jtag_sequence(unsigned int s_len, const uint8_t *sequence, unsigned int s_offset, bool tms, uint8_t *tdo_buffer, unsigned int tdo_buffer_offset)
Definition: cmsis_dap.c:1665
static void cmsis_dap_add_tms_sequence(const uint8_t *sequence, int s_len)
Definition: cmsis_dap.c:1727
static uint16_t cmsis_dap_pid[MAX_USB_IDS+1]
Definition: cmsis_dap.c:84
#define SWJ_PIN_TDO
Definition: cmsis_dap.c:152
static int cmsis_dap_get_version_info(void)
Definition: cmsis_dap.c:1155
#define CMD_DAP_SWJ_PINS
Definition: cmsis_dap.c:135
#define DAP_JTAG_SEQ_TCK
Definition: cmsis_dap.c:167
#define MAX_PENDING_REQUESTS
Definition: cmsis_dap.h:19
const struct command_registration cmsis_dap_usb_subcommand_handlers[]
const struct command_registration cmsis_dap_tcp_subcommand_handlers[]
cmsis_dap_blocking
Definition: cmsis_dap.h:61
@ CMSIS_DAP_NON_BLOCKING
Definition: cmsis_dap.h:62
@ CMSIS_DAP_BLOCKING
Definition: cmsis_dap.h:63
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:371
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:141
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:156
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:400
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:151
#define COMMAND_PARSE_ENABLE(in, out)
parses an enable/disable command argument
Definition: command.h:531
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
Definition: command.h:440
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:251
#define ERROR_COMMAND_ARGUMENT_INVALID
Definition: command.h:402
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_ANY
Definition: command.h:42
@ COMMAND_EXEC
Definition: command.h:40
enum scan_type jtag_scan_type(const struct scan_command *cmd)
Definition: commands.c:167
@ JTAG_TLR_RESET
Definition: commands.h:137
@ JTAG_SCAN
Definition: commands.h:129
@ JTAG_PATHMOVE
Definition: commands.h:140
@ JTAG_STABLECLOCKS
Definition: commands.h:142
@ JTAG_RUNTEST
Definition: commands.h:138
@ JTAG_SLEEP
Definition: commands.h:141
@ JTAG_TMS
Definition: commands.h:143
#define TPIU_ACPR_MAX_SWOSCALER
Definition: cortex_m.h:171
void delay_us(uint16_t delay)
Definition: delay.c:23
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
enum tap_state tap_get_end_state(void)
For more information,.
Definition: interface.c:56
enum tap_state tap_state_transition(enum tap_state cur_state, bool tms)
Function tap_state_transition takes a current TAP state and returns the next state according to the t...
Definition: interface.c:223
const char * tap_state_name(enum tap_state state)
Function tap_state_name Returns a string suitable for display representing the JTAG tap_state.
Definition: interface.c:344
int tap_get_tms_path_len(enum tap_state from, enum tap_state to)
Function int tap_get_tms_path_len returns the total number of bits that represents a TMS path transit...
Definition: interface.c:195
void tap_set_end_state(enum tap_state new_end_state)
This function sets the state of an "end state follower" which tracks the state that any cable driver ...
Definition: interface.c:48
enum tap_state tap_get_state(void)
This function gets the state of the "state follower" which tracks the state of the TAPs connected to ...
Definition: interface.c:37
bool tap_is_state_stable(enum tap_state astate)
Function tap_is_state_stable returns true if the astate is stable.
Definition: interface.c:200
int tap_get_tms_path(enum tap_state from, enum tap_state to)
This function provides a "bit sequence" indicating what has to be done with TMS during a sequence of ...
Definition: interface.c:190
#define DEBUG_CAP_TMS_SEQ
Definition: interface.h:188
#define tap_set_state(new_state)
This function sets the state of a "state follower" which tracks the state of the TAPs connected to th...
Definition: interface.h:50
static enum reset_types jtag_reset_config
Definition: jtag/core.c:89
void jtag_sleep(uint32_t us)
Definition: jtag/core.c:1075
enum reset_types jtag_get_reset_config(void)
Definition: jtag/core.c:1747
#define ERROR_JTAG_DEVICE_ERROR
Definition: jtag.h:558
tap_state
Defines JTAG Test Access Port states.
Definition: jtag.h:37
@ TAP_RESET
Definition: jtag.h:56
@ TAP_IRSHIFT
Definition: jtag.h:51
@ TAP_IDLE
Definition: jtag.h:53
@ TAP_DRSHIFT
Definition: jtag.h:43
reset_types
Definition: jtag.h:215
@ RESET_SRST_NO_GATING
Definition: jtag.h:224
@ RESET_CNCT_UNDER_SRST
Definition: jtag.h:225
#define ERROR_JTAG_NOT_IMPLEMENTED
Definition: jtag.h:554
static struct scan_blk scan
Definition: lakemont.c:60
#define ERROR_NOT_IMPLEMENTED
Definition: log.h:179
#define LOG_DEBUG_IO(expr ...)
Definition: log.h:103
#define LOG_WARNING(expr ...)
Definition: log.h:131
#define ERROR_FAIL
Definition: log.h:175
#define LOG_ERROR(expr ...)
Definition: log.h:134
#define ERROR_TIMEOUT_REACHED
Definition: log.h:178
#define LOG_INFO(expr ...)
Definition: log.h:128
#define LOG_DEBUG(expr ...)
Definition: log.h:111
#define ERROR_OK
Definition: log.h:169
static uint32_t bit(uint32_t value, unsigned int b)
Definition: opcodes.h:15
uint8_t mask
Definition: parport.c:70
#define MIN(a, b)
Definition: replacements.h:22
#define BIT(nr)
Definition: stm32l4x.h:18
Represents a driver for a debugging interface.
Definition: interface.h:208
const char *const name
The name of the interface driver.
Definition: interface.h:210
int(* read)(struct cmsis_dap *dap, int transfer_timeout_ms, enum cmsis_dap_blocking blocking)
Definition: cmsis_dap.h:70
void(* cancel_all)(struct cmsis_dap *dap)
Definition: cmsis_dap.h:75
const char * name
Definition: cmsis_dap.h:67
int(* packet_buffer_alloc)(struct cmsis_dap *dap, unsigned int pkt_sz)
Definition: cmsis_dap.h:73
void(* close)(struct cmsis_dap *dap)
Definition: cmsis_dap.h:69
void(* packet_buffer_free)(struct cmsis_dap *dap)
Definition: cmsis_dap.h:74
int(* open)(struct cmsis_dap *dap, uint16_t vids[], uint16_t pids[], const char *serial)
Definition: cmsis_dap.h:68
int(* write)(struct cmsis_dap *dap, int len, int timeout_ms)
Definition: cmsis_dap.h:72
unsigned int packet_usable_size
Definition: cmsis_dap.h:31
struct pending_request_block pending_fifo[MAX_PENDING_REQUESTS]
Definition: cmsis_dap.h:49
unsigned int pending_fifo_put_idx
Definition: cmsis_dap.h:51
uint16_t caps
Definition: cmsis_dap.h:54
unsigned int packet_size
Definition: cmsis_dap.h:30
unsigned int read_count
Definition: cmsis_dap.h:40
unsigned int pending_fifo_block_count
Definition: cmsis_dap.h:52
bool trace_enabled
Definition: cmsis_dap.h:57
uint8_t * response
Definition: cmsis_dap.h:35
bool swd_cmds_differ
Definition: cmsis_dap.h:46
uint8_t common_swd_cmd
Definition: cmsis_dap.h:45
uint8_t * command
Definition: cmsis_dap.h:34
unsigned int packet_count
Definition: cmsis_dap.h:50
uint8_t * packet_buffer
Definition: cmsis_dap.h:33
unsigned int write_count
Definition: cmsis_dap.h:39
const struct cmsis_dap_backend * backend
Definition: cmsis_dap.h:29
unsigned int pending_fifo_get_idx
Definition: cmsis_dap.h:51
uint32_t swo_buf_sz
Definition: cmsis_dap.h:56
const char * name
Definition: command.h:234
enum command_mode mode
Definition: command.h:236
Represents a driver for a debugging interface.
Definition: interface.h:183
unsigned int supported
Bit vector listing capabilities exposed by this driver.
Definition: interface.h:187
struct pending_transfer_result * transfers
Definition: cmsis_dap.h:22
unsigned int transfer_count
Definition: cmsis_dap.h:23
unsigned int buffer_offset
Offset in the destination buffer.
Definition: cmsis_dap.c:242
unsigned int first
Offset in bytes in the CMD_DAP_JTAG_SEQ response buffer.
Definition: cmsis_dap.c:236
unsigned int length
Number of bits to read.
Definition: cmsis_dap.c:238
uint8_t * buffer
Location to store the result.
Definition: arm-jtag-ew.c:517
This structure defines a single scan field in the scan.
Definition: jtag.h:87
uint8_t * in_value
A pointer to a 32-bit memory location for data scanned out.
Definition: jtag.h:93
const uint8_t * out_value
A pointer to value to be scanned into the device.
Definition: jtag.h:91
unsigned int num_bits
The number of bits this field specifies.
Definition: jtag.h:89
Definition: osbdm.c:17
int(* init)(void)
Initialize the debug link so it can perform SWD operations.
Definition: swd.h:255
Definition: psoc6.c:83
Wrapper for transport lifecycle operations.
Definition: transport.h:55
static const unsigned int swd_seq_dormant_to_swd_len
Definition: swd.h:190
static const uint8_t swd_seq_dormant_to_jtag[]
Dormant-to-JTAG sequence.
Definition: swd.h:230
#define SWD_CMD_A32
Definition: swd.h:19
static const uint8_t swd_seq_dormant_to_swd[]
Dormant-to-SWD sequence.
Definition: swd.h:171
static const uint8_t swd_seq_jtag_to_dormant[]
JTAG-to-dormant sequence.
Definition: swd.h:199
#define SWD_CMD_PARK
Definition: swd.h:22
static int swd_ack_to_error_code(uint8_t ack)
Convert SWD ACK value returned from DP to OpenOCD error code.
Definition: swd.h:72
static uint8_t swd_cmd(bool is_read, bool is_ap, uint8_t regnum)
Construct a "cmd" byte, in lSB bit order, which swd_driver.read_reg() and swd_driver....
Definition: swd.h:35
static const unsigned int swd_seq_jtag_to_swd_len
Definition: swd.h:125
static const unsigned int swd_seq_line_reset_len
Definition: swd.h:104
static const unsigned int swd_seq_dormant_to_jtag_len
Definition: swd.h:244
#define SWD_CMD_APNDP
Definition: swd.h:17
static const unsigned int swd_seq_swd_to_dormant_len
Definition: swd.h:159
#define SWD_CMD_START
Definition: swd.h:16
#define SWD_CMD_RNW
Definition: swd.h:18
static const uint8_t swd_seq_line_reset[]
SWD Line reset.
Definition: swd.h:98
#define SWD_CMD_STOP
Definition: swd.h:21
static const uint8_t swd_seq_jtag_to_swd[]
JTAG-to-SWD sequence.
Definition: swd.h:115
static const uint8_t swd_seq_swd_to_jtag[]
SWD-to-JTAG sequence.
Definition: swd.h:136
static const unsigned int swd_seq_swd_to_jtag_len
Definition: swd.h:144
static const unsigned int swd_seq_jtag_to_dormant_len
Definition: swd.h:211
static const uint8_t swd_seq_swd_to_dormant[]
SWD-to-dormant sequence.
Definition: swd.h:153
trace_status
Definition: trace.h:36
#define TRANSPORT_SWD
Definition: transport.h:20
#define TRANSPORT_JTAG
Definition: transport.h:19
static uint16_t le_to_h_u16(const uint8_t *buf)
Definition: types.h:122
static void h_u32_to_le(uint8_t *buf, uint32_t val)
Definition: types.h:178
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.
Definition: types.h:57
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
Definition: types.h:79
static void h_u16_to_le(uint8_t *buf, uint16_t val)
Definition: types.h:208
static uint32_t le_to_h_u32(const uint8_t *buf)
Definition: types.h:112
static int parity_u32(uint32_t x)
Calculate the (even) parity of a 32-bit datum.
Definition: types.h:265
static struct ublast_lowlevel_priv info
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t offset[4]
Definition: vdebug.c:9
uint8_t state[4]
Definition: vdebug.c:21