diff --git a/configure.ac b/configure.ac index d33e4cd1f..dd5f350bc 100644 --- a/configure.ac +++ b/configure.ac @@ -1660,12 +1660,12 @@ AC_DEFINE_UNQUOTED([OPENTHREAD_ENABLE_ECDSA], [${OPENTHREAD_ENABLE_ECDSA}], [Def AC_ARG_WITH(examples, [AS_HELP_STRING([--with-examples=TARGET], - [Specify the examples from one of: none, posix, cc1352, cc2538, cc2650, cc2652, da15000, efr32, emsk, gp712, kw41z, nrf52840, samr21 @<:@default=none@:>@.])], + [Specify the examples from one of: none, posix, cc1352, cc2538, cc2650, cc2652, da15000, efr32, emsk, gp712, kw41z, nrf52840, qpg6095, samr21 @<:@default=none@:>@.])], [ case "${with_examples}" in none) ;; - posix|cc1352|cc2538|cc2650|cc2652|da15000|efr32|emsk|gp712|kw41z|nrf52840|samr21) + posix|cc1352|cc2538|cc2650|cc2652|da15000|efr32|emsk|gp712|kw41z|nrf52840|qpg6095|samr21) if test ${enable_posix_app} = "yes"; then AC_MSG_ERROR([--with-examples must be none when POSIX apps are enabled by --enable-posix-app]) fi @@ -1736,6 +1736,11 @@ case ${with_examples} in AC_DEFINE_UNQUOTED([OPENTHREAD_EXAMPLES_NRF52840],[${OPENTHREAD_EXAMPLES_NRF52840}],[Define to 1 if you want to use nrf52840 examples]) ;; + qpg6095) + OPENTHREAD_EXAMPLES_QPG6095=1 + AC_DEFINE_UNQUOTED([OPENTHREAD_EXAMPLES_QPG6095],[${OPENTHREAD_EXAMPLES_QPG6095}],[Define to 1 if you want to use qpg6095 examples]) + ;; + samr21) OPENTHREAD_EXAMPLES_SAMR21=1 AC_DEFINE_UNQUOTED([OPENTHREAD_EXAMPLES_SAMR21],[${OPENTHREAD_EXAMPLES_SAMR21}],[Define to 1 if you want to use samr21 examples]) @@ -1783,6 +1788,9 @@ AM_CONDITIONAL([OPENTHREAD_EXAMPLES_KW41Z], [test "${with_examples}" = "kw41z"]) AC_SUBST(OPENTHREAD_EXAMPLES_NRF52840) AM_CONDITIONAL([OPENTHREAD_EXAMPLES_NRF52840], [test "${with_examples}" = "nrf52840"]) +AC_SUBST(OPENTHREAD_EXAMPLES_QPG6095) +AM_CONDITIONAL([OPENTHREAD_EXAMPLES_QPG6095], [test "${with_examples}" = "qpg6095"]) + AC_SUBST(OPENTHREAD_EXAMPLES_SAMR21) AM_CONDITIONAL([OPENTHREAD_EXAMPLES_SAMR21], [test "${with_examples}" = "samr21"]) @@ -1939,6 +1947,7 @@ examples/platforms/emsk/Makefile examples/platforms/gp712/Makefile examples/platforms/kw41z/Makefile examples/platforms/nrf52840/Makefile +examples/platforms/qpg6095/Makefile examples/platforms/samr21/Makefile examples/platforms/posix/Makefile examples/platforms/utils/Makefile diff --git a/examples/Makefile-qpg6095 b/examples/Makefile-qpg6095 new file mode 100644 index 000000000..5f5bf9637 --- /dev/null +++ b/examples/Makefile-qpg6095 @@ -0,0 +1,286 @@ +# +# Copyright (c) 2019, The OpenThread Authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +.NOTPARALLEL: + +AR = arm-none-eabi-ar +CCAS = $(CCPREFIX) arm-none-eabi-gcc +CPP = arm-none-eabi-cpp +CC = $(CCPREFIX) arm-none-eabi-gcc +CXX = $(CCPREFIX) arm-none-eabi-g++ +LD = arm-none-eabi-ld +STRIP = arm-none-eabi-strip +NM = arm-none-eabi-nm +RANLIB = arm-none-eabi-ranlib +OBJCOPY = arm-none-eabi-objcopy + +BuildJobs ?= 10 +GCCVersion = $(shell expr `$(CC) -dumpversion | cut -f1 -d.`) + +configure_OPTIONS = \ + --enable-cli \ + --enable-diag \ + --enable-ftd \ + --enable-mtd \ + --with-examples=qpg6095 \ + MBEDTLS_CPPFLAGS="$(QPG6095_MBEDTLS_CPPFLAGS)" \ + $(NULL) + +TopSourceDir := $(dir $(shell readlink $(firstword $(MAKEFILE_LIST)))).. +AbsTopSourceDir := $(dir $(realpath $(firstword $(MAKEFILE_LIST)))).. + +QPG6095_CONFIG_FILE_CPPFLAGS = -DOPENTHREAD_PROJECT_CORE_CONFIG_FILE='\"openthread-core-qpg6095-config.h\"' +QPG6095_CONFIG_FILE_CPPFLAGS += -I$(PWD)/examples/platforms/qpg6095/ +QPG6095_MBEDTLS_CPPFLAGS = -DMBEDTLS_CONFIG_FILE='\"mbedtls-config.h\"' +QPG6095_MBEDTLS_CPPFLAGS += -DMBEDTLS_USER_CONFIG_FILE='\"qpg6095-mbedtls-config.h\"' +QPG6095_MBEDTLS_CPPFLAGS += -I$(PWD)/examples/platforms/qpg6095/crypto +QPG6095_MBEDTLS_CPPFLAGS += -I$(PWD)/third_party/mbedtls +QPG6095_MBEDTLS_CPPFLAGS += -I$(PWD)/third_party/mbedtls/repo/include +QPG6095_MBEDTLS_CPPFLAGS += -I$(PWD)/third_party/mbedtls/repo/include/mbedtls + +CONFIG_FILE = OPENTHREAD_PROJECT_CORE_CONFIG_FILE='\"openthread-core-qpg6095-config.h\"' +CONFIG_FILE_PATH = $(AbsTopSourceDir)/examples/platforms/qpg6095/ + +COMMONCFLAGS := \ + -fdata-sections \ + -ffunction-sections \ + -Os \ + -g \ + -D$(CONFIG_FILE) \ + -I$(CONFIG_FILE_PATH) \ + $(NULL) + +include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/common-switches.mk + +CPPFLAGS += \ + $(COMMONCFLAGS) \ + $(target_CPPFLAGS) \ + $(NULL) + +CFLAGS += \ + $(COMMONCFLAGS) \ + $(target_CFLAGS) \ + $(NULL) + +CXXFLAGS += \ + $(COMMONCFLAGS) \ + $(target_CXXFLAGS) \ + -fno-exceptions \ + -fno-rtti \ + $(NULL) + +LDFLAGS += \ + $(COMMONCFLAGS) \ + $(target_LDFLAGS) \ + -specs=nano.specs \ + -specs=nosys.specs \ + -Wl,--gc-sections \ + $(NULL) + +ECHO := @echo +MAKE := make +MKDIR_P := mkdir -p +LN_S := ln -s +RM_F := rm -f + +INSTALL := /usr/bin/install +INSTALLFLAGS := -p + +BuildPath = build +TopBuildDir = $(BuildPath) +AbsTopBuildDir = $(PWD)/$(TopBuildDir) + +ResultPath = output +TopResultDir = $(ResultPath) +AbsTopResultDir = $(PWD)/$(TopResultDir) + +TargetTuple = qpg6095 + +ARCHS = cortex-m4 + +TopTargetLibDir = $(TopResultDir)/$(TargetTuple)/lib + +ifndef BuildJobs +BuildJobs := $(shell getconf _NPROCESSORS_ONLN) +endif +JOBSFLAG := -j$(BuildJobs) + +# +# configure-arch +# +# Configure OpenThread for the specified architecture. +# +# arch - The architecture to configure. +# +define configure-arch +$(ECHO) " CONFIG $(TargetTuple)..." +(cd $(BuildPath)/$(TargetTuple) && $(AbsTopSourceDir)/configure \ +INSTALL="$(INSTALL) $(INSTALLFLAGS)" \ +CPP="$(CPP)" CC="$(CC)" CXX="$(CXX)" CCAS="$(CCAS)" OBJC="$(OBJC)" OBJCXX="$(OBJCXX)" AR="$(AR)" RANLIB="$(RANLIB)" NM="$(NM)" STRIP="$(STRIP)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CCASFLAGS="$(CCASFLAGS)" LDFLAGS="$(LDFLAGS)" \ +--host=arm-none-eabi \ +--prefix=/ \ +--exec-prefix=/$(TargetTuple) \ +$(configure_OPTIONS)) +endef # configure-arch + +# +# build-arch +# +# Build the OpenThread intermediate build products for the specified +# architecture. +# +# arch - The architecture to build. +# +define build-arch +$(ECHO) " BUILD $(TargetTuple)" +$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(TargetTuple) --no-print-directory \ +all +endef # build-arch + +# +# stage-arch +# +# Stage (install) the OpenThread final build products for the specified +# architecture. +# +# arch - The architecture to stage. +# +define stage-arch +$(ECHO) " STAGE $(TargetTuple)" +$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(TargetTuple) --no-print-directory \ +DESTDIR=$(AbsTopResultDir) \ +install +endef # stage-arch + +# @FIXME: get the filenames of the targets of OBJCOPY (now they are hardcoded) +define hex-arch +$(ECHO) " HEX $(TargetTuple)" +$(OBJCOPY) -O ihex $(AbsTopResultDir)/$(TargetTuple)/bin/ot-cli-mtd $(AbsTopResultDir)/$(TargetTuple)/bin/ot-cli-mtd.hex +$(OBJCOPY) -O ihex $(AbsTopResultDir)/$(TargetTuple)/bin/ot-cli-ftd $(AbsTopResultDir)/$(TargetTuple)/bin/ot-cli-ftd.hex +endef # hex-arch + +# +# ARCH_template +# +# Define macros, targets and rules to configure, build, and stage the +# OpenThread for a single architecture. +# +# arch - The architecture to instantiate the template for. +# +define ARCH_template +CONFIGURE_TARGETS += configure-$(1) +BUILD_TARGETS += do-build-$(1) +HEX_TARGETS += hex-$(1) +STAGE_TARGETS += stage-$(1) +BUILD_DIRS += $(BuildPath)/$(TargetTuple) +DIRECTORIES += $(BuildPath)/$(TargetTuple) + +configure-$(1): target_CPPFLAGS=$($(1)_target_CPPFLAGS) +configure-$(1): target_CFLAGS=$($(1)_target_CFLAGS) +configure-$(1): target_CXXFLAGS=$($(1)_target_CXXFLAGS) +configure-$(1): target_LDFLAGS=$($(1)_target_LDFLAGS) +configure-$(1): target_CCASFLAGS=$($(1)_target_CCASFLAGS) + +configure-$(1): $(BuildPath)/$(TargetTuple)/config.status + +$(BuildPath)/$(TargetTuple)/config.status: | $(BuildPath)/$(TargetTuple) + $$(call configure-arch,$(1)) + +do-build-$(1): configure-$(1) + +do-build-$(1): + +$$(call build-arch,$(1)) + +hex-$(1): stage-$(1) + +hex-$(1): + $$(call hex-arch,$(1)) + +$(1): hex-$(1) + +stage-$(1): do-build-$(1) + +stage-$(1): | $(TopResultDir) + $$(call stage-arch,$(1)) +endef # ARCH_template + +.DEFAULT_GOAL := all + +all: hex + +# +# cortex-m4 +# + +cortex-m4_target_ABI = cortex-m4 +cortex-m4_target_CPPFLAGS = -mcpu=cortex-m4 -mthumb -ffunction-sections +cortex-m4_target_CFLAGS = -mcpu=cortex-m4 -mthumb -ffunction-sections +cortex-m4_target_CXXFLAGS = -mcpu=cortex-m4 -mthumb -ffunction-sections +cortex-m4_target_LDFLAGS = -mcpu=cortex-m4 -mthumb -ffunction-sections + +# Instantiate an architecture-specific build template for each target +# architecture. + +$(foreach arch,$(ARCHS),$(eval $(call ARCH_template,$(arch)))) + +# +# Common / Finalization +# + +configure: $(CONFIGURE_TARGETS) + +build: $(BUILD_TARGETS) + +stage: $(STAGE_TARGETS) + +hex: $(HEX_TARGETS) + +DIRECTORIES = $(TopResultDir) $(TopResultDir)/$(TargetTuple)/lib $(BUILD_DIRS) + +CLEAN_DIRS = $(TopResultDir) $(BUILD_DIRS) + +all: hex + +$(DIRECTORIES): + $(ECHO) " MKDIR $@" + @$(MKDIR_P) "$@" + +clean: + $(ECHO) " CLEAN" + @$(RM_F) -r $(CLEAN_DIRS) + +help: + $(ECHO) "Simply type 'make -f $(firstword $(MAKEFILE_LIST))' to build OpenThread for the following " + $(ECHO) "architectures: " + $(ECHO) "" + $(ECHO) " $(ARCHS)" + $(ECHO) "" + $(ECHO) "To build only a particular architecture, specify: " + $(ECHO) "" + $(ECHO) " make -f $(firstword $(MAKEFILE_LIST)) " + $(ECHO) "" diff --git a/examples/platforms/Makefile.am b/examples/platforms/Makefile.am index 96fba27d3..cdc2e301e 100644 --- a/examples/platforms/Makefile.am +++ b/examples/platforms/Makefile.am @@ -42,6 +42,7 @@ DIST_SUBDIRS = \ kw41z \ nrf52840 \ posix \ + qpg6095 \ samr21 \ utils \ $(NULL) @@ -96,6 +97,10 @@ if OPENTHREAD_EXAMPLES_POSIX SUBDIRS += posix endif +if OPENTHREAD_EXAMPLES_QPG6095 +SUBDIRS += qpg6095 +endif + if OPENTHREAD_EXAMPLES_SAMR21 SUBDIRS += samr21 endif @@ -118,6 +123,7 @@ PRETTY_SUBDIRS = \ kw41z \ nrf52840 \ posix \ + qpg6095 \ samr21 \ utils \ $(NULL) diff --git a/examples/platforms/Makefile.platform.am b/examples/platforms/Makefile.platform.am index 8a005e1df..6be8d0b28 100644 --- a/examples/platforms/Makefile.platform.am +++ b/examples/platforms/Makefile.platform.am @@ -81,6 +81,10 @@ if OPENTHREAD_EXAMPLES_NRF52840 include $(top_srcdir)/examples/platforms/nrf52840/Makefile.platform.am endif +if OPENTHREAD_EXAMPLES_QPG6095 +include $(top_srcdir)/examples/platforms/qpg6095/Makefile.platform.am +endif + if OPENTHREAD_EXAMPLES_SAMR21 include $(top_srcdir)/examples/platforms/samr21/Makefile.platform.am endif # OPENTHREAD_EXAMPLES_SAMR21 diff --git a/examples/platforms/qpg6095/Makefile.am b/examples/platforms/qpg6095/Makefile.am new file mode 100644 index 000000000..2a8d63c5d --- /dev/null +++ b/examples/platforms/qpg6095/Makefile.am @@ -0,0 +1,66 @@ +# +# Copyright (c) 2019, The OpenThread Authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +include $(abs_top_nlbuild_autotools_dir)/automake/pre.am + +lib_LIBRARIES = libopenthread-qpg6095.a + +libopenthread_qpg6095_a_CPPFLAGS = \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/examples/platforms \ + -I$(top_srcdir)/examples/platforms/utils \ + -I$(top_srcdir)/src/core \ + -lrt \ + -lpthread \ + $(NULL) + +CLEANFILES = + +libopenthread_qpg6095_a_SOURCES = \ + alarm.c \ + logging.c \ + misc.c \ + platform.c \ + random.c \ + radio.c \ + settings.cpp \ + uart.c \ + $(NULL) + + +if OPENTHREAD_ENABLE_DIAG +libopenthread_qpg6095_a_SOURCES += \ + diag.c \ + $(NULL) +endif + +if OPENTHREAD_BUILD_COVERAGE +CLEANFILES += $(wildcard *.gcda *.gcno) +endif # OPENTHREAD_BUILD_COVERAGE + +include $(abs_top_nlbuild_autotools_dir)/automake/post.am diff --git a/examples/platforms/qpg6095/Makefile.platform.am b/examples/platforms/qpg6095/Makefile.platform.am new file mode 100644 index 000000000..0184c9ee3 --- /dev/null +++ b/examples/platforms/qpg6095/Makefile.platform.am @@ -0,0 +1,41 @@ +# +# Copyright (c) 2019, The OpenThread Authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# +# qpg6095 platform-specific Makefile +# + +LDADD_COMMON += \ + $(top_builddir)/examples/platforms/qpg6095/libopenthread-qpg6095.a \ + $(top_srcdir)/third_party/Qorvo/qpg6095/libQorvoQPG6095.a \ + $(NULL) + +LDFLAGS_COMMON += \ + -T $(top_srcdir)/examples/platforms/qpg6095/qpg6095.ld \ + $(NULL) + diff --git a/examples/platforms/qpg6095/alarm.c b/examples/platforms/qpg6095/alarm.c new file mode 100644 index 000000000..c4ec5e1e9 --- /dev/null +++ b/examples/platforms/qpg6095/alarm.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file implements the OpenThread platform abstraction for the alarm. + * + */ + +#include +#include + +#include "alarm_qorvo.h" +#include +#include + +uint32_t otPlatAlarmMilliGetNow(void) +{ + return qorvoAlarmGetTimeMs(); +} + +static void qorvoAlarmFired(void *aInstance) +{ + otPlatAlarmMilliFired((otInstance *)aInstance); +} + +void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t t0, uint32_t dt) +{ + OT_UNUSED_VARIABLE(t0); + qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); + qorvoAlarmScheduleEventArg(dt, qorvoAlarmFired, aInstance); +} + +void otPlatAlarmMilliStop(otInstance *aInstance) +{ + qorvoAlarmUnScheduleEventArg((qorvoAlarmCallback_t)qorvoAlarmFired, aInstance); +} diff --git a/examples/platforms/qpg6095/alarm_qorvo.h b/examples/platforms/qpg6095/alarm_qorvo.h new file mode 100644 index 000000000..b06223b90 --- /dev/null +++ b/examples/platforms/qpg6095/alarm_qorvo.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the declarations of the Alarm functions from the Qorvo library. + * + */ + +#ifndef ALARM_QORVO_H_ +#define ALARM_QORVO_H_ + +#include +#include +#include +#include + +typedef void (*qorvoAlarmCallback_t)( void* ); + +/** + * This function initializes the alarm service used by OpenThread. + * + */ +void qorvoAlarmInit(void); + +/** + * This function retrieves the current time. + * + * @param[out] The current time in ms. + * + */ +uint32_t qorvoAlarmGetTimeMs(void); + +/** + * This function schedules a callback after a relative amount of time. + * + * @param[in] rel_time The relative time in ms. + * @param[in] callback A callback function which will be called. + * @param[in] arg A context pointer which will be passed as an argument to the callback. + * + */ +void qorvoAlarmScheduleEventArg(uint32_t rel_time, qorvoAlarmCallback_t callback, void* arg); + +/** + * This function unschedules the callback. + * + * @param[in] callback A callback function which will be removed from the list. + * @param[in] arg A context pointer which will be passed as an argument to the callback. + * + */ +bool qorvoAlarmUnScheduleEventArg(qorvoAlarmCallback_t callback, void* arg); + +#endif // ALARM_QORVO_H_ diff --git a/examples/platforms/qpg6095/crypto/qpg6095-mbedtls-config.h b/examples/platforms/qpg6095/crypto/qpg6095-mbedtls-config.h new file mode 100644 index 000000000..a447fcb16 --- /dev/null +++ b/examples/platforms/qpg6095/crypto/qpg6095-mbedtls-config.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + diff --git a/examples/platforms/qpg6095/diag.c b/examples/platforms/qpg6095/diag.c new file mode 100644 index 000000000..df89b4e99 --- /dev/null +++ b/examples/platforms/qpg6095/diag.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform_qorvo.h" + +#include +#include +#include +#include + +#include +#include + +/** + * Diagnostics mode variables. + * + */ +static bool sDiagMode = false; + +void otPlatDiagProcess(otInstance *aInstance, int argc, char *argv[], char *aOutput, size_t aOutputMaxLen) +{ + // Add more plarform specific diagnostics features here. + snprintf(aOutput, aOutputMaxLen, "diag feature '%s' is not supported\r\n", argv[0]); + OT_UNUSED_VARIABLE(argc); + OT_UNUSED_VARIABLE(aInstance); +} + +void otPlatDiagModeSet(bool aMode) +{ + sDiagMode = aMode; +} + +bool otPlatDiagModeGet() +{ + return sDiagMode; +} + +void otPlatDiagChannelSet(uint8_t aChannel) +{ + OT_UNUSED_VARIABLE(aChannel); +} + +void otPlatDiagTxPowerSet(int8_t aTxPower) +{ + OT_UNUSED_VARIABLE(aTxPower); +} + +void otPlatDiagRadioReceived(otInstance *aInstance, otRadioFrame *aFrame, otError aError) +{ + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aFrame); + OT_UNUSED_VARIABLE(aError); +} + +void otPlatDiagAlarmCallback(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); +} diff --git a/examples/platforms/qpg6095/logging.c b/examples/platforms/qpg6095/logging.c new file mode 100644 index 000000000..264f6f5fe --- /dev/null +++ b/examples/platforms/qpg6095/logging.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "platform_qorvo.h" + +#include +#include +#include + +#include + +#include "uart_qorvo.h" +#include "utils/code_utils.h" + +// Macro to append content to end of the log string. + +#if (OPENTHREAD_CONFIG_LOG_OUTPUT == OPENTHREAD_CONFIG_LOG_OUTPUT_PLATFORM_DEFINED) +void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, ...) +{ + va_list args; + va_start(args, aFormat); + qorvoUartLog(aLogLevel, aLogRegion, aFormat, args); + va_end(args); +} +#endif diff --git a/examples/platforms/qpg6095/misc.c b/examples/platforms/qpg6095/misc.c new file mode 100644 index 000000000..85b042a47 --- /dev/null +++ b/examples/platforms/qpg6095/misc.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "misc_qorvo.h" +#include +#include + +void otPlatReset(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoPlatReset(); +} + +otPlatResetReason otPlatGetResetReason(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + // TODO: Write me! + return OT_PLAT_RESET_REASON_POWER_ON; +} + +void otPlatWakeHost(void) +{ + // TODO: implement an operation to wake the host from sleep state. +} diff --git a/examples/platforms/qpg6095/misc_qorvo.h b/examples/platforms/qpg6095/misc_qorvo.h new file mode 100644 index 000000000..a5236c414 --- /dev/null +++ b/examples/platforms/qpg6095/misc_qorvo.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the declarations of the misc functions from the Qorvo library. + * + */ + +#ifndef MISC_QORVO_H_ +#define MISC_QORVO_H_ + +#include +#include + +void qorvoPlatReset(void); + +#endif // MISC_QORVO_H_ diff --git a/examples/platforms/qpg6095/openthread-core-qpg6095-config.h b/examples/platforms/qpg6095/openthread-core-qpg6095-config.h new file mode 100644 index 000000000..134c56610 --- /dev/null +++ b/examples/platforms/qpg6095/openthread-core-qpg6095-config.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes qpg6095 compile-time configuration constants for OpenThread. + */ + +#ifndef OPENTHREAD_CORE_QPG6095_CONFIG_H_ +#define OPENTHREAD_CORE_QPG6095_CONFIG_H_ + +/** + * @def OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE + * + * Define to 1 if you want use legacy transmit done. + * + */ +#define OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE 1 + +/** + * @def OPENTHREAD_CONFIG_PLATFORM_INFO + * + * The platform-specific string to insert into the OpenThread version string. + * + */ +#define OPENTHREAD_CONFIG_PLATFORM_INFO "QPG6095" + +#endif // OPENTHREAD_CORE_QPG6095_CONFIG_H_ diff --git a/examples/platforms/qpg6095/platform.c b/examples/platforms/qpg6095/platform.c new file mode 100644 index 000000000..6ea68aa31 --- /dev/null +++ b/examples/platforms/qpg6095/platform.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * @brief + * This file includes the platform-specific initializers. + */ + +#include "alarm_qorvo.h" +#include "platform_qorvo.h" +#include "radio_qorvo.h" +#include "random_qorvo.h" +#include "uart_qorvo.h" +#include +#include + +#include "stdio.h" +#include "stdlib.h" + +static otInstance *localInstance = NULL; + +bool qorvoPlatGotoSleepCheck(void) +{ + if (localInstance) + { + return !otTaskletsArePending(localInstance); + } + else + { + return true; + } +} + +void otSysInit(int argc, char *argv[]) +{ + OT_UNUSED_VARIABLE(argc); + OT_UNUSED_VARIABLE(argv); + qorvoPlatInit((qorvoPlatGotoSleepCheckCallback_t)qorvoPlatGotoSleepCheck); + qorvoAlarmInit(); + qorvoRandomInit(); + qorvoRadioInit(); +} + +bool otSysPseudoResetWasRequested(void) +{ + return false; +} + +void otSysProcessDrivers(otInstance *aInstance) +{ + if (localInstance == NULL) + { + // local copy in case we need to perform a callback. + localInstance = aInstance; + } + + qorvoPlatMainLoop(!otTaskletsArePending(aInstance)); +} diff --git a/examples/platforms/qpg6095/platform_qorvo.h b/examples/platforms/qpg6095/platform_qorvo.h new file mode 100644 index 000000000..34b35932a --- /dev/null +++ b/examples/platforms/qpg6095/platform_qorvo.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the platform-specific initializers. + * + */ + +#ifndef PLATFORM_QORVO_H_ +#define PLATFORM_QORVO_H_ + +#include +#include + +typedef bool (*qorvoPlatGotoSleepCheckCallback_t) ( void ); + +/** + * This function initializes the platform. + * + * @param[in] gotoSleepCheckCallback The callback which needs to return if sleep is allowed. + * + */ +void qorvoPlatInit(qorvoPlatGotoSleepCheckCallback_t gotoSleepCheckCallback); + +/** + * This function runs the main loop of the platform once. + * + * @param[in] canGoToSleep Indicates if the platform can got to sleep. + * + */ +void qorvoPlatMainLoop(bool canGoToSleep); + +#endif // PLATFORM_QORVO_H_ diff --git a/examples/platforms/qpg6095/qpg6095.ld b/examples/platforms/qpg6095/qpg6095.ld new file mode 100644 index 000000000..aa61a2db5 --- /dev/null +++ b/examples/platforms/qpg6095/qpg6095.ld @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* Memory Spaces Definitions */ +MEMORY +{ + SYSRAM (rxw) : ORIGIN = 0x20008000, LENGTH = 0x8000 + UCRAM (rxw) : ORIGIN = 0x20010000, LENGTH = 0x8000 + FLASH (rx) : ORIGIN = 0x04000000, LENGTH = 0x80000 +} + +SECTIONS +{ + flash_end = 0x4000000 + 0x80000; + .vpp 0x0400001C : { LONG(_ivt >> 8); } > FLASH + .mw 0x04000020 : { LONG(0x693A5C81); } > FLASH + rts_start_offset = 0x200; + rts_start_address = ORIGIN(FLASH) + rts_start_offset; + .rt rts_start_address : {. = ALIGN(4); *(.rt_flash); } > FLASH + .isr_vector : ALIGN(0x800) { _ivt = .; KEEP(*(.isr_vector)); } > FLASH + + __exidx_start = .; + .text : { . = ALIGN(4); *(.text) *(.text.*); } > FLASH + .rodata : { . = ALIGN(4); *(.rodata) *(.rodata.*); } > FLASH + __exidx_end = .; + + _slower_retain = ORIGIN(SYSRAM) ; /* Start retained memory in sleep */ + + /* Fixed sections */ + .mw_crc 0x20008000 : { . += 0x4; } > SYSRAM + .crc 0x20008004 : { . += 0x4; } > SYSRAM + .ret_hw 0x20008008 : { . += 0x138; } > SYSRAM + .ret_sw 0x20008140 : { . += 0x80; } > SYSRAM + + /* Windowed sections */ + .ram_regmap : { . += 0x140; } > SYSRAM + .events : { . += 0x10 ; } > SYSRAM + .pbm_options : { . += 0x400 ; } > SYSRAM + + .lower_ram_retain_gpmicro_accessible (NOLOAD) : { . = ALIGN(4); *(.lower_ram_retain_gpmicro_accessible) *(.lower_ram_retain_gpmicro_accessible.*); } > SYSRAM + .lower_ram_retain (NOLOAD) : { . = ALIGN(4); *(.lower_ram_retain) *(.lower_ram_retain.*); } > SYSRAM + + .bss : { . = ALIGN(4); *(.bss) *(COMMON);} > SYSRAM + + _elower_retain = . ; /* End memory to be retained */ + .lower_ram_noretain (NOLOAD) : { . = ALIGN(4); *(.lower_ram_noretain) *(.lower_ram_noretain.*); } > SYSRAM + _elower_ram = . ; + + . = ORIGIN(UCRAM); + + PROVIDE(_shigher_retain = .); + .higher_ram_retain (NOLOAD) : { . = ALIGN(4); *(.higher_ram_retain) *(.higher_ram_retain.*); } > UCRAM + PROVIDE(_ehigher_retain = .); + .higher_ram_noretain (NOLOAD) : { . = ALIGN(4); *(.higher_ram_noretain) *(.higher_ram_noretain.*); } > UCRAM + .data : { . = ALIGN(4); *(.data) *(.data.*); } > UCRAM AT > FLASH + .bss_uc : { . = ALIGN(4); *(.bss.*) ;} > UCRAM + _ehigher_ram = . ; + + /* remove the debugging information from the standard libraries */ + /DISCARD/ : { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .gpNvm flash_end - 0x4000: + { + gpNvm_Start = . ; + . = 0x4000 ; + gpNvm_End = . ; + } > FLASH + + _etext = ADDR(.text) + SIZEOF(.text); + _sidata = LOADADDR(.data); + _sdata = ADDR(.data); + _edata = ADDR(.data) + ALIGN(SIZEOF(.data), 4); + _ldata = _edata - _sdata; + _sbss = ADDR(.bss); + _ebss = ADDR(.bss) + ALIGN(SIZEOF(.bss), 4); + _lbss = _ebss - _sbss; + /* use UCRAM for stack */ + _sstack = _ehigher_ram; + _estack = ORIGIN(UCRAM) + LENGTH(UCRAM); + _sbss_uc = ADDR(.bss_uc); + _ebss_uc = ADDR(.bss_uc) + ALIGN(SIZEOF(.bss_uc), 4); + _lbss_uc = _ebss_uc - _sbss_uc; + + __configured_stack_size = 0x1200; + __stack_size = _estack - _sstack; + ASSERT(__stack_size >= __configured_stack_size, "STACK too small") + + _elower_ram = ADDR(.lower_ram_retain) + ALIGN(SIZEOF(.lower_ram_retain), 4); + __lowerram_retain_size = _elower_retain - _slower_retain; + + __higherram_retain_size = SIZEOF(.higher_ram_retain); + + sw_retention_begin = ADDR(.ret_sw); + sw_retention_end = ADDR(.ret_sw) + SIZEOF(.ret_sw); + ram_regmap_begin = ADDR(.ram_regmap); + events_begin = ADDR(.events); + pbm_options_begin = ADDR(.pbm_options); + + total_nr_of_events_as_an_address = SIZEOF(.events) / 16; +} + +ENTRY(reset_handler) + diff --git a/examples/platforms/qpg6095/radio.c b/examples/platforms/qpg6095/radio.c new file mode 100644 index 000000000..b12ba1db2 --- /dev/null +++ b/examples/platforms/qpg6095/radio.c @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file implements the OpenThread platform abstraction for radio communication. + * + */ + +#include "radio_qorvo.h" +#include +#include +#include + +enum +{ + QPG6095_RECEIVE_SENSITIVITY = -100, // dBm +}; + +enum +{ + IEEE802154_MIN_LENGTH = 5, + IEEE802154_MAX_LENGTH = 127, + IEEE802154_ACK_LENGTH = 5, + IEEE802154_FRAME_TYPE_MASK = 0x7, + IEEE802154_FRAME_TYPE_ACK = 0x2, + IEEE802154_FRAME_PENDING = 1 << 4, + IEEE802154_ACK_REQUEST = 1 << 5, + IEEE802154_DSN_OFFSET = 2, +}; + +enum +{ + QORVO_RSSI_OFFSET = 73, + QORVO_CRC_BIT_MASK = 0x80, + QORVO_LQI_BIT_MASK = 0x7f, +}; + +extern otRadioFrame sTransmitFrame; + +static otRadioState sState; +// static bool sIsReceiverEnabled = false; +static otInstance *pQorvoInstance; + +typedef struct otCachedSettings_s +{ + uint16_t panid; +} otCachedSettings_t; +static otCachedSettings_t otCachedSettings; + +static uint8_t scanstate = 0; + +/***************************************************************************** + * Static Function Prototypes + *****************************************************************************/ + +/***************************************************************************** + * Static Data Definitions + *****************************************************************************/ + +/***************************************************************************** + * Static Function Definitions + *****************************************************************************/ + +/***************************************************************************** + * Public Function Definitions + *****************************************************************************/ + +void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoRadioGetIeeeEui64(aIeeeEui64); +} + +void otPlatRadioSetPanId(otInstance *aInstance, uint16_t panid) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoRadioSetPanId(panid); + otCachedSettings.panid = panid; +} + +void otPlatRadioSetExtendedAddress(otInstance *aInstance, const otExtAddress *address) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoRadioSetExtendedAddress(address->m8); +} + +void otPlatRadioSetShortAddress(otInstance *aInstance, uint16_t address) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoRadioSetShortAddress(address); +} + +bool otPlatRadioIsEnabled(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return (sState != OT_RADIO_STATE_DISABLED) ? true : false; +} + +otError otPlatRadioEnable(otInstance *aInstance) +{ + pQorvoInstance = aInstance; + memset(&otCachedSettings, 0x00, sizeof(otCachedSettings_t)); + + if (!otPlatRadioIsEnabled(aInstance)) + { + sState = OT_RADIO_STATE_SLEEP; + } + + return OT_ERROR_NONE; +} + +otError otPlatRadioDisable(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + if (otPlatRadioIsEnabled(aInstance)) + { + if (sState == OT_RADIO_STATE_RECEIVE) + { + qorvoRadioSetRxOnWhenIdle(false); + } + sState = OT_RADIO_STATE_DISABLED; + } + + return OT_ERROR_NONE; +} + +otError otPlatRadioSleep(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + if (sState == OT_RADIO_STATE_RECEIVE) + { + qorvoRadioSetRxOnWhenIdle(false); + sState = OT_RADIO_STATE_SLEEP; + } + + return OT_ERROR_NONE; +} + +otError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel) +{ + otError error = OT_ERROR_INVALID_STATE; + pQorvoInstance = aInstance; + + if ((sState != OT_RADIO_STATE_DISABLED) && (scanstate == 0)) + { + qorvoRadioSetCurrentChannel(aChannel); + error = OT_ERROR_NONE; + } + if (sState == OT_RADIO_STATE_SLEEP) + { + qorvoRadioSetRxOnWhenIdle(true); + error = OT_ERROR_NONE; + sState = OT_RADIO_STATE_RECEIVE; + } + + return error; +} + +otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aPacket) +{ + pQorvoInstance = aInstance; + + if (sState == OT_RADIO_STATE_DISABLED) + { + return OT_ERROR_INVALID_STATE; + } + + return qorvoRadioTransmit(aPacket); +} + +void cbQorvoRadioTransmitDone(otRadioFrame *aPacket, bool aFramePending, otError aError) +{ + // TODO: pass received ACK frame instead of generating one. + otRadioFrame ackFrame; + uint8_t psdu[IEEE802154_ACK_LENGTH]; + + ackFrame.mPsdu = psdu; + ackFrame.mLength = IEEE802154_ACK_LENGTH; + ackFrame.mPsdu[0] = IEEE802154_FRAME_TYPE_ACK; + + if (aFramePending) + { + ackFrame.mPsdu[0] |= IEEE802154_FRAME_PENDING; + } + + ackFrame.mPsdu[1] = 0; + ackFrame.mPsdu[2] = aPacket->mPsdu[IEEE802154_DSN_OFFSET]; + + otPlatRadioTxDone(pQorvoInstance, aPacket, &ackFrame, aError); +} + +void cbQorvoRadioReceiveDone(otRadioFrame *aPacket, otError aError) +{ + otPlatRadioReceiveDone(pQorvoInstance, aPacket, aError); +} + +otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return &sTransmitFrame; +} + +int8_t otPlatRadioGetRssi(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return 0; +} + +otRadioCaps otPlatRadioGetCaps(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return OT_RADIO_CAPS_ACK_TIMEOUT | OT_RADIO_CAPS_ENERGY_SCAN | OT_RADIO_CAPS_TRANSMIT_RETRIES; +} + +bool otPlatRadioGetPromiscuous(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return false; +} + +void otPlatRadioSetPromiscuous(otInstance *aInstance, bool aEnable) +{ + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aEnable); +} + +void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoRadioEnableSrcMatch(aEnable); +} + +otError otPlatRadioAddSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress) +{ + OT_UNUSED_VARIABLE(aInstance); + return qorvoRadioAddSrcMatchShortEntry(aShortAddress, otCachedSettings.panid); +} + +otError otPlatRadioAddSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress) +{ + OT_UNUSED_VARIABLE(aInstance); + return qorvoRadioAddSrcMatchExtEntry(aExtAddress->m8, otCachedSettings.panid); +} + +otError otPlatRadioClearSrcMatchShortEntry(otInstance *aInstance, const uint16_t aShortAddress) +{ + OT_UNUSED_VARIABLE(aInstance); + return qorvoRadioClearSrcMatchShortEntry(aShortAddress, otCachedSettings.panid); +} + +otError otPlatRadioClearSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress) +{ + OT_UNUSED_VARIABLE(aInstance); + return qorvoRadioClearSrcMatchExtEntry(aExtAddress->m8, otCachedSettings.panid); +} + +void otPlatRadioClearSrcMatchShortEntries(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + /* clear both short and extended addresses here */ + qorvoRadioClearSrcMatchEntries(); +} + +void otPlatRadioClearSrcMatchExtEntries(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + /* not implemented */ + /* assumes clearing of short and extended entries is done simultaniously by the openthread stack */ +} + +otError otPlatRadioEnergyScan(otInstance *aInstance, uint8_t aScanChannel, uint16_t aScanDuration) +{ + OT_UNUSED_VARIABLE(aInstance); + scanstate = 1; + return qorvoRadioEnergyScan(aScanChannel, aScanDuration); +} + +void cbQorvoRadioEnergyScanDone(int8_t aEnergyScanMaxRssi) +{ + scanstate = 0; + otPlatRadioEnergyScanDone(pQorvoInstance, aEnergyScanMaxRssi); +} + +otError otPlatRadioGetTransmitPower(otInstance *aInstance, int8_t *aPower) +{ + // TODO: Create a proper implementation for this driver. + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aPower); + return OT_ERROR_NOT_IMPLEMENTED; +} + +otError otPlatRadioSetTransmitPower(otInstance *aInstance, int8_t aPower) +{ + // TODO: Create a proper implementation for this driver. + OT_UNUSED_VARIABLE(aInstance); + OT_UNUSED_VARIABLE(aPower); + return OT_ERROR_NOT_IMPLEMENTED; +} + +int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return QPG6095_RECEIVE_SENSITIVITY; +} diff --git a/examples/platforms/qpg6095/radio_qorvo.h b/examples/platforms/qpg6095/radio_qorvo.h new file mode 100644 index 000000000..4a4f456ce --- /dev/null +++ b/examples/platforms/qpg6095/radio_qorvo.h @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the declarations of the radio functions from the Qorvo library. + * + */ + +#ifndef RADIO_QORVO_H_ +#define RADIO_QORVO_H_ + +#include +#include +#include + +/** + * This function initializes the radio. + * + */ +void qorvoRadioInit(void); + +/** + * This function resets the radio. + * + */ +void qorvoRadioReset(void); + +/** + * This function processes event to/from the radio. + * + */ +void qorvoRadioProcess(void); + +/** + * This function starts an ED scan. + * + * @param[in] aScanChannel The channel which needs to be scanned. + * @param[in] aScanDuration The amount of time in ms which needs to be scanned. + * + */ +otError qorvoRadioEnergyScan(uint8_t aScanChannel, uint16_t aScanDuration); + +/** + * This function sets the current channel. + * + * @param[in] channel The channel index. + * + */ +void qorvoRadioSetCurrentChannel(uint8_t channel); + +/** + * This function sets the idle behaviour of the radio. + * + * @param[in] rxOnWhenIdle If true, the radio remains on which not transmitting. + * + */ +void qorvoRadioSetRxOnWhenIdle(bool rxOnWhenIdle); + +/** + * This function retrieves the MAC address of the radio. + * + * @param[out] aIeeeEui64 The MAC address of the radio. + * + */ +void qorvoRadioGetIeeeEui64(uint8_t *aIeeeEui64); + +/** + * This function transmits a frame. + * + * @param[in] aPacket The frame which needs to be transmitted. + * + */ +otError qorvoRadioTransmit(otRadioFrame *aPacket); + +/** + * This function sets the PanId. + * + * @param[in] panid The panId. + * + */ +void qorvoRadioSetPanId(uint16_t panid); + +/** + * This function sets the short address. + * + * @param[in] address The short address. + * + */ +void qorvoRadioSetShortAddress(uint16_t address); + +/** + * This function sets the extended address. + * + * @param[in] address The extended address. + * + */ +void qorvoRadioSetExtendedAddress(const uint8_t *address); + +/** + * This function enables source address matching for indirect transmit. + * + * @param[in] aEnable if True will enable source address matching, false will disable. + * + */ +void qorvoRadioEnableSrcMatch(bool aEnable); + +/** + * This function clears all entries from the source address match list. + * + */ +void qorvoRadioClearSrcMatchEntries(void); + +/** + * This function adds an short address plus panid to the source address match list. + * + * @param[in] aShortAddress The short address which should be added. + * @param[in] panid The panid. + * + */ +otError qorvoRadioAddSrcMatchShortEntry(const uint16_t aShortAddress, uint16_t panid); + +/** + * This function adds an extended address plus panid to the source address match list. + * + * @param[in] aExtAddress The extended address which should be added. + * @param[in] panid The panid. + * + */ +otError qorvoRadioAddSrcMatchExtEntry(const uint8_t *aExtAddress, uint16_t panid); + +/** + * This function removes an short address plus panid from the source address match list. + * + * @param[in] aShortAddress The short address which should be removed. + * @param[in] panid The panid. + * + */ +otError qorvoRadioClearSrcMatchShortEntry(const uint16_t aShortAddress, uint16_t panid); + +/** + * This function removes an extended address plus panid from the source address match list. + * + * @param[in] aExtAddress The extended address which should be removed. + * @param[in] panid The panid. + * + */ +otError qorvoRadioClearSrcMatchExtEntry(const uint8_t *aExtAddress, uint16_t panid); + +/** + * This callback is called when the energy scan is finished. + * + * @param[in] aEnergyScanMaxRssi The amount of energy detected during the ED scan. + * + */ +void cbQorvoRadioEnergyScanDone(int8_t aEnergyScanMaxRssi); + +/** + * This callback is called after a transmission is completed (and if required an ACK is received). + * + * @param[in] aPacket The packet which was transmitted. + * @param[in] aFramePending Indicates if the FP bit was set in the ACK frame or not. + * @param[in] aError Indicates if an error occurred during transmission. + * + */ +void cbQorvoRadioTransmitDone(otRadioFrame *aPacket, bool aFramePending, otError aError); + +/** + * This callback is called after a frame is received. + * + * @param[in] aPacket The packet which was received. + * @param[in] aError Any error which occurred during reception of the packet. + * + */ +void cbQorvoRadioReceiveDone(otRadioFrame *aPacket, otError aError); + +#endif // RADIO_QORVO_H_ diff --git a/examples/platforms/qpg6095/random.c b/examples/platforms/qpg6095/random.c new file mode 100644 index 000000000..01c5be935 --- /dev/null +++ b/examples/platforms/qpg6095/random.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file implements a random number generator. + * + */ + +#include "assert.h" +#include "random_qorvo.h" +#include +#include +#include + +#define GP_COMPONENT_ID GP_COMPONENT_ID_APP + +// uint8_t pseudoRandom = 0x34; + +void qorvoRandomInit(void) +{ + // pseudoRandom += (uint8_t) (seed&0xFF); +} + +uint32_t otPlatRandomGet(void) +{ + uint32_t random = 0; + otPlatRandomGetTrue((uint8_t *)(&random), sizeof(uint32_t)); + return random; +} + +otError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength) +{ + otError error = OT_ERROR_NONE; + assert(aOutputLength < 256); + // uint8_t i; + + qorvoRandomGet((uint8_t *)aOutput, (uint8_t)aOutputLength); + // for(i=0; i +#include + +/** + * This function initializes the random number service used by OpenThread. + * + */ +void qorvoRandomInit(void); + +/** + * This function returns an array of random numbers. + * + * @param[out] aOutput Pointer to an array which will be filled with random data. + * @param[in] aOutputLength number of bytes which will be written into the array. + * + */ +void qorvoRandomGet(uint8_t *aOutput, uint8_t aOutputLength); + + +#endif // RANDOM_QORVO_H_ diff --git a/examples/platforms/qpg6095/settings.cpp b/examples/platforms/qpg6095/settings.cpp new file mode 100644 index 000000000..88a0754c7 --- /dev/null +++ b/examples/platforms/qpg6095/settings.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * noqtice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file implements the OpenThread platform abstraction for non-volatile storage of settings. + * + */ + +#include + +#include +#include "common/settings.hpp" +#include "openthread/platform/settings.h" + +#include + +#include "settings_qorvo.h" + +/***************************************************************************** + * Public Function Definitions + *****************************************************************************/ + +// settings API +void otPlatSettingsInit(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + qorvoSettingsInit(); +} + +otError otPlatSettingsBeginChange(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return OT_ERROR_NONE; +} + +otError otPlatSettingsCommitChange(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return OT_ERROR_NONE; +} + +otError otPlatSettingsAbandonChange(otInstance *aInstance) +{ + OT_UNUSED_VARIABLE(aInstance); + return OT_ERROR_NONE; +} + +otError otPlatSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength) +{ + otError error = OT_ERROR_NOT_FOUND; + OT_UNUSED_VARIABLE(aInstance); + + /* we only support multiple entries for the ChildInfo */ + /* Note: removed the assert, since the settings types are protected now */ + // assert((aIndex == 0) || (aKey == ot::Settings::kKeyChildInfo)); + + error = qorvoSettingsGet(aKey, aIndex, aValue, aValueLength); + + if (error == OT_ERROR_NOT_FOUND) + { + if (aValue != NULL) + { + *aValueLength = 0; + } + } + + return error; +} + +static otError PlatformSettingsAdd(otInstance * aInstance, + uint16_t aKey, + bool aIndex0, + const uint8_t *aValue, + uint16_t aValueLength) +{ + otError error = OT_ERROR_NONE; + OT_UNUSED_VARIABLE(aInstance); + + error = qorvoSettingsAdd(aKey, aIndex0, aValue, aValueLength); + + return error; +} + +otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength) +{ + return PlatformSettingsAdd(aInstance, aKey, true, aValue, aValueLength); +} + +otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength) +{ + return PlatformSettingsAdd(aInstance, aKey, false, aValue, aValueLength); +} + +otError otPlatSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex) +{ + otError error = OT_ERROR_NOT_FOUND; + OT_UNUSED_VARIABLE(aInstance); + + if (otPlatSettingsGet(aInstance, aKey, 0, NULL, NULL) == OT_ERROR_NONE) + { + qorvoSettingsDelete(aKey, aIndex); + error = OT_ERROR_NONE; + } + + return error; +} + +void otPlatSettingsWipe(otInstance *aInstance) +{ + qorvoSettingsWipe(); + otPlatSettingsInit(aInstance); +} diff --git a/examples/platforms/qpg6095/settings_qorvo.h b/examples/platforms/qpg6095/settings_qorvo.h new file mode 100644 index 000000000..db9cc3a47 --- /dev/null +++ b/examples/platforms/qpg6095/settings_qorvo.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the declarations of the settings functions from the Qorvo library. + * + */ + +#ifndef SETTINGS_QORVO_H_ +#define SETTINGS_QORVO_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void qorvoSettingsInit(void); + +otError qorvoSettingsGet(uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength); + +otError qorvoSettingsAdd(uint16_t aKey, bool aIndex0, const uint8_t *aValue, uint16_t aValueLength); + +otError qorvoSettingsDelete(uint16_t aKey, int aIndex); + +void qorvoSettingsWipe(void); + +#ifdef __cplusplus +} +#endif + +#endif // SETTINGS_QORVO_H_ diff --git a/examples/platforms/qpg6095/uart.c b/examples/platforms/qpg6095/uart.c new file mode 100644 index 000000000..eaf027dc6 --- /dev/null +++ b/examples/platforms/qpg6095/uart.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file implements the OpenThread platform abstraction for UART communication. + * + */ + +#include "uart_qorvo.h" + +/* work-around to avoid access to openthread-config.h */ +/* Define to 1 if stdbool.h conforms to C99. */ +#define HAVE_STDBOOL_H 1 +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +#include +#include + +otError otPlatUartEnable(void) +{ + otError error = OT_ERROR_NONE; + qorvoUartInit(); + return error; +} + +otError otPlatUartDisable(void) +{ + otError error = OT_ERROR_NONE; + qorvoUartDeInit(); + return error; +} + +otError otPlatUartSend(const uint8_t *aBuf, uint16_t aBufLength) +{ + otError error = OT_ERROR_NONE; + qorvoUartSendOutput(aBuf, aBufLength); + return error; +} + +void qorvoUartSendInput(uint8_t *buffer, uint16_t length) +{ + otPlatUartReceived(buffer, length); +} + +void cbQorvoUartTxDone(void) +{ + otPlatUartSendDone(); +} diff --git a/examples/platforms/qpg6095/uart_qorvo.h b/examples/platforms/qpg6095/uart_qorvo.h new file mode 100644 index 000000000..6129a9c8a --- /dev/null +++ b/examples/platforms/qpg6095/uart_qorvo.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2019, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * This file includes the declarations of the uart functions from the Qorvo library. + * + */ + +#ifndef _UART_QORVO_H_ +#define _UART_QORVO_H_ + +#include +#include +#include + +/** + * This function performs UART driver processing. + * + */ +void qorvoUartProcess(void); + +/** + * This function enables the UART driver. + * + */ +void qorvoUartInit(void); + +/** + * This function disables the UART driver. + * + */ +void qorvoUartDeInit(void); + +/** + * Callback function which will be called when uart transmission is done. + * + */ +void cbQorvoUartTxDone(void); + +/** + * Callback function which will be called when uart data is received. + * + * @param[in] aBuf A pointer to an array of received bytes. + * @param[in] aBufLength The number of bytes received from the uart. + * + */ +void qorvoUartSendInput(uint8_t* aBuf, uint16_t aBufLength); + +/** + * Function which transmits data via the uart. + * + * @param[out] aBuf A pointer to an array of bytes which need to be transmitted. + * @param[in] aBufLength The number of bytes to be transmitted via the uart. + * + */ +void qorvoUartSendOutput(const uint8_t *aBuf, uint16_t aBufLength); + +/** + * Function which transmits logging via the qorvo platform. + * + * @param[in] aLogLevel The severity level of logging. + * @param[in] aLogRegion The code region where the logging originated from. + * @param[in] aFormat The format strings. + * @param[in] varargs The arguments for the format string. + * + */ +void qorvoUartLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, ...); + +#endif // _UART_QORVO_H_ diff --git a/third_party/Qorvo/LICENSE.txt b/third_party/Qorvo/LICENSE.txt index 555061fae..6e24ccb81 100644 --- a/third_party/Qorvo/LICENSE.txt +++ b/third_party/Qorvo/LICENSE.txt @@ -1,6 +1,6 @@ Copyright (c) 2012-2016, GreenPeak Technologies -Copyright (c) 2017, Qorvo Inc +Copyright (c) 2017-2019, Qorvo Inc This software is owned by Qorvo Inc and protected under applicable copyright laws. diff --git a/third_party/Qorvo/README.md b/third_party/Qorvo/README.md index 638390fea..6cb98ffd3 100644 --- a/third_party/Qorvo/README.md +++ b/third_party/Qorvo/README.md @@ -10,4 +10,6 @@ ## Description -This library contains the glue code to interface with the kernel drivers for linux based platforms containing the gp712. \ No newline at end of file +The gp712 folder contains library with the glue code to interface with the kernel drivers for linux based platforms containing the GP712. + +The qpg6095 folder contains library with the hal code for the QPG6095. diff --git a/third_party/Qorvo/qpg6095/libQorvoQPG6095.a b/third_party/Qorvo/qpg6095/libQorvoQPG6095.a new file mode 100644 index 000000000..f3d70b50e Binary files /dev/null and b/third_party/Qorvo/qpg6095/libQorvoQPG6095.a differ