|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
| 2 | + |
| 3 | +/*************************************************************************** |
| 4 | + * ESP32-C61 target for OpenOCD * |
| 5 | + * Copyright (C) 2024 Espressif Systems Ltd. * |
| 6 | + ***************************************************************************/ |
| 7 | + |
| 8 | +#ifdef HAVE_CONFIG_H |
| 9 | +#include "config.h" |
| 10 | +#endif |
| 11 | + |
| 12 | +#include <helper/command.h> |
| 13 | +#include <helper/bits.h> |
| 14 | +#include <target/target.h> |
| 15 | +#include <target/target_type.h> |
| 16 | +#include <target/register.h> |
| 17 | +#include <target/semihosting_common.h> |
| 18 | +#include <target/riscv/debug_defines.h> |
| 19 | + |
| 20 | +#include "esp_semihosting.h" |
| 21 | +#include "esp_riscv_apptrace.h" |
| 22 | +#include "esp_riscv.h" |
| 23 | + |
| 24 | +/* max supported hw breakpoint and watchpoint count */ |
| 25 | +#define ESP32C61_BP_NUM 3 |
| 26 | +#define ESP32C61_WP_NUM 3 |
| 27 | + |
| 28 | +/* ASSIST_DEBUG registers */ |
| 29 | +#define ESP32C61_ASSIST_DEBUG_CPU0_MON_REG 0xFFFFFFFF//0x600C2000 |
| 30 | + |
| 31 | +#define ESP32C61_DRAM_LOW 0x40800000 |
| 32 | +#define ESP32C61_DRAM_HIGH 0x40860000 |
| 33 | + |
| 34 | +static bool esp32c61_is_idram_address(target_addr_t addr) |
| 35 | +{ |
| 36 | + return addr >= ESP32C61_DRAM_LOW && addr < ESP32C61_DRAM_HIGH; |
| 37 | +} |
| 38 | + |
| 39 | +static const struct esp_semihost_ops esp32c61_semihost_ops = { |
| 40 | + .prepare = NULL, |
| 41 | + .post_reset = esp_semihosting_post_reset |
| 42 | +}; |
| 43 | + |
| 44 | +static const struct esp_flash_breakpoint_ops esp32c61_flash_brp_ops = { |
| 45 | + .breakpoint_prepare = esp_algo_flash_breakpoint_prepare, |
| 46 | + .breakpoint_add = esp_algo_flash_breakpoint_add, |
| 47 | + .breakpoint_remove = esp_algo_flash_breakpoint_remove, |
| 48 | + .breakpoint_lazy_process = true, |
| 49 | +}; |
| 50 | + |
| 51 | +static const char *esp32c61_csrs[] = { |
| 52 | + "mideleg", "medeleg", "mie", "mip", |
| 53 | +}; |
| 54 | + |
| 55 | +static int esp32c61_target_create(struct target *target, Jim_Interp *interp) |
| 56 | +{ |
| 57 | + struct esp_riscv_common *esp_riscv = calloc(1, sizeof(*esp_riscv)); |
| 58 | + if (!esp_riscv) |
| 59 | + return ERROR_FAIL; |
| 60 | + |
| 61 | + target->arch_info = esp_riscv; |
| 62 | + |
| 63 | + esp_riscv->assist_debug_cpu0_mon_reg = ESP32C61_ASSIST_DEBUG_CPU0_MON_REG; |
| 64 | + esp_riscv->assist_debug_cpu_offset = 0; |
| 65 | + |
| 66 | + esp_riscv->max_bp_num = ESP32C61_BP_NUM; |
| 67 | + esp_riscv->max_wp_num = ESP32C61_WP_NUM; |
| 68 | + |
| 69 | + esp_riscv->rtccntl_reset_state_reg = 0;//ESP32C61_RTCCNTL_RESET_STATE_REG; |
| 70 | + esp_riscv->print_reset_reason = NULL;//&esp32c61_print_reset_reason; |
| 71 | + esp_riscv->existent_csrs = esp32c61_csrs; |
| 72 | + esp_riscv->existent_csr_size = ARRAY_SIZE(esp32c61_csrs); |
| 73 | + esp_riscv->is_dram_address = esp32c61_is_idram_address; |
| 74 | + esp_riscv->is_iram_address = esp32c61_is_idram_address; |
| 75 | + |
| 76 | + if (esp_riscv_alloc_trigger_addr(target) != ERROR_OK) |
| 77 | + return ERROR_FAIL; |
| 78 | + |
| 79 | + riscv_info_init(target, &esp_riscv->riscv); |
| 80 | + |
| 81 | + return ERROR_OK; |
| 82 | +} |
| 83 | + |
| 84 | +static int esp32c61_init_target(struct command_context *cmd_ctx, |
| 85 | + struct target *target) |
| 86 | +{ |
| 87 | + int ret = riscv_target.init_target(cmd_ctx, target); |
| 88 | + if (ret != ERROR_OK) |
| 89 | + return ret; |
| 90 | + |
| 91 | + target->semihosting->user_command_extension = esp_semihosting_common; |
| 92 | + |
| 93 | + struct esp_riscv_common *esp_riscv = target_to_esp_riscv(target); |
| 94 | + |
| 95 | + ret = esp_riscv_init_arch_info(target, |
| 96 | + esp_riscv, |
| 97 | + &esp32c61_flash_brp_ops, |
| 98 | + &esp32c61_semihost_ops); |
| 99 | + if (ret != ERROR_OK) |
| 100 | + return ret; |
| 101 | + |
| 102 | + return ERROR_OK; |
| 103 | +} |
| 104 | + |
| 105 | +static const struct command_registration esp32c61_command_handlers[] = { |
| 106 | + { |
| 107 | + .usage = "", |
| 108 | + .chain = riscv_command_handlers, |
| 109 | + }, |
| 110 | + { |
| 111 | + .name = "esp", |
| 112 | + .usage = "", |
| 113 | + .chain = esp_riscv_command_handlers, |
| 114 | + }, |
| 115 | + { |
| 116 | + .name = "esp", |
| 117 | + .usage = "", |
| 118 | + .chain = esp32_apptrace_command_handlers, |
| 119 | + }, |
| 120 | + COMMAND_REGISTRATION_DONE |
| 121 | +}; |
| 122 | + |
| 123 | +struct target_type esp32c61_target = { |
| 124 | + .name = "esp32c61", |
| 125 | + |
| 126 | + .target_create = esp32c61_target_create, |
| 127 | + .init_target = esp32c61_init_target, |
| 128 | + .deinit_target = esp_riscv_deinit_target, |
| 129 | + .examine = esp_riscv_examine, |
| 130 | + |
| 131 | + /* poll current target status */ |
| 132 | + .poll = esp_riscv_poll, |
| 133 | + |
| 134 | + .halt = riscv_halt, |
| 135 | + .resume = esp_riscv_resume, |
| 136 | + .step = riscv_openocd_step, |
| 137 | + |
| 138 | + .assert_reset = riscv_assert_reset, |
| 139 | + .deassert_reset = riscv_deassert_reset, |
| 140 | + |
| 141 | + .read_memory = esp_riscv_read_memory, |
| 142 | + .write_memory = esp_riscv_write_memory, |
| 143 | + |
| 144 | + .checksum_memory = riscv_checksum_memory, |
| 145 | + |
| 146 | + .get_gdb_arch = riscv_get_gdb_arch, |
| 147 | + .get_gdb_reg_list = riscv_get_gdb_reg_list, |
| 148 | + .get_gdb_reg_list_noread = riscv_get_gdb_reg_list_noread, |
| 149 | + |
| 150 | + .add_breakpoint = esp_riscv_breakpoint_add, |
| 151 | + .remove_breakpoint = esp_riscv_breakpoint_remove, |
| 152 | + |
| 153 | + .add_watchpoint = riscv_add_watchpoint, |
| 154 | + .remove_watchpoint = riscv_remove_watchpoint, |
| 155 | + .hit_watchpoint = esp_riscv_hit_watchpoint, |
| 156 | + |
| 157 | + .arch_state = riscv_arch_state, |
| 158 | + |
| 159 | + .run_algorithm = esp_riscv_run_algorithm, |
| 160 | + .start_algorithm = esp_riscv_start_algorithm, |
| 161 | + .wait_algorithm = esp_riscv_wait_algorithm, |
| 162 | + |
| 163 | + .commands = esp32c61_command_handlers, |
| 164 | + |
| 165 | + .address_bits = riscv_xlen_nonconst, |
| 166 | +}; |
0 commit comments