# Nordic Semiconductor nRF5 802.15.4 configuration options

# Copyright (c) 2017 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menuconfig IEEE802154_NRF5
	bool "nRF52 series IEEE 802.15.4 Driver"
	default y
	depends on DT_HAS_NORDIC_NRF_IEEE802154_ENABLED
	select NRF_802154_RADIO_DRIVER if HAS_HW_NRF_RADIO_IEEE802154
	select NRF_802154_SER_HOST if !HAS_HW_NRF_RADIO_IEEE802154

if IEEE802154_NRF5

config IEEE802154_NRF5_RX_STACK_SIZE
	int "Driver's internal RX thread stack size"
	default 800
	help
	  This option sets the driver's stack size for its internal RX thread.
	  The default value should be sufficient, but in case it proves to be
	  a too little one, this option makes it easy to play with the size.

config IEEE802154_NRF5_INIT_PRIO
	int "nRF52 IEEE 802.15.4 initialization priority"
	default 80
	help
	  Set the initialization priority number. Do not mess with it unless
	  you know what you are doing.

config IEEE802154_NRF5_EXT_IRQ_MGMT
	bool
	help
	  The driver may manage radio IRQs by itself, or use an external
	  radio IRQ provider. When radio IRQs are managed by an external
	  provider, the driver shall not configure radio IRQs.

	  Enable this option when external radio IRQ provider is enabled in
	  the system. One example of external radio IRQ provider could be
	  a radio arbiter used in dynamic multiprotocol applications.

config IEEE802154_NRF5_UICR_EUI64_ENABLE
	bool "Support usage of EUI64 value stored in UICR registers"
	depends on !IEEE802154_VENDOR_OUI_ENABLE
	depends on SOC_SERIES_NRF52X || SOC_SERIES_NRF53X
	help
	  This option enables setting custom vendor EUI64 value
	  stored in User information configuration registers (UICR).
	  Notice that this disables the default setting of EUI64
	  value from Factory information configuration registers
	  (FICR).

if IEEE802154_NRF5_UICR_EUI64_ENABLE

config IEEE802154_NRF5_UICR_EUI64_REG
	int "UICR base register for the EUI64 value"
	range 0 30 if SOC_SERIES_NRF52X
	range 0 190 if SOC_SERIES_NRF53X
	default 0
	help
	  Base of the two consecutive registers from the UICR customer
	  section in which custom EUI64 is stored.

endif # IEEE802154_NRF5_UICR_EUI64_ENABLE

config IEEE802154_NRF5_FCS_IN_LENGTH
	bool "Include FCS field in the overall packet length"
	default y if IEEE802154_RAW_MODE || NET_L2_OPENTHREAD
	help
	  Some 802.15.4 L2 implementations expect that FCS length is included in
	  the overall packet length while others not. Allow to configure this
	  behavior, based on the selected upper layer.

config IEEE802154_NRF5_DELAY_TRX_ACC
	int "Clock accuracy for delayed operations"
	default CLOCK_CONTROL_NRF_ACCURACY if (CLOCK_CONTROL_NRF && (CLOCK_CONTROL_NRF_ACCURACY < $(UINT8_MAX)))
	default $(UINT8_MAX)
	help
	  Accuracy of the clock used for scheduling radio delayed operations (delayed transmission
	  or delayed reception), in ppm.

config IEEE802154_NRF5_LOG_RX_FAILURES
	bool "Frame reception failures logging"
	help
	  There are few cases where the frame reception failure can happen because of
	  internal cause. These cases are reported forward by general code error.

	  This options enables logging the reason of frame reception failure.
	  It can be helpful for the network traffic analyze but it generates also
	  a lot of log records in a stress environment.

config IEEE802154_NRF5_MULTIPLE_CCA
	bool "Support for multiple CCA attempts before transmission"
	help
	  When this option is enabled the OpenThread capability
	  IEEE802154_OPENTHREAD_HW_MULTIPLE_CCA is supported by the ieee802154_nrf5.

config IEEE802154_NRF5_CST_ENDPOINT
	bool "Support for OpenThread CST Endpoint extension in the ieee802154_nrf5."
	default y if OPENTHREAD_WAKEUP_COORDINATOR
	help
	  Enable support for OpenThread CST (Coordinated Sampled Transmitter) Endpoint
	  with CST IE injection as an extension to ieee802154_nrf5 driver.
	  When this option is enabled, the ieee802154_nrf5 driver supports the
	  IEEE802154_OPENTHREAD_HW_CST capability.

endif
