# 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_ACCURACY < 255
	default 255
	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.

endif
