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 #define EUD_SWD_MAX_QUEUED_TRANSFERS 64
31 
32 #define EUD_CTL_CMD_CTLOUT_SET 7
33 #define EUD_CTL_CMD_CTLOUT_CLR 8
34 
35 #define EUD_CTL_RCTLR_SRST_N BIT(0)
36 #define EUD_CTL_GPIO_SRST_N BIT(1)
37 #define EUD_CTL_SWD_PERIPH_EN BIT(2)
38 #define EUD_CTL_DAP_TRST_N BIT(3)
39 #define EUD_CTL_JTAG_PERIPH_EN BIT(4)
40 #define EUD_CTL_VDDMIN_TCK_EN BIT(6)
41 #define EUD_CTL_GPIO_JTAG_SEL BIT(7)
42 #define EUD_CTL_DAP_MUX_SEL BIT(10)
43 #define EUD_CTL_ACC_TDO_SEL BIT(17)
44 #define EUD_CTL_DAP_TDO_SEL BIT(18)
45 #define EUD_CTL_MTAP_TDO_SEL BIT(19)
46 #define EUD_CTL_DAP_SWDO_SEL BIT(20)
47 
48 #define EUD_CTL_SWD_ON_CLEAR (EUD_CTL_JTAG_PERIPH_EN | \
49  EUD_CTL_GPIO_JTAG_SEL | \
50  EUD_CTL_ACC_TDO_SEL | \
51  EUD_CTL_DAP_TDO_SEL | \
52  EUD_CTL_MTAP_TDO_SEL)
53 #define EUD_CTL_SWD_ON_SET (EUD_CTL_RCTLR_SRST_N | \
54  EUD_CTL_SWD_PERIPH_EN | \
55  EUD_CTL_VDDMIN_TCK_EN | \
56  EUD_CTL_DAP_MUX_SEL | \
57  EUD_CTL_DAP_SWDO_SEL)
58 #define EUD_SWD_BB_RCTLR_SRST_N BIT(2)
59 #define EUD_SWD_BB_GPIO_SRST_N BIT(4)
60 #define EUD_SWD_BB_GPIO_TRST_N BIT(5)
61 #define EUD_SWD_BB_DAP_TRST_N BIT(6)
62 #define EUD_SWD_BB_RESET_DEFAULT (EUD_SWD_BB_RCTLR_SRST_N | \
63  EUD_SWD_BB_GPIO_SRST_N | \
64  EUD_SWD_BB_GPIO_TRST_N | \
65  EUD_SWD_BB_DAP_TRST_N)
66 
67 #define EUD_SWD_CMD_FLUSH 1
68 #define EUD_SWD_CMD_FREQ 2
69 #define EUD_SWD_CMD_DELAY 3
70  // Delay between commands = (N+1) / swd_clk_freq
71 #define SWD_CMD_DELAY_TIME GENMASK(7, 0)
72 #define SWD_CMD_DELAY_RESERVED GENMASK(31, 8)
73 #define EUD_SWD_CMD_BITBANG 4
74 #define EUD_SWD_CMD_DITMS 5
75 #define SWD_CMD_DITMS_DATA GENMASK(15, 0)
76 #define SWD_CMD_DITMS_DATA_BITS 16
77 #define SWD_CMD_DITMS_COUNT GENMASK(31, 16)
78 #define EUD_SWD_DITMS_MAX_BITS (FIELD_GET(SWD_CMD_DITMS_COUNT, SWD_CMD_DITMS_COUNT) + 1)
79 #define EUD_SWD_CMD_TIMING 6
80  // The number of retries the SWD Peripheral performs due to a WAIT response
81  // from the DAP
82 #define SWD_CMD_TIMING_RETRY_COUNT GENMASK(15, 0)
83  // The number of SWD clock cycles allowed for the turn-around time minus 1
84 #define SWD_CMD_TIMING_TURNAROUND_TIME GENMASK(17, 16)
85  // If retry_count == 0 and SWD R/W is delayed by ACK.WAIT, wait 35 cycles
86  // before issuing another SWD R/W
87 #define SWD_CMD_TIMING_WAIT_35_IF_ERR BIT(18)
88 #define SWD_CMD_TIMING_RESERVED GENMASK(31, 19)
89 #define EUD_SWD_CMD_STATUS 7
90 #define EUD_SWD_CMD_PERIPH_RST 8
91 
92 struct eud_device {
93  libusb_device_handle *handle;
94  uint16_t pid;
95  bool claimed;
96 };
97 
99  uint8_t cmd;
100  uint32_t value;
101  uint32_t *read_value;
102  uint32_t ap_delay_clk;
103 };
104 
105 static libusb_context *eud_libusb_ctx;
106 static struct eud_device eud_ctl;
107 static struct eud_device eud_swd;
109 static unsigned int eud_queue_len;
111 static int eud_speed_index = 0xa;
112 
113 static const unsigned int eud_speed_khz[] = {
114  120000,
115  80000,
116  60000,
117  40000,
118  30000,
119  15000,
120  7500,
121  3750,
122  1875,
123  938,
124  469,
125  234,
126  117,
127 };
128 
129 static void eud_close(struct eud_device *dev)
130 {
131  if (!dev->handle)
132  return;
133 
134  if (dev->claimed)
135  libusb_release_interface(dev->handle, EUD_INTERFACE);
136 
137  libusb_close(dev->handle);
138  dev->handle = NULL;
139  dev->pid = 0;
140  dev->claimed = false;
141 }
142 
143 static int eud_libusb_reinit(void)
144 {
145  if (eud_libusb_ctx)
146  libusb_exit(eud_libusb_ctx);
147 
148  int ret = libusb_init(&eud_libusb_ctx);
149  if (ret != LIBUSB_SUCCESS) {
150  LOG_ERROR("libusb_init() failed: %s", libusb_error_name(ret));
151  return ERROR_FAIL;
152  }
153 
154  return ERROR_OK;
155 }
156 
157 static int eud_open_inner(uint16_t pid, struct eud_device *dev, bool quiet)
158 {
159  dev->handle = libusb_open_device_with_vid_pid(eud_libusb_ctx, EUD_VID, pid);
160  if (!dev->handle) {
161  if (!quiet)
162  LOG_ERROR("unable to open EUD USB function %04x:%04x", EUD_VID, pid);
163  return ERROR_FAIL;
164  }
165 
166  int ret = libusb_claim_interface(dev->handle, EUD_INTERFACE);
167  if (ret != LIBUSB_SUCCESS) {
168  if (!quiet)
169  LOG_ERROR("libusb_claim_interface() failed: %s", libusb_error_name(ret));
170  eud_close(dev);
171  return jtag_libusb_error(ret);
172  }
173 
174  dev->pid = pid;
175  dev->claimed = true;
176  return ERROR_OK;
177 }
178 
179 static int eud_open(uint16_t pid, struct eud_device *dev)
180 {
181  return eud_open_inner(pid, dev, false);
182 }
183 
184 static int eud_bulk_write(struct eud_device *dev, const uint8_t *buf, int len)
185 {
186  LOG_DEBUG_IO("EUD pid 0x%04x write len %d opcode 0x%02x", dev->pid, len, buf[0]);
187  int transferred;
188  int ret = libusb_bulk_transfer(dev->handle, EUD_EP_OUT, (unsigned char *)buf,
189  len, &transferred, EUD_USB_TIMEOUT_MS);
190  if (ret != LIBUSB_SUCCESS) {
191  LOG_ERROR("EUD bulk write failed: %s", libusb_error_name(ret));
192  return jtag_libusb_error(ret);
193  }
194 
195  if (transferred != len) {
196  LOG_ERROR("short EUD bulk write: %d of %d bytes", transferred, len);
197  return ERROR_FAIL;
198  }
199 
200  return ERROR_OK;
201 }
202 
203 static int eud_bulk_read(struct eud_device *dev, uint8_t *buf, int len)
204 {
205  int transferred;
206  int ret = libusb_bulk_transfer(dev->handle, EUD_EP_IN, buf, len,
207  &transferred, EUD_USB_TIMEOUT_MS);
208  if (ret != LIBUSB_SUCCESS) {
209  LOG_ERROR("EUD bulk read failed: %s", libusb_error_name(ret));
210  return jtag_libusb_error(ret);
211  }
212 
213  if (transferred != len) {
214  LOG_ERROR("short EUD bulk read: %d of %d bytes", transferred, len);
215  return ERROR_FAIL;
216  }
217 
218  return ERROR_OK;
219 }
220 
221 static int eud_op(struct eud_device *dev, uint8_t opcode, uint32_t payload)
222 {
223  uint8_t buf[5];
224 
225  buf[0] = opcode;
226  h_u32_to_le(&buf[1], payload);
227 
228  return eud_bulk_write(dev, buf, sizeof(buf));
229 }
230 
231 static int eud_op_no_payload(struct eud_device *dev, uint8_t opcode)
232 {
233  return eud_bulk_write(dev, &opcode, sizeof(opcode));
234 }
235 
236 static int eud_ctl_enable_swd(void)
237 {
238  int retval = eud_open(EUD_CTL_PID, &eud_ctl);
239  if (retval != ERROR_OK)
240  return retval;
241 
243  if (retval != ERROR_OK)
244  goto out;
245 
247 
248 out:
249  eud_close(&eud_ctl);
250  return retval;
251 }
252 
254 {
255  int retval = eud_ctl_enable_swd();
256  if (retval != ERROR_OK)
257  return retval;
258 
259  for (unsigned int i = 0; i < 5000; i++) {
260  alive_sleep(1);
261 
262  retval = eud_libusb_reinit();
263  if (retval != ERROR_OK)
264  return retval;
265 
266  retval = eud_open_inner(EUD_SWD_PID, &eud_swd, true);
267  if (retval == ERROR_OK)
268  return ERROR_OK;
269  }
270 
271  LOG_ERROR("unable to open EUD USB function %04x:%04x", EUD_VID, EUD_SWD_PID);
272  return ERROR_FAIL;
273 }
274 
275 static int eud_reopen_swd(void)
276 {
277  eud_close(&eud_swd);
278  return eud_open_swd_after_enable();
279 }
280 
281 static int eud_swd_set_speed_index(int speed_index)
282 {
283  if (speed_index < 0 || speed_index >= (int)ARRAY_SIZE(eud_speed_khz)) {
284  LOG_ERROR("EUD speed index %d is out of range", speed_index);
285  return ERROR_FAIL;
286  }
287 
288  int retval = eud_op(&eud_swd, EUD_SWD_CMD_FREQ, speed_index);
289  if (retval != ERROR_OK)
290  return retval;
291 
292  eud_speed_index = speed_index;
293  return ERROR_OK;
294 }
295 
296 static int eud_swd_init_defaults(void)
297 {
299  if (retval != ERROR_OK)
300  return retval;
301 
303  if (retval != ERROR_OK)
304  return retval;
305 
306  retval = eud_op(&eud_swd, EUD_SWD_CMD_DELAY,
308  if (retval != ERROR_OK)
309  return retval;
310 
313 }
314 
315 static int eud_swd_bitbang(uint32_t payload)
316 {
317  uint8_t out[6];
318  uint8_t in[4];
319 
320  out[0] = EUD_SWD_CMD_BITBANG;
321  h_u32_to_le(&out[1], payload);
322  out[5] = EUD_SWD_CMD_FLUSH;
323 
324  int retval = eud_bulk_write(&eud_swd, out, sizeof(out));
325  if (retval != ERROR_OK)
326  return retval;
327 
328  return eud_bulk_read(&eud_swd, in, sizeof(in));
329 }
330 
331 static int eud_ditms_u16(uint16_t tms, uint16_t count)
332 {
333  int retval = eud_op(&eud_swd, EUD_SWD_CMD_DITMS,
336  if (retval == ERROR_OK)
337  alive_sleep(1);
338  return retval;
339 }
340 
341 static int eud_swd_prepare(void)
342 {
343  return eud_swd_init_defaults();
344 }
345 
346 static int eud_ditms_sequence(const uint8_t *seq, unsigned int bit_len)
347 {
348  int retval = ERROR_OK;
349  unsigned int bit_pos = 0;
350 
351  // EUD can issue (N + 1) bits with a single CMD_DITMS
352  // However, for N > 15 (i.e. 'send more than 16 bits') it repeats the payload[15]
353  // value (N - 16) times
354  while (bit_pos < bit_len) {
355  unsigned int cmd_len = bit_len - bit_pos;
356  if (cmd_len > SWD_CMD_DITMS_DATA_BITS) {
357  bool repeated_bit = buf_get_u32(seq, bit_pos + SWD_CMD_DITMS_DATA_BITS - 1, 1);
358 
359  cmd_len = SWD_CMD_DITMS_DATA_BITS;
360  while (cmd_len < EUD_SWD_DITMS_MAX_BITS && bit_pos + cmd_len < bit_len) {
361  if (buf_get_u32(seq, bit_pos + cmd_len, 1) != repeated_bit)
362  break;
363 
364  cmd_len++;
365  }
366  }
367 
368  unsigned int payload_bits = MIN(cmd_len, SWD_CMD_DITMS_DATA_BITS);
369  uint16_t tms = buf_get_u32(seq, bit_pos, payload_bits);
370 
371  retval = eud_ditms_u16(tms, cmd_len - 1);
372  if (retval != ERROR_OK)
373  break;
374 
375  bit_pos += cmd_len;
376  }
377 
378  return retval;
379 }
380 
382 {
383  switch (seq) {
384  case LINE_RESET:
385  LOG_DEBUG("SWD line reset");
387  case JTAG_TO_SWD:
388  LOG_DEBUG("JTAG-to-SWD");
390  case JTAG_TO_DORMANT:
391  LOG_DEBUG("JTAG-to-DORMANT");
393  case SWD_TO_JTAG:
394  LOG_DEBUG("SWD-to-JTAG ignored");
395  return ERROR_OK;
396  case SWD_TO_DORMANT:
397  LOG_DEBUG("SWD-to-DORMANT");
399  case DORMANT_TO_SWD:
400  LOG_DEBUG("DORMANT-to-SWD");
402  case DORMANT_TO_JTAG:
403  LOG_DEBUG("DORMANT-to-JTAG");
405  default:
406  LOG_ERROR("Sequence %d not supported", seq);
407  return ERROR_FAIL;
408  }
409 }
410 
411 static int eud_swd_init(void)
412 {
413  if (!eud_swd.handle)
414  return ERROR_OK;
415 
416  int retval = eud_swd_prepare();
417  if (retval == ERROR_OK)
418  return ERROR_OK;
419 
420  retval = eud_reopen_swd();
421  if (retval != ERROR_OK)
422  return retval;
423 
424  return eud_swd_prepare();
425 }
426 
427 static void eud_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
428 {
429  assert(cmd & SWD_CMD_RNW);
430 
433  return;
434  }
435 
437  .cmd = cmd,
438  .read_value = value,
439  .ap_delay_clk = ap_delay_clk,
440  };
441 }
442 
443 static void eud_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
444 {
445  assert(!(cmd & SWD_CMD_RNW));
446 
449  return;
450  }
451 
453  .cmd = cmd,
454  .value = value,
455  .ap_delay_clk = ap_delay_clk,
456  };
457 }
458 
459 static int eud_swd_run_queue(void)
460 {
461  int retval = eud_queued_retval;
462 
463  if (retval != ERROR_OK)
464  goto out;
465 
466  for (unsigned int i = 0; i < eud_queue_len; i++) {
467  struct eud_swd_transfer *transfer = &eud_queue[i];
468  uint8_t out[8];
469  uint8_t in[8];
470  uint8_t eud_cmd = (transfer->cmd | SWD_CMD_START | SWD_CMD_PARK) & ~SWD_CMD_STOP;
471  int out_len;
472  int in_len;
473 
474  LOG_DEBUG_IO("%s %s reg %x %" PRIx32,
475  transfer->cmd & SWD_CMD_APNDP ? "AP" : "DP",
476  transfer->cmd & SWD_CMD_RNW ? "read" : "write",
477  (transfer->cmd & SWD_CMD_A32) >> 1,
478  transfer->value);
479 
480  out[0] = eud_cmd;
481  if (transfer->cmd & SWD_CMD_RNW) {
482  out[1] = EUD_SWD_CMD_STATUS;
483  out[2] = EUD_SWD_CMD_FLUSH;
484  out_len = 3;
485  in_len = 8;
486  } else {
487  h_u32_to_le(&out[1], transfer->value);
488  out[5] = EUD_SWD_CMD_STATUS;
489  out[6] = EUD_SWD_CMD_FLUSH;
490  out_len = 7;
491  in_len = 4;
492  }
493 
494  retval = eud_bulk_write(&eud_swd, out, out_len);
495  if (retval != ERROR_OK)
496  goto out;
497 
498  retval = eud_bulk_read(&eud_swd, in, in_len);
499  if (retval != ERROR_OK)
500  goto out;
501 
502  uint32_t status;
503  if (transfer->cmd & SWD_CMD_RNW) {
504  uint32_t value = le_to_h_u32(in);
505  status = le_to_h_u32(&in[4]);
506  if (transfer->read_value)
507  *transfer->read_value = value;
508  LOG_DEBUG_IO("read result: %" PRIx32, value);
509  } else {
510  status = le_to_h_u32(in);
511  }
512 
513  uint8_t ack = status & 0x07;
514  if (swd_cmd_returns_ack(transfer->cmd) && ack != SWD_ACK_OK && ack != 0) {
515  LOG_DEBUG("SWD ack not OK: %u status 0x%08" PRIx32, i, status);
516  retval = swd_ack_to_error_code(ack);
517  goto out;
518  }
519 
520  if (transfer->ap_delay_clk)
521  retval = eud_ditms_u16(0, transfer->ap_delay_clk > 16 ? 16 : transfer->ap_delay_clk);
522 
523  if (retval != ERROR_OK)
524  goto out;
525  }
526 
527 out:
528  eud_queue_len = 0;
530  return retval;
531 }
532 
533 static int eud_init(void)
534 {
535  int ret = libusb_init(&eud_libusb_ctx);
536  if (ret != LIBUSB_SUCCESS) {
537  LOG_ERROR("libusb_init() failed: %s", libusb_error_name(ret));
538  return ERROR_FAIL;
539  }
540 
541  int retval = eud_open_inner(EUD_SWD_PID, &eud_swd, true);
542  if (retval != ERROR_OK) {
543  retval = eud_open_swd_after_enable();
544  if (retval != ERROR_OK)
545  goto fail;
546  }
547 
548  retval = eud_swd_prepare();
549  if (retval != ERROR_OK) {
550  retval = eud_reopen_swd();
551  if (retval != ERROR_OK)
552  goto fail;
553 
554  retval = eud_swd_prepare();
555  if (retval != ERROR_OK)
556  goto fail;
557  }
558 
559  return ERROR_OK;
560 
561 fail:
562  eud_close(&eud_swd);
563  eud_close(&eud_ctl);
564  libusb_exit(eud_libusb_ctx);
566  return retval;
567 }
568 
569 static int eud_quit(void)
570 {
571  eud_close(&eud_swd);
572  eud_close(&eud_ctl);
573 
574  if (eud_libusb_ctx) {
575  libusb_exit(eud_libusb_ctx);
577  }
578 
579  return ERROR_OK;
580 }
581 
582 static int eud_reset(int trst, int srst)
583 {
584  uint32_t value = EUD_SWD_BB_RESET_DEFAULT;
585 
586  if (srst)
588  if (trst)
590 
591  return eud_swd_bitbang(value);
592 }
593 
594 static int eud_speed(int speed)
595 {
596  if (speed < 0 || speed >= (int)ARRAY_SIZE(eud_speed_khz)) {
597  LOG_ERROR("EUD speed index %d is out of range", speed);
598  return ERROR_FAIL;
599  }
600 
601  eud_speed_index = speed;
602 
603  if (!eud_swd.handle)
604  return ERROR_OK;
605 
606  return eud_swd_set_speed_index(speed);
607 }
608 
609 static int eud_khz(int khz, int *jtag_speed)
610 {
611  int selected = ARRAY_SIZE(eud_speed_khz) - 1;
612 
613  for (unsigned int i = 0; i < ARRAY_SIZE(eud_speed_khz); i++) {
614  if ((unsigned int)khz >= eud_speed_khz[i]) {
615  selected = i;
616  break;
617  }
618  }
619 
620  *jtag_speed = selected;
621  return ERROR_OK;
622 }
623 
624 static int eud_speed_div(int speed, int *khz)
625 {
626  if (speed < 0 || speed >= (int)ARRAY_SIZE(eud_speed_khz))
627  return ERROR_FAIL;
628 
629  *khz = eud_speed_khz[speed];
630  return ERROR_OK;
631 }
632 
633 static const struct swd_driver eud_swd_driver = {
634  .init = eud_swd_init,
635  .switch_seq = eud_swd_switch_seq,
636  .read_reg = eud_swd_read_reg,
637  .write_reg = eud_swd_write_reg,
638  .run = eud_swd_run_queue,
639 };
640 
642  .name = "eud",
643  .transport_ids = TRANSPORT_SWD,
644  .transport_preferred_id = TRANSPORT_SWD,
645 
646  .init = eud_init,
647  .quit = eud_quit,
648  .reset = eud_reset,
649  .speed = eud_speed,
650  .khz = eud_khz,
651  .speed_div = eud_speed_div,
652 
653  .swd_ops = &eud_swd_driver,
654 };
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_PREP(_mask, _value)
FIELD_PREP(_mask, _value) - Prepare a value for insertion into a bitfield @_mask: Bitfield mask @_val...
Definition: bitfield.h:44
static const struct swd_driver eud_swd_driver
Definition: eud.c:633
static int eud_swd_init_defaults(void)
Definition: eud.c:296
static unsigned int eud_queue_len
Definition: eud.c:109
#define EUD_CTL_CMD_CTLOUT_CLR
Definition: eud.c:33
#define SWD_CMD_TIMING_RETRY_COUNT
Definition: eud.c:82
#define EUD_INTERFACE
Definition: eud.c:26
#define EUD_SWD_CMD_DELAY
Definition: eud.c:69
static int eud_reopen_swd(void)
Definition: eud.c:275
#define EUD_CTL_SWD_ON_CLEAR
Definition: eud.c:48
#define EUD_CTL_CMD_CTLOUT_SET
Definition: eud.c:32
#define EUD_SWD_CMD_PERIPH_RST
Definition: eud.c:90
static int eud_open_swd_after_enable(void)
Definition: eud.c:253
static int eud_swd_switch_seq(enum swd_special_seq seq)
Definition: eud.c:381
#define EUD_SWD_PID
Definition: eud.c:25
static int eud_speed_div(int speed, int *khz)
Definition: eud.c:624
static int eud_bulk_read(struct eud_device *dev, uint8_t *buf, int len)
Definition: eud.c:203
#define EUD_SWD_CMD_STATUS
Definition: eud.c:89
static int eud_libusb_reinit(void)
Definition: eud.c:143
static int eud_ctl_enable_swd(void)
Definition: eud.c:236
static const unsigned int eud_speed_khz[]
Definition: eud.c:113
static int eud_open_inner(uint16_t pid, struct eud_device *dev, bool quiet)
Definition: eud.c:157
#define SWD_CMD_DITMS_DATA
Definition: eud.c:75
#define EUD_SWD_CMD_FREQ
Definition: eud.c:68
#define EUD_EP_IN
Definition: eud.c:28
#define SWD_CMD_DITMS_DATA_BITS
Definition: eud.c:76
#define SWD_CMD_DELAY_TIME
Definition: eud.c:71
static int eud_ditms_u16(uint16_t tms, uint16_t count)
Definition: eud.c:331
#define EUD_SWD_BB_GPIO_SRST_N
Definition: eud.c:59
#define EUD_CTL_PID
Definition: eud.c:24
static struct eud_device eud_ctl
Definition: eud.c:106
static int eud_swd_set_speed_index(int speed_index)
Definition: eud.c:281
#define EUD_USB_TIMEOUT_MS
Definition: eud.c:29
static int eud_open(uint16_t pid, struct eud_device *dev)
Definition: eud.c:179
static struct eud_device eud_swd
Definition: eud.c:107
static int eud_khz(int khz, int *jtag_speed)
Definition: eud.c:609
#define SWD_CMD_DITMS_COUNT
Definition: eud.c:77
static int eud_swd_bitbang(uint32_t payload)
Definition: eud.c:315
static int eud_swd_init(void)
Definition: eud.c:411
#define EUD_SWD_MAX_QUEUED_TRANSFERS
Definition: eud.c:30
#define EUD_EP_OUT
Definition: eud.c:27
static int eud_reset(int trst, int srst)
Definition: eud.c:582
#define EUD_SWD_CMD_BITBANG
Definition: eud.c:73
static struct eud_swd_transfer eud_queue[EUD_SWD_MAX_QUEUED_TRANSFERS]
Definition: eud.c:108
static void eud_swd_read_reg(uint8_t cmd, uint32_t *value, uint32_t ap_delay_clk)
Definition: eud.c:427
#define EUD_SWD_CMD_DITMS
Definition: eud.c:74
#define EUD_SWD_BB_RCTLR_SRST_N
Definition: eud.c:58
static libusb_context * eud_libusb_ctx
Definition: eud.c:105
static int eud_ditms_sequence(const uint8_t *seq, unsigned int bit_len)
Definition: eud.c:346
static int eud_speed_index
Definition: eud.c:111
static int eud_op_no_payload(struct eud_device *dev, uint8_t opcode)
Definition: eud.c:231
#define EUD_SWD_BB_DAP_TRST_N
Definition: eud.c:61
#define EUD_SWD_CMD_FLUSH
Definition: eud.c:67
static int eud_op(struct eud_device *dev, uint8_t opcode, uint32_t payload)
Definition: eud.c:221
struct adapter_driver eud_adapter_driver
Definition: eud.c:641
#define EUD_VID
Definition: eud.c:23
static int eud_quit(void)
Definition: eud.c:569
static int eud_bulk_write(struct eud_device *dev, const uint8_t *buf, int len)
Definition: eud.c:184
static int eud_swd_prepare(void)
Definition: eud.c:341
#define EUD_CTL_SWD_ON_SET
Definition: eud.c:53
static void eud_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk)
Definition: eud.c:443
static void eud_close(struct eud_device *dev)
Definition: eud.c:129
static int eud_swd_run_queue(void)
Definition: eud.c:459
#define EUD_SWD_CMD_TIMING
Definition: eud.c:79
static int eud_init(void)
Definition: eud.c:533
#define EUD_SWD_DITMS_MAX_BITS
Definition: eud.c:78
static int eud_queued_retval
Definition: eud.c:110
static int eud_speed(int speed)
Definition: eud.c:594
#define EUD_SWD_BB_RESET_DEFAULT
Definition: eud.c:62
int jtag_libusb_error(int err)
Definition: libusb_helper.c:28
void alive_sleep(uint64_t ms)
Definition: log.c:478
#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:208
const char *const name
The name of the interface driver.
Definition: interface.h:210
Definition: eud.c:92
libusb_device_handle * handle
Definition: eud.c:93
uint16_t pid
Definition: eud.c:94
bool claimed
Definition: eud.c:95
uint32_t value
Definition: eud.c:100
uint32_t * read_value
Definition: eud.c:101
uint8_t cmd
Definition: eud.c:99
uint32_t ap_delay_clk
Definition: eud.c:102
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
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