OpenOCD
esp32s2.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /***************************************************************************
4  * ESP32-S2 target for OpenOCD *
5  * Copyright (C) 2019 Espressif Systems Ltd. *
6  ***************************************************************************/
7 
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11 
12 #include <helper/time_support.h>
13 #include "assert.h"
14 #include <target/target.h>
15 #include <target/target_type.h>
17 #include "esp_xtensa.h"
18 #include "esp_xtensa_semihosting.h"
19 
20 #define ESP32_S2_RTC_DATA_LOW 0x50000000
21 #define ESP32_S2_RTC_DATA_HIGH 0x50002000
22 #define ESP32_S2_DR_REG_LOW 0x3f400000
23 #define ESP32_S2_DR_REG_HIGH 0x3f4d3FFC
24 #define ESP32_S2_SYS_RAM_LOW 0x60000000UL
25 #define ESP32_S2_SYS_RAM_HIGH (ESP32_S2_SYS_RAM_LOW + 0x20000000UL)
26 
27 /* ESP32 WDT */
28 #define ESP32_S2_WDT_WKEY_VALUE 0x50d83aa1
29 #define ESP32_S2_TIMG0_BASE 0x3f41F000
30 #define ESP32_S2_TIMG1_BASE 0x3f420000
31 #define ESP32_S2_TIMGWDT_CFG0_OFF 0x48
32 #define ESP32_S2_TIMGWDT_PROTECT_OFF 0x64
33 #define ESP32_S2_TIMG0WDT_CFG0 (ESP32_S2_TIMG0_BASE + ESP32_S2_TIMGWDT_CFG0_OFF)
34 #define ESP32_S2_TIMG1WDT_CFG0 (ESP32_S2_TIMG1_BASE + ESP32_S2_TIMGWDT_CFG0_OFF)
35 #define ESP32_S2_TIMG0WDT_PROTECT (ESP32_S2_TIMG0_BASE + ESP32_S2_TIMGWDT_PROTECT_OFF)
36 #define ESP32_S2_TIMG1WDT_PROTECT (ESP32_S2_TIMG1_BASE + ESP32_S2_TIMGWDT_PROTECT_OFF)
37 #define ESP32_S2_RTCCNTL_BASE 0x3f408000
38 #define ESP32_S2_RTCWDT_CFG_OFF 0x94
39 #define ESP32_S2_RTCWDT_PROTECT_OFF 0xAC
40 #define ESP32_S2_SWD_CONF_OFF 0xB0
41 #define ESP32_S2_SWD_WPROTECT_OFF 0xB4
42 #define ESP32_S2_RTC_CNTL_DIG_PWC_REG_OFF 0x8C
43 #define ESP32_S2_RTC_CNTL_DIG_PWC_REG (ESP32_S2_RTCCNTL_BASE + ESP32_S2_RTC_CNTL_DIG_PWC_REG_OFF)
44 #define ESP32_S2_RTCWDT_CFG (ESP32_S2_RTCCNTL_BASE + ESP32_S2_RTCWDT_CFG_OFF)
45 #define ESP32_S2_RTCWDT_PROTECT (ESP32_S2_RTCCNTL_BASE + ESP32_S2_RTCWDT_PROTECT_OFF)
46 #define ESP32_S2_SWD_CONF_REG (ESP32_S2_RTCCNTL_BASE + ESP32_S2_SWD_CONF_OFF)
47 #define ESP32_S2_SWD_WPROTECT_REG (ESP32_S2_RTCCNTL_BASE + ESP32_S2_SWD_WPROTECT_OFF)
48 #define ESP32_S2_SWD_AUTO_FEED_EN_M BIT(31)
49 #define ESP32_S2_SWD_WKEY_VALUE 0x8F1D312AU
50 #define ESP32_S2_OPTIONS0 (ESP32_S2_RTCCNTL_BASE + 0x0000)
51 #define ESP32_S2_SW_SYS_RST_M 0x80000000
52 #define ESP32_S2_SW_SYS_RST_V 0x1
53 #define ESP32_S2_SW_SYS_RST_S 31
54 #define ESP32_S2_SW_STALL_PROCPU_C0_M ((ESP32_S2_SW_STALL_PROCPU_C0_V) << (ESP32_S2_SW_STALL_PROCPU_C0_S))
55 #define ESP32_S2_SW_STALL_PROCPU_C0_V 0x3
56 #define ESP32_S2_SW_STALL_PROCPU_C0_S 2
57 #define ESP32_S2_SW_CPU_STALL (ESP32_S2_RTCCNTL_BASE + 0x00B8)
58 #define ESP32_S2_SW_STALL_PROCPU_C1_M ((ESP32_S2_SW_STALL_PROCPU_C1_V) << (ESP32_S2_SW_STALL_PROCPU_C1_S))
59 #define ESP32_S2_SW_STALL_PROCPU_C1_V 0x3FU
60 #define ESP32_S2_SW_STALL_PROCPU_C1_S 26
61 #define ESP32_S2_CLK_CONF (ESP32_S2_RTCCNTL_BASE + 0x0074)
62 #define ESP32_S2_CLK_CONF_DEF 0x1583218
63 #define ESP32_S2_STORE4 (ESP32_S2_RTCCNTL_BASE + 0x00BC)
64 #define ESP32_S2_STORE5 (ESP32_S2_RTCCNTL_BASE + 0x00C0)
65 #define ESP32_S2_DPORT_PMS_OCCUPY_3 0x3F4C10E0
66 
67 #define ESP32_S2_TRACEMEM_BLOCK_SZ 0x4000
68 
69 #define ESP32_S2_DR_REG_UART_BASE 0x3f400000
70 #define ESP32_S2_REG_UART_BASE(i) (ESP32_S2_DR_REG_UART_BASE + (i) * 0x10000)
71 #define ESP32_S2_UART_DATE_REG(i) (ESP32_S2_REG_UART_BASE(i) + 0x74)
74 };
75 
76 static int esp32s2_soc_reset(struct target *target);
77 static int esp32s2_disable_wdts(struct target *target);
78 
79 static int esp32s2_assert_reset(struct target *target)
80 {
81  return ERROR_OK;
82 }
83 
85 {
87 
88  LOG_TARGET_DEBUG(target, "begin");
89 
90  int res = xtensa_deassert_reset(target);
91  if (res != ERROR_OK)
92  return res;
93 
94  /* restore configured value
95  esp32s2_soc_reset() modified it, but can not restore just after SW reset for some reason (???) */
97  if (res != ERROR_OK) {
98  LOG_ERROR("Failed to restore smpbreak (%d)!", res);
99  return res;
100  }
101  return ERROR_OK;
102 }
103 
105 {
106  LOG_TARGET_DEBUG(target, "begin");
107 
108  /* Reset the SoC first */
109  int res = esp32s2_soc_reset(target);
110  if (res != ERROR_OK)
111  return res;
113 }
114 
117  uint32_t mask,
118  uint32_t val)
119 {
120  uint32_t reg_val;
121  int res = target_read_u32(target, addr, &reg_val);
122  if (res != ERROR_OK)
123  return res;
124  reg_val = (reg_val & (~mask)) | val;
125  res = target_write_u32(target, addr, reg_val);
126  if (res != ERROR_OK)
127  return res;
128 
129  return ERROR_OK;
130 }
131 
132 static int esp32s2_stall_set(struct target *target, bool stall)
133 {
134  LOG_TARGET_DEBUG(target, "begin");
135 
139  stall ? 0x21U << ESP32_S2_SW_STALL_PROCPU_C1_S : 0);
140  if (res != ERROR_OK) {
141  LOG_ERROR("Failed to write ESP32_S2_SW_CPU_STALL (%d)!", res);
142  return res;
143  }
147  stall ? 0x2 << ESP32_S2_SW_STALL_PROCPU_C0_S : 0);
148  if (res != ERROR_OK) {
149  LOG_ERROR("Failed to write ESP32_S2_OPTIONS0 (%d)!", res);
150  return res;
151  }
152  return ERROR_OK;
153 }
154 
155 static inline int esp32s2_stall(struct target *target)
156 {
157  return esp32s2_stall_set(target, true);
158 }
159 
160 static inline int esp32s2_unstall(struct target *target)
161 {
162  return esp32s2_stall_set(target, false);
163 }
164 
165 /* Reset ESP32-S2's peripherals.
166 Postconditions: all peripherals except RTC_CNTL are reset, CPU's PC is undefined, PRO CPU is halted, APP CPU is in reset
167 How this works:
168 0. make sure target is halted; if not, try to halt it; if that fails, try to reset it (via OCD) and then halt
169 1. Resets clock related registers
170 2. Stalls CPU
171 3. trigger SoC reset using RTC_CNTL_SW_SYS_RST bit
172 4. CPU is reset and stalled at the first reset vector instruction
173 5. wait for the OCD to be reset
174 6. halt the target
175 7. Unstalls CPU
176 8. Disables WDTs and trace memory mapping
177 */
178 static int esp32s2_soc_reset(struct target *target)
179 {
180  int res;
182 
183  LOG_DEBUG("start");
184 
185  /* In order to write to peripheral registers, target must be halted first */
186  if (target->state != TARGET_HALTED) {
187  LOG_TARGET_DEBUG(target, "Target not halted before SoC reset, trying to halt it first");
189  res = target_wait_state(target, TARGET_HALTED, 1000);
190  if (res != ERROR_OK) {
191  LOG_TARGET_DEBUG(target, "Couldn't halt target before SoC reset, trying to do reset-halt");
193  if (res != ERROR_OK) {
195  target,
196  "Couldn't halt target before SoC reset! (xtensa_assert_reset returned %d)",
197  res);
198  return res;
199  }
200  alive_sleep(10);
202  int reset_halt_save = target->reset_halt;
203  target->reset_halt = 1;
205  target->reset_halt = reset_halt_save;
206  if (res != ERROR_OK) {
208  target,
209  "Couldn't halt target before SoC reset! (xtensa_deassert_reset returned %d)",
210  res);
211  return res;
212  }
213  alive_sleep(10);
216  res = target_wait_state(target, TARGET_HALTED, 1000);
217  if (res != ERROR_OK) {
218  LOG_TARGET_ERROR(target, "Couldn't halt target before SoC reset");
219  return res;
220  }
221  }
222  }
223 
224  assert(target->state == TARGET_HALTED);
225 
226  /* Set some clock-related RTC registers to the default values */
228  if (res != ERROR_OK) {
229  LOG_ERROR("Failed to write ESP32_S2_STORE4 (%d)!", res);
230  return res;
231  }
233  if (res != ERROR_OK) {
234  LOG_ERROR("Failed to write ESP32_S2_STORE5 (%d)!", res);
235  return res;
236  }
238  if (res != ERROR_OK) {
239  LOG_ERROR("Failed to write ESP32_S2_RTC_CNTL_DIG_PWC_REG (%d)!", res);
240  return res;
241  }
243  if (res != ERROR_OK) {
244  LOG_ERROR("Failed to write ESP32_S2_CLK_CONF (%d)!", res);
245  return res;
246  }
247  /* Stall CPU */
248  res = esp32s2_stall(target);
249  if (res != ERROR_OK)
250  return res;
251  /* enable stall */
253  if (res != ERROR_OK) {
254  LOG_ERROR("Failed to set smpbreak (%d)!", res);
255  return res;
256  }
257  /* Reset CPU */
258  xtensa->suppress_dsr_errors = true;
263  xtensa->suppress_dsr_errors = false;
264  if (res != ERROR_OK) {
265  LOG_ERROR("Failed to write ESP32_S2_OPTIONS0 (%d)!", res);
266  return res;
267  }
268  /* Wait for SoC to reset */
269  alive_sleep(100);
270  int64_t timeout = timeval_ms() + 100;
271  while (target->state != TARGET_RESET && target->state != TARGET_RUNNING) {
272  alive_sleep(10);
274  if (timeval_ms() >= timeout) {
275  LOG_TARGET_ERROR(target, "Timed out waiting for CPU to be reset, target state=%d",
276  target->state);
277  return ERROR_TARGET_TIMEOUT;
278  }
279  }
280 
282  res = target_wait_state(target, TARGET_HALTED, 1000);
283  if (res != ERROR_OK) {
284  LOG_TARGET_ERROR(target, "Couldn't halt target before SoC reset");
285  return res;
286  }
287  /* Unstall CPU */
288  res = esp32s2_unstall(target);
289  if (res != ERROR_OK)
290  return res;
291  /* Disable WDTs */
293  if (res != ERROR_OK)
294  return res;
295  /* Disable trace memory mapping */
297  if (res != ERROR_OK) {
298  LOG_ERROR("Failed to write ESP32_S2_DPORT_PMS_OCCUPY_3 (%d)!", res);
299  return res;
300  }
301  return ERROR_OK;
302 }
303 
304 static int esp32s2_disable_wdts(struct target *target)
305 {
306  /* TIMG1 WDT */
308  if (res != ERROR_OK) {
309  LOG_ERROR("Failed to write ESP32_S2_TIMG0WDT_PROTECT (%d)!", res);
310  return res;
311  }
313  if (res != ERROR_OK) {
314  LOG_ERROR("Failed to write ESP32_S2_TIMG0WDT_CFG0 (%d)!", res);
315  return res;
316  }
317  /* TIMG2 WDT */
319  if (res != ERROR_OK) {
320  LOG_ERROR("Failed to write ESP32_S2_TIMG1WDT_PROTECT (%d)!", res);
321  return res;
322  }
324  if (res != ERROR_OK) {
325  LOG_ERROR("Failed to write ESP32_S2_TIMG1WDT_CFG0 (%d)!", res);
326  return res;
327  }
328  /* RTC WDT */
330  if (res != ERROR_OK) {
331  LOG_ERROR("Failed to write ESP32_S2_RTCWDT_PROTECT (%d)!", res);
332  return res;
333  }
335  if (res != ERROR_OK) {
336  LOG_ERROR("Failed to write ESP32_S2_RTCWDT_CFG (%d)!", res);
337  return res;
338  }
339  /* Enable SWD auto-feed */
341  if (res != ERROR_OK) {
342  LOG_ERROR("Failed to write ESP32_S2_SWD_WPROTECT_REG (%d)!", res);
343  return res;
344  }
345  uint32_t swd_conf_reg = 0;
346  res = target_read_u32(target, ESP32_S2_SWD_CONF_REG, &swd_conf_reg);
347  if (res != ERROR_OK) {
348  LOG_ERROR("Failed to read ESP32_S2_SWD_CONF_REG (%d)!", res);
349  return res;
350  }
351  swd_conf_reg |= ESP32_S2_SWD_AUTO_FEED_EN_M;
352  res = target_write_u32(target, ESP32_S2_SWD_CONF_REG, swd_conf_reg);
353  if (res != ERROR_OK) {
354  LOG_ERROR("Failed to write ESP32_S2_SWD_CONF_REG (%d)!", res);
355  return res;
356  }
357  return ERROR_OK;
358 }
359 
360 static int esp32s2_arch_state(struct target *target)
361 {
362  return ERROR_OK;
363 }
364 
365 static int esp32s2_on_halt(struct target *target)
366 {
367  int ret = esp32s2_disable_wdts(target);
368  if (ret == ERROR_OK)
369  ret = esp_xtensa_on_halt(target);
370  return ret;
371 }
372 
373 static int esp32s2_step(struct target *target, bool current,
374  target_addr_t address, bool handle_breakpoints)
375 {
376  int ret = xtensa_step(target, current, address, handle_breakpoints);
377  if (ret == ERROR_OK) {
380  }
381  return ret;
382 }
383 
384 static int esp32s2_poll(struct target *target)
385 {
386  enum target_state old_state = target->state;
387  int ret = esp_xtensa_poll(target);
388  if (ret != ERROR_OK)
389  return ret;
390 
391  if (old_state != TARGET_HALTED && target->state == TARGET_HALTED) {
392  /* Call any event callbacks that are applicable */
393  if (old_state == TARGET_DEBUG_RUNNING) {
395  } else {
397  struct esp_xtensa_common *esp_xtensa = target_to_esp_xtensa(target);
398  if (ret == ERROR_OK && esp_xtensa->semihost.need_resume) {
399  esp_xtensa->semihost.need_resume = false;
400  /* Resume xtensa_resume will handle BREAK instruction. */
401  ret = target_resume(target, true, 0, true, false);
402  if (ret != ERROR_OK) {
403  LOG_ERROR("Failed to resume target");
404  return ret;
405  }
406  }
407  return ret;
408  }
411  }
412  }
413 
414  return ret;
415 }
416 
417 static int esp32s2_virt2phys(struct target *target,
418  target_addr_t virtual, target_addr_t *physical)
419 {
420  *physical = virtual;
421  return ERROR_OK;
422 }
423 
424 static int esp32s2_target_init(struct command_context *cmd_ctx, struct target *target)
425 {
426  int ret = esp_xtensa_target_init(cmd_ctx, target);
427  if (ret != ERROR_OK)
428  return ret;
429 
431 }
432 
433 static const struct xtensa_debug_ops esp32s2_dbg_ops = {
435  .queue_reg_read = xtensa_dm_queue_reg_read,
436  .queue_reg_write = xtensa_dm_queue_reg_write
437 };
438 
439 static const struct xtensa_power_ops esp32s2_pwr_ops = {
441  .queue_reg_write = xtensa_dm_queue_pwr_reg_write
442 };
443 
444 static const struct esp_semihost_ops esp32s2_semihost_ops = {
446 };
447 
448 static int esp32s2_target_create(struct target *target, Jim_Interp *interp)
449 {
450  struct xtensa_debug_module_config esp32s2_dm_cfg = {
452  .pwr_ops = &esp32s2_pwr_ops,
453  .tap = target->tap,
454  .queue_tdi_idle = NULL,
455  .queue_tdi_idle_arg = NULL
456  };
457 
458  /* creates xtensa object */
459  struct esp32s2_common *esp32 = calloc(1, sizeof(*esp32));
460  if (!esp32) {
461  LOG_ERROR("Failed to alloc memory for arch info!");
462  return ERROR_FAIL;
463  }
464 
465  int ret = esp_xtensa_init_arch_info(target, &esp32->esp_xtensa, &esp32s2_dm_cfg, &esp32s2_semihost_ops);
466  if (ret != ERROR_OK) {
467  LOG_ERROR("Failed to init arch info!");
468  free(esp32);
469  return ret;
470  }
471 
472  /* Assume running target. If different, the first poll will fix this */
475  return ERROR_OK;
476 }
477 
478 static const struct command_registration esp32s2_command_handlers[] = {
479  {
481  },
482  {
483  .name = "esp",
484  .usage = "",
486  },
487  {
488  .name = "arm",
489  .mode = COMMAND_ANY,
490  .help = "ARM Command Group",
491  .usage = "",
493  },
495 };
496 
497 /* Holds methods for Xtensa targets. */
498 struct target_type esp32s2_target = {
499  .name = "esp32s2",
500 
501  .poll = esp32s2_poll,
502  .arch_state = esp32s2_arch_state,
503 
504  .halt = xtensa_halt,
505  .resume = xtensa_resume,
506  .step = esp32s2_step,
507 
508  .assert_reset = esp32s2_assert_reset,
509  .deassert_reset = esp32s2_deassert_reset,
510  .soft_reset_halt = esp32s2_soft_reset_halt,
511 
512  .virt2phys = esp32s2_virt2phys,
513  .mmu = xtensa_mmu_is_enabled,
514  .read_memory = xtensa_read_memory,
515  .write_memory = xtensa_write_memory,
516 
517  .read_buffer = xtensa_read_buffer,
518  .write_buffer = xtensa_write_buffer,
519 
520  .checksum_memory = xtensa_checksum_memory,
521 
522  .get_gdb_arch = xtensa_get_gdb_arch,
523  .get_gdb_reg_list = xtensa_get_gdb_reg_list,
524 
525  .run_algorithm = xtensa_run_algorithm,
526  .start_algorithm = xtensa_start_algorithm,
527  .wait_algorithm = xtensa_wait_algorithm,
528 
529  .add_breakpoint = esp_xtensa_breakpoint_add,
530  .remove_breakpoint = esp_xtensa_breakpoint_remove,
531 
532  .add_watchpoint = xtensa_watchpoint_add,
533  .remove_watchpoint = xtensa_watchpoint_remove,
534 
535  .target_create = esp32s2_target_create,
536  .init_target = esp32s2_target_init,
537  .examine = xtensa_examine,
538  .deinit_target = esp_xtensa_target_deinit,
539 
540  .commands = esp32s2_command_handlers,
541 };
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
Definition: command.h:253
@ COMMAND_ANY
Definition: command.h:42
uint32_t address
Starting address. Sector aligned.
Definition: dw-spi-helper.h:0
int mask
Definition: esirisc.c:1740
const struct command_registration esp32_apptrace_command_handlers[]
#define ESP32_S2_SWD_AUTO_FEED_EN_M
Definition: esp32s2.c:48
static int esp32s2_deassert_reset(struct target *target)
Definition: esp32s2.c:84
static const struct command_registration esp32s2_command_handlers[]
Definition: esp32s2.c:478
#define ESP32_S2_OPTIONS0
Definition: esp32s2.c:50
#define ESP32_S2_SW_STALL_PROCPU_C1_M
Definition: esp32s2.c:58
#define ESP32_S2_CLK_CONF
Definition: esp32s2.c:61
static const struct esp_semihost_ops esp32s2_semihost_ops
Definition: esp32s2.c:444
static int esp32s2_stall_set(struct target *target, bool stall)
Definition: esp32s2.c:132
#define ESP32_S2_RTCWDT_CFG
Definition: esp32s2.c:44
static const struct xtensa_power_ops esp32s2_pwr_ops
Definition: esp32s2.c:439
#define ESP32_S2_TIMG0WDT_CFG0
Definition: esp32s2.c:33
static int esp32s2_set_peri_reg_mask(struct target *target, target_addr_t addr, uint32_t mask, uint32_t val)
Definition: esp32s2.c:115
#define ESP32_S2_RTCWDT_PROTECT
Definition: esp32s2.c:45
static int esp32s2_disable_wdts(struct target *target)
Definition: esp32s2.c:304
#define ESP32_S2_SWD_WPROTECT_REG
Definition: esp32s2.c:47
#define ESP32_S2_SW_STALL_PROCPU_C1_S
Definition: esp32s2.c:60
#define ESP32_S2_RTC_CNTL_DIG_PWC_REG
Definition: esp32s2.c:43
#define ESP32_S2_TIMG1WDT_PROTECT
Definition: esp32s2.c:36
#define ESP32_S2_SW_CPU_STALL
Definition: esp32s2.c:57
static int esp32s2_arch_state(struct target *target)
Definition: esp32s2.c:360
static int esp32s2_soft_reset_halt(struct target *target)
Definition: esp32s2.c:104
static int esp32s2_target_create(struct target *target, Jim_Interp *interp)
Definition: esp32s2.c:448
static int esp32s2_poll(struct target *target)
Definition: esp32s2.c:384
struct target_type esp32s2_target
Definition: esp32s2.c:498
static const struct xtensa_debug_ops esp32s2_dbg_ops
Definition: esp32s2.c:433
#define ESP32_S2_SWD_WKEY_VALUE
Definition: esp32s2.c:49
#define ESP32_S2_SW_STALL_PROCPU_C0_M
Definition: esp32s2.c:54
#define ESP32_S2_SW_SYS_RST_M
Definition: esp32s2.c:51
#define ESP32_S2_STORE5
Definition: esp32s2.c:64
#define ESP32_S2_STORE4
Definition: esp32s2.c:63
static int esp32s2_stall(struct target *target)
Definition: esp32s2.c:155
#define ESP32_S2_TIMG1WDT_CFG0
Definition: esp32s2.c:34
static int esp32s2_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: esp32s2.c:373
static int esp32s2_target_init(struct command_context *cmd_ctx, struct target *target)
Definition: esp32s2.c:424
#define ESP32_S2_DPORT_PMS_OCCUPY_3
Definition: esp32s2.c:65
#define ESP32_S2_SW_STALL_PROCPU_C0_S
Definition: esp32s2.c:56
#define ESP32_S2_SW_SYS_RST_S
Definition: esp32s2.c:53
static int esp32s2_soc_reset(struct target *target)
Definition: esp32s2.c:178
#define ESP32_S2_WDT_WKEY_VALUE
Definition: esp32s2.c:28
#define ESP32_S2_SWD_CONF_REG
Definition: esp32s2.c:46
#define ESP32_S2_CLK_CONF_DEF
Definition: esp32s2.c:62
static int esp32s2_unstall(struct target *target)
Definition: esp32s2.c:160
#define ESP32_S2_TIMG0WDT_PROTECT
Definition: esp32s2.c:35
static int esp32s2_virt2phys(struct target *target, target_addr_t virtual, target_addr_t *physical)
Definition: esp32s2.c:417
static int esp32s2_assert_reset(struct target *target)
Definition: esp32s2.c:79
static int esp32s2_on_halt(struct target *target)
Definition: esp32s2.c:365
int esp_xtensa_init_arch_info(struct target *target, struct esp_xtensa_common *esp_xtensa, struct xtensa_debug_module_config *dm_cfg, const struct esp_semihost_ops *semihost_ops)
Definition: esp_xtensa.c:65
int esp_xtensa_poll(struct target *target)
Definition: esp_xtensa.c:105
void esp_xtensa_target_deinit(struct target *target)
Definition: esp_xtensa.c:87
int esp_xtensa_target_init(struct command_context *cmd_ctx, struct target *target)
Definition: esp_xtensa.c:82
int esp_xtensa_breakpoint_remove(struct target *target, struct breakpoint *breakpoint)
Definition: esp_xtensa.c:177
int esp_xtensa_breakpoint_add(struct target *target, struct breakpoint *breakpoint)
Definition: esp_xtensa.c:171
int esp_xtensa_on_halt(struct target *target)
Definition: esp_xtensa.c:58
static struct esp_xtensa_common * target_to_esp_xtensa(struct target *target)
Definition: esp_xtensa.h:24
int esp_xtensa_semihosting_init(struct target *target)
int esp_xtensa_semihosting(struct target *target, int *retval)
Checks and processes an ESP Xtensa semihosting request.
void alive_sleep(uint64_t ms)
Definition: log.c:467
#define ERROR_FAIL
Definition: log.h:174
#define LOG_TARGET_ERROR(target, fmt_str,...)
Definition: log.h:162
#define LOG_TARGET_DEBUG(target, fmt_str,...)
Definition: log.h:150
#define LOG_ERROR(expr ...)
Definition: log.h:133
#define LOG_DEBUG(expr ...)
Definition: log.h:110
#define ERROR_OK
Definition: log.h:168
target_addr_t addr
Start address to search for the control block.
Definition: rtt/rtt.c:28
const struct command_registration semihosting_common_handlers[]
@ SEMIHOSTING_HANDLED
#define BIT(nr)
Definition: stm32l4x.h:18
const char * name
Definition: command.h:235
const struct command_registration * chain
If non-NULL, the commands in chain will be registered in the same context and scope of this registrat...
Definition: command.h:249
struct esp_xtensa_common esp_xtensa
Definition: esp32s2.c:73
Semihost calls handling operations.
int(* prepare)(struct target *target)
Callback called before handling semihost call.
struct esp_semihost_data semihost
Definition: esp_xtensa.h:20
This holds methods shared between all instances of a given target type.
Definition: target_type.h:26
const char * name
Name of this type of target.
Definition: target_type.h:31
Definition: target.h:116
struct jtag_tap * tap
Definition: target.h:119
enum target_debug_reason debug_reason
Definition: target.h:154
enum target_state state
Definition: target.h:157
bool reset_halt
Definition: target.h:144
Definition: psoc6.c:83
const struct xtensa_debug_ops * dbg_ops
int(* queue_enable)(struct xtensa_debug_module *dm)
enable operation
int(* queue_reg_read)(struct xtensa_debug_module *dm, enum xtensa_dm_pwr_reg reg, uint8_t *data, uint32_t clear)
register read.
Represents a generic Xtensa core.
Definition: xtensa.h:242
uint32_t smp_break
Definition: xtensa.h:273
bool suppress_dsr_errors
Definition: xtensa.h:272
int target_call_event_callbacks(struct target *target, enum target_event event)
Definition: target.c:1765
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
Definition: target.c:2642
int target_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Make the target (re)start executing using its saved execution context (possibly with some modificatio...
Definition: target.c:556
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
Definition: target.c:2551
int target_wait_state(struct target *target, enum target_state state, unsigned int ms)
Definition: target.c:3215
@ DBG_REASON_NOTHALTED
Definition: target.h:74
@ TARGET_EVENT_HALTED
Definition: target.h:252
@ TARGET_EVENT_DEBUG_HALTED
Definition: target.h:271
target_state
Definition: target.h:53
@ TARGET_RESET
Definition: target.h:57
@ TARGET_DEBUG_RUNNING
Definition: target.h:58
@ TARGET_HALTED
Definition: target.h:56
@ TARGET_RUNNING
Definition: target.h:55
#define ERROR_TARGET_TIMEOUT
Definition: target.h:789
int64_t timeval_ms(void)
uint64_t target_addr_t
Definition: types.h:335
#define NULL
Definition: usb.h:16
int xtensa_watchpoint_add(struct target *target, struct watchpoint *watchpoint)
Definition: xtensa.c:2649
const char * xtensa_get_gdb_arch(const struct target *target)
Definition: xtensa.c:3531
int xtensa_poll(struct target *target)
Definition: xtensa.c:2317
int xtensa_halt(struct target *target)
Definition: xtensa.c:1566
int xtensa_read_buffer(struct target *target, target_addr_t address, uint32_t count, uint8_t *buffer)
Definition: xtensa.c:2094
int xtensa_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Definition: xtensa.c:1489
int xtensa_checksum_memory(struct target *target, target_addr_t address, uint32_t count, uint32_t *checksum)
Definition: xtensa.c:2311
const struct command_registration xtensa_command_handlers[]
Definition: xtensa.c:4622
int xtensa_examine(struct target *target)
Definition: xtensa.c:886
int xtensa_start_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, void *arch_info)
Definition: xtensa.c:2725
int xtensa_watchpoint_remove(struct target *target, struct watchpoint *watchpoint)
Definition: xtensa.c:2705
int xtensa_write_buffer(struct target *target, target_addr_t address, uint32_t count, const uint8_t *buffer)
Definition: xtensa.c:2305
int xtensa_smpbreak_write(struct xtensa *xtensa, uint32_t set)
Definition: xtensa.c:929
int xtensa_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Definition: xtensa.c:2100
int xtensa_mmu_is_enabled(struct target *target, int *enabled)
Definition: xtensa.c:1558
int xtensa_deassert_reset(struct target *target)
Definition: xtensa.c:1182
int xtensa_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Definition: xtensa.c:2011
int xtensa_soft_reset_halt(struct target *target)
Definition: xtensa.c:1204
int xtensa_assert_reset(struct target *target)
Definition: xtensa.c:1161
int xtensa_run_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Definition: xtensa.c:2924
int xtensa_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Definition: xtensa.c:1946
int xtensa_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Definition: xtensa.c:1673
int xtensa_wait_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Waits for an algorithm in the target.
Definition: xtensa.c:2816
static struct xtensa * target_to_xtensa(struct target *target)
Definition: xtensa.h:291
int xtensa_dm_queue_reg_read(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint8_t *value)
int xtensa_dm_queue_pwr_reg_write(struct xtensa_debug_module *dm, enum xtensa_dm_pwr_reg reg, uint32_t data)
int xtensa_dm_queue_pwr_reg_read(struct xtensa_debug_module *dm, enum xtensa_dm_pwr_reg reg, uint8_t *data, uint32_t clear)
int xtensa_dm_queue_reg_write(struct xtensa_debug_module *dm, enum xtensa_dm_reg reg, uint32_t value)
int xtensa_dm_queue_enable(struct xtensa_debug_module *dm)
#define OCDDCR_RUNSTALLINEN