OpenOCD
eud.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
6 
7 #include <assert.h>
8 #include <inttypes.h>
9 #include <stdint.h>
10 
11 #include <helper/binarybuffer.h>
12 #include <helper/bits.h>
13 #include <helper/bitfield.h>
14 #include <helper/log.h>
15 #include <jtag/adapter.h>
16 #include <jtag/interface.h>
17 #include <jtag/swd.h>
18 #include <libusb.h>
19 #include <target/arm_adi_v5.h>
20 
21 #include "libusb_helper.h"
22 
23 #define EUD_VID 0x05c6
24 #define EUD_CTL_PID 0x9501
25 #define EUD_SWD_PID 0x9504
26 #define EUD_INTERFACE 0
27 #define EUD_EP_OUT 0x02
28 #define EUD_EP_IN 0x81
29 #define EUD_USB_TIMEOUT_MS 6000
30 /*
31  * The SWD function exposes 32-byte hardware FIFOs in both directions.
32  * The hardware processes commands in order until any of the following:
33  * a) it encounters an undefined opcode
34  * b) cur_cmd == EUD_NOP/FLUSH, after which it ignores the rest of the buffer
35  * c) until it processes everything
36  */
37 #define EUD_SWD_BUFFER_SIZE 32
38 /*
39  * Every queue flush ends with a STATUS opcode; budget for a FLUSH opcode
40  * too, even though eud_swd_flush_queue() omits it when the IN FIFO ends up
41  * exactly full.
42  */
43 #define EUD_SWD_QUEUE_TRAILER_SIZE 2
44 #define EUD_SWD_STATUS_SIZE 4
45 
46 #define EUD_CTL_CMD_CTLOUT_SET 7
47 #define EUD_CTL_CMD_CTLOUT_CLR 8
48 
49 #define EUD_CTL_RCTLR_SRST_N BIT(0)
50 #define EUD_CTL_SWD_PERIPH_EN BIT(2)
51 #define EUD_CTL_JTAG_PERIPH_EN BIT(4)
52 #define EUD_CTL_VDDMIN_TCK_EN BIT(6)
53 #define EUD_CTL_GPIO_JTAG_SEL BIT(7)
54 #define EUD_CTL_DAP_MUX_SEL BIT(10)
55 #define EUD_CTL_ACC_TDO_SEL BIT(17)
56 #define EUD_CTL_DAP_TDO_SEL BIT(18)
57 #define EUD_CTL_MTAP_TDO_SEL BIT(19)
58 #define EUD_CTL_DAP_SWDO_SEL BIT(20)
59 
60 #define EUD_CTL_SWD_ON_CLEAR (EUD_CTL_JTAG_PERIPH_EN | \
61  EUD_CTL_GPIO_JTAG_SEL | \
62  EUD_CTL_ACC_TDO_SEL | \
63  EUD_CTL_DAP_TDO_SEL | \
64  EUD_CTL_MTAP_TDO_SEL)
65 #define EUD_CTL_SWD_ON_SET (EUD_CTL_RCTLR_SRST_N | \
66  EUD_CTL_SWD_PERIPH_EN | \
67  EUD_CTL_VDDMIN_TCK_EN | \
68  EUD_CTL_DAP_MUX_SEL | \
69  EUD_CTL_DAP_SWDO_SEL)
70 #define EUD_SWD_BB_RCTLR_SRST_N BIT(2)
71 #define EUD_SWD_BB_GPIO_SRST_N BIT(4)
72 #define EUD_SWD_BB_GPIO_TRST_N BIT(5)
73 #define EUD_SWD_BB_DAP_TRST_N BIT(6)
74 #define EUD_SWD_BB_RESET_DEFAULT (EUD_SWD_BB_RCTLR_SRST_N | \
75  EUD_SWD_BB_GPIO_SRST_N | \
76  EUD_SWD_BB_GPIO_TRST_N | \
77  EUD_SWD_BB_DAP_TRST_N)
78 
79 #define EUD_SWD_CMD_FLUSH 1
80 #define EUD_SWD_CMD_FREQ 2
81 #define EUD_SWD_CMD_DELAY 3
82  // Delay between commands = (N+1) / swd_clk_freq
83 #define SWD_CMD_DELAY_TIME GENMASK(7, 0)
84 #define SWD_CMD_DELAY_RESERVED GENMASK(31, 8)
85 #define EUD_SWD_CMD_BITBANG 4
86 #define EUD_SWD_CMD_DITMS 5
87 #define SWD_CMD_DITMS_DATA GENMASK(15, 0)
88 #define SWD_CMD_DITMS_DATA_BITS 16
89 #define SWD_CMD_DITMS_COUNT GENMASK(31, 16)
90 #define EUD_SWD_DITMS_MAX_BITS (FIELD_GET(SWD_CMD_DITMS_COUNT, SWD_CMD_DITMS_COUNT) + 1)
91 #define EUD_SWD_CMD_TIMING 6
92  // The number of retries the SWD Peripheral performs due to a WAIT response
93  // from the DAP
94 #define SWD_CMD_TIMING_RETRY_COUNT GENMASK(15, 0)
95  // The number of SWD clock cycles allowed for the turn-around time minus 1
96 #define SWD_CMD_TIMING_TURNAROUND_TIME GENMASK(17, 16)
97  // If retry_count == 0 and SWD R/W is delayed by ACK.WAIT, wait 35 cycles
98  // before issuing another SWD R/W
99 #define SWD_CMD_TIMING_WAIT_35_IF_ERR BIT(18)
100 #define SWD_CMD_TIMING_RESERVED GENMASK(31, 19)
101 #define EUD_SWD_CMD_STATUS 7
102  // Reading the status clears cmd_cntr and the error flags, so every queue
103  // flush needs a status of its own
104  // The ack[2:0] the DAP returned for the last command processed
105 #define SWD_CMD_STATUS_ACK GENMASK(2, 0)
106  // Set once the SWD Peripheral has exhausted its ACK.WAIT retries
107 #define SWD_CMD_STATUS_WAIT_TIMEOUT BIT(3)
108  // Set when a DAP response does not match the parity bit it came with
109 #define SWD_CMD_STATUS_PARITY_ERR BIT(4)
110  // The number of SWD R/W commands the peripheral got through. An error flag
111  // stops it on the offending command, but an ack that is merely not OK does
112  // not, so it bounds a failure rather than pinpointing it
113 #define SWD_CMD_STATUS_CMD_CNTR GENMASK(31, 16)
114 #define EUD_SWD_CMD_PERIPH_RST 8
115 
116 struct eud_device {
117  libusb_device_handle *handle;
118  uint16_t pid;
119  bool claimed;
120 };
121 
123  uint8_t cmd;
124  uint32_t value;
125  uint32_t *read_value;
126  uint32_t ap_delay_clk;
127 };
128 
129 static libusb_context *eud_libusb_ctx;
130 static struct eud_device eud_ctl;
131 static struct eud_device eud_swd;
132 /*
133  * Every transfer costs at least one OUT byte, so a queue can never hold more
134  * transfers than the FIFO is bytes wide.
135  */
137 static unsigned int eud_queue_len;
138 static unsigned int eud_queue_out_len;
139 static unsigned int eud_queue_in_len;
140 static int eud_speed_index = 0xa;
141 
142 static const unsigned int eud_speed_khz[] = {
143  120000,
144  80000,
145  60000,
146  40000,
147  30000,
148  15000,
149  7500,
150  3750,
151  1875,
152  938,
153  469,
154  234,
155  117,
156 };
157 
158 static void eud_close(struct eud_device *dev)
159 {
160  if (!dev->handle)
161  return;
162 
163  if (dev->claimed)
164  libusb_release_interface(dev->handle, EUD_INTERFACE);
165 
166  libusb_close(dev->handle);
167  dev->handle = NULL;
168  dev->pid = 0;
169  dev->claimed = false;
170 }
171 
172 static int eud_libusb_reinit(void)
173 {
174  if (eud_libusb_ctx)
175  libusb_exit(eud_libusb_ctx);
176 
177  int ret = libusb_init(&eud_libusb_ctx);
178  if (ret != LIBUSB_SUCCESS) {
179  LOG_ERROR("libusb_init() failed: %s", libusb_error_name(ret));
180  return ERROR_FAIL;
181  }
182 
183  return ERROR_OK;
184 }
185 
186 static int eud_open_inner(uint16_t pid, struct eud_device *dev, bool quiet)
187 {
188  dev->handle = libusb_open_device_with_vid_pid(eud_libusb_ctx, EUD_VID, pid);
189  if (!dev->handle) {
190  if (!quiet)
191  LOG_ERROR("unable to open EUD USB function %04x:%04x", EUD_VID, pid);
192  return ERROR_FAIL;
193  }
194 
195  int ret = libusb_claim_interface(dev->handle, EUD_INTERFACE);
196  if (ret != LIBUSB_SUCCESS) {
197  if (!quiet)
198  LOG_ERROR("libusb_claim_interface() failed: %s", libusb_error_name(ret));
199  eud_close(dev);
200  return jtag_libusb_error(ret);
201  }
202 
203  dev->pid = pid;
204  dev->claimed = true;
205  return ERROR_OK;
206 }
207 
208 static int eud_open(uint16_t pid, struct eud_device *dev)
209 {
210  return eud_open_inner(pid, dev, false);
211 }
212 
213 static int eud_bulk_write(struct eud_device *dev, const uint8_t *buf, int len)
214 {
215  LOG_DEBUG_IO("EUD pid 0x%04x write len %d opcode 0x%02x", dev->pid, len, buf[0]);
216  int transferred;
217  int ret = libusb_bulk_transfer(dev->handle, EUD_EP_OUT, (unsigned char *)buf,
218  len, &transferred, EUD_USB_TIMEOUT_MS);
219  if (ret != LIBUSB_SUCCESS) {
220  LOG_ERROR("EUD bulk write failed: %s", libusb_error_name(ret));
221  return jtag_libusb_error(ret);
222  }
223 
224  if (transferred != len) {
225  LOG_ERROR("short EUD bulk write: %d of %d bytes", transferred, len);
226  return ERROR_FAIL;
227  }
228 
229  return ERROR_OK;
230 }
231 
232 static int eud_bulk_read(struct eud_device *dev, uint8_t *buf, int len)
233 {
234  int transferred;
235  int ret = libusb_bulk_transfer(dev->handle, EUD_EP_IN, buf, len,
236  &transferred, EUD_USB_TIMEOUT_MS);
237  if (ret != LIBUSB_SUCCESS) {
238  LOG_ERROR("EUD bulk read failed: %s", libusb_error_name(ret));
239  return jtag_libusb_error(ret);
240  }
241 
242  if (transferred != len) {
243  LOG_ERROR("short EUD bulk read: %d of %d bytes", transferred, len);
244  return ERROR_FAIL;
245  }
246 
247  return ERROR_OK;
248 }
249 
250 static int eud_op(struct eud_device *dev, uint8_t opcode, uint32_t payload)
251 {
252  uint8_t buf[5];
253 
254  buf[0] = opcode;
255  h_u32_to_le(&buf[1], payload);
256 
257  return eud_bulk_write(dev, buf, sizeof(buf));
258 }
259 
260 static int eud_op_no_payload(struct eud_device *dev, uint8_t opcode)
261 {
262  return eud_bulk_write(dev, &opcode, sizeof(opcode));
263 }
264 
265 static int eud_ctl_enable_swd(void)
266 {
267  int retval = eud_open(EUD_CTL_PID, &eud_ctl);
268  if (retval != ERROR_OK)
269  return retval;
270 
272  if (retval != ERROR_OK)
273  goto out;
274 
276 
277 out:
278  eud_close(&eud_ctl);
279  return retval;
280 }
281 
283 {
284  int retval = eud_ctl_enable_swd();
285  if (retval != ERROR_OK)
286  return retval;
287 
288  for (unsigned int i = 0; i < 5000; i++) {
289  alive_sleep(1);
290 
291  retval = eud_libusb_reinit();
292  if (retval != ERROR_OK)
293  return retval;
294 
295  retval = eud_open_inner(EUD_SWD_PID, &eud_swd, true);
296  if (retval == ERROR_OK)
297  return ERROR_OK;
298  }
299 
300  LOG_ERROR("unable to open EUD USB function %04x:%04x", EUD_VID, EUD_SWD_PID);
301  return ERROR_FAIL;
302 }
303 
304 static int eud_reopen_swd(void)
305 {
306  eud_close(&eud_swd);
307  return eud_open_swd_after_enable();
308 }
309 
310 static int eud_swd_set_speed_index(int speed_index)
311 {
312  if (speed_index < 0 || speed_index >= (int)ARRAY_SIZE(eud_speed_khz)) {
313  LOG_ERROR("EUD speed index %d is out of range", speed_index);
314  return ERROR_FAIL;
315  }
316 
317  int retval = eud_op(&eud_swd, EUD_SWD_CMD_FREQ, speed_index);
318  if (retval != ERROR_OK)
319  return retval;
320 
321  eud_speed_index = speed_index;
322  return ERROR_OK;
323 }
324 
325 static int eud_swd_init_defaults(void)
326 {
328  if (retval != ERROR_OK)
329  return retval;
330 
332  if (retval != ERROR_OK)
333  return retval;
334 
335  retval = eud_op(&eud_swd, EUD_SWD_CMD_DELAY,
337  if (retval != ERROR_OK)
338  return retval;
339 
342 }
343 
344 static int eud_swd_bitbang(uint32_t payload)
345 {
346  uint8_t out[6];
347  uint8_t in[4];
348 
349  out[0] = EUD_SWD_CMD_BITBANG;
350  h_u32_to_le(&out[1], payload);
351  out[5] = EUD_SWD_CMD_FLUSH;
352 
353  int retval = eud_bulk_write(&eud_swd, out, sizeof(out));
354  if (retval != ERROR_OK)
355  return retval;
356 
357  return eud_bulk_read(&eud_swd, in, sizeof(in));
358 }
359 
360 static int eud_ditms_u16(uint16_t tms, uint16_t count)
361 {
362  int retval = eud_op(&eud_swd, EUD_SWD_CMD_DITMS,
365  if (retval == ERROR_OK)
366  alive_sleep(1);
367  return retval;
368 }
369 
370 static int eud_swd_prepare(void)
371 {
372  return eud_swd_init_defaults();
373 }
374 
375 static int eud_ditms_sequence(const uint8_t *seq, unsigned int bit_len)
376 {
377  int retval = ERROR_OK;
378  unsigned int bit_pos = 0;
379 
380  // EUD can issue (N + 1) bits with a single CMD_DITMS
381  // However, for N > 15 (i.e. 'send more than 16 bits') it repeats the payload[15]
382  // value (N - 16) times
383  while (bit_pos < bit_len) {
384  unsigned int cmd_len = bit_len - bit_pos;
385  if (cmd_len > SWD_CMD_DITMS_DATA_BITS) {
386  bool repeated_bit = buf_get_u32(seq, bit_pos + SWD_CMD_DITMS_DATA_BITS - 1, 1);
387 
388  cmd_len = SWD_CMD_DITMS_DATA_BITS;
389  while (cmd_len < EUD_SWD_DITMS_MAX_BITS && bit_pos + cmd_len < bit_len) {
390  if (buf_get_u32(seq, bit_pos + cmd_len, 1) != repeated_bit)
391  break;
392 
393  cmd_len++;
394  }
395  }
396 
397  unsigned int payload_bits = MIN(cmd_len, SWD_CMD_DITMS_DATA_BITS);
398  uint16_t tms = buf_get_u32(seq, bit_pos, payload_bits);
399 
400  retval = eud_ditms_u16(tms, cmd_len - 1);
401  if (retval != ERROR_OK)
402  break;
403 
404  bit_pos += cmd_len;
405  }
406 
407  return retval;
408 }
409 
411 {
412  switch (seq) {
413  case LINE_RESET:
414  LOG_DEBUG("SWD line reset");
416  case JTAG_TO_SWD:
417  LOG_DEBUG("JTAG-to-SWD");
419  case JTAG_TO_DORMANT:
420  LOG_DEBUG("JTAG-to-DORMANT");
422  case SWD_TO_JTAG:
423  LOG_DEBUG("SWD-to-JTAG ignored");
424  return ERROR_OK;
425  case SWD_TO_DORMANT:
426  LOG_DEBUG("SWD-to-DORMANT");
428  case DORMANT_TO_SWD:
429  LOG_DEBUG("DORMANT-to-SWD");
431  case DORMANT_TO_JTAG:
432  LOG_DEBUG("DORMANT-to-JTAG");
434  default:
435  LOG_ERROR("Sequence %d not supported", seq);
436  return ERROR_FAIL;
437  }
438 }
439 
440 static int eud_swd_init(void)
441 {
442  if (!eud_swd.handle)
443  return ERROR_OK;
444 
445  int retval = eud_swd_prepare();
446  if (retval == ERROR_OK)
447  return ERROR_OK;
448 
449  retval = eud_reopen_swd();
450  if (retval != ERROR_OK)
451  return retval;
452 
453  return eud_swd_prepare();
454 }
455 
456 static int eud_swd_flush_queue(void);
457 
458 static unsigned int eud_swd_transfer_out_size(const struct eud_swd_transfer *transfer)
459 {
460  unsigned int size = transfer->cmd & SWD_CMD_RNW ? 1 : 5;
461 
462  if (transfer->ap_delay_clk)
463  size += 5;
464 
465  return size;
466 }
467 
468 static unsigned int eud_swd_transfer_in_size(const struct eud_swd_transfer *transfer)
469 {
470  return transfer->cmd & SWD_CMD_RNW ? 4 : 0;
471 }
472 
473 static int eud_swd_queue_transfer(uint8_t cmd, uint32_t value,
474  uint32_t *read_value, uint32_t ap_delay_clk)
475 {
477  LOG_ERROR("EUD SWD AP delay of %" PRIu32 " clocks is too large", ap_delay_clk);
478  return ERROR_FAIL;
479  }
480 
481  struct eud_swd_transfer transfer = {
482  .cmd = cmd,
483  .value = value,
484  .read_value = read_value,
485  .ap_delay_clk = ap_delay_clk,
486  };
487  unsigned int transfer_out = eud_swd_transfer_out_size(&transfer);
488  unsigned int transfer_in = eud_swd_transfer_in_size(&transfer);
489  bool returns_ack = swd_cmd_returns_ack(cmd);
490 
491  /*
492  * Run whatever is already queued if this transfer would not fit in
493  * the hardware FIFOs alongside it, or if it is unacknowledged: a
494  * DP_TARGETSEL write is answered with silence, so it must be the
495  * only transfer in the queue, see eud_swd_flush_queue().
496  */
497  if (eud_queue_len &&
498  (!returns_ack ||
501  int retval = eud_swd_flush_queue();
502  if (retval != ERROR_OK)
503  return retval;
504  }
505 
506  eud_queue[eud_queue_len++] = transfer;
507  eud_queue_out_len += transfer_out;
508  eud_queue_in_len += transfer_in;
509 
510  if (!returns_ack)
511  return eud_swd_flush_queue();
512 
513  return ERROR_OK;
514 }
515 
516 static int eud_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
517 {
518  assert(cmd & SWD_CMD_RNW);
520 }
521 
522 static int eud_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
523 {
524  assert(!(cmd & SWD_CMD_RNW));
526 }
527 
528 static int eud_swd_flush_queue(void)
529 {
530  uint8_t out[EUD_SWD_BUFFER_SIZE];
531  uint8_t in[EUD_SWD_BUFFER_SIZE];
532  unsigned int out_len = 0;
533  unsigned int in_len = 0;
534  unsigned int count = eud_queue_len;
535 
536  for (unsigned int i = 0; i < count; i++) {
537  const struct eud_swd_transfer *transfer = &eud_queue[i];
538  uint8_t eud_cmd = (transfer->cmd | SWD_CMD_START | SWD_CMD_PARK) & ~SWD_CMD_STOP;
539 
540  LOG_DEBUG_IO("%s %s reg %x %" PRIx32,
541  transfer->cmd & SWD_CMD_APNDP ? "AP" : "DP",
542  transfer->cmd & SWD_CMD_RNW ? "read" : "write",
543  (transfer->cmd & SWD_CMD_A32) >> 1,
544  transfer->value);
545 
546  out[out_len++] = eud_cmd;
547  if (transfer->cmd & SWD_CMD_RNW) {
548  in_len += 4;
549  } else {
550  h_u32_to_le(&out[out_len], transfer->value);
551  out_len += 4;
552  }
553 
554  if (transfer->ap_delay_clk) {
555  out[out_len++] = EUD_SWD_CMD_DITMS;
556  h_u32_to_le(&out[out_len],
558  out_len += 4;
559  }
560  }
561 
562  out[out_len++] = EUD_SWD_CMD_STATUS;
563  in_len += EUD_SWD_STATUS_SIZE;
564 
565  /*
566  * The hardware auto-flushes once the IN FIFO is exactly full, so an
567  * explicit FLUSH is only needed when the queue leaves it partially
568  * filled.
569  */
570  if (in_len != EUD_SWD_BUFFER_SIZE)
571  out[out_len++] = EUD_SWD_CMD_FLUSH;
572 
573  assert(out_len <= sizeof(out));
574  assert(in_len <= sizeof(in));
575 
576  LOG_DEBUG_IO("Flushing EUD SWD queue of %u transfers (%u bytes out, %u bytes in)",
577  count, out_len, in_len);
578 
579  int retval = eud_bulk_write(&eud_swd, out, out_len);
580  if (retval != ERROR_OK)
581  goto out;
582 
583  retval = eud_bulk_read(&eud_swd, in, in_len);
584  if (retval != ERROR_OK)
585  goto out;
586 
587  unsigned int in_pos = 0;
588  for (unsigned int i = 0; i < count; i++) {
589  const struct eud_swd_transfer *transfer = &eud_queue[i];
590  if (transfer->cmd & SWD_CMD_RNW) {
591  uint32_t value = le_to_h_u32(&in[in_pos]);
592  in_pos += 4;
593  if (transfer->read_value)
594  *transfer->read_value = value;
595  LOG_DEBUG_IO("read result: %" PRIx32, value);
596  }
597  }
598 
599  uint32_t status = le_to_h_u32(&in[in_pos]);
600 
601  /*
602  * A DP_TARGETSEL write is answered with silence, so whatever the
603  * peripheral sampled during the ack phase is meaningless. Such a
604  * transfer gets a queue of its own precisely so that its status can be
605  * dropped without hiding the transfers around it.
606  */
607  if (!swd_cmd_returns_ack(eud_queue[0].cmd)) {
608  assert(count == 1);
609  retval = ERROR_OK;
610  goto out;
611  }
612 
613  /*
614  * The ack belongs to the last command the peripheral processed and a
615  * sticky DAP error makes every command after the first bad one fail
616  * too, so a failure can only be attributed to the queue, not to a
617  * transfer within it. Report how far the queue got instead.
618  */
619  uint32_t processed = FIELD_GET(SWD_CMD_STATUS_CMD_CNTR, status);
620  uint8_t ack = FIELD_GET(SWD_CMD_STATUS_ACK, status);
621 
623  LOG_ERROR("SWD parity error after %" PRIu32 " of %u transfers (status 0x%08" PRIx32 ")",
624  processed, count, status);
625  retval = ERROR_SWD_FAIL;
626  goto out;
627  }
628 
630  LOG_DEBUG("SWD out of ACK.WAIT retries after %" PRIu32 " of %u transfers (status 0x%08" PRIx32 ")",
631  processed, count, status);
632  retval = ERROR_WAIT;
633  goto out;
634  }
635 
636  if (ack != SWD_ACK_OK) {
637  LOG_DEBUG("SWD ack=%u after %" PRIu32 " of %u transfers (status 0x%08" PRIx32 ")",
638  ack, processed, count, status);
639  retval = swd_ack_to_error_code(ack);
640  goto out;
641  }
642 
643  retval = ERROR_OK;
644 
645 out:
646  eud_queue_len = 0;
647  eud_queue_out_len = 0;
648  eud_queue_in_len = 0;
649  return retval;
650 }
651 
652 static int eud_swd_run_queue(void)
653 {
654  if (!eud_queue_len)
655  return ERROR_OK;
656 
657  return eud_swd_flush_queue();
658 }
659 
660 static int eud_init(void)
661 {
662  eud_queue_len = 0;
663  eud_queue_out_len = 0;
664  eud_queue_in_len = 0;
665 
666  int ret = libusb_init(&eud_libusb_ctx);
667  if (ret != LIBUSB_SUCCESS) {
668  LOG_ERROR("libusb_init() failed: %s", libusb_error_name(ret));
669  return ERROR_FAIL;
670  }
671 
672  int retval = eud_open_inner(EUD_SWD_PID, &eud_swd, true);
673  if (retval != ERROR_OK) {
674  retval = eud_open_swd_after_enable();
675  if (retval != ERROR_OK)
676  goto fail;
677  }
678 
679  retval = eud_swd_prepare();
680  if (retval != ERROR_OK) {
681  retval = eud_reopen_swd();
682  if (retval != ERROR_OK)
683  goto fail;
684 
685  retval = eud_swd_prepare();
686  if (retval != ERROR_OK)
687  goto fail;
688  }
689 
690  return ERROR_OK;
691 
692 fail:
693  eud_close(&eud_swd);
694  eud_close(&eud_ctl);
695  libusb_exit(eud_libusb_ctx);
697  return retval;
698 }
699 
700 static int eud_quit(void)
701 {
702  eud_close(&eud_swd);
703  eud_close(&eud_ctl);
704 
705  if (eud_libusb_ctx) {
706  libusb_exit(eud_libusb_ctx);
708  }
709 
710  return ERROR_OK;
711 }
712 
713 static int eud_reset(int trst, int srst)
714 {
715  uint32_t value = EUD_SWD_BB_RESET_DEFAULT;
716 
717  if (srst)
719  if (trst)
721 
722  return eud_swd_bitbang(value);
723 }
724 
725 static int eud_speed(int speed)
726 {
727  if (speed < 0 || speed >= (int)ARRAY_SIZE(eud_speed_khz)) {
728  LOG_ERROR("EUD speed index %d is out of range", speed);
729  return ERROR_FAIL;
730  }
731 
732  eud_speed_index = speed;
733 
734  if (!eud_swd.handle)
735  return ERROR_OK;
736 
737  return eud_swd_set_speed_index(speed);
738 }
739 
740 static int eud_khz(int khz, int *jtag_speed)
741 {
742  int selected = ARRAY_SIZE(eud_speed_khz) - 1;
743 
744  for (unsigned int i = 0; i < ARRAY_SIZE(eud_speed_khz); i++) {
745  if ((unsigned int)khz >= eud_speed_khz[i]) {
746  selected = i;
747  break;
748  }
749  }
750 
751  *jtag_speed = selected;
752  return ERROR_OK;
753 }
754 
755 static int eud_speed_div(int speed, int *khz)
756 {
757  if (speed < 0 || speed >= (int)ARRAY_SIZE(eud_speed_khz))
758  return ERROR_FAIL;
759 
760  *khz = eud_speed_khz[speed];
761  return ERROR_OK;
762 }
763 
764 static const struct swd_driver eud_swd_driver = {
765  .init = eud_swd_init,
766  .switch_seq = eud_swd_switch_seq,
767  .read_reg = eud_swd_read_reg,
768  .write_reg = eud_swd_write_reg,
769  .run = eud_swd_run_queue,
770 };
771 
773  .name = "eud",
774  .transport_ids = TRANSPORT_SWD,
775  .transport_preferred_id = TRANSPORT_SWD,
776 
777  .init = eud_init,
778  .quit = eud_quit,
779  .reset = eud_reset,
780  .speed = eud_speed,
781  .khz = eud_khz,
782  .speed_div = eud_speed_div,
783 
784  .swd_ops = &eud_swd_driver,
785 };
This defines formats and data structures used to talk to ADIv5 entities.
swd_special_seq
Definition: arm_adi_v5.h:236
@ DORMANT_TO_JTAG
Definition: arm_adi_v5.h:243
@ JTAG_TO_SWD
Definition: arm_adi_v5.h:238
@ DORMANT_TO_SWD
Definition: arm_adi_v5.h:242
@ LINE_RESET
Definition: arm_adi_v5.h:237
@ JTAG_TO_DORMANT
Definition: arm_adi_v5.h:239
@ SWD_TO_DORMANT
Definition: arm_adi_v5.h:241
@ SWD_TO_JTAG
Definition: arm_adi_v5.h:240
#define SWD_ACK_OK
Definition: arm_adi_v5.h:31
Support functions to access arbitrary bits in a byte array.
static uint32_t buf_get_u32(const uint8_t *_buffer, unsigned int first, unsigned int num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 32-bit word.
Definition: binarybuffer.h:104
#define FIELD_GET(_mask, _value)
FIELD_GET(_mask, _value) - Extract a value from a bitfield @_mask: Bitfield mask @_value: Bitfield va...
Definition: bitfield.h:57
#define FIELD_PREP(_mask, _value)
FIELD_PREP(_mask, _value) - Prepare a value for insertion into a bitfield @_mask: Bitfield mask @_val...
Definition: bitfield.h:44
uint32_t size
Size of dw_spi_transaction::buffer.
Definition: dw-spi-helper.h:4
static const struct swd_driver eud_swd_driver
Definition: eud.c:764
static int eud_swd_flush_queue(void)
Definition: eud.c:528
static int eud_swd_init_defaults(void)
Definition: eud.c:325
static unsigned int eud_queue_len
Definition: eud.c:137
static int eud_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
Definition: eud.c:522
#define EUD_CTL_CMD_CTLOUT_CLR
Definition: eud.c:47
#define EUD_SWD_QUEUE_TRAILER_SIZE
Definition: eud.c:43
#define SWD_CMD_STATUS_CMD_CNTR
Definition: eud.c:113
#define SWD_CMD_TIMING_RETRY_COUNT
Definition: eud.c:94
#define EUD_INTERFACE
Definition: eud.c:26
static int eud_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
Definition: eud.c:516
static unsigned int eud_swd_transfer_out_size(const struct eud_swd_transfer *transfer)
Definition: eud.c:458
#define EUD_SWD_CMD_DELAY
Definition: eud.c:81
static int eud_reopen_swd(void)
Definition: eud.c:304
#define EUD_CTL_SWD_ON_CLEAR
Definition: eud.c:60
#define EUD_CTL_CMD_CTLOUT_SET
Definition: eud.c:46
#define SWD_CMD_STATUS_PARITY_ERR
Definition: eud.c:109
#define EUD_SWD_CMD_PERIPH_RST
Definition: eud.c:114
static int eud_open_swd_after_enable(void)
Definition: eud.c:282
static int eud_swd_switch_seq(enum swd_special_seq seq)
Definition: eud.c:410
#define EUD_SWD_PID
Definition: eud.c:25
static int eud_speed_div(int speed, int *khz)
Definition: eud.c:755
static unsigned int eud_queue_out_len
Definition: eud.c:138
#define SWD_CMD_STATUS_WAIT_TIMEOUT
Definition: eud.c:107
static int eud_bulk_read(struct eud_device *dev, uint8_t *buf, int len)
Definition: eud.c:232
#define EUD_SWD_CMD_STATUS
Definition: eud.c:101
static int eud_libusb_reinit(void)
Definition: eud.c:172
static int eud_ctl_enable_swd(void)
Definition: eud.c:265
static const unsigned int eud_speed_khz[]
Definition: eud.c:142
static unsigned int eud_swd_transfer_in_size(const struct eud_swd_transfer *transfer)
Definition: eud.c:468
static unsigned int eud_queue_in_len
Definition: eud.c:139
static int eud_open_inner(uint16_t pid, struct eud_device *dev, bool quiet)
Definition: eud.c:186
#define SWD_CMD_DITMS_DATA
Definition: eud.c:87
#define EUD_SWD_BUFFER_SIZE
Definition: eud.c:37
#define EUD_SWD_CMD_FREQ
Definition: eud.c:80
#define EUD_EP_IN
Definition: eud.c:28
#define SWD_CMD_DITMS_DATA_BITS
Definition: eud.c:88
#define SWD_CMD_DELAY_TIME
Definition: eud.c:83
static int eud_ditms_u16(uint16_t tms, uint16_t count)
Definition: eud.c:360
#define SWD_CMD_STATUS_ACK
Definition: eud.c:105
#define EUD_SWD_BB_GPIO_SRST_N
Definition: eud.c:71
#define EUD_CTL_PID
Definition: eud.c:24
static struct eud_device eud_ctl
Definition: eud.c:130
static int eud_swd_set_speed_index(int speed_index)
Definition: eud.c:310
#define EUD_USB_TIMEOUT_MS
Definition: eud.c:29
static int eud_open(uint16_t pid, struct eud_device *dev)
Definition: eud.c:208
static struct eud_device eud_swd
Definition: eud.c:131
static int eud_khz(int khz, int *jtag_speed)
Definition: eud.c:740
#define SWD_CMD_DITMS_COUNT
Definition: eud.c:89
static int eud_swd_bitbang(uint32_t payload)
Definition: eud.c:344
static int eud_swd_init(void)
Definition: eud.c:440
#define EUD_EP_OUT
Definition: eud.c:27
static int eud_reset(int trst, int srst)
Definition: eud.c:713
#define EUD_SWD_CMD_BITBANG
Definition: eud.c:85
#define EUD_SWD_CMD_DITMS
Definition: eud.c:86
#define EUD_SWD_BB_RCTLR_SRST_N
Definition: eud.c:70
static libusb_context * eud_libusb_ctx
Definition: eud.c:129
static struct eud_swd_transfer eud_queue[EUD_SWD_BUFFER_SIZE]
Definition: eud.c:136
static int eud_ditms_sequence(const uint8_t *seq, unsigned int bit_len)
Definition: eud.c:375
static int eud_speed_index
Definition: eud.c:140
static int eud_op_no_payload(struct eud_device *dev, uint8_t opcode)
Definition: eud.c:260
#define EUD_SWD_BB_DAP_TRST_N
Definition: eud.c:73
#define EUD_SWD_STATUS_SIZE
Definition: eud.c:44
static int eud_swd_queue_transfer(uint8_t cmd, uint32_t value, uint32_t *read_value, uint32_t ap_delay_clk)
Definition: eud.c:473
#define EUD_SWD_CMD_FLUSH
Definition: eud.c:79
static int eud_op(struct eud_device *dev, uint8_t opcode, uint32_t payload)
Definition: eud.c:250
struct adapter_driver eud_adapter_driver
Definition: eud.c:772
#define EUD_VID
Definition: eud.c:23
static int eud_quit(void)
Definition: eud.c:700
static int eud_bulk_write(struct eud_device *dev, const uint8_t *buf, int len)
Definition: eud.c:213
static int eud_swd_prepare(void)
Definition: eud.c:370
#define EUD_CTL_SWD_ON_SET
Definition: eud.c:65
static void eud_close(struct eud_device *dev)
Definition: eud.c:158
static int eud_swd_run_queue(void)
Definition: eud.c:652
#define EUD_SWD_CMD_TIMING
Definition: eud.c:91
static int eud_init(void)
Definition: eud.c:660
#define EUD_SWD_DITMS_MAX_BITS
Definition: eud.c:90
static int eud_speed(int speed)
Definition: eud.c:725
#define EUD_SWD_BB_RESET_DEFAULT
Definition: eud.c:74
int jtag_libusb_error(int err)
Definition: libusb_helper.c:28
void alive_sleep(uint64_t ms)
Definition: log.c:478
#define ERROR_WAIT
Definition: log.h:189
#define LOG_DEBUG_IO(expr ...)
Definition: log.h:116
#define ERROR_FAIL
Definition: log.h:188
#define LOG_ERROR(expr ...)
Definition: log.h:147
#define LOG_DEBUG(expr ...)
Definition: log.h:124
#define ERROR_OK
Definition: log.h:182
#define MIN(a, b)
Definition: replacements.h:22
Represents a driver for a debugging interface.
Definition: interface.h:214
const char *const name
The name of the interface driver.
Definition: interface.h:216
libusb_device_handle * handle
Definition: eud.c:117
uint16_t pid
Definition: eud.c:118
bool claimed
Definition: eud.c:119
uint32_t value
Definition: eud.c:124
uint32_t * read_value
Definition: eud.c:125
uint8_t cmd
Definition: eud.c:123
uint32_t ap_delay_clk
Definition: eud.c:126
int(* init)(void)
Initialize the debug link so it can perform SWD operations.
Definition: swd.h:255
static const unsigned int swd_seq_dormant_to_swd_len
Definition: swd.h:190
static const uint8_t swd_seq_dormant_to_jtag[]
Dormant-to-JTAG sequence.
Definition: swd.h:230
#define SWD_CMD_A32
Definition: swd.h:19
static const uint8_t swd_seq_dormant_to_swd[]
Dormant-to-SWD sequence.
Definition: swd.h:171
static const uint8_t swd_seq_jtag_to_dormant[]
JTAG-to-dormant sequence.
Definition: swd.h:199
static bool swd_cmd_returns_ack(uint8_t cmd)
Test if we can rely on ACK returned by SWD command.
Definition: swd.h:58
#define SWD_CMD_PARK
Definition: swd.h:22
static int swd_ack_to_error_code(uint8_t ack)
Convert SWD ACK value returned from DP to OpenOCD error code.
Definition: swd.h:72
static const unsigned int swd_seq_jtag_to_swd_len
Definition: swd.h:125
#define ERROR_SWD_FAIL
Definition: swd.h:28
static const unsigned int swd_seq_line_reset_len
Definition: swd.h:104
static const unsigned int swd_seq_dormant_to_jtag_len
Definition: swd.h:244
#define SWD_CMD_APNDP
Definition: swd.h:17
static const unsigned int swd_seq_swd_to_dormant_len
Definition: swd.h:159
#define SWD_CMD_START
Definition: swd.h:16
#define SWD_CMD_RNW
Definition: swd.h:18
static const uint8_t swd_seq_line_reset[]
SWD Line reset.
Definition: swd.h:98
#define SWD_CMD_STOP
Definition: swd.h:21
static const uint8_t swd_seq_jtag_to_swd[]
JTAG-to-SWD sequence.
Definition: swd.h:115
static const unsigned int swd_seq_jtag_to_dormant_len
Definition: swd.h:211
static const uint8_t swd_seq_swd_to_dormant[]
SWD-to-dormant sequence.
Definition: swd.h:153
#define TRANSPORT_SWD
Definition: transport.h:20
static void h_u32_to_le(uint8_t *buf, uint32_t val)
Definition: types.h:178
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.
Definition: types.h:57
static uint32_t le_to_h_u32(const uint8_t *buf)
Definition: types.h:112
#define NULL
Definition: usb.h:16
uint8_t status[4]
Definition: vdebug.c:17
uint8_t cmd
Definition: vdebug.c:1
uint8_t count[4]
Definition: vdebug.c:22