OpenOCD
opendous.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * *
5  * Copyright (C) 2009 by Cahya Wirawan <cahya@gmx.at> *
6  * Based on opendous driver by Vladimir Fonov *
7  * *
8  * Copyright (C) 2009 by Vladimir Fonov <vladimir.fonov@gmai.com> *
9  * Based on J-link driver by Juergen Stuber *
10  * *
11  * Copyright (C) 2007 by Juergen Stuber <juergen@jstuber.net> *
12  * based on Dominic Rath's and Benedikt Sauter's usbprog.c *
13  * *
14  * Copyright (C) 2008 by Spencer Oliver *
15  * spen@spen-soft.co.uk *
16  ***************************************************************************/
17 
18 #ifdef HAVE_CONFIG_H
19 #include "config.h"
20 #endif
21 
22 #include <jtag/interface.h>
23 #include <jtag/commands.h>
24 #include "libusb_helper.h"
25 #include <string.h>
26 #include <time.h>
27 
28 #define OPENDOUS_MAX_VIDS_PIDS 4
29 /* define some probes with similar interface */
31  const char *name;
34  uint8_t READ_EP;
35  uint8_t WRITE_EP;
38 };
39 
40 static const struct opendous_probe opendous_probes[] = {
41  {"usbprog-jtag", {0x1781, 0}, {0x0C63, 0}, 0x82, 0x02, 0x00, 510 },
42  {"opendous", {0x1781, 0x03EB, 0}, {0xC0C0, 0x204F, 0}, 0x81, 0x02, 0x00, 360 },
43  {"usbvlab", {0x16C0, 0}, {0x05DC, 0}, 0x81, 0x02, 0x01, 360 },
44  {NULL, {0x0000}, {0x0000}, 0x00, 0x00, 0x00, 0 }
45 };
46 
47 #define OPENDOUS_WRITE_ENDPOINT (opendous_probe->WRITE_EP)
48 #define OPENDOUS_READ_ENDPOINT (opendous_probe->READ_EP)
49 
50 static unsigned int opendous_hw_jtag_version = 1;
51 
52 #define OPENDOUS_USB_TIMEOUT 1000
53 
54 #define OPENDOUS_USB_BUFFER_SIZE (opendous_probe->BUFFERSIZE)
55 #define OPENDOUS_IN_BUFFER_SIZE (OPENDOUS_USB_BUFFER_SIZE)
56 #define OPENDOUS_OUT_BUFFER_SIZE (OPENDOUS_USB_BUFFER_SIZE)
57 
58 /* Global USB buffers */
59 static uint8_t *usb_in_buffer;
60 static uint8_t *usb_out_buffer;
61 
62 /* Constants for OPENDOUS command */
63 
64 #define OPENDOUS_MAX_SPEED 66
65 #define OPENDOUS_MAX_TAP_TRANSMIT ((opendous_probe->BUFFERSIZE)-10)
66 #define OPENDOUS_MAX_INPUT_DATA (OPENDOUS_MAX_TAP_TRANSMIT*4)
67 
68 /* TAP */
69 #define OPENDOUS_TAP_BUFFER_SIZE 65536
70 
71 struct pending_scan_result {
72  int first; /* First bit position in tdo_buffer to read */
73  int length; /* Number of bits to read */
74  struct scan_command *command; /* Corresponding scan command */
75  uint8_t *buffer;
76 };
77 
80 
81 #define MAX_PENDING_SCAN_RESULTS (OPENDOUS_MAX_INPUT_DATA)
82 
83 /* JTAG usb commands */
84 #define JTAG_CMD_TAP_OUTPUT 0x0
85 #define JTAG_CMD_SET_TRST 0x1
86 #define JTAG_CMD_SET_SRST 0x2
87 #define JTAG_CMD_READ_INPUT 0x3
88 #define JTAG_CMD_TAP_OUTPUT_EMU 0x4
89 #define JTAG_CMD_SET_DELAY 0x5
90 #define JTAG_CMD_SET_SRST_TRST 0x6
91 #define JTAG_CMD_READ_CONFIG 0x7
92 
93 /* usbvlab control transfer */
94 #define FUNC_START_BOOTLOADER 30
95 #define FUNC_WRITE_DATA 0x50
96 #define FUNC_READ_DATA 0x51
97 
98 static char *opendous_type;
99 static const struct opendous_probe *opendous_probe;
100 
101 /* External interface functions */
102 static int opendous_execute_queue(struct jtag_command *cmd_queue);
103 static int opendous_init(void);
104 static int opendous_quit(void);
105 
106 /* Queue command functions */
107 static void opendous_end_state(enum tap_state state);
108 static void opendous_state_move(void);
109 static void opendous_path_move(unsigned int num_states, enum tap_state *path);
110 static void opendous_runtest(unsigned int num_cycles);
111 static void opendous_scan(int ir_scan, enum scan_type type, uint8_t *buffer,
112  int scan_size, struct scan_command *command);
113 static void opendous_reset(int trst, int srst);
114 static void opendous_simple_command(uint8_t command, uint8_t _data);
115 static int opendous_get_status(void);
116 
117 /* opendous tap buffer functions */
118 static void opendous_tap_init(void);
119 static int opendous_tap_execute(void);
120 static void opendous_tap_ensure_space(int scans, int bits);
121 static void opendous_tap_append_step(int tms, int tdi);
122 static void opendous_tap_append_scan(int length, uint8_t *buffer, struct scan_command *command);
123 
124 /* opendous lowlevel functions */
126  struct libusb_device_handle *usb_handle;
127 };
128 
129 static struct opendous_jtag *opendous_usb_open(void);
130 static void opendous_usb_close(struct opendous_jtag *opendous_jtag);
131 static int opendous_usb_message(struct opendous_jtag *opendous_jtag, int out_length, int in_length);
132 static int opendous_usb_write(struct opendous_jtag *opendous_jtag, int out_length);
133 static int opendous_usb_read(struct opendous_jtag *opendous_jtag);
134 
135 /* helper functions */
136 static int opendous_get_version_info(void);
137 static void opendous_debug_buffer(uint8_t *buffer, int length);
138 
140 
141 /***************************************************************************/
142 /* External interface implementation */
143 
144 COMMAND_HANDLER(opendous_handle_opendous_type_command)
145 {
146  if (CMD_ARGC == 0)
147  return ERROR_OK;
148 
149  /* only if the cable name wasn't overwritten by cmdline */
150  if (!opendous_type) {
151  /* REVISIT first verify that it's listed in cables[] ... */
152  opendous_type = strdup(CMD_ARGV[0]);
153  }
154 
155  /* REVISIT it's probably worth returning the current value ... */
156 
157  return ERROR_OK;
158 }
159 
160 COMMAND_HANDLER(opendous_handle_opendous_info_command)
161 {
163  /* attempt to get status */
165  }
166 
167  return ERROR_OK;
168 }
169 
170 COMMAND_HANDLER(opendous_handle_opendous_hw_jtag_command)
171 {
172  switch (CMD_ARGC) {
173  case 0:
174  command_print(CMD, "opendous hw jtag %i", opendous_hw_jtag_version);
175  break;
176 
177  case 1: {
178  int request_version = atoi(CMD_ARGV[0]);
179  switch (request_version) {
180  case 2:
181  case 3:
182  opendous_hw_jtag_version = request_version;
183  break;
184 
185  default:
187  }
188  break;
189  }
190 
191  default:
193  }
194 
195  return ERROR_OK;
196 }
197 
198 static const struct command_registration opendous_command_handlers[] = {
199  {
200  .name = "opendous_info",
201  .handler = &opendous_handle_opendous_info_command,
202  .mode = COMMAND_EXEC,
203  .help = "show opendous info",
204  .usage = "",
205  },
206  {
207  .name = "opendous_hw_jtag",
208  .handler = &opendous_handle_opendous_hw_jtag_command,
209  .mode = COMMAND_EXEC,
210  .help = "access opendous HW JTAG command version",
211  .usage = "[2|3]",
212  },
213  {
214  .name = "opendous_type",
215  .handler = &opendous_handle_opendous_type_command,
216  .mode = COMMAND_CONFIG,
217  .help = "set opendous type",
218  .usage = "[usbvlab|usbprog-jtag|opendous]",
219  },
221 };
222 
223 static struct jtag_interface opendous_interface = {
225 };
226 
228  .name = "opendous",
229  .transport_ids = TRANSPORT_JTAG,
230  .transport_preferred_id = TRANSPORT_JTAG,
231  .commands = opendous_command_handlers,
232 
233  .init = opendous_init,
234  .quit = opendous_quit,
235 
236  .jtag_ops = &opendous_interface,
237 };
238 
239 static int opendous_execute_queue(struct jtag_command *cmd_queue)
240 {
241  struct jtag_command *cmd = cmd_queue;
242  int scan_size;
243  enum scan_type type;
244  uint8_t *buffer;
245 
246  while (cmd) {
247  switch (cmd->type) {
248  case JTAG_RUNTEST:
249  LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles,
250  cmd->cmd.runtest->end_state);
251 
252  if (cmd->cmd.runtest->end_state != -1)
253  opendous_end_state(cmd->cmd.runtest->end_state);
254  opendous_runtest(cmd->cmd.runtest->num_cycles);
255  break;
256 
257  case JTAG_TLR_RESET:
258  LOG_DEBUG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
259 
260  if (cmd->cmd.statemove->end_state != -1)
261  opendous_end_state(cmd->cmd.statemove->end_state);
263  break;
264 
265  case JTAG_PATHMOVE:
266  LOG_DEBUG_IO("pathmove: %u states, end in %i",
267  cmd->cmd.pathmove->num_states,
268  cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
269 
270  opendous_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
271  break;
272 
273  case JTAG_SCAN:
274  LOG_DEBUG_IO("scan end in %i", cmd->cmd.scan->end_state);
275 
276  if (cmd->cmd.scan->end_state != -1)
277  opendous_end_state(cmd->cmd.scan->end_state);
278 
279  scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
280  LOG_DEBUG_IO("scan input, length = %d", scan_size);
281 
282  opendous_debug_buffer(buffer, (scan_size + 7) / 8);
283 
284  type = jtag_scan_type(cmd->cmd.scan);
285  opendous_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size, cmd->cmd.scan);
286  break;
287 
288  case JTAG_RESET:
289  LOG_DEBUG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
290 
292 
293  if (cmd->cmd.reset->trst == 1)
295  opendous_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
296  break;
297 
298  case JTAG_SLEEP:
299  LOG_DEBUG_IO("sleep %" PRIu32, cmd->cmd.sleep->us);
301  jtag_sleep(cmd->cmd.sleep->us);
302  break;
303 
304  default:
305  LOG_ERROR("BUG: unknown JTAG command type encountered");
306  exit(-1);
307  }
308  cmd = cmd->next;
309  }
310  return opendous_tap_execute();
311 }
312 
313 static int opendous_init(void)
314 {
315  int check_cnt;
316  const struct opendous_probe *cur_opendous_probe;
317 
318  cur_opendous_probe = opendous_probes;
319 
320  if (!opendous_type) {
321  opendous_type = strdup("opendous");
322  LOG_WARNING("No opendous_type specified, using default 'opendous'");
323  }
324 
325  while (cur_opendous_probe->name) {
326  if (strcmp(cur_opendous_probe->name, opendous_type) == 0) {
327  opendous_probe = cur_opendous_probe;
328  break;
329  }
330  cur_opendous_probe++;
331  }
332 
333  if (!opendous_probe) {
334  LOG_ERROR("No matching cable found for %s", opendous_type);
335  return ERROR_JTAG_INIT_FAILED;
336  }
337 
338 
341 
344 
346 
347  if (!opendous_jtag_handle) {
348  LOG_ERROR("Cannot find opendous Interface! Please check connection and permissions.");
349  return ERROR_JTAG_INIT_FAILED;
350  }
351 
352  check_cnt = 0;
353  while (check_cnt < 3) {
355  /* attempt to get status */
357  break;
358  }
359 
360  check_cnt++;
361  }
362 
363  LOG_INFO("opendous JTAG Interface ready");
364 
365  opendous_reset(0, 0);
367 
368  return ERROR_OK;
369 }
370 
371 static int opendous_quit(void)
372 {
374 
375  free(usb_out_buffer);
377 
378  free(usb_in_buffer);
380 
383 
384  free(opendous_type);
386 
387  return ERROR_OK;
388 }
389 
390 /***************************************************************************/
391 /* Queue command implementations */
392 
394 {
397  else {
398  LOG_ERROR("BUG: %i is not a valid end state", state);
399  exit(-1);
400  }
401 }
402 
403 /* Goes to the end state. */
405 {
406  int i;
407  int tms = 0;
408  uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
409  uint8_t tms_scan_bits = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
410 
411  for (i = 0; i < tms_scan_bits; i++) {
412  tms = (tms_scan >> i) & 1;
413  opendous_tap_append_step(tms, 0);
414  }
415 
417 }
418 
419 void opendous_path_move(unsigned int num_states, enum tap_state *path)
420 {
421  for (unsigned int i = 0; i < num_states; i++) {
422  if (path[i] == tap_state_transition(tap_get_state(), false))
424  else if (path[i] == tap_state_transition(tap_get_state(), true))
426  else {
427  LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition",
429  exit(-1);
430  }
431 
432  tap_set_state(path[i]);
433  }
434 
436 }
437 
438 void opendous_runtest(unsigned int num_cycles)
439 {
440  enum tap_state saved_end_state = tap_get_end_state();
441 
442  /* only do a state_move when we're not already in IDLE */
443  if (tap_get_state() != TAP_IDLE) {
446  }
447 
448  /* execute num_cycles */
449  for (unsigned int i = 0; i < num_cycles; i++)
451 
452  /* finish in end_state */
453  opendous_end_state(saved_end_state);
454  if (tap_get_state() != tap_get_end_state())
456 }
457 
458 void opendous_scan(int ir_scan, enum scan_type type, uint8_t *buffer, int scan_size, struct scan_command *command)
459 {
460  enum tap_state saved_end_state;
461 
462  opendous_tap_ensure_space(1, scan_size + 8);
463 
464  saved_end_state = tap_get_end_state();
465 
466  /* Move to appropriate scan state */
468 
469  if (tap_get_state() != tap_get_end_state())
471 
472  opendous_end_state(saved_end_state);
473 
474  /* Scan */
476 
477  /* We are in Exit1, go to Pause */
479 
481 
482  if (tap_get_state() != tap_get_end_state())
484 }
485 
486 void opendous_reset(int trst, int srst)
487 {
488  LOG_DEBUG("trst: %i, srst: %i", trst, srst);
489 
490  /* Signals are active low */
491 #if 0
492  if (srst == 0)
494  else if (srst == 1)
496 
497  if (trst == 0)
499  else if (trst == 1)
501 #endif
502 
503  srst = srst ? 0 : 1;
504  trst = trst ? 0 : 2;
506 }
507 
508 void opendous_simple_command(uint8_t command, uint8_t _data)
509 {
510  int result;
511 
512  LOG_DEBUG_IO("0x%02x 0x%02x", command, _data);
513 
514  usb_out_buffer[0] = 2;
515  usb_out_buffer[1] = 0;
516  usb_out_buffer[2] = command;
517  usb_out_buffer[3] = _data;
518 
520  if (result != 1)
521  LOG_ERROR("opendous command 0x%02x failed (%d)", command, result);
522 }
523 
525 {
526  return ERROR_OK;
527 }
528 
530 {
531  return ERROR_OK;
532 }
533 
534 /***************************************************************************/
535 /* Estick tap functions */
536 
537 static int tap_length;
540 
541 static int last_tms;
542 
544 {
545  tap_length = 0;
547 }
548 
549 void opendous_tap_ensure_space(int scans, int bits)
550 {
552  int available_bits = OPENDOUS_TAP_BUFFER_SIZE / 2 - tap_length;
553 
554  if ((scans > available_scans) || (bits > available_bits))
556 }
557 
558 void opendous_tap_append_step(int tms, int tdi)
559 {
560  last_tms = tms;
561  unsigned char _tms = tms ? 1 : 0;
562  unsigned char _tdi = tdi ? 1 : 0;
563 
565 
566  int tap_index = tap_length / 4;
567  int bits = (tap_length % 4) * 2;
568 
570  if (!bits)
571  tms_buffer[tap_index] = 0;
572 
573  tms_buffer[tap_index] |= (_tdi << bits)|(_tms << (bits + 1));
574  tap_length++;
575  } else
576  LOG_ERROR("opendous_tap_append_step, overflow");
577 }
578 
580 {
581  LOG_DEBUG_IO("append scan, length = %d", length);
582 
584  int i;
585 
590 
591  for (i = 0; i < length; i++)
592  opendous_tap_append_step((i < length-1 ? 0 : 1), (buffer[i / 8] >> (i % 8)) & 1);
594 }
595 
596 /* Pad and send a tap sequence to the device, and receive the answer.
597  * For the purpose of padding we assume that we are in idle or pause state. */
599 {
600  int byte_length;
601  int i, j;
602  int result;
603  int byte_length_out;
604 
605  if (tap_length > 0) {
606 
607  /* memset(tdo_buffer,0,OPENDOUS_TAP_BUFFER_SIZE); */
608  /* LOG_INFO("OPENDOUS tap execute %d",tap_length); */
609  byte_length = (tap_length + 3) / 4;
610 
611  byte_length_out = (tap_length + 7) / 8;
612  LOG_DEBUG_USB("opendous is sending %d bytes", byte_length);
613 
614  for (j = 0, i = 0; j < byte_length;) {
615 
616  int receive;
617  int transmit = byte_length - j;
618  if (transmit > OPENDOUS_MAX_TAP_TRANSMIT) {
619  transmit = OPENDOUS_MAX_TAP_TRANSMIT;
620  receive = (OPENDOUS_MAX_TAP_TRANSMIT) / 2;
622  } else {
623  usb_out_buffer[2] = JTAG_CMD_TAP_OUTPUT | ((tap_length % 4) << 4);
624  receive = (transmit + 1) / 2;
625  }
626  usb_out_buffer[0] = (transmit + 1) & 0xff;
627  usb_out_buffer[1] = ((transmit + 1) >> 8) & 0xff;
628 
629  memmove(usb_out_buffer + 3, tms_buffer + j, transmit);
630  result = opendous_usb_message(opendous_jtag_handle, 3 + transmit, receive);
631  if (result != receive) {
632  LOG_ERROR("opendous_tap_execute, wrong result %d, expected %d", result, receive);
634  }
635 
636  memmove(tdo_buffer + i, usb_in_buffer, receive);
637  i += receive;
638  j += transmit;
639  }
640 
641  LOG_DEBUG_USB("opendous tap result %d", byte_length_out);
642  opendous_debug_buffer(tdo_buffer, byte_length_out);
643 
644  /* LOG_INFO("eStick tap execute %d",tap_length); */
645  for (i = 0; i < pending_scan_results_length; i++) {
646 
648  uint8_t *buffer = pending_scan_result->buffer;
652 
653  /* Copy to buffer */
654  buf_set_buf(tdo_buffer, first, buffer, 0, length);
655 
656  LOG_DEBUG_IO("pending scan result, length = %d", length);
657 
658  opendous_debug_buffer(buffer, byte_length_out);
659 
663  }
664 
666  }
667 
669  }
670 
671  return ERROR_OK;
672 }
673 
674 /*****************************************************************************/
675 /* Estick USB low-level functions */
676 
678 {
679  struct opendous_jtag *result;
680 
681  struct libusb_device_handle *devh;
683  return NULL;
684 
686  libusb_claim_interface(devh, 0);
687 
688  result = malloc(sizeof(*result));
689  result->usb_handle = devh;
690  return result;
691 }
692 
694 {
696  free(opendous_jtag);
697 }
698 
699 /* Send a message and receive the reply. */
700 int opendous_usb_message(struct opendous_jtag *opendous_jtag, int out_length, int in_length)
701 {
702  int result;
703 
704  result = opendous_usb_write(opendous_jtag, out_length);
705  if (result == out_length) {
707  if (result == in_length)
708  return result;
709  else {
710  LOG_ERROR("usb_bulk_read failed (requested=%d, result=%d)", in_length, result);
711  return -1;
712  }
713  } else {
714  LOG_ERROR("usb_bulk_write failed (requested=%d, result=%d)", out_length, result);
715  return -1;
716  }
717 }
718 
719 /* Write data from out_buffer to USB. */
720 int opendous_usb_write(struct opendous_jtag *opendous_jtag, int out_length)
721 {
722  int result, transferred;
723 
724  if (out_length > OPENDOUS_OUT_BUFFER_SIZE) {
725  LOG_ERROR("opendous_jtag_write illegal out_length=%d (max=%d)", out_length, OPENDOUS_OUT_BUFFER_SIZE);
726  return -1;
727  }
728 
729  LOG_DEBUG_USB("USB write begin");
730 
733  LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT,
734  FUNC_WRITE_DATA, 0, 0, (char *)usb_out_buffer, out_length, OPENDOUS_USB_TIMEOUT,
735  &transferred);
736  /* FIXME: propagate error separately from transferred */
737  if (result == ERROR_OK)
738  result = transferred;
739  } else {
741  (char *)usb_out_buffer, out_length, OPENDOUS_USB_TIMEOUT, &result);
742  }
743 
744  LOG_DEBUG_USB("USB write end: %d bytes", result);
745 
746  LOG_DEBUG_IO("opendous_usb_write, out_length = %d, result = %d", out_length, result);
747 
749 
750  return result;
751 }
752 
753 /* Read data from USB into in_buffer. */
755 {
756  int transferred;
757 
758  LOG_DEBUG_USB("USB read begin");
759 
760  int result;
763  LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN,
765  &transferred);
766  /* FIXME: propagate error separately from transferred */
767  if (result == ERROR_OK)
768  result = transferred;
769  } else {
772  }
773 
774  LOG_DEBUG_USB("USB read end: %d bytes", result);
775 
776  LOG_DEBUG_IO("opendous_usb_read, result = %d", result);
777 
779 
780  return result;
781 }
782 
783 #define BYTES_PER_LINE 16
784 
786 {
788  return;
789 
790  char line[8 + 3 * BYTES_PER_LINE + 1];
791 
792  for (int i = 0; i < length; i += BYTES_PER_LINE) {
793  int n = snprintf(line, 9, "%04x", i);
794  for (int j = i; j < i + BYTES_PER_LINE && j < length; j++)
795  n += snprintf(line + n, 4, " %02x", buffer[j]);
796  LOG_DEBUG_USB("%s", line);
797  }
798 }
void * buf_set_buf(const void *_src, unsigned int src_start, void *_dst, unsigned int dst_start, unsigned int len)
Definition: binarybuffer.c:120
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:389
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:146
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:161
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:405
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:156
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:256
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_EXEC
Definition: command.h:40
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
Definition: commands.c:192
enum scan_type jtag_scan_type(const struct scan_command *cmd)
Definition: commands.c:167
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
Definition: commands.c:230
scan_type
The inferred type of a scan_command structure, indicating whether the command has the host scan in fr...
Definition: commands.h:22
@ JTAG_TLR_RESET
Definition: commands.h:137
@ JTAG_SCAN
Definition: commands.h:129
@ JTAG_PATHMOVE
Definition: commands.h:140
@ JTAG_RUNTEST
Definition: commands.h:138
@ JTAG_SLEEP
Definition: commands.h:141
@ JTAG_RESET
Definition: commands.h:139
uint64_t buffer
Pointer to data buffer to send over SPI.
Definition: dw-spi-helper.h:0
uint8_t type
Definition: esp_usb_jtag.c:0
uint8_t length
Definition: esp_usb_jtag.c:1
enum tap_state tap_get_end_state(void)
For more information,.
Definition: interface.c:56
enum tap_state tap_state_transition(enum tap_state cur_state, bool tms)
Function tap_state_transition takes a current TAP state and returns the next state according to the t...
Definition: interface.c:223
const char * tap_state_name(enum tap_state state)
Function tap_state_name Returns a string suitable for display representing the JTAG tap_state.
Definition: interface.c:344
int tap_get_tms_path_len(enum tap_state from, enum tap_state to)
Function int tap_get_tms_path_len returns the total number of bits that represents a TMS path transit...
Definition: interface.c:195
void tap_set_end_state(enum tap_state new_end_state)
This function sets the state of an "end state follower" which tracks the state that any cable driver ...
Definition: interface.c:48
enum tap_state tap_get_state(void)
This function gets the state of the "state follower" which tracks the state of the TAPs connected to ...
Definition: interface.c:37
bool tap_is_state_stable(enum tap_state astate)
Function tap_is_state_stable returns true if the astate is stable.
Definition: interface.c:200
int tap_get_tms_path(enum tap_state from, enum tap_state to)
This function provides a "bit sequence" indicating what has to be done with TMS during a sequence of ...
Definition: interface.c:190
#define tap_set_state(new_state)
This function sets the state of a "state follower" which tracks the state of the TAPs connected to th...
Definition: interface.h:50
void jtag_sleep(uint32_t us)
Definition: jtag/core.c:1075
tap_state
Defines JTAG Test Access Port states.
Definition: jtag.h:37
@ TAP_RESET
Definition: jtag.h:56
@ TAP_DRPAUSE
Definition: jtag.h:44
@ TAP_IRSHIFT
Definition: jtag.h:51
@ TAP_IDLE
Definition: jtag.h:53
@ TAP_DRSHIFT
Definition: jtag.h:43
@ TAP_IRPAUSE
Definition: jtag.h:52
#define ERROR_JTAG_QUEUE_FAILED
Definition: jtag.h:556
#define ERROR_JTAG_INIT_FAILED
Definition: jtag.h:552
int jtag_libusb_open(const uint16_t vids[], const uint16_t pids[], const char *product, struct libusb_device_handle **out, adapter_get_alternate_serial_fn adapter_get_alternate_serial)
int jtag_libusb_bulk_write(struct libusb_device_handle *dev, int ep, char *bytes, int size, int timeout, int *transferred)
int jtag_libusb_control_transfer(struct libusb_device_handle *dev, uint8_t request_type, uint8_t request, uint16_t value, uint16_t index, char *bytes, uint16_t size, unsigned int timeout, int *transferred)
int jtag_libusb_set_configuration(struct libusb_device_handle *devh, int configuration)
void jtag_libusb_close(struct libusb_device_handle *dev)
int jtag_libusb_bulk_read(struct libusb_device_handle *dev, int ep, char *bytes, int size, int timeout, int *transferred)
#define LOG_DEBUG_IO(expr ...)
Definition: log.h:109
#define LOG_DEBUG_USB(expr,...)
Definition: log.h:107
#define LOG_WARNING(expr ...)
Definition: log.h:137
#define LOG_ERROR(expr ...)
Definition: log.h:140
#define LOG_LEVEL_IS(FOO)
Definition: log.h:105
#define LOG_INFO(expr ...)
Definition: log.h:134
#define LOG_DEBUG(expr ...)
Definition: log.h:117
#define ERROR_OK
Definition: log.h:175
@ LOG_LVL_DEBUG_USB
Definition: log.h:53
#define JTAG_CMD_TAP_OUTPUT
Definition: opendous.c:84
static void opendous_tap_append_step(int tms, int tdi)
Definition: opendous.c:558
static int opendous_quit(void)
Definition: opendous.c:371
#define MAX_PENDING_SCAN_RESULTS
Definition: opendous.c:81
static void opendous_end_state(enum tap_state state)
Definition: opendous.c:393
static void opendous_tap_init(void)
Definition: opendous.c:543
static void opendous_reset(int trst, int srst)
Definition: opendous.c:486
#define OPENDOUS_TAP_BUFFER_SIZE
Definition: opendous.c:69
static int opendous_usb_message(struct opendous_jtag *opendous_jtag, int out_length, int in_length)
Definition: opendous.c:700
#define OPENDOUS_USB_TIMEOUT
Definition: opendous.c:52
static int opendous_get_version_info(void)
Definition: opendous.c:529
static int last_tms
Definition: opendous.c:541
static int opendous_execute_queue(struct jtag_command *cmd_queue)
Definition: opendous.c:239
static int opendous_init(void)
Definition: opendous.c:313
static const struct opendous_probe * opendous_probe
Definition: opendous.c:99
static void opendous_debug_buffer(uint8_t *buffer, int length)
Definition: opendous.c:785
static int tap_length
Definition: opendous.c:537
static void opendous_runtest(unsigned int num_cycles)
Definition: opendous.c:438
static char * opendous_type
Definition: opendous.c:98
#define OPENDOUS_OUT_BUFFER_SIZE
Definition: opendous.c:56
static uint8_t tdo_buffer[OPENDOUS_TAP_BUFFER_SIZE]
Definition: opendous.c:539
static void opendous_path_move(unsigned int num_states, enum tap_state *path)
Definition: opendous.c:419
static struct opendous_jtag * opendous_usb_open(void)
Definition: opendous.c:677
#define OPENDOUS_MAX_TAP_TRANSMIT
Definition: opendous.c:65
struct adapter_driver opendous_adapter_driver
Definition: opendous.c:227
static struct jtag_interface opendous_interface
Definition: opendous.c:223
#define OPENDOUS_MAX_VIDS_PIDS
Definition: opendous.c:28
static int opendous_tap_execute(void)
Definition: opendous.c:598
static void opendous_tap_append_scan(int length, uint8_t *buffer, struct scan_command *command)
Definition: opendous.c:579
COMMAND_HANDLER(opendous_handle_opendous_type_command)
Definition: opendous.c:144
static uint8_t * usb_out_buffer
Definition: opendous.c:60
#define JTAG_CMD_SET_SRST
Definition: opendous.c:86
#define JTAG_CMD_SET_TRST
Definition: opendous.c:85
#define FUNC_READ_DATA
Definition: opendous.c:96
#define OPENDOUS_IN_BUFFER_SIZE
Definition: opendous.c:55
static void opendous_usb_close(struct opendous_jtag *opendous_jtag)
Definition: opendous.c:693
#define OPENDOUS_WRITE_ENDPOINT
Definition: opendous.c:47
static const struct command_registration opendous_command_handlers[]
Definition: opendous.c:198
static void opendous_tap_ensure_space(int scans, int bits)
Definition: opendous.c:549
static int opendous_usb_write(struct opendous_jtag *opendous_jtag, int out_length)
Definition: opendous.c:720
#define BYTES_PER_LINE
Definition: opendous.c:783
static uint8_t tms_buffer[OPENDOUS_TAP_BUFFER_SIZE]
Definition: opendous.c:538
#define OPENDOUS_READ_ENDPOINT
Definition: opendous.c:48
static struct opendous_jtag * opendous_jtag_handle
Definition: opendous.c:139
static const struct opendous_probe opendous_probes[]
Definition: opendous.c:40
static struct pending_scan_result * pending_scan_results_buffer
Definition: opendous.c:79
static uint8_t * usb_in_buffer
Definition: opendous.c:59
static void opendous_simple_command(uint8_t command, uint8_t _data)
Definition: opendous.c:508
#define FUNC_WRITE_DATA
Definition: opendous.c:95
static void opendous_scan(int ir_scan, enum scan_type type, uint8_t *buffer, int scan_size, struct scan_command *command)
Definition: opendous.c:458
static unsigned int opendous_hw_jtag_version
Definition: opendous.c:50
static int pending_scan_results_length
Definition: opendous.c:78
static int opendous_usb_read(struct opendous_jtag *opendous_jtag)
Definition: opendous.c:754
static int opendous_get_status(void)
Definition: opendous.c:524
static void opendous_state_move(void)
Definition: opendous.c:404
#define JTAG_CMD_SET_SRST_TRST
Definition: opendous.c:90
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:239
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
struct libusb_device_handle * usb_handle
Definition: opendous.c:126
uint8_t WRITE_EP
Definition: opendous.c:35
uint16_t PID[OPENDOUS_MAX_VIDS_PIDS]
Definition: opendous.c:33
const char * name
Definition: opendous.c:31
int BUFFERSIZE
Definition: opendous.c:37
uint8_t READ_EP
Definition: opendous.c:34
uint8_t CONTROL_TRANSFER
Definition: opendous.c:36
uint16_t VID[OPENDOUS_MAX_VIDS_PIDS]
Definition: opendous.c:32
int first
First bit position in tdo_buffer to read.
Definition: arm-jtag-ew.c:511
int length
Number of bits to read.
Definition: arm-jtag-ew.c:512
uint8_t * buffer
Location to store the result.
Definition: arm-jtag-ew.c:514
struct scan_command * command
Definition: arm-jtag-ew.c:513
The scan_command provide a means of encapsulating a set of scan_field structures that should be scann...
Definition: commands.h:35
#define TRANSPORT_JTAG
Definition: transport.h:19
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t state[4]
Definition: vdebug.c:21