Skip to content

Commit 56f8af9

Browse files
cvinayakAnas Nashif
authored and
Anas Nashif
committed
Bluetooth: controller: Low Duty Cycle Directed Advertising
Added Bluetooth v4.1 Low Duty Cycle Directed Advertising feature. Change-id: I6ca665e298b343200c65405739f3998bc78b84e7 Signed-off-by: Vinayak Chettimada <[email protected]>
1 parent a03e068 commit 56f8af9

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

subsys/bluetooth/controller/hci/hci.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -355,14 +355,11 @@ static void le_set_adv_param(struct net_buf *buf, struct net_buf **evt)
355355
{
356356
struct bt_hci_cp_le_set_adv_param *cmd = (void *)buf->data;
357357
struct bt_hci_evt_cc_status *ccst;
358-
u8_t const c_adv_type[] = {
359-
PDU_ADV_TYPE_ADV_IND, PDU_ADV_TYPE_DIRECT_IND,
360-
PDU_ADV_TYPE_SCAN_IND, PDU_ADV_TYPE_NONCONN_IND };
361358
u16_t min_interval;
362359

363360
min_interval = sys_le16_to_cpu(cmd->min_interval);
364361

365-
ll_adv_params_set(min_interval, c_adv_type[cmd->type],
362+
ll_adv_params_set(min_interval, cmd->type,
366363
cmd->own_addr_type, cmd->direct_addr.type,
367364
&cmd->direct_addr.a.val[0], cmd->channel_map,
368365
cmd->filter_policy);

subsys/bluetooth/controller/ll_sw/ctrl.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -7439,7 +7439,9 @@ u32_t radio_adv_enable(u16_t interval, u8_t chl_map, u8_t filter_policy)
74397439
_radio.advertiser.hdr.ticks_xtal_to_start :
74407440
_radio.advertiser.hdr.ticks_active_to_start;
74417441

7442-
if (pdu_adv->type == PDU_ADV_TYPE_DIRECT_IND) {
7442+
/* High Duty Cycle Directed Advertising if interval is 0. */
7443+
if ((pdu_adv->type == PDU_ADV_TYPE_DIRECT_IND) &&
7444+
!interval) {
74437445
u32_t ticks_now = ticker_ticks_now_get();
74447446

74457447
ret = ticker_start(RADIO_TICKER_INSTANCE_ID_RADIO,

subsys/bluetooth/controller/ll_sw/ll.c

+21-11
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ static struct {
5454

5555
static struct {
5656
u16_t interval;
57-
u8_t adv_type:4;
57+
u8_t pdu_adv_type:4;
5858
u8_t tx_addr:1;
5959
u8_t rx_addr:1;
6060
u8_t filter_policy:2;
@@ -269,6 +269,11 @@ void ll_adv_params_set(u16_t interval, u8_t adv_type,
269269
u8_t const *const direct_addr, u8_t chl_map,
270270
u8_t filter_policy)
271271
{
272+
u8_t const pdu_adv_type[] = {PDU_ADV_TYPE_ADV_IND,
273+
PDU_ADV_TYPE_DIRECT_IND,
274+
PDU_ADV_TYPE_SCAN_IND,
275+
PDU_ADV_TYPE_NONCONN_IND,
276+
PDU_ADV_TYPE_DIRECT_IND};
272277
struct radio_adv_data *radio_adv_data;
273278
struct pdu_adv *pdu;
274279

@@ -281,29 +286,34 @@ void ll_adv_params_set(u16_t interval, u8_t adv_type,
281286
* interface can correctly update adv/scan data in the
282287
* double buffer between caller and controller context.
283288
*/
284-
_ll_adv_params.interval = interval;
289+
/* Set interval for Undirected or Low Duty Cycle Directed Advertising */
290+
if (adv_type != 0x01) {
291+
_ll_adv_params.interval = interval;
292+
} else {
293+
_ll_adv_params.interval = 0;
294+
}
285295
_ll_adv_params.chl_map = chl_map;
286296
_ll_adv_params.filter_policy = filter_policy;
287-
_ll_adv_params.adv_type = adv_type;
297+
_ll_adv_params.pdu_adv_type = pdu_adv_type[adv_type];
288298
_ll_adv_params.tx_addr = own_addr_type;
289299
_ll_adv_params.rx_addr = 0;
290300

291301
/* update the current adv data */
292302
radio_adv_data = radio_adv_data_get();
293303
pdu = (struct pdu_adv *)&radio_adv_data->data[radio_adv_data->last][0];
294-
pdu->type = _ll_adv_params.adv_type;
304+
pdu->type = _ll_adv_params.pdu_adv_type;
295305
pdu->rfu = 0;
296306

297307
if (IS_ENABLED(CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2) &&
298-
((adv_type == PDU_ADV_TYPE_ADV_IND) ||
299-
(adv_type == PDU_ADV_TYPE_DIRECT_IND))) {
308+
((_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_ADV_IND) ||
309+
(_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_DIRECT_IND))) {
300310
pdu->chan_sel = 1;
301311
} else {
302312
pdu->chan_sel = 0;
303313
}
304314

305315
pdu->tx_addr = _ll_adv_params.tx_addr;
306-
if (adv_type == PDU_ADV_TYPE_DIRECT_IND) {
316+
if (_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_DIRECT_IND) {
307317
_ll_adv_params.rx_addr = direct_addr_type;
308318
memcpy(&_ll_adv_params.direct_addr[0], direct_addr,
309319
BDADDR_SIZE);
@@ -351,12 +361,12 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
351361

352362
/* update adv pdu fields. */
353363
pdu = (struct pdu_adv *)&radio_adv_data->data[last][0];
354-
pdu->type = _ll_adv_params.adv_type;
364+
pdu->type = _ll_adv_params.pdu_adv_type;
355365
pdu->rfu = 0;
356366

357367
if (IS_ENABLED(CONFIG_BLUETOOTH_CONTROLLER_CHAN_SEL_2) &&
358-
((_ll_adv_params.adv_type == PDU_ADV_TYPE_ADV_IND) ||
359-
(_ll_adv_params.adv_type == PDU_ADV_TYPE_DIRECT_IND))) {
368+
((_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_ADV_IND) ||
369+
(_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_DIRECT_IND))) {
360370
pdu->chan_sel = 1;
361371
} else {
362372
pdu->chan_sel = 0;
@@ -366,7 +376,7 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
366376
pdu->rx_addr = _ll_adv_params.rx_addr;
367377
memcpy(&pdu->payload.adv_ind.addr[0],
368378
&_ll_adv_params.adv_addr[0], BDADDR_SIZE);
369-
if (_ll_adv_params.adv_type == PDU_ADV_TYPE_DIRECT_IND) {
379+
if (_ll_adv_params.pdu_adv_type == PDU_ADV_TYPE_DIRECT_IND) {
370380
memcpy(&pdu->payload.direct_ind.tgt_addr[0],
371381
&_ll_adv_params.direct_addr[0], BDADDR_SIZE);
372382
pdu->len = sizeof(struct pdu_adv_payload_direct_ind);

0 commit comments

Comments
 (0)