# SPDX-License-Identifier: Apache-2.0

config BOARD
	string
	default "$(BOARD)"
	help
	  This option holds the name of the board and is used to locate the files
	  related to the board in the source tree (under boards/).
	  The Board is the first location where we search for a linker.ld file,
	  if not found we look for the linker file in
	  soc/<arch>/<family>/<series>

config BOARD_REVISION
	def_string "$(BOARD_REVISION)"
	help
	  If the BOARD has a revision field set, this is the revision.
	  Otherwise, it is the empty string. For example, if BOARD is
	  "plank@foo", this option will be "foo". If BOARD is "plank",
	  this option will be the empty string.

config BOARD_TARGET
	string
	default "$(BOARD)@$(BOARD_REVISION)$(BOARD_QUALIFIERS)" if "$(BOARD_REVISION)" != ""
	default "$(BOARD)$(BOARD_QUALIFIERS)"
	help
	  Contains the board target (full string including name, revision, soc, cluster and
	  variant) of the board being used.

	  For example, if building for ``nrf5340dk/nrf5340/cpuapp`` then this will contain the
	  value ``nrf5340dk/nrf5340/cpuapp``.

config BOARD_DEPRECATED_RELEASE
	string
	help
	  This hidden option is set in the board configuration and indicates
	  the Zephyr release that the board configuration will be removed.
	  When set, any build for that board will generate a clearly visible
	  deprecation warning.
	  When adding this to a BOARD, remember to follow the instructions in
	  https://docs.zephyrproject.org/latest/develop/api/api_lifecycle.html#deprecated

config QEMU_TARGET
	bool
	help
	  Mark all QEMU targets with this variable for checking whether we are
	  running in an emulated environment.

config NET_DRIVERS
	bool
	default y if QEMU_TARGET && NETWORKING
	help
	  When building for a qemu target then NET_DRIVERS will be default
	  enabled to allow for easy use of SLIP or PPP

rsource "Kconfig.v2"

# Parse shields references
# Don't do it as a menuconfig, as shield selection is a CMake feature.
# This loads custom shields Kconfig (from BOARD_ROOT)
osource "$(KCONFIG_BINARY_DIR)/Kconfig.shield"
# This loads Zephyr base shield defconfigs
rsource "shields/*/Kconfig.shield"

menu "Board Options"
config QEMU_ICOUNT
	bool "QEMU icount mode"
	depends on QEMU_TARGET
	default y if !NETWORKING && !BT
	help
	  Enable QEMU virtual instruction counter. The virtual cpu will
	  execute one instruction every 2^N ns of virtual time. This will
	  give deterministic execution times from the guest point of view.

config QEMU_ICOUNT_SHIFT
	int "QEMU icount shift value"
	depends on QEMU_ICOUNT
	help
	  The virtual CPU will execute one instruction every 2^N nanoseconds
	  of virtual time, where N is the value provided here.

config QEMU_ICOUNT_SLEEP
	bool "QEMU icount sleep mode enable"
	depends on QEMU_ICOUNT
	help
	  When the virtual CPU is sleeping, the virtual time will advance
	  at default speed unless this option is set. With this option set,
	  the virtual time will jump to the next timer deadline instantly
	  whenever the virtual CPU goes to sleep mode and will not advance
	  if no timer is enabled. This behavior gives deterministic execution
	  times from the guest point of view.

config QEMU_IVSHMEM_PLAIN_MEM_SIZE
	int "QEMU ivshmem-plain shared memory size in mega-bytes"
	default 1
	depends on QEMU_TARGET && IVSHMEM && !IVSHMEM_DOORBELL
	help
	  This sets the size of the shared memory when using ivshmem-plain
	  device in Qemu. Note that it's in mega-bytes, so 1 means 1M for Qemu
	  etc..

config QEMU_UEFI_BOOT
	bool "QEMU uses UEFI to boot up"
	default n
	depends on BUILD_OUTPUT_EFI && QEMU_TARGET && X86_64
	help
	  This option indicates that QEMU will use UEFI bootable method
	  to boot up.

config QEMU_GDBSERVER_LISTEN_DEV
	string "QEMU gdbserver listen device"
	default "tcp::1234"
	depends on QEMU_TARGET
	help
	  This options is passed onto QEMU as a parameter to `-gdb` option.
	  The default value is equivalent to `-s` which is a shorthand for
	  `-gdb tcp::1234`. An empty value omits the `-gdb` parameter altogether.
	  This allows the injection of `-gdb` parameter from other sources such
	  as the `QEMU_EXTRA_FLAGS` environment variable. Refer to application
	  development doc and/or QEMU invocation doc for more info.

config QEMU_EXTRA_FLAGS
	string "QEMU extra flags"
	depends on QEMU_TARGET
	default ""
	help
	  This option is to pass onto QEMU an extra list of parameters
	  to setup devices, for example to allocate interface for Zephyr
	  GDBstub over serial with `-serial tcp:127.0.0.1:5678,server`

config BOARD_REQUIRES_SERIAL_BACKEND_CDC_ACM
	bool
	help
	  Indicates that a board has no other capabilities than to use the CDC
	  ACM UART as a backend for logging or shell.

config BOARD_SERIAL_BACKEND_CDC_ACM
	bool "Board uses USB CDC ACM UART as serial backend"
	depends on BOARD_REQUIRES_SERIAL_BACKEND_CDC_ACM
	default y
	help
	  USB stack and CDC ACM UART are configured and initialized at boot
	  time to be used as a backend for logging or shell.

# There might not be any board options, hence the optional source
osource "$(KCONFIG_BOARD_DIR)/Kconfig"
endmenu

config BOARD_HAS_TIMING_FUNCTIONS
	bool
	help
	  Should be selected if board provides custom method for retrieving
	  timestamps and cycle count.
