# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
# SPDX-License-Identifier: Apache-2.0

if SOC_FAMILY_ESPRESSIF_ESP32

config ESPTOOLPY_OCT_FLASH
	bool "Use Octal Flash"
	depends on SOC_SERIES_ESP32S3
	default n

config ESPTOOLPY_FLASH_MODE_AUTO_DETECT
	depends on SOC_SERIES_ESP32S3
	bool "Choose flash mode automatically (please read help)"
	default y
	help
	  This config option helps decide whether flash is Quad or Octal, but please note some limitations:

	  1. If the flash chip is an Octal one, even if one of "QIO", "QOUT", "DIO", "DOUT" options is
	      selected in `ESPTOOLPY_FLASHMODE`, our code will automatically change the
	      mode to "OPI" and the sample mode will be STR.
	  2. If the flash chip is a Quad one, even if "OPI" is selected in `ESPTOOLPY_FLASHMODE`, our code will
	     automatically change the mode to "DIO".
	  3. Please do not rely on this option when you are pretty sure that you are using Octal flash,
	     please enable `ESPTOOLPY_OCT_FLASH` option, then you can choose `DTR` sample mode
	     in `ESPTOOLPY_FLASH_SAMPLE_MODE`. Otherwise, only `STR` mode is available.
	  4. Enabling this feature reduces available internal RAM size (around 900 bytes).
	     If your IRAM space is insufficient and you're aware of your flash type,
	     disable this option and select corresponding flash type options.

choice ESPTOOLPY_FLASHMODE
	prompt "Flash SPI mode"
	default ESPTOOLPY_FLASHMODE_DIO
	default ESPTOOLPY_FLASHMODE_OPI if ESPTOOLPY_OCT_FLASH
	help
	  Mode the flash chip is flashed in, as well as the default mode for the
	  binary to run in.

config ESPTOOLPY_FLASHMODE_QIO
	bool "QIO"
	depends on !ESPTOOLPY_OCT_FLASH
config ESPTOOLPY_FLASHMODE_QOUT
	bool "QOUT"
	depends on !ESPTOOLPY_OCT_FLASH
config ESPTOOLPY_FLASHMODE_DIO
	bool "DIO"
	depends on !ESPTOOLPY_OCT_FLASH
config ESPTOOLPY_FLASHMODE_DOUT
	bool "DOUT"
	depends on !ESPTOOLPY_OCT_FLASH
config ESPTOOLPY_FLASHMODE_OPI
	bool "OPI"
	depends on ESPTOOLPY_OCT_FLASH

endchoice # ESPTOOLPY_FLASHMODE

choice ESPTOOLPY_FLASH_SAMPLE_MODE
	prompt "Flash Sampling Mode"
	default ESPTOOLPY_FLASH_SAMPLE_MODE_DTR if ESPTOOLPY_OCT_FLASH
	default ESPTOOLPY_FLASH_SAMPLE_MODE_STR if !ESPTOOLPY_OCT_FLASH

config ESPTOOLPY_FLASH_SAMPLE_MODE_STR
	bool "STR Mode"
config ESPTOOLPY_FLASH_SAMPLE_MODE_DTR
	bool "DTR Mode"
	depends on ESPTOOLPY_OCT_FLASH

endchoice # ESPTOOLPY_FLASH_SAMPLE_MODE

config ESPTOOLPY_FLASHMODE
	string
	default "dio" if ESPTOOLPY_FLASHMODE_QIO
	default "dio" if ESPTOOLPY_FLASHMODE_QOUT
	default "dio" if ESPTOOLPY_FLASHMODE_DIO
	default "dout" if ESPTOOLPY_FLASHMODE_DOUT
	# The 1st and 2nd bootloader doesn't support opi mode,
	# using fastrd instead. For now the ESPTOOL doesn't support
	# fasted (see ESPTOOL-274), using dout instead. In ROM the flash mode
	# information get from efuse, so don't care this dout choice.
	default "dout" if ESPTOOLPY_FLASHMODE_OPI

choice ESPTOOLPY_FLASHFREQ
	prompt "Flash SPI speed"
	default ESPTOOLPY_FLASHFREQ_40M if SOC_SERIES_ESP32
	default ESPTOOLPY_FLASHFREQ_80M if ESPTOOLPY_FLASHFREQ_80M_DEFAULT

config ESPTOOLPY_FLASHFREQ_120M
	bool "120 MHz"
	select SPI_FLASH_HPM_ENABLE
	depends on SOC_SERIES_ESP32S3 && ESPTOOLPY_FLASH_SAMPLE_MODE_STR
	help
		- Flash 120 MHz SDR mode is stable.
		- Flash 120 MHz DDR mode is an experimental feature, it works when
		the temperature is stable.

		Risks:
		If your chip powers on at a certain temperature, then after the temperature
		increases or decreases by approximately 20 Celsius degrees (depending on the
		chip), the program will crash randomly.

config ESPTOOLPY_FLASHFREQ_80M
	bool "80 MHz"
config ESPTOOLPY_FLASHFREQ_40M
	bool "40 MHz"
config ESPTOOLPY_FLASHFREQ_26M
	bool "26 MHz"
	depends on !SOC_SERIES_ESP32S3
config ESPTOOLPY_FLASHFREQ_20M
	bool "20 MHz"

endchoice # ESPTOOLPY_FLASHFREQ

config ESPTOOLPY_FLASHFREQ_80M_DEFAULT
	bool
	default y if SOC_SERIES_ESP32S2 || SOC_SERIES_ESP32S3 || SOC_SERIES_ESP32C3
	help
	  This is an invisible item, used to define the targets that defaults to use 80MHz Flash SPI speed.

config ESPTOOLPY_FLASHFREQ
	string
	# On some of the ESP chips, max boot frequency would be equal to (or even lower than) 80m.
	# We currently define this to `80m`.
	default '80m' if ESPTOOLPY_FLASHFREQ_120M
	default '80m' if ESPTOOLPY_FLASHFREQ_80M
	default '40m' if ESPTOOLPY_FLASHFREQ_40M
	default '26m' if ESPTOOLPY_FLASHFREQ_26M
	default '20m' if ESPTOOLPY_FLASHFREQ_20M
	default '20m' # if no clock can match in bin headers, go with minimal.

choice ESPTOOLPY_FLASHSIZE
	prompt "Flash size"
	default ESPTOOLPY_FLASHSIZE_2MB
	help
	  SPI flash size, in megabytes

	config ESPTOOLPY_FLASHSIZE_1MB
		bool "1 MB"
	config ESPTOOLPY_FLASHSIZE_2MB
		bool "2 MB"
	config ESPTOOLPY_FLASHSIZE_4MB
		bool "4 MB"
	config ESPTOOLPY_FLASHSIZE_8MB
		bool "8 MB"
	config ESPTOOLPY_FLASHSIZE_16MB
		bool "16 MB"
	config ESPTOOLPY_FLASHSIZE_32MB
		bool "32 MB"
	config ESPTOOLPY_FLASHSIZE_64MB
		bool "64 MB"
	config ESPTOOLPY_FLASHSIZE_128MB
		bool "128 MB"
endchoice

config ESPTOOLPY_FLASHSIZE
	string
	default "1MB" if ESPTOOLPY_FLASHSIZE_1MB
	default "2MB" if ESPTOOLPY_FLASHSIZE_2MB
	default "4MB" if ESPTOOLPY_FLASHSIZE_4MB
	default "8MB" if ESPTOOLPY_FLASHSIZE_8MB
	default "16MB" if ESPTOOLPY_FLASHSIZE_16MB
	default "32MB" if ESPTOOLPY_FLASHSIZE_32MB
	default "64MB" if ESPTOOLPY_FLASHSIZE_64MB
	default "128MB" if ESPTOOLPY_FLASHSIZE_128MB

config ESPTOOLPY_HEADER_FLASHSIZE_UPDATE
	bool "Detect flash size when flashing bootloader"
	default n
	help
	  If this option is set, flashing the project will automatically detect
	  the flash size of the target chip and update the bootloader image
	  before it is flashed.

	  Enabling this option turns off the image protection against corruption
	  by a SHA256 digest. Updating the bootloader image before flashing would
	  invalidate the digest.

choice ESPTOOLPY_BEFORE
	prompt "Before flashing"
	default ESPTOOLPY_BEFORE_RESET
	help
	  Configure whether esptool.py should reset the ESP32 before flashing.

	  Automatic resetting depends on the RTS & DTR signals being
	  wired from the serial port to the ESP32. Most USB development
	  boards do this internally.

	config ESPTOOLPY_BEFORE_RESET
	  bool "Reset to bootloader"
	config ESPTOOLPY_BEFORE_NORESET
	  bool "No reset"
endchoice # ESPTOOLPY_BEFORE

config ESPTOOLPY_BEFORE
	string
	default "default_reset" if ESPTOOLPY_BEFORE_RESET
	default "no_reset" if ESPTOOLPY_BEFORE_NORESET

choice ESPTOOLPY_AFTER
	prompt "After flashing"
	default ESPTOOLPY_AFTER_RESET
	help
	  Configure whether esptool.py should reset the ESP32 after flashing.

	  Automatic resetting depends on the RTS & DTR signals being
	  wired from the serial port to the ESP32. Most USB development
	  boards do this internally.

	config ESPTOOLPY_AFTER_RESET
	  bool "Reset after flashing"
	config ESPTOOLPY_AFTER_NORESET
	  bool "Stay in bootloader"
endchoice

config ESPTOOLPY_AFTER
	string
	default "hard_reset" if ESPTOOLPY_AFTER_RESET
	default "no_reset" if ESPTOOLPY_AFTER_NORESET

endif # SOC_FAMILY_ESPRESSIF_ESP32
