Skip to content

Commit 49255ab

Browse files
committed
samples: Bluetooth: Broadcast multiple legacy and extended advertising
Update broadcaster_multiple sample to start multiple advertising sets of type legacy and extended advertising. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 5115cdd commit 49255ab

File tree

6 files changed

+102
-16
lines changed

6 files changed

+102
-16
lines changed

samples/bluetooth/broadcaster_multiple/prj.conf

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
CONFIG_BT=y
22
CONFIG_BT_BROADCASTER=y
3+
CONFIG_BT_DEVICE_NAME="Broadcaster Multiple"
4+
CONFIG_LOG=y
5+
6+
# Require Bluetooth Advertising Extensions Feature
37
CONFIG_BT_EXT_ADV=y
8+
9+
# Increase to 4 gives one each of legacy, 2M, 1M and Coded PHY advertising sets
410
CONFIG_BT_EXT_ADV_MAX_ADV_SET=2
5-
CONFIG_BT_DEVICE_NAME="Broadcaster Multiple"
611

7-
CONFIG_LOG=y
12+
# Enable Coded PHY support in Zephyr Controller, if testing 4 advertising sets
13+
# CONFIG_BT_CTLR_PHY_CODED=y
814

915
# Zephyr Bluetooth LE Controller will need to use chain PDUs when AD data
1016
# length > 191 bytes
@@ -20,4 +26,6 @@ CONFIG_LOG=y
2026
# number of chain PDUs per advertising set when using Zephyr Bluetooth LE
2127
# Controller
2228
# CONFIG_BT_CTLR_ADVANCED_FEATURES=y
23-
# CONFIG_BT_CTLR_ADV_DATA_BUF_MAX=2
29+
# CONFIG_BT_CTLR_ADV_RESERVE_MAX=n
30+
# CONFIG_BT_CTLR_ADV_DATA_BUF_MAX=6
31+
# CONFIG_BT_CTLR_ADV_DATA_CHAIN=y

samples/bluetooth/broadcaster_multiple/src/broadcaster_multiple.c

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@
5454
*/
5555
static uint8_t mfg_data[BT_MFG_DATA_LEN] = { 0xFF, 0xFF, };
5656

57-
static const struct bt_data ad[] = {
57+
static const struct bt_data ad_long[] = {
5858
BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)),
5959
#if CONFIG_BT_CTLR_ADV_DATA_LEN_MAX > 255
6060
BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)),
6161
#endif
6262
BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1),
6363
};
6464

65+
static const struct bt_data ad_short[] = {
66+
BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1),
67+
};
68+
6569
static struct bt_le_ext_adv *adv[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
6670

6771
int broadcaster_multiple(void)
@@ -78,20 +82,56 @@ int broadcaster_multiple(void)
7882
int err;
7983

8084
for (int index = 0; index < CONFIG_BT_EXT_ADV_MAX_ADV_SET; index++) {
85+
const struct bt_data *ad;
86+
size_t ad_size;
87+
8188
/* Use advertising set instance index as SID */
8289
adv_param.sid = index;
8390

91+
/* Use Coded PHY */
92+
if ((index % 4) == 3) {
93+
adv_param.options = BT_LE_ADV_OPT_EXT_ADV;
94+
adv_param.options |= BT_LE_ADV_OPT_CODED;
95+
ad = ad_long;
96+
ad_size = ARRAY_SIZE(ad_long);
97+
/* Use 1M auxiliary PDU */
98+
} else if ((index % 4) == 2) {
99+
adv_param.options = BT_LE_ADV_OPT_EXT_ADV;
100+
adv_param.options |= BT_LE_ADV_OPT_NO_2M;
101+
ad = ad_long;
102+
ad_size = ARRAY_SIZE(ad_long);
103+
/* Use 2M auxiliary PDU */
104+
} else if ((index % 4) == 1) {
105+
adv_param.options = BT_LE_ADV_OPT_EXT_ADV;
106+
ad = ad_long;
107+
ad_size = ARRAY_SIZE(ad_long);
108+
/* Use 1M legacy PDU */
109+
} else {
110+
adv_param.options = BT_LE_ADV_OPT_NONE;
111+
ad = ad_short;
112+
ad_size = ARRAY_SIZE(ad_short);
113+
}
114+
115+
ext_adv_create_retry:
84116
/* Create a non-connectable advertising set */
85117
err = bt_le_ext_adv_create(&adv_param, NULL, &adv[index]);
86118
if (err) {
87-
printk("Failed to create advertising set %d (err %d)\n",
88-
index, err);
119+
/* Failed creating Coded PHY advertising set? */
120+
if (adv_param.options & BT_LE_ADV_OPT_CODED) {
121+
printk("Failed to create advertising set %d with Coded PHY "
122+
"(err %d), retry without...\n", index, err);
123+
/* Retry with non-Coded PHY advertising set */
124+
adv_param.options &= ~BT_LE_ADV_OPT_CODED;
125+
126+
goto ext_adv_create_retry;
127+
}
128+
129+
printk("Failed to create advertising set %d (err %d)\n", index, err);
89130
return err;
90131
}
91132

92133
/* Set extended advertising data */
93-
err = bt_le_ext_adv_set_data(adv[index], ad, ARRAY_SIZE(ad),
94-
NULL, 0);
134+
err = bt_le_ext_adv_set_data(adv[index], ad, ad_size, NULL, 0);
95135
if (err) {
96136
printk("Failed to set advertising data for set %d "
97137
"(err %d)\n", index, err);

samples/bluetooth/observer/src/observer.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,27 @@ int observer_start(void)
9999
#if defined(CONFIG_BT_EXT_ADV)
100100
bt_le_scan_cb_register(&scan_callbacks);
101101
printk("Registered scan callbacks\n");
102+
103+
scan_param.options |= BT_LE_SCAN_OPT_CODED;
102104
#endif /* CONFIG_BT_EXT_ADV */
103105

106+
scan_start_retry:
104107
err = bt_le_scan_start(&scan_param, device_found);
105108
if (err) {
109+
if (scan_param.options & BT_LE_SCAN_OPT_CODED) {
110+
printk("Failed to start scanning with Coded PHY (err %d), retrying "
111+
"without...\n", err);
112+
113+
scan_param.options &= ~BT_LE_SCAN_OPT_CODED;
114+
115+
goto scan_start_retry;
116+
}
117+
106118
printk("Start scanning failed (err %d)\n", err);
119+
107120
return err;
108121
}
122+
109123
printk("Started scanning...\n");
110124

111125
return 0;

tests/bsim/bluetooth/host/adv/chain/prj.conf

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
CONFIG_BT=y
2+
3+
# Broadcaster
24
CONFIG_BT_BROADCASTER=y
3-
CONFIG_BT_OBSERVER=y
45
CONFIG_BT_EXT_ADV=y
5-
CONFIG_BT_EXT_ADV_MAX_ADV_SET=2
6+
CONFIG_BT_EXT_ADV_MAX_ADV_SET=4
67
CONFIG_BT_DEVICE_NAME="Broadcaster Multiple"
78

89
# Enable Advertising Data chaining in Zephyr Bluetooth LE Controller
910
CONFIG_BT_CTLR_ADVANCED_FEATURES=y
11+
CONFIG_BT_CTLR_ADV_RESERVE_MAX=n
1012
CONFIG_BT_CTLR_ADV_DATA_CHAIN=y
1113

1214
# Zephyr Bluetooth LE Controller will need to use chain PDUs when AD data
@@ -24,17 +26,34 @@ CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=1650
2426
# Controller
2527
CONFIG_BT_CTLR_ADV_DATA_BUF_MAX=2
2628

29+
# Enable Coded PHY
30+
CONFIG_BT_CTLR_PHY_CODED=y
31+
32+
# Observer
33+
CONFIG_BT_OBSERVER=y
34+
CONFIG_BT_EXT_ADV=y
35+
2736
# Maximum Extended Scanning buffer size
2837
CONFIG_BT_EXT_SCAN_BUF_SIZE=1650
2938

30-
# Set maximum scan data length for Extended Scanning in Bluetooth LE Controller
31-
CONFIG_BT_CTLR_SCAN_DATA_LEN_MAX=1650
32-
3339
# The Zephyr Controller does not combine all the 1650 bytes before
3440
# fragmenting into 8 HCI reports, if a PDU has 255 bytes,
3541
# it will generate 2 HCI reports and so we need to reserve 16 buffers
3642
CONFIG_BT_BUF_EVT_RX_COUNT=16
3743

44+
# Set maximum scan data length for Extended Scanning in Bluetooth LE Controller
45+
CONFIG_BT_CTLR_SCAN_DATA_LEN_MAX=1650
46+
3847
# Increase Zephyr Bluetooth LE Controller Rx buffer to receive complete chain
3948
# of PDUs
4049
CONFIG_BT_CTLR_RX_BUFFERS=9
50+
51+
# Enable scanning interleaved extended advertising in Zephyr Bluetooth LE
52+
# Controller
53+
CONFIG_BT_CTLR_ADVANCED_FEATURES=y
54+
CONFIG_BT_CTLR_SCAN_AUX_SET=9
55+
CONFIG_BT_CTLR_LOW_LAT_ULL=y
56+
# CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS=y
57+
# CONFIG_BT_CTLR_SCAN_AUX_CHAIN_COUNT=9
58+
CONFIG_BT_CTLR_SCAN_UNRESERVED=y
59+
# CONFIG_BT_TICKER_EXT_EXPIRE_INFO=y

tests/bsim/bluetooth/host/adv/chain/src/main.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
BT_AD_DATA_MFG_DATA_SIZE + BT_AD_DATA_MFG_DATA_SIZE), \
2828
CONFIG_BT_CTLR_ADV_DATA_LEN_MAX)
2929

30+
/* One less extended advertising set as first one is legacy advertising in the broadcaster_multiple
31+
* sample.
32+
*/
33+
#define BT_EXT_ADV_MAX_ADV_SET (CONFIG_BT_EXT_ADV_MAX_ADV_SET - 1)
34+
3035
static K_SEM_DEFINE(sem_recv, 0, 1);
3136

3237
static void test_adv_main(void)
@@ -76,7 +81,7 @@ static bool data_cb(struct bt_data *data, void *user_data)
7681
static void scan_recv(const struct bt_le_scan_recv_info *info,
7782
struct net_buf_simple *buf)
7883
{
79-
static uint8_t sid[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
84+
static uint8_t sid[BT_EXT_ADV_MAX_ADV_SET];
8085
static uint8_t sid_count;
8186
char name[NAME_LEN];
8287
uint8_t data_status;
@@ -110,7 +115,7 @@ static void scan_recv(const struct bt_le_scan_recv_info *info,
110115

111116
sid[sid_count++] = info->sid;
112117

113-
if (sid_count < CONFIG_BT_EXT_ADV_MAX_ADV_SET) {
118+
if (sid_count < BT_EXT_ADV_MAX_ADV_SET) {
114119
printk("Received advertising sets: %d\n", sid_count);
115120
return;
116121
}

tests/bsim/bluetooth/host/adv/chain/tests_scripts/adv_chain.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_host_adv_chain_prj_conf\
1818
-v=${verbosity_level} -s=${simulation_id} -d=1 -testid=scan
1919

2020
Execute ./bs_2G4_phy_v1 -v=${verbosity_level} -s=${simulation_id} \
21-
-D=2 -sim_length=10e6 $@
21+
-D=2 -sim_length=11e6 $@
2222

2323
wait_for_background_jobs

0 commit comments

Comments
 (0)