diff --git a/subsys/bluetooth/controller/CMakeLists.txt b/subsys/bluetooth/controller/CMakeLists.txt index 39f013b2696..f4ae6c044c5 100644 --- a/subsys/bluetooth/controller/CMakeLists.txt +++ b/subsys/bluetooth/controller/CMakeLists.txt @@ -43,6 +43,10 @@ if(CONFIG_BT_LL_SW_SPLIT) CONFIG_BT_CTLR_ADV_EXT ll_sw/ull_scan_aux.c ) + zephyr_library_sources_ifdef( + CONFIG_BT_CTLR_SCAN_PERIODIC + ll_sw/ull_scan_sync.c + ) endif() if(CONFIG_BT_CONN) zephyr_library_sources( @@ -64,7 +68,9 @@ if(CONFIG_BT_LL_SW_SPLIT) ) endif() endif() - if(CONFIG_BT_CONN OR CONFIG_BT_CTLR_ADV_PERIODIC) + if(CONFIG_BT_CONN OR + CONFIG_BT_CTLR_ADV_PERIODIC OR + CONFIG_BT_CTLR_SCAN_PERIODIC) zephyr_library_sources( ll_sw/ull_chan.c ll_sw/lll_chan.c diff --git a/subsys/bluetooth/controller/Kconfig b/subsys/bluetooth/controller/Kconfig index a834a47d594..cf84687094c 100644 --- a/subsys/bluetooth/controller/Kconfig +++ b/subsys/bluetooth/controller/Kconfig @@ -45,6 +45,10 @@ config BT_CTLR_ADV_PERIODIC_SUPPORT depends on BT_CTLR_ADV_EXT_SUPPORT bool +config BT_CTLR_SCAN_PERIODIC_SUPPORT + depends on BT_CTLR_ADV_EXT_SUPPORT + bool + config BT_CTLR_CHAN_SEL_2_SUPPORT bool @@ -371,7 +375,7 @@ config BT_CTLR_PHY_CODED config BT_CTLR_CHAN_SEL_2 bool "Channel Selection Algorithm #2" - depends on (BT_CONN || BT_CTLR_ADV_PERIODIC) && BT_CTLR_CHAN_SEL_2_SUPPORT + depends on (BT_CONN || BT_CTLR_ADV_PERIODIC || BT_CTLR_SCAN_PERIODIC) && BT_CTLR_CHAN_SEL_2_SUPPORT default y help Enable support for Bluetooth 5.0 LE Channel Selection Algorithm #2 in @@ -409,6 +413,15 @@ config BT_CTLR_ADV_PERIODIC Enable support for Bluetooth 5.0 LE Periodic Advertising in the Controller. +config BT_CTLR_SCAN_PERIODIC + bool "LE Periodic Advertising Sync" + depends on BT_OBSERVER && BT_CTLR_SCAN_PERIODIC_SUPPORT + select BT_CTLR_CHAN_SEL_2 + default y if BT_PER_ADV_SYNC + help + Enable support for Bluetooth 5.0 LE Periodic Advertising Sync in the + Controller. + config BT_CTLR_ADV_DATA_LEN_MAX int "Maximum Advertising Data Length" range 31 1650 diff --git a/subsys/bluetooth/controller/Kconfig.ll_sw_split b/subsys/bluetooth/controller/Kconfig.ll_sw_split index cbd6b525868..f9f795f1c69 100644 --- a/subsys/bluetooth/controller/Kconfig.ll_sw_split +++ b/subsys/bluetooth/controller/Kconfig.ll_sw_split @@ -28,6 +28,7 @@ config BT_LLL_VENDOR_NORDIC BT_CTLR_PHY_CODED_SUPPORT select BT_CTLR_ADV_EXT_SUPPORT select BT_CTLR_ADV_PERIODIC_SUPPORT + select BT_CTLR_SCAN_PERIODIC_SUPPORT select BT_CTLR_CHAN_SEL_2_SUPPORT select BT_CTLR_MIN_USED_CHAN_SUPPORT select BT_CTLR_DTM_HCI_SUPPORT diff --git a/subsys/bluetooth/controller/include/ll.h b/subsys/bluetooth/controller/include/ll.h index 87d804dc362..40a8a24fed2 100644 --- a/subsys/bluetooth/controller/include/ll.h +++ b/subsys/bluetooth/controller/include/ll.h @@ -94,9 +94,21 @@ uint8_t ll_adv_enable(uint8_t handle, uint8_t enable, uint8_t ll_adv_enable(uint8_t enable); #endif /* !CONFIG_BT_CTLR_ADV_EXT || !CONFIG_BT_HCI_MESH_EXT */ +#if defined(CONFIG_BT_CTLR_ADV_EXT) uint8_t ll_scan_params_set(uint8_t type, uint16_t interval, uint16_t window, uint8_t own_addr_type, uint8_t filter_policy); uint8_t ll_scan_enable(uint8_t enable); +uint8_t ll_scan_sync_create(uint8_t options, uint8_t sid, uint8_t adv_addr_type, + uint8_t *adv_addr, uint16_t skip, + uint16_t sync_timeout, uint8_t sync_cte_type); +uint8_t ll_scan_sync_create_cancel(void); +uint8_t ll_scan_sync_terminate(uint16_t handle); +uint8_t ll_scan_sync_recv_enable(uint16_t handle, uint8_t enable); +#else /* !CONFIG_BT_CTLR_ADV_EXT */ +uint8_t ll_scan_params_set(uint8_t type, uint16_t interval, uint16_t window, + uint8_t own_addr_type, uint8_t filter_policy); +uint8_t ll_scan_enable(uint8_t enable); +#endif /* !CONFIG_BT_CTLR_ADV_EXT */ uint8_t ll_wl_size_get(void); uint8_t ll_wl_clear(void); diff --git a/subsys/bluetooth/controller/include/ll_feat.h b/subsys/bluetooth/controller/include/ll_feat.h index 43df351ac9c..7acaa0112b6 100644 --- a/subsys/bluetooth/controller/include/ll_feat.h +++ b/subsys/bluetooth/controller/include/ll_feat.h @@ -107,6 +107,13 @@ #define LL_FEAT_BIT_EXT_ADV 0 #endif /* !CONFIG_BT_CTLR_ADV_EXT */ +#if defined(CONFIG_BT_CTLR_ADV_PERIODIC) || \ + defined(CONFIG_BT_CTLR_SCAN_PERIODIC) +#define LL_FEAT_BIT_PER_ADV BIT64(BT_LE_FEAT_BIT_PER_ADV) +#else /* !CONFIG_BT_CTLR_ADV_PERIODIC && !CONFIG_BT_CTLR_SCAN_PERIODIC */ +#define LL_FEAT_BIT_PER_ADV 0 +#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC && !CONFIG_BT_CTLR_SCAN_PERIODIC */ + #define LL_FEAT_BIT_MASK 0x1FFFF #define LL_FEAT_BIT_MASK_VALID 0x1CF2F #define LL_FEAT_FILTER_OCTET0 0x1FF00 @@ -123,5 +130,6 @@ LL_FEAT_BIT_SMI_RX | \ LL_FEAT_BIT_PHY_CODED | \ LL_FEAT_BIT_EXT_ADV | \ + LL_FEAT_BIT_PER_ADV | \ LL_FEAT_BIT_CHAN_SEL_2 | \ LL_FEAT_BIT_MIN_USED_CHAN) diff --git a/subsys/bluetooth/controller/ll_sw/ull_scan_sync.c b/subsys/bluetooth/controller/ll_sw/ull_scan_sync.c new file mode 100644 index 00000000000..ca55a35305b --- /dev/null +++ b/subsys/bluetooth/controller/ll_sw/ull_scan_sync.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include + +uint8_t ll_scan_sync_create(uint8_t options, uint8_t sid, uint8_t adv_addr_type, + uint8_t *adv_addr, uint16_t skip, + uint16_t sync_timeout, uint8_t sync_cte_type) +{ + /* TODO: */ + return BT_HCI_ERR_CMD_DISALLOWED; +} + +uint8_t ll_scan_sync_create_cancel(void) +{ + /* TODO: */ + return BT_HCI_ERR_CMD_DISALLOWED; +} + +uint8_t ll_scan_sync_terminate(uint16_t handle) +{ + /* TODO: */ + return BT_HCI_ERR_CMD_DISALLOWED; +} + +uint8_t ll_scan_sync_recv_enable(uint16_t handle, uint8_t enable) +{ + /* TODO: */ + return BT_HCI_ERR_CMD_DISALLOWED; +} diff --git a/tests/bluetooth/bsim_bt/bsim_test_advx/prj.conf b/tests/bluetooth/bsim_bt/bsim_test_advx/prj.conf index a27f7f63141..7e41bb2236b 100644 --- a/tests/bluetooth/bsim_bt/bsim_test_advx/prj.conf +++ b/tests/bluetooth/bsim_bt/bsim_test_advx/prj.conf @@ -5,6 +5,9 @@ CONFIG_BT_PERIPHERAL=y CONFIG_BT_OBSERVER=y CONFIG_BT_CENTRAL=y CONFIG_BT_EXT_ADV=y +CONFIG_BT_PER_ADV=y +CONFIG_BT_PER_ADV_SYNC=y CONFIG_BT_CTLR_ADV_EXT=y CONFIG_BT_CTLR_ADV_PERIODIC=y +CONFIG_BT_CTLR_SCAN_PERIODIC=y