OpenOCD
angie.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /***************************************************************************
3  File : angie.c *
4  Contents : OpenOCD driver code for NanoXplore USB-JTAG ANGIE *
5  adapter hardware. *
6  Based on openULINK driver code by: Martin Schmoelzer. *
7  Copyright 2023, Ahmed Errached BOUDJELIDA, NanoXplore SAS. *
8  <aboudjelida@nanoxplore.com> *
9  <ahmederrachedbjld@gmail.com> *
10  ***************************************************************************/
11 
12 #ifdef HAVE_CONFIG_H
13 #include "config.h"
14 #endif
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <math.h>
19 #include "helper/system.h"
20 #include <helper/types.h>
21 #include <jtag/interface.h>
22 #include <jtag/commands.h>
23 #include <target/image.h>
24 #include <libusb.h>
25 #include "libusb_helper.h"
26 #include "angie/include/msgtypes.h"
27 
30 #define ANGIE_VID 0x584e
31 
34 #define ANGIE_PID 0x414F
35 #define ANGIE_PID_2 0x424e
36 #define ANGIE_PID_3 0x4255
37 #define ANGIE_PID_4 0x4355
38 #define ANGIE_PID_5 0x4a55
39 
42 #define CPUCS_REG 0xE600
43 
45 #define REQUEST_FIRMWARE_LOAD 0xA0
46 
48 #define CPU_RESET 0x01
49 
51 #define CPU_START 0x00
52 
54 #define FIRMWARE_ADDR 0x0000
55 
57 #define USB_INTERFACE 0
58 
60 #define ANGIE_RENUMERATION_DELAY_US 1500000
61 
63 #define ANGIE_FIRMWARE_FILE PKGDATADIR "/angie/angie_firmware.bin"
64 
66 #define ANGIE_BITSTREAM_FILE PKGDATADIR "/angie/angie_bitstream.bit"
67 
69 #define SECTION_BUFFERSIZE 16384
70 
72 #define SPLIT_SCAN_THRESHOLD 10
73 
75 enum angie_type {
77 };
78 
82 };
83 
90 };
91 
114 struct angie_cmd {
115  uint8_t id;
117  uint8_t *payload_out;
120  uint8_t *payload_in_start;
121  uint8_t *payload_in;
122  uint8_t payload_in_size;
126 
129 
132 
133  struct angie_cmd *next;
134 };
135 
137 struct angie {
138  struct libusb_context *libusb_ctx;
139  struct libusb_device_handle *usb_device_handle;
140  enum angie_type type;
141 
142  unsigned int ep_in;
143  unsigned int ep_out;
145  /* delay value for "SLOW_CLOCK commands" in [0:255] range in units of 4 us;
146  -1 means no need for delay */
156 };
157 
158 /**************************** Function Prototypes *****************************/
159 
160 /* USB helper functions */
161 static int angie_usb_open(struct angie *device);
162 static int angie_usb_close(struct angie *device);
163 
164 /* ANGIE MCU (Cypress EZ-USB) specific functions */
165 static int angie_cpu_reset(struct angie *device, char reset_bit);
166 static int angie_load_firmware_and_renumerate(struct angie *device, const char *filename,
167  uint32_t delay_us);
168 static int angie_load_firmware(struct angie *device, const char *filename);
169 static int angie_load_bitstream(struct angie *device, const char *filename);
170 static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_data_size);
171 static int angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value);
172 static int angie_write_firmware_section(struct angie *device,
173  struct image *firmware_image, int section_index);
174 
175 /* Generic helper functions */
176 static void angie_dump_signal_states(uint8_t input_signals, uint8_t output_signals);
177 
178 /* ANGIE command generation helper functions */
179 static int angie_allocate_payload(struct angie_cmd *angie_cmd, int size,
181 
182 /* ANGIE command queue helper functions */
183 static int angie_get_queue_size(struct angie *device,
185 static void angie_clear_queue(struct angie *device);
186 static int angie_append_queue(struct angie *device, struct angie_cmd *angie_cmd);
187 static int angie_execute_queued_commands(struct angie *device, int timeout_ms);
188 
189 static void angie_dump_queue(struct angie *device);
190 
191 static int angie_append_scan_cmd(struct angie *device,
192  enum scan_type scan_type,
193  int scan_size_bits,
194  uint8_t *tdi,
195  uint8_t *tdo_start,
196  uint8_t *tdo,
197  uint8_t tms_count_start,
198  uint8_t tms_sequence_start,
199  uint8_t tms_count_end,
200  uint8_t tms_sequence_end,
201  struct jtag_command *origin,
202  bool postprocess);
203 static int angie_append_clock_tms_cmd(struct angie *device, uint8_t count,
204  uint8_t sequence);
205 static int angie_append_clock_tck_cmd(struct angie *device, uint16_t count);
206 static int angie_append_get_signals_cmd(struct angie *device);
207 static int angie_append_set_signals_cmd(struct angie *device, uint8_t low,
208  uint8_t high);
209 static int angie_append_sleep_cmd(struct angie *device, uint32_t us);
210 static int angie_append_configure_tck_cmd(struct angie *device,
211  int delay_scan_in,
212  int delay_scan_out,
213  int delay_scan_io,
214  int delay_tck,
215  int delay_tms);
216 static int angie_append_test_cmd(struct angie *device);
217 
218 /* ANGIE TCK frequency helper functions */
219 static int angie_calculate_delay(enum angie_delay_type type, long f, int *delay);
220 
221 /* Interface between ANGIE and OpenOCD */
222 static void angie_set_end_state(tap_state_t endstate);
223 static int angie_queue_statemove(struct angie *device);
224 
225 static int angie_queue_scan(struct angie *device, struct jtag_command *cmd);
226 static int angie_queue_tlr_reset(struct angie *device, struct jtag_command *cmd);
227 static int angie_queue_runtest(struct angie *device, struct jtag_command *cmd);
228 static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd);
229 static int angie_queue_sleep(struct angie *device, struct jtag_command *cmd);
230 static int angie_queue_stableclocks(struct angie *device, struct jtag_command *cmd);
231 
232 static int angie_post_process_scan(struct angie_cmd *angie_cmd);
233 static int angie_post_process_queue(struct angie *device);
234 
235 /* adapter driver functions */
236 static int angie_execute_queue(struct jtag_command *cmd_queue);
237 static int angie_khz(int khz, int *jtag_speed);
238 static int angie_speed(int speed);
239 static int angie_speed_div(int speed, int *khz);
240 static int angie_init(void);
241 static int angie_quit(void);
242 static int angie_reset(int trst, int srst);
243 
244 /****************************** Global Variables ******************************/
245 
246 static struct angie *angie_handle;
247 
248 /**************************** USB helper functions ****************************/
249 
257 static int angie_usb_open(struct angie *device)
258 {
259  struct libusb_device_handle *usb_device_handle;
260  const uint16_t vids[] = {ANGIE_VID, ANGIE_VID, ANGIE_VID, ANGIE_VID, ANGIE_VID, 0};
261  const uint16_t pids[] = {ANGIE_PID, ANGIE_PID_2, ANGIE_PID_3, ANGIE_PID_4, ANGIE_PID_5, 0};
262 
263  int ret = jtag_libusb_open(vids, pids, NULL, &usb_device_handle, NULL);
264 
265  if (ret != ERROR_OK) {
266  LOG_ERROR("Could not find and open ANGIE");
267  return ret;
268  }
269 
270  device->usb_device_handle = usb_device_handle;
271  device->type = ANGIE;
272 
273  return ERROR_OK;
274 }
275 
283 static int angie_usb_close(struct angie *device)
284 {
285  if (device->usb_device_handle) {
286  if (libusb_release_interface(device->usb_device_handle, 0) != 0) {
287  LOG_ERROR("Could not release interface 0");
288  return ERROR_FAIL;
289  }
290 
291  jtag_libusb_close(device->usb_device_handle);
292  device->usb_device_handle = NULL;
293  }
294  return ERROR_OK;
295 }
296 
297 /******************* ANGIE CPU (EZ-USB) specific functions ********************/
298 
308 static int angie_cpu_reset(struct angie *device, char reset_bit)
309 {
310  return jtag_libusb_control_transfer(device->usb_device_handle,
311  (LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE),
313 }
314 
328  const char *filename, uint32_t delay_us)
329 {
330  int ret;
331 
332  /* Basic process: After downloading the firmware, the ANGIE will disconnect
333  * itself and re-connect after a short amount of time so we have to close
334  * the handle and re-enumerate USB devices */
335 
336  ret = angie_load_firmware(device, filename);
337  if (ret != ERROR_OK)
338  return ret;
339 
340  ret = angie_usb_close(device);
341  if (ret != ERROR_OK)
342  return ret;
343 
344  usleep(delay_us);
345 
346  ret = angie_usb_open(device);
347  if (ret != ERROR_OK)
348  return ret;
349 
350  ret = libusb_claim_interface(angie_handle->usb_device_handle, 0);
351  if (ret != LIBUSB_SUCCESS)
352  return ERROR_FAIL;
353 
354  return ERROR_OK;
355 }
356 
367 static int angie_load_firmware(struct angie *device, const char *filename)
368 {
369  struct image angie_firmware_image;
370  int ret;
371 
373  if (ret != ERROR_OK) {
374  LOG_ERROR("Could not halt ANGIE CPU");
375  return ret;
376  }
377 
378  angie_firmware_image.base_address = 0;
379  angie_firmware_image.base_address_set = false;
380 
381  ret = image_open(&angie_firmware_image, filename, "bin");
382  if (ret != ERROR_OK) {
383  LOG_ERROR("Could not load firmware image");
384  return ret;
385  }
386 
387  /* Download all sections in the image to ANGIE */
388  for (unsigned int i = 0; i < angie_firmware_image.num_sections; i++) {
389  ret = angie_write_firmware_section(device, &angie_firmware_image, i);
390  if (ret != ERROR_OK) {
391  LOG_ERROR("Could not write firmware section");
392  return ret;
393  }
394  }
395 
396  image_close(&angie_firmware_image);
397 
399  if (ret != ERROR_OK) {
400  LOG_ERROR("Could not restart ANGIE CPU");
401  return ret;
402  }
403 
404  return ERROR_OK;
405 }
406 
417 static int angie_load_bitstream(struct angie *device, const char *filename)
418 {
419  int ret, transferred;
420  const char *bitstream_file_path = filename;
421  FILE *bitstream_file = NULL;
422  char *bitstream_data = NULL;
423  size_t bitstream_size = 0;
424  uint8_t gpifcnt[4];
425 
426  /* Open the bitstream file */
427  bitstream_file = fopen(bitstream_file_path, "rb");
428  if (!bitstream_file) {
429  LOG_ERROR("Failed to open bitstream file: %s\n", bitstream_file_path);
430  return ERROR_FAIL;
431  }
432 
433  /* Get the size of the bitstream file */
434  fseek(bitstream_file, 0, SEEK_END);
435  bitstream_size = ftell(bitstream_file);
436  fseek(bitstream_file, 0, SEEK_SET);
437 
438  /* Allocate memory for the bitstream data */
439  bitstream_data = malloc(bitstream_size);
440  if (!bitstream_data) {
441  LOG_ERROR("Failed to allocate memory for bitstream data.");
442  fclose(bitstream_file);
443  return ERROR_FAIL;
444  }
445 
446  /* Read the bitstream data from the file */
447  if (fread(bitstream_data, 1, bitstream_size, bitstream_file) != bitstream_size) {
448  LOG_ERROR("Failed to read bitstream data.");
449  free(bitstream_data);
450  fclose(bitstream_file);
451  return ERROR_FAIL;
452  }
453 
454  h_u32_to_be(gpifcnt, bitstream_size);
455 
456  /* CFGopen */
457  ret = jtag_libusb_control_transfer(device->usb_device_handle,
458  0x00, 0xB0, 0, 0, (char *)gpifcnt, 4, LIBUSB_TIMEOUT_MS, &transferred);
459  if (ret != ERROR_OK) {
460  LOG_ERROR("Failed opencfg");
461  /* Abort if libusb sent less data than requested */
462  return ERROR_FAIL;
463  }
464 
465  /* Send the bitstream data to the microcontroller */
466  int actual_length = 0;
467  ret = jtag_libusb_bulk_write(device->usb_device_handle, 0x02, bitstream_data, bitstream_size, 1000, &actual_length);
468  if (ret != ERROR_OK) {
469  LOG_ERROR("Failed to send bitstream data: %s", libusb_strerror(ret));
470  free(bitstream_data);
471  fclose(bitstream_file);
472  return ERROR_FAIL;
473  }
474 
475  LOG_INFO("Bitstream sent successfully.");
476 
477  /* Clean up */
478  free(bitstream_data);
479  fclose(bitstream_file);
480 
481  /* CFGclose */
482  transferred = 0;
483  ret = jtag_libusb_control_transfer(device->usb_device_handle,
484  0x00, 0xB1, 0, 0, NULL, 0, LIBUSB_TIMEOUT_MS, &transferred);
485  if (ret != ERROR_OK) {
486  LOG_ERROR("Failed cfgclose");
487  /* Abort if libusb sent less data than requested */
488  return ERROR_FAIL;
489  }
490  return ERROR_OK;
491 }
492 
502 static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_data_size)
503 {
504  char i2c_data_buffer[i2c_data_size + 2];
505  char buffer_received[1];
506  int ret, transferred;
507  i2c_data_buffer[0] = 0; // write = 0
508  i2c_data_buffer[1] = i2c_data_size - 1; // i2c_data count (without address)
509 
510  for (uint8_t i = 0; i < i2c_data_size; i++)
511  i2c_data_buffer[i + 2] = i2c_data[i];
512 
513  // Send i2c packet to Dev-board and configure its clock source /
514  ret = jtag_libusb_bulk_write(device->usb_device_handle, 0x06, i2c_data_buffer,
515  i2c_data_size + 2, 1000, &transferred);
516  if (ret != ERROR_OK) {
517  LOG_ERROR("Error in i2c clock gen configuration : ret ERROR");
518  return ret;
519  }
520  if (transferred != i2c_data_size + 2) {
521  LOG_ERROR("Error in i2c clock gen configuration : bytes transferred");
522  return ERROR_FAIL;
523  }
524 
525  usleep(500);
526 
527  // Receive packet from ANGIE /
528  ret = jtag_libusb_bulk_write(device->usb_device_handle, 0x88, buffer_received, 1, 1000, &transferred);
529  if (ret != ERROR_OK) {
530  LOG_ERROR("Error in i2c clock gen configuration : ret ERROR");
531  return ret;
532  }
533  return ERROR_OK;
534 }
535 
547 static int angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value)
548 {
549  uint8_t ioconfig[3] = {i2c_adr, 3, cfg_value};
550  int ret = angie_i2c_write(device, ioconfig, 3);
551  if (ret != ERROR_OK)
552  return ret;
553 
554  usleep(500);
555  return ret;
556 }
557 
570  struct image *firmware_image, int section_index)
571 {
572  int addr, bytes_remaining, chunk_size;
573  uint8_t data[SECTION_BUFFERSIZE];
574  uint8_t *data_ptr = data;
575  uint16_t size;
576  size_t size_read;
577  int ret, transferred;
578 
579  size = (uint16_t)firmware_image->sections[section_index].size;
580  addr = (uint16_t)firmware_image->sections[section_index].base_address;
581 
582  LOG_DEBUG("section %02i at addr 0x%04x (size 0x%04" PRIx16 ")", section_index, addr,
583  size);
584 
585  /* Copy section contents to local buffer */
586  ret = image_read_section(firmware_image, section_index, 0, size, data,
587  &size_read);
588 
589  if (ret != ERROR_OK)
590  return ret;
591  if (size_read != size)
592  return ERROR_FAIL;
593 
594  bytes_remaining = size;
595 
596  /* Send section data in chunks of up to 64 bytes to ANGIE */
597  while (bytes_remaining > 0) {
598  if (bytes_remaining > 64)
599  chunk_size = 64;
600  else
601  chunk_size = bytes_remaining;
602 
603  ret = jtag_libusb_control_transfer(device->usb_device_handle,
604  (LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE),
605  REQUEST_FIRMWARE_LOAD, addr, FIRMWARE_ADDR, (char *)data_ptr,
606  chunk_size, LIBUSB_TIMEOUT_MS, &transferred);
607 
608  if (ret != ERROR_OK)
609  return ret;
610 
611  if (transferred != chunk_size) {
612  /* Abort if libusb sent less data than requested */
613  return ERROR_FAIL;
614  }
615 
616  bytes_remaining -= chunk_size;
617  addr += chunk_size;
618  data_ptr += chunk_size;
619  }
620 
621  return ERROR_OK;
622 }
623 
624 /************************** Generic helper functions **************************/
625 
632 static void angie_dump_signal_states(uint8_t input_signals, uint8_t output_signals)
633 {
634  LOG_INFO("ANGIE signal states: TDI: %i, TDO: %i, TMS: %i, TCK: %i, TRST: %i "
635  "SRST: %i",
636  (output_signals & SIGNAL_TDI ? 1 : 0),
637  (input_signals & SIGNAL_TDO ? 1 : 0),
638  (output_signals & SIGNAL_TMS ? 1 : 0),
639  (output_signals & SIGNAL_TCK ? 1 : 0),
640  (output_signals & SIGNAL_TRST ? 1 : 0),
641  (output_signals & SIGNAL_SRST ? 1 : 0));
642 }
643 
644 /**************** ANGIE command generation helper functions ***************/
645 
657 {
658  uint8_t *payload;
659 
660  payload = calloc(size, sizeof(uint8_t));
661 
662  if (!payload) {
663  LOG_ERROR("Could not allocate ANGIE command payload: out of memory");
664  return ERROR_FAIL;
665  }
666 
667  switch (direction) {
669  if (angie_cmd->payload_out) {
670  LOG_ERROR("BUG: Duplicate payload allocation for ANGIE command");
671  free(payload);
672  return ERROR_FAIL;
673  }
674  angie_cmd->payload_out = payload;
676  break;
679  LOG_ERROR("BUG: Duplicate payload allocation for ANGIE command");
680  free(payload);
681  return ERROR_FAIL;
682  }
683 
684  angie_cmd->payload_in_start = payload;
685  angie_cmd->payload_in = payload;
687 
688  /* By default, free payload_in_start in angie_clear_queue(). Commands
689  * that do not want this behavior (e. g. split scans) must turn it off
690  * separately! */
692 
693  break;
694  }
695 
696  return ERROR_OK;
697 }
698 
699 /****************** ANGIE command queue helper functions ******************/
700 
709 static int angie_get_queue_size(struct angie *device,
711 {
712  struct angie_cmd *current = device->queue_start;
713  int sum = 0;
714 
715  while (current) {
716  switch (direction) {
718  sum += current->payload_out_size + 1; /* + 1 byte for Command ID */
719  break;
721  sum += current->payload_in_size;
722  break;
723  }
724 
725  current = current->next;
726  }
727 
728  return sum;
729 }
730 
736 static void angie_clear_queue(struct angie *device)
737 {
738  struct angie_cmd *current = device->queue_start;
739  struct angie_cmd *next = NULL;
740 
741  while (current) {
742  /* Save pointer to next element */
743  next = current->next;
744 
745  /* Free payloads: OUT payload can be freed immediately */
746  free(current->payload_out);
747  current->payload_out = NULL;
748 
749  /* IN payload MUST be freed ONLY if no other commands use the
750  * payload_in_start buffer */
751  if (current->free_payload_in_start) {
752  free(current->payload_in_start);
753  current->payload_in_start = NULL;
754  current->payload_in = NULL;
755  }
756 
757  /* Free queue element */
758  free(current);
759 
760  /* Proceed with next element */
761  current = next;
762  }
763 
764  device->commands_in_queue = 0;
765  device->queue_start = NULL;
766  device->queue_end = NULL;
767 }
768 
778 static int angie_append_queue(struct angie *device, struct angie_cmd *angie_cmd)
779 {
780  int newsize_out, newsize_in;
781  int ret = ERROR_OK;
782 
785 
788 
789  /* Check if the current command can be appended to the queue */
790  if (newsize_out > 64 || newsize_in > 64) {
791  /* New command does not fit. Execute all commands in queue before starting
792  * new queue with the current command as first entry. */
794 
795  if (ret == ERROR_OK)
797 
798  if (ret == ERROR_OK)
800  }
801 
802  if (!device->queue_start) {
803  /* Queue was empty */
804  device->commands_in_queue = 1;
805 
806  device->queue_start = angie_cmd;
807  device->queue_end = angie_cmd;
808  } else {
809  /* There are already commands in the queue */
810  device->commands_in_queue++;
811 
812  device->queue_end->next = angie_cmd;
813  device->queue_end = angie_cmd;
814  }
815 
816  if (ret != ERROR_OK)
818 
819  return ret;
820 }
821 
830 static int angie_execute_queued_commands(struct angie *device, int timeout_ms)
831 {
832  struct angie_cmd *current;
833  int ret, i, index_out, index_in, count_out, count_in, transferred;
834  uint8_t buffer[64];
835 
838 
839  index_out = 0;
840  count_out = 0;
841  count_in = 0;
842 
843  for (current = device->queue_start; current; current = current->next) {
844  /* Add command to packet */
845  buffer[index_out] = current->id;
846  index_out++;
847  count_out++;
848 
849  for (i = 0; i < current->payload_out_size; i++)
850  buffer[index_out + i] = current->payload_out[i];
851  index_out += current->payload_out_size;
852  count_in += current->payload_in_size;
853  count_out += current->payload_out_size;
854  }
855 
856  /* Send packet to ANGIE */
857  ret = jtag_libusb_bulk_write(device->usb_device_handle, device->ep_out,
858  (char *)buffer, count_out, timeout_ms, &transferred);
859  if (ret != ERROR_OK) {
860  LOG_ERROR("Libusb bulk write queued commands failed.");
861  return ret;
862  }
863  if (transferred != count_out) {
864  LOG_ERROR("Libusb bulk write queued commands failed: transferred byte count");
865  return ERROR_FAIL;
866  }
867 
868  /* Wait for response if commands contain IN payload data */
869  if (count_in > 0) {
870  ret = jtag_libusb_bulk_write(device->usb_device_handle, device->ep_in,
871  (char *)buffer, count_in, timeout_ms, &transferred);
872  if (ret != ERROR_OK) {
873  LOG_ERROR("Libusb bulk write input payload data failed");
874  return ret;
875  }
876  if (transferred != count_in) {
877  LOG_ERROR("Libusb bulk write input payload data failed: transferred byte count");
878  return ERROR_FAIL;
879  }
880 
881  /* Write back IN payload data */
882  index_in = 0;
883  for (current = device->queue_start; current; current = current->next) {
884  for (i = 0; i < current->payload_in_size; i++) {
885  current->payload_in[i] = buffer[index_in];
886  index_in++;
887  }
888  }
889  }
890  return ERROR_OK;
891 }
892 
899 static const char *angie_cmd_id_string(uint8_t id)
900 {
901  switch (id) {
902  case CMD_SCAN_IN:
903  return "CMD_SCAN_IN";
904  case CMD_SLOW_SCAN_IN:
905  return "CMD_SLOW_SCAN_IN";
906  case CMD_SCAN_OUT:
907  return "CMD_SCAN_OUT";
908  case CMD_SLOW_SCAN_OUT:
909  return "CMD_SLOW_SCAN_OUT";
910  case CMD_SCAN_IO:
911  return "CMD_SCAN_IO";
912  case CMD_SLOW_SCAN_IO:
913  return "CMD_SLOW_SCAN_IO";
914  case CMD_CLOCK_TMS:
915  return "CMD_CLOCK_TMS";
916  case CMD_SLOW_CLOCK_TMS:
917  return "CMD_SLOW_CLOCK_TMS";
918  case CMD_CLOCK_TCK:
919  return "CMD_CLOCK_TCK";
920  case CMD_SLOW_CLOCK_TCK:
921  return "CMD_SLOW_CLOCK_TCK";
922  case CMD_SLEEP_US:
923  return "CMD_SLEEP_US";
924  case CMD_SLEEP_MS:
925  return "CMD_SLEEP_MS";
926  case CMD_GET_SIGNALS:
927  return "CMD_GET_SIGNALS";
928  case CMD_SET_SIGNALS:
929  return "CMD_SET_SIGNALS";
931  return "CMD_CONFIGURE_TCK_FREQ";
932  case CMD_SET_LEDS:
933  return "CMD_SET_LEDS";
934  case CMD_TEST:
935  return "CMD_TEST";
936  default:
937  return "CMD_UNKNOWN";
938  }
939 }
940 
947 {
948  char hex[64 * 3];
949  for (int i = 0; i < angie_cmd->payload_out_size; i++)
950  sprintf(hex + 3 * i, "%02" PRIX8 " ", angie_cmd->payload_out[i]);
951 
952  hex[3 * angie_cmd->payload_out_size - 1] = 0;
953  LOG_DEBUG_IO(" %-22s | OUT size = %" PRIi8 ", bytes = %s",
955 
956  LOG_DEBUG_IO("\n | IN size = %" PRIi8 "\n", angie_cmd->payload_in_size);
957 }
958 
964 static void angie_dump_queue(struct angie *device)
965 {
966  struct angie_cmd *current;
967 
968  LOG_DEBUG_IO("ANGIE command queue:\n");
969 
970  for (current = device->queue_start; current; current = current->next)
971  angie_dump_command(current);
972 }
973 
1005  int scan_size_bits, uint8_t *tdi, uint8_t *tdo_start, uint8_t *tdo,
1006  uint8_t tms_count_start, uint8_t tms_sequence_start, uint8_t tms_count_end,
1007  uint8_t tms_sequence_end, struct jtag_command *origin, bool postprocess)
1008 {
1009  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1010  int ret, i, scan_size_bytes;
1011  uint8_t bits_last_byte;
1012 
1013  if (!cmd)
1014  return ERROR_FAIL;
1015 
1016  /* Check size of command. USB buffer can hold 64 bytes, 1 byte is command ID,
1017  * 5 bytes are setup data -> 58 remaining payload bytes for TDI data */
1018  if (scan_size_bits > (58 * 8)) {
1019  LOG_ERROR("BUG: Tried to create CMD_SCAN_IO ANGIE command with too"
1020  " large payload");
1021  free(cmd);
1022  return ERROR_FAIL;
1023  }
1024 
1025  scan_size_bytes = DIV_ROUND_UP(scan_size_bits, 8);
1026 
1027  bits_last_byte = scan_size_bits % 8;
1028  if (bits_last_byte == 0)
1029  bits_last_byte = 8;
1030 
1031  /* Allocate out_payload depending on scan type */
1032  switch (scan_type) {
1033  case SCAN_IN:
1034  if (device->delay_scan_in < 0)
1035  cmd->id = CMD_SCAN_IN;
1036  else
1037  cmd->id = CMD_SLOW_SCAN_IN;
1039  break;
1040  case SCAN_OUT:
1041  if (device->delay_scan_out < 0)
1042  cmd->id = CMD_SCAN_OUT;
1043  else
1044  cmd->id = CMD_SLOW_SCAN_OUT;
1045  ret = angie_allocate_payload(cmd, scan_size_bytes + 5, PAYLOAD_DIRECTION_OUT);
1046  break;
1047  case SCAN_IO:
1048  if (device->delay_scan_io < 0)
1049  cmd->id = CMD_SCAN_IO;
1050  else
1051  cmd->id = CMD_SLOW_SCAN_IO;
1052  ret = angie_allocate_payload(cmd, scan_size_bytes + 5, PAYLOAD_DIRECTION_OUT);
1053  break;
1054  default:
1055  LOG_ERROR("BUG: 'append scan cmd' encountered an unknown scan type");
1056  ret = ERROR_FAIL;
1057  break;
1058  }
1059 
1060  if (ret != ERROR_OK) {
1061  free(cmd);
1062  return ret;
1063  }
1064 
1065  /* Build payload_out that is common to all scan types */
1066  cmd->payload_out[0] = scan_size_bytes & 0xFF;
1067  cmd->payload_out[1] = bits_last_byte & 0xFF;
1068  cmd->payload_out[2] = ((tms_count_start & 0x0F) << 4) | (tms_count_end & 0x0F);
1069  cmd->payload_out[3] = tms_sequence_start;
1070  cmd->payload_out[4] = tms_sequence_end;
1071 
1072  /* Setup payload_out for types with OUT transfer */
1073  if (scan_type == SCAN_OUT || scan_type == SCAN_IO) {
1074  for (i = 0; i < scan_size_bytes; i++)
1075  cmd->payload_out[i + 5] = tdi[i];
1076  }
1077 
1078  /* Setup payload_in pointers for types with IN transfer */
1079  if (scan_type == SCAN_IN || scan_type == SCAN_IO) {
1080  cmd->payload_in_start = tdo_start;
1081  cmd->payload_in = tdo;
1082  cmd->payload_in_size = scan_size_bytes;
1083  }
1084 
1085  cmd->needs_postprocessing = postprocess;
1086  cmd->cmd_origin = origin;
1087 
1088  /* For scan commands, we free payload_in_start only when the command is
1089  * the last in a series of split commands or a stand-alone command */
1090  cmd->free_payload_in_start = postprocess;
1091 
1092  return angie_append_queue(device, cmd);
1093 }
1094 
1105 static int angie_append_clock_tms_cmd(struct angie *device, uint8_t count,
1106  uint8_t sequence)
1107 {
1108  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1109  int ret;
1110 
1111  if (!cmd) {
1112  LOG_ERROR("Out of memory");
1113  return ERROR_FAIL;
1114  }
1115 
1116  if (device->delay_clock_tms < 0)
1117  cmd->id = CMD_CLOCK_TMS;
1118  else
1119  cmd->id = CMD_SLOW_CLOCK_TMS;
1120 
1121  /* CMD_CLOCK_TMS has two OUT payload bytes and zero IN payload bytes */
1123  if (ret != ERROR_OK) {
1124  free(cmd);
1125  return ret;
1126  }
1127 
1128  cmd->payload_out[0] = count;
1129  cmd->payload_out[1] = sequence;
1130 
1131  return angie_append_queue(device, cmd);
1132 }
1133 
1144 static int angie_append_clock_tck_cmd(struct angie *device, uint16_t count)
1145 {
1146  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1147  int ret;
1148 
1149  if (!cmd) {
1150  LOG_ERROR("Out of memory");
1151  return ERROR_FAIL;
1152  }
1153 
1154  if (device->delay_clock_tck < 0)
1155  cmd->id = CMD_CLOCK_TCK;
1156  else
1157  cmd->id = CMD_SLOW_CLOCK_TCK;
1158 
1159  /* CMD_CLOCK_TCK has two OUT payload bytes and zero IN payload bytes */
1161  if (ret != ERROR_OK) {
1162  free(cmd);
1163  return ret;
1164  }
1165 
1166  cmd->payload_out[0] = count & 0xff;
1167  cmd->payload_out[1] = (count >> 8) & 0xff;
1168 
1169  return angie_append_queue(device, cmd);
1170 }
1171 
1180 {
1181  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1182  int ret;
1183 
1184  if (!cmd) {
1185  LOG_ERROR("Out of memory");
1186  return ERROR_FAIL;
1187  }
1188 
1189  cmd->id = CMD_GET_SIGNALS;
1190  cmd->needs_postprocessing = true;
1191 
1192  /* CMD_GET_SIGNALS has two IN payload bytes */
1194 
1195  if (ret != ERROR_OK) {
1196  free(cmd);
1197  return ret;
1198  }
1199 
1200  return angie_append_queue(device, cmd);
1201 }
1202 
1220 static int angie_append_set_signals_cmd(struct angie *device, uint8_t low,
1221  uint8_t high)
1222 {
1223  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1224  int ret;
1225 
1226  if (!cmd) {
1227  LOG_ERROR("Out of memory");
1228  return ERROR_FAIL;
1229  }
1230 
1231  cmd->id = CMD_SET_SIGNALS;
1232 
1233  /* CMD_SET_SIGNALS has two OUT payload bytes and zero IN payload bytes */
1235 
1236  if (ret != ERROR_OK) {
1237  free(cmd);
1238  return ret;
1239  }
1240 
1241  cmd->payload_out[0] = low;
1242  cmd->payload_out[1] = high;
1243 
1244  return angie_append_queue(device, cmd);
1245 }
1246 
1255 static int angie_append_sleep_cmd(struct angie *device, uint32_t us)
1256 {
1257  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1258  int ret;
1259 
1260  if (!cmd) {
1261  LOG_ERROR("Out of memory");
1262  return ERROR_FAIL;
1263  }
1264 
1265  cmd->id = CMD_SLEEP_US;
1266 
1267  /* CMD_SLEEP_US has two OUT payload bytes and zero IN payload bytes */
1269 
1270  if (ret != ERROR_OK) {
1271  free(cmd);
1272  return ret;
1273  }
1274 
1275  cmd->payload_out[0] = us & 0x00ff;
1276  cmd->payload_out[1] = (us >> 8) & 0x00ff;
1277 
1278  return angie_append_queue(device, cmd);
1279 }
1280 
1294  int delay_scan_out, int delay_scan_io, int delay_tck, int delay_tms)
1295 {
1296  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1297  int ret;
1298 
1299  if (!cmd) {
1300  LOG_ERROR("Out of memory");
1301  return ERROR_FAIL;
1302  }
1303 
1305 
1306  /* CMD_CONFIGURE_TCK_FREQ has five OUT payload bytes and zero
1307  * IN payload bytes */
1309  if (ret != ERROR_OK) {
1310  free(cmd);
1311  return ret;
1312  }
1313 
1314  if (delay_scan_in < 0)
1315  cmd->payload_out[0] = 0;
1316  else
1317  cmd->payload_out[0] = (uint8_t)delay_scan_in;
1318 
1319  if (delay_scan_out < 0)
1320  cmd->payload_out[1] = 0;
1321  else
1322  cmd->payload_out[1] = (uint8_t)delay_scan_out;
1323 
1324  if (delay_scan_io < 0)
1325  cmd->payload_out[2] = 0;
1326  else
1327  cmd->payload_out[2] = (uint8_t)delay_scan_io;
1328 
1329  if (delay_tck < 0)
1330  cmd->payload_out[3] = 0;
1331  else
1332  cmd->payload_out[3] = (uint8_t)delay_tck;
1333 
1334  if (delay_tms < 0)
1335  cmd->payload_out[4] = 0;
1336  else
1337  cmd->payload_out[4] = (uint8_t)delay_tms;
1338 
1339  return angie_append_queue(device, cmd);
1340 }
1341 
1351 {
1352  struct angie_cmd *cmd = calloc(1, sizeof(struct angie_cmd));
1353  int ret;
1354 
1355  if (!cmd) {
1356  LOG_ERROR("Out of memory");
1357  return ERROR_FAIL;
1358  }
1359 
1360  cmd->id = CMD_TEST;
1361 
1362  /* CMD_TEST has one OUT payload byte and zero IN payload bytes */
1364  if (ret != ERROR_OK) {
1365  free(cmd);
1366  return ret;
1367  }
1368 
1369  cmd->payload_out[0] = 0xAA;
1370 
1371  return angie_append_queue(device, cmd);
1372 }
1373 
1374 /****************** ANGIE TCK frequency helper functions ******************/
1375 
1408 static int angie_calculate_delay(enum angie_delay_type type, long f, int *delay)
1409 {
1410  float t_us, x, x_ceil;
1411 
1412  /* Calculate period of requested TCK frequency */
1413  t_us = 1000000.0 / f;
1414 
1415  switch (type) {
1416  case DELAY_CLOCK_TCK:
1417  x = (t_us - 6.0) / 4;
1418  break;
1419  case DELAY_CLOCK_TMS:
1420  x = (t_us - 8.5) / 4;
1421  break;
1422  case DELAY_SCAN_IN:
1423  x = (t_us - 8.8308) / 4;
1424  break;
1425  case DELAY_SCAN_OUT:
1426  x = (t_us - 10.527) / 4;
1427  break;
1428  case DELAY_SCAN_IO:
1429  x = (t_us - 13.132) / 4;
1430  break;
1431  default:
1432  return ERROR_FAIL;
1433  break;
1434  }
1435 
1436  /* Check if the delay value is negative. This happens when a frequency is
1437  * requested that is too high for the delay loop implementation. In this
1438  * case, set delay value to zero. */
1439  if (x < 0)
1440  x = 0;
1441 
1442  /* We need to convert the exact delay value to an integer. Therefore, we
1443  * round the exact value UP to ensure that the resulting frequency is NOT
1444  * higher than the requested frequency. */
1445  x_ceil = ceilf(x);
1446 
1447  /* Check if the value is within limits */
1448  if (x_ceil > 255)
1449  return ERROR_FAIL;
1450 
1451  *delay = (int)x_ceil;
1452 
1453  return ERROR_OK;
1454 }
1455 
1469 {
1470  float t_us, f_float;
1471 
1472  if (delay > 255)
1473  return 0;
1474 
1475  switch (type) {
1476  case DELAY_CLOCK_TCK:
1477  if (delay < 0)
1478  t_us = 2.666;
1479  else
1480  t_us = (4.0 * delay) + 6.0;
1481  break;
1482  case DELAY_CLOCK_TMS:
1483  if (delay < 0)
1484  t_us = 5.666;
1485  else
1486  t_us = (4.0 * delay) + 8.5;
1487  break;
1488  case DELAY_SCAN_IN:
1489  if (delay < 0)
1490  t_us = 5.5;
1491  else
1492  t_us = (4.0 * delay) + 8.8308;
1493  break;
1494  case DELAY_SCAN_OUT:
1495  if (delay < 0)
1496  t_us = 7.0;
1497  else
1498  t_us = (4.0 * delay) + 10.527;
1499  break;
1500  case DELAY_SCAN_IO:
1501  if (delay < 0)
1502  t_us = 9.926;
1503  else
1504  t_us = (4.0 * delay) + 13.132;
1505  break;
1506  default:
1507  return 0;
1508  }
1509 
1510  f_float = 1000000.0 / t_us;
1511  return roundf(f_float);
1512 }
1513 
1514 /******************* Interface between ANGIE and OpenOCD ******************/
1515 
1522 static void angie_set_end_state(tap_state_t endstate)
1523 {
1524  if (tap_is_state_stable(endstate))
1525  tap_set_end_state(endstate);
1526  else
1527  LOG_ERROR("BUG: %s is not a valid end state", tap_state_name(endstate));
1528 }
1529 
1538 {
1539  uint8_t tms_sequence, tms_count;
1540  int ret;
1541 
1542  if (tap_get_state() == tap_get_end_state()) {
1543  /* Do nothing if we are already there */
1544  return ERROR_OK;
1545  }
1546 
1547  tms_sequence = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1549 
1550  ret = angie_append_clock_tms_cmd(device, tms_count, tms_sequence);
1551 
1552  if (ret == ERROR_OK)
1554 
1555  return ret;
1556 }
1557 
1566 static int angie_queue_scan(struct angie *device, struct jtag_command *cmd)
1567 {
1568  uint32_t scan_size_bits, scan_size_bytes, bits_last_scan;
1569  uint32_t scans_max_payload, bytecount;
1570  uint8_t *tdi_buffer_start = NULL, *tdi_buffer = NULL;
1571  uint8_t *tdo_buffer_start = NULL, *tdo_buffer = NULL;
1572 
1573  uint8_t first_tms_count, first_tms_sequence;
1574  uint8_t last_tms_count, last_tms_sequence;
1575 
1576  uint8_t tms_count_pause, tms_sequence_pause;
1577  uint8_t tms_count_resume, tms_sequence_resume;
1578 
1579  uint8_t tms_count_start, tms_sequence_start;
1580  uint8_t tms_count_end, tms_sequence_end;
1581 
1582  enum scan_type type;
1583  int ret;
1584 
1585  /* Determine scan size */
1586  scan_size_bits = jtag_scan_size(cmd->cmd.scan);
1587  scan_size_bytes = DIV_ROUND_UP(scan_size_bits, 8);
1588 
1589  /* Determine scan type (IN/OUT/IO) */
1590  type = jtag_scan_type(cmd->cmd.scan);
1591 
1592  /* Determine number of scan commands with maximum payload */
1593  scans_max_payload = scan_size_bytes / 58;
1594 
1595  /* Determine size of last shift command */
1596  bits_last_scan = scan_size_bits - (scans_max_payload * 58 * 8);
1597 
1598  /* Allocate TDO buffer if required */
1599  if (type == SCAN_IN || type == SCAN_IO) {
1600  tdo_buffer_start = calloc(scan_size_bytes, sizeof(uint8_t));
1601 
1602  if (!tdo_buffer_start)
1603  return ERROR_FAIL;
1604 
1605  tdo_buffer = tdo_buffer_start;
1606  }
1607 
1608  /* Fill TDI buffer if required */
1609  if (type == SCAN_OUT || type == SCAN_IO) {
1610  jtag_build_buffer(cmd->cmd.scan, &tdi_buffer_start);
1611  tdi_buffer = tdi_buffer_start;
1612  }
1613 
1614  /* Get TAP state transitions */
1615  if (cmd->cmd.scan->ir_scan) {
1617  first_tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1618  first_tms_sequence = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1619 
1621  tap_set_end_state(cmd->cmd.scan->end_state);
1622  last_tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1623  last_tms_sequence = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1624 
1625  /* TAP state transitions for split scans */
1626  tms_count_pause = tap_get_tms_path_len(TAP_IRSHIFT, TAP_IRPAUSE);
1627  tms_sequence_pause = tap_get_tms_path(TAP_IRSHIFT, TAP_IRPAUSE);
1628  tms_count_resume = tap_get_tms_path_len(TAP_IRPAUSE, TAP_IRSHIFT);
1629  tms_sequence_resume = tap_get_tms_path(TAP_IRPAUSE, TAP_IRSHIFT);
1630  } else {
1632  first_tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1633  first_tms_sequence = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1634 
1636  tap_set_end_state(cmd->cmd.scan->end_state);
1637  last_tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
1638  last_tms_sequence = tap_get_tms_path(tap_get_state(), tap_get_end_state());
1639 
1640  /* TAP state transitions for split scans */
1641  tms_count_pause = tap_get_tms_path_len(TAP_DRSHIFT, TAP_DRPAUSE);
1642  tms_sequence_pause = tap_get_tms_path(TAP_DRSHIFT, TAP_DRPAUSE);
1643  tms_count_resume = tap_get_tms_path_len(TAP_DRPAUSE, TAP_DRSHIFT);
1644  tms_sequence_resume = tap_get_tms_path(TAP_DRPAUSE, TAP_DRSHIFT);
1645  }
1646 
1647  /* Generate scan commands */
1648  bytecount = scan_size_bytes;
1649  while (bytecount > 0) {
1650  if (bytecount == scan_size_bytes) {
1651  /* This is the first scan */
1652  tms_count_start = first_tms_count;
1653  tms_sequence_start = first_tms_sequence;
1654  } else {
1655  /* Resume from previous scan */
1656  tms_count_start = tms_count_resume;
1657  tms_sequence_start = tms_sequence_resume;
1658  }
1659 
1660  if (bytecount > 58) { /* Full scan, at least one scan will follow */
1661  tms_count_end = tms_count_pause;
1662  tms_sequence_end = tms_sequence_pause;
1663 
1665  type,
1666  58 * 8,
1667  tdi_buffer,
1668  tdo_buffer_start,
1669  tdo_buffer,
1670  tms_count_start,
1671  tms_sequence_start,
1672  tms_count_end,
1673  tms_sequence_end,
1674  cmd,
1675  false);
1676 
1677  bytecount -= 58;
1678 
1679  /* Update TDI and TDO buffer pointers */
1680  if (tdi_buffer_start)
1681  tdi_buffer += 58;
1682  if (tdo_buffer_start)
1683  tdo_buffer += 58;
1684  } else if (bytecount == 58) { /* Full scan, no further scans */
1685  tms_count_end = last_tms_count;
1686  tms_sequence_end = last_tms_sequence;
1687 
1689  type,
1690  58 * 8,
1691  tdi_buffer,
1692  tdo_buffer_start,
1693  tdo_buffer,
1694  tms_count_start,
1695  tms_sequence_start,
1696  tms_count_end,
1697  tms_sequence_end,
1698  cmd,
1699  true);
1700 
1701  bytecount = 0;
1702  } else {/* Scan with less than maximum payload, no further scans */
1703  tms_count_end = last_tms_count;
1704  tms_sequence_end = last_tms_sequence;
1705 
1707  type,
1708  bits_last_scan,
1709  tdi_buffer,
1710  tdo_buffer_start,
1711  tdo_buffer,
1712  tms_count_start,
1713  tms_sequence_start,
1714  tms_count_end,
1715  tms_sequence_end,
1716  cmd,
1717  true);
1718 
1719  bytecount = 0;
1720  }
1721 
1722  if (ret != ERROR_OK) {
1723  free(tdi_buffer_start);
1724  free(tdo_buffer_start);
1725  return ret;
1726  }
1727  }
1728 
1729  free(tdi_buffer_start);
1730 
1731  /* Set current state to the end state requested by the command */
1732  tap_set_state(cmd->cmd.scan->end_state);
1733 
1734  return ERROR_OK;
1735 }
1736 
1745 static int angie_queue_tlr_reset(struct angie *device, struct jtag_command *cmd)
1746 {
1747  int ret = angie_append_clock_tms_cmd(device, 5, 0xff);
1748 
1749  if (ret == ERROR_OK)
1751 
1752  return ret;
1753 }
1754 
1766 static int angie_queue_runtest(struct angie *device, struct jtag_command *cmd)
1767 {
1768  int ret;
1769 
1770  /* Only perform statemove if the TAP currently isn't in the TAP_IDLE state */
1771  if (tap_get_state() != TAP_IDLE) {
1774  }
1775 
1776  /* Generate the clock cycles */
1777  ret = angie_append_clock_tck_cmd(device, cmd->cmd.runtest->num_cycles);
1778  if (ret != ERROR_OK)
1779  return ret;
1780 
1781  /* Move to end state specified in command */
1782  if (cmd->cmd.runtest->end_state != tap_get_state()) {
1783  tap_set_end_state(cmd->cmd.runtest->end_state);
1785  }
1786 
1787  return ERROR_OK;
1788 }
1789 
1799 static int angie_reset(int trst, int srst)
1800 {
1801  struct angie *device = angie_handle;
1802  uint8_t low = 0, high = 0;
1803 
1804  if (trst) {
1806  low |= SIGNAL_TRST;
1807  } else {
1808  high |= SIGNAL_TRST;
1809  }
1810 
1811  if (srst)
1812  low |= SIGNAL_SRST;
1813  else
1814  high |= SIGNAL_SRST;
1815 
1816  int ret = angie_append_set_signals_cmd(device, low, high);
1817  if (ret != ERROR_OK)
1818  return ret;
1819 
1821  if (ret != ERROR_OK)
1822  return ret;
1823 
1825 
1826  return ERROR_OK;
1827 }
1828 
1837 static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd)
1838 {
1839  int ret, state_count;
1840  tap_state_t *path;
1841  uint8_t tms_sequence;
1842 
1843  unsigned int num_states = cmd->cmd.pathmove->num_states;
1844  path = cmd->cmd.pathmove->path;
1845  state_count = 0;
1846 
1847  while (num_states > 0) {
1848  unsigned int batch_size;
1849 
1850  tms_sequence = 0;
1851 
1852  /* Determine batch size */
1853  if (num_states >= 8)
1854  batch_size = 8;
1855  else
1856  batch_size = num_states;
1857 
1858  for (unsigned int i = 0; i < batch_size; i++) {
1859  if (tap_state_transition(tap_get_state(), false) == path[state_count]) {
1860  /* Append '0' transition: clear bit 'i' in tms_sequence */
1861  buf_set_u32(&tms_sequence, i, 1, 0x0);
1862  } else if (tap_state_transition(tap_get_state(), true)
1863  == path[state_count]) {
1864  /* Append '1' transition: set bit 'i' in tms_sequence */
1865  buf_set_u32(&tms_sequence, i, 1, 0x1);
1866  } else {
1867  /* Invalid state transition */
1868  LOG_ERROR("BUG: %s -> %s isn't a valid TAP state transition",
1870  tap_state_name(path[state_count]));
1871  return ERROR_FAIL;
1872  }
1873 
1874  tap_set_state(path[state_count]);
1875  state_count++;
1876  num_states--;
1877  }
1878 
1879  /* Append CLOCK_TMS command to ANGIE command queue */
1880  LOG_INFO("pathmove batch: count = %i, sequence = 0x%" PRIx8 "", batch_size, tms_sequence);
1881  ret = angie_append_clock_tms_cmd(angie_handle, batch_size, tms_sequence);
1882  if (ret != ERROR_OK)
1883  return ret;
1884  }
1885 
1886  return ERROR_OK;
1887 }
1888 
1897 static int angie_queue_sleep(struct angie *device, struct jtag_command *cmd)
1898 {
1899  /* IMPORTANT! Due to the time offset in command execution introduced by
1900  * command queueing, this needs to be implemented in the ANGIE device */
1901  return angie_append_sleep_cmd(device, cmd->cmd.sleep->us);
1902 }
1903 
1911 {
1912  int ret;
1913 
1915  LOG_ERROR("JTAG_STABLECLOCKS: state not stable");
1916  return ERROR_FAIL;
1917  }
1918 
1919  unsigned int num_cycles = cmd->cmd.stableclocks->num_cycles;
1920 
1921  /* TMS stays either high (Test Logic Reset state) or low (all other states) */
1922  if (tap_get_state() == TAP_RESET)
1924  else
1926 
1927  if (ret != ERROR_OK)
1928  return ret;
1929 
1930  while (num_cycles > 0) {
1931  if (num_cycles > 0xFFFF) {
1932  /* ANGIE CMD_CLOCK_TCK can generate up to 0xFFFF (uint16_t) cycles */
1933  ret = angie_append_clock_tck_cmd(device, 0xFFFF);
1934  num_cycles -= 0xFFFF;
1935  } else {
1936  ret = angie_append_clock_tck_cmd(device, num_cycles);
1937  num_cycles = 0;
1938  }
1939 
1940  if (ret != ERROR_OK)
1941  return ret;
1942  }
1943 
1944  return ERROR_OK;
1945 }
1946 
1955 {
1956  struct jtag_command *cmd = angie_cmd->cmd_origin;
1957  int ret;
1958 
1959  switch (jtag_scan_type(cmd->cmd.scan)) {
1960  case SCAN_IN:
1961  case SCAN_IO:
1962  ret = jtag_read_buffer(angie_cmd->payload_in_start, cmd->cmd.scan);
1963  break;
1964  case SCAN_OUT:
1965  /* Nothing to do for OUT scans */
1966  ret = ERROR_OK;
1967  break;
1968  default:
1969  LOG_ERROR("BUG: angie post process scan encountered an unknown JTAG scan type");
1970  ret = ERROR_FAIL;
1971  break;
1972  }
1973 
1974  return ret;
1975 }
1976 
1985 {
1986  struct angie_cmd *current;
1987  struct jtag_command *openocd_cmd;
1988  int ret;
1989 
1990  current = device->queue_start;
1991 
1992  while (current) {
1993  openocd_cmd = current->cmd_origin;
1994 
1995  /* Check if a corresponding OpenOCD command is stored for this
1996  * ANGIE command */
1997  if (current->needs_postprocessing && openocd_cmd) {
1998  switch (openocd_cmd->type) {
1999  case JTAG_SCAN:
2000  ret = angie_post_process_scan(current);
2001  break;
2002  case JTAG_TLR_RESET:
2003  case JTAG_RUNTEST:
2004  case JTAG_PATHMOVE:
2005  case JTAG_SLEEP:
2006  case JTAG_STABLECLOCKS:
2007  /* Nothing to do for these commands */
2008  ret = ERROR_OK;
2009  break;
2010  default:
2011  ret = ERROR_FAIL;
2012  LOG_ERROR("BUG: angie post process queue encountered unknown JTAG "
2013  "command type");
2014  break;
2015  }
2016 
2017  if (ret != ERROR_OK)
2018  return ret;
2019  }
2020 
2021  current = current->next;
2022  }
2023 
2024  return ERROR_OK;
2025 }
2026 
2027 /**************************** JTAG driver functions ***************************/
2028 
2041 static int angie_execute_queue(struct jtag_command *cmd_queue)
2042 {
2043  struct jtag_command *cmd = cmd_queue;
2044  int ret;
2045 
2046  while (cmd) {
2047  switch (cmd->type) {
2048  case JTAG_SCAN:
2050  break;
2051  case JTAG_TLR_RESET:
2053  break;
2054  case JTAG_RUNTEST:
2056  break;
2057  case JTAG_PATHMOVE:
2059  break;
2060  case JTAG_SLEEP:
2062  break;
2063  case JTAG_STABLECLOCKS:
2065  break;
2066  default:
2067  ret = ERROR_FAIL;
2068  LOG_ERROR("BUG: encountered unknown JTAG command type");
2069  break;
2070  }
2071 
2072  if (ret != ERROR_OK)
2073  return ret;
2074 
2075  cmd = cmd->next;
2076  }
2077 
2078  if (angie_handle->commands_in_queue > 0) {
2080  if (ret != ERROR_OK)
2081  return ret;
2082 
2084  if (ret != ERROR_OK)
2085  return ret;
2086 
2088  }
2089 
2090  return ERROR_OK;
2091 }
2092 
2101 static int angie_khz(int khz, int *jtag_speed)
2102 {
2103  int ret;
2104 
2105  if (khz == 0) {
2106  LOG_ERROR("RCLK not supported");
2107  return ERROR_FAIL;
2108  }
2109 
2110  /* CLOCK_TCK commands are decoupled from others. Therefore, the frequency
2111  * setting can be done independently from all other commands. */
2112  if (khz >= 375) {
2114  } else {
2115  ret = angie_calculate_delay(DELAY_CLOCK_TCK, khz * 1000,
2117  if (ret != ERROR_OK)
2118  return ret;
2119  }
2120 
2121  /* SCAN_{IN,OUT,IO} commands invoke CLOCK_TMS commands. Therefore, if the
2122  * requested frequency goes below the maximum frequency for SLOW_CLOCK_TMS
2123  * commands, all SCAN commands MUST also use the variable frequency
2124  * implementation! */
2125  if (khz >= 176) {
2130  } else {
2131  ret = angie_calculate_delay(DELAY_CLOCK_TMS, khz * 1000,
2133  if (ret != ERROR_OK)
2134  return ret;
2135 
2136  ret = angie_calculate_delay(DELAY_SCAN_IN, khz * 1000,
2138  if (ret != ERROR_OK)
2139  return ret;
2140 
2141  ret = angie_calculate_delay(DELAY_SCAN_OUT, khz * 1000,
2143  if (ret != ERROR_OK)
2144  return ret;
2145 
2146  ret = angie_calculate_delay(DELAY_SCAN_IO, khz * 1000,
2148  if (ret != ERROR_OK)
2149  return ret;
2150  }
2151 
2152  LOG_DEBUG_IO("ANGIE TCK setup: delay_tck = %i (%li Hz),",
2155  LOG_DEBUG_IO(" delay_tms = %i (%li Hz),",
2158  LOG_DEBUG_IO(" delay_scan_in = %i (%li Hz),",
2161  LOG_DEBUG_IO(" delay_scan_out = %i (%li Hz),",
2164  LOG_DEBUG_IO(" delay_scan_io = %i (%li Hz),",
2167 
2168  /* Configure the ANGIE device with the new delay values */
2175 
2176  if (ret != ERROR_OK)
2177  return ret;
2178 
2179  *jtag_speed = khz;
2180 
2181  return ERROR_OK;
2182 }
2183 
2196 static int angie_speed(int speed)
2197 {
2198  int dummy;
2199 
2200  return angie_khz(speed, &dummy);
2201 }
2202 
2216 static int angie_speed_div(int speed, int *khz)
2217 {
2218  *khz = speed;
2219 
2220  return ERROR_OK;
2221 }
2222 
2230 static int angie_init(void)
2231 {
2232  int ret, transferred;
2233  char str_manufacturer[20];
2234  bool download_firmware = false;
2235  char dummy[64];
2236  uint8_t input_signals, output_signals;
2237 
2238  angie_handle = calloc(1, sizeof(struct angie));
2239 
2240  if (!angie_handle) {
2241  LOG_ERROR("Out of memory");
2242  return ERROR_FAIL;
2243  }
2244 
2246  if (ret != ERROR_OK) {
2247  free(angie_handle);
2248  angie_handle = NULL;
2249  return ret;
2250  }
2251 
2252  /* Get String Descriptor to determine if firmware needs to be loaded */
2253  ret = libusb_get_string_descriptor_ascii(angie_handle->usb_device_handle, 1, (unsigned char *)str_manufacturer, 20);
2254  if (ret < 0) {
2255  /* Could not get descriptor -> Unconfigured or original Keil firmware */
2256  download_firmware = true;
2257  } else {
2258  /* We got a String Descriptor, check if it is the correct one */
2259  if (strncmp(str_manufacturer, "NanoXplore, SAS.", 16) != 0)
2260  download_firmware = true;
2261  }
2262 
2263  if (download_firmware) {
2264  LOG_INFO("Loading ANGIE firmware. This is reversible by power-cycling ANGIE device.");
2265  if (libusb_claim_interface(angie_handle->usb_device_handle, 0) != LIBUSB_SUCCESS) {
2266  LOG_ERROR("Could not claim interface 0");
2267  return ERROR_FAIL;
2268  }
2271  if (ret != ERROR_OK) {
2272  LOG_ERROR("Could not download firmware and re-numerate ANGIE");
2273  angie_quit();
2274  return ret;
2275  }
2277  if (ret != ERROR_OK) {
2278  LOG_ERROR("Could not download bitstream");
2279  angie_quit();
2280  return ret;
2281  }
2282  if (libusb_release_interface(angie_handle->usb_device_handle, 0) != LIBUSB_SUCCESS) {
2283  LOG_ERROR("Fail release interface 0");
2284  return ERROR_FAIL;
2285  }
2286  if (libusb_claim_interface(angie_handle->usb_device_handle, 1) != LIBUSB_SUCCESS) {
2287  LOG_ERROR("Could not claim interface 1");
2288  return ERROR_FAIL;
2289  }
2290  /* Configure io extender 23: all input */
2291  ret = angie_io_extender_config(angie_handle, 0x23, 0xFF);
2292  if (ret != ERROR_OK) {
2293  LOG_ERROR("Could not configure io extender 23");
2294  return ret;
2295  }
2296  if (libusb_release_interface(angie_handle->usb_device_handle, 1) != LIBUSB_SUCCESS) {
2297  LOG_ERROR("Fail release interface 1");
2298  return ERROR_FAIL;
2299  }
2300  } else {
2301  LOG_INFO("ANGIE device is already running ANGIE firmware");
2302  }
2303 
2304  /* Get ANGIE USB IN/OUT endpoints and claim the interface 0 */
2306  &angie_handle->ep_in, &angie_handle->ep_out, 0xFF, 0, 0, -1);
2307  if (ret != ERROR_OK) {
2308  LOG_ERROR("Choose and claim interface failed");
2309  angie_quit();
2310  return ret;
2311  }
2312 
2313  /* Initialize ANGIE command queue */
2315 
2316  /* Issue one test command with short timeout */
2318  if (ret != ERROR_OK) {
2319  LOG_ERROR("Append test command failed.");
2320  angie_quit();
2321  return ret;
2322  }
2323 
2325  if (ret != ERROR_OK) {
2326  /* Sending test command failed. The ANGIE device may be forever waiting for
2327  * the host to fetch an USB Bulk IN packet (e. g. OpenOCD crashed or was
2328  * shut down by the user via Ctrl-C. Try to retrieve this Bulk IN packet. */
2329 
2331  dummy, 64, 200, &transferred);
2332 
2333  if (ret != ERROR_OK || transferred == 0) {
2334  /* Bulk IN transfer failed -> unrecoverable error condition */
2335  LOG_ERROR("Cannot communicate with ANGIE device. Disconnect ANGIE from "
2336  "the USB port and re-connect, then re-run OpenOCD");
2337  angie_quit();
2338  return ERROR_FAIL;
2339  }
2340  /* Successfully received Bulk IN packet -> continue */
2341  LOG_INFO("Recovered from lost Bulk IN packet");
2342  }
2343 
2345 
2346  /* Execute get signals command */
2348  if (ret != ERROR_OK) {
2349  LOG_ERROR("Append get signals command failed");
2350  angie_quit();
2351  return ret;
2352  }
2354  if (ret != ERROR_OK) {
2355  LOG_ERROR("Execute get signals command failed");
2356  angie_quit();
2357  return ret;
2358  }
2359 
2360  /* Post-process the single CMD_GET_SIGNALS command */
2361  input_signals = angie_handle->queue_start->payload_in[0];
2362  output_signals = angie_handle->queue_start->payload_in[1];
2363  angie_dump_signal_states(input_signals, output_signals);
2364 
2366 
2367  return ERROR_OK;
2368 }
2369 
2376 static int angie_quit(void)
2377 {
2378  int ret = angie_usb_close(angie_handle);
2379  free(angie_handle);
2380  angie_handle = NULL;
2381 
2382  return ret;
2383 }
2384 
2385 static struct jtag_interface angie_interface = {
2387 };
2388 
2390  .name = "angie",
2391  .transports = jtag_only,
2392 
2393  .init = angie_init,
2394  .quit = angie_quit,
2395  .reset = angie_reset,
2396  .speed = angie_speed,
2397  .khz = angie_khz,
2398  .speed_div = angie_speed_div,
2399 
2400  .jtag_ops = &angie_interface,
2401 };
const char *const jtag_only[]
Definition: adapter.c:27
Definition of the commands supported by the ANGIE firmware.
#define CMD_CONFIGURE_TCK_FREQ
#define SIGNAL_TDI
#define SIGNAL_TMS
#define CMD_SLOW_CLOCK_TCK
#define CMD_SET_LEDS
#define CMD_SLOW_SCAN_IN
#define CMD_SLOW_SCAN_OUT
#define SIGNAL_SRST
#define CMD_SLOW_SCAN_IO
#define CMD_SCAN_OUT
#define CMD_GET_SIGNALS
#define CMD_SLEEP_MS
#define SIGNAL_TCK
#define SIGNAL_TRST
#define CMD_SCAN_IN
#define CMD_TEST
#define CMD_CLOCK_TCK
#define CMD_CLOCK_TMS
#define CMD_SCAN_IO
#define CMD_SLOW_CLOCK_TMS
#define CMD_SET_SIGNALS
#define SIGNAL_TDO
#define CMD_SLEEP_US
static int angie_usb_open(struct angie *device)
Opens the ANGIE device.
Definition: angie.c:257
#define SECTION_BUFFERSIZE
Maximum size of a single firmware section.
Definition: angie.c:69
static int angie_speed(int speed)
Set the TCK frequency of the ANGIE adapter.
Definition: angie.c:2196
static int angie_append_scan_cmd(struct angie *device, enum scan_type scan_type, int scan_size_bits, uint8_t *tdi, uint8_t *tdo_start, uint8_t *tdo, uint8_t tms_count_start, uint8_t tms_sequence_start, uint8_t tms_count_end, uint8_t tms_sequence_end, struct jtag_command *origin, bool postprocess)
static int angie_reset(int trst, int srst)
Execute a JTAG_RESET command.
Definition: angie.c:1799
static int angie_append_get_signals_cmd(struct angie *device)
Read JTAG signals.
Definition: angie.c:1179
#define CPUCS_REG
Address of EZ-USB ANGIE CPU Control & Status register.
Definition: angie.c:42
static int angie_init(void)
Initiates the firmware download to the ANGIE adapter and prepares the USB handle.
Definition: angie.c:2230
#define ANGIE_FIRMWARE_FILE
Default location of ANGIE firmware image.
Definition: angie.c:63
static int angie_queue_runtest(struct angie *device, struct jtag_command *cmd)
Run Test.
Definition: angie.c:1766
static int angie_append_configure_tck_cmd(struct angie *device, int delay_scan_in, int delay_scan_out, int delay_scan_io, int delay_tck, int delay_tms)
Set TCK delay counters.
Definition: angie.c:1293
static int angie_load_firmware(struct angie *device, const char *filename)
Downloads a firmware image to the ANGIE's EZ-USB microcontroller over the USB bus.
Definition: angie.c:367
#define CPU_START
Value to write into CPUCS to put EZ-USB ANGIE out of reset.
Definition: angie.c:51
static int angie_allocate_payload(struct angie_cmd *angie_cmd, int size, enum angie_payload_direction direction)
Allocate and initialize space in memory for ANGIE command payload.
Definition: angie.c:655
static int angie_execute_queue(struct jtag_command *cmd_queue)
Executes the JTAG Command Queue.
Definition: angie.c:2041
angie_delay_type
Definition: angie.c:84
@ DELAY_SCAN_IO
Definition: angie.c:89
@ DELAY_CLOCK_TMS
Definition: angie.c:86
@ DELAY_SCAN_IN
Definition: angie.c:87
@ DELAY_CLOCK_TCK
Definition: angie.c:85
@ DELAY_SCAN_OUT
Definition: angie.c:88
static void angie_dump_command(struct angie_cmd *angie_cmd)
Print one ANGIE command to stdout.
Definition: angie.c:946
static int angie_post_process_queue(struct angie *device)
Perform post-processing of commands after ANGIE queue has been executed.
Definition: angie.c:1984
struct adapter_driver angie_adapter_driver
Definition: angie.c:2389
#define REQUEST_FIRMWARE_LOAD
USB Control EP0 bRequest: "Firmware Load".
Definition: angie.c:45
static struct jtag_interface angie_interface
Definition: angie.c:2385
#define FIRMWARE_ADDR
Base address of firmware in EZ-USB ANGIE code space.
Definition: angie.c:54
static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd)
Move to one TAP state or several states in succession.
Definition: angie.c:1837
static void angie_dump_signal_states(uint8_t input_signals, uint8_t output_signals)
Print state of interesting signals via LOG_INFO().
Definition: angie.c:632
static int angie_append_test_cmd(struct angie *device)
Test command.
Definition: angie.c:1350
#define ANGIE_PID_5
Definition: angie.c:38
static int angie_khz(int khz, int *jtag_speed)
Set the TCK frequency of the ANGIE adapter.
Definition: angie.c:2101
static const char * angie_cmd_id_string(uint8_t id)
Convert an ANGIE command ID (id) to a human-readable string.
Definition: angie.c:899
static int angie_append_clock_tms_cmd(struct angie *device, uint8_t count, uint8_t sequence)
Perform TAP state transitions.
Definition: angie.c:1105
#define ANGIE_PID
USB Product ID of ANGIE device in unconfigured state (no firmware loaded yet) or with its firmware.
Definition: angie.c:34
static int angie_queue_sleep(struct angie *device, struct jtag_command *cmd)
Sleep for a specific amount of time.
Definition: angie.c:1897
static void angie_dump_queue(struct angie *device)
Print the ANGIE command queue to stdout.
Definition: angie.c:964
static int angie_append_clock_tck_cmd(struct angie *device, uint16_t count)
Generate a defined amount of TCK clock cycles.
Definition: angie.c:1144
#define ANGIE_PID_2
Definition: angie.c:35
#define ANGIE_PID_4
Definition: angie.c:37
static int angie_execute_queued_commands(struct angie *device, int timeout_ms)
Sends all queued ANGIE commands to the ANGIE for execution.
Definition: angie.c:830
static int angie_queue_tlr_reset(struct angie *device, struct jtag_command *cmd)
Move the TAP into the Test Logic Reset state.
Definition: angie.c:1745
static int angie_write_firmware_section(struct angie *device, struct image *firmware_image, int section_index)
Send one contiguous firmware section to the ANGIE's EZ-USB microcontroller over the USB bus.
Definition: angie.c:569
static int angie_post_process_scan(struct angie_cmd *angie_cmd)
Post-process JTAG_SCAN command.
Definition: angie.c:1954
#define ANGIE_VID
USB Vendor ID of ANGIE device in unconfigured state (no firmware loaded yet) or with its firmware.
Definition: angie.c:30
static void angie_clear_queue(struct angie *device)
Clear the ANGIE command queue.
Definition: angie.c:736
static struct angie * angie_handle
Definition: angie.c:246
static int angie_queue_scan(struct angie *device, struct jtag_command *cmd)
Perform a scan operation on a JTAG register.
Definition: angie.c:1566
angie_type
ANGIE hardware type.
Definition: angie.c:75
@ ANGIE
Definition: angie.c:76
static int angie_queue_statemove(struct angie *device)
Move from the current TAP state to the current TAP end state.
Definition: angie.c:1537
static int angie_get_queue_size(struct angie *device, enum angie_payload_direction direction)
Get the current number of bytes in the queue, including command IDs.
Definition: angie.c:709
#define ANGIE_RENUMERATION_DELAY_US
Delay (in microseconds) to wait while EZ-USB performs ReNumeration.
Definition: angie.c:60
static int angie_load_firmware_and_renumerate(struct angie *device, const char *filename, uint32_t delay_us)
Puts the ANGIE's EZ-USB microcontroller into reset state, downloads the firmware image,...
Definition: angie.c:327
static int angie_i2c_write(struct angie *device, uint8_t *i2c_data, uint8_t i2c_data_size)
Send an i2c write operation to dev-board components.
Definition: angie.c:502
static int angie_append_sleep_cmd(struct angie *device, uint32_t us)
Sleep for a pre-defined number of microseconds.
Definition: angie.c:1255
static int angie_calculate_delay(enum angie_delay_type type, long f, int *delay)
Calculate delay values for a given TCK frequency.
Definition: angie.c:1408
angie_payload_direction
Definition: angie.c:79
@ PAYLOAD_DIRECTION_OUT
Definition: angie.c:80
@ PAYLOAD_DIRECTION_IN
Definition: angie.c:81
static int angie_speed_div(int speed, int *khz)
Convert adapter-specific speed value to corresponding TCK frequency in kHz.
Definition: angie.c:2216
#define ANGIE_PID_3
Definition: angie.c:36
static int angie_quit(void)
Closes the USB handle for the ANGIE device.
Definition: angie.c:2376
static int angie_usb_close(struct angie *device)
Releases the ANGIE interface and closes the USB device handle.
Definition: angie.c:283
static long angie_calculate_frequency(enum angie_delay_type type, int delay)
Calculate frequency for a given delay value.
Definition: angie.c:1468
#define CPU_RESET
Value to write into CPUCS to put EZ-USB ANGIE into reset.
Definition: angie.c:48
static int angie_cpu_reset(struct angie *device, char reset_bit)
Writes '0' or '1' to the CPUCS register, putting the EZ-USB CPU into reset or out of reset.
Definition: angie.c:308
#define ANGIE_BITSTREAM_FILE
Default location of ANGIE firmware image.
Definition: angie.c:66
static int angie_append_set_signals_cmd(struct angie *device, uint8_t low, uint8_t high)
Arbitrarily set JTAG output signals.
Definition: angie.c:1220
static int angie_queue_stableclocks(struct angie *device, struct jtag_command *cmd)
Generate TCK cycles while remaining in a stable state.
Definition: angie.c:1910
static int angie_append_queue(struct angie *device, struct angie_cmd *angie_cmd)
Add a command to the ANGIE command queue.
Definition: angie.c:778
static void angie_set_end_state(tap_state_t endstate)
Sets the end state follower (see interface.h) if endstate is a stable state.
Definition: angie.c:1522
static int angie_io_extender_config(struct angie *device, uint8_t i2c_adr, uint8_t cfg_value)
Configure dev-board gpio extender modules by configuring their register 3 and register 1 responsible ...
Definition: angie.c:547
static int angie_load_bitstream(struct angie *device, const char *filename)
Downloads a bitstream file to the ANGIE's FPGA through the EZ-USB microcontroller over the USB bus.
Definition: angie.c:417
static uint8_t tdi_buffer[ARMJTAGEW_TAP_BUFFER_SIZE]
Definition: arm-jtag-ew.c:509
static uint8_t tdo_buffer[ARMJTAGEW_TAP_BUFFER_SIZE]
Definition: arm-jtag-ew.c:510
static const struct device_t * device
Definition: at91rm9200.c:94
static void buf_set_u32(uint8_t *_buffer, unsigned int first, unsigned int num, uint32_t value)
Sets num bits in _buffer, starting at the first bit, using the bits in value.
Definition: binarybuffer.h:34
unsigned int jtag_scan_size(const struct scan_command *cmd)
Definition: commands.c:181
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
@ SCAN_IN
From device to host,.
Definition: commands.h:24
@ SCAN_OUT
From host to device,.
Definition: commands.h:26
@ SCAN_IO
Full-duplex scan.
Definition: commands.h:28
@ 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
void delay_us(uint16_t delay)
Definition: delay.c:23
uint8_t type
Definition: esp_usb_jtag.c:0
static uint16_t direction
Definition: ftdi.c:120
void image_close(struct image *image)
Definition: image.c:1211
int image_read_section(struct image *image, int section, target_addr_t offset, uint32_t size, uint8_t *buffer, size_t *size_read)
Definition: image.c:1079
int image_open(struct image *image, const char *url, const char *type_string)
Definition: image.c:957
bool tap_is_state_stable(tap_state_t astate)
Function tap_is_state_stable returns true if the astate is stable.
Definition: interface.c:200
tap_state_t tap_state_transition(tap_state_t cur_state, bool tms)
Function tap_state_transition takes a current TAP state and returns the next state according to the t...
Definition: interface.c:223
const char * tap_state_name(tap_state_t state)
Function tap_state_name Returns a string suitable for display representing the JTAG tap_state.
Definition: interface.c:344
void tap_set_end_state(tap_state_t new_end_state)
This function sets the state of an "end state follower" which tracks the state that any cable driver ...
Definition: interface.c:48
tap_state_t tap_get_end_state(void)
For more information,.
Definition: interface.c:56
int tap_get_tms_path(tap_state_t from, tap_state_t to)
This function provides a "bit sequence" indicating what has to be done with TMS during a sequence of ...
Definition: interface.c:190
int tap_get_tms_path_len(tap_state_t from, tap_state_t to)
Function int tap_get_tms_path_len returns the total number of bits that represents a TMS path transit...
Definition: interface.c:195
tap_state_t 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
#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:49
uint8_t delay_scan_in
Delay value for SCAN_IN operations with less than maximum TCK frequency.
Definition: jtag.c:17
uint8_t delay_scan_out
Delay value for SCAN_OUT operations with less than maximum TCK frequency.
Definition: jtag.c:20
uint8_t delay_tck
Delay value for CLOCK_TCK operations with less than maximum frequency.
Definition: jtag.c:26
uint8_t delay_scan_io
Delay value for SCAN_IO operations with less than maximum TCK frequency.
Definition: jtag.c:23
uint8_t delay_tms
Delay value for CLOCK_TMS operations with less than maximum frequency.
Definition: jtag.c:29
@ 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
enum tap_state tap_state_t
Defines JTAG Test Access Port states.
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)
void jtag_libusb_close(struct libusb_device_handle *dev)
int jtag_libusb_choose_interface(struct libusb_device_handle *devh, unsigned int *usb_read_ep, unsigned int *usb_write_ep, int bclass, int subclass, int protocol, int trans_type)
Find the first interface optionally matching class, subclass and protocol and claim it.
#define LIBUSB_TIMEOUT_MS
Definition: libusb_helper.h:26
#define LOG_DEBUG_IO(expr ...)
Definition: log.h:101
#define ERROR_FAIL
Definition: log.h:170
#define LOG_ERROR(expr ...)
Definition: log.h:132
#define LOG_LEVEL_IS(FOO)
Definition: log.h:99
#define LOG_INFO(expr ...)
Definition: log.h:126
#define LOG_DEBUG(expr ...)
Definition: log.h:109
#define ERROR_OK
Definition: log.h:164
@ LOG_LVL_DEBUG_IO
Definition: log.h:48
target_addr_t addr
Start address to search for the control block.
Definition: rtt/rtt.c:28
size_t size
Size of the control block search area.
Definition: rtt/rtt.c:30
Represents a driver for a debugging interface.
Definition: interface.h:207
const char *const name
The name of the interface driver.
Definition: interface.h:209
ANGIE command (ANGIE command queue element).
Definition: angie.c:114
uint8_t payload_out_size
OUT direction payload size for this command.
Definition: angie.c:118
uint8_t payload_in_size
IN direction payload size for this command.
Definition: angie.c:122
uint8_t * payload_in_start
Pointer to first element of IN payload array.
Definition: angie.c:120
bool free_payload_in_start
Indicates if angie_clear_queue() should free payload_in_start
Definition: angie.c:128
uint8_t * payload_in
Pointer where IN payload shall be stored.
Definition: angie.c:121
struct jtag_command * cmd_origin
Pointer to corresponding OpenOCD command for post-processing.
Definition: angie.c:131
uint8_t * payload_out
Pointer where OUT payload shall be stored.
Definition: angie.c:117
struct angie_cmd * next
Pointer to next command (linked list)
Definition: angie.c:133
uint8_t id
ANGIE command ID.
Definition: angie.c:115
bool needs_postprocessing
Indicates if this command needs post-processing.
Definition: angie.c:125
Describes one driver instance.
Definition: angie.c:137
unsigned int ep_in
IN endpoint number.
Definition: angie.c:142
int delay_scan_out
Delay value for SCAN_OUT commands.
Definition: angie.c:148
struct libusb_device_handle * usb_device_handle
Definition: angie.c:139
int delay_scan_io
Delay value for SCAN_IO commands.
Definition: angie.c:149
int delay_clock_tms
Delay value for CLOCK_TCK commands.
Definition: angie.c:151
int commands_in_queue
Number of commands in queue.
Definition: angie.c:153
int delay_clock_tck
Delay value for CLOCK_TMS commands.
Definition: angie.c:150
struct angie_cmd * queue_end
Pointer to last command in queue.
Definition: angie.c:155
int delay_scan_in
Delay value for SCAN_IN commands.
Definition: angie.c:147
struct libusb_context * libusb_ctx
Definition: angie.c:138
struct angie_cmd * queue_start
Pointer to first command in queue.
Definition: angie.c:154
enum angie_type type
Definition: angie.c:140
unsigned int ep_out
OUT endpoint number.
Definition: angie.c:143
Definition: image.h:48
unsigned int num_sections
Definition: image.h:51
struct imagesection * sections
Definition: image.h:52
long long base_address
Definition: image.h:54
bool base_address_set
Definition: image.h:53
target_addr_t base_address
Definition: image.h:42
uint32_t size
Definition: image.h:43
enum jtag_command_type type
Definition: commands.h:148
Represents a driver for a debugging interface.
Definition: interface.h:182
int(* execute_queue)(struct jtag_command *cmd_queue)
Execute commands in the supplied queue.
Definition: interface.h:195
Definition: osbdm.c:17
static void h_u32_to_be(uint8_t *buf, uint32_t val)
Definition: types.h:186
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
Definition: types.h:79
static struct ublast_lowlevel low
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t dummy[96]
Definition: vdebug.c:23
uint8_t count[4]
Definition: vdebug.c:22