diff --git a/pkg/nimble/Makefile b/pkg/nimble/Makefile new file mode 100644 index 0000000000..b612d4326b --- /dev/null +++ b/pkg/nimble/Makefile @@ -0,0 +1,32 @@ +PKG_NAME = nimble +PKG_URL = https://github.com/apache/mynewt-nimble.git +PKG_VERSION = 050a7108cf56546554b4162f0600ab3b2d7e173f +PKG_LICENSE = Apache-2.0 + +TDIR = $(RIOTPKG)/$(PKG_NAME) +PDIR = $(PKG_BUILDDIR) + +# As of now, NimBLE does not build without warnings for -Wextra, so we disable +# that flag for this package. Will hopefully be fixed some time in the future. +CFLAGS += -Wno-extra + +.PHONY: all + +all: git-download + "$(MAKE)" -C $(PDIR)/ext/tinycrypt/src/ -f $(TDIR)/ext.tinycrypt.mk + "$(MAKE)" -C $(PDIR)/nimble/src -f $(TDIR)/nimble.mk + "$(MAKE)" -C $(PDIR)/nimble/host/src/ -f $(TDIR)/nimble.host.mk + "$(MAKE)" -C $(PDIR)/nimble/host/services/gap/src/ -f $(TDIR)/service.gap.mk + "$(MAKE)" -C $(PDIR)/nimble/host/services/gatt/src/ -f $(TDIR)/service.gatt.mk + "$(MAKE)" -C $(PDIR)/nimble/host/util/src/ -f $(TDIR)/nimble.host.util.mk + "$(MAKE)" -C $(PDIR)/nimble/host/store/ram/src/ -f $(TDIR)/nimble.host.store.ram.mk + "$(MAKE)" -C $(PDIR)/porting/nimble/src/ -f $(TDIR)/porting.nimble.mk + "$(MAKE)" -C $(PDIR)/porting/npl/riot/src/ -f $(TDIR)/porting.npl.riot.mk + + "$(MAKE)" -C $(PDIR)/nimble/transport/ram/src/ -f $(TDIR)/transport.ram.mk + "$(MAKE)" -C $(PDIR)/nimble/controller/src/ -f $(TDIR)/controller.mk + "$(MAKE)" -C $(PDIR)/nimble/drivers/nrf52/src/ -f $(TDIR)/drivers.nrf52.mk + + "$(MAKE)" -C $(TDIR)/contrib/ + +include $(RIOTBASE)/pkg/pkg.mk diff --git a/pkg/nimble/Makefile.dep b/pkg/nimble/Makefile.dep new file mode 100644 index 0000000000..cce2b3b139 --- /dev/null +++ b/pkg/nimble/Makefile.dep @@ -0,0 +1,24 @@ +# RIOT specific dependencies +USEMODULE += posix_semaphore +USEMODULE += event_callback +USEMODULE += xtimer + +# glue code +USEMODULE += nimble_riot_contrib + +# nimble sub-modules that we build +USEMODULE += nimble_tinycrypt +USEMODULE += nimble_host +USEMODULE += nimble_host_services_gap +USEMODULE += nimble_host_services_gatt +USEMODULE += nimble_host_util +USEMODULE += nimble_host_store_ram +USEMODULE += nimble_porting_nimble +USEMODULE += nimble_npl_riot + +# nimble controller specific sub-modules +USEMODULE += nimble_controller +USEMODULE += nimble_transport_ram +ifeq (nrf52,$(CPU_FAM)) + USEMODULE += nimble_drivers_nrf52 +endif diff --git a/pkg/nimble/Makefile.include b/pkg/nimble/Makefile.include new file mode 100644 index 0000000000..38b0023784 --- /dev/null +++ b/pkg/nimble/Makefile.include @@ -0,0 +1,34 @@ +NIMIBASE = -I$(PKGDIRBASE)/nimble + +# include RIOT glue code headers +INCLUDES += -I$(RIOTPKG)/nimble/contrib/include + +# include tinycrypt headers +INCLUDES += $(NIMIBASE)/ext/tinycrypt/include + +# include the RIOT NPL headers +INCLUDES += $(NIMIBASE)/porting/npl/riot/include + +# include nimble controller headers +INCLUDES += $(NIMIBASE)/nimble/transport/ram/include +INCLUDES += $(NIMIBASE)/nimble/controller/include +INCLUDES += $(NIMIBASE)/nimble/drivers/nrf52/include + +# include nimble host headers +INCLUDES += $(NIMIBASE)/nimble/include +INCLUDES += $(NIMIBASE)/nimble/host/include +INCLUDES += $(NIMIBASE)/nimble/host/services/ans/include +INCLUDES += $(NIMIBASE)/nimble/host/services/bas/include +INCLUDES += $(NIMIBASE)/nimble/host/services/bleuart/include +INCLUDES += $(NIMIBASE)/nimble/host/services/gap/include +INCLUDES += $(NIMIBASE)/nimble/host/services/gatt/include +INCLUDES += $(NIMIBASE)/nimble/host/services/ias/include +INCLUDES += $(NIMIBASE)/nimble/host/services/lls/include +INCLUDES += $(NIMIBASE)/nimble/host/services/tps/include +INCLUDES += $(NIMIBASE)/nimble/host/store/ram/include +INCLUDES += $(NIMIBASE)/nimble/host/util/include +INCLUDES += $(NIMIBASE)/porting/nimble/include + +# set environment +CFLAGS += -DNIMBLE_CFG_CONTROLLER=1 +CFLAGS += -DMYNEWT_VAL_OS_CPUTIME_FREQ=32768 diff --git a/pkg/nimble/contrib/Makefile b/pkg/nimble/contrib/Makefile new file mode 100644 index 0000000000..9f1db3e8e4 --- /dev/null +++ b/pkg/nimble/contrib/Makefile @@ -0,0 +1,3 @@ +MODULE = nimble_riot_contrib + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/contrib/controller_init.c b/pkg/nimble/contrib/controller_init.c new file mode 100644 index 0000000000..013561b11b --- /dev/null +++ b/pkg/nimble/contrib/controller_init.c @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup pkg_nimble + * @{ + * + * @file + * @brief Initialization of the nimble controller + * + * @author Hauke Petersen + * + * @} + */ + +#include "thread.h" +#include "nimble_riot.h" + +#include "nimble/nimble_port.h" + +#ifdef CPU_FAM_NRF52 +#include "nrf_clock.h" +#endif + +static char stack[THREAD_STACKSIZE_DEFAULT]; + +void nimble_riot_controller_init(void) +{ +#ifdef CPU_FAM_NRF52 + clock_start_lf(); +#endif + + /* + * Create task where NimBLE LL will run. This one is required as LL has its + * own event queue and should have highest priority. + */ + thread_create(stack, sizeof(stack), NIMBLE_CONTROLLER_PRIO, 0, + (thread_task_func_t)nimble_port_ll_task_func, + NULL, "nimble_ctrl"); +} diff --git a/pkg/nimble/contrib/include/nimble_riot.h b/pkg/nimble/contrib/include/nimble_riot.h new file mode 100644 index 0000000000..8336e90c08 --- /dev/null +++ b/pkg/nimble/contrib/include/nimble_riot.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup pkg_nimble + * @{ + * + * @file + * @brief RIOT specific glue functions for integrating NimBLE + * + * @author Hauke Petersen + */ + +#ifndef NIMBLE_RIOT_H +#define NIMBLE_RIOT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Define the priority used for NimBLE's controller thread + * + * This should be as high as possible. + */ +#ifndef NIMBLE_CONTROLLER_PRIO +#define NIMBLE_CONTROLLER_PRIO (0) +#endif + +/** + * @brief Starts a thread running NimBLE's controller + */ +void nimble_riot_controller_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* NIMBLE_RIOT_H */ +/** @} */ diff --git a/pkg/nimble/controller.mk b/pkg/nimble/controller.mk new file mode 100644 index 0000000000..bb4d4b046e --- /dev/null +++ b/pkg/nimble/controller.mk @@ -0,0 +1,19 @@ +MODULE = nimble_controller + +SRC += ble_ll_sched.c +SRC += ble_ll_xcvr.c +SRC += ble_ll_whitelist.c +SRC += ble_ll_ctrl.c +SRC += ble_ll_hci.c +SRC += ble_ll_supp_cmd.c +SRC += ble_ll_adv.c +SRC += ble_ll_conn.c +SRC += ble_ll_resolv.c +SRC += ble_ll_conn_hci.c +SRC += ble_ll_rand.c +SRC += ble_ll.c +SRC += ble_ll_scan.c +SRC += ble_ll_dtm.c +SRC += ble_ll_hci_ev.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/doc.txt b/pkg/nimble/doc.txt new file mode 100644 index 0000000000..91696291b5 --- /dev/null +++ b/pkg/nimble/doc.txt @@ -0,0 +1,10 @@ +/** + * @defgroup pkg_nimble NimBLE BLE stack + * @ingroup pkg + * @ingroup net + * @brief RIOT port of the NimBLE BLE stack + * + * This package includes the NimBLE BLE stack to RIOT. + * + * @see https://github.com/apache/mynewt-nimble + */ diff --git a/pkg/nimble/drivers.nrf52.mk b/pkg/nimble/drivers.nrf52.mk new file mode 100644 index 0000000000..337f895e76 --- /dev/null +++ b/pkg/nimble/drivers.nrf52.mk @@ -0,0 +1,6 @@ +MODULE = nimble_drivers_nrf52 + +SRC += ble_hw.c +SRC += ble_phy.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/ext.tinycrypt.mk b/pkg/nimble/ext.tinycrypt.mk new file mode 100644 index 0000000000..1607ededcf --- /dev/null +++ b/pkg/nimble/ext.tinycrypt.mk @@ -0,0 +1,10 @@ +MODULE = nimble_tinycrypt + +SRC += aes_decrypt.c +SRC += aes_encrypt.c +SRC += cmac_mode.c +SRC += ecc.c +SRC += ecc_dh.c +SRC += utils.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/nimble.host.mk b/pkg/nimble/nimble.host.mk new file mode 100644 index 0000000000..56385e6b1e --- /dev/null +++ b/pkg/nimble/nimble.host.mk @@ -0,0 +1,44 @@ +MODULE = nimble_host + +SRC += ble_att.c +SRC += ble_att_clt.c +SRC += ble_att_cmd.c +SRC += ble_att_svr.c +SRC += ble_eddystone.c +SRC += ble_gap.c +SRC += ble_gattc.c +SRC += ble_gatts.c +SRC += ble_hs_adv.c +SRC += ble_hs_atomic.c +SRC += ble_hs.c +SRC += ble_hs_cfg.c +SRC += ble_hs_conn.c +SRC += ble_hs_dbg.c +SRC += ble_hs_flow.c +SRC += ble_hs_hci.c +SRC += ble_hs_hci_cmd.c +SRC += ble_hs_hci_evt.c +SRC += ble_hs_hci_util.c +SRC += ble_hs_id.c +SRC += ble_hs_log.c +SRC += ble_hs_mbuf.c +SRC += ble_hs_mqueue.c +SRC += ble_hs_misc.c +SRC += ble_hs_pvcy.c +SRC += ble_hs_startup.c +SRC += ble_ibeacon.c +SRC += ble_l2cap.c +SRC += ble_l2cap_coc.c +SRC += ble_l2cap_sig.c +SRC += ble_l2cap_sig_cmd.c +SRC += ble_monitor.c +SRC += ble_sm_alg.c +SRC += ble_sm.c +SRC += ble_sm_cmd.c +SRC += ble_sm_lgcy.c +SRC += ble_sm_sc.c +SRC += ble_store.c +SRC += ble_store_util.c +SRC += ble_uuid.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/nimble.host.store.ram.mk b/pkg/nimble/nimble.host.store.ram.mk new file mode 100644 index 0000000000..a7a0258c63 --- /dev/null +++ b/pkg/nimble/nimble.host.store.ram.mk @@ -0,0 +1,5 @@ +MODULE = nimble_host_store_ram + +SRC += ble_store_ram.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/nimble.host.util.mk b/pkg/nimble/nimble.host.util.mk new file mode 100644 index 0000000000..008708fb37 --- /dev/null +++ b/pkg/nimble/nimble.host.util.mk @@ -0,0 +1,5 @@ +MODULE = nimble_host_util + +SRC += addr.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/nimble.mk b/pkg/nimble/nimble.mk new file mode 100644 index 0000000000..a6b1ffcb3a --- /dev/null +++ b/pkg/nimble/nimble.mk @@ -0,0 +1,5 @@ +MODULE = nimble + +SRC += hci_common.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/porting.nimble.mk b/pkg/nimble/porting.nimble.mk new file mode 100644 index 0000000000..f664934e9f --- /dev/null +++ b/pkg/nimble/porting.nimble.mk @@ -0,0 +1,16 @@ +MODULE = nimble_porting_nimble + +# host specific files +SRC += nimble_port.c +SRC += endian.c +SRC += mem.c +SRC += os_mbuf.c +SRC += os_mempool.c +SRC += os_msys_init.c + +# additional files needed for the controller +SRC += os_cputime.c +SRC += os_cputime_pwr2.c +SRC += hal_timer.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/porting.npl.riot.mk b/pkg/nimble/porting.npl.riot.mk new file mode 100644 index 0000000000..9851000e57 --- /dev/null +++ b/pkg/nimble/porting.npl.riot.mk @@ -0,0 +1,6 @@ +MODULE = nimble_npl_riot + +SRC += npl_os_riot.c +SRC += nrf5x_isr.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/service.gap.mk b/pkg/nimble/service.gap.mk new file mode 100644 index 0000000000..a584f7ff2b --- /dev/null +++ b/pkg/nimble/service.gap.mk @@ -0,0 +1,5 @@ +MODULE = nimble_host_services_gap + +SRC += ble_svc_gap.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/service.gatt.mk b/pkg/nimble/service.gatt.mk new file mode 100644 index 0000000000..c144fbae66 --- /dev/null +++ b/pkg/nimble/service.gatt.mk @@ -0,0 +1,5 @@ +MODULE = nimble_host_services_gatt + +SRC += ble_svc_gatt.c + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/nimble/transport.ram.mk b/pkg/nimble/transport.ram.mk new file mode 100644 index 0000000000..5a43360237 --- /dev/null +++ b/pkg/nimble/transport.ram.mk @@ -0,0 +1,4 @@ +MODULE += nimble_transport_ram +SRC += ble_hci_ram.c + +include $(RIOTBASE)/Makefile.base