Merge pull request #230 from openweave/feature/nrf5-sdk-3.0-support
Update to version 3.0 of the Nordic nRF5 SDK
diff --git a/.travis/prepare_nrf52840.sh b/.travis/prepare_nrf52840.sh
index 15b986a..4f639d0 100755
--- a/.travis/prepare_nrf52840.sh
+++ b/.travis/prepare_nrf52840.sh
@@ -25,7 +25,7 @@
# Set tools download links
#
-NORDIC_SDK_FOR_THREAD_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/SDKs/nRF5-SDK-for-Thread/nRF5-SDK-for-Thread-and-Zigbee/nRF5SDKforThreadandZigbee20029775ac.zip
+NORDIC_SDK_FOR_THREAD_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/SDKs/nRF5-SDK-for-Thread/nRF5-SDK-for-Thread-and-Zigbee/nRF5SDKforThreadandZigbeev300d310e71.zip
NORDIC_COMMAND_LINE_TOOLS_URL=https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF5-command-line-tools/sw/nRF-Command-Line-Tools_9_8_1_Linux-x86_64.tar
ARM_GCC_TOOLCHAIN_URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-linux.tar.bz2
diff --git a/build/nrf5/nrf5-app.mk b/build/nrf5/nrf5-app.mk
index 3331877..e16a203 100644
--- a/build/nrf5/nrf5-app.mk
+++ b/build/nrf5/nrf5-app.mk
@@ -147,9 +147,9 @@
NRF52840_XXAA \
BOARD_PCA10056
-STD_COMPILE_PREREQUISITES =
+STD_COMPILE_PREREQUISITES = nrf5-sdk-check
-STD_LINK_PREREQUISITES =
+STD_LINK_PREREQUISITES = nrf5-sdk-check
DEFINE_FLAGS = $(foreach def,$(STD_DEFINES) $(DEFINES),-D$(def))
@@ -159,6 +159,14 @@
LINKER_SCRIPT_INC_DIRS = $(NRF5_SDK_ROOT)/modules/nrfx/mdk
+NRF5_SDK_VERSION_FILE = $(NRF5_SDK_ROOT)/documentation/release_notes.txt
+
+NRF5_SDK_TITLE = nRF5 SDK for Thread and Zigbee
+
+NRF5_SDK_VERSION_SED_EXP = /^${NRF5_SDK_TITLE} v[0-9.]+.*$$/ { s/.*v([0-9.]+).*/\1/; s/[.]/ /g; p; q }
+
+NRF5_SDK_MIN_VERSION = 3.0.0
+
# ==================================================
# Toolchain and external utilities / files
@@ -187,7 +195,9 @@
NRFJPROG = $(NRF5_TOOLS_ROOT)/nrfjprog/nrfjprog
-SOFTDEVICE_IMAGE = $(NRF5_SDK_ROOT)/components/softdevice/s140/hex/s140_nrf52_6.1.0_softdevice.hex
+SOFTDEVICE_IMAGE_DIR = $(NRF5_SDK_ROOT)/components/softdevice/s140/hex
+
+SOFTDEVICE_IMAGE = $(wildcard $(SOFTDEVICE_IMAGE_DIR)/s140_nrf52_*_softdevice.hex)
# ==================================================
@@ -250,7 +260,7 @@
# General build rules
# ==================================================
-.PHONY : $(APP) flash flash-app flash_app flash-softdevice flash_softdevice erase clean help
+.PHONY : $(APP) flash flash-app flash_app flash-softdevice flash_softdevice erase clean help nrf5-sdk-check
# Convert executable to Intel hex format
%.hex : %.out
@@ -258,6 +268,7 @@
# Flash the SoftDevice
flash-softdevice flash_softdevice :
+ @if test -z "$(SOFTDEVICE_IMAGE)"; then echo "SoftDevice image not found in $(SOFTDEVICE_IMAGE_DIR)"; false; fi
@echo "FLASH $(SOFTDEVICE_IMAGE)"
$(NO_ECHO)$(NRFJPROG) -f nrf52 --program $(SOFTDEVICE_IMAGE) --sectorerase
@echo "RESET DEVICE"
@@ -278,6 +289,28 @@
help :
@echo "$${HelpText}"
+# Verify the nRF5 SDK is found and meets the required minimum version
+nrf5-sdk-check :
+ @test -d $(NRF5_SDK_ROOT) || { \
+ echo "ENVIRONMENT ERROR: ${NRF5_SDK_TITLE} not found at $(NRF5_SDK_ROOT)"; \
+ exit 1; \
+ }; \
+ test -f $(NRF5_SDK_VERSION_FILE) || { \
+ echo "ENVIRONMENT ERROR: Version file for $(NRF5_SDK_TITLE) not found at $(NRF5_SDK_VERSION_FILE)"; \
+ exit 1; \
+ }; \
+ SDK_VERSION=`sed -nE '$(NRF5_SDK_VERSION_SED_EXP)' $(NRF5_SDK_VERSION_FILE)`; \
+ test "$${SDK_VERSION}x" != "x" || { \
+ echo "ENVIRONMENT ERROR: Unable to determine version of $(NRF5_SDK_TITLE) from $(NRF5_SDK_VERSION_FILE)"; \
+ exit 1; \
+ }; \
+ MIN_VERSION=`echo $(NRF5_SDK_MIN_VERSION) | sed -E 's/\./ /g'`; \
+ HIGHEST_VERSION=`(echo $${SDK_VERSION}; echo $${MIN_VERSION}) | sort -r -n -k1 -k2 -k3 | head -1`; \
+ test "$${HIGHEST_VERSION}" = "$${SDK_VERSION}" || { \
+ echo "ENVIRONMENT ERROR: Unsupported version of $(NRF5_SDK_TITLE); Please use $(NRF5_SDK_MIN_VERSION) or greater"; \
+ exit 1; \
+ }
+
# ==================================================
# Late-bound rules for building the application
diff --git a/build/nrf5/nrf5-openthread.mk b/build/nrf5/nrf5-openthread.mk
index 213b6f1..390c6b9 100644
--- a/build/nrf5/nrf5-openthread.mk
+++ b/build/nrf5/nrf5-openthread.mk
@@ -188,8 +188,8 @@
-lopenthread-ftd \
-lopenthread-platform-utils \
-lopenthread-nrf52840-softdevice-sdk \
- -lmbedcrypto \
- -lnrf_cc310_0.9.10
+ -lnordicsemi-nrf52840-radio-driver-softdevice \
+ -lmbedcrypto
# Add the appropriate OpenThread target as a prerequisite to all application
# compilation targets to ensure that OpenThread gets built and its header
@@ -202,7 +202,8 @@
$(OPENTHREAD_LIB_DIR)/libopenthread-ftd.a \
$(OPENTHREAD_LIB_DIR)/libopenthread-platform-utils.a \
$(OPENTHREAD_LIB_DIR)/libmbedcrypto.a \
- $(OPENTHREAD_LIB_DIR)/libopenthread-nrf52840-softdevice-sdk.a
+ $(OPENTHREAD_LIB_DIR)/libopenthread-nrf52840-softdevice-sdk.a \
+ $(OPENTHREAD_LIB_DIR)/libnordicsemi-nrf52840-radio-driver-softdevice.a
# ==================================================
diff --git a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
index bd7294d..082c1e8 100644
--- a/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
+++ b/src/adaptations/device-layer/include/Weave/DeviceLayer/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.ipp
@@ -315,6 +315,7 @@
err_t lwipErr = ERR_OK;
otError otErr;
otMessage * pktMsg = NULL;
+ const otMessageSettings msgSettings = { true, OT_MESSAGE_PRIORITY_NORMAL };
uint16_t remainingLen;
// Lock the OpenThread stack.
@@ -322,7 +323,7 @@
ThreadStackMgrImpl().LockThreadStack();
// Allocate an OpenThread message
- pktMsg = otIp6NewMessage(ThreadStackMgrImpl().OTInstance(), true);
+ pktMsg = otIp6NewMessage(ThreadStackMgrImpl().OTInstance(), &msgSettings);
VerifyOrExit(pktMsg != NULL, lwipErr = ERR_MEM);
// Copy data from LwIP's packet buffer chain into the OpenThread message.