nimble/ll: Initial support for ISO Broadcasting state

This adds initial support for ISO Broadcasting state:
- all valid combinations of BIG/BIS parameters should be supported,
- encryption is supported,
- BIG control procedures are supported,
- no LE Create BIG command (only LE Create BIG Test).

HCI and ISOAL support coming soon.
This commit is contained in:
Andrzej Kaczmarek
2023-06-09 09:49:11 +02:00
parent d56bd9dee7
commit 6d02d3406a
8 changed files with 1241 additions and 11 deletions
@@ -240,6 +240,9 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
#if MYNEWT_VAL(BLE_LL_EXT)
#define BLE_LL_STATE_EXTERNAL (8)
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
#define BLE_LL_STATE_BIG (9)
#endif
/* LL Features */
#define BLE_LL_FEAT_LE_ENCRYPTION (0x0000000001)
@@ -301,6 +304,7 @@ extern STATS_SECT_DECL(ble_ll_stats) ble_ll_stats;
/* LL timing */
#define BLE_LL_IFS (150) /* usecs */
#define BLE_LL_MAFS (300) /* usecs */
#define BLE_LL_MSS (150) /* usecs */
/*
* BLE LL device address. Note that element 0 of the array is the LSB and
@@ -0,0 +1,47 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef H_BLE_LL_ISO_BIG_
#define H_BLE_LL_ISO_BIG_
#ifdef __cplusplus
extern "C" {
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
void ble_ll_iso_big_chan_map_update(void);
void ble_ll_iso_big_halt(void);
int ble_ll_iso_big_hci_create(const uint8_t *cmdbuf, uint8_t len);
int ble_ll_iso_big_hci_create_test(const uint8_t *cmdbuf, uint8_t len);
int ble_ll_iso_big_hci_terminate(const uint8_t *cmdbuf, uint8_t len);
void ble_ll_iso_big_hci_evt_complete(void);
void ble_ll_iso_big_init(void);
void ble_ll_iso_big_reset(void);
#endif /* BLE_LL_ISO_BROADCASTER */
#ifdef __cplusplus
}
#endif
#endif /* H_BLE_LL_ISO_BIG_ */
@@ -70,6 +70,7 @@ extern uint8_t g_ble_ll_sched_offset_ticks;
#define BLE_LL_SCHED_TYPE_PERIODIC (6)
#define BLE_LL_SCHED_TYPE_SYNC (7)
#define BLE_LL_SCHED_TYPE_SCAN_AUX (8)
#define BLE_LL_SCHED_TYPE_BIG (9)
#if MYNEWT_VAL(BLE_LL_EXT)
#define BLE_LL_SCHED_TYPE_EXTERNAL (255)
#endif
@@ -222,6 +223,10 @@ uint32_t ble_ll_sched_css_get_conn_interval_us(void);
#endif
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
int ble_ll_sched_iso_big(struct ble_ll_sched_item *sch, int first);
#endif /* BLE_LL_ISO_BROADCASTER */
#ifdef __cplusplus
}
#endif
+13 -1
View File
@@ -46,6 +46,7 @@
#include "controller/ble_ll_trace.h"
#include "controller/ble_ll_sync.h"
#include "controller/ble_fem.h"
#include "controller/ble_ll_iso_big.h"
#if MYNEWT_VAL(BLE_LL_EXT)
#include "controller/ble_ll_ext.h"
#endif
@@ -1678,6 +1679,10 @@ ble_ll_reset(void)
ble_fem_lna_init();
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
ble_ll_iso_big_reset();
#endif
/* Re-initialize the PHY */
rc = ble_phy_init();
@@ -1913,8 +1918,11 @@ ble_ll_init(void)
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ISO)
features |= BLE_LL_FEAT_CIS_CENTRAL;
features |= BLE_LL_FEAT_CIS_PERIPH;
features |= BLE_LL_FEAT_CIS_HOST;
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
features |= BLE_LL_FEAT_ISO_BROADCASTER;
features |= BLE_LL_FEAT_ISO_HOST_SUPPORT;
#endif
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE)
@@ -1942,6 +1950,10 @@ ble_ll_init(void)
ble_ll_hci_vs_init();
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
ble_ll_iso_big_init();
#endif
#if MYNEWT_VAL(BLE_LL_EXT)
ble_ll_ext_init();
#endif
+27 -10
View File
@@ -35,6 +35,7 @@
#include "controller/ble_ll_sync.h"
#include <controller/ble_ll_utils.h>
#include "controller/ble_ll_iso.h"
#include "controller/ble_ll_iso_big.h"
#include "ble_ll_priv.h"
#include "ble_ll_conn_priv.h"
#include "ble_ll_hci_priv.h"
@@ -338,7 +339,7 @@ ble_ll_hci_le_read_bufsize(uint8_t *rspbuf, uint8_t *rsplen)
return BLE_ERR_SUCCESS;
}
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ISO)
#if MYNEWT_VAL(BLE_LL_ISO)
/**
* HCI read buffer size v2 command. Returns the ACL and ISO data packet length and
* num data packets.
@@ -355,8 +356,9 @@ ble_ll_hci_le_read_bufsize_v2(uint8_t *rspbuf, uint8_t *rsplen)
rp->data_len = htole16(g_ble_ll_data.ll_acl_pkt_size);
rp->data_packets = g_ble_ll_data.ll_num_acl_pkts;
rp->iso_data_len = 0;
rp->iso_data_packets = 0;
/* XXX for testing only */
rp->iso_data_len = 512;
rp->iso_data_packets = 10;
*rsplen = sizeof(*rp);
return BLE_ERR_SUCCESS;
@@ -661,6 +663,11 @@ ble_ll_hci_le_cmd_send_cmd_status(uint16_t ocf)
case BLE_HCI_OCF_LE_GEN_DHKEY:
case BLE_HCI_OCF_LE_SET_PHY:
case BLE_HCI_OCF_LE_PERIODIC_ADV_CREATE_SYNC:
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
case BLE_HCI_OCF_LE_CREATE_BIG:
case BLE_HCI_OCF_LE_CREATE_BIG_TEST:
case BLE_HCI_OCF_LE_TERMINATE_BIG:
#endif
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_SCA_UPDATE)
case BLE_HCI_OCF_LE_REQ_PEER_SCA:
#endif
@@ -862,6 +869,9 @@ ble_ll_hci_le_set_host_chan_class(const uint8_t *cmdbuf, uint8_t len)
g_ble_ll_data.chan_map_used = chan_map_used;
ble_ll_conn_chan_map_update();
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
ble_ll_iso_big_chan_map_update();
#endif
return BLE_ERR_SUCCESS;
}
@@ -1254,6 +1264,17 @@ ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
rc = ble_ll_set_default_sync_transfer_params(cmdbuf, len);
break;
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
case BLE_HCI_OCF_LE_CREATE_BIG:
rc = ble_ll_iso_big_hci_create(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CREATE_BIG_TEST:
rc = ble_ll_iso_big_hci_create_test(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_TERMINATE_BIG:
rc = ble_ll_iso_big_hci_terminate(cmdbuf, len);
break;
#endif /* BLE_LL_ISO_BROADCASTER */
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ISO)
case BLE_HCI_OCF_LE_READ_ISO_TX_SYNC:
rc = ble_ll_iso_read_tx_sync(cmdbuf, len);
@@ -1273,12 +1294,6 @@ ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
case BLE_HCI_OCF_LE_REJECT_CIS_REQ:
rc = ble_ll_iso_reject_cis_req(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_CREATE_BIG:
rc = ble_ll_iso_create_big(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_TERMINATE_BIG:
rc = ble_ll_iso_terminate_big(cmdbuf, len);
break;
case BLE_HCI_OCF_LE_BIG_CREATE_SYNC:
rc = ble_ll_iso_big_create_sync(cmdbuf, len);
break;
@@ -1291,12 +1306,14 @@ ble_ll_hci_le_cmd_proc(const uint8_t *cmdbuf, uint8_t len, uint16_t ocf,
case BLE_HCI_OCF_LE_REMOVE_ISO_DATA_PATH:
rc = ble_ll_iso_remove_iso_data_path(cmdbuf, len);
break;
#endif
#if MYNEWT_VAL(BLE_LL_ISO)
case BLE_HCI_OCF_LE_RD_BUF_SIZE_V2:
if (len == 0) {
rc = ble_ll_hci_le_read_bufsize_v2(rspbuf, rsplen);
}
break;
#endif
#endif /* BLE_LL_ISO */
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ISO_TEST)
case BLE_HCI_OCF_LE_SET_CIG_PARAM_TEST:
rc = ble_ll_iso_set_cig_param_test(cmdbuf, len, rspbuf, rsplen);
File diff suppressed because it is too large Load Diff
+36
View File
@@ -32,6 +32,7 @@
#include "controller/ble_ll_trace.h"
#include "controller/ble_ll_tmr.h"
#include "controller/ble_ll_sync.h"
#include "controller/ble_ll_iso_big.h"
#if MYNEWT_VAL(BLE_LL_EXT)
#include "controller/ble_ll_ext.h"
#endif
@@ -171,6 +172,12 @@ ble_ll_sched_preempt(struct ble_ll_sched_item *sch,
#endif
#endif
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
case BLE_LL_SCHED_TYPE_BIG:
/* FIXME sometimes it may be useful to preempt... */
BLE_LL_ASSERT(0);
break;
#endif
#if MYNEWT_VAL(BLE_LL_EXT)
case BLE_LL_SCHED_TYPE_EXTERNAL:
ble_ll_ext_sched_removed(entry);
@@ -883,6 +890,30 @@ ble_ll_sched_adv_resched_pdu(struct ble_ll_sched_item *sch)
return rc;
}
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
int
ble_ll_sched_iso_big(struct ble_ll_sched_item *sch, int first)
{
os_sr_t sr;
int rc;
OS_ENTER_CRITICAL(sr);
if (first) {
rc = ble_ll_sched_insert(sch, BLE_LL_SCHED_MAX_DELAY_ANY, preempt_none);
} else {
/* XXX provide better strategy for preemption */
rc = ble_ll_sched_insert(sch, 0, preempt_any);
}
OS_EXIT_CRITICAL(sr);
ble_ll_sched_restart();
return rc;
}
#endif /* BLE_LL_ISO_BROADCASTER */
/**
* Remove a schedule element
*
@@ -1023,6 +1054,11 @@ ble_ll_sched_execute_item(struct ble_ll_sched_item *sch)
ble_ll_conn_event_halt();
break;
#endif
#if MYNEWT_VAL(BLE_LL_ISO_BROADCASTER)
case BLE_LL_STATE_BIG:
ble_ll_iso_big_halt();
break;
#endif
#if MYNEWT_VAL(BLE_LL_EXT)
case BLE_LL_STATE_EXTERNAL:
ble_ll_ext_halt();
+17
View File
@@ -472,6 +472,23 @@ syscfg.defs:
Enable support for runtime antenna selection in FEM.
value: 0
BLE_LL_ISO:
description: >
Enable support for isochronous data.
This enables common code (e.g. ISOAL) for all types of isochronous
data, particular ISO features have to be enabled separately.
restrictions:
- (BLE_VERSION >= 52) if 1
value: 0
state: experimental
BLE_LL_ISO_BROADCASTER:
description: >
Enable support for Isochronous Broadcasting state.
restrictions:
- BLE_LL_ISO if 1
value: 0
state: experimental
BLE_LL_SYSINIT_STAGE:
description: >
Sysinit stage for the NimBLE controller.