# i.MX RT6XX series configuration options

# Copyright 2020, 2024 NXP
# SPDX-License-Identifier: Apache-2.0

if SOC_SERIES_IMXRT6XX

# alias for hal
config SOC_SERIES_IMX_RT6XX
	bool
	default y

# another alias for hal
config SOC_SERIES_IMXRT_6XX
	bool
	default y

endif # SOC_SERIES_MIMXRT6XX

if SOC_MIMXRT685S_CM33

config ROM_START_OFFSET
	default 0x1200 if NXP_IMXRT_BOOT_HEADER

config NUM_IRQS
	default 60

config ZTEST_NO_YIELD
	default y if (ZTEST && PM)

# Setup LMA adjustment if using the RAMLOADER feature of ROM
FLASH_CHOSEN := zephyr,flash
FLASH_BASE := $(dt_chosen_reg_addr_hex,$(FLASH_CHOSEN))
FLEXSPI_BASE := $(dt_node_reg_addr_hex,/soc/spi@134000,1)
config BUILD_OUTPUT_ADJUST_LMA
	default "$(FLEXSPI_BASE) - $(FLASH_BASE)" if NXP_IMX_RT_ROM_RAMLOADER

# The base address is determined from the zephyr,flash node with the following
# precedence:
# FlexSPI base address (if flash node is on a FlexSPI bus)
# node reg property (used for memory regions such as SRAM)

# Workaround for not being able to have commas in macro arguments

DT_CHOSEN_Z_FLASH := zephyr,flash
DT_COMPAT_FLEXSPI := nxp,imx-flexspi

# Macros to shorten Kconfig definitions
DT_CHOSEN_FLASH_NODE := $(dt_chosen_path,$(DT_CHOSEN_Z_FLASH))
DT_CHOSEN_FLASH_PARENT := $(dt_node_parent,$(DT_CHOSEN_FLASH_NODE))

config FLASH_BASE_ADDRESS
	default $(dt_node_reg_addr_hex,$(DT_CHOSEN_FLASH_PARENT),1) \
		if $(dt_node_has_compat,$(DT_CHOSEN_FLASH_PARENT),$(DT_COMPAT_FLEXSPI))
	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_FLASH))

# The RT6xx has no internal flash. If the flash node has a size property,
# use that over the reg property. This is used for the external flash
# present on the board. Otherwise, fallback to the reg property
config FLASH_SIZE
	default $(dt_node_int_prop_int,$(DT_CHOSEN_FLASH_NODE),size,Kb) \
		if $(dt_node_has_prop,$(DT_CHOSEN_FLASH_NODE),size)
	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_FLASH),0,K)

if FLASH_MCUX_FLEXSPI_XIP

# Avoid RWW hazards by defaulting logging to disabled
choice FLASH_LOG_LEVEL_CHOICE
	default FLASH_LOG_LEVEL_OFF
endchoice

choice MEMC_LOG_LEVEL_CHOICE
	default MEMC_LOG_LEVEL_OFF
endchoice

endif

#
# MBEDTLS is larger but much faster than TinyCrypt so choose wisely
#
config MBEDTLS
#config TINYCRYPT
	default y if CSPRNG_ENABLED
	depends on ENTROPY_GENERATOR

if MBEDTLS
#
# MBEDTLS CTR_DRBG code path needs extra stack space for initialization than
# what the ztest_thread_stack defaults to.
#
config TEST_EXTRA_STACK_SIZE
	int
	default 1024
endif # MBEDTLS

config I2S_MCUX_FLEXCOMM
	select INIT_AUDIO_PLL

if MCUX_OS_TIMER

config SYS_CLOCK_HW_CYCLES_PER_SEC
	default 1000000

endif # MCUX_OS_TIMER

if CORTEX_M_SYSTICK

config SYS_CLOCK_HW_CYCLES_PER_SEC
	default 250105263

endif # CORTEX_M_SYSTICK

choice USB_MCUX_CONTROLLER_TYPE
	default USB_DC_NXP_LPCIP3511
endchoice

endif # SOC_MIMXRT685S_CM33
