| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- # SPDX-License-Identifier: GPL-2.0-or-later
- #
- set CPU_MAX_ADDRESS 0xFFFFFFFF
- source [find bitsbytes.tcl]
- source [find memory.tcl]
- source [find mmr_helpers.tcl]
- # Common ESP chips definitions
- # Espressif supports only NuttX in the upstream.
- # FreeRTOS support is not upstreamed yet.
- set _RTOS "hwthread"
- if { [info exists ESP_RTOS] } {
- set _RTOS "$ESP_RTOS"
- }
- # by default current dir (when OOCD has been started)
- set _SEMIHOST_BASEDIR "."
- if { [info exists ESP_SEMIHOST_BASEDIR] } {
- set _SEMIHOST_BASEDIR $ESP_SEMIHOST_BASEDIR
- }
- proc set_esp_common_variables { } {
- global _CHIPNAME _ONLYCPU _ESP_SMP_TARGET
- global _CPUNAME_0 _CPUNAME_1 _TARGETNAME_0 _TARGETNAME_1 _TAPNAME_0 _TAPNAME_1
- global _ESP_WDT_DISABLE _ESP_SOC_RESET _ESP_MEMPROT_IS_ENABLED
- # For now we support dual core at most.
- if { $_ONLYCPU == 1 && $_ESP_SMP_TARGET == 0} {
- set _TARGETNAME_0 $_CHIPNAME
- set _CPUNAME_0 cpu
- set _TAPNAME_0 $_CHIPNAME.$_CPUNAME_0
- } else {
- set _CPUNAME_0 cpu0
- set _CPUNAME_1 cpu1
- set _TARGETNAME_0 $_CHIPNAME.$_CPUNAME_0
- set _TARGETNAME_1 $_CHIPNAME.$_CPUNAME_1
- set _TAPNAME_0 $_TARGETNAME_0
- set _TAPNAME_1 $_TARGETNAME_1
- }
- set _ESP_WDT_DISABLE "${_CHIPNAME}_wdt_disable"
- set _ESP_SOC_RESET "${_CHIPNAME}_soc_reset"
- set _ESP_MEMPROT_IS_ENABLED "${_CHIPNAME}_memprot_is_enabled"
- }
- proc create_esp_jtag { } {
- global _CHIPNAME _CPUNAME_0 _CPUNAME_1 _CPUTAPID _ONLYCPU
- jtag newtap $_CHIPNAME $_CPUNAME_0 -irlen 5 -expected-id $_CPUTAPID
- if { $_ONLYCPU != 1 } {
- jtag newtap $_CHIPNAME $_CPUNAME_1 -irlen 5 -expected-id $_CPUTAPID
- } elseif [info exists _CPUNAME_1] {
- jtag newtap $_CHIPNAME $_CPUNAME_1 -irlen 5 -disable -expected-id $_CPUTAPID
- }
- }
- proc create_openocd_targets { } {
- global _TARGETNAME_0 _TARGETNAME_1 _TAPNAME_0 _TAPNAME_1 _RTOS _CHIPNAME _ONLYCPU
- target create $_TARGETNAME_0 $_CHIPNAME -chain-position $_TAPNAME_0 -coreid 0 -rtos $_RTOS
- if { $_ONLYCPU != 1 } {
- target create $_TARGETNAME_1 $_CHIPNAME -chain-position $_TAPNAME_1 -coreid 1 -rtos $_RTOS
- target smp $_TARGETNAME_0 $_TARGETNAME_1
- }
- }
- proc create_esp_target { ARCH } {
- set_esp_common_variables
- create_esp_jtag
- create_openocd_targets
- configure_openocd_events
- if { $ARCH == "xtensa"} {
- configure_esp_xtensa_default_settings
- } else {
- # riscv targets are not upstreamed yet.
- # they can be found at the official Espressif fork.
- }
- }
- #################### Set event handlers and default settings ####################
- proc configure_event_examine_end { } {
- global _TARGETNAME_0 _TARGETNAME_1 _ONLYCPU
- $_TARGETNAME_0 configure -event examine-end {
- # Need to enable to set 'semihosting_basedir'
- arm semihosting enable
- arm semihosting_resexit enable
- if { [info exists _SEMIHOST_BASEDIR] } {
- if { $_SEMIHOST_BASEDIR != "" } {
- arm semihosting_basedir $_SEMIHOST_BASEDIR
- }
- }
- }
- if { $_ONLYCPU != 1 } {
- $_TARGETNAME_1 configure -event examine-end {
- # Need to enable to set 'semihosting_basedir'
- arm semihosting enable
- arm semihosting_resexit enable
- if { [info exists _SEMIHOST_BASEDIR] } {
- if { $_SEMIHOST_BASEDIR != "" } {
- arm semihosting_basedir $_SEMIHOST_BASEDIR
- }
- }
- }
- }
- }
- proc configure_event_reset_assert_post { } {
- global _TARGETNAME_0 _TARGETNAME_1 _ONLYCPU
- $_TARGETNAME_0 configure -event reset-assert-post {
- global _ESP_SOC_RESET
- $_ESP_SOC_RESET
- }
- if { $_ONLYCPU != 1 } {
- $_TARGETNAME_1 configure -event reset-assert-post {
- global _ESP_SOC_RESET
- $_ESP_SOC_RESET
- }
- }
- }
- proc configure_event_halted { } {
- global _TARGETNAME_0
- $_TARGETNAME_0 configure -event halted {
- global _ESP_WDT_DISABLE
- $_ESP_WDT_DISABLE
- esp halted_event_handler
- }
- }
- proc configure_event_gdb_attach { } {
- global _TARGETNAME_0 _TARGETNAME_1 _ONLYCPU
- $_TARGETNAME_0 configure -event gdb-attach {
- if { $_ESP_SMP_BREAK != 0 } {
- $_TARGETNAME_0 xtensa smpbreak BreakIn BreakOut
- }
- # necessary to auto-probe flash bank when GDB is connected and generate proper memory map
- halt 1000
- if { [$_ESP_MEMPROT_IS_ENABLED] } {
- # 'reset halt' to disable memory protection and allow flasher to work correctly
- echo "Memory protection is enabled. Reset target to disable it..."
- reset halt
- }
- }
- if { $_ONLYCPU != 1 } {
- $_TARGETNAME_1 configure -event gdb-attach {
- if { $_ESP_SMP_BREAK != 0 } {
- $_TARGETNAME_1 xtensa smpbreak BreakIn BreakOut
- }
- # necessary to auto-probe flash bank when GDB is connected
- halt 1000
- if { [$_ESP_MEMPROT_IS_ENABLED] } {
- # 'reset halt' to disable memory protection and allow flasher to work correctly
- echo "Memory protection is enabled. Reset target to disable it..."
- reset halt
- }
- }
- }
- }
- proc configure_openocd_events { } {
- configure_event_examine_end
- configure_event_reset_assert_post
- configure_event_gdb_attach
- }
- proc configure_esp_xtensa_default_settings { } {
- global _TARGETNAME_0 _ESP_SMP_BREAK _FLASH_VOLTAGE _CHIPNAME
- $_TARGETNAME_0 xtensa maskisr on
- if { $_ESP_SMP_BREAK != 0 } {
- $_TARGETNAME_0 xtensa smpbreak BreakIn BreakOut
- }
- gdb_breakpoint_override hard
- if { [info exists _FLASH_VOLTAGE] } {
- $_TARGETNAME_0 $_CHIPNAME flashbootstrap $_FLASH_VOLTAGE
- }
- }
|