OpenOCD
cmsis_dap_usb.c
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2016 by Maksym Hilliaka *
3  * oter@frozen-team.com *
4  * *
5  * Copyright (C) 2016 by Phillip Pearson *
6  * pp@myelin.co.nz *
7  * *
8  * Copyright (C) 2014 by Paul Fertser *
9  * fercerpav@gmail.com *
10  * *
11  * Copyright (C) 2013 by mike brown *
12  * mike@theshedworks.org.uk *
13  * *
14  * Copyright (C) 2013 by Spencer Oliver *
15  * spen@spen-soft.co.uk *
16  * *
17  * This program is free software; you can redistribute it and/or modify *
18  * it under the terms of the GNU General Public License as published by *
19  * the Free Software Foundation; either version 2 of the License, or *
20  * (at your option) any later version. *
21  * *
22  * This program is distributed in the hope that it will be useful, *
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
25  * GNU General Public License for more details. *
26  * *
27  * You should have received a copy of the GNU General Public License *
28  * along with this program. If not, see <http://www.gnu.org/licenses/>. *
29  ***************************************************************************/
30 
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34 
35 #include <transport/transport.h>
36 #include <jtag/swd.h>
37 #include <jtag/interface.h>
38 #include <jtag/commands.h>
39 #include <jtag/tcl.h>
40 
41 #include <hidapi.h>
42 
43 /*
44  * See CMSIS-DAP documentation:
45  * Version 0.01 - Beta.
46  */
47 
48 /* USB Config */
49 
50 /* Known vid/pid pairs:
51  * VID 0xc251: Keil Software
52  * PID 0xf001: LPC-Link-II CMSIS_DAP
53  * PID 0xf002: OPEN-SDA CMSIS_DAP (Freedom Board)
54  * PID 0x2722: Keil ULINK2 CMSIS-DAP
55  *
56  * VID 0x0d28: mbed Software
57  * PID 0x0204: MBED CMSIS-DAP
58  */
59 
60 #define MAX_USB_IDS 8
61 /* vid = pid = 0 marks the end of the list */
62 static uint16_t cmsis_dap_vid[MAX_USB_IDS + 1] = { 0 };
63 static uint16_t cmsis_dap_pid[MAX_USB_IDS + 1] = { 0 };
64 static wchar_t *cmsis_dap_serial;
65 static bool swd_mode;
66 
67 #define PACKET_SIZE (64 + 1) /* 64 bytes plus report id */
68 #define USB_TIMEOUT 1000
69 
70 /* CMSIS-DAP General Commands */
71 #define CMD_DAP_INFO 0x00
72 #define CMD_DAP_LED 0x01
73 #define CMD_DAP_CONNECT 0x02
74 #define CMD_DAP_DISCONNECT 0x03
75 #define CMD_DAP_WRITE_ABORT 0x08
76 #define CMD_DAP_DELAY 0x09
77 #define CMD_DAP_RESET_TARGET 0x0A
78 
79 /* CMD_INFO */
80 #define INFO_ID_VID 0x00 /* string */
81 #define INFO_ID_PID 0x02 /* string */
82 #define INFO_ID_SERNUM 0x03 /* string */
83 #define INFO_ID_FW_VER 0x04 /* string */
84 #define INFO_ID_TD_VEND 0x05 /* string */
85 #define INFO_ID_TD_NAME 0x06 /* string */
86 #define INFO_ID_CAPS 0xf0 /* byte */
87 #define INFO_ID_PKT_CNT 0xfe /* byte */
88 #define INFO_ID_PKT_SZ 0xff /* short */
89 
90 #define INFO_CAPS_SWD 0x01
91 #define INFO_CAPS_JTAG 0x02
92 
93 /* CMD_LED */
94 #define LED_ID_CONNECT 0x00
95 #define LED_ID_RUN 0x01
96 
97 #define LED_OFF 0x00
98 #define LED_ON 0x01
99 
100 /* CMD_CONNECT */
101 #define CONNECT_DEFAULT 0x00
102 #define CONNECT_SWD 0x01
103 #define CONNECT_JTAG 0x02
104 
105 /* CMSIS-DAP Common SWD/JTAG Commands */
106 #define CMD_DAP_DELAY 0x09
107 #define CMD_DAP_SWJ_PINS 0x10
108 #define CMD_DAP_SWJ_CLOCK 0x11
109 #define CMD_DAP_SWJ_SEQ 0x12
110 
111 /*
112  * PINS
113  * Bit 0: SWCLK/TCK
114  * Bit 1: SWDIO/TMS
115  * Bit 2: TDI
116  * Bit 3: TDO
117  * Bit 5: nTRST
118  * Bit 7: nRESET
119  */
120 
121 #define SWJ_PIN_TCK (1<<0)
122 #define SWJ_PIN_TMS (1<<1)
123 #define SWJ_PIN_TDI (1<<2)
124 #define SWJ_PIN_TDO (1<<3)
125 #define SWJ_PIN_TRST (1<<5)
126 #define SWJ_PIN_SRST (1<<7)
127 
128 /* CMSIS-DAP SWD Commands */
129 #define CMD_DAP_SWD_CONFIGURE 0x13
130 
131 /* CMSIS-DAP JTAG Commands */
132 #define CMD_DAP_JTAG_SEQ 0x14
133 #define CMD_DAP_JTAG_CONFIGURE 0x15
134 #define CMD_DAP_JTAG_IDCODE 0x16
135 
136 /* CMSIS-DAP JTAG sequence info masks */
137 /* Number of bits to clock through (0 means 64) */
138 #define DAP_JTAG_SEQ_TCK 0x3F
139 /* TMS will be set during the sequence if this bit is set */
140 #define DAP_JTAG_SEQ_TMS 0x40
141 /* TDO output will be captured if this bit is set */
142 #define DAP_JTAG_SEQ_TDO 0x80
143 
144 
145 /* CMSIS-DAP Transfer Commands */
146 #define CMD_DAP_TFER_CONFIGURE 0x04
147 #define CMD_DAP_TFER 0x05
148 #define CMD_DAP_TFER_BLOCK 0x06
149 #define CMD_DAP_TFER_ABORT 0x07
150 
151 /* DAP Status Code */
152 #define DAP_OK 0
153 #define DAP_ERROR 0xFF
154 
155 /* CMSIS-DAP Vendor Commands
156  * None as yet... */
157 
158 static const char * const info_caps_str[] = {
159  "SWD Supported",
160  "JTAG Supported"
161 };
162 
163 /* max clock speed (kHz) */
164 #define DAP_MAX_CLOCK 5000
165 
166 struct cmsis_dap {
167  hid_device *dev_handle;
168  uint16_t packet_size;
169  uint16_t packet_count;
170  uint8_t *packet_buffer;
171  uint8_t caps;
172  uint8_t mode;
173 };
174 
176  uint8_t cmd;
177  uint32_t data;
178  void *buffer;
179 };
180 
181 struct pending_scan_result {
183  unsigned first;
185  unsigned length;
187  uint8_t *buffer;
189  unsigned buffer_offset;
190 };
191 
194 
195 /* pointers to buffers that will receive jtag scan results on the next flush */
196 #define MAX_PENDING_SCAN_RESULTS 256
199 
200 /* queued JTAG sequences that will be executed on the next flush */
201 #define QUEUED_SEQ_BUF_LEN (cmsis_dap_handle->packet_size - 3)
202 static int queued_seq_count;
205 static uint8_t queued_seq_buf[1024]; /* TODO: make dynamic / move into cmsis object */
206 
207 static int queued_retval;
208 
210 
211 static int cmsis_dap_usb_open(void)
212 {
213  hid_device *dev = NULL;
214  int i;
215  struct hid_device_info *devs, *cur_dev;
216  unsigned short target_vid, target_pid;
217  wchar_t *target_serial = NULL;
218 
219  bool found = false;
220  bool serial_found = false;
221 
222  target_vid = 0;
223  target_pid = 0;
224 
225  /*
226  * The CMSIS-DAP specification stipulates:
227  * "The Product String must contain "CMSIS-DAP" somewhere in the string. This is used by the
228  * debuggers to identify a CMSIS-DAP compliant Debug Unit that is connected to a host computer."
229  */
230  devs = hid_enumerate(0x0, 0x0);
231  cur_dev = devs;
232  while (NULL != cur_dev) {
233  if (0 == cmsis_dap_vid[0]) {
234  if (NULL == cur_dev->product_string) {
235  LOG_DEBUG("Cannot read product string of device 0x%x:0x%x",
236  cur_dev->vendor_id, cur_dev->product_id);
237  } else {
238  if (wcsstr(cur_dev->product_string, L"CMSIS-DAP")) {
239  /* if the user hasn't specified VID:PID *and*
240  * product string contains "CMSIS-DAP", pick it
241  */
242  found = true;
243  }
244  }
245  } else {
246  /* otherwise, exhaustively compare against all VID:PID in list */
247  for (i = 0; cmsis_dap_vid[i] || cmsis_dap_pid[i]; i++) {
248  if ((cmsis_dap_vid[i] == cur_dev->vendor_id) && (cmsis_dap_pid[i] == cur_dev->product_id))
249  found = true;
250  }
251 
252  if (cmsis_dap_vid[i] || cmsis_dap_pid[i])
253  found = true;
254  }
255 
256  if (found) {
257  /* we have found an adapter, so exit further checks */
258  /* check serial number matches if given */
259  if (cmsis_dap_serial != NULL) {
260  if ((cur_dev->serial_number != NULL) && wcscmp(cmsis_dap_serial, cur_dev->serial_number) == 0) {
261  serial_found = true;
262  break;
263  }
264  } else
265  break;
266 
267  found = false;
268  }
269 
270  cur_dev = cur_dev->next;
271  }
272 
273  if (NULL != cur_dev) {
274  target_vid = cur_dev->vendor_id;
275  target_pid = cur_dev->product_id;
276  if (serial_found)
277  target_serial = cmsis_dap_serial;
278  }
279 
280  hid_free_enumeration(devs);
281 
282  if (target_vid == 0 && target_pid == 0) {
283  LOG_ERROR("unable to find CMSIS-DAP device");
284  return ERROR_FAIL;
285  }
286 
287  if (hid_init() != 0) {
288  LOG_ERROR("unable to open HIDAPI");
289  return ERROR_FAIL;
290  }
291 
292  dev = hid_open(target_vid, target_pid, target_serial);
293 
294  if (dev == NULL) {
295  LOG_ERROR("unable to open CMSIS-DAP device 0x%x:0x%x", target_vid, target_pid);
296  return ERROR_FAIL;
297  }
298 
299  struct cmsis_dap *dap = malloc(sizeof(struct cmsis_dap));
300  if (dap == NULL) {
301  LOG_ERROR("unable to allocate memory");
302  return ERROR_FAIL;
303  }
304 
305  dap->dev_handle = dev;
306  dap->caps = 0;
307  dap->mode = 0;
308 
309  cmsis_dap_handle = dap;
310 
311  /* allocate default packet buffer, may be changed later.
312  * currently with HIDAPI we have no way of getting the output report length
313  * without this info we cannot communicate with the adapter.
314  * For the moment we ahve to hard code the packet size */
315 
316  int packet_size = PACKET_SIZE;
317 
318  /* atmel cmsis-dap uses 512 byte reports */
319  /* except when it doesn't e.g. with mEDBG on SAMD10 Xplained
320  * board */
321  /* TODO: HID report descriptor should be parsed instead of
322  * hardcoding a match by VID */
323  if (target_vid == 0x03eb && target_pid != 0x2145)
324  packet_size = 512 + 1;
325 
326  cmsis_dap_handle->packet_buffer = malloc(packet_size);
327  cmsis_dap_handle->packet_size = packet_size;
328 
329  if (cmsis_dap_handle->packet_buffer == NULL) {
330  LOG_ERROR("unable to allocate memory");
331  return ERROR_FAIL;
332  }
333 
334  return ERROR_OK;
335 }
336 
337 static void cmsis_dap_usb_close(struct cmsis_dap *dap)
338 {
339  hid_close(dap->dev_handle);
340  hid_exit();
341 
342  free(cmsis_dap_handle->packet_buffer);
343  free(cmsis_dap_handle);
344  cmsis_dap_handle = NULL;
345  free(cmsis_dap_serial);
347  free(pending_transfers);
348  pending_transfers = NULL;
349 
350  return;
351 }
352 
353 /* Send a message and receive the reply */
354 static int cmsis_dap_usb_xfer(struct cmsis_dap *dap, int txlen)
355 {
356 #ifdef CMSIS_DAP_JTAG_DEBUG
357  LOG_DEBUG("cmsis-dap usb xfer cmd=%02X", dap->packet_buffer[1]);
358 #endif
359  /* Pad the rest of the TX buffer with 0's */
360  memset(dap->packet_buffer + txlen, 0, dap->packet_size - txlen);
361 
362  /* write data to device */
363  int retval = hid_write(dap->dev_handle, dap->packet_buffer, dap->packet_size);
364  if (retval == -1) {
365  LOG_ERROR("error writing data: %ls", hid_error(dap->dev_handle));
366  return ERROR_FAIL;
367  }
368 
369  /* get reply */
370  retval = hid_read_timeout(dap->dev_handle, dap->packet_buffer, dap->packet_size, USB_TIMEOUT);
371  if (retval == -1 || retval == 0) {
372  LOG_DEBUG("error reading data: %ls", hid_error(dap->dev_handle));
373  return ERROR_FAIL;
374  }
375 
376  return ERROR_OK;
377 }
378 
379 static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins, uint8_t mask, uint32_t delay, uint8_t *input)
380 {
381  int retval;
382  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
383 
384  buffer[0] = 0; /* report number */
385  buffer[1] = CMD_DAP_SWJ_PINS;
386  buffer[2] = pins;
387  buffer[3] = mask;
388  buffer[4] = delay & 0xff;
389  buffer[5] = (delay >> 8) & 0xff;
390  buffer[6] = (delay >> 16) & 0xff;
391  buffer[7] = (delay >> 24) & 0xff;
392  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 8);
393 
394  if (retval != ERROR_OK) {
395  LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_PINS failed.");
397  }
398 
399  if (input)
400  *input = buffer[1];
401 
402  return ERROR_OK;
403 }
404 
405 static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock)
406 {
407  int retval;
408  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
409 
410  /* set clock in Hz */
411  swj_clock *= 1000;
412  buffer[0] = 0; /* report number */
413  buffer[1] = CMD_DAP_SWJ_CLOCK;
414  buffer[2] = swj_clock & 0xff;
415  buffer[3] = (swj_clock >> 8) & 0xff;
416  buffer[4] = (swj_clock >> 16) & 0xff;
417  buffer[5] = (swj_clock >> 24) & 0xff;
418  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 6);
419 
420  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
421  LOG_ERROR("CMSIS-DAP command CMD_DAP_SWJ_CLOCK failed.");
423  }
424 
425  return ERROR_OK;
426 }
427 
428 /* clock a sequence of bits out on TMS, to change JTAG states */
429 static int cmsis_dap_cmd_DAP_SWJ_Sequence(uint8_t s_len, const uint8_t *sequence)
430 {
431  int retval;
432  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
433 
434 #ifdef CMSIS_DAP_JTAG_DEBUG
435  LOG_DEBUG("cmsis-dap TMS sequence: len=%d", s_len);
436  for (int i = 0; i < DIV_ROUND_UP(s_len, 8); ++i)
437  printf("%02X ", sequence[i]);
438 
439  printf("\n");
440 #endif
441 
442  buffer[0] = 0; /* report number */
443  buffer[1] = CMD_DAP_SWJ_SEQ;
444  buffer[2] = s_len;
445  bit_copy(&buffer[3], 0, sequence, 0, s_len);
446 
447  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, DIV_ROUND_UP(s_len, 8) + 3);
448 
449  if (retval != ERROR_OK || buffer[1] != DAP_OK)
450  return ERROR_FAIL;
451 
452  return ERROR_OK;
453 }
454 
455 static int cmsis_dap_cmd_DAP_Info(uint8_t info, uint8_t **data)
456 {
457  int retval;
458  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
459 
460  buffer[0] = 0; /* report number */
461  buffer[1] = CMD_DAP_INFO;
462  buffer[2] = info;
463  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
464 
465  if (retval != ERROR_OK) {
466  LOG_ERROR("CMSIS-DAP command CMD_INFO failed.");
468  }
469 
470  *data = &(buffer[1]);
471 
472  return ERROR_OK;
473 }
474 
475 static int cmsis_dap_cmd_DAP_LED(uint8_t leds)
476 {
477  int retval;
478  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
479 
480  buffer[0] = 0; /* report number */
481  buffer[1] = CMD_DAP_LED;
482  buffer[2] = 0x00;
483  buffer[3] = leds;
484  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 4);
485 
486  if (retval != ERROR_OK || buffer[1] != 0x00) {
487  LOG_ERROR("CMSIS-DAP command CMD_LED failed.");
489  }
490 
491  return ERROR_OK;
492 }
493 
494 static int cmsis_dap_cmd_DAP_Connect(uint8_t mode)
495 {
496  int retval;
497  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
498 
499  buffer[0] = 0; /* report number */
500  buffer[1] = CMD_DAP_CONNECT;
501  buffer[2] = mode;
502  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
503 
504  if (retval != ERROR_OK) {
505  LOG_ERROR("CMSIS-DAP command CMD_CONNECT failed.");
507  }
508 
509  if (buffer[1] != mode) {
510  LOG_ERROR("CMSIS-DAP failed to connect in mode (%d)", mode);
512  }
513 
514  return ERROR_OK;
515 }
516 
518 {
519  int retval;
520  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
521 
522  buffer[0] = 0; /* report number */
523  buffer[1] = CMD_DAP_DISCONNECT;
524  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 2);
525 
526  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
527  LOG_ERROR("CMSIS-DAP command CMD_DISCONNECT failed.");
529  }
530 
531  return ERROR_OK;
532 }
533 
534 static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle, uint16_t retry_count, uint16_t match_retry)
535 {
536  int retval;
537  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
538 
539  buffer[0] = 0; /* report number */
540  buffer[1] = CMD_DAP_TFER_CONFIGURE;
541  buffer[2] = idle;
542  buffer[3] = retry_count & 0xff;
543  buffer[4] = (retry_count >> 8) & 0xff;
544  buffer[5] = match_retry & 0xff;
545  buffer[6] = (match_retry >> 8) & 0xff;
546  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 7);
547 
548  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
549  LOG_ERROR("CMSIS-DAP command CMD_TFER_Configure failed.");
551  }
552 
553  return ERROR_OK;
554 }
555 
556 static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg)
557 {
558  int retval;
559  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
560 
561  buffer[0] = 0; /* report number */
562  buffer[1] = CMD_DAP_SWD_CONFIGURE;
563  buffer[2] = cfg;
564  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 3);
565 
566  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
567  LOG_ERROR("CMSIS-DAP command CMD_SWD_Configure failed.");
569  }
570 
571  return ERROR_OK;
572 }
573 
574 #if 0
575 static int cmsis_dap_cmd_DAP_Delay(uint16_t delay_us)
576 {
577  int retval;
578  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
579 
580  buffer[0] = 0; /* report number */
581  buffer[1] = CMD_DAP_DELAY;
582  buffer[2] = delay_us & 0xff;
583  buffer[3] = (delay_us >> 8) & 0xff;
584  retval = cmsis_dap_usb_xfer(cmsis_dap_handle, 4);
585 
586  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
587  LOG_ERROR("CMSIS-DAP command CMD_Delay failed.");
589  }
590 
591  return ERROR_OK;
592 }
593 #endif
594 
595 static int cmsis_dap_swd_run_queue(void)
596 {
597  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
598 
599  LOG_DEBUG("Executing %d queued transactions", pending_transfer_count);
600 
601  if (queued_retval != ERROR_OK) {
602  LOG_DEBUG("Skipping due to previous errors: %d", queued_retval);
603  goto skip;
604  }
605 
607  goto skip;
608 
609  size_t idx = 0;
610  buffer[idx++] = 0; /* report number */
611  buffer[idx++] = CMD_DAP_TFER;
612  buffer[idx++] = 0x00; /* DAP Index */
613  buffer[idx++] = pending_transfer_count;
614 
615  for (int i = 0; i < pending_transfer_count; i++) {
616  uint8_t cmd = pending_transfers[i].cmd;
617  uint32_t data = pending_transfers[i].data;
618 
619  LOG_DEBUG("%s %s reg %x %"PRIx32,
620  cmd & SWD_CMD_APnDP ? "AP" : "DP",
621  cmd & SWD_CMD_RnW ? "read" : "write",
622  (cmd & SWD_CMD_A32) >> 1, data);
623 
624  /* When proper WAIT handling is implemented in the
625  * common SWD framework, this kludge can be
626  * removed. However, this might lead to minor
627  * performance degradation as the adapter wouldn't be
628  * able to automatically retry anything (because ARM
629  * has forgotten to implement sticky error flags
630  * clearing). See also comments regarding
631  * cmsis_dap_cmd_DAP_TFER_Configure() and
632  * cmsis_dap_cmd_DAP_SWD_Configure() in
633  * cmsis_dap_init().
634  */
635  if (!(cmd & SWD_CMD_RnW) &&
636  !(cmd & SWD_CMD_APnDP) &&
637  (cmd & SWD_CMD_A32) >> 1 == DP_CTRL_STAT &&
638  (data & CORUNDETECT)) {
639  LOG_DEBUG("refusing to enable sticky overrun detection");
640  data &= ~CORUNDETECT;
641  }
642 
643  buffer[idx++] = (cmd >> 1) & 0x0f;
644  if (!(cmd & SWD_CMD_RnW)) {
645  buffer[idx++] = (data) & 0xff;
646  buffer[idx++] = (data >> 8) & 0xff;
647  buffer[idx++] = (data >> 16) & 0xff;
648  buffer[idx++] = (data >> 24) & 0xff;
649  }
650  }
651 
652  queued_retval = cmsis_dap_usb_xfer(cmsis_dap_handle, idx);
653  if (queued_retval != ERROR_OK)
654  goto skip;
655 
656  idx = 2;
657  uint8_t ack = buffer[idx] & 0x07;
658  if (ack != SWD_ACK_OK || (buffer[idx] & 0x08)) {
659  LOG_DEBUG("SWD ack not OK: %d %s", buffer[idx-1],
660  ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK");
662  goto skip;
663  }
664  idx++;
665 
666  if (pending_transfer_count != buffer[1])
667  LOG_ERROR("CMSIS-DAP transfer count mismatch: expected %d, got %d",
668  pending_transfer_count, buffer[1]);
669 
670  for (int i = 0; i < buffer[1]; i++) {
671  if (pending_transfers[i].cmd & SWD_CMD_RnW) {
672  static uint32_t last_read;
673  uint32_t data = le_to_h_u32(&buffer[idx]);
674  uint32_t tmp = data;
675  idx += 4;
676 
677  LOG_DEBUG("Read result: %"PRIx32, data);
678 
679  /* Imitate posted AP reads */
680  if ((pending_transfers[i].cmd & SWD_CMD_APnDP) ||
681  ((pending_transfers[i].cmd & SWD_CMD_A32) >> 1 == DP_RDBUFF)) {
682  tmp = last_read;
683  last_read = data;
684  }
685 
686  if (pending_transfers[i].buffer)
687  *(uint32_t *)pending_transfers[i].buffer = tmp;
688  }
689  }
690 
691 skip:
692  pending_transfer_count = 0;
693  int retval = queued_retval;
695 
696  return retval;
697 }
698 
699 static void cmsis_dap_swd_queue_cmd(uint8_t cmd, uint32_t *dst, uint32_t data)
700 {
702  /* Not enough room in the queue. Run the queue. */
704  }
705 
706  if (queued_retval != ERROR_OK)
707  return;
708 
709  pending_transfers[pending_transfer_count].data = data;
710  pending_transfers[pending_transfer_count].cmd = cmd;
711  if (cmd & SWD_CMD_RnW) {
712  /* Queue a read transaction */
713  pending_transfers[pending_transfer_count].buffer = dst;
714  }
716 }
717 
718 static void cmsis_dap_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
719 {
720  assert(!(cmd & SWD_CMD_RnW));
721  cmsis_dap_swd_queue_cmd(cmd, NULL, value);
722 }
723 
724 static void cmsis_dap_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
725 {
726  assert(cmd & SWD_CMD_RnW);
727  cmsis_dap_swd_queue_cmd(cmd, value, 0);
728 }
729 
731 {
732  uint8_t *data;
733 
734  /* INFO_ID_FW_VER - string */
735  int retval = cmsis_dap_cmd_DAP_Info(INFO_ID_FW_VER, &data);
736  if (retval != ERROR_OK)
737  return retval;
738 
739  if (data[0]) /* strlen */
740  LOG_INFO("CMSIS-DAP: FW Version = %s", &data[1]);
741 
742  return ERROR_OK;
743 }
744 
745 static int cmsis_dap_get_caps_info(void)
746 {
747  uint8_t *data;
748 
749  /* INFO_ID_CAPS - byte */
750  int retval = cmsis_dap_cmd_DAP_Info(INFO_ID_CAPS, &data);
751  if (retval != ERROR_OK)
752  return retval;
753 
754  if (data[0] == 1) {
755  uint8_t caps = data[1];
756 
757  cmsis_dap_handle->caps = caps;
758 
759  if (caps & INFO_CAPS_SWD)
760  LOG_INFO("CMSIS-DAP: %s", info_caps_str[0]);
761  if (caps & INFO_CAPS_JTAG)
762  LOG_INFO("CMSIS-DAP: %s", info_caps_str[1]);
763  }
764 
765  return ERROR_OK;
766 }
767 
768 static int cmsis_dap_get_status(void)
769 {
770  uint8_t d;
771 
772  int retval = cmsis_dap_cmd_DAP_SWJ_Pins(0, 0, 0, &d);
773 
774  if (retval == ERROR_OK) {
775  LOG_INFO("SWCLK/TCK = %d SWDIO/TMS = %d TDI = %d TDO = %d nTRST = %d nRESET = %d",
776  (d & SWJ_PIN_TCK) ? 1 : 0,
777  (d & SWJ_PIN_TMS) ? 1 : 0,
778  (d & SWJ_PIN_TDI) ? 1 : 0,
779  (d & SWJ_PIN_TDO) ? 1 : 0,
780  (d & SWJ_PIN_TRST) ? 1 : 0,
781  (d & SWJ_PIN_SRST) ? 1 : 0);
782  }
783 
784  return retval;
785 }
786 
788 {
789  const uint8_t *s;
790  unsigned int s_len;
791  int retval;
792 
793  /* First disconnect before connecting, Atmel EDBG needs it for SAMD/R/L/C */
795 
796  /* When we are reconnecting, DAP_Connect needs to be rerun, at
797  * least on Keil ULINK-ME */
798  retval = cmsis_dap_cmd_DAP_Connect(seq == LINE_RESET || seq == JTAG_TO_SWD ?
800  if (retval != ERROR_OK)
801  return retval;
802 
803  switch (seq) {
804  case LINE_RESET:
805  LOG_DEBUG("SWD line reset");
806  s = swd_seq_line_reset;
807  s_len = swd_seq_line_reset_len;
808  break;
809  case JTAG_TO_SWD:
810  LOG_DEBUG("JTAG-to-SWD");
812  s_len = swd_seq_jtag_to_swd_len;
813  break;
814  case SWD_TO_JTAG:
815  LOG_DEBUG("SWD-to-JTAG");
817  s_len = swd_seq_swd_to_jtag_len;
818  break;
819  default:
820  LOG_ERROR("Sequence %d not supported", seq);
821  return ERROR_FAIL;
822  }
823 
824  return cmsis_dap_cmd_DAP_SWJ_Sequence(s_len, s);
825 }
826 
827 static int cmsis_dap_swd_open(void)
828 {
829  int retval;
830 
831  if (cmsis_dap_handle == NULL) {
832  /* SWD init */
833  retval = cmsis_dap_usb_open();
834  if (retval != ERROR_OK)
835  return retval;
836 
837  retval = cmsis_dap_get_caps_info();
838  if (retval != ERROR_OK)
839  return retval;
840  }
841 
842  if (!(cmsis_dap_handle->caps & INFO_CAPS_SWD)) {
843  LOG_ERROR("CMSIS-DAP: SWD not supported");
845  }
846 
848  if (retval != ERROR_OK)
849  return retval;
850 
851  /* Add more setup here.??... */
852 
853  LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)");
854  return ERROR_OK;
855 }
856 
857 static int cmsis_dap_init(void)
858 {
859  int retval;
860  uint8_t *data;
861 
862  if (swd_mode) {
863  retval = cmsis_dap_swd_open();
864  if (retval != ERROR_OK)
865  return retval;
866  }
867 
868  if (cmsis_dap_handle == NULL) {
869 
870  /* JTAG init */
871  retval = cmsis_dap_usb_open();
872  if (retval != ERROR_OK)
873  return retval;
874 
875  retval = cmsis_dap_get_caps_info();
876  if (retval != ERROR_OK)
877  return retval;
878 
879  /* Connect in JTAG mode */
880  if (!(cmsis_dap_handle->caps & INFO_CAPS_JTAG)) {
881  LOG_ERROR("CMSIS-DAP: JTAG not supported");
883  }
884 
886  if (retval != ERROR_OK)
887  return retval;
888 
889  LOG_INFO("CMSIS-DAP: Interface Initialised (JTAG)");
890  }
891 
892  retval = cmsis_dap_get_version_info();
893  if (retval != ERROR_OK)
894  return retval;
895 
896  /* INFO_ID_PKT_SZ - short */
897  retval = cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_SZ, &data);
898  if (retval != ERROR_OK)
899  return retval;
900 
901  if (data[0] == 2) { /* short */
902  uint16_t pkt_sz = data[1] + (data[2] << 8);
903 
904  /* 4 bytes of command header + 5 bytes per register
905  * write. For bulk read sequences just 4 bytes are
906  * needed per transfer, so this is suboptimal. */
907  pending_queue_len = (pkt_sz - 4) / 5;
908  pending_transfers = malloc(pending_queue_len * sizeof(*pending_transfers));
909  if (!pending_transfers) {
910  LOG_ERROR("Unable to allocate memory for CMSIS-DAP queue");
911  return ERROR_FAIL;
912  }
913 
914  if (cmsis_dap_handle->packet_size != pkt_sz + 1) {
915  /* reallocate buffer */
916  cmsis_dap_handle->packet_size = pkt_sz + 1;
917  cmsis_dap_handle->packet_buffer = realloc(cmsis_dap_handle->packet_buffer,
918  cmsis_dap_handle->packet_size);
919  if (cmsis_dap_handle->packet_buffer == NULL) {
920  LOG_ERROR("unable to reallocate memory");
921  return ERROR_FAIL;
922  }
923  }
924 
925  LOG_DEBUG("CMSIS-DAP: Packet Size = %" PRId16, pkt_sz);
926  }
927 
928  /* INFO_ID_PKT_CNT - byte */
929  retval = cmsis_dap_cmd_DAP_Info(INFO_ID_PKT_CNT, &data);
930  if (retval != ERROR_OK)
931  return retval;
932 
933  if (data[0] == 1) { /* byte */
934  uint16_t pkt_cnt = data[1];
935  cmsis_dap_handle->packet_count = pkt_cnt;
936  LOG_DEBUG("CMSIS-DAP: Packet Count = %" PRId16, pkt_cnt);
937  }
938 
939  retval = cmsis_dap_get_status();
940  if (retval != ERROR_OK)
941  return ERROR_FAIL;
942 
943  /* Now try to connect to the target
944  * TODO: This is all SWD only @ present */
946  if (retval != ERROR_OK)
947  return ERROR_FAIL;
948 
949  /* Ask CMSIS-DAP to automatically retry on receiving WAIT for
950  * up to 64 times. This must be changed to 0 if sticky
951  * overrun detection is enabled. */
952  retval = cmsis_dap_cmd_DAP_TFER_Configure(0, 64, 0);
953  if (retval != ERROR_OK)
954  return ERROR_FAIL;
955  /* Data Phase (bit 2) must be set to 1 if sticky overrun
956  * detection is enabled */
957  retval = cmsis_dap_cmd_DAP_SWD_Configure(0); /* 1 TRN, no Data Phase */
958  if (retval != ERROR_OK)
959  return ERROR_FAIL;
960 
961  retval = cmsis_dap_cmd_DAP_LED(0x03); /* Both LEDs on */
962  if (retval != ERROR_OK)
963  return ERROR_FAIL;
964 
965  /* support connecting with srst asserted */
967 
968  if (jtag_reset_config & RESET_CNCT_UNDER_SRST) {
969  if (jtag_reset_config & RESET_SRST_NO_GATING) {
970  retval = cmsis_dap_cmd_DAP_SWJ_Pins(0, (1 << 7), 0, NULL);
971  if (retval != ERROR_OK)
972  return ERROR_FAIL;
973  LOG_INFO("Connecting under reset");
974  }
975  }
976 
977  cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
978 
979  LOG_INFO("CMSIS-DAP: Interface ready");
980 
981  return ERROR_OK;
982 }
983 
984 static int cmsis_dap_swd_init(void)
985 {
986  swd_mode = true;
987  return ERROR_OK;
988 }
989 
990 static int cmsis_dap_quit(void)
991 {
993  cmsis_dap_cmd_DAP_LED(0x00); /* Both LEDs off */
994 
995  cmsis_dap_usb_close(cmsis_dap_handle);
996 
997  return ERROR_OK;
998 }
999 
1000 static void cmsis_dap_execute_reset(struct jtag_command *cmd)
1001 {
1002  /* Set both TRST and SRST even if they're not enabled as
1003  * there's no way to tristate them */
1004  uint8_t pins = 0;
1005 
1006  if (!cmd->cmd.reset->srst)
1007  pins |= SWJ_PIN_SRST;
1008  if (!cmd->cmd.reset->trst)
1009  pins |= SWJ_PIN_TRST;
1010 
1011  int retval = cmsis_dap_cmd_DAP_SWJ_Pins(pins,
1013  if (retval != ERROR_OK)
1014  LOG_ERROR("CMSIS-DAP: Interface reset failed");
1015 }
1016 
1017 static void cmsis_dap_execute_sleep(struct jtag_command *cmd)
1018 {
1019 #if 0
1020  int retval = cmsis_dap_cmd_DAP_Delay(cmd->cmd.sleep->us);
1021  if (retval != ERROR_OK)
1022 #endif
1023  jtag_sleep(cmd->cmd.sleep->us);
1024 }
1025 
1026 /* Set TMS high for five TCK clocks, to move the TAP to the Test-Logic-Reset state */
1028 {
1029  LOG_INFO("cmsis-dap JTAG TLR_RESET");
1030  uint8_t seq = 0xff;
1031  int ret = cmsis_dap_cmd_DAP_SWJ_Sequence(8, &seq);
1032  if (ret == ERROR_OK)
1034  return ret;
1035 }
1036 
1037 /* Set new end state */
1039 {
1040  if (tap_is_state_stable(state))
1041  tap_set_end_state(state);
1042  else {
1043  LOG_ERROR("BUG: %i is not a valid end state", state);
1044  exit(-1);
1045  }
1046 }
1047 
1048 #ifdef SPRINT_BINARY
1049 static void sprint_binary(char *s, const uint8_t *buf, int offset, int len)
1050 {
1051  if (!len)
1052  return;
1053 
1054  /*
1055  buf = { 0x18 } len=5 should result in: 11000
1056  buf = { 0xff 0x18 } len=13 should result in: 11111111 11000
1057  buf = { 0xc0 0x18 } offset=3 len=10 should result in: 11000 11000
1058  i=3 there means i/8 = 0 so c = 0xFF, and
1059  */
1060  for (int i = offset; i < offset + len; ++i) {
1061  uint8_t c = buf[i / 8], mask = 1 << (i % 8);
1062  if ((i != offset) && !(i % 8))
1063  putchar(' ');
1064  *s++ = (c & mask) ? '1' : '0';
1065  }
1066  *s = 0;
1067 }
1068 #endif
1069 
1070 #ifdef CMSIS_DAP_JTAG_DEBUG
1071 static void debug_parse_cmsis_buf(const uint8_t *cmd, int cmdlen)
1072 {
1073  /* cmd is a usb packet to go to the cmsis-dap interface */
1074  printf("cmsis-dap buffer (%d b): ", cmdlen);
1075  for (int i = 0; i < cmdlen; ++i)
1076  printf(" %02x", cmd[i]);
1077  printf("\n");
1078  switch (cmd[1]) {
1079  case CMD_DAP_JTAG_SEQ: {
1080  printf("cmsis-dap jtag sequence command %02x (n=%d)\n", cmd[1], cmd[2]);
1081  /*
1082  * #2 = number of sequences
1083  * #3 = sequence info 1
1084  * #4...4+n_bytes-1 = sequence 1
1085  * #4+n_bytes = sequence info 2
1086  * #5+n_bytes = sequence 2 (single bit)
1087  */
1088  int pos = 3;
1089  for (int seq = 0; seq < cmd[2]; ++seq) {
1090  uint8_t info = cmd[pos++];
1091  int len = info & DAP_JTAG_SEQ_TCK;
1092  if (len == 0)
1093  len = 64;
1094  printf(" sequence %d starting %d: info %02x (len=%d tms=%d read_tdo=%d): ",
1095  seq, pos, info, len, info & DAP_JTAG_SEQ_TMS, info & DAP_JTAG_SEQ_TDO);
1096  for (int i = 0; i < DIV_ROUND_UP(len, 8); ++i)
1097  printf(" %02x", cmd[pos+i]);
1098  pos += DIV_ROUND_UP(len, 8);
1099  printf("\n");
1100  }
1101  if (pos != cmdlen) {
1102  printf("BUFFER LENGTH MISMATCH looks like %d but %d specified", pos, cmdlen);
1103  exit(-1);
1104  }
1105 
1106  break;
1107  }
1108  default:
1109  LOG_DEBUG("unknown cmsis-dap command %02x", cmd[1]);
1110  break;
1111  }
1112 }
1113 #endif
1114 
1115 static void cmsis_dap_flush(void)
1116 {
1117  if (!queued_seq_count)
1118  return;
1119 
1120  DEBUG_JTAG_IO("Flushing %d queued sequences (%d bytes) with %d pending scan results to capture",
1122 
1123  /* prep CMSIS-DAP packet */
1124  uint8_t *buffer = cmsis_dap_handle->packet_buffer;
1125  buffer[0] = 0; /* report number */
1126  buffer[1] = CMD_DAP_JTAG_SEQ;
1127  buffer[2] = queued_seq_count;
1128  memcpy(buffer + 3, queued_seq_buf, queued_seq_buf_end);
1129 
1130 #ifdef CMSIS_DAP_JTAG_DEBUG
1131  debug_parse_cmsis_buf(buffer, queued_seq_buf_end + 3);
1132 #endif
1133 
1134  /* send command to USB device */
1135  int retval = cmsis_dap_usb_xfer(cmsis_dap_handle, queued_seq_buf_end + 3);
1136  if (retval != ERROR_OK || buffer[1] != DAP_OK) {
1137  LOG_ERROR("CMSIS-DAP command CMD_DAP_JTAG_SEQ failed.");
1138  exit(-1);
1139  }
1140 
1141 #ifdef CMSIS_DAP_JTAG_DEBUG
1142  DEBUG_JTAG_IO("USB response buf:");
1143  for (int c = 0; c < queued_seq_buf_end + 3; ++c)
1144  printf("%02X ", buffer[c]);
1145  printf("\n");
1146 #endif
1147 
1148  /* copy scan results into client buffers */
1149  for (int i = 0; i < pending_scan_result_count; ++i) {
1151  DEBUG_JTAG_IO("Copying pending_scan_result %d/%d: %d bits from byte %d -> buffer + %d bits",
1152  i, pending_scan_result_count, scan->length, scan->first + 2, scan->buffer_offset);
1153 #ifdef CMSIS_DAP_JTAG_DEBUG
1154  for (uint32_t b = 0; b < DIV_ROUND_UP(scan->length, 8); ++b)
1155  printf("%02X ", buffer[2+scan->first+b]);
1156  printf("\n");
1157 #endif
1158  bit_copy(scan->buffer, scan->buffer_offset, buffer + 2 + scan->first, 0, scan->length);
1159  }
1160 
1161  /* reset */
1162  queued_seq_count = 0;
1163  queued_seq_buf_end = 0;
1164  queued_seq_tdo_ptr = 0;
1165  pending_scan_result_count = 0;
1166 }
1167 
1168 /* queue a sequence of bits to clock out TDI / in TDO, executing if the buffer is full.
1169  *
1170  * sequence=NULL means clock out zeros on TDI
1171  * tdo_buffer=NULL means don't capture TDO
1172  */
1173 static void cmsis_dap_add_jtag_sequence(int s_len, const uint8_t *sequence, int s_offset,
1174  bool tms, uint8_t *tdo_buffer, int tdo_buffer_offset)
1175 {
1176  DEBUG_JTAG_IO("[at %d] %d bits, tms %s, seq offset %d, tdo buf %p, tdo offset %d",
1178  s_len, tms ? "HIGH" : "LOW", s_offset, tdo_buffer, tdo_buffer_offset);
1179 
1180  if (s_len == 0)
1181  return;
1182 
1183  if (s_len > 64) {
1184  DEBUG_JTAG_IO("START JTAG SEQ SPLIT");
1185  for (int offset = 0; offset < s_len; offset += 64) {
1186  int len = s_len - offset;
1187  if (len > 64)
1188  len = 64;
1189  DEBUG_JTAG_IO("Splitting long jtag sequence: %d-bit chunk starting at offset %d", len, offset);
1191  len,
1192  sequence,
1193  s_offset + offset,
1194  tms,
1195  tdo_buffer,
1196  tdo_buffer == NULL ? 0 : (tdo_buffer_offset + offset)
1197  );
1198  }
1199  DEBUG_JTAG_IO("END JTAG SEQ SPLIT");
1200  return;
1201  }
1202 
1203  int cmd_len = 1 + DIV_ROUND_UP(s_len, 8);
1204  if (queued_seq_count >= 255 || queued_seq_buf_end + cmd_len > QUEUED_SEQ_BUF_LEN)
1205  /* empty out the buffer */
1206  cmsis_dap_flush();
1207 
1208  ++queued_seq_count;
1209 
1210  /* control byte */
1212  (tms ? DAP_JTAG_SEQ_TMS : 0) |
1213  (tdo_buffer != NULL ? DAP_JTAG_SEQ_TDO : 0) |
1214  (s_len == 64 ? 0 : s_len);
1215 
1216  if (sequence != NULL)
1217  bit_copy(&queued_seq_buf[queued_seq_buf_end + 1], 0, sequence, s_offset, s_len);
1218  else
1219  memset(&queued_seq_buf[queued_seq_buf_end + 1], 0, DIV_ROUND_UP(s_len, 8));
1220 
1221  queued_seq_buf_end += cmd_len;
1222 
1223  if (tdo_buffer != NULL) {
1225  scan->first = queued_seq_tdo_ptr;
1226  queued_seq_tdo_ptr += DIV_ROUND_UP(s_len, 8);
1227  scan->length = s_len;
1228  scan->buffer = tdo_buffer;
1229  scan->buffer_offset = tdo_buffer_offset;
1230  }
1231 }
1232 
1233 /* queue a sequence of bits to clock out TMS, executing if the buffer is full */
1234 static void cmsis_dap_add_tms_sequence(const uint8_t *sequence, int s_len)
1235 {
1236  DEBUG_JTAG_IO("%d bits: %02X", s_len, *sequence);
1237  /* we use a series of CMD_DAP_JTAG_SEQ commands to toggle TMS,
1238  because even though it seems ridiculously inefficient, it
1239  allows us to combine TMS and scan sequences into the same
1240  USB packet. */
1241  /* TODO: combine runs of the same tms value */
1242  for (int i = 0; i < s_len; ++i) {
1243  bool bit = (sequence[i / 8] & (1 << (i % 8))) != 0;
1244  cmsis_dap_add_jtag_sequence(1, NULL, 0, bit, NULL, 0);
1245  }
1246 }
1247 
1248 /* Move to the end state by queuing a sequence to clock into TMS */
1249 static void cmsis_dap_state_move(void)
1250 {
1251  uint8_t tms_scan;
1252  uint8_t tms_scan_bits;
1253 
1256 
1257  DEBUG_JTAG_IO("state move from %s to %s: %d clocks, %02X on tms",
1259  tms_scan_bits, tms_scan);
1260  cmsis_dap_add_tms_sequence(&tms_scan, tms_scan_bits);
1261 
1263 }
1264 
1265 
1266 /* Execute a JTAG scan operation by queueing TMS and TDI/TDO sequences */
1267 static void cmsis_dap_execute_scan(struct jtag_command *cmd)
1268 {
1269  DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : "DRSCAN",
1270  jtag_scan_type(cmd->cmd.scan));
1271 
1272  /* Make sure there are no trailing fields with num_bits == 0, or the logic below will fail. */
1273  while (cmd->cmd.scan->num_fields > 0
1274  && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 1].num_bits == 0) {
1275  cmd->cmd.scan->num_fields--;
1276  LOG_DEBUG("discarding trailing empty field");
1277  }
1278 
1279  if (cmd->cmd.scan->num_fields == 0) {
1280  LOG_DEBUG("empty scan, doing nothing");
1281  return;
1282  }
1283 
1284  if (cmd->cmd.scan->ir_scan) {
1285  if (tap_get_state() != TAP_IRSHIFT) {
1288  }
1289  } else {
1290  if (tap_get_state() != TAP_DRSHIFT) {
1293  }
1294  }
1295 
1297 
1298  struct scan_field *field = cmd->cmd.scan->fields;
1299  unsigned scan_size = 0;
1300 
1301  for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
1302  scan_size += field->num_bits;
1303  DEBUG_JTAG_IO("%s%s field %d/%d %d bits",
1304  field->in_value ? "in" : "",
1305  field->out_value ? "out" : "",
1306  i,
1307  cmd->cmd.scan->num_fields,
1308  field->num_bits);
1309 
1310  if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != tap_get_end_state()) {
1311  DEBUG_JTAG_IO("Last field and have to move out of SHIFT state");
1312  /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock last bit during tap
1313  * movement. This last field can't have length zero, it was checked above. */
1315  field->num_bits - 1, /* number of bits to clock */
1316  field->out_value, /* output sequence */
1317  0, /* output offset */
1318  false, /* TMS low */
1319  field->in_value,
1320  0);
1321 
1322  /* Clock the last bit out, with TMS high */
1323  uint8_t last_bit = 0;
1324  if (field->out_value)
1325  bit_copy(&last_bit, 0, field->out_value, field->num_bits - 1, 1);
1327  1,
1328  &last_bit,
1329  0,
1330  true,
1331  field->in_value,
1332  field->num_bits - 1);
1334 
1335  /* Now clock one more cycle, with TMS low, to get us into a PAUSE state */
1337  1,
1338  &last_bit,
1339  0,
1340  false,
1341  NULL,
1342  0);
1344  } else {
1345  DEBUG_JTAG_IO("Internal field, staying in SHIFT state afterwards");
1346  /* Clocking part of a sequence into DR or IR with TMS=0,
1347  leaving TMS=0 at the end so we can continue later */
1349  field->num_bits,
1350  field->out_value,
1351  0,
1352  false,
1353  field->in_value,
1354  0);
1355  }
1356  }
1357 
1358  if (tap_get_state() != tap_get_end_state()) {
1361  }
1362 
1363  DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
1364  (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
1366 }
1367 
1368 static void cmsis_dap_pathmove(int num_states, tap_state_t *path)
1369 {
1370  int i;
1371  uint8_t tms0 = 0x00;
1372  uint8_t tms1 = 0xff;
1373 
1374  for (i = 0; i < num_states; i++) {
1375  if (path[i] == tap_state_transition(tap_get_state(), false))
1376  cmsis_dap_add_tms_sequence(&tms0, 1);
1377  else if (path[i] == tap_state_transition(tap_get_state(), true))
1378  cmsis_dap_add_tms_sequence(&tms1, 1);
1379  else {
1380  LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition.",
1382  exit(-1);
1383  }
1384 
1385  tap_set_state(path[i]);
1386  }
1387 
1389 }
1390 
1392 {
1393  DEBUG_JTAG_IO("pathmove: %i states, end in %i",
1394  cmd->cmd.pathmove->num_states,
1395  cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
1396 
1398 }
1399 
1400 static void cmsis_dap_stableclocks(int num_cycles)
1401 {
1402  int i;
1403 
1404  uint8_t tms = tap_get_state() == TAP_RESET;
1405  /* TODO: Perform optimizations? */
1406  /* Execute num_cycles. */
1407  for (i = 0; i < num_cycles; i++)
1408  cmsis_dap_add_tms_sequence(&tms, 1);
1409 }
1410 
1411 static void cmsis_dap_runtest(int num_cycles)
1412 {
1413  tap_state_t saved_end_state = tap_get_end_state();
1414 
1415  /* Only do a state_move when we're not already in IDLE. */
1416  if (tap_get_state() != TAP_IDLE) {
1419  }
1420  cmsis_dap_stableclocks(num_cycles);
1421 
1422  /* Finish in end_state. */
1423  cmsis_dap_end_state(saved_end_state);
1424 
1425  if (tap_get_state() != tap_get_end_state())
1427 }
1428 
1429 static void cmsis_dap_execute_runtest(struct jtag_command *cmd)
1430 {
1431  DEBUG_JTAG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles,
1432  cmd->cmd.runtest->end_state);
1433 
1436 }
1437 
1439 {
1440  DEBUG_JTAG_IO("stableclocks %i cycles", cmd->cmd.runtest->num_cycles);
1442 }
1443 
1444 /* TODO: Is there need to call cmsis_dap_flush() for the JTAG_PATHMOVE,
1445  * JTAG_RUNTEST, JTAG_STABLECLOCKS? */
1446 static void cmsis_dap_execute_command(struct jtag_command *cmd)
1447 {
1448  switch (cmd->type) {
1449  case JTAG_RESET:
1450  cmsis_dap_flush();
1452  break;
1453  case JTAG_SLEEP:
1454  cmsis_dap_flush();
1456  break;
1457  case JTAG_TLR_RESET:
1458  cmsis_dap_flush();
1460  break;
1461  case JTAG_SCAN:
1463  break;
1464  case JTAG_PATHMOVE:
1466  break;
1467  case JTAG_RUNTEST:
1469  break;
1470  case JTAG_STABLECLOCKS:
1472  break;
1473  case JTAG_TMS:
1474  default:
1475  LOG_ERROR("BUG: unknown JTAG command type 0x%X encountered", cmd->type);
1476  exit(-1);
1477  }
1478 }
1479 
1480 static int cmsis_dap_execute_queue(void)
1481 {
1483 
1484  while (cmd != NULL) {
1486  cmd = cmd->next;
1487  }
1488 
1489  cmsis_dap_flush();
1490 
1491  return ERROR_OK;
1492 }
1493 
1494 static int cmsis_dap_speed(int speed)
1495 {
1496  if (speed > DAP_MAX_CLOCK) {
1497  LOG_INFO("reduce speed request: %dkHz to %dkHz maximum", speed, DAP_MAX_CLOCK);
1498  speed = DAP_MAX_CLOCK;
1499  }
1500 
1501  if (speed == 0) {
1502  LOG_INFO("RTCK not supported");
1504  }
1505 
1506  return cmsis_dap_cmd_DAP_SWJ_Clock(speed);
1507 }
1508 
1509 static int cmsis_dap_speed_div(int speed, int *khz)
1510 {
1511  *khz = speed;
1512  return ERROR_OK;
1513 }
1514 
1515 static int cmsis_dap_khz(int khz, int *jtag_speed)
1516 {
1517  *jtag_speed = khz;
1518  return ERROR_OK;
1519 }
1520 
1521 static int_least32_t cmsis_dap_swd_frequency(int_least32_t hz)
1522 {
1523  if (hz > 0)
1524  cmsis_dap_speed(hz / 1000);
1525 
1526  return hz;
1527 }
1528 
1529 
1530 COMMAND_HANDLER(cmsis_dap_handle_info_command)
1531 {
1534 
1535  return ERROR_OK;
1536 }
1537 
1538 COMMAND_HANDLER(cmsis_dap_handle_vid_pid_command)
1539 {
1540  if (CMD_ARGC > MAX_USB_IDS * 2) {
1541  LOG_WARNING("ignoring extra IDs in cmsis_dap_vid_pid "
1542  "(maximum is %d pairs)", MAX_USB_IDS);
1543  CMD_ARGC = MAX_USB_IDS * 2;
1544  }
1545  if (CMD_ARGC < 2 || (CMD_ARGC & 1)) {
1546  LOG_WARNING("incomplete cmsis_dap_vid_pid configuration directive");
1547  if (CMD_ARGC < 2)
1549  /* remove the incomplete trailing id */
1550  CMD_ARGC -= 1;
1551  }
1552 
1553  unsigned i;
1554  for (i = 0; i < CMD_ARGC; i += 2) {
1555  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i], cmsis_dap_vid[i >> 1]);
1556  COMMAND_PARSE_NUMBER(u16, CMD_ARGV[i + 1], cmsis_dap_pid[i >> 1]);
1557  }
1558 
1559  /*
1560  * Explicitly terminate, in case there are multiples instances of
1561  * cmsis_dap_vid_pid.
1562  */
1563  cmsis_dap_vid[i >> 1] = cmsis_dap_pid[i >> 1] = 0;
1564 
1565  return ERROR_OK;
1566 }
1567 
1568 COMMAND_HANDLER(cmsis_dap_handle_serial_command)
1569 {
1570  if (CMD_ARGC == 1) {
1571  size_t len = mbstowcs(NULL, CMD_ARGV[0], 0);
1572  cmsis_dap_serial = calloc(len + 1, sizeof(wchar_t));
1573  if (cmsis_dap_serial == NULL) {
1574  LOG_ERROR("unable to allocate memory");
1575  return ERROR_OK;
1576  }
1577  if (mbstowcs(cmsis_dap_serial, CMD_ARGV[0], len + 1) == (size_t)-1) {
1578  free(cmsis_dap_serial);
1580  LOG_ERROR("unable to convert serial");
1581  }
1582  } else {
1583  LOG_ERROR("expected exactly one argument to cmsis_dap_serial <serial-number>");
1584  }
1585 
1586  return ERROR_OK;
1587 }
1588 
1590  {
1591  .name = "info",
1592  .handler = &cmsis_dap_handle_info_command,
1593  .mode = COMMAND_EXEC,
1594  .usage = "",
1595  .help = "show cmsis-dap info",
1596  },
1598 };
1599 
1601  {
1602  .name = "cmsis-dap",
1603  .mode = COMMAND_ANY,
1604  .help = "perform CMSIS-DAP management",
1605  .usage = "<cmd>",
1607  },
1608  {
1609  .name = "cmsis_dap_vid_pid",
1610  .handler = &cmsis_dap_handle_vid_pid_command,
1611  .mode = COMMAND_CONFIG,
1612  .help = "the vendor ID and product ID of the CMSIS-DAP device",
1613  .usage = "(vid pid)* ",
1614  },
1615  {
1616  .name = "cmsis_dap_serial",
1617  .handler = &cmsis_dap_handle_serial_command,
1618  .mode = COMMAND_CONFIG,
1619  .help = "set the serial number of the adapter",
1620  .usage = "serial_string",
1621  },
1623 };
1624 
1625 static const struct swd_driver cmsis_dap_swd_driver = {
1627  .frequency = cmsis_dap_swd_frequency,
1628  .switch_seq = cmsis_dap_swd_switch_seq,
1629  .read_reg = cmsis_dap_swd_read_reg,
1630  .write_reg = cmsis_dap_swd_write_reg,
1631  .run = cmsis_dap_swd_run_queue,
1632 };
1633 
1634 static const char * const cmsis_dap_transport[] = { "swd", "jtag", NULL };
1635 
1637  .name = "cmsis-dap",
1638  .commands = cmsis_dap_command_handlers,
1639  .swd = &cmsis_dap_swd_driver,
1640  .transports = cmsis_dap_transport,
1641 
1642  .execute_queue = cmsis_dap_execute_queue,
1643  .speed = cmsis_dap_speed,
1644  .speed_div = cmsis_dap_speed_div,
1645  .khz = cmsis_dap_khz,
1646  .init = cmsis_dap_init,
1647  .quit = cmsis_dap_quit,
1648 };
#define INFO_ID_FW_VER
Definition: cmsis_dap_usb.c:83
static void cmsis_dap_swd_queue_cmd(uint8_t cmd, uint32_t *dst, uint32_t data)
int num_fields
number of fields in *fields array
Definition: commands.h:50
static void cmsis_dap_end_state(tap_state_t state)
unsigned buffer_offset
Offset in the destination buffer.
#define ERROR_WAIT
Definition: log.h:141
COMMAND_HANDLER(cmsis_dap_handle_info_command)
struct pathmove_command * pathmove
Definition: commands.h:126
#define QUEUED_SEQ_BUF_LEN
static void tap_set_state(tap_state_t new_state)
This function sets the state of a "state follower" which tracks the state of the TAPs connected to th...
Definition: interface.h:66
Definition: osbdm.c:28
static const unsigned swd_seq_swd_to_jtag_len
Definition: swd.h:92
#define LOG_DEBUG(expr...)
Definition: log.h:105
#define SWJ_PIN_TDO
static int queued_seq_tdo_ptr
#define INFO_CAPS_SWD
Definition: cmsis_dap_usb.c:90
#define CMD_DAP_CONNECT
Definition: cmsis_dap_usb.c:73
Represents a driver for a debugging interface.
Definition: interface.h:198
#define CONNECT_JTAG
#define CMD_DAP_LED
Definition: cmsis_dap_usb.c:72
int srst
Set SRST output: 0 = deassert, 1 = assert, -1 = no change.
Definition: commands.h:87
uint32_t us
number of microseconds to sleep
Definition: commands.h:97
static int cmsis_dap_cmd_DAP_Connect(uint8_t mode)
bool ir_scan
instruction/not data scan
Definition: commands.h:48
static int jtag_speed
Definition: jtag/core.c:127
struct jtag_interface cmsis_dap_interface
#define SWD_ACK_OK
Definition: arm_adi_v5.h:36
unsigned mask
Definition: cortex_m.c:2218
#define CMD_DAP_TFER
static void cmsis_dap_execute_command(struct jtag_command *cmd)
#define SWJ_PIN_TRST
#define MAX_PENDING_SCAN_RESULTS
#define CMD_DAP_DISCONNECT
Definition: cmsis_dap_usb.c:74
int tap_get_tms_path_len(tap_state_t from, tap_state_t to)
Function int tap_get_tms_path_len returns the total number of bits that represents a TMS path transit...
Definition: interface.c:206
static int cmsis_dap_swd_run_queue(void)
static void cmsis_dap_stableclocks(int num_cycles)
#define CMD_DAP_DELAY
static void cmsis_dap_add_tms_sequence(const uint8_t *sequence, int s_len)
#define LOG_INFO(expr...)
Definition: log.h:113
static int pending_scan_result_count
static const struct command_registration cmsis_dap_command_handlers[]
const uint8_t * out_value
A pointer to value to be scanned into the device.
Definition: jtag.h:111
bool tap_is_state_stable(tap_state_t astate)
Function tap_is_state_stable returns true if the astate is stable.
Definition: interface.c:211
#define ERROR_JTAG_NOT_IMPLEMENTED
Definition: jtag.h:601
#define INFO_ID_CAPS
Definition: cmsis_dap_usb.c:86
unsigned first
Offset in bytes in the CMD_DAP_JTAG_SEQ response buffer.
static void cmsis_dap_usb_close(struct cmsis_dap *dap)
unsigned length
Number of bits to read.
#define DEBUG_JTAG_IO(expr...)
Definition: jtag.h:32
swd_special_seq
Definition: swd.h:122
#define CMD_DAP_INFO
Definition: cmsis_dap_usb.c:71
#define ERROR_FAIL
Definition: log.h:140
void delay_us(uint16_t delay)
Definition: delay.c:34
#define SWD_CMD_APnDP
Definition: swd.h:27
uint8_t * packet_buffer
static struct scan_blk scan
Definition: lakemont.c:71
static const struct command_registration cmsis_dap_subcommand_handlers[]
#define INFO_ID_PKT_CNT
Definition: cmsis_dap_usb.c:87
static uint32_t le_to_h_u32(const uint8_t *buf)
Definition: types.h:124
static int cmsis_dap_swd_init(void)
#define USB_TIMEOUT
Definition: cmsis_dap_usb.c:68
#define DAP_JTAG_SEQ_TDO
static int cmsis_dap_init(void)
tap_state_t tap_get_state()
This function gets the state of the "state follower" which tracks the state of the TAPs connected to ...
Definition: interface.c:48
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:126
static int cmsis_dap_usb_xfer(struct cmsis_dap *dap, int txlen)
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:121
static int queued_retval
static int cmsis_dap_speed_div(int speed, int *khz)
uint8_t mode
This structure defines a single scan field in the scan.
Definition: jtag.h:107
#define DP_RDBUFF
Definition: arm_adi_v5.h:59
static void cmsis_dap_pathmove(int num_states, tap_state_t *path)
static struct ublast_lowlevel_priv info
union jtag_command_container cmd
Definition: commands.h:158
#define CMD_DAP_SWD_CONFIGURE
Definition: jtag.h:79
#define SWJ_PIN_TMS
int length
Number of bits to read.
Definition: arm-jtag-ew.c:522
static void cmsis_dap_execute_stableclocks(struct jtag_command *cmd)
int num_states
number of states in *path
Definition: commands.h:64
static wchar_t * cmsis_dap_serial
Definition: cmsis_dap_usb.c:64
const char * tap_state_name(tap_state_t state)
Function tap_state_name Returns a string suitable for display representing the JTAG tap_state...
Definition: interface.c:355
int(* init)(void)
Initialize the debug link so it can perform SWD operations.
Definition: swd.h:139
#define SWJ_PIN_SRST
#define PACKET_SIZE
Definition: cmsis_dap_usb.c:67
static int cmsis_dap_cmd_DAP_SWD_Configure(uint8_t cfg)
static void cmsis_dap_execute_runtest(struct jtag_command *cmd)
int num_bits
The number of bits this field specifies.
Definition: jtag.h:109
#define CMD_DAP_SWJ_CLOCK
static void cmsis_dap_add_jtag_sequence(int s_len, const uint8_t *sequence, int s_offset, bool tms, uint8_t *tdo_buffer, int tdo_buffer_offset)
#define CONNECT_SWD
static int cmsis_dap_cmd_DAP_Disconnect(void)
static int cmsis_dap_quit(void)
static struct cmsis_dap * cmsis_dap_handle
#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:375
static int cmsis_dap_execute_tlr_reset(struct jtag_command *cmd)
const char *const name
The name of the JTAG interface driver.
Definition: interface.h:200
#define DP_CTRL_STAT
Definition: arm_adi_v5.h:52
#define ERROR_JTAG_DEVICE_ERROR
Definition: jtag.h:605
static int queued_seq_count
static int cmsis_dap_execute_queue(void)
static uint16_t cmsis_dap_pid[MAX_USB_IDS+1]
Definition: cmsis_dap_usb.c:63
static int cmsis_dap_get_version_info(void)
static struct pending_transfer_result * pending_transfers
static bool swd_mode
Definition: cmsis_dap_usb.c:65
static void cmsis_dap_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
static int pending_queue_len
int tap_get_tms_path(tap_state_t from, tap_state_t to)
This function provides a "bit sequence" indicating what has to be done with TMS during a sequence of ...
Definition: interface.c:201
static void cmsis_dap_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
#define DAP_OK
static int cmsis_dap_cmd_DAP_SWJ_Clock(uint32_t swj_clock)
#define SWD_CMD_RnW
Definition: swd.h:28
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:222
#define INFO_ID_PKT_SZ
Definition: cmsis_dap_usb.c:88
static const unsigned swd_seq_line_reset_len
Definition: swd.h:65
#define LOG_ERROR(expr...)
Definition: log.h:119
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:338
enum scan_type jtag_scan_type(const struct scan_command *cmd)
Definition: commands.c:147
static int cmsis_dap_cmd_DAP_SWJ_Sequence(uint8_t s_len, const uint8_t *sequence)
static int cmsis_dap_khz(int khz, int *jtag_speed)
static int pending_transfer_count
struct scan_field * fields
pointer to an array of data scan fields
Definition: commands.h:52
tap_state_t tap_get_end_state()
For more information,.
Definition: interface.c:67
enum reset_types jtag_get_reset_config(void)
Definition: jtag/core.c:1709
#define CMD_DAP_TFER_CONFIGURE
#define SWD_CMD_A32
Definition: swd.h:29
static int cmsis_dap_swd_switch_seq(enum swd_special_seq seq)
static void cmsis_dap_execute_sleep(struct jtag_command *cmd)
static void cmsis_dap_flush(void)
#define DAP_JTAG_SEQ_TCK
const char * name
Definition: command.h:203
static void cmsis_dap_execute_scan(struct jtag_command *cmd)
static uint8_t queued_seq_buf[1024]
int first
First bit position in tdo_buffer to read.
Definition: arm-jtag-ew.c:521
#define SWJ_PIN_TDI
static int cmsis_dap_speed(int speed)
static const uint8_t swd_seq_swd_to_jtag[]
SWD-to-JTAG sequence.
Definition: swd.h:89
static int cmsis_dap_get_status(void)
#define SWJ_PIN_TCK
static uint8_t tdo_buffer[ARMJTAGEW_TAP_BUFFER_SIZE]
Definition: arm-jtag-ew.c:518
tap_state_t tap_state_transition(tap_state_t 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:234
tap_state_t end_state
state in which JTAG commands should finish
Definition: commands.h:54
enum tap_state tap_state_t
Defines JTAG Test Access Port states.
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
Definition: types.h:91
uint8_t caps
hid_device * dev_handle
static int cmsis_dap_swd_open(void)
#define SWD_ACK_WAIT
Definition: arm_adi_v5.h:37
static struct pending_scan_result pending_scan_results[MAX_PENDING_SCAN_RESULTS]
static void cmsis_dap_runtest(int num_cycles)
Definition: jtag.h:82
#define CMD_DAP_JTAG_SEQ
enum jtag_command_type type
Definition: commands.h:159
#define CMD_DAP_SWJ_SEQ
#define MAX_USB_IDS
Definition: cmsis_dap_usb.c:60
static int cmsis_dap_cmd_DAP_Info(uint8_t info, uint8_t **data)
void tap_set_end_state(tap_state_t new_end_state)
This function sets the state of an "end state follower" which tracks the state that any cable driver ...
Definition: interface.c:59
struct runtest_command * runtest
Definition: commands.h:127
static const uint8_t swd_seq_line_reset[]
Line reset.
Definition: swd.h:62
static void cmsis_dap_state_move(void)
uint8_t * buffer
Location to store the result.
Definition: arm-jtag-ew.c:524
struct scan_command * scan
Definition: commands.h:124
#define DAP_JTAG_SEQ_TMS
tap_state_t end_state
state in which JTAG commands should finish
Definition: commands.h:73
static int cmsis_dap_usb_open(void)
static void cmsis_dap_execute_reset(struct jtag_command *cmd)
static const char *const info_caps_str[]
struct jtag_command * next
Definition: commands.h:160
#define ERROR_OK
Definition: log.h:134
static const struct swd_driver cmsis_dap_swd_driver
static int cmsis_dap_cmd_DAP_LED(uint8_t leds)
static int_least32_t cmsis_dap_swd_frequency(int_least32_t hz)
static const char *const cmsis_dap_transport[]
static libusb_device ** devs
The usb device list.
static void cmsis_dap_execute_pathmove(struct jtag_command *cmd)
void jtag_sleep(uint32_t us)
Definition: jtag/core.c:886
static void bit_copy(uint8_t *dst, unsigned dst_offset, const uint8_t *src, unsigned src_offset, unsigned bit_count)
Definition: binarybuffer.h:210
uint16_t packet_count
static int queued_seq_buf_end
#define CMD_DAP_SWJ_PINS
uint8_t * in_value
A pointer to a 32-bit memory location for data scanned out.
Definition: jtag.h:113
static int cmsis_dap_cmd_DAP_SWJ_Pins(uint8_t pins, uint8_t mask, uint32_t delay, uint8_t *input)
#define SWD_ACK_FAULT
Definition: arm_adi_v5.h:38
#define NULL
Definition: usb.h:27
reset_types
Definition: jtag.h:257
static int cmsis_dap_get_caps_info(void)
tap_state_t * path
states that have to be passed
Definition: commands.h:66
struct reset_command * reset
Definition: commands.h:129
int num_cycles
number of cycles to spend in Run-Test/Idle state
Definition: commands.h:71
#define CORUNDETECT
Definition: arm_adi_v5.h:72
static uint16_t cmsis_dap_vid[MAX_USB_IDS+1]
Definition: cmsis_dap_usb.c:62
#define DAP_MAX_CLOCK
static int cmsis_dap_cmd_DAP_TFER_Configure(uint8_t idle, uint16_t retry_count, uint16_t match_retry)
struct sleep_command * sleep
Definition: commands.h:131
int trst
Set TRST output: 0 = deassert, 1 = assert, -1 = no change.
Definition: commands.h:85
static enum reset_types jtag_reset_config
Definition: jtag/core.c:93
unsigned jtag_get_speed_khz(void)
Retreives the clock speed of the JTAG interface in KHz.
Definition: jtag/core.c:1591
#define LOG_WARNING(expr...)
Definition: log.h:116
struct jtag_command * jtag_command_queue
The current queue of jtag_command_s structures.
Definition: commands.c:46
#define INFO_CAPS_JTAG
Definition: cmsis_dap_usb.c:91
static const uint8_t swd_seq_jtag_to_swd[]
JTAG-to-SWD sequence.
Definition: swd.h:75
static const unsigned swd_seq_jtag_to_swd_len
Definition: swd.h:79
uint16_t packet_size