diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index dc74ba922f..2bb142c56c 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -567,6 +567,12 @@ if BT_NIMBLE_EXT_ADV help This enables controller transfer periodic sync events to host + config BT_NIMBLE_PERIODIC_ADV_ENH + bool "Periodic adv enhancements(adi support)" + depends on BT_NIMBLE_ENABLE_PERIODIC_ADV && SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED + help + Enable the periodic advertising enhancements + endif config BT_NIMBLE_MAX_PERIODIC_SYNCS diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index 749a790937..6d147bba6c 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit 749a79093753d3df1450e16e45a7ea5a7f12e523 +Subproject commit 6d147bba6cbfe3e49836781a0a6f90e6f52e5538 diff --git a/components/bt/host/nimble/port/include/esp_nimble_cfg.h b/components/bt/host/nimble/port/include/esp_nimble_cfg.h index c5aaba73eb..a7734ba3f7 100644 --- a/components/bt/host/nimble/port/include/esp_nimble_cfg.h +++ b/components/bt/host/nimble/port/include/esp_nimble_cfg.h @@ -179,6 +179,11 @@ #else #define MYNEWT_VAL_BLE_CONN_SUBRATING (CONFIG_BT_NIMBLE_SUBRATE) #endif +#ifndef CONFIG_BT_NIMBLE_PERIODIC_ADV_ENH +#define MYNEWT_VAL_BLE_PERIODIC_ADV_ENH (0) +#else +#define MYNEWT_VAL_BLE_PERIODIC_ADV_ENH (CONFIG_BT_NIMBLE_PERIODIC_ADV_ENH) +#endif /*** @apache-mynewt-nimble/nimble/controller */ /*** @apache-mynewt-nimble/nimble/controller */ diff --git a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in index 652f62139c..76b94f1523 100644 --- a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in @@ -607,6 +607,10 @@ config SOC_BLE_DEVICE_PRIVACY_SUPPORTED bool default y +config SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED + bool + default y + config SOC_PHY_IMPROVE_RX_11B bool default y diff --git a/components/soc/esp32c2/include/soc/soc_caps.h b/components/soc/esp32c2/include/soc/soc_caps.h index ddc303e378..da84706928 100644 --- a/components/soc/esp32c2/include/soc/soc_caps.h +++ b/components/soc/esp32c2/include/soc/soc_caps.h @@ -296,6 +296,7 @@ #define SOC_ESP_NIMBLE_CONTROLLER (1) /*!< Support BLE EMBEDDED controller V1 */ #define SOC_BLE_50_SUPPORTED (1) /*!< Support Bluetooth 5.0 */ #define SOC_BLE_DEVICE_PRIVACY_SUPPORTED (1) /*!< Support BLE device privacy mode */ +#define SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED (1) /*!< Support For BLE Periodic Adv Enhancements */ /*------------------------------------- PHY CAPS -------------------------------------*/ #define SOC_PHY_IMPROVE_RX_11B (1) diff --git a/examples/bluetooth/nimble/ble_periodic_adv/main/Kconfig.projbuild b/examples/bluetooth/nimble/ble_periodic_adv/main/Kconfig.projbuild index 02b827616e..fd4037d16a 100644 --- a/examples/bluetooth/nimble/ble_periodic_adv/main/Kconfig.projbuild +++ b/examples/bluetooth/nimble/ble_periodic_adv/main/Kconfig.projbuild @@ -16,4 +16,12 @@ menu "Example Configuration" prompt "Advertise RANDOM Address" help Use this option to advertise a random address instead of public address + + config EXAMPLE_PERIODIC_ADV_ENH + bool + prompt "Enable Periodic Adv Enhancements" + depends on SOC_BLE_50_SUPPORTED && SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED + select BT_NIMBLE_PERIODIC_ADV_ENH + help + Use this option to enable periodic advertising enhancements endmenu diff --git a/examples/bluetooth/nimble/ble_periodic_adv/main/main.c b/examples/bluetooth/nimble/ble_periodic_adv/main/main.c index 41414a196c..cbbb9800d9 100644 --- a/examples/bluetooth/nimble/ble_periodic_adv/main/main.c +++ b/examples/bluetooth/nimble/ble_periodic_adv/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -53,6 +53,10 @@ start_periodic_adv(void) struct os_mbuf *data; uint8_t instance = 1; ble_addr_t addr; +#if MYNEWT_VAL(BLE_PERIODIC_ADV_ENH) + struct ble_gap_periodic_adv_enable_params eparams; + memset(&eparams, 0, sizeof(eparams)); +#endif /* For periodic we use instance with non-connectable advertising */ memset (¶ms, 0, sizeof(params)); @@ -112,11 +116,22 @@ start_periodic_adv(void) rc = os_mbuf_append(data, periodic_adv_raw_data, sizeof(periodic_adv_raw_data)); assert(rc == 0); +#if MYNEWT_VAL(BLE_PERIODIC_ADV_ENH) + rc = ble_gap_periodic_adv_set_data(instance, data, NULL); +#else rc = ble_gap_periodic_adv_set_data(instance, data); +#endif assert (rc == 0); /* start periodic advertising */ +#if MYNEWT_VAL(BLE_PERIODIC_ADV_ENH) +#if CONFIG_EXAMPLE_PERIODIC_ADV_ENH + eparams.include_adi = 1; +#endif + rc = ble_gap_periodic_adv_start(instance, &eparams); +#else rc = ble_gap_periodic_adv_start(instance); +#endif assert (rc == 0); /* start advertising */ diff --git a/examples/bluetooth/nimble/ble_periodic_sync/main/Kconfig.projbuild b/examples/bluetooth/nimble/ble_periodic_sync/main/Kconfig.projbuild index a42316fffc..f5315592b1 100644 --- a/examples/bluetooth/nimble/ble_periodic_sync/main/Kconfig.projbuild +++ b/examples/bluetooth/nimble/ble_periodic_sync/main/Kconfig.projbuild @@ -8,5 +8,13 @@ menu "Example Configuration" help Use this option to enable extended advertising in the example. If this option is disabled, ensure config BT_NIMBLE_EXT_ADV is - also disabled from Nimble stack menuconfig + also disabled from NimBLE stack menuconfig + + config EXAMPLE_PERIODIC_ADV_ENH + bool + prompt "Enable Periodic Adv Enhancements" + depends on SOC_BLE_50_SUPPORTED && SOC_BLE_PERIODIC_ADV_ENH_SUPPORTED + select BT_NIMBLE_PERIODIC_ADV_ENH + help + Use this option to enable periodic adv enhancements endmenu diff --git a/examples/bluetooth/nimble/ble_periodic_sync/main/main.c b/examples/bluetooth/nimble/ble_periodic_sync/main/main.c index 2f0bbc750f..7587a1615a 100644 --- a/examples/bluetooth/nimble/ble_periodic_sync/main/main.c +++ b/examples/bluetooth/nimble/ble_periodic_sync/main/main.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -122,6 +122,13 @@ periodic_sync_gap_event(struct ble_gap_event *event, void *arg) memcpy(&adv_sid, &disc->sid, sizeof(disc->sid)); params.skip = 10; params.sync_timeout = 1000; + +#if CONFIG_EXAMPLE_PERIODIC_ADV_ENH + /* This way the periodic advertising reports will not be + delivered to host unless the advertising data is changed + or the Data-Id is updated by the advertiser */ + params.filter_duplicates = 1; +#endif rc = ble_gap_periodic_adv_sync_create(&addr, adv_sid, ¶ms, periodic_sync_gap_event, NULL); assert(rc == 0); }