# SPDX-License-Identifier: GPL-2.0-or-later
#
# The ESP32-S2 only supports JTAG.
transport select jtag

set CPU_MAX_ADDRESS 0xFFFFFFFF
source [find bitsbytes.tcl]
source [find memory.tcl]
source [find mmr_helpers.tcl]
# Source the ESP common configuration file
source [find target/esp_common.cfg]

if { [info exists CHIPNAME] } {
	set _CHIPNAME $CHIPNAME
} else {
	set _CHIPNAME esp32s2
}

if { [info exists CPUTAPID] } {
	set _CPUTAPID $CPUTAPID
} else {
	set _CPUTAPID 0x120034e5
}

set _TARGETNAME $_CHIPNAME
set _CPUNAME cpu
set _TAPNAME $_CHIPNAME.$_CPUNAME

jtag newtap $_CHIPNAME $_CPUNAME -irlen 5 -expected-id $_CPUTAPID

proc esp32s2_memprot_is_enabled { } {
	# IRAM0, DPORT_PMS_PRO_IRAM0_0_REG
	if { [get_mmr_bit 0x3f4c1010 0] != 0 } {
		return 1
	}
	# DRAM0, DPORT_PMS_PRO_DRAM0_0_REG
	if { [get_mmr_bit 0x3f4c1028 0] != 0 } {
		return 1
	}
	# PERI1, DPORT_PMS_PRO_DPORT_0_REG
	if { [get_mmr_bit 0x3f4c103c 0] != 0 } {
		return 1
	}
	# PERI2, DPORT_PMS_PRO_AHB_0_REG
	if { [get_mmr_bit 0x3f4c105c 0] != 0 } {
		return 1
	}
	return 0
}

target create $_TARGETNAME esp32s2 -endian little -chain-position $_TAPNAME

$_TARGETNAME configure -event gdb-attach {
	# necessary to auto-probe flash bank when GDB is connected and generate proper memory map
	halt 1000
	if { [esp32s2_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
	}
}

xtensa maskisr on

$_TARGETNAME 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
		}
	}
}

$_TARGETNAME configure -event reset-assert-post { soft_reset_halt }

gdb_breakpoint_override hard

source [find target/xtensa-core-esp32s2.cfg]