# Atmel SAM MCU series general configuration options

# Copyright (c) 2024 Gerson Fernando Budke <nandojve@gmail.com>
# SPDX-License-Identifier: Apache-2.0

if SOC_FAMILY_ATMEL_SAM && !SOC_SERIES_SAM4L

menu "Clocks"

config SOC_ATMEL_SAM_EXT_SLCK
	bool "Use external crystal oscillator for slow clock"
	help
	  Says y if you want to use external 32 kHz crystal oscillator to drive
	  the slow clock. Note that this adds a few seconds to boot time, as the
	  crystal needs to stabilize after power-up.

	  Says n if you do not need accurate and precise timers. The slow clock
	  will be driven by the internal fast RC oscillator running at 32 kHz.

config SOC_ATMEL_SAM_EXT_MAINCK
	bool "Use external crystal oscillator for main clock"
	default y
	help
	  The main clock is being used to drive the PLL, and thus driving the
	  processor clock.

	  Says y if you want to use external crystal oscillator to drive the
	  main clock. Note that this adds about a second to boot time, as the
	  crystal needs to stabilize after power-up.

	  The crystal used here can be from 3 to 20 MHz.

	  Says n here will use the internal fast RC oscillator running at 12 MHz.

menu "PLL A"

config SOC_ATMEL_SAM_PLLA_MULA
	int "PLL MULA"
	default  6 if SOC_SERIES_SAM3X
	default  9 if SOC_SERIES_SAM4S  || SOC_SERIES_SAM4E
	default 24 if SOC_SERIES_SAME70 || SOC_SERIES_SAMV71
	range 1 62
	help
	  This is the multiplier (MULA) used by the PLL.
	  The processor clock is (MAINCK * (MULA + 1) / DIVA).

	  Board config file can override this settings for a particular board.

	  With default of MULA == N, and DIVA == 1 the PLL will run at N+1 times
	  the main clock frequency.

config SOC_ATMEL_SAM_PLLA_DIVA
	int "PLL DIVA"
	default 1
	range 1 255
	help
	  This is the divider (DIVA) used by the PLL.
	  The processor clock is (MAINCK * (MULA + 1) / DIVA).

	  Board config file can override this settings
	  for a particular board.

	  With default of MULA == N, and DIVA == 1 the PLL will run at N+1 times
	  the main clock frequency.

config SOC_ATMEL_SAM_MDIV
	int "MDIV"
	depends on SOC_SERIES_SAME70 || SOC_SERIES_SAMV71
	default 2
	range 1 4
	help
	  This divisor defines a ratio between processor clock (HCLK)
	  and master clock (MCK) where the maximum value is 150MHz:
	  MCK = HCLK / MDIV

endmenu # PLL A
endmenu # clocks

config SOC_ATMEL_SAM_WAIT_MODE
	bool "CPU goes to Wait mode instead of Sleep mode"
	depends on SOC_ATMEL_SAM_EXT_MAINCK
	default y if DEBUG
	help
	  For JTAG debugging CPU clock (HCLK) should not stop. In order to
	  achieve this, make CPU go to Wait mode instead of Sleep mode while
	  using external crystal oscillator for main clock.

config SOC_ATMEL_SAM_DISABLE_ERASE_PIN
	bool "Disable ERASE pin"
	help
	  At reset ERASE pin is configured in System IO mode. Asserting the
	  ERASE pin at '1' will completely erase Flash memory. Setting this
	  option will switch the pin to general IO mode giving control of the
	  pin to the GPIO module.

endif # SOC_FAMILY_ATMEL_SAM && !SOC_SERIES_SAM4L
