Configuring Thread in nRF Connect SDK
This page describes what is needed to start working with Thread in nRF Connect SDK.
See Configuring your application for instructions on how to update the configuration for your application, permanently or temporarily.
Required modules
Thread requires the following Zephyr modules to properly operate in nRF Connect SDK:
IEEE 802.15.4 radio driver - This library is automatically enabled when working with OpenThread on Nordic Semiconductor’s development kits.
Settings subsystem - This subsystem is required to allow Thread to store settings in the non-volatile memory.
Enabling OpenThread in nRF Connect SDK
To use the Thread protocol in nRF Connect SDK, set the following Kconfig options:
CONFIG_NETWORKING
- This option enables the generic link layer and the IP networking support.CONFIG_NET_L2_OPENTHREAD
- This option enables the OpenThread stack required for the correct operation of the Thread protocol and allows you to use it.CONFIG_MPSL
- This option enables the Multiprotocol Service Layer (MPSL) implementation, which provides services for both single-protocol and multi-protocol implementations.
Selecting OpenThread libraries
After enabling OpenThread in nRF Connect SDK, you must choose which OpenThread libraries to use. You can choose to either build the libraries from source or use pre-built variants of the libraries.
Building the OpenThread libraries from source gives you full flexibility in configuration. Using pre-built variants can be useful for certification purposes.
- Configure OpenThread to build from source
Set
CONFIG_OPENTHREAD_SOURCES
to build the libraries from source. This option is selected by default.This allows you to define Additional configuration options one by one. By default, the Feature sets option is set to custom (
CONFIG_OPENTHREAD_USER_CUSTOM_LIBRARY
), which allows you to create your own OpenThread stack configuration. However, you can select other feature sets as a basis.When building the OpenThread libraries from source, you can also update the pre-built OpenThread libraries.
- Configure OpenThread to use pre-built libraries
Set
CONFIG_OPENTHREAD_LIBRARY
to use pre-built libraries. Select one of the Feature sets by enablingCONFIG_OPENTHREAD_NORDIC_LIBRARY_MASTER
,CONFIG_OPENTHREAD_NORDIC_LIBRARY_FTD
, orCONFIG_OPENTHREAD_NORDIC_LIBRARY_MTD
.This disables building OpenThread from source files and links pre-built libraries instead.
Additional configuration options
Depending on your configuration needs, you can also set the following options:
CONFIG_NET_SOCKETS
- This option enables API similar to BSD Sockets on top of the native Zephyr networking API. This configuration is needed for managing networking protocols.CONFIG_OPENTHREAD_SHELL
- This option enables OpenThread CLI (see OpenThread CLI Reference).CONFIG_COAP
- This option enables Zephyr’s CoAP support.CONFIG_COAP_UTILS
- This option enables the CoAP utils library.CONFIG_OPENTHREAD_COAP
- This option enables OpenThread’s native CoAP API.CONFIG_OPENTHREAD_CHANNEL
- By default set to11
. You can set any value ranging from11
to26
.CONFIG_OPENTHREAD_PANID
- By default set to43981
. You can set any value ranging from0
to65535
.
See the following files for more options that you might want to change:
zephyr/subsys/net/l2/openthread/Kconfig.features
- OpenThread stack features.zephyr/subsys/net/l2/openthread/Kconfig.thread
- Thread network configuration options.
Note
You can find the default configuration for all Thread samples in the nrf/subsys/net/openthread/Kconfig.defconfig
file.
IEEE 802.15.4 EUI-64 configuration
An IEEE EUI-64 address consists of two parts:
Company ID - a 24-bit MA-L (MAC Address Block Large), formerly called OUI (Organizationally Unique Identifier)
Extension identifier - a 40-bit device unique identifier
You can configure the EUI-64 for a device in the following ways:
- Use the default
By default, the company ID is set to Nordic Semiconductor’s MA-L (
f4-ce-36
). The extension identifier is set to the DEVICEID from the factory information configuration registers (FICR).- Replace the company ID
You can enable
CONFIG_IEEE802154_VENDOR_OUI_ENABLE
to replace Nordic Semiconductor’s company ID with your own company ID. Specify your company ID inCONFIG_IEEE802154_VENDOR_OUI
.The extension identifier is set to the default, namely the DEVICEID from FICR.
- Replace the full EUI-64
You can provide the full EUI-64 value by programming certain user information configuration registers (UICR). For nRF52 Series devices, the CUSTOMER registers block is used. For nRF53 Series devices, the OTP registers block is used.
To use the EUI-64 value from the UICR, enable
CONFIG_IEEE802154_NRF5_UICR_EUI64_ENABLE
and setCONFIG_IEEE802154_NRF5_UICR_EUI64_REG
to the base of the two consecutive registers that contain your EUI-64 value.The following example shows how to replace the full EUI-64 on an nRF52840 device:
Specify the offset for the UICR registers in
CONFIG_IEEE802154_NRF5_UICR_EUI64_REG
. This example uses UICR->CUSTOMER[0] and UICR->CUSTOMER[1], which means that you can keep the default value0
.Build and program your application erasing the whole memory (replace serial_number with the serial number of your debugger):
west build -b nrf52840dk_nrf52840 -p always west flash --snr serial_number --erase
Program the registers UICR->CUSTOMER[0] and UICR->CUSTOMER[1] with your EUI-64 value (replace serial_number with the serial number of your debugger):
nrfjprog --snr serial_number --memwr 0x10001080 --val 0x11223344 nrfjprog --snr serial_number --memwr 0x10001084 --val 0x55667788 nrfjprog --snr serial_number --reset
If you used a different value for
CONFIG_IEEE802154_NRF5_UICR_EUI64_REG
, you must use different register addresses.
At the end of the configuration process, you can check the EUI-64 value using OpenThread CLI:
uart:~$ ot eui64
8877665544332211
Done
Hardware-accelerated cryptography
You can enable hardware-accelerated cryptography by using the Nordic Security Module. To do this, modify the setting of the following Kconfig option:
CONFIG_OPENTHREAD_MBEDTLS
- Disable this option to disable the default mbedTLS configuration for OpenThread. The nrf_security module is enabled by default when mbedTLS for OpenThread is disabled.
For more configuration options, read the module documentation.
Thread Specification options
The OpenThread stack can be configured to operate in compliance with either the Thread 1.1 Specification or the Thread 1.2 Specification. You can change the stack version by using the following Kconfig options:
CONFIG_OPENTHREAD_THREAD_VERSION_1_1
- Selects the Thread stack version that is compliant with the Thread 1.1 Specification.CONFIG_OPENTHREAD_THREAD_VERSION_1_2
- Selects the Thread stack version that is compliant with the Thread 1.2 Specification. This option is enabled by default if no other option is selected.
By selecting support for Thread 1.2, you enable the following features in addition to the Thread 1.1 features:
Enhanced Frame Pending
Enhanced Keep Alive
Thread Domain Name
Coordinated Sampled Listening (CSL) Transmitter (for Full Thread Devices only)
For a list of all supported features, see the Feature sets.
Thread commissioning options
Thread commissioning is the process of adding new Thread devices to the network. See OpenThread commissioning for more information.
Configuring this process is optional, because the Thread samples in nRF Connect SDK use hardcoded network information.
If you want to manually enable the Thread network Commissioner role on a device, set the following Kconfig option to the provided value:
To enable the Thread network Joiner role on a device, set the following Kconfig option to the provided value:
CONFIG_OPENTHREAD_JOINER
toy
.
You can also configure how the commissioning process is to be started. The following options are available:
Start automatically after the Joiner powers up. To configure this option, configure the
CONFIG_OPENTHREAD_JOINER_AUTOSTART
option for the Joiner device.Start from the application.
Trigger by Command Line Interface commands. In this case, the shell stack size must be increased to at least 3 KB by setting the following option:
CONFIG_SHELL_STACK_SIZE
to3168
.
For more details about the commissioning process, see Thread Commissioning on OpenThread portal.
OpenThread stack logging options
You can enable the OpenThread stack logging for your project with the following options:
CONFIG_LOG
- This option enables Zephyr’s Logging.CONFIG_OPENTHREAD_DEBUG
- This option enables logging for the OpenThread stack.
Both options must be enabled to allow logging.
After setting these options, you can choose one of several logging backends available in Zephyr and supported in nRF Connect SDK.
Note
If you are working with Thread samples, enabling logging and logging backend is optional.
By default, all Thread samples have logging enabled in the overlay-ot-defaults.conf
file and are configured to provide output at the informational level (CONFIG_OPENTHREAD_LOG_LEVEL_INFO
).
Logging levels
Select one of the following logging levels to customize the logging output:
CONFIG_OPENTHREAD_LOG_LEVEL_CRIT
- This option enables critical error logging only.CONFIG_OPENTHREAD_LOG_LEVEL_WARN
- This option enables warning logging in addition to critical errors.CONFIG_OPENTHREAD_LOG_LEVEL_NOTE
- This option additionally enables notice logging.CONFIG_OPENTHREAD_LOG_LEVEL_INFO
- This option additionally enables informational logging.CONFIG_OPENTHREAD_LOG_LEVEL_DEBG
- This option additionally enables debug logging.
The more detailed logging level you select, the bigger logging buffer you need to have to see all messages. Use the following Kconfig option for this purpose:
CONFIG_LOG_BUFFER_SIZE
- This option specifies the number of bytes dedicated to the logger internal buffer.
Zephyr L2 logging options
If you want to get logging output related to Zephyr’s L2 layer, enable one of the following Kconfig options:
CONFIG_OPENTHREAD_L2_LOG_LEVEL_ERR
- Enables logging only for errors.CONFIG_OPENTHREAD_L2_LOG_LEVEL_WRN
- Enables logging for errors and warnings.CONFIG_OPENTHREAD_L2_LOG_LEVEL_INF
- Enables logging for informational messages, errors, and warnings.CONFIG_OPENTHREAD_L2_LOG_LEVEL_DBG
- Enables logging for debug messages, informational messages, errors, and warnings.
Choosing one of these options enables writing the appropriate information in the L2 debug log.
Additionally, enabling CONFIG_OPENTHREAD_L2_LOG_LEVEL_DBG
allows you to set the CONFIG_OPENTHREAD_L2_DEBUG
option, which in turn has the following settings:
CONFIG_OPENTHREAD_L2_DEBUG_DUMP_15_4
- Enables dumping 802.15.4 frames in the debug log output.CONFIG_OPENTHREAD_L2_DEBUG_DUMP_IPV6
- Enables dumping IPv6 frames in the debug log output.
You can disable writing to log with the CONFIG_OPENTHREAD_L2_LOG_LEVEL_OFF
option.
Device type options
You can configure OpenThread devices to run as a specific device type.
- Full Thread Device (FTD)
Set
CONFIG_OPENTHREAD_FTD
to configure the device as FTD. This is the default configuration.- Minimal Thread Device (MTD)
Set
CONFIG_OPENTHREAD_MTD
to configure the device as MTD.By default, the MTD operates as Minimal End Device (MED). To make it operate as Sleepy End Device (SED), set
CONFIG_OPENTHREAD_MTD_SED
.
Trusted Firmware-M support options
To configure your Thread application on the nRF5340 DK to run with Trusted Firmware-M, use the nrf5340dk_nrf5340_cpuapp_ns
build target and enable the following Kconfig options:
In the nRF Connect SDK, these options are enabled by default for the application core of the Thread samples that can be programmed with the nrf5340dk_nrf5340_cpuapp_ns
build target.
For more Trusted Firmware-M documentation, see Running applications with Trusted Firmware-M and the official TF-M documentation.
Pre-built libraries
The nRF Connect SDK provides a set of OpenThread pre-built libraries. These pre-built libraries are available in nrfxlib and provide features and optional functionalities from the OpenThread stack. You can use these libraries for building applications with support for the complete Thread Specification.
To use a pre-built library, configure OpenThread to use pre-built libraries by setting the CONFIG_OPENTHREAD_LIBRARY
Kconfig option and select one of the provided Feature sets.
Feature sets
A feature set defines a combination of OpenThread features for a specific use case. These feature sets are mainly used for pre-built libraries, but you can also use them for selecting several configuration options at once when you build your application using OpenThread sources.
The nRF Connect SDK provides the following feature sets:
CONFIG_OPENTHREAD_NORDIC_LIBRARY_MASTER
- Enable the complete set of OpenThread features for the Thread Specification.CONFIG_OPENTHREAD_NORDIC_LIBRARY_FTD
- Enable optimized OpenThread features for FTD.CONFIG_OPENTHREAD_NORDIC_LIBRARY_MTD
- Enable optimized OpenThread features for MTD.CONFIG_OPENTHREAD_USER_CUSTOM_LIBRARY
- Create a custom feature set for compilation when building using OpenThread sources. This option is the default. If you selectCONFIG_OPENTHREAD_LIBRARY
, choose a different feature set.Note
When building OpenThread from source, you can select another feature set as base. You can then manually enable additional features, but you cannot disable features that are selected by the feature set.
The following table lists the supported features for each of these sets.
No tick indicates that there is no support for the given feature in the related configuration, while the tick signifies that the feature is selected (=1
value).
OpenThread feature |
Master |
Optimized_FTD |
Optimized_MTD |
Custom |
---|---|---|---|---|
BORDER_AGENT |
✔ |
|||
BORDER_ROUTER |
✔ |
|||
CHILD_SUPERVISION |
✔ |
✔ |
✔ |
|
COAP |
✔ |
✔ |
✔ |
|
COAPS |
✔ |
|||
COMMISSIONER |
✔ |
|||
DIAGNOSTIC |
✔ |
|||
DNS_CLIENT |
✔ |
✔ |
✔ |
|
DHCP6_SERVER |
✔ |
|||
DHCP6_CLIENT |
✔ |
✔ |
✔ |
|
ECDSA |
✔ |
✔ |
✔ |
|
IP6_FRAGM |
✔ |
✔ |
✔ |
|
JAM_DETECTION |
✔ |
|||
JOINER |
✔ |
✔ |
✔ |
|
LINK_RAW |
✔ |
|||
MAC_FILTER |
✔ |
|||
MTD_NETDIAG |
✔ |
|||
SERVICE |
✔ |
|||
SLAAC |
✔ |
✔ |
✔ |
|
SNTP_CLIENT |
✔ |
✔ |
✔ |
|
SRP_CLIENT |
✔ |
✔ |
✔ |
|
UDP_FORWARD |
✔ |
|||
DUA (Thread 1.2) |
✔ |
✔ |
✔ |
|
MLR (Thread 1.2) |
✔ |
✔ |
✔ |
|
BACKBONE_ROUTER (Thread 1.2) |
✔ |
|||
LINK_METRICS_INITIATOR (Thread 1.2) |
✔ |
✔ |
✔ |
|
LINK_METRICS_SUBJECT (Thread 1.2) |
✔ |
✔ |
||
CSL_RECEIVER (Thread 1.2) |
✔ |
✔ |
For the full list of configuration options that were used during compilation, including their default values, see the openthread_lib_configuration.txt
file within each library folder in the nrfxlib repository.
Note
The Backbone Router feature enables the functionality for the Thread Network side, but not for the Backbone side.
Customizing pre-built libraries
Selecting a feature set allows you to use the respective OpenThread features in your application. You might need to customize some configuration options to fit your use case though.
Be aware of the following limitations when customizing the configuration of a pre-built library:
You can only update configuration options that are configurable at run time. If you change any options that are compiled into the library, your changes will be ignored.
Changes to the configuration might impact the certification status of the pre-built libraries. See Thread certification options for more information.
The following list shows some of the configuration options that you might want to customize:
CONFIG_OPENTHREAD_FTD
orCONFIG_OPENTHREAD_MTD
- Select the device type. TheCONFIG_OPENTHREAD_NORDIC_LIBRARY_MTD
feature set supports only the MTD device type. The other feature sets support both device types.CONFIG_OPENTHREAD_COPROCESSOR
andCONFIG_OPENTHREAD_COPROCESSOR_RCP
- Select the OpenThread architecture to use. See Co-processor designs.CONFIG_OPENTHREAD_MANUAL_START
- Choose whether to configure and join the Thread network automatically. If you set this option ton
, also check and configure the network parameters that are used, for example:
Updating pre-built OpenThread libraries
You can update the OpenThread pre-built libraries in nrfxlib when using any Thread sample if you configure the sample to build the OpenThread stack from source with CONFIG_OPENTHREAD_SOURCES
.
Use this functionality for certification of your configuration of the OpenThread libraries, for example.
You can install the libraries either with or without debug symbols.
Installing the libraries with debug symbols can be useful when debugging, but will take a significant amount of storage memory.
You can remove the symbols when updating with the CONFIG_OPENTHREAD_BUILD_OUTPUT_STRIPPED
Kconfig option enabled.
The option is disabled by default.
Note
When you select CONFIG_OPENTHREAD_USER_CUSTOM_LIBRARY
, the location of the destination directory for the libraries depends on the chosen nrf_security backend, either CONFIG_CC3XX_BACKEND
or CONFIG_OBERON_BACKEND
.
Updating the libraries without debug symbols
There is a single command to update the libraries without debug symbols. When using the command line, run the command in the project folder. When using nRF Connect for Visual Studio Code, open a terminal and choose nRF Terminal, then run the command there.
Use the following command:
west build -b nrf52840dk_nrf52840 -t install_openthread_libraries -- -DOPENTHREAD_BUILD_OUTPUT_STRIPPED=y
This command builds two versions of the libraries, with and without debug symbols, and installs only the version without debug symbols.
This command also builds the sample on the specified board.
Make sure that the board you mention is compatible with the chosen sample.
The CONFIG_OPENTHREAD_BUILD_OUTPUT_STRIPPED
Kconfig option will be disabled again after this command completes.
Updating the libraries with debug symbols
There is a single command to update the libraries with debug symbols. When using the command line, run the command in the project folder. When using nRF Connect for Visual Studio Code, open a terminal and choose nRF Terminal, then run the command there.
Use the following command:
west build -b nrf52840dk_nrf52840 -t install_openthread_libraries
This command also builds the sample on the specified board. Make sure that the board you mention is compatible with the chosen sample.