OpenOCD
arm_tpiu_swo.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
11 /*
12  * Relevant specifications from ARM include:
13  *
14  * CoreSight(tm) Components Technical Reference Manual ARM DDI 0314H
15  * CoreSight(tm) TPIU-Lite Technical Reference Manual ARM DDI 0317A
16  * Cortex(tm)-M3 Technical Reference Manual ARM DDI 0337G
17  * Cortex(tm)-M4 Technical Reference Manual ARM DDI 0439B
18  * CoreSight(tm) SoC-400 Technical Reference Manual ARM DDI 0480F
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 
25 #include <stdlib.h>
26 #include <jim.h>
27 
28 #include <helper/bits.h>
29 #include <helper/command.h>
30 #include <helper/jim-nvp.h>
31 #include <helper/list.h>
32 #include <helper/log.h>
33 #include <helper/types.h>
34 #include <jtag/interface.h>
35 #include <server/server.h>
36 #include <target/arm_adi_v5.h>
37 #include <target/target.h>
38 #include <transport/transport.h>
39 #include "arm_tpiu_swo.h"
40 
41 /* START_DEPRECATED_TPIU */
42 #include <target/cortex_m.h>
43 #include <target/target_type.h>
44 #define MSG "DEPRECATED \'tpiu config\' command: "
45 /* END_DEPRECATED_TPIU */
46 
47 #define TCP_SERVICE_NAME "tpiu_swo_trace"
48 
49 /* default for Cortex-M3 and Cortex-M4 specific TPIU */
50 #define TPIU_SWO_DEFAULT_BASE 0xE0040000
51 
52 #define TPIU_SSPSR_OFFSET 0x000
53 #define TPIU_CSPSR_OFFSET 0x004
54 #define TPIU_ACPR_OFFSET 0x010
55 #define TPIU_SPPR_OFFSET 0x0F0
56 #define TPIU_FFSR_OFFSET 0x300
57 #define TPIU_FFCR_OFFSET 0x304
58 #define TPIU_FSCR_OFFSET 0x308
59 #define TPIU_DEVID_OFFSET 0xfc8
60 
61 #define TPIU_ACPR_MAX_PRESCALER 0x1fff
62 #define TPIU_SPPR_PROTOCOL_SYNC (TPIU_PIN_PROTOCOL_SYNC)
63 #define TPIU_SPPR_PROTOCOL_MANCHESTER (TPIU_PIN_PROTOCOL_ASYNC_MANCHESTER)
64 #define TPIU_SPPR_PROTOCOL_UART (TPIU_PIN_PROTOCOL_ASYNC_UART)
65 #define TPIU_DEVID_NOSUPPORT_SYNC BIT(9)
66 #define TPIU_DEVID_SUPPORT_MANCHESTER BIT(10)
67 #define TPIU_DEVID_SUPPORT_UART BIT(11)
68 
74 };
75 
76 static const struct jim_nvp nvp_arm_tpiu_swo_event[] = {
77  { .value = TPIU_SWO_EVENT_PRE_ENABLE, .name = "pre-enable" },
78  { .value = TPIU_SWO_EVENT_POST_ENABLE, .name = "post-enable" },
79  { .value = TPIU_SWO_EVENT_PRE_DISABLE, .name = "pre-disable" },
80  { .value = TPIU_SWO_EVENT_POST_DISABLE, .name = "post-disable" },
81 };
82 
85  Jim_Interp *interp;
86  Jim_Obj *body;
88 };
89 
91  struct list_head lh;
92  struct adiv5_mem_ap_spot spot;
93  struct adiv5_ap *ap;
94  char *name;
96  /* record enable before init */
98  bool enabled;
99  bool en_capture;
102  uint32_t port_width;
103  FILE *file;
105  unsigned int pin_protocol;
109  unsigned int traceclkin_freq;
111  unsigned int swo_pin_freq;
115  struct list_head connections;
116  /* START_DEPRECATED_TPIU */
118  /* END_DEPRECATED_TPIU */
119 };
120 
122  struct list_head lh;
124 };
125 
128 };
129 
130 static LIST_HEAD(all_tpiu_swo);
131 
132 #define ARM_TPIU_SWO_TRACE_BUF_SIZE 4096
133 
134 static int arm_tpiu_swo_poll_trace(void *priv)
135 {
136  struct arm_tpiu_swo_object *obj = priv;
137  uint8_t buf[ARM_TPIU_SWO_TRACE_BUF_SIZE];
138  size_t size = sizeof(buf);
139  struct arm_tpiu_swo_connection *c;
140 
141  int retval = adapter_poll_trace(buf, &size);
142  if (retval != ERROR_OK || !size)
143  return retval;
144 
145  target_call_trace_callbacks(/*target*/NULL, size, buf);
146 
147  if (obj->file) {
148  if (fwrite(buf, 1, size, obj->file) == size) {
149  fflush(obj->file);
150  } else {
151  LOG_ERROR("Error writing to the SWO trace destination file");
152  return ERROR_FAIL;
153  }
154  }
155 
156  if (obj->out_filename && obj->out_filename[0] == ':')
158  if (connection_write(c->connection, buf, size) != (int)size)
159  LOG_ERROR("Error writing to connection"); /* FIXME: which connection? */
160 
161  return ERROR_OK;
162 }
163 
165 {
166  for (struct arm_tpiu_swo_event_action *ea = obj->event_action; ea; ea = ea->next) {
167  if (ea->event != event)
168  continue;
169 
170  LOG_DEBUG("TPIU/SWO: %s event: %s (%d) action : %s",
171  obj->name,
173  event,
174  Jim_GetString(ea->body, NULL));
175 
176  /* prevent event execution to change current target */
177  struct command_context *cmd_ctx = current_command_context(ea->interp);
178  struct target *saved_target = cmd_ctx->current_target;
179  int retval = Jim_EvalObj(ea->interp, ea->body);
180  cmd_ctx->current_target = saved_target;
181 
182  if (retval == JIM_RETURN)
183  retval = ea->interp->returnCode;
184  if (retval == JIM_OK || retval == ERROR_COMMAND_CLOSE_CONNECTION)
185  return;
186 
187  Jim_MakeErrorMessage(ea->interp);
188  LOG_USER("Error executing event %s on TPIU/SWO %s:\n%s",
190  obj->name,
191  Jim_GetString(Jim_GetResult(ea->interp), NULL));
192  /* clean both error code and stacktrace before return */
193  Jim_Eval(ea->interp, "error \"\" \"\"");
194  return;
195  }
196 }
197 
199 {
200  if (obj->file) {
201  fclose(obj->file);
202  obj->file = NULL;
203  }
204  if (obj->out_filename && obj->out_filename[0] == ':')
206 }
207 
209 {
210  struct arm_tpiu_swo_object *obj, *tmp;
211 
212  list_for_each_entry_safe(obj, tmp, &all_tpiu_swo, lh) {
213  if (obj->enabled)
215 
217 
218  if (obj->en_capture) {
220 
221  int retval = adapter_config_trace(false, 0, 0, NULL, 0, NULL);
222  if (retval != ERROR_OK)
223  LOG_ERROR("Failed to stop adapter's trace");
224  }
225 
226  if (obj->enabled)
228 
229  struct arm_tpiu_swo_event_action *ea = obj->event_action;
230  while (ea) {
231  struct arm_tpiu_swo_event_action *next = ea->next;
232  Jim_DecrRefCount(ea->interp, ea->body);
233  free(ea);
234  ea = next;
235  }
236 
237  if (obj->ap)
238  dap_put_ap(obj->ap);
239 
240  free(obj->name);
241  free(obj->out_filename);
242  free(obj);
243  }
244 
245  return ERROR_OK;
246 }
247 
249 {
251  struct arm_tpiu_swo_object *obj = priv->obj;
252  struct arm_tpiu_swo_connection *c = malloc(sizeof(*c));
253  if (!c) {
254  LOG_ERROR("Out of memory");
255  return ERROR_FAIL;
256  }
257  c->connection = connection;
258  list_add(&c->lh, &obj->connections);
259  return ERROR_OK;
260 }
261 
263 {
264  /* read a dummy buffer to check if the connection is still active */
265  long dummy;
266  int bytes_read = connection_read(connection, &dummy, sizeof(dummy));
267 
268  if (bytes_read == 0) {
270  } else if (bytes_read == -1) {
271  LOG_ERROR("error during read: %s", strerror(errno));
273  }
274 
275  return ERROR_OK;
276 }
277 
279 {
281  struct arm_tpiu_swo_object *obj = priv->obj;
282  struct arm_tpiu_swo_connection *c, *tmp;
283 
284  list_for_each_entry_safe(c, tmp, &obj->connections, lh)
285  if (c->connection == connection) {
286  list_del(&c->lh);
287  free(c);
288  return ERROR_OK;
289  }
290  LOG_ERROR("Failed to find connection to close!");
291  return ERROR_FAIL;
292 }
293 
294 COMMAND_HANDLER(handle_arm_tpiu_swo_event_list)
295 {
296  struct arm_tpiu_swo_object *obj = CMD_DATA;
297 
298  command_print(CMD, "Event actions for TPIU/SWO %s\n", obj->name);
299  command_print(CMD, "%-25s | Body", "Event");
300  command_print(CMD, "------------------------- | "
301  "----------------------------------------");
302 
303  for (struct arm_tpiu_swo_event_action *ea = obj->event_action; ea; ea = ea->next) {
304  struct jim_nvp *opt = jim_nvp_value2name_simple(nvp_arm_tpiu_swo_event, ea->event);
305  command_print(CMD, "%-25s | %s",
306  opt->name, Jim_GetString(ea->body, NULL));
307  }
308  command_print(CMD, "***END***");
309  return ERROR_OK;
310 }
311 
320 };
321 
322 static const struct jim_nvp nvp_arm_tpiu_swo_config_opts[] = {
323  { .name = "-port-width", .value = CFG_PORT_WIDTH },
324  { .name = "-protocol", .value = CFG_PROTOCOL },
325  { .name = "-formatter", .value = CFG_FORMATTER },
326  { .name = "-traceclk", .value = CFG_TRACECLKIN },
327  { .name = "-pin-freq", .value = CFG_BITRATE },
328  { .name = "-output", .value = CFG_OUTFILE },
329  { .name = "-event", .value = CFG_EVENT },
330  /* handled by mem_ap_spot, added for jim_getopt_nvp_unknown() */
331  { .name = "-dap", .value = -1 },
332  { .name = "-ap-num", .value = -1 },
333  { .name = "-baseaddr", .value = -1 },
334  { .name = NULL, .value = -1 },
335 };
336 
337 static const struct jim_nvp nvp_arm_tpiu_swo_protocol_opts[] = {
338  { .name = "sync", .value = TPIU_SPPR_PROTOCOL_SYNC },
339  { .name = "uart", .value = TPIU_SPPR_PROTOCOL_UART },
340  { .name = "manchester", .value = TPIU_SPPR_PROTOCOL_MANCHESTER },
341  { .name = NULL, .value = -1 },
342 };
343 
344 static const struct jim_nvp nvp_arm_tpiu_swo_bool_opts[] = {
345  { .name = "on", .value = 1 },
346  { .name = "yes", .value = 1 },
347  { .name = "1", .value = 1 },
348  { .name = "true", .value = 1 },
349  { .name = "off", .value = 0 },
350  { .name = "no", .value = 0 },
351  { .name = "0", .value = 0 },
352  { .name = "false", .value = 0 },
353  { .name = NULL, .value = -1 },
354 };
355 
356 static int arm_tpiu_swo_configure(struct jim_getopt_info *goi, struct arm_tpiu_swo_object *obj)
357 {
358  assert(obj);
359 
360  if (goi->isconfigure && obj->enabled) {
361  Jim_SetResultFormatted(goi->interp, "Cannot configure TPIU/SWO; %s is enabled!", obj->name);
362  return JIM_ERR;
363  }
364 
365  /* parse config or cget options ... */
366  while (goi->argc > 0) {
367  Jim_SetEmptyResult(goi->interp);
368 
369  int e = adiv5_jim_mem_ap_spot_configure(&obj->spot, goi);
370  if (e == JIM_OK)
371  continue;
372  if (e == JIM_ERR)
373  return e;
374 
375  struct jim_nvp *n;
377  if (e != JIM_OK) {
379  return e;
380  }
381 
382  switch (n->value) {
383  case CFG_PORT_WIDTH:
384  if (goi->isconfigure) {
385  jim_wide port_width;
386  e = jim_getopt_wide(goi, &port_width);
387  if (e != JIM_OK)
388  return e;
389  if (port_width < 1 || port_width > 32) {
390  Jim_SetResultString(goi->interp, "Invalid port width!", -1);
391  return JIM_ERR;
392  }
393  obj->port_width = (uint32_t)port_width;
394  } else {
395  if (goi->argc)
396  goto err_no_params;
397  Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, obj->port_width));
398  }
399  break;
400  case CFG_PROTOCOL:
401  if (goi->isconfigure) {
402  struct jim_nvp *p;
404  if (e != JIM_OK)
405  return e;
406  obj->pin_protocol = p->value;
407  } else {
408  if (goi->argc)
409  goto err_no_params;
410  struct jim_nvp *p;
412  if (e != JIM_OK) {
413  Jim_SetResultString(goi->interp, "protocol error", -1);
414  return JIM_ERR;
415  }
416  Jim_SetResult(goi->interp, Jim_NewStringObj(goi->interp, p->name, -1));
417  }
418  break;
419  case CFG_FORMATTER:
420  if (goi->isconfigure) {
421  struct jim_nvp *p;
423  if (e != JIM_OK)
424  return e;
425  obj->en_formatter = p->value;
426  } else {
427  if (goi->argc)
428  goto err_no_params;
429  struct jim_nvp *p;
431  if (e != JIM_OK) {
432  Jim_SetResultString(goi->interp, "formatter error", -1);
433  return JIM_ERR;
434  }
435  Jim_SetResult(goi->interp, Jim_NewStringObj(goi->interp, p->name, -1));
436  }
437  break;
438  case CFG_TRACECLKIN:
439  if (goi->isconfigure) {
440  jim_wide clk;
441  e = jim_getopt_wide(goi, &clk);
442  if (e != JIM_OK)
443  return e;
444  obj->traceclkin_freq = clk;
445  } else {
446  if (goi->argc)
447  goto err_no_params;
448  Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, obj->traceclkin_freq));
449  }
450  break;
451  case CFG_BITRATE:
452  if (goi->isconfigure) {
453  jim_wide clk;
454  e = jim_getopt_wide(goi, &clk);
455  if (e != JIM_OK)
456  return e;
457  obj->swo_pin_freq = clk;
458  } else {
459  if (goi->argc)
460  goto err_no_params;
461  Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, obj->swo_pin_freq));
462  }
463  break;
464  case CFG_OUTFILE:
465  if (goi->isconfigure) {
466  const char *s;
467  e = jim_getopt_string(goi, &s, NULL);
468  if (e != JIM_OK)
469  return e;
470  if (s[0] == ':') {
471  char *end;
472  long port = strtol(s + 1, &end, 0);
473  if (port <= 0 || port > UINT16_MAX || *end != '\0') {
474  Jim_SetResultFormatted(goi->interp, "Invalid TCP port \'%s\'", s + 1);
475  return JIM_ERR;
476  }
477  }
478  free(obj->out_filename);
479  obj->out_filename = strdup(s);
480  if (!obj->out_filename) {
481  LOG_ERROR("Out of memory");
482  return JIM_ERR;
483  }
484  } else {
485  if (goi->argc)
486  goto err_no_params;
487  if (obj->out_filename)
488  Jim_SetResult(goi->interp, Jim_NewStringObj(goi->interp, obj->out_filename, -1));
489  }
490  break;
491  case CFG_EVENT:
492  if (goi->isconfigure) {
493  if (goi->argc < 2) {
494  Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
495  return JIM_ERR;
496  }
497  } else {
498  if (goi->argc != 1) {
499  Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
500  return JIM_ERR;
501  }
502  }
503 
504  {
505  struct jim_nvp *p;
506  Jim_Obj *o;
507  struct arm_tpiu_swo_event_action *ea = obj->event_action;
508 
510  if (e != JIM_OK) {
512  return e;
513  }
514 
515  while (ea) {
516  /* replace existing? */
517  if (ea->event == (enum arm_tpiu_swo_event)p->value)
518  break;
519  ea = ea->next;
520  }
521 
522  if (goi->isconfigure) {
523  if (!ea) {
524  ea = calloc(1, sizeof(*ea));
525  if (!ea) {
526  LOG_ERROR("Out of memory");
527  return JIM_ERR;
528  }
529  ea->next = obj->event_action;
530  obj->event_action = ea;
531  }
532  if (ea->body)
533  Jim_DecrRefCount(ea->interp, ea->body);
534  ea->event = p->value;
535  ea->interp = goi->interp;
536  jim_getopt_obj(goi, &o);
537  ea->body = Jim_DuplicateObj(goi->interp, o);
538  Jim_IncrRefCount(ea->body);
539  } else {
540  if (ea)
541  Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, ea->body));
542  }
543  }
544  break;
545  }
546  }
547 
548  return JIM_OK;
549 
550 err_no_params:
551  Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
552  return JIM_ERR;
553 }
554 
555 static int jim_arm_tpiu_swo_configure(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
556 {
557  struct command *c = jim_to_command(interp);
558  struct jim_getopt_info goi;
559 
560  jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
561  goi.isconfigure = !strcmp(c->name, "configure");
562  if (goi.argc < 1) {
563  Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv,
564  "missing: -option ...");
565  return JIM_ERR;
566  }
567  struct arm_tpiu_swo_object *obj = c->jim_handler_data;
568  return arm_tpiu_swo_configure(&goi, obj);
569 }
570 
571 static int wrap_write_u32(struct target *target, struct adiv5_ap *tpiu_ap,
572  target_addr_t address, uint32_t value)
573 {
574  if (transport_is_hla())
575  return target_write_u32(target, address, value);
576  else
577  return mem_ap_write_atomic_u32(tpiu_ap, address, value);
578 }
579 
580 static int wrap_read_u32(struct target *target, struct adiv5_ap *tpiu_ap,
581  target_addr_t address, uint32_t *value)
582 {
583  if (transport_is_hla())
584  return target_read_u32(target, address, value);
585  else
586  return mem_ap_read_atomic_u32(tpiu_ap, address, value);
587 }
588 
589 static const struct service_driver arm_tpiu_swo_service_driver = {
590  .name = "tpiu_swo_trace",
591  .new_connection_during_keep_alive_handler = NULL,
592  .new_connection_handler = arm_tpiu_swo_service_new_connection,
593  .input_handler = arm_tpiu_swo_service_input,
594  .connection_closed_handler = arm_tpiu_swo_service_connection_closed,
595  .keep_client_alive_handler = NULL,
596 };
597 
598 COMMAND_HANDLER(handle_arm_tpiu_swo_enable)
599 {
600  struct arm_tpiu_swo_object *obj = CMD_DATA;
601  uint32_t value;
602  int retval;
603 
604  if (CMD_ARGC != 0)
606 
607  if (CMD_CTX->mode == COMMAND_CONFIG) {
608  LOG_DEBUG("%s: enable deferred", obj->name);
609  obj->deferred_enable = true;
610  return ERROR_OK;
611  }
612 
613  if (obj->enabled)
614  return ERROR_OK;
615 
616  if (transport_is_hla() && obj->spot.ap_num != 0) {
618  "Invalid access port 0x%" PRIx64 ". Only AP#0 allowed with hla transport",
619  obj->spot.ap_num);
620  return ERROR_FAIL;
621  }
622 
623  if (!obj->traceclkin_freq) {
624  command_print(CMD, "Trace clock-in frequency not set");
625  return ERROR_FAIL;
626  }
627 
629  if (!obj->swo_pin_freq)
630  LOG_DEBUG("SWO pin frequency not set, will be autodetected by the adapter");
631 
633 
634  /* START_DEPRECATED_TPIU */
635  if (obj->recheck_ap_cur_target) {
636  if (strcmp(target->type->name, "cortex_m") &&
637  strcmp(target->type->name, "hla_target")) {
638  LOG_ERROR(MSG "Current target is not a Cortex-M nor a HLA");
639  return ERROR_FAIL;
640  }
641  if (!target_was_examined(target)) {
642  LOG_ERROR(MSG "Current target not examined yet");
643  return ERROR_FAIL;
644  }
645  struct cortex_m_common *cm = target_to_cm(target);
646  obj->recheck_ap_cur_target = false;
647  obj->spot.ap_num = cm->armv7m.debug_ap->ap_num;
648  if (obj->spot.ap_num == 0)
649  LOG_INFO(MSG "Confirmed TPIU %s is on AP 0", obj->name);
650  else
651  LOG_INFO(MSG "Target %s is on AP#0x%" PRIx64 ". Revised command is "
652  "\'tpiu create %s -dap %s -ap-num 0x%" PRIx64 "\'",
653  target_name(target), obj->spot.ap_num,
654  obj->name, adiv5_dap_name(obj->spot.dap), obj->spot.ap_num);
655  }
656  /* END_DEPRECATED_TPIU */
657 
658  if (!obj->ap) {
659  obj->ap = dap_get_ap(obj->spot.dap, obj->spot.ap_num);
660  if (!obj->ap) {
661  command_print(CMD, "Cannot get AP");
662  return ERROR_FAIL;
663  }
664  }
665 
666  /* trigger the event before any attempt to R/W in the TPIU/SWO */
668 
669  retval = wrap_read_u32(target, obj->ap, obj->spot.base + TPIU_DEVID_OFFSET, &value);
670  if (retval != ERROR_OK) {
671  command_print(CMD, "Unable to read %s", obj->name);
672  return retval;
673  }
674  switch (obj->pin_protocol) {
676  value = !(value & TPIU_DEVID_NOSUPPORT_SYNC);
677  break;
679  value &= TPIU_DEVID_SUPPORT_UART;
680  break;
683  break;
684  default:
685  value = 0;
686  }
687  if (!value) {
689  command_print(CMD, "%s does not support protocol %s", obj->name, p->name);
690  return ERROR_FAIL;
691  }
692 
694  retval = wrap_read_u32(target, obj->ap, obj->spot.base + TPIU_SSPSR_OFFSET, &value);
695  if (retval != ERROR_OK) {
696  command_print(CMD, "Cannot read TPIU register SSPSR");
697  return retval;
698  }
699  if (!(value & BIT(obj->port_width - 1))) {
700  command_print(CMD, "TPIU does not support port-width of %d bits", obj->port_width);
701  return ERROR_FAIL;
702  }
703  }
704 
705  uint16_t prescaler = 1; /* dummy value */
706  unsigned int swo_pin_freq = obj->swo_pin_freq; /* could be replaced */
707 
708  if (obj->out_filename && strcmp(obj->out_filename, "external") && obj->out_filename[0]) {
709  if (obj->out_filename[0] == ':') {
710  struct arm_tpiu_swo_priv_connection *priv = malloc(sizeof(*priv));
711  if (!priv) {
712  LOG_ERROR("Out of memory");
713  return ERROR_FAIL;
714  }
715  priv->obj = obj;
716  LOG_INFO("starting trace server for %s on %s", obj->name, &obj->out_filename[1]);
719  if (retval != ERROR_OK) {
720  command_print(CMD, "Can't configure trace TCP port %s", &obj->out_filename[1]);
721  return retval;
722  }
723  } else if (strcmp(obj->out_filename, "-")) {
724  obj->file = fopen(obj->out_filename, "ab");
725  if (!obj->file) {
726  command_print(CMD, "Can't open trace destination file \"%s\"", obj->out_filename);
727  return ERROR_FAIL;
728  }
729  }
730 
732  &swo_pin_freq, obj->traceclkin_freq, &prescaler);
733  if (retval != ERROR_OK) {
734  command_print(CMD, "Failed to start adapter's trace");
736  return retval;
737  }
738 
740  if (!swo_pin_freq) {
741  if (obj->swo_pin_freq)
742  command_print(CMD, "Adapter rejected SWO pin frequency %d Hz", obj->swo_pin_freq);
743  else
745  "Adapter does not support auto-detection of SWO pin frequency nor a default value");
746 
748  return ERROR_FAIL;
749  }
750 
751  if (obj->swo_pin_freq != swo_pin_freq)
752  LOG_INFO("SWO pin data rate adjusted by adapter to %d Hz", swo_pin_freq);
753  obj->swo_pin_freq = swo_pin_freq;
754 
757 
758  obj->en_capture = true;
760  prescaler = (obj->traceclkin_freq + obj->swo_pin_freq / 2) / obj->swo_pin_freq;
761  if (prescaler > TPIU_ACPR_MAX_PRESCALER)
762  prescaler = TPIU_ACPR_MAX_PRESCALER;
763  swo_pin_freq = obj->traceclkin_freq / prescaler;
764 
765  if (obj->swo_pin_freq != swo_pin_freq)
766  LOG_INFO("SWO pin data rate adjusted to %d Hz", swo_pin_freq);
767  obj->swo_pin_freq = swo_pin_freq;
768  }
769 
771  if (retval != ERROR_OK)
772  goto error_exit;
773 
774  retval = wrap_write_u32(target, obj->ap, obj->spot.base + TPIU_ACPR_OFFSET, prescaler - 1);
775  if (retval != ERROR_OK)
776  goto error_exit;
777 
779  if (retval != ERROR_OK)
780  goto error_exit;
781 
782  retval = wrap_read_u32(target, obj->ap, obj->spot.base + TPIU_FFCR_OFFSET, &value);
783  if (retval != ERROR_OK)
784  goto error_exit;
785  if (obj->en_formatter)
786  value |= BIT(1);
787  else
788  value &= ~BIT(1);
789  retval = wrap_write_u32(target, obj->ap, obj->spot.base + TPIU_FFCR_OFFSET, value);
790  if (retval != ERROR_OK)
791  goto error_exit;
792 
794 
795  /* START_DEPRECATED_TPIU */
797  /* END_DEPRECATED_TPIU */
798 
799  obj->enabled = true;
800  return ERROR_OK;
801 
802 error_exit:
803  command_print(CMD, "Error!");
804 
805  if (obj->en_capture) {
806  obj->en_capture = false;
807 
809 
811 
812  int retval1 = adapter_config_trace(false, 0, 0, NULL, 0, NULL);
813  if (retval1 != ERROR_OK)
814  command_print(CMD, "Failed to stop adapter's trace");
815  }
816  return retval;
817 }
818 
819 COMMAND_HANDLER(handle_arm_tpiu_swo_disable)
820 {
821  struct arm_tpiu_swo_object *obj = CMD_DATA;
822 
823  if (CMD_ARGC != 0)
825 
826  if (!obj->enabled)
827  return ERROR_OK;
828  obj->enabled = false;
829 
831 
832  if (obj->en_capture) {
833  obj->en_capture = false;
834 
836 
838 
839  int retval = adapter_config_trace(false, 0, 0, NULL, 0, NULL);
840  if (retval != ERROR_OK) {
841  command_print(CMD, "Failed to stop adapter's trace");
842  return retval;
843  }
844  }
845 
847 
848  /* START_DEPRECATED_TPIU */
851  /* END_DEPRECATED_TPIU */
852 
853  return ERROR_OK;
854 }
855 
857  {
858  .name = "configure",
859  .mode = COMMAND_ANY,
860  .jim_handler = jim_arm_tpiu_swo_configure,
861  .help = "configure a new TPIU/SWO for use",
862  .usage = "[attribute value ...]",
863  },
864  {
865  .name = "cget",
866  .mode = COMMAND_ANY,
867  .jim_handler = jim_arm_tpiu_swo_configure,
868  .help = "returns the specified TPIU/SWO attribute",
869  .usage = "attribute",
870  },
871  {
872  .name = "eventlist",
873  .mode = COMMAND_ANY,
874  .handler = handle_arm_tpiu_swo_event_list,
875  .help = "displays a table of events defined for this TPIU/SWO",
876  .usage = "",
877  },
878  {
879  .name = "enable",
880  .mode = COMMAND_ANY,
881  .handler = handle_arm_tpiu_swo_enable,
882  .usage = "",
883  .help = "Enables the TPIU/SWO output",
884  },
885  {
886  .name = "disable",
887  .mode = COMMAND_EXEC,
888  .handler = handle_arm_tpiu_swo_disable,
889  .usage = "",
890  .help = "Disables the TPIU/SWO output",
891  },
893 };
894 
895 static int arm_tpiu_swo_create(Jim_Interp *interp, struct arm_tpiu_swo_object *obj)
896 {
897  struct command_context *cmd_ctx;
898  Jim_Cmd *cmd;
899  int e;
900 
901  cmd_ctx = current_command_context(interp);
902  assert(cmd_ctx);
903 
904  /* does this command exist? */
905  cmd = Jim_GetCommand(interp, Jim_NewStringObj(interp, obj->name, -1), JIM_NONE);
906  if (cmd) {
907  Jim_SetResultFormatted(interp, "cannot create TPIU object because a command with name '%s' already exists",
908  obj->name);
909  return JIM_ERR;
910  }
911 
912  /* now - create the new tpiu/swo name command */
913  const struct command_registration obj_commands[] = {
914  {
915  .name = obj->name,
916  .mode = COMMAND_ANY,
917  .help = "tpiu/swo instance command group",
918  .usage = "",
920  },
922  };
923  e = register_commands_with_data(cmd_ctx, NULL, obj_commands, obj);
924  if (e != ERROR_OK)
925  return JIM_ERR;
926 
927  list_add_tail(&obj->lh, &all_tpiu_swo);
928 
929  return JIM_OK;
930 }
931 
932 static int jim_arm_tpiu_swo_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
933 {
934  struct jim_getopt_info goi;
935  jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
936  if (goi.argc < 1) {
937  Jim_WrongNumArgs(interp, 1, argv, "name ?option option ...?");
938  return JIM_ERR;
939  }
940 
941  struct arm_tpiu_swo_object *obj = calloc(1, sizeof(struct arm_tpiu_swo_object));
942  if (!obj) {
943  LOG_ERROR("Out of memory");
944  return JIM_ERR;
945  }
949  obj->port_width = 1;
950 
951  Jim_Obj *n;
952  jim_getopt_obj(&goi, &n);
953  obj->name = strdup(Jim_GetString(n, NULL));
954  if (!obj->name) {
955  LOG_ERROR("Out of memory");
956  free(obj);
957  return JIM_ERR;
958  }
959 
960  /* Do the rest as "configure" options */
961  goi.isconfigure = 1;
962  int e = arm_tpiu_swo_configure(&goi, obj);
963  if (e != JIM_OK)
964  goto err_exit;
965 
966  if (!obj->spot.dap || obj->spot.ap_num == DP_APSEL_INVALID) {
967  Jim_SetResultString(goi.interp, "-dap and -ap-num required when creating TPIU", -1);
968  goto err_exit;
969  }
970 
971  e = arm_tpiu_swo_create(goi.interp, obj);
972  if (e != JIM_OK)
973  goto err_exit;
974 
975  return JIM_OK;
976 
977 err_exit:
978  free(obj->name);
979  free(obj->out_filename);
980  free(obj);
981  return JIM_ERR;
982 }
983 
984 COMMAND_HANDLER(handle_arm_tpiu_swo_names)
985 {
986  struct arm_tpiu_swo_object *obj;
987 
988  if (CMD_ARGC != 0)
990 
991  list_for_each_entry(obj, &all_tpiu_swo, lh)
992  command_print(CMD, "%s", obj->name);
993 
994  return ERROR_OK;
995 }
996 
997 COMMAND_HANDLER(handle_arm_tpiu_swo_init)
998 {
999  struct arm_tpiu_swo_object *obj;
1000  int retval = ERROR_OK;
1001 
1002  if (CMD_ARGC != 0)
1004 
1005  list_for_each_entry(obj, &all_tpiu_swo, lh) {
1006  if (!obj->deferred_enable)
1007  continue;
1008  LOG_DEBUG("%s: running enable during init", obj->name);
1009  int retval2 = command_run_linef(CMD_CTX, "%s enable", obj->name);
1010  if (retval2 != ERROR_OK)
1011  retval = retval2;
1012  }
1013  return retval;
1014 }
1015 
1016 /* START_DEPRECATED_TPIU */
1017 /* DEPRECATED: emulation of old command 'tpiu config' */
1018 COMMAND_HANDLER(handle_tpiu_deprecated_config_command)
1019 {
1021  struct arm_tpiu_swo_object *obj = NULL;
1022  int retval;
1023 
1024  if (strcmp(target->type->name, "cortex_m") &&
1025  strcmp(target->type->name, "hla_target")) {
1026  LOG_ERROR(MSG "Current target is not a Cortex-M nor a HLA");
1027  return ERROR_FAIL;
1028  }
1029 
1030  if (!list_empty(&all_tpiu_swo)) {
1031  obj = list_first_entry(&all_tpiu_swo, typeof(*obj), lh);
1032  LOG_INFO(MSG "Using %s", obj->name);
1033  } else {
1034  struct cortex_m_common *cm = target_to_cm(target);
1036  struct adiv5_dap *dap = pc->dap;
1037  uint64_t ap_num = pc->ap_num;
1038  bool set_recheck_ap_cur_target = false;
1039 
1040  LOG_INFO(MSG "Adding a TPIU \'%s.tpiu\' in the configuration", target_name(target));
1041 
1042  if (ap_num == DP_APSEL_INVALID && transport_is_hla())
1043  ap_num = 0; /* HLA should only support AP 0 */
1044 
1045  if (ap_num == DP_APSEL_INVALID && target_was_examined(target))
1046  ap_num = cm->armv7m.debug_ap->ap_num;
1047 
1048  if (ap_num == DP_APSEL_INVALID) {
1049  LOG_INFO(MSG "Target %s uses AP autodetection. Adding TPIU on AP 0; can be revised later",
1050  target_name(target));
1051  ap_num = 0;
1052  set_recheck_ap_cur_target = true;
1053  }
1054 
1055  LOG_INFO(MSG "Running: \'tpiu create %s.tpiu -dap %s -ap-num 0x%" PRIx64 "\'",
1056  target_name(target), adiv5_dap_name(dap), ap_num);
1057 
1058  retval = command_run_linef(CMD_CTX, "tpiu create %s.tpiu -dap %s -ap-num 0x%" PRIx64,
1059  target_name(target), adiv5_dap_name(dap), ap_num);
1060  if (retval != ERROR_OK)
1061  return retval;
1062 
1063  obj = list_first_entry(&all_tpiu_swo, typeof(*obj), lh);
1064  if (set_recheck_ap_cur_target)
1065  obj->recheck_ap_cur_target = true;
1066  }
1067 
1068  unsigned int cmd_idx = 0;
1069  if (cmd_idx == CMD_ARGC)
1071 
1072  if (!strcmp(CMD_ARGV[cmd_idx], "disable")) {
1073  if (CMD_ARGC != cmd_idx + 1)
1075  LOG_INFO(MSG "Running: \'%s disable\'", obj->name);
1076  return command_run_linef(CMD_CTX, "%s disable", obj->name);
1077  }
1078 
1079  const char *output = NULL;
1080  const char *protocol;
1081  const char *formatter = NULL;
1082  const char *port_width = NULL;
1083  const char *trace_clk;
1084  const char *pin_clk = NULL;
1085  if (!strcmp(CMD_ARGV[cmd_idx], "internal")) {
1086  cmd_idx++;
1087  if (cmd_idx == CMD_ARGC)
1089  output = CMD_ARGV[cmd_idx];
1090  } else if (strcmp(CMD_ARGV[cmd_idx], "external"))
1092  cmd_idx++;
1093  if (cmd_idx == CMD_ARGC)
1095  if (!strcmp(CMD_ARGV[cmd_idx], "sync")) {
1096  protocol = CMD_ARGV[cmd_idx];
1097  cmd_idx++;
1098  if (cmd_idx == CMD_ARGC)
1100  port_width = CMD_ARGV[cmd_idx];
1101  } else {
1102  if (strcmp(CMD_ARGV[cmd_idx], "manchester") && strcmp(CMD_ARGV[cmd_idx], "uart"))
1104  protocol = CMD_ARGV[cmd_idx];
1105  cmd_idx++;
1106  if (cmd_idx == CMD_ARGC)
1108  formatter = CMD_ARGV[cmd_idx];
1109  }
1110  cmd_idx++;
1111  if (cmd_idx == CMD_ARGC)
1113  trace_clk = CMD_ARGV[cmd_idx];
1114  cmd_idx++;
1115  if (cmd_idx != CMD_ARGC) {
1116  pin_clk = CMD_ARGV[cmd_idx];
1117  cmd_idx++;
1118  }
1119  if (cmd_idx != CMD_ARGC)
1121 
1122  LOG_INFO(MSG "Running: \'%s configure -protocol %s -traceclk %s" "%s%s" "%s%s" "%s%s" "%s%s\'",
1123  obj->name, protocol, trace_clk,
1124  pin_clk ? " -pin-freq " : "", pin_clk ? pin_clk : "",
1125  output ? " -output " : "", output ? output : "",
1126  formatter ? " -formatter " : "", formatter ? formatter : "",
1127  port_width ? " -port-width " : "", port_width ? port_width : "");
1128 
1129  retval = command_run_linef(CMD_CTX,
1130  "%s configure -protocol %s -traceclk %s" "%s%s" "%s%s" "%s%s" "%s%s",
1131  obj->name, protocol, trace_clk,
1132  pin_clk ? " -pin-freq " : "", pin_clk ? pin_clk : "",
1133  output ? " -output " : "", output ? output : "",
1134  formatter ? " -formatter " : "", formatter ? formatter : "",
1135  port_width ? " -port-width " : "", port_width ? port_width : "");
1136  if (retval != ERROR_OK)
1137  return retval;
1138 
1139  LOG_INFO(MSG "Running: \'%s enable\'", obj->name);
1140  retval = command_run_linef(CMD_CTX, "%s enable", obj->name);
1141  if (retval != ERROR_OK)
1142  return retval;
1143 
1144  return ERROR_OK;
1145 }
1146 
1148  {
1149  .name = "config",
1150  .handler = handle_tpiu_deprecated_config_command,
1151  .mode = COMMAND_ANY,
1152  .help = "Configure TPIU features, DEPRECATED, use \'tpiu create\'",
1153  .usage = "(disable | "
1154  "((external | internal (<filename> | <:port> | -)) "
1155  "(sync <port width> | ((manchester | uart) <formatter enable>)) "
1156  "<TRACECLKIN freq> [<trace freq>]))",
1157  },
1159 };
1160 
1162  {
1163  .name = "tpiu",
1165  .usage = "",
1166  .help = "tpiu command group",
1167  },
1169 };
1170 /* END_DEPRECATED_TPIU */
1171 
1173  {
1174  .name = "create",
1175  .mode = COMMAND_ANY,
1176  .jim_handler = jim_arm_tpiu_swo_create,
1177  .usage = "name [-dap dap] [-ap-num num] [-baseaddr baseaddr]",
1178  .help = "Creates a new TPIU or SWO object",
1179  },
1180  {
1181  .name = "names",
1182  .mode = COMMAND_ANY,
1183  .handler = handle_arm_tpiu_swo_names,
1184  .usage = "",
1185  .help = "Lists all registered TPIU and SWO objects by name",
1186  },
1187  {
1188  .name = "init",
1189  .mode = COMMAND_EXEC,
1190  .handler = handle_arm_tpiu_swo_init,
1191  .usage = "",
1192  .help = "Initialize TPIU and SWO",
1193  },
1195 };
1196 
1197 static const struct command_registration arm_tpiu_swo_command_handlers[] = {
1198  {
1199  .name = "tpiu",
1201  .usage = "",
1202  .help = "tpiu command group",
1203  },
1204  {
1205  .name = "swo",
1207  .usage = "",
1208  .help = "swo command group",
1209  },
1211 };
1212 
1214 {
1216 }
int adiv5_mem_ap_spot_init(struct adiv5_mem_ap_spot *p)
Definition: arm_adi_v5.c:2489
int mem_ap_read_atomic_u32(struct adiv5_ap *ap, target_addr_t address, uint32_t *value)
Synchronous read of a word from memory or a system register.
Definition: arm_adi_v5.c:266
struct adiv5_ap * dap_get_ap(struct adiv5_dap *dap, uint64_t ap_num)
Definition: arm_adi_v5.c:1188
int dap_put_ap(struct adiv5_ap *ap)
Definition: arm_adi_v5.c:1208
int adiv5_jim_mem_ap_spot_configure(struct adiv5_mem_ap_spot *cfg, struct jim_getopt_info *goi)
Definition: arm_adi_v5.c:2483
int mem_ap_write_atomic_u32(struct adiv5_ap *ap, target_addr_t address, uint32_t value)
Synchronous write of a word to memory or a system register.
Definition: arm_adi_v5.c:318
This defines formats and data structures used to talk to ADIv5 entities.
#define DP_APSEL_INVALID
Definition: arm_adi_v5.h:110
const char * adiv5_dap_name(struct adiv5_dap *self)
Definition: arm_dap.c:54
static LIST_HEAD(all_tpiu_swo)
static const struct jim_nvp nvp_arm_tpiu_swo_bool_opts[]
Definition: arm_tpiu_swo.c:344
#define ARM_TPIU_SWO_TRACE_BUF_SIZE
Definition: arm_tpiu_swo.c:132
#define MSG
Definition: arm_tpiu_swo.c:44
static const struct command_registration arm_tpiu_deprecated_subcommand_handlers[]
static int jim_arm_tpiu_swo_configure(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Definition: arm_tpiu_swo.c:555
#define TPIU_SWO_DEFAULT_BASE
Definition: arm_tpiu_swo.c:50
#define TPIU_SPPR_PROTOCOL_MANCHESTER
Definition: arm_tpiu_swo.c:63
arm_tpiu_swo_event
Definition: arm_tpiu_swo.c:69
@ TPIU_SWO_EVENT_PRE_DISABLE
Definition: arm_tpiu_swo.c:72
@ TPIU_SWO_EVENT_PRE_ENABLE
Definition: arm_tpiu_swo.c:70
@ TPIU_SWO_EVENT_POST_ENABLE
Definition: arm_tpiu_swo.c:71
@ TPIU_SWO_EVENT_POST_DISABLE
Definition: arm_tpiu_swo.c:73
static const struct jim_nvp nvp_arm_tpiu_swo_config_opts[]
Definition: arm_tpiu_swo.c:322
static void arm_tpiu_swo_handle_event(struct arm_tpiu_swo_object *obj, enum arm_tpiu_swo_event event)
Definition: arm_tpiu_swo.c:164
#define TPIU_DEVID_OFFSET
Definition: arm_tpiu_swo.c:59
#define TPIU_CSPSR_OFFSET
Definition: arm_tpiu_swo.c:53
static int jim_arm_tpiu_swo_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Definition: arm_tpiu_swo.c:932
static const struct service_driver arm_tpiu_swo_service_driver
Definition: arm_tpiu_swo.c:589
const struct command_registration arm_tpiu_deprecated_command_handlers[]
static const struct command_registration arm_tpiu_swo_subcommand_handlers[]
static void arm_tpiu_swo_close_output(struct arm_tpiu_swo_object *obj)
Definition: arm_tpiu_swo.c:198
int arm_tpiu_swo_register_commands(struct command_context *cmd_ctx)
static const struct jim_nvp nvp_arm_tpiu_swo_protocol_opts[]
Definition: arm_tpiu_swo.c:337
static int arm_tpiu_swo_service_connection_closed(struct connection *connection)
Definition: arm_tpiu_swo.c:278
arm_tpiu_swo_cfg_param
Definition: arm_tpiu_swo.c:312
@ CFG_PROTOCOL
Definition: arm_tpiu_swo.c:314
@ CFG_TRACECLKIN
Definition: arm_tpiu_swo.c:316
@ CFG_FORMATTER
Definition: arm_tpiu_swo.c:315
@ CFG_PORT_WIDTH
Definition: arm_tpiu_swo.c:313
@ CFG_OUTFILE
Definition: arm_tpiu_swo.c:318
@ CFG_EVENT
Definition: arm_tpiu_swo.c:319
@ CFG_BITRATE
Definition: arm_tpiu_swo.c:317
#define TPIU_SPPR_OFFSET
Definition: arm_tpiu_swo.c:55
static int arm_tpiu_swo_service_input(struct connection *connection)
Definition: arm_tpiu_swo.c:262
#define TPIU_SPPR_PROTOCOL_SYNC
Definition: arm_tpiu_swo.c:62
#define TPIU_FFCR_OFFSET
Definition: arm_tpiu_swo.c:57
static const struct command_registration arm_tpiu_swo_instance_command_handlers[]
Definition: arm_tpiu_swo.c:856
static int arm_tpiu_swo_service_new_connection(struct connection *connection)
Definition: arm_tpiu_swo.c:248
#define TPIU_ACPR_MAX_PRESCALER
Definition: arm_tpiu_swo.c:61
#define TPIU_DEVID_SUPPORT_UART
Definition: arm_tpiu_swo.c:67
#define TPIU_SPPR_PROTOCOL_UART
Definition: arm_tpiu_swo.c:64
static const struct jim_nvp nvp_arm_tpiu_swo_event[]
Definition: arm_tpiu_swo.c:76
static int arm_tpiu_swo_create(Jim_Interp *interp, struct arm_tpiu_swo_object *obj)
Definition: arm_tpiu_swo.c:895
#define TCP_SERVICE_NAME
Definition: arm_tpiu_swo.c:47
#define TPIU_DEVID_SUPPORT_MANCHESTER
Definition: arm_tpiu_swo.c:66
static int wrap_write_u32(struct target *target, struct adiv5_ap *tpiu_ap, target_addr_t address, uint32_t value)
Definition: arm_tpiu_swo.c:571
static const struct command_registration arm_tpiu_swo_command_handlers[]
#define TPIU_SSPSR_OFFSET
Definition: arm_tpiu_swo.c:52
#define TPIU_DEVID_NOSUPPORT_SYNC
Definition: arm_tpiu_swo.c:65
int arm_tpiu_swo_cleanup_all(void)
Definition: arm_tpiu_swo.c:208
static int wrap_read_u32(struct target *target, struct adiv5_ap *tpiu_ap, target_addr_t address, uint32_t *value)
Definition: arm_tpiu_swo.c:580
static int arm_tpiu_swo_configure(struct jim_getopt_info *goi, struct arm_tpiu_swo_object *obj)
Definition: arm_tpiu_swo.c:356
COMMAND_HANDLER(handle_arm_tpiu_swo_event_list)
Definition: arm_tpiu_swo.c:294
#define TPIU_ACPR_OFFSET
Definition: arm_tpiu_swo.c:54
static int arm_tpiu_swo_poll_trace(void *priv)
Definition: arm_tpiu_swo.c:134
const char * name
Definition: armv4_5.c:76
struct command_context * current_command_context(Jim_Interp *interp)
Definition: command.c:157
void command_print(struct command_invocation *cmd, const char *format,...)
Definition: command.c:443
int command_run_linef(struct command_context *context, const char *format,...)
Definition: command.c:613
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
Definition: command.h:141
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
Definition: command.h:156
static int register_commands_with_data(struct command_context *cmd_ctx, const char *cmd_prefix, const struct command_registration *cmds, void *data)
Register one or more commands, as register_commands(), plus specify a pointer to command private data...
Definition: command.h:315
#define ERROR_COMMAND_SYNTAX_ERROR
Definition: command.h:402
#define CMD_DATA
Use this macro to access the invoked command handler's data pointer, rather than accessing the variab...
Definition: command.h:176
#define ERROR_COMMAND_CLOSE_CONNECTION
Definition: command.h:401
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
Definition: command.h:151
#define CMD_CTX
Use this macro to access the context of the command being handled, rather than accessing the variable...
Definition: command.h:146
static struct command * jim_to_command(Jim_Interp *interp)
Definition: command.h:212
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:253
static int register_commands(struct command_context *cmd_ctx, const char *cmd_prefix, const struct command_registration *cmds)
Register one or more commands in the specified context, as children of parent (or top-level commends,...
Definition: command.h:274
@ COMMAND_CONFIG
Definition: command.h:41
@ COMMAND_ANY
Definition: command.h:42
@ COMMAND_EXEC
Definition: command.h:40
static struct cortex_m_common * target_to_cm(struct target *target)
Definition: cortex_m.h:281
static struct esp_usb_jtag * priv
Definition: esp_usb_jtag.c:219
static uint16_t output
Definition: ftdi.c:119
bool transport_is_hla(void)
int jim_getopt_wide(struct jim_getopt_info *goi, jim_wide *puthere)
Remove argv[0] as wide.
Definition: jim-nvp.c:221
int jim_getopt_setup(struct jim_getopt_info *p, Jim_Interp *interp, int argc, Jim_Obj *const *argv)
GetOpt - how to.
Definition: jim-nvp.c:148
int jim_getopt_string(struct jim_getopt_info *goi, const char **puthere, int *len)
Remove argv[0] as string.
Definition: jim-nvp.c:187
int jim_getopt_nvp(struct jim_getopt_info *goi, const struct jim_nvp *nvp, struct jim_nvp **puthere)
Remove argv[0] as NVP.
Definition: jim-nvp.c:236
void jim_getopt_nvp_unknown(struct jim_getopt_info *goi, const struct jim_nvp *nvptable, int hadprefix)
Create an appropriate error message for an NVP.
Definition: jim-nvp.c:252
int jim_getopt_obj(struct jim_getopt_info *goi, Jim_Obj **puthere)
Remove argv[0] from the list.
Definition: jim-nvp.c:168
struct jim_nvp * jim_nvp_value2name_simple(const struct jim_nvp *p, int value)
Definition: jim-nvp.c:123
int jim_nvp_value2name(Jim_Interp *interp, const struct jim_nvp *_p, int value, struct jim_nvp **result)
Definition: jim-nvp.c:133
int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol, uint32_t port_size, unsigned int *trace_freq, unsigned int traceclkin_freq, uint16_t *prescaler)
Definition: jtag/core.c:1917
int adapter_poll_trace(uint8_t *buf, size_t *size)
Definition: jtag/core.c:1932
static void list_add(struct list_head *new, struct list_head *head)
Definition: list.h:193
#define list_first_entry(ptr, type, member)
Definition: list.h:127
static void list_add_tail(struct list_head *new, struct list_head *head)
Definition: list.h:199
static int list_empty(const struct list_head *head)
Definition: list.h:60
#define list_for_each_entry_safe(p, n, h, field)
Definition: list.h:155
#define list_for_each_entry(p, h, field)
Definition: list.h:151
static void list_del(struct list_head *entry)
Definition: list.h:87
static void INIT_LIST_HEAD(struct list_head *list)
Definition: list.h:53
#define LOG_USER(expr ...)
Definition: log.h:135
#define ERROR_FAIL
Definition: log.h:170
#define LOG_ERROR(expr ...)
Definition: log.h:132
#define LOG_INFO(expr ...)
Definition: log.h:126
#define LOG_DEBUG(expr ...)
Definition: log.h:109
#define ERROR_OK
Definition: log.h:164
static uint32_t lh(unsigned int rd, unsigned int base, uint16_t offset) __attribute__((unused))
Definition: opcodes.h:117
size_t size
Size of the control block search area.
Definition: rtt/rtt.c:30
int connection_write(struct connection *connection, const void *data, int len)
Definition: server.c:732
int connection_read(struct connection *connection, void *data, int len)
Definition: server.c:744
int remove_service(const char *name, const char *port)
Definition: server.c:355
int add_service(const struct service_driver *driver, const char *port, int max_connections, void *priv)
Definition: server.c:198
#define CONNECTION_LIMIT_UNLIMITED
Definition: server.h:34
#define ERROR_SERVER_REMOTE_CLOSED
Definition: server.h:119
#define BIT(nr)
Definition: stm32l4x.h:18
This represents an ARM Debug Interface (v5) Access Port (AP).
Definition: arm_adi_v5.h:250
uint64_t ap_num
ADIv5: Number of this AP (0~255) ADIv6: Base address of this AP (4k aligned) TODO: to be more coheren...
Definition: arm_adi_v5.h:261
This represents an ARM Debug Interface (v5) Debug Access Port (DAP).
Definition: arm_adi_v5.h:348
struct adiv5_dap * dap
Definition: arm_adi_v5.h:803
struct adiv5_dap * dap
Definition: arm_adi_v5.h:787
struct list_head lh
Definition: arm_tpiu_swo.c:122
struct connection * connection
Definition: arm_tpiu_swo.c:123
struct arm_tpiu_swo_event_action * next
Definition: arm_tpiu_swo.c:87
enum arm_tpiu_swo_event event
Definition: arm_tpiu_swo.c:84
uint32_t port_width
Handle to output trace data in INTERNAL capture mode.
Definition: arm_tpiu_swo.c:102
struct arm_tpiu_swo_event_action * event_action
Definition: arm_tpiu_swo.c:95
struct list_head lh
Definition: arm_tpiu_swo.c:91
struct adiv5_ap * ap
Definition: arm_tpiu_swo.c:93
bool en_formatter
Enable formatter.
Definition: arm_tpiu_swo.c:107
unsigned int traceclkin_freq
frequency of TRACECLKIN (usually matches HCLK)
Definition: arm_tpiu_swo.c:109
unsigned int swo_pin_freq
SWO pin frequency.
Definition: arm_tpiu_swo.c:111
struct adiv5_mem_ap_spot spot
Definition: arm_tpiu_swo.c:92
struct list_head connections
track TCP connections
Definition: arm_tpiu_swo.c:115
unsigned int pin_protocol
output mode
Definition: arm_tpiu_swo.c:105
char * out_filename
where to dump the captured output trace data
Definition: arm_tpiu_swo.c:113
struct arm_tpiu_swo_object * obj
Definition: arm_tpiu_swo.c:127
struct adiv5_ap * debug_ap
Definition: armv7m.h:230
Jim_Interp * interp
Definition: command.h:53
struct target * current_target
Definition: command.h:55
const char * name
Definition: command.h:235
const char * usage
a string listing the options and arguments, required or optional
Definition: command.h:241
void * jim_handler_data
Definition: command.h:201
char * name
Definition: command.h:198
struct service * service
Definition: server.h:41
struct armv7m_common armv7m
Definition: cortex_m.h:222
A TCL -ish GetOpt like code.
Definition: jim-nvp.h:135
Jim_Interp * interp
Definition: jim-nvp.h:136
Jim_Obj *const * argv
Definition: jim-nvp.h:138
Name Value Pairs, aka: NVP.
Definition: jim-nvp.h:59
const char * name
Definition: jim-nvp.h:60
int value
Definition: jim-nvp.h:61
Definition: list.h:40
const char * name
the name of the server
Definition: server.h:49
void * priv
Definition: server.h:81
const char * name
Name of this type of target.
Definition: target_type.h:31
Definition: target.h:116
void * private_config
Definition: target.h:165
struct target_type * type
Definition: target.h:117
int target_unregister_timer_callback(int(*callback)(void *priv), void *priv)
Definition: target.c:1748
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: target.c:2641
int target_register_timer_callback(int(*callback)(void *priv), unsigned int time_ms, enum target_timer_type type, void *priv)
The period is very approximate, the callback can happen much more often or much more rarely than spec...
Definition: target.c:1658
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
Definition: target.c:2550
struct target * get_current_target(struct command_context *cmd_ctx)
Definition: target.c:458
void target_handle_event(struct target *target, enum target_event e)
Definition: target.c:4660
int target_call_trace_callbacks(struct target *target, size_t len, uint8_t *data)
Definition: target.c:1802
static bool target_was_examined(const struct target *target)
Definition: target.h:436
@ TARGET_TIMER_TYPE_PERIODIC
Definition: target.h:327
@ TARGET_EVENT_TRACE_CONFIG
Definition: target.h:286
static const char * target_name(const struct target *target)
Returns the instance-specific name of the specified target.
Definition: target.h:233
uint64_t target_addr_t
Definition: types.h:335
#define NULL
Definition: usb.h:16
uint8_t cmd
Definition: vdebug.c:1
uint8_t dummy[96]
Definition: vdebug.c:23