mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-09-19 07:29:54 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user