OpenOCD
xds110.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * Copyright (C) 2017 by Texas Instruments, Inc. *
5  ***************************************************************************/
6 
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10 
11 #include <transport/transport.h>
12 #include <jtag/adapter.h>
13 #include <jtag/swd.h>
14 #include <jtag/interface.h>
15 #include <jtag/commands.h>
16 #include <jtag/tcl.h>
17 #include <libusb.h>
18 
19 /* XDS110 stand-alone probe voltage supply limits */
20 #define XDS110_MIN_VOLTAGE 1800
21 #define XDS110_MAX_VOLTAGE 3600
22 
23 /* XDS110 stand-alone probe hardware ID */
24 #define XDS110_STAND_ALONE_ID 0x21
25 
26 /* Firmware version that introduced OpenOCD support via block accesses */
27 #define OCD_FIRMWARE_VERSION 0x02030011
28 #define OCD_FIRMWARE_UPGRADE \
29  "XDS110: upgrade to version 2.3.0.11+ for improved support"
30 
31 /* Firmware version that introduced improved TCK performance */
32 #define FAST_TCK_FIRMWARE_VERSION 0x03000000
33 
34 /* Firmware version that introduced 10 MHz and 12 MHz TCK support */
35 #define FAST_TCK_PLUS_FIRMWARE_VERSION 0x03000003
36 
37 /***************************************************************************
38  * USB Connection Buffer Definitions *
39  ***************************************************************************/
40 
41 /* Max USB packet size for up to USB 3.0 */
42 #define MAX_PACKET 1024
43 
44 /*
45  * Maximum data payload that can be handled in a single call
46  * Limitation is the size of the buffers in the XDS110 firmware
47  */
48 #define MAX_DATA_BLOCK 4096
49 
50 #ifndef USB_PAYLOAD_SIZE
51 /* Largest data block plus parameters */
52 #define USB_PAYLOAD_SIZE (MAX_DATA_BLOCK + 60)
53 #endif
54 #define MAX_RESULT_QUEUE (MAX_DATA_BLOCK / 4)
55 
56 /***************************************************************************
57  * XDS110 Firmware API Definitions *
58  ***************************************************************************/
59 
60 /*
61  * Default values controlling how the host communicates commands
62  * with XDS110 firmware (automatic retry count and wait timeout)
63  */
64 #define DEFAULT_ATTEMPTS (1)
65 #define DEFAULT_TIMEOUT (4000)
66 
67 /* XDS110 API error codes */
68 #define SC_ERR_NONE 0
69 #define SC_ERR_XDS110_FAIL -261
70 #define SC_ERR_SWD_WAIT -613
71 #define SC_ERR_SWD_FAULT -614
72 #define SC_ERR_SWD_PROTOCOL -615
73 #define SC_ERR_SWD_PARITY -616
74 #define SC_ERR_SWD_DEVICE_ID -617
75 
76 /* TCK frequency limits */
77 #define XDS110_MIN_TCK_SPEED 100 /* kHz */
78 #define XDS110_MAX_SLOW_TCK_SPEED 2500 /* kHz */
79 #define XDS110_MAX_FAST_TCK_SPEED 14000 /* kHz */
80 #define XDS110_DEFAULT_TCK_SPEED 2500 /* kHz */
81 
82 /* Fixed TCK delay values for "Fast" TCK frequencies */
83 #define FAST_TCK_DELAY_14000_KHZ 0
84 #define FAST_TCK_DELAY_10000_KHZ 0xfffffffd
85 #define FAST_TCK_DELAY_12000_KHZ 0xfffffffe
86 #define FAST_TCK_DELAY_8500_KHZ 1
87 #define FAST_TCK_DELAY_5500_KHZ 2
88 /* For TCK frequencies below 5500 kHz, use calculated delay */
89 
90 /* Scan mode on connect */
91 #define MODE_JTAG 1
92 
93 /* XDS110 API JTAG state definitions */
94 #define XDS_JTAG_STATE_RESET 1
95 #define XDS_JTAG_STATE_IDLE 2
96 #define XDS_JTAG_STATE_SHIFT_DR 3
97 #define XDS_JTAG_STATE_SHIFT_IR 4
98 #define XDS_JTAG_STATE_PAUSE_DR 5
99 #define XDS_JTAG_STATE_PAUSE_IR 6
100 #define XDS_JTAG_STATE_EXIT1_DR 8
101 #define XDS_JTAG_STATE_EXIT1_IR 9
102 #define XDS_JTAG_STATE_EXIT2_DR 10
103 #define XDS_JTAG_STATE_EXIT2_IR 11
104 #define XDS_JTAG_STATE_SELECT_DR 12
105 #define XDS_JTAG_STATE_SELECT_IR 13
106 #define XDS_JTAG_STATE_UPDATE_DR 14
107 #define XDS_JTAG_STATE_UPDATE_IR 15
108 #define XDS_JTAG_STATE_CAPTURE_DR 16
109 #define XDS_JTAG_STATE_CAPTURE_IR 17
110 
111 /* XDS110 API JTAG transit definitions */
112 #define XDS_JTAG_TRANSIT_QUICKEST 1
113 #define XDS_JTAG_TRANSIT_VIA_CAPTURE 2
114 #define XDS_JTAG_TRANSIT_VIA_IDLE 3
115 
116 /* DAP register definitions as used by XDS110 APIs */
117 
118 #define DAP_AP 0 /* DAP AP register type */
119 #define DAP_DP 1 /* DAP DP register type */
120 
121 #define DAP_DP_IDCODE 0x0 /* DAP DP IDCODE register (read only) */
122 #define DAP_DP_ABORT 0x0 /* DAP DP ABORT register (write only) */
123 #define DAP_DP_STAT 0x4 /* DAP DP STAT register (for read only) */
124 #define DAP_DP_CTRL 0x4 /* DAP DP CTRL register (for write only) */
125 #define DAP_DP_ADDR 0x8 /* DAP DP SELECT register (legacy name) */
126 #define DAP_DP_RESEND 0x8 /* DAP DP RESEND register (read only) */
127 #define DAP_DP_SELECT 0x8 /* DAP DP SELECT register (write only) */
128 #define DAP_DP_RDBUFF 0xc /* DAP DP RDBUFF Read Buffer register */
129 
130 #define DAP_AP_CSW 0x00 /* DAP AP Control Status Word */
131 #define DAP_AP_TAR 0x04 /* DAP AP Transfer Address */
132 #define DAP_AP_DRW 0x0C /* DAP AP Data Read/Write */
133 #define DAP_AP_BD0 0x10 /* DAP AP Banked Data 0 */
134 #define DAP_AP_BD1 0x14 /* DAP AP Banked Data 1 */
135 #define DAP_AP_BD2 0x18 /* DAP AP Banked Data 2 */
136 #define DAP_AP_BD3 0x1C /* DAP AP Banked Data 3 */
137 #define DAP_AP_RTBL 0xF8 /* DAP AP Debug ROM Table */
138 #define DAP_AP_IDR 0xFC /* DAP AP Identification Register */
139 
140 /* Command packet definitions */
141 
142 #define XDS_OUT_LEN 1 /* command (byte) */
143 #define XDS_IN_LEN 4 /* error code (int) */
144 
145 /* XDS API Commands */
146 #define XDS_CONNECT 0x01 /* Connect JTAG connection */
147 #define XDS_DISCONNECT 0x02 /* Disconnect JTAG connection */
148 #define XDS_VERSION 0x03 /* Get firmware version and hardware ID */
149 #define XDS_SET_TCK 0x04 /* Set TCK delay (to set TCK frequency) */
150 #define XDS_SET_TRST 0x05 /* Assert or deassert nTRST signal */
151 #define XDS_CYCLE_TCK 0x07 /* Toggle TCK for a number of cycles */
152 #define XDS_GOTO_STATE 0x09 /* Go to requested JTAG state */
153 #define XDS_JTAG_SCAN 0x0c /* Send and receive JTAG scan */
154 #define XDS_SET_SRST 0x0e /* Assert or deassert nSRST signal */
155 #define CMAPI_CONNECT 0x0f /* CMAPI connect */
156 #define CMAPI_DISCONNECT 0x10 /* CMAPI disconnect */
157 #define CMAPI_ACQUIRE 0x11 /* CMAPI acquire */
158 #define CMAPI_RELEASE 0x12 /* CMAPI release */
159 #define CMAPI_REG_READ 0x15 /* CMAPI DAP register read */
160 #define CMAPI_REG_WRITE 0x16 /* CMAPI DAP register write */
161 #define SWD_CONNECT 0x17 /* Switch from JTAG to SWD connection */
162 #define SWD_DISCONNECT 0x18 /* Switch from SWD to JTAG connection */
163 #define CJTAG_CONNECT 0x2b /* Switch from JTAG to cJTAG connection */
164 #define CJTAG_DISCONNECT 0x2c /* Switch from cJTAG to JTAG connection */
165 #define XDS_SET_SUPPLY 0x32 /* Set up stand-alone probe upply voltage */
166 #define OCD_DAP_REQUEST 0x3a /* Handle block of DAP requests */
167 #define OCD_SCAN_REQUEST 0x3b /* Handle block of JTAG scan requests */
168 #define OCD_PATHMOVE 0x3c /* Handle PATHMOVE to navigate JTAG states */
169 
170 #define CMD_IR_SCAN 1
171 #define CMD_DR_SCAN 2
172 #define CMD_RUNTEST 3
173 #define CMD_STABLECLOCKS 4
174 
175 /* Array to convert from OpenOCD enum tap_state to XDS JTAG state */
176 static const uint32_t xds_jtag_state[] = {
177  XDS_JTAG_STATE_EXIT2_DR, /* TAP_DREXIT2 = 0x0 */
178  XDS_JTAG_STATE_EXIT1_DR, /* TAP_DREXIT1 = 0x1 */
179  XDS_JTAG_STATE_SHIFT_DR, /* TAP_DRSHIFT = 0x2 */
180  XDS_JTAG_STATE_PAUSE_DR, /* TAP_DRPAUSE = 0x3 */
181  XDS_JTAG_STATE_SELECT_IR, /* TAP_IRSELECT = 0x4 */
182  XDS_JTAG_STATE_UPDATE_DR, /* TAP_DRUPDATE = 0x5 */
183  XDS_JTAG_STATE_CAPTURE_DR, /* TAP_DRCAPTURE = 0x6 */
184  XDS_JTAG_STATE_SELECT_DR, /* TAP_DRSELECT = 0x7 */
185  XDS_JTAG_STATE_EXIT2_IR, /* TAP_IREXIT2 = 0x8 */
186  XDS_JTAG_STATE_EXIT1_IR, /* TAP_IREXIT1 = 0x9 */
187  XDS_JTAG_STATE_SHIFT_IR, /* TAP_IRSHIFT = 0xa */
188  XDS_JTAG_STATE_PAUSE_IR, /* TAP_IRPAUSE = 0xb */
189  XDS_JTAG_STATE_IDLE, /* TAP_IDLE = 0xc */
190  XDS_JTAG_STATE_UPDATE_IR, /* TAP_IRUPDATE = 0xd */
191  XDS_JTAG_STATE_CAPTURE_IR, /* TAP_IRCAPTURE = 0xe */
192  XDS_JTAG_STATE_RESET, /* TAP_RESET = 0xf */
193 };
194 
195 struct scan_result {
196  bool first;
197  uint8_t *buffer;
198  uint32_t num_bits;
199 };
200 
201 struct xds110_info {
202  /* USB connection handles and data buffers */
203  struct libusb_context *ctx;
204  struct libusb_device_handle *dev;
206  unsigned char write_packet[3];
208  /* Device vid/pid */
209  uint16_t vid;
210  uint16_t pid;
211  /* Debug interface */
212  uint8_t interface;
213  uint8_t endpoint_in;
214  uint8_t endpoint_out;
215  /* Status flags */
221  /* DAP register caches */
222  uint32_t select;
223  uint32_t rdbuff;
225  /* TCK speed and delay count*/
226  uint32_t speed;
227  uint32_t delay_count;
228  /* XDS110 voltage supply setting */
229  uint32_t voltage;
230  /* XDS110 firmware and hardware version */
231  uint32_t firmware;
232  uint16_t hardware;
233  /* Transaction queues */
234  unsigned char txn_requests[MAX_DATA_BLOCK];
238  uint32_t txn_result_size;
240 };
241 
242 static struct xds110_info xds110 = {
243  .ctx = NULL,
244  .dev = NULL,
245  .vid = 0,
246  .pid = 0,
247  .interface = 0,
248  .endpoint_in = 0,
249  .endpoint_out = 0,
250  .is_connected = false,
251  .is_cmapi_connected = false,
252  .is_cmapi_acquired = false,
253  .is_swd_mode = false,
254  .is_ap_dirty = false,
255  .speed = XDS110_DEFAULT_TCK_SPEED,
256  .delay_count = 0,
257  .voltage = 0,
258  .firmware = 0,
259  .hardware = 0,
260  .txn_request_size = 0,
261  .txn_result_size = 0,
262  .txn_result_count = 0
263 };
264 
265 static inline void xds110_set_u32(uint8_t *buffer, uint32_t value)
266 {
267  buffer[3] = (value >> 24) & 0xff;
268  buffer[2] = (value >> 16) & 0xff;
269  buffer[1] = (value >> 8) & 0xff;
270  buffer[0] = (value >> 0) & 0xff;
271 }
272 
273 static inline void xds110_set_u16(uint8_t *buffer, uint16_t value)
274 {
275  buffer[1] = (value >> 8) & 0xff;
276  buffer[0] = (value >> 0) & 0xff;
277 }
278 
279 static inline uint32_t xds110_get_u32(uint8_t *buffer)
280 {
281  uint32_t value = (((uint32_t)buffer[3]) << 24) |
282  (((uint32_t)buffer[2]) << 16) |
283  (((uint32_t)buffer[1]) << 8) |
284  (((uint32_t)buffer[0]) << 0);
285  return value;
286 }
287 
288 static inline uint16_t xds110_get_u16(uint8_t *buffer)
289 {
290  uint16_t value = (((uint32_t)buffer[1]) << 8) |
291  (((uint32_t)buffer[0]) << 0);
292  return value;
293 }
294 
295 /***************************************************************************
296  * usb connection routines *
297  * *
298  * The following functions handle connecting, reading, and writing to *
299  * the XDS110 over USB using the libusb library. *
300  ***************************************************************************/
301 
302 static bool usb_connect(void)
303 {
304  struct libusb_context *ctx = NULL;
305  struct libusb_device **list = NULL;
306  struct libusb_device_handle *dev = NULL;
307 
308  struct libusb_device_descriptor desc;
309 
310  /* The vid/pids of possible XDS110 configurations */
311  uint16_t vids[] = { 0x0451, 0x0451, 0x1cbe };
312  uint16_t pids[] = { 0xbef3, 0xbef4, 0x02a5 };
313  /* Corresponding interface and endpoint numbers for configurations */
314  uint8_t interfaces[] = { 2, 2, 0 };
315  uint8_t endpoints_in[] = { 3, 3, 1 };
316  uint8_t endpoints_out[] = { 2, 2, 1 };
317 
318  ssize_t count = 0;
319  ssize_t i = 0;
320  int result = 0;
321  bool found = false;
322  uint32_t device = 0;
323  bool match = false;
324 
325  /* Initialize libusb context */
326  result = libusb_init(&ctx);
327 
328  if (result == 0) {
329  /* Get list of USB devices attached to system */
330  count = libusb_get_device_list(ctx, &list);
331  if (count <= 0) {
332  result = -1;
333  list = NULL;
334  }
335  }
336 
337  if (result == 0) {
338  /* Scan through list of devices for any XDS110s */
339  for (i = 0; i < count; i++) {
340  /* Check for device vid/pid match */
341  libusb_get_device_descriptor(list[i], &desc);
342  match = false;
343  for (device = 0; device < ARRAY_SIZE(vids); device++) {
344  if (desc.idVendor == vids[device] &&
345  desc.idProduct == pids[device]) {
346  match = true;
347  break;
348  }
349  }
350  if (match) {
351  result = libusb_open(list[i], &dev);
352  if (result == 0) {
353  const int max_data = 256;
354  unsigned char data[max_data + 1];
355  *data = '\0';
356 
357  /* May be the requested device if serial number matches */
359  /* No serial number given; match first XDS110 found */
360  found = true;
361  break;
362  } else {
363  /* Get the device's serial number string */
364  result = libusb_get_string_descriptor_ascii(dev,
365  desc.iSerialNumber, data, max_data);
366  if (result > 0 &&
367  strcmp((char *)data, adapter_get_required_serial()) == 0) {
368  found = true;
369  break;
370  }
371  }
372 
373  /* If we fall though to here, we don't want this device */
374  libusb_close(dev);
375  dev = NULL;
376  } else {
377  const char *err_msg = libusb_error_name(result);
378  LOG_ERROR("libusb_open(): %s", err_msg);
379  }
380  }
381  }
382  }
383 
384  /*
385  * We can fall through the for() loop with two possible exit conditions:
386  * 1) found the right XDS110, and that device is open
387  * 2) didn't find the XDS110, and no devices are currently open
388  */
389 
390  if (list) {
391  /* Free the device list, we're done with it */
392  libusb_free_device_list(list, 1);
393  }
394 
395  if (found) {
396  /* Save the vid/pid of the device we're using */
397  xds110.vid = vids[device];
398  xds110.pid = pids[device];
399 
400  /* Save the debug interface and endpoints for the device */
401  xds110.interface = interfaces[device];
402  xds110.endpoint_in = endpoints_in[device] | LIBUSB_ENDPOINT_IN;
403  xds110.endpoint_out = endpoints_out[device] | LIBUSB_ENDPOINT_OUT;
404 
405  /* Save the context and device handles */
406  xds110.ctx = ctx;
407  xds110.dev = dev;
408 
409  /* Set libusb to auto detach kernel */
410  (void)libusb_set_auto_detach_kernel_driver(dev, 1);
411 
412  /* Claim the debug interface on the XDS110 */
413  result = libusb_claim_interface(dev, xds110.interface);
414  } else {
415  /* Couldn't find an XDS110, flag the error */
416  result = -1;
417  }
418 
419  /* On an error, clean up what we can */
420  if (result != 0) {
421  if (dev) {
422  /* Release the debug and data interface on the XDS110 */
423  (void)libusb_release_interface(dev, xds110.interface);
424  libusb_close(dev);
425  }
426  if (ctx)
427  libusb_exit(ctx);
428  xds110.ctx = NULL;
429  xds110.dev = NULL;
430  }
431 
432  /* Log the results */
433  if (result == 0)
434  LOG_DEBUG("XDS110: connected");
435  else
436  LOG_ERROR("XDS110: failed to connect");
437 
438  return (result == 0) ? true : false;
439 }
440 
441 static void usb_disconnect(void)
442 {
443  if (xds110.dev) {
444  /* Release the debug and data interface on the XDS110 */
445  (void)libusb_release_interface(xds110.dev, xds110.interface);
446  libusb_close(xds110.dev);
447  xds110.dev = NULL;
448  }
449  if (xds110.ctx) {
450  libusb_exit(xds110.ctx);
451  xds110.ctx = NULL;
452  }
453 
454  LOG_DEBUG("XDS110: disconnected");
455 }
456 
457 static bool usb_read(unsigned char *buffer, int size, int *bytes_read,
458  int timeout)
459 {
460  int result;
461 
462  if (!xds110.dev || !buffer || !bytes_read)
463  return false;
464 
465  /* Force a non-zero timeout to prevent blocking */
466  if (timeout == 0)
468 
469  result = libusb_bulk_transfer(xds110.dev, xds110.endpoint_in, buffer, size,
470  bytes_read, timeout);
471 
472  return (result == 0) ? true : false;
473 }
474 
475 static bool usb_write(unsigned char *buffer, int size, int *written)
476 {
477  int bytes_written = 0;
478  int result = LIBUSB_SUCCESS;
479  int retries = 0;
480 
481  if (!xds110.dev || !buffer)
482  return false;
483 
484  result = libusb_bulk_transfer(xds110.dev, xds110.endpoint_out, buffer,
485  size, &bytes_written, 0);
486 
487  while (result == LIBUSB_ERROR_PIPE && retries < 3) {
488  /* Try clearing the pipe stall and retry transfer */
489  libusb_clear_halt(xds110.dev, xds110.endpoint_out);
490  result = libusb_bulk_transfer(xds110.dev, xds110.endpoint_out, buffer,
491  size, &bytes_written, 0);
492  retries++;
493  }
494 
495  if (written)
496  *written = bytes_written;
497 
498  return (result == 0 && size == bytes_written) ? true : false;
499 }
500 
501 static bool usb_get_response(uint32_t *total_bytes_read, uint32_t timeout)
502 {
503  static unsigned char buffer[MAX_PACKET];
504  int bytes_read;
505  uint16_t size;
506  uint16_t count;
507  bool success;
508 
509  size = 0;
510  success = true;
511  while (success) {
512  success = usb_read(buffer, sizeof(buffer), &bytes_read, timeout);
513  if (success) {
514  /*
515  * Validate that this appears to be a good response packet
516  * First check it contains enough data for header and error
517  * code, plus the first character is the start character
518  */
519  if (bytes_read >= 7 && '*' == buffer[0]) {
520  /* Extract the payload size */
521  size = xds110_get_u16(&buffer[1]);
522  /* Sanity test on payload size */
523  if (USB_PAYLOAD_SIZE >= size && 4 <= size) {
524  /* Check we didn't get more data than expected */
525  if ((bytes_read - 3) <= size) {
526  /* Packet appears to be valid, move on */
527  break;
528  }
529  }
530  }
531  }
532  /*
533  * Somehow received an invalid packet, retry till we
534  * time out or a valid response packet is received
535  */
536  }
537 
538  /* Abort now if we didn't receive a valid response */
539  if (!success) {
540  if (total_bytes_read)
541  *total_bytes_read = 0;
542  return false;
543  }
544 
545  /* Build the return payload into xds110.read_payload */
546 
547  /* Copy over payload data from received buffer (skipping header) */
548  count = 0;
549  bytes_read -= 3;
550  memcpy((void *)&xds110.read_payload[count], (void *)&buffer[3], bytes_read);
551  count += bytes_read;
552  /*
553  * Drop timeout to just 1/2 second. Once the XDS110 starts sending
554  * a response, the remaining packets should arrive in short order
555  */
556  if (timeout > 500)
557  timeout = 500; /* ms */
558 
559  /* If there's more data to retrieve, get it now */
560  while ((count < size) && success) {
561  success = usb_read(buffer, sizeof(buffer), &bytes_read, timeout);
562  if (success) {
563  if ((count + bytes_read) > size) {
564  /* Read too much data, not a valid packet, abort */
565  success = false;
566  } else {
567  /* Copy this data over to xds110.read_payload */
568  memcpy((void *)&xds110.read_payload[count], (void *)buffer,
569  bytes_read);
570  count += bytes_read;
571  }
572  }
573  }
574 
575  if (!success)
576  count = 0;
577  if (total_bytes_read)
578  *total_bytes_read = count;
579 
580  return success;
581 }
582 
583 static bool usb_send_command(uint16_t size)
584 {
585  /* Check the packet length */
586  if (size > USB_PAYLOAD_SIZE)
587  return false;
588 
589  /* Place the start character into the packet buffer */
590  xds110.write_packet[0] = '*';
591 
592  /* Place the payload size into the packet buffer */
594 
595  /* Adjust size to include header */
596  size += 3;
597 
598  /* Send the data via the USB connection */
599  return usb_write(xds110.write_packet, (int)size, NULL);
600 }
601 
602 /***************************************************************************
603  * XDS110 firmware API routines *
604  * *
605  * The following functions handle calling into the XDS110 firmware to *
606  * perform requested debug actions. *
607  ***************************************************************************/
608 
609 static bool xds_execute(uint32_t out_length, uint32_t in_length,
610  uint32_t attempts, uint32_t timeout)
611 {
612  bool done = false;
613  bool success = true;
614  int error = 0;
615  uint32_t bytes_read = 0;
616 
617  if (!xds110.dev)
618  return false;
619 
620  while (!done && attempts > 0) {
621  attempts--;
622 
623  /* Send command to XDS110 */
624  success = usb_send_command(out_length);
625 
626  if (success) {
627  /* Get response from XDS110 */
628  success = usb_get_response(&bytes_read, timeout);
629  }
630 
631  if (success) {
632  /* Check for valid response from XDS code handling */
633  if (bytes_read != in_length) {
634  /* Unexpected amount of data returned */
635  success = false;
636  LOG_DEBUG("XDS110: command 0x%02x return %" PRIu32 " bytes, expected %" PRIu32,
637  xds110.write_payload[0], bytes_read, in_length);
638  } else {
639  /* Extract error code from return packet */
640  error = (int)xds110_get_u32(&xds110.read_payload[0]);
641  done = true;
642  if (error != SC_ERR_NONE)
643  LOG_DEBUG("XDS110: command 0x%02x returned error %d",
644  xds110.write_payload[0], error);
645  }
646  }
647  }
648 
649  if (!success)
650  error = SC_ERR_XDS110_FAIL;
651 
652  if (error != 0)
653  success = false;
654 
655  return success;
656 }
657 
658 static bool xds_connect(void)
659 {
660  bool success;
661 
663 
666 
667  return success;
668 }
669 
670 static bool xds_disconnect(void)
671 {
672  bool success;
673 
675 
678 
679  return success;
680 }
681 
682 static bool xds_version(uint32_t *firmware_id, uint16_t *hardware_id)
683 {
684  uint8_t *fw_id_pntr = &xds110.read_payload[XDS_IN_LEN + 0]; /* 32-bits */
685  uint8_t *hw_id_pntr = &xds110.read_payload[XDS_IN_LEN + 4]; /* 16-bits */
686 
687  bool success;
688 
690 
693 
694  if (success) {
695  if (firmware_id)
696  *firmware_id = xds110_get_u32(fw_id_pntr);
697  if (hardware_id)
698  *hardware_id = xds110_get_u16(hw_id_pntr);
699  }
700 
701  return success;
702 }
703 
704 static bool xds_set_tck_delay(uint32_t delay)
705 {
706  uint8_t *delay_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
707 
708  bool success;
709 
711 
712  xds110_set_u32(delay_pntr, delay);
713 
716 
717  return success;
718 }
719 
720 static bool xds_set_trst(uint8_t trst)
721 {
722  uint8_t *trst_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 8-bits */
723 
724  bool success;
725 
727 
728  *trst_pntr = trst;
729 
732 
733  return success;
734 }
735 
736 static bool xds_cycle_tck(uint32_t count)
737 {
738  uint8_t *count_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
739 
740  bool success;
741 
743 
744  xds110_set_u32(count_pntr, count);
745 
748 
749  return success;
750 }
751 
752 static bool xds_goto_state(uint32_t state)
753 {
754  uint8_t *state_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
755  uint8_t *transit_pntr = &xds110.write_payload[XDS_OUT_LEN+4]; /* 32-bits */
756 
757  bool success;
758 
760 
761  xds110_set_u32(state_pntr, state);
763 
766 
767  return success;
768 }
769 
770 static bool xds_jtag_scan(uint32_t shift_state, uint16_t shift_bits,
771  uint32_t end_state, uint8_t *data_out, uint8_t *data_in)
772 {
773  uint8_t *bits_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 16-bits */
774  uint8_t *path_pntr = &xds110.write_payload[XDS_OUT_LEN + 2]; /* 8-bits */
775  uint8_t *trans1_pntr = &xds110.write_payload[XDS_OUT_LEN + 3]; /* 8-bits */
776  uint8_t *end_pntr = &xds110.write_payload[XDS_OUT_LEN + 4]; /* 8-bits */
777  uint8_t *trans2_pntr = &xds110.write_payload[XDS_OUT_LEN + 5]; /* 8-bits */
778  uint8_t *pre_pntr = &xds110.write_payload[XDS_OUT_LEN + 6]; /* 16-bits */
779  uint8_t *pos_pntr = &xds110.write_payload[XDS_OUT_LEN + 8]; /* 16-bits */
780  uint8_t *delay_pntr = &xds110.write_payload[XDS_OUT_LEN + 10]; /* 16-bits */
781  uint8_t *rep_pntr = &xds110.write_payload[XDS_OUT_LEN + 12]; /* 16-bits */
782  uint8_t *out_pntr = &xds110.write_payload[XDS_OUT_LEN + 14]; /* 16-bits */
783  uint8_t *in_pntr = &xds110.write_payload[XDS_OUT_LEN + 16]; /* 16-bits */
784  uint8_t *data_out_pntr = &xds110.write_payload[XDS_OUT_LEN + 18];
785  uint8_t *data_in_pntr = &xds110.read_payload[XDS_IN_LEN+0];
786 
787  uint16_t total_bytes = DIV_ROUND_UP(shift_bits, 8);
788 
789  bool success;
790 
792 
793  xds110_set_u16(bits_pntr, shift_bits); /* bits to scan */
794  *path_pntr = (uint8_t)(shift_state & 0xff); /* IR vs DR path */
795  *trans1_pntr = (uint8_t)XDS_JTAG_TRANSIT_QUICKEST; /* start state route */
796  *end_pntr = (uint8_t)(end_state & 0xff); /* JTAG state after scan */
797  *trans2_pntr = (uint8_t)XDS_JTAG_TRANSIT_QUICKEST; /* end state route */
798  xds110_set_u16(pre_pntr, 0); /* number of preamble bits */
799  xds110_set_u16(pos_pntr, 0); /* number of postamble bits */
800  xds110_set_u16(delay_pntr, 0); /* number of extra TCKs after scan */
801  xds110_set_u16(rep_pntr, 1); /* number of repetitions */
802  xds110_set_u16(out_pntr, total_bytes); /* out buffer offset (if repeats) */
803  xds110_set_u16(in_pntr, total_bytes); /* in buffer offset (if repeats) */
804 
805  memcpy((void *)data_out_pntr, (void *)data_out, total_bytes);
806 
807  success = xds_execute(XDS_OUT_LEN + 18 + total_bytes,
809 
810  if (success)
811  memcpy((void *)data_in, (void *)data_in_pntr, total_bytes);
812 
813  return success;
814 }
815 
816 static bool xds_set_srst(uint8_t srst)
817 {
818  uint8_t *srst_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 8-bits */
819 
820  bool success;
821 
823 
824  *srst_pntr = srst;
825 
828 
829  return success;
830 }
831 
832 static bool cmapi_connect(uint32_t *idcode)
833 {
834  uint8_t *idcode_pntr = &xds110.read_payload[XDS_IN_LEN + 0]; /* 32-bits */
835 
836  bool success;
837 
839 
842 
843  if (success) {
844  if (idcode)
845  *idcode = xds110_get_u32(idcode_pntr);
846  }
847 
848  return success;
849 }
850 
851 static bool cmapi_disconnect(void)
852 {
853  bool success;
854 
856 
859 
860  return success;
861 }
862 
863 static bool cmapi_acquire(void)
864 {
865  bool success;
866 
868 
871 
872  return success;
873 }
874 
875 static bool cmapi_release(void)
876 {
877  bool success;
878 
880 
883 
884  return success;
885 }
886 
887 static bool cmapi_read_dap_reg(uint32_t type, uint32_t ap_num,
888  uint32_t address, uint32_t *value)
889 {
890  uint8_t *type_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 8-bits */
891  uint8_t *ap_num_pntr = &xds110.write_payload[XDS_OUT_LEN + 1]; /* 8-bits */
892  uint8_t *address_pntr = &xds110.write_payload[XDS_OUT_LEN + 2]; /* 8-bits */
893  uint8_t *value_pntr = &xds110.read_payload[XDS_IN_LEN + 0]; /* 32-bits */
894 
895  bool success;
896 
898 
899  *type_pntr = (uint8_t)(type & 0xff);
900  *ap_num_pntr = (uint8_t)(ap_num & 0xff);
901  *address_pntr = (uint8_t)(address & 0xff);
902 
905 
906  if (success) {
907  if (value)
908  *value = xds110_get_u32(value_pntr);
909  }
910 
911  return success;
912 }
913 
914 static bool cmapi_write_dap_reg(uint32_t type, uint32_t ap_num,
915  uint32_t address, uint32_t *value)
916 {
917  uint8_t *type_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 8-bits */
918  uint8_t *ap_num_pntr = &xds110.write_payload[XDS_OUT_LEN + 1]; /* 8-bits */
919  uint8_t *address_pntr = &xds110.write_payload[XDS_OUT_LEN + 2]; /* 8-bits */
920  uint8_t *value_pntr = &xds110.write_payload[XDS_OUT_LEN + 3]; /* 32-bits */
921 
922  bool success;
923 
924  if (!value)
925  return false;
926 
928 
929  *type_pntr = (uint8_t)(type & 0xff);
930  *ap_num_pntr = (uint8_t)(ap_num & 0xff);
931  *address_pntr = (uint8_t)(address & 0xff);
932  xds110_set_u32(value_pntr, *value);
933 
936 
937  return success;
938 }
939 
940 static bool swd_connect(void)
941 {
942  bool success;
943 
945 
948 
949  return success;
950 }
951 
952 static bool swd_disconnect(void)
953 {
954  bool success;
955 
957 
960 
961  return success;
962 }
963 
964 static bool cjtag_connect(uint32_t format)
965 {
966  uint8_t *format_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
967 
968  bool success;
969 
971 
972  xds110_set_u32(format_pntr, format);
973 
976 
977  return success;
978 }
979 
980 static bool cjtag_disconnect(void)
981 {
982  bool success;
983 
985 
988 
989  return success;
990 }
991 
992 static bool xds_set_supply(uint32_t voltage)
993 {
994  uint8_t *volts_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
995  uint8_t *source_pntr = &xds110.write_payload[XDS_OUT_LEN + 4]; /* 8-bits */
996 
997  bool success;
998 
1000 
1001  xds110_set_u32(volts_pntr, voltage);
1002  *source_pntr = (uint8_t)(voltage != 0 ? 1 : 0);
1003 
1005  DEFAULT_TIMEOUT);
1006 
1007  return success;
1008 }
1009 
1010 static bool ocd_dap_request(uint8_t *dap_requests, uint32_t request_size,
1011  uint32_t *dap_results, uint32_t result_count)
1012 {
1013  uint8_t *request_pntr = &xds110.write_payload[XDS_OUT_LEN + 0];
1014  uint8_t *result_pntr = &xds110.read_payload[XDS_IN_LEN + 0];
1015 
1016  bool success;
1017 
1018  if (!dap_requests || !dap_results)
1019  return false;
1020 
1022 
1023  memcpy((void *)request_pntr, (void *)dap_requests, request_size);
1024 
1025  success = xds_execute(XDS_OUT_LEN + request_size,
1026  XDS_IN_LEN + (result_count * 4), DEFAULT_ATTEMPTS,
1027  DEFAULT_TIMEOUT);
1028 
1029  if (success && (result_count > 0))
1030  memcpy((void *)dap_results, (void *)result_pntr, result_count * 4);
1031 
1032  return success;
1033 }
1034 
1035 static bool ocd_scan_request(uint8_t *scan_requests, uint32_t request_size,
1036  uint8_t *scan_results, uint32_t result_size)
1037 {
1038  uint8_t *request_pntr = &xds110.write_payload[XDS_OUT_LEN + 0];
1039  uint8_t *result_pntr = &xds110.read_payload[XDS_IN_LEN + 0];
1040 
1041  bool success;
1042 
1043  if (!scan_requests || !scan_results)
1044  return false;
1045 
1047 
1048  memcpy((void *)request_pntr, (void *)scan_requests, request_size);
1049 
1050  success = xds_execute(XDS_OUT_LEN + request_size,
1051  XDS_IN_LEN + result_size, DEFAULT_ATTEMPTS,
1052  DEFAULT_TIMEOUT);
1053 
1054  if (success && (result_size > 0))
1055  memcpy((void *)scan_results, (void *)result_pntr, result_size);
1056 
1057  return success;
1058 }
1059 
1060 static bool ocd_pathmove(uint32_t num_states, uint8_t *path)
1061 {
1062  uint8_t *num_pntr = &xds110.write_payload[XDS_OUT_LEN + 0]; /* 32-bits */
1063  uint8_t *path_pntr = &xds110.write_payload[XDS_OUT_LEN + 4];
1064 
1065  bool success;
1066 
1067  if (!path)
1068  return false;
1069 
1071 
1072  xds110_set_u32(num_pntr, num_states);
1073 
1074  memcpy((void *)path_pntr, (void *)path, num_states);
1075 
1076  success = xds_execute(XDS_OUT_LEN + 4 + num_states, XDS_IN_LEN,
1078 
1079  return success;
1080 }
1081 
1082 /***************************************************************************
1083  * swd driver interface *
1084  * *
1085  * The following functions provide SWD support to OpenOCD. *
1086  ***************************************************************************/
1087 
1088 static int xds110_swd_init(void)
1089 {
1090  xds110.is_swd_mode = true;
1091  return ERROR_OK;
1092 }
1093 
1095 {
1096  uint32_t idcode;
1097  bool success;
1098 
1099  switch (seq) {
1100  case LINE_RESET:
1101  LOG_ERROR("Sequence SWD line reset (%d) not supported", seq);
1102  return ERROR_FAIL;
1103  case JTAG_TO_SWD:
1104  LOG_DEBUG("JTAG-to-SWD");
1105  xds110.is_swd_mode = false;
1106  xds110.is_cmapi_connected = false;
1107  xds110.is_cmapi_acquired = false;
1108  /* Run sequence to put target in SWD mode */
1109  success = swd_connect();
1110  /* Re-initialize CMAPI API for DAP access */
1111  if (success) {
1112  xds110.is_swd_mode = true;
1113  success = cmapi_connect(&idcode);
1114  if (success) {
1115  xds110.is_cmapi_connected = true;
1116  success = cmapi_acquire();
1117  }
1118  }
1119  break;
1120  case SWD_TO_JTAG:
1121  LOG_DEBUG("SWD-to-JTAG");
1122  xds110.is_swd_mode = false;
1123  xds110.is_cmapi_connected = false;
1124  xds110.is_cmapi_acquired = false;
1125  /* Run sequence to put target in JTAG mode */
1126  success = swd_disconnect();
1127  if (success) {
1128  /* Re-initialize JTAG interface */
1129  success = cjtag_connect(MODE_JTAG);
1130  }
1131  break;
1132  default:
1133  LOG_ERROR("Sequence %d not supported", seq);
1134  return ERROR_FAIL;
1135  }
1136 
1137  if (success)
1138  return ERROR_OK;
1139  else
1140  return ERROR_FAIL;
1141 }
1142 
1143 static bool xds110_legacy_read_reg(uint8_t cmd, uint32_t *value)
1144 {
1145  /* Make sure this is a read request */
1146  bool is_read_request = (0 != (SWD_CMD_RNW & cmd));
1147  /* Determine whether this is a DP or AP register access */
1148  uint32_t type = (0 != (SWD_CMD_APNDP & cmd)) ? DAP_AP : DAP_DP;
1149  /* Determine the AP number from cached SELECT value */
1150  uint32_t ap_num = (xds110.select & 0xff000000) >> 24;
1151  /* Extract register address from command */
1152  uint32_t address = ((cmd & SWD_CMD_A32) >> 1);
1153  /* Extract bank address from cached SELECT value */
1154  uint32_t bank = (xds110.select & 0x000000f0);
1155 
1156  uint32_t reg_value = 0;
1157  uint32_t temp_value = 0;
1158 
1159  bool success;
1160 
1161  if (!is_read_request)
1162  return false;
1163 
1164  if (type == DAP_AP) {
1165  /* Add bank address to register address for CMAPI call */
1166  address |= bank;
1167  }
1168 
1169  if (DAP_DP == type && DAP_DP_RDBUFF == address && xds110.use_rdbuff) {
1170  /* If RDBUFF is cached and this is a DP RDBUFF read, use the cache */
1171  reg_value = xds110.rdbuff;
1172  success = true;
1173  } else if (DAP_AP == type && DAP_AP_DRW == address && xds110.use_rdbuff) {
1174  /* If RDBUFF is cached and this is an AP DRW read, use the cache, */
1175  /* but still call into the firmware to get the next read. */
1176  reg_value = xds110.rdbuff;
1177  success = cmapi_read_dap_reg(type, ap_num, address, &temp_value);
1178  } else {
1179  success = cmapi_read_dap_reg(type, ap_num, address, &temp_value);
1180  if (success)
1181  reg_value = temp_value;
1182  }
1183 
1184  /* Mark that we have consumed or invalidated the RDBUFF cache */
1185  xds110.use_rdbuff = false;
1186 
1187  /* Handle result of read attempt */
1188  if (!success)
1189  LOG_ERROR("XDS110: failed to read DAP register");
1190  else if (value)
1191  *value = reg_value;
1192 
1193  if (success && DAP_AP == type) {
1194  /*
1195  * On a successful DAP AP read, we actually have the value from RDBUFF,
1196  * the firmware will have run the AP request and made the RDBUFF read
1197  */
1198  xds110.use_rdbuff = true;
1199  xds110.rdbuff = temp_value;
1200  }
1201 
1202  return success;
1203 }
1204 
1205 static bool xds110_legacy_write_reg(uint8_t cmd, uint32_t value)
1206 {
1207  /* Make sure this isn't a read request */
1208  bool is_read_request = (0 != (SWD_CMD_RNW & cmd));
1209  /* Determine whether this is a DP or AP register access */
1210  uint32_t type = (0 != (SWD_CMD_APNDP & cmd)) ? DAP_AP : DAP_DP;
1211  /* Determine the AP number from cached SELECT value */
1212  uint32_t ap_num = (xds110.select & 0xff000000) >> 24;
1213  /* Extract register address from command */
1214  uint32_t address = ((cmd & SWD_CMD_A32) >> 1);
1215  /* Extract bank address from cached SELECT value */
1216  uint32_t bank = (xds110.select & 0x000000f0);
1217 
1218  bool success;
1219 
1220  if (is_read_request)
1221  return false;
1222 
1223  /* Invalidate the RDBUFF cache */
1224  xds110.use_rdbuff = false;
1225 
1226  if (type == DAP_AP) {
1227  /* Add bank address to register address for CMAPI call */
1228  address |= bank;
1229  /* Any write to an AP register invalidates the firmware's cache */
1230  xds110.is_ap_dirty = true;
1231  } else if (address == DAP_DP_SELECT) {
1232  /* Any write to the SELECT register invalidates the firmware's cache */
1233  xds110.is_ap_dirty = true;
1234  }
1235 
1236  success = cmapi_write_dap_reg(type, ap_num, address, &value);
1237 
1238  if (!success) {
1239  LOG_ERROR("XDS110: failed to write DAP register");
1240  } else {
1241  /*
1242  * If the debugger wrote to SELECT, cache the value
1243  * to use to build the apNum and address values above
1244  */
1245  if ((type == DAP_DP) && (address == DAP_DP_SELECT))
1246  xds110.select = value;
1247  }
1248 
1249  return success;
1250 }
1251 
1252 static int xds110_swd_run_queue(void)
1253 {
1254  static uint32_t dap_results[MAX_RESULT_QUEUE];
1255  uint8_t cmd;
1256  uint32_t request;
1257  uint32_t result;
1258  uint32_t value;
1259  bool success = true;
1260 
1261  if (xds110.txn_request_size == 0)
1262  return ERROR_OK;
1263 
1264  /* Terminate request queue */
1266 
1268  /* XDS110 firmware has the API to directly handle the queue */
1271  } else {
1272  /* Legacy firmware needs to handle queue via discrete DAP calls */
1273  request = 0;
1274  result = 0;
1275  while (xds110.txn_requests[request] != 0) {
1276  cmd = xds110.txn_requests[request++];
1277  if (0 == (SWD_CMD_RNW & cmd)) {
1278  /* DAP register write command */
1279  value = (uint32_t)(xds110.txn_requests[request++]) << 0;
1280  value |= (uint32_t)(xds110.txn_requests[request++]) << 8;
1281  value |= (uint32_t)(xds110.txn_requests[request++]) << 16;
1282  value |= (uint32_t)(xds110.txn_requests[request++]) << 24;
1283  if (success)
1284  success = xds110_legacy_write_reg(cmd, value);
1285  } else {
1286  /* DAP register read command */
1287  value = 0;
1288  if (success)
1289  success = xds110_legacy_read_reg(cmd, &value);
1290  dap_results[result++] = value;
1291  }
1292  }
1293  }
1294 
1295  /* Transfer results into caller's buffers */
1296  for (result = 0; result < xds110.txn_result_count; result++)
1297  if (xds110.txn_dap_results[result])
1298  *xds110.txn_dap_results[result] = dap_results[result];
1299 
1301  xds110.txn_result_size = 0;
1303 
1304  return (success) ? ERROR_OK : ERROR_FAIL;
1305 }
1306 
1307 static void xds110_swd_queue_cmd(uint8_t cmd, uint32_t *value)
1308 {
1309  /* Check if this is a read or write request */
1310  bool is_read_request = (0 != (SWD_CMD_RNW & cmd));
1311  /* Determine whether this is a DP or AP register access */
1312  uint32_t type = (0 != (SWD_CMD_APNDP & cmd)) ? DAP_AP : DAP_DP;
1313  /* Extract register address from command */
1314  uint32_t address = ((cmd & SWD_CMD_A32) >> 1);
1315  uint32_t request_size = (is_read_request) ? 1 : 5;
1316 
1317  /* Check if new request would be too large to fit */
1318  if (((xds110.txn_request_size + request_size + 1) > MAX_DATA_BLOCK) ||
1321 
1322  /* Set the START bit in cmd to ensure cmd is not zero */
1323  /* (a value of zero is used to terminate the buffer) */
1324  cmd |= SWD_CMD_START;
1325 
1326  /* Add request to queue; queue is built marshalled for XDS110 call */
1327  if (is_read_request) {
1328  /* Queue read request, save pointer to pass back result */
1331  xds110.txn_result_size += 4;
1332  } else {
1333  /* Check for and prevent sticky overrun detection */
1334  if (DAP_DP == type && DAP_DP_CTRL == address &&
1335  (*value & CORUNDETECT)) {
1336  LOG_DEBUG("XDS110: refusing to enable sticky overrun detection");
1337  *value &= ~CORUNDETECT;
1338  }
1339  /* Queue write request, add value directly to queue buffer */
1341  xds110.txn_requests[xds110.txn_request_size++] = (*value >> 0) & 0xff;
1342  xds110.txn_requests[xds110.txn_request_size++] = (*value >> 8) & 0xff;
1343  xds110.txn_requests[xds110.txn_request_size++] = (*value >> 16) & 0xff;
1344  xds110.txn_requests[xds110.txn_request_size++] = (*value >> 24) & 0xff;
1345  }
1346 }
1347 
1348 static void xds110_swd_read_reg(uint8_t cmd, uint32_t *value,
1349  uint32_t ap_delay_clk)
1350 {
1351  assert(cmd & SWD_CMD_RNW);
1352  xds110_swd_queue_cmd(cmd, value);
1353 }
1354 static void xds110_swd_write_reg(uint8_t cmd, uint32_t value,
1355  uint32_t ap_delay_clk)
1356 {
1357  assert(!(cmd & SWD_CMD_RNW));
1358  xds110_swd_queue_cmd(cmd, &value);
1359 }
1360 
1361 /***************************************************************************
1362  * jtag interface *
1363  * *
1364  * The following functions provide XDS110 interface to OpenOCD. *
1365  ***************************************************************************/
1366 
1367 static void xds110_show_info(void)
1368 {
1369  uint32_t firmware = xds110.firmware;
1370 
1371  LOG_INFO("XDS110: vid/pid = %04x/%04x", xds110.vid, xds110.pid);
1372  LOG_INFO("XDS110: firmware version = %" PRIu32 ".%" PRIu32 ".%" PRIu32 ".%" PRIu32,
1373  (((firmware >> 28) & 0xf) * 10) + ((firmware >> 24) & 0xf),
1374  (((firmware >> 20) & 0xf) * 10) + ((firmware >> 16) & 0xf),
1375  (((firmware >> 12) & 0xf) * 10) + ((firmware >> 8) & 0xf),
1376  (((firmware >> 4) & 0xf) * 10) + ((firmware >> 0) & 0xf));
1377  LOG_INFO("XDS110: hardware version = 0x%04x", xds110.hardware);
1379  LOG_INFO("XDS110: serial number = %s", adapter_get_required_serial());
1380  if (xds110.is_swd_mode) {
1381  LOG_INFO("XDS110: connected to target via SWD");
1382  LOG_INFO("XDS110: SWCLK set to %" PRIu32 " kHz", xds110.speed);
1383  } else {
1384  LOG_INFO("XDS110: connected to target via JTAG");
1385  LOG_INFO("XDS110: TCK set to %" PRIu32 " kHz", xds110.speed);
1386  }
1387 
1388  /* Alert user that there's a better firmware to use */
1389  if (firmware < OCD_FIRMWARE_VERSION) {
1390  LOG_WARNING("XDS110: the firmware is not optimized for OpenOCD");
1392  }
1393 }
1394 
1395 static int xds110_quit(void)
1396 {
1397  if (xds110.is_cmapi_acquired) {
1398  (void)cmapi_release();
1399  xds110.is_cmapi_acquired = false;
1400  }
1401  if (xds110.is_cmapi_connected) {
1402  (void)cmapi_disconnect();
1403  xds110.is_cmapi_connected = false;
1404  }
1405  if (xds110.is_connected) {
1406  if (xds110.is_swd_mode) {
1407  /* Switch out of SWD mode */
1408  (void)swd_disconnect();
1409  } else {
1410  /* Switch out of cJTAG mode */
1411  (void)cjtag_disconnect();
1412  }
1413  /* Tell firmware we're disconnecting */
1414  (void)xds_disconnect();
1415  xds110.is_connected = false;
1416  }
1417  /* Close down the USB connection to the XDS110 debug probe */
1418  usb_disconnect();
1419 
1420  return ERROR_OK;
1421 }
1422 
1423 static int xds110_init(void)
1424 {
1425  bool success;
1426 
1427  /* Establish USB connection to the XDS110 debug probe */
1428  success = usb_connect();
1429 
1430  if (success) {
1431  /* Send connect message to XDS110 firmware */
1432  success = xds_connect();
1433  if (success)
1434  xds110.is_connected = true;
1435  }
1436 
1437  if (success) {
1438  uint32_t firmware;
1439  uint16_t hardware;
1440 
1441  /* Retrieve version IDs from firmware */
1442  /* Version numbers are stored in BCD format */
1443  success = xds_version(&firmware, &hardware);
1444  if (success) {
1445  /* Save the firmware and hardware version */
1446  xds110.firmware = firmware;
1447  xds110.hardware = hardware;
1448  }
1449  }
1450 
1451  if (success) {
1452  /* Set supply voltage for stand-alone probes */
1454  success = xds_set_supply(xds110.voltage);
1455  /* Allow time for target device to power up */
1456  /* (CC32xx takes up to 1300 ms before debug is enabled) */
1457  alive_sleep(1500);
1458  } else if (xds110.voltage != 0) {
1459  /* Voltage supply not a feature of embedded probes */
1460  LOG_WARNING(
1461  "XDS110: ignoring supply voltage, not supported on this probe");
1462  }
1463  }
1464 
1465  if (success) {
1466  success = xds_set_trst(0);
1467  if (success)
1468  success = xds_cycle_tck(50);
1469  if (success)
1470  success = xds_set_trst(1);
1471  if (success)
1472  success = xds_cycle_tck(50);
1473  }
1474 
1475  if (success) {
1476  if (xds110.is_swd_mode) {
1477  /* Switch to SWD if needed */
1478  success = swd_connect();
1479  } else {
1480  success = cjtag_connect(MODE_JTAG);
1481  }
1482  }
1483 
1484  if (success && xds110.is_swd_mode) {
1485  uint32_t idcode;
1486 
1487  /* Connect to CMAPI interface in XDS110 */
1488  success = cmapi_connect(&idcode);
1489 
1490  /* Acquire exclusive access to CMAPI interface */
1491  if (success) {
1492  xds110.is_cmapi_connected = true;
1493  success = cmapi_acquire();
1494  if (success)
1495  xds110.is_cmapi_acquired = true;
1496  }
1497  }
1498 
1499  if (!success)
1500  xds110_quit();
1501 
1502  if (success)
1503  xds110_show_info();
1504 
1505  return (success) ? ERROR_OK : ERROR_FAIL;
1506 }
1507 
1508 static void xds110_legacy_scan(uint32_t shift_state, uint32_t total_bits,
1509  uint32_t end_state, uint8_t *data_out, uint8_t *data_in)
1510 {
1511  (void)xds_jtag_scan(shift_state, total_bits, end_state, data_out, data_in);
1512 }
1513 
1514 static void xds110_legacy_runtest(uint32_t clocks, uint32_t end_state)
1515 {
1517  xds_cycle_tck(clocks);
1518  xds_goto_state(end_state);
1519 }
1520 
1521 static void xds110_legacy_stableclocks(uint32_t clocks)
1522 {
1523  xds_cycle_tck(clocks);
1524 }
1525 
1526 static void xds110_flush(void)
1527 {
1528  uint8_t command;
1529  uint32_t clocks;
1530  uint32_t shift_state;
1531  uint32_t end_state;
1532  uint32_t bits;
1533  uint32_t bytes;
1534  uint32_t request;
1535  uint32_t result;
1536  uint8_t *data_out;
1537  uint8_t data_in[MAX_DATA_BLOCK];
1538  uint8_t *data_pntr;
1539 
1540  if (xds110.txn_request_size == 0)
1541  return;
1542 
1543  /* Terminate request queue */
1545 
1547  /* Updated firmware has the API to directly handle the queue */
1549  data_in, xds110.txn_result_size);
1550  } else {
1551  /* Legacy firmware needs to handle queue via discrete JTAG calls */
1552  request = 0;
1553  result = 0;
1554  while (xds110.txn_requests[request] != 0) {
1555  command = xds110.txn_requests[request++];
1556  switch (command) {
1557  case CMD_IR_SCAN:
1558  case CMD_DR_SCAN:
1559  if (command == CMD_IR_SCAN)
1560  shift_state = XDS_JTAG_STATE_SHIFT_IR;
1561  else
1562  shift_state = XDS_JTAG_STATE_SHIFT_DR;
1563  end_state = (uint32_t)(xds110.txn_requests[request++]);
1564  bits = (uint32_t)(xds110.txn_requests[request++]) << 0;
1565  bits |= (uint32_t)(xds110.txn_requests[request++]) << 8;
1566  data_out = &xds110.txn_requests[request];
1567  bytes = DIV_ROUND_UP(bits, 8);
1568  xds110_legacy_scan(shift_state, bits, end_state, data_out,
1569  &data_in[result]);
1570  result += bytes;
1571  request += bytes;
1572  break;
1573  case CMD_RUNTEST:
1574  clocks = (uint32_t)(xds110.txn_requests[request++]) << 0;
1575  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 8;
1576  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 16;
1577  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 24;
1578  end_state = (uint32_t)xds110.txn_requests[request++];
1579  xds110_legacy_runtest(clocks, end_state);
1580  break;
1581  case CMD_STABLECLOCKS:
1582  clocks = (uint32_t)(xds110.txn_requests[request++]) << 0;
1583  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 8;
1584  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 16;
1585  clocks |= (uint32_t)(xds110.txn_requests[request++]) << 24;
1587  break;
1588  default:
1589  LOG_ERROR("BUG: unknown JTAG command type 0x%x encountered",
1590  command);
1591  exit(-1);
1592  break;
1593  }
1594  }
1595  }
1596 
1597  /* Transfer results into caller's buffers from data_in buffer */
1598  bits = 0; /* Bit offset into current scan result */
1599  data_pntr = data_in;
1600  for (result = 0; result < xds110.txn_result_count; result++) {
1601  if (xds110.txn_scan_results[result].first) {
1602  if (bits != 0) {
1603  bytes = DIV_ROUND_UP(bits, 8);
1604  data_pntr += bytes;
1605  }
1606  bits = 0;
1607  }
1608  if (xds110.txn_scan_results[result].buffer)
1609  bit_copy(xds110.txn_scan_results[result].buffer, 0, data_pntr,
1611  bits += xds110.txn_scan_results[result].num_bits;
1612  }
1613 
1615  xds110.txn_result_size = 0;
1617 }
1618 
1619 static int xds110_reset(int trst, int srst)
1620 {
1621  uint8_t value;
1622  bool success;
1623  int retval = ERROR_OK;
1624 
1625  if (trst != -1) {
1626  if (trst == 0) {
1627  /* Deassert nTRST (active low) */
1628  value = 1;
1629  } else {
1630  /* Assert nTRST (active low) */
1631  value = 0;
1632  }
1633  success = xds_set_trst(value);
1634  if (!success)
1635  retval = ERROR_FAIL;
1636  }
1637 
1638  if (srst != -1) {
1639  if (srst == 0) {
1640  /* Deassert nSRST (active low) */
1641  value = 1;
1642  } else {
1643  /* Assert nSRST (active low) */
1644  value = 0;
1645  }
1646  success = xds_set_srst(value);
1647  if (!success)
1648  retval = ERROR_FAIL;
1649 
1650  /* Toggle TCK to trigger HIB on CC13x/CC26x devices */
1651  if (success && !xds110.is_swd_mode) {
1652  /* Toggle TCK for about 50 ms */
1653  success = xds_cycle_tck(xds110.speed * 50);
1654  }
1655 
1656  if (!success)
1657  retval = ERROR_FAIL;
1658  }
1659 
1660  return retval;
1661 }
1662 
1664 {
1665  jtag_sleep(cmd->cmd.sleep->us);
1666 }
1667 
1669 {
1671 }
1672 
1674 {
1675  uint32_t num_states;
1676  uint8_t *path;
1677 
1678  num_states = (uint32_t)cmd->cmd.pathmove->num_states;
1679 
1680  if (num_states == 0)
1681  return;
1682 
1683  path = malloc(num_states * sizeof(uint8_t));
1684  if (!path) {
1685  LOG_ERROR("XDS110: unable to allocate memory");
1686  return;
1687  }
1688 
1689  /* Convert requested path states into XDS API states */
1690  for (unsigned int i = 0; i < num_states; i++)
1691  path[i] = (uint8_t)xds_jtag_state[cmd->cmd.pathmove->path[i]];
1692 
1694  /* Updated firmware fully supports pathmove */
1695  (void)ocd_pathmove(num_states, path);
1696  } else {
1697  /* Notify user that legacy firmware simply cannot handle pathmove */
1698  LOG_ERROR("XDS110: the firmware does not support pathmove command");
1700  /* If pathmove is required, then debug is not possible */
1701  exit(-1);
1702  }
1703 
1704  free((void *)path);
1705 }
1706 
1707 static void xds110_queue_scan(struct jtag_command *cmd)
1708 {
1709  uint32_t offset;
1710  uint32_t total_fields;
1711  uint32_t total_bits;
1712  uint32_t total_bytes;
1713  uint8_t end_state;
1714  uint8_t *buffer;
1715 
1716  /* Calculate the total number of bits to scan */
1717  total_bits = 0;
1718  total_fields = 0;
1719  for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++) {
1720  total_fields++;
1721  total_bits += (uint32_t)cmd->cmd.scan->fields[i].num_bits;
1722  }
1723 
1724  if (total_bits == 0)
1725  return;
1726 
1727  total_bytes = DIV_ROUND_UP(total_bits, 8);
1728 
1729  /* Check if new request would be too large to fit */
1730  if (((xds110.txn_request_size + 1 + total_bytes + sizeof(end_state) + 1)
1731  > MAX_DATA_BLOCK) || ((xds110.txn_result_count + total_fields) >
1733  xds110_flush();
1734 
1735  /* Check if this single request is too large to fit */
1736  if ((1 + total_bytes + sizeof(end_state) + 1) > MAX_DATA_BLOCK) {
1737  LOG_ERROR("BUG: JTAG scan request is too large to handle (%" PRIu32 " bits)",
1738  total_bits);
1739  /* Failing to run this scan mucks up debug on this target */
1740  exit(-1);
1741  }
1742 
1743  if (cmd->cmd.scan->ir_scan)
1745  else
1747 
1748  end_state = (uint8_t)xds_jtag_state[cmd->cmd.scan->end_state];
1749  xds110.txn_requests[xds110.txn_request_size++] = end_state;
1750 
1751  xds110.txn_requests[xds110.txn_request_size++] = (total_bits >> 0) & 0xff;
1752  xds110.txn_requests[xds110.txn_request_size++] = (total_bits >> 8) & 0xff;
1753 
1754  /* Build request data by flattening fields into single buffer */
1755  /* also populate the results array to return the results when run */
1756  offset = 0;
1758  /* Clear data out buffer to default value of all zeros */
1759  memset((void *)buffer, 0x00, total_bytes);
1760  for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++) {
1761  if (cmd->cmd.scan->fields[i].out_value) {
1762  /* Copy over data to scan out into request buffer */
1763  bit_copy(buffer, offset, cmd->cmd.scan->fields[i].out_value, 0,
1764  cmd->cmd.scan->fields[i].num_bits);
1765  }
1766  offset += cmd->cmd.scan->fields[i].num_bits;
1769  cmd->cmd.scan->fields[i].num_bits;
1771  cmd->cmd.scan->fields[i].in_value;
1772  }
1773  xds110.txn_request_size += total_bytes;
1774  xds110.txn_result_size += total_bytes;
1775 }
1776 
1778 {
1779  uint32_t clocks = cmd->cmd.stableclocks->num_cycles;
1780  uint8_t end_state = (uint8_t)xds_jtag_state[cmd->cmd.runtest->end_state];
1781 
1782  /* Check if new request would be too large to fit */
1783  if ((xds110.txn_request_size + 1 + sizeof(clocks) + sizeof(end_state) + 1)
1784  > MAX_DATA_BLOCK)
1785  xds110_flush();
1786 
1787  /* Queue request and cycle count directly to queue buffer */
1789  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 0) & 0xff;
1790  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 8) & 0xff;
1791  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 16) & 0xff;
1792  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 24) & 0xff;
1793  xds110.txn_requests[xds110.txn_request_size++] = end_state;
1794 }
1795 
1797 {
1798  uint32_t clocks = cmd->cmd.stableclocks->num_cycles;
1799 
1800  /* Check if new request would be too large to fit */
1801  if ((xds110.txn_request_size + 1 + sizeof(clocks) + 1) > MAX_DATA_BLOCK)
1802  xds110_flush();
1803 
1804  /* Queue request and cycle count directly to queue buffer */
1806  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 0) & 0xff;
1807  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 8) & 0xff;
1808  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 16) & 0xff;
1809  xds110.txn_requests[xds110.txn_request_size++] = (clocks >> 24) & 0xff;
1810 }
1811 
1813 {
1814  switch (cmd->type) {
1815  case JTAG_SLEEP:
1816  xds110_flush();
1818  break;
1819  case JTAG_TLR_RESET:
1820  xds110_flush();
1822  break;
1823  case JTAG_PATHMOVE:
1824  xds110_flush();
1826  break;
1827  case JTAG_SCAN:
1829  break;
1830  case JTAG_RUNTEST:
1832  break;
1833  case JTAG_STABLECLOCKS:
1835  break;
1836  case JTAG_TMS:
1837  default:
1838  LOG_ERROR("BUG: unknown JTAG command type 0x%x encountered",
1839  cmd->type);
1840  exit(-1);
1841  }
1842 }
1843 
1844 static int xds110_execute_queue(struct jtag_command *cmd_queue)
1845 {
1846  struct jtag_command *cmd = cmd_queue;
1847 
1848  while (cmd) {
1850  cmd = cmd->next;
1851  }
1852 
1853  xds110_flush();
1854 
1855  return ERROR_OK;
1856 }
1857 
1858 static int xds110_speed(int speed)
1859 {
1860  double freq_to_use;
1861  uint32_t delay_count;
1862  bool success;
1863 
1864  if (speed == 0) {
1865  LOG_INFO("XDS110: RTCK not supported");
1867  }
1868 
1869  if (speed < XDS110_MIN_TCK_SPEED) {
1870  LOG_INFO("XDS110: increase speed request: %d kHz to %d kHz minimum",
1871  speed, XDS110_MIN_TCK_SPEED);
1872  speed = XDS110_MIN_TCK_SPEED;
1873  }
1874 
1875  /* Older XDS110 firmware had inefficient scan routines and could only */
1876  /* achieve a peak TCK frequency of about 2500 kHz */
1878 
1879  /* Check for request for top speed or higher */
1880  if (speed >= XDS110_MAX_SLOW_TCK_SPEED) {
1881 
1882  /* Inform user that speed was adjusted down to max possible */
1883  if (speed > XDS110_MAX_SLOW_TCK_SPEED) {
1884  LOG_INFO(
1885  "XDS110: reduce speed request: %d kHz to %d kHz maximum",
1886  speed, XDS110_MAX_SLOW_TCK_SPEED);
1887  speed = XDS110_MAX_SLOW_TCK_SPEED;
1888  }
1889  delay_count = 0;
1890 
1891  } else {
1892 
1893  const double xds110_tck_pulse_increment = 66.0;
1894  freq_to_use = speed * 1000; /* Hz */
1895  delay_count = 0;
1896 
1897  /* Calculate the delay count value */
1898  double one_giga = 1000000000;
1899  /* Get the pulse duration for the max frequency supported in ns */
1900  double max_freq_pulse_duration = one_giga /
1901  (XDS110_MAX_SLOW_TCK_SPEED * 1000);
1902 
1903  /* Convert frequency to pulse duration */
1904  double freq_to_pulse_width_in_ns = one_giga / freq_to_use;
1905 
1906  /*
1907  * Start with the pulse duration for the maximum frequency. Keep
1908  * decrementing time added by each count value till the requested
1909  * frequency pulse is less than the calculated value.
1910  */
1911  double current_value = max_freq_pulse_duration;
1912 
1913  while (current_value < freq_to_pulse_width_in_ns) {
1914  current_value += xds110_tck_pulse_increment;
1915  ++delay_count;
1916  }
1917 
1918  /*
1919  * Determine which delay count yields the best match.
1920  * The one obtained above or one less.
1921  */
1922  if (delay_count) {
1923  double diff_freq_1 = freq_to_use -
1924  (one_giga / (max_freq_pulse_duration +
1925  (xds110_tck_pulse_increment * delay_count)));
1926  double diff_freq_2 = (one_giga / (max_freq_pulse_duration +
1927  (xds110_tck_pulse_increment * (delay_count - 1)))) -
1928  freq_to_use;
1929 
1930  /* One less count value yields a better match */
1931  if (diff_freq_1 > diff_freq_2)
1932  --delay_count;
1933  }
1934  }
1935 
1936  /* Newer firmware has reworked TCK routines that are much more efficient */
1937  /* and can now achieve a peak TCK frequency of 14000 kHz */
1938  } else {
1939 
1940  if (speed >= XDS110_MAX_FAST_TCK_SPEED) {
1941  if (speed > XDS110_MAX_FAST_TCK_SPEED) {
1942  LOG_INFO(
1943  "XDS110: reduce speed request: %d kHz to %d kHz maximum",
1944  speed, XDS110_MAX_FAST_TCK_SPEED);
1945  speed = XDS110_MAX_FAST_TCK_SPEED;
1946  }
1947  delay_count = 0;
1948  } else if (speed >= 12000 && xds110.firmware >=
1950  delay_count = FAST_TCK_DELAY_12000_KHZ;
1951  } else if (speed >= 10000 && xds110.firmware >=
1953  delay_count = FAST_TCK_DELAY_10000_KHZ;
1954  } else if (speed >= 8500) {
1955  delay_count = FAST_TCK_DELAY_8500_KHZ;
1956  } else if (speed >= 5500) {
1957  delay_count = FAST_TCK_DELAY_5500_KHZ;
1958  } else {
1959  /* Calculate the delay count to set the frequency */
1960  /* Formula determined by measuring the waveform on Saeleae logic */
1961  /* analyzer using known values for delay count */
1962  const double m = 17100000.0; /* slope */
1963  const double b = -1.02; /* y-intercept */
1964 
1965  freq_to_use = speed * 1000; /* Hz */
1966  double period = 1.0/freq_to_use;
1967  double delay = m * period + b;
1968 
1969  if (delay < 1.0)
1970  delay_count = 1;
1971  else
1972  delay_count = (uint32_t)delay;
1973  }
1974  }
1975 
1976  /* Send the delay count to the XDS110 firmware */
1977  success = xds_set_tck_delay(delay_count);
1978 
1979  if (success) {
1980  xds110.delay_count = delay_count;
1981  xds110.speed = speed;
1982  }
1983 
1984  return (success) ? ERROR_OK : ERROR_FAIL;
1985 }
1986 
1987 static int xds110_speed_div(int speed, int *khz)
1988 {
1989  *khz = speed;
1990  return ERROR_OK;
1991 }
1992 
1993 static int xds110_khz(int khz, int *jtag_speed)
1994 {
1995  *jtag_speed = khz;
1996  return ERROR_OK;
1997 }
1998 
1999 COMMAND_HANDLER(xds110_handle_info_command)
2000 {
2001  xds110_show_info();
2002  return ERROR_OK;
2003 }
2004 
2005 COMMAND_HANDLER(xds110_handle_supply_voltage_command)
2006 {
2007  uint32_t voltage = 0;
2008 
2009  if (CMD_ARGC == 1) {
2010  COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], voltage);
2011  if (voltage == 0 || (voltage >= XDS110_MIN_VOLTAGE && voltage
2012  <= XDS110_MAX_VOLTAGE)) {
2013  /* Requested voltage is in range */
2014  xds110.voltage = voltage;
2015  } else {
2016  LOG_ERROR("XDS110: voltage must be 0 or between %d and %d "
2017  "millivolts", XDS110_MIN_VOLTAGE, XDS110_MAX_VOLTAGE);
2018  return ERROR_FAIL;
2019  }
2020  xds110.voltage = voltage;
2021  } else
2023 
2024  return ERROR_OK;
2025 }
2026 
2027 static const struct command_registration xds110_subcommand_handlers[] = {
2028  {
2029  .name = "info",
2030  .handler = &xds110_handle_info_command,
2031  .mode = COMMAND_EXEC,
2032  .help = "show XDS110 info",
2033  .usage = "",
2034  },
2035  {
2036  .name = "supply",
2037  .handler = &xds110_handle_supply_voltage_command,
2038  .mode = COMMAND_CONFIG,
2039  .help = "set the XDS110 probe supply voltage",
2040  .usage = "voltage_in_millivolts",
2041  },
2043 };
2044 
2045 static const struct command_registration xds110_command_handlers[] = {
2046  {
2047  .name = "xds110",
2048  .mode = COMMAND_ANY,
2049  .help = "perform XDS110 management",
2050  .usage = "",
2051  .chain = xds110_subcommand_handlers,
2052  },
2054 };
2055 
2056 static const struct swd_driver xds110_swd_driver = {
2057  .init = xds110_swd_init,
2058  .switch_seq = xds110_swd_switch_seq,
2059  .read_reg = xds110_swd_read_reg,
2060  .write_reg = xds110_swd_write_reg,
2061  .run = xds110_swd_run_queue,
2062 };
2063 
2064 static struct jtag_interface xds110_interface = {
2066 };
2067 
2069  .name = "xds110",
2070  .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
2071  .transport_preferred_id = TRANSPORT_SWD,
2072  .commands = xds110_command_handlers,
2073 
2074  .init = xds110_init,
2075  .quit = xds110_quit,
2076  .reset = xds110_reset,
2077  .speed = xds110_speed,
2078  .khz = xds110_khz,
2079  .speed_div = xds110_speed_div,
2080 
2081  .jtag_ops = &xds110_interface,
2082  .swd_ops = &xds110_swd_driver,
2083 };
const char * adapter_get_required_serial(void)
Retrieves the serial number set with command 'adapter serial'.
Definition: adapter.c:302
#define CORUNDETECT
Definition: arm_adi_v5.h:82
swd_special_seq
Definition: arm_adi_v5.h:236
@ JTAG_TO_SWD
Definition: arm_adi_v5.h:238
@ LINE_RESET
Definition: arm_adi_v5.h:237
@ SWD_TO_JTAG
Definition: arm_adi_v5.h:240
static const struct device_t * device
Definition: at91rm9200.c:94
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
#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_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
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_ANY
Definition: command.h:42
@ COMMAND_EXEC
Definition: command.h:40
@ 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
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
uint32_t address
Starting address. Sector aligned.
Definition: dw-spi-helper.h:0
uint8_t bank
Definition: esirisc.c:135
uint8_t type
Definition: esp_usb_jtag.c:0
void jtag_sleep(uint32_t us)
Definition: jtag/core.c:1075
#define ERROR_JTAG_NOT_IMPLEMENTED
Definition: jtag.h:554
void alive_sleep(uint64_t ms)
Definition: log.c:470
#define LOG_WARNING(expr ...)
Definition: log.h:131
#define ERROR_FAIL
Definition: log.h:175
#define LOG_ERROR(expr ...)
Definition: log.h:134
#define LOG_INFO(expr ...)
Definition: log.h:128
#define LOG_DEBUG(expr ...)
Definition: log.h:111
#define ERROR_OK
Definition: log.h:169
uint8_t bits[QN908X_FLASH_MAX_BLOCKS *QN908X_FLASH_PAGES_PER_BLOCK/8]
Definition: qn908x.c:0
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
const char * name
Definition: command.h:234
Represents a driver for a debugging interface.
Definition: interface.h:183
int(* execute_queue)(struct jtag_command *cmd_queue)
Execute commands in the supplied queue.
Definition: interface.h:196
uint8_t * buffer
Definition: xds110.c:197
uint32_t num_bits
Definition: xds110.c:198
bool first
Definition: xds110.c:196
int(* init)(void)
Initialize the debug link so it can perform SWD operations.
Definition: swd.h:255
Definition: psoc6.c:83
uint32_t firmware
Definition: xds110.c:231
bool is_cmapi_connected
Definition: xds110.c:217
bool is_connected
Definition: xds110.c:216
uint32_t speed
Definition: xds110.c:226
unsigned char txn_requests[MAX_DATA_BLOCK]
Definition: xds110.c:234
bool is_ap_dirty
Definition: xds110.c:220
uint32_t txn_result_count
Definition: xds110.c:239
unsigned char read_payload[USB_PAYLOAD_SIZE]
Definition: xds110.c:205
uint32_t txn_result_size
Definition: xds110.c:238
uint32_t select
Definition: xds110.c:222
bool is_cmapi_acquired
Definition: xds110.c:218
uint32_t txn_request_size
Definition: xds110.c:237
unsigned char write_payload[USB_PAYLOAD_SIZE]
Definition: xds110.c:207
struct libusb_device_handle * dev
Definition: xds110.c:204
struct libusb_context * ctx
Definition: xds110.c:203
struct scan_result txn_scan_results[MAX_DATA_BLOCK/4]
Definition: xds110.c:236
bool use_rdbuff
Definition: xds110.c:224
unsigned char write_packet[3]
Definition: xds110.c:206
bool is_swd_mode
Definition: xds110.c:219
uint8_t interface
Definition: xds110.c:212
uint16_t pid
Definition: xds110.c:210
uint16_t vid
Definition: xds110.c:209
uint32_t rdbuff
Definition: xds110.c:223
uint32_t delay_count
Definition: xds110.c:227
uint32_t * txn_dap_results[MAX_DATA_BLOCK/4]
Definition: xds110.c:235
uint16_t hardware
Definition: xds110.c:232
uint8_t endpoint_in
Definition: xds110.c:213
uint32_t voltage
Definition: xds110.c:229
uint8_t endpoint_out
Definition: xds110.c:214
#define SWD_CMD_A32
Definition: swd.h:19
#define SWD_CMD_APNDP
Definition: swd.h:17
#define SWD_CMD_START
Definition: swd.h:16
#define SWD_CMD_RNW
Definition: swd.h:18
#define true
Definition: system.h:59
#define TRANSPORT_SWD
Definition: transport.h:20
#define TRANSPORT_JTAG
Definition: transport.h:19
#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
#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
uint8_t count[4]
Definition: vdebug.c:22
static bool xds_set_srst(uint8_t srst)
Definition: xds110.c:816
#define XDS_JTAG_STATE_UPDATE_IR
Definition: xds110.c:107
#define OCD_FIRMWARE_UPGRADE
Definition: xds110.c:28
#define XDS_OUT_LEN
Definition: xds110.c:142
#define XDS_GOTO_STATE
Definition: xds110.c:152
#define XDS_JTAG_STATE_IDLE
Definition: xds110.c:95
static void xds110_flush(void)
Definition: xds110.c:1526
#define XDS_JTAG_TRANSIT_QUICKEST
Definition: xds110.c:112
static const struct command_registration xds110_subcommand_handlers[]
Definition: xds110.c:2027
#define OCD_DAP_REQUEST
Definition: xds110.c:166
#define DAP_DP_CTRL
Definition: xds110.c:124
COMMAND_HANDLER(xds110_handle_info_command)
Definition: xds110.c:1999
#define XDS110_MAX_SLOW_TCK_SPEED
Definition: xds110.c:78
#define XDS110_MIN_VOLTAGE
Definition: xds110.c:20
static void xds110_set_u16(uint8_t *buffer, uint16_t value)
Definition: xds110.c:273
static int xds110_quit(void)
Definition: xds110.c:1395
static bool cmapi_disconnect(void)
Definition: xds110.c:851
#define XDS_JTAG_STATE_EXIT1_IR
Definition: xds110.c:101
static bool cmapi_connect(uint32_t *idcode)
Definition: xds110.c:832
static bool usb_send_command(uint16_t size)
Definition: xds110.c:583
#define FAST_TCK_DELAY_10000_KHZ
Definition: xds110.c:84
static int xds110_reset(int trst, int srst)
Definition: xds110.c:1619
static bool cmapi_acquire(void)
Definition: xds110.c:863
static void xds110_execute_sleep(struct jtag_command *cmd)
Definition: xds110.c:1663
static bool xds_connect(void)
Definition: xds110.c:658
#define OCD_PATHMOVE
Definition: xds110.c:168
static void xds110_swd_queue_cmd(uint8_t cmd, uint32_t *value)
Definition: xds110.c:1307
static void xds110_queue_runtest(struct jtag_command *cmd)
Definition: xds110.c:1777
#define XDS110_MIN_TCK_SPEED
Definition: xds110.c:77
#define XDS_JTAG_STATE_SELECT_IR
Definition: xds110.c:105
#define CMAPI_REG_READ
Definition: xds110.c:159
static bool ocd_scan_request(uint8_t *scan_requests, uint32_t request_size, uint8_t *scan_results, uint32_t result_size)
Definition: xds110.c:1035
#define SWD_CONNECT
Definition: xds110.c:161
#define MAX_DATA_BLOCK
Definition: xds110.c:48
static void xds110_execute_command(struct jtag_command *cmd)
Definition: xds110.c:1812
static bool usb_connect(void)
Definition: xds110.c:302
#define FAST_TCK_DELAY_5500_KHZ
Definition: xds110.c:87
#define XDS110_STAND_ALONE_ID
Definition: xds110.c:24
static int xds110_swd_init(void)
Definition: xds110.c:1088
static bool xds_version(uint32_t *firmware_id, uint16_t *hardware_id)
Definition: xds110.c:682
#define XDS_JTAG_STATE_EXIT1_DR
Definition: xds110.c:100
#define XDS110_DEFAULT_TCK_SPEED
Definition: xds110.c:80
#define SC_ERR_NONE
Definition: xds110.c:68
static bool ocd_pathmove(uint32_t num_states, uint8_t *path)
Definition: xds110.c:1060
static const struct command_registration xds110_command_handlers[]
Definition: xds110.c:2045
#define FAST_TCK_DELAY_8500_KHZ
Definition: xds110.c:86
static void xds110_show_info(void)
Definition: xds110.c:1367
#define OCD_FIRMWARE_VERSION
Definition: xds110.c:27
static const uint32_t xds_jtag_state[]
Definition: xds110.c:176
#define XDS_CYCLE_TCK
Definition: xds110.c:151
#define XDS_JTAG_STATE_CAPTURE_IR
Definition: xds110.c:109
#define DAP_DP
Definition: xds110.c:119
static bool xds_execute(uint32_t out_length, uint32_t in_length, uint32_t attempts, uint32_t timeout)
Definition: xds110.c:609
#define XDS_VERSION
Definition: xds110.c:148
static bool swd_disconnect(void)
Definition: xds110.c:952
#define CMAPI_DISCONNECT
Definition: xds110.c:156
#define XDS110_MAX_FAST_TCK_SPEED
Definition: xds110.c:79
static bool swd_connect(void)
Definition: xds110.c:940
static bool xds_jtag_scan(uint32_t shift_state, uint16_t shift_bits, uint32_t end_state, uint8_t *data_out, uint8_t *data_in)
Definition: xds110.c:770
static bool ocd_dap_request(uint8_t *dap_requests, uint32_t request_size, uint32_t *dap_results, uint32_t result_count)
Definition: xds110.c:1010
#define XDS_JTAG_STATE_PAUSE_IR
Definition: xds110.c:99
static void xds110_execute_tlr_reset(struct jtag_command *cmd)
Definition: xds110.c:1668
static int xds110_init(void)
Definition: xds110.c:1423
#define XDS_JTAG_STATE_EXIT2_DR
Definition: xds110.c:102
#define CMD_STABLECLOCKS
Definition: xds110.c:173
static bool usb_get_response(uint32_t *total_bytes_read, uint32_t timeout)
Definition: xds110.c:501
#define MAX_RESULT_QUEUE
Definition: xds110.c:54
#define OCD_SCAN_REQUEST
Definition: xds110.c:167
static struct jtag_interface xds110_interface
Definition: xds110.c:2064
#define XDS_SET_TRST
Definition: xds110.c:150
#define DAP_DP_RDBUFF
Definition: xds110.c:128
#define XDS_JTAG_STATE_CAPTURE_DR
Definition: xds110.c:108
static void usb_disconnect(void)
Definition: xds110.c:441
#define DEFAULT_ATTEMPTS
Definition: xds110.c:64
#define XDS_JTAG_STATE_SELECT_DR
Definition: xds110.c:104
#define FAST_TCK_DELAY_12000_KHZ
Definition: xds110.c:85
#define XDS_JTAG_SCAN
Definition: xds110.c:153
static bool xds110_legacy_read_reg(uint8_t cmd, uint32_t *value)
Definition: xds110.c:1143
struct adapter_driver xds110_adapter_driver
Definition: xds110.c:2068
static void xds110_legacy_scan(uint32_t shift_state, uint32_t total_bits, uint32_t end_state, uint8_t *data_out, uint8_t *data_in)
Definition: xds110.c:1508
static void xds110_legacy_stableclocks(uint32_t clocks)
Definition: xds110.c:1521
#define USB_PAYLOAD_SIZE
Definition: xds110.c:52
static int xds110_speed(int speed)
Definition: xds110.c:1858
static int xds110_execute_queue(struct jtag_command *cmd_queue)
Definition: xds110.c:1844
#define XDS_JTAG_STATE_UPDATE_DR
Definition: xds110.c:106
#define XDS_DISCONNECT
Definition: xds110.c:147
static int xds110_speed_div(int speed, int *khz)
Definition: xds110.c:1987
static struct xds110_info xds110
Definition: xds110.c:242
static bool xds_disconnect(void)
Definition: xds110.c:670
static void xds110_execute_pathmove(struct jtag_command *cmd)
Definition: xds110.c:1673
#define CMD_IR_SCAN
Definition: xds110.c:170
#define XDS_SET_SUPPLY
Definition: xds110.c:165
#define XDS_SET_SRST
Definition: xds110.c:154
#define CMAPI_ACQUIRE
Definition: xds110.c:157
static void xds110_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
Definition: xds110.c:1354
#define SWD_DISCONNECT
Definition: xds110.c:162
static void xds110_set_u32(uint8_t *buffer, uint32_t value)
Definition: xds110.c:265
static bool xds110_legacy_write_reg(uint8_t cmd, uint32_t value)
Definition: xds110.c:1205
#define XDS_CONNECT
Definition: xds110.c:146
static bool xds_cycle_tck(uint32_t count)
Definition: xds110.c:736
#define DEFAULT_TIMEOUT
Definition: xds110.c:65
static void xds110_queue_stableclocks(struct jtag_command *cmd)
Definition: xds110.c:1796
#define CMD_RUNTEST
Definition: xds110.c:172
#define CJTAG_DISCONNECT
Definition: xds110.c:164
#define XDS_JTAG_STATE_RESET
Definition: xds110.c:94
#define XDS_JTAG_STATE_PAUSE_DR
Definition: xds110.c:98
static int xds110_swd_run_queue(void)
Definition: xds110.c:1252
static uint16_t xds110_get_u16(uint8_t *buffer)
Definition: xds110.c:288
static bool usb_write(unsigned char *buffer, int size, int *written)
Definition: xds110.c:475
static bool cjtag_connect(uint32_t format)
Definition: xds110.c:964
#define XDS_SET_TCK
Definition: xds110.c:149
static uint32_t xds110_get_u32(uint8_t *buffer)
Definition: xds110.c:279
#define MAX_PACKET
Definition: xds110.c:42
static bool usb_read(unsigned char *buffer, int size, int *bytes_read, int timeout)
Definition: xds110.c:457
static void xds110_legacy_runtest(uint32_t clocks, uint32_t end_state)
Definition: xds110.c:1514
#define XDS_JTAG_STATE_SHIFT_IR
Definition: xds110.c:97
static bool xds_set_trst(uint8_t trst)
Definition: xds110.c:720
static void xds110_queue_scan(struct jtag_command *cmd)
Definition: xds110.c:1707
static void xds110_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
Definition: xds110.c:1348
static bool cmapi_release(void)
Definition: xds110.c:875
#define DAP_AP
Definition: xds110.c:118
static int xds110_swd_switch_seq(enum swd_special_seq seq)
Definition: xds110.c:1094
static bool cmapi_read_dap_reg(uint32_t type, uint32_t ap_num, uint32_t address, uint32_t *value)
Definition: xds110.c:887
#define CJTAG_CONNECT
Definition: xds110.c:163
static const struct swd_driver xds110_swd_driver
Definition: xds110.c:2056
static bool xds_set_supply(uint32_t voltage)
Definition: xds110.c:992
#define CMAPI_REG_WRITE
Definition: xds110.c:160
#define XDS_IN_LEN
Definition: xds110.c:143
static bool xds_set_tck_delay(uint32_t delay)
Definition: xds110.c:704
#define XDS_JTAG_STATE_SHIFT_DR
Definition: xds110.c:96
#define SC_ERR_XDS110_FAIL
Definition: xds110.c:69
#define FAST_TCK_PLUS_FIRMWARE_VERSION
Definition: xds110.c:35
#define DAP_DP_SELECT
Definition: xds110.c:127
#define MODE_JTAG
Definition: xds110.c:91
static int xds110_khz(int khz, int *jtag_speed)
Definition: xds110.c:1993
#define CMD_DR_SCAN
Definition: xds110.c:171
#define XDS_JTAG_STATE_EXIT2_IR
Definition: xds110.c:103
static bool xds_goto_state(uint32_t state)
Definition: xds110.c:752
#define CMAPI_CONNECT
Definition: xds110.c:155
#define XDS110_MAX_VOLTAGE
Definition: xds110.c:21
static bool cmapi_write_dap_reg(uint32_t type, uint32_t ap_num, uint32_t address, uint32_t *value)
Definition: xds110.c:914
static bool cjtag_disconnect(void)
Definition: xds110.c:980
#define FAST_TCK_FIRMWARE_VERSION
Definition: xds110.c:32
#define CMAPI_RELEASE
Definition: xds110.c:158
#define DAP_AP_DRW
Definition: xds110.c:132