feat(ble/bluedroid): add Frame Space Update host support (Core 6.0)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zhiweijian
2026-06-24 16:52:45 +08:00
co-authored by Cursor
parent e20d3f0197
commit 5372ce03a3
20 changed files with 421 additions and 7 deletions
@@ -1378,6 +1378,55 @@ tBTM_STATUS BTM_BleSetDecisionInstructions(UINT8 num_tests, const UINT8 *test_fl
}
#endif // #if (BLE_FEAT_DBAF == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
tBTM_STATUS BTM_BleFrameSpaceUpdate(UINT16 conn_handle, UINT16 frame_space_min,
UINT16 frame_space_max, UINT8 phys, UINT16 spacing_types)
{
tHCI_STATUS err;
err = btsnd_hcic_ble_frame_space_update(conn_handle, frame_space_min, frame_space_max,
phys, spacing_types);
if (err != HCI_SUCCESS) {
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
cb_params.frame_space_update.status = BTM_HCI_ERROR | err;
cb_params.frame_space_update.conn_handle = conn_handle;
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_FRAME_SPACE_UPDATE_COMPLETE_EVT, &cb_params);
return BTM_NO_RESOURCES;
}
return BTM_CMD_STARTED;
}
void btm_frame_space_update_cmd_status(UINT8 status, UINT16 conn_handle)
{
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
if (status == HCI_SUCCESS) {
return;
}
cb_params.frame_space_update.status = status | BTM_HCI_ERROR;
cb_params.frame_space_update.conn_handle = conn_handle;
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_FRAME_SPACE_UPDATE_COMPLETE_EVT, &cb_params);
}
void btm_ble_frame_space_update_complete_evt(UINT8 *p)
{
tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
STREAM_TO_UINT8(cb_params.frame_space_update.status, p);
STREAM_TO_UINT16(cb_params.frame_space_update.conn_handle, p);
STREAM_TO_UINT8(cb_params.frame_space_update.initiator, p);
STREAM_TO_UINT16(cb_params.frame_space_update.frame_space, p);
STREAM_TO_UINT8(cb_params.frame_space_update.phys, p);
STREAM_TO_UINT16(cb_params.frame_space_update.spacing_types, p);
if (cb_params.frame_space_update.status != HCI_SUCCESS) {
cb_params.frame_space_update.status |= BTM_HCI_ERROR;
}
BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_FRAME_SPACE_UPDATE_COMPLETE_EVT, &cb_params);
}
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
@@ -592,6 +592,9 @@ void btm_ble_transmit_power_report_evt(tBTM_BLE_TRANS_POWER_REPORT_EVT *params);
#if (BLE_FEAT_CONN_SUBRATING == TRUE)
void btm_ble_subrate_change_evt(tBTM_BLE_SUBRATE_CHANGE_EVT *params);
#endif // #if (BLE_FEAT_CONN_SUBRATING == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
void btm_ble_frame_space_update_complete_evt(UINT8 *p);
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
void btm_ble_pa_subevt_data_req_evt(tBTM_BLE_PA_SUBEVT_DATA_REQ_EVT *params);
void btm_ble_pa_rsp_rpt_evt(tBTM_BLE_PA_RSP_REPORT_EVT *params);
@@ -1201,6 +1201,9 @@ void btm_read_remote_trans_pwr_level_cmpl(UINT8 status);
void btm_subrate_req_cmd_status(UINT8 status);
#endif // #if (BLE_FEAT_CONN_SUBRATING == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
void btm_frame_space_update_cmd_status(UINT8 status, UINT16 conn_handle);
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BT_BLE_FEAT_CHANNEL_SOUNDING == TRUE)
void btm_ble_cs_read_local_supp_caps_cmpl_evt(UINT8 *p);
@@ -174,6 +174,18 @@ static void btu_ble_ext_adv_report_evt(UINT8 *p, UINT16 evt_len);
#if (BLE_FEAT_ADV_MONITOR == TRUE)
static void btu_ble_monitor_adv_report_evt(UINT8 *p);
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_LL_EXT_FEAT == TRUE)
static void btu_ble_read_all_remote_feat_complete_evt(UINT8 *p);
#endif // #if (BLE_FEAT_LL_EXT_FEAT == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
static void btu_ble_frame_space_update_complete_evt(UINT8 *p);
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BLE_FEAT_LE_UTP == TRUE)
static void btu_ble_utp_receive_evt(UINT8 *p, UINT16 evt_len);
#endif // #if (BLE_FEAT_LE_UTP == TRUE)
#if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
static void btu_ble_conn_rate_change_evt(UINT8 *p);
#endif // #if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
#if (BLE_50_EXTEND_SYNC_EN == TRUE)
static void btu_ble_periodic_adv_sync_establish_evt(UINT8 *p, bool v2_evt);
static void btu_ble_periodic_adv_report_evt(UINT8 *p, UINT8 evt_len, bool v2_evt);
@@ -560,6 +572,16 @@ void btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg)
btu_ble_monitor_adv_report_evt(p);
break;
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_LL_EXT_FEAT == TRUE)
case HCI_BLE_READ_ALL_REMOTE_FEAT_COMPLETE_EVT:
btu_ble_read_all_remote_feat_complete_evt(p);
break;
#endif // #if (BLE_FEAT_LL_EXT_FEAT == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
case HCI_BLE_FRAME_SPACE_UPDATE_COMPLETE_EVT:
btu_ble_frame_space_update_complete_evt(p);
break;
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
case HCI_BLE_PERIOD_ADV_SYNC_TRANS_RECV_EVT:
btu_ble_periodic_adv_sync_trans_recv(p);
@@ -629,6 +651,16 @@ void btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg)
btu_ble_subrate_change_evt(p);
break;
#endif // #if (BLE_FEAT_CONN_SUBRATING == TRUE)
#if (BLE_FEAT_LE_UTP == TRUE)
case HCI_BLE_UTP_RECEIVE_EVT:
btu_ble_utp_receive_evt(p, hci_evt_len);
break;
#endif // #if (BLE_FEAT_LE_UTP == TRUE)
#if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
case HCI_BLE_CONN_RATE_CHANGE_EVT:
btu_ble_conn_rate_change_evt(p);
break;
#endif // #if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
case HCI_BLE_PA_SUBEVT_DATA_REQUEST_EVT:
btu_ble_pa_subevt_data_request_evt(p);
@@ -1483,6 +1515,16 @@ static void btu_hcif_hdl_command_complete (UINT16 opcode, UINT8 *p, UINT16 evt_l
btm_ble_read_monitor_adv_list_size_complete(p);
break;
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_LL_EXT_FEAT == TRUE)
case HCI_BLE_READ_ALL_LOCAL_SUPP_FEATURES:
btm_ble_read_all_local_supp_features_complete(p);
break;
#endif // #if (BLE_FEAT_LL_EXT_FEAT == TRUE)
#if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
case HCI_BLE_READ_MIN_SUPP_CONN_INTERVAL:
btm_ble_read_min_supp_conn_interval_complete(p);
break;
#endif // #if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
#endif /* (BLE_INCLUDED == TRUE) */
default: {
@@ -1652,6 +1694,18 @@ static void btu_hcif_hdl_command_status (UINT16 opcode, UINT8 status, UINT8 *p_c
btm_subrate_req_cmd_status(status);
break;
#endif // #if (BLE_FEAT_CONN_SUBRATING == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
case HCI_BLE_FRAME_SPACE_UPDATE:
{
UINT16 conn_handle = HCI_INVALID_HANDLE;
if (p_cmd != NULL) {
p_cmd++; /* skip param length */
STREAM_TO_UINT16(conn_handle, p_cmd);
}
btm_frame_space_update_cmd_status(status, conn_handle);
break;
}
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BT_BLE_FEAT_CHANNEL_SOUNDING == TRUE)
case HCI_BLE_CS_READ_REMOTE_SUPP_CAPS:
btm_ble_cs_read_remote_supp_caps_cmd_status(status);
@@ -2661,7 +2715,19 @@ static void btu_ble_monitor_adv_report_evt(UINT8 *p)
}
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_LL_EXT_FEAT == TRUE)
static void btu_ble_read_all_remote_feat_complete_evt(UINT8 *p)
{
btm_ble_read_all_remote_features_complete_evt(p);
}
#endif // #if (BLE_FEAT_LL_EXT_FEAT == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
static void btu_ble_frame_space_update_complete_evt(UINT8 *p)
{
btm_ble_frame_space_update_complete_evt(p);
}
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BLE_50_EXTEND_SYNC_EN == TRUE)
static void btu_ble_periodic_adv_sync_establish_evt(UINT8 *p, bool v2_evt)
@@ -3337,7 +3403,39 @@ static void btu_ble_subrate_change_evt(UINT8 *p)
}
#endif // #if (BLE_FEAT_CONN_SUBRATING == TRUE)
#if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
static void btu_ble_conn_rate_change_evt(UINT8 *p)
{
tBTM_BLE_CONN_RATE_CHANGE conn_rate_change = {0};
if (!p) {
HCI_TRACE_ERROR("%s, Invalid params.", __func__);
return;
}
STREAM_TO_UINT8(conn_rate_change.status, p);
STREAM_TO_UINT16(conn_rate_change.conn_handle, p);
STREAM_TO_UINT16(conn_rate_change.conn_interval, p);
STREAM_TO_UINT16(conn_rate_change.subrate_factor, p);
STREAM_TO_UINT16(conn_rate_change.peripheral_latency, p);
STREAM_TO_UINT16(conn_rate_change.continuation_number, p);
STREAM_TO_UINT16(conn_rate_change.supervision_timeout, p);
btm_ble_conn_rate_change_evt(&conn_rate_change);
}
#endif // #if (BLE_FEAT_SHORTER_CONN_INTERVALS == TRUE)
#if (BLE_FEAT_LE_UTP == TRUE)
static void btu_ble_utp_receive_evt(UINT8 *p, UINT16 evt_len)
{
if (!p || evt_len < 1) {
HCI_TRACE_ERROR("%s, Invalid params.", __func__);
return;
}
btm_ble_utp_receive_evt(p, evt_len);
}
#endif // #if (BLE_FEAT_LE_UTP == TRUE)
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
static void btu_ble_pa_subevt_data_request_evt(UINT8 *p)
@@ -3123,6 +3123,27 @@ UINT8 btsnd_hcic_ble_set_decision_instructions(UINT8 num_tests, const UINT8 *tes
}
#endif // #if (BLE_FEAT_DBAF == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
UINT8 btsnd_hcic_ble_frame_space_update(UINT16 conn_handle, UINT16 frame_space_min,
UINT16 frame_space_max, UINT8 phys, UINT16 spacing_types)
{
BT_HDR *p;
UINT8 *pp;
HCIC_BLE_CMD_CREATED_U8(p, pp, HCIC_PARAM_SIZE_FRAME_SPACE_UPDATE);
UINT16_TO_STREAM(pp, HCI_BLE_FRAME_SPACE_UPDATE);
UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_FRAME_SPACE_UPDATE);
UINT16_TO_STREAM(pp, conn_handle);
UINT16_TO_STREAM(pp, frame_space_min);
UINT16_TO_STREAM(pp, frame_space_max);
UINT8_TO_STREAM(pp, phys);
UINT16_TO_STREAM(pp, spacing_types);
btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
return HCI_SUCCESS;
}
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
@@ -978,6 +978,9 @@ typedef void (tBTM_UPDATE_DUPLICATE_EXCEPTIONAL_LIST_CMPL_CBACK) (tBTM_STATUS st
#define BTM_BLE_5_GAP_READ_MONITOR_ADV_LIST_SIZE_COMPLETE_EVT 74
#define BTM_BLE_5_GAP_ENABLE_MONITOR_ADV_COMPLETE_EVT 75
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#define BTM_BLE_5_GAP_FRAME_SPACE_UPDATE_COMPLETE_EVT 78
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BLE_FEAT_DBAF == TRUE)
#define BTM_BLE_5_GAP_SET_DECISION_DATA_COMPLETE_EVT 79
#define BTM_BLE_5_GAP_SET_DECISION_INSTRUCTIONS_COMPLETE_EVT 80
@@ -1233,6 +1236,16 @@ typedef struct {
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
typedef struct {
tBTM_STATUS status;
UINT16 conn_handle;
UINT8 initiator;
UINT16 frame_space;
UINT8 phys;
UINT16 spacing_types;
} tBTM_BLE_FRAME_SPACE_UPDATE;
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
@@ -1946,6 +1959,9 @@ typedef union {
tBTM_BLE_MONITOR_ADV_REPORT monitor_adv_report;
tBTM_BLE_MONITOR_ADV_LIST_SIZE monitor_adv_list_size;
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
tBTM_BLE_FRAME_SPACE_UPDATE frame_space_update;
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
} tBTM_BLE_5_GAP_CB_PARAMS;
typedef struct {
@@ -3097,10 +3113,13 @@ tBTM_STATUS BTM_BleEnableMonitorAdv(UINT8 enable);
tBTM_STATUS BTM_BleSetDecisionData(UINT8 adv_handle, UINT8 decision_type_flags,
UINT8 data_len, const UINT8 *p_data);
tBTM_STATUS BTM_BleSetDecisionInstructions(UINT8 num_tests, const UINT8 *test_flags,
const UINT8 *test_fields, UINT8 test_params_len,
const UINT8 *test_params);
const UINT8 *test_fields, const UINT8 *test_params);
#endif // #if (BLE_FEAT_DBAF == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
tBTM_STATUS BTM_BleFrameSpaceUpdate(UINT16 conn_handle, UINT16 frame_space_min,
UINT16 frame_space_max, UINT8 phys, UINT16 spacing_types);
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
@@ -439,6 +439,9 @@
#define HCI_BLE_ENABLE_MONITOR_ADV (0x009C | HCI_GRP_BLE_CMDS)
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#define HCI_BLE_FRAME_SPACE_UPDATE (0x009D | HCI_GRP_BLE_CMDS)
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#if (BLE_FEAT_POWER_CONTROL_EN == TRUE)
#define HCI_BLE_ENH_READ_TRANS_POWER_LEVEL (0x0076 | HCI_GRP_BLE_CMDS)
@@ -985,6 +988,9 @@
#define HCI_BLE_MONITOR_ADV_REPORT_EVT 0x34
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#define HCI_BLE_FRAME_SPACE_UPDATE_COMPLETE_EVT 0x35
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
@@ -832,15 +832,22 @@ UINT8 btsnd_hcic_ble_enable_monitor_adv(UINT8 enable);
#define HCIC_PARAM_SIZE_SET_DECISION_INSTRUCTIONS_MAX 251
#define BLE_DECISION_DATA_MAX_LEN 248
#define BLE_DECISION_MAX_TESTS 8
#define BLE_DECISION_TEST_PARAMS_MAX_LEN 229
#define BLE_DECISION_TEST_PARAM_LEN 16
#define BLE_DECISION_TEST_PARAMS_MAX_LEN (BLE_DECISION_MAX_TESTS * BLE_DECISION_TEST_PARAM_LEN)
#define HCIC_PARAM_SIZE_SET_DECISION_INSTRUCTIONS(n) (HCIC_PARAM_SIZE_SET_DECISION_INSTRUCTIONS_HDR + (n) * 18)
UINT8 btsnd_hcic_ble_set_decision_data(UINT8 adv_handle, UINT8 decision_type_flags,
UINT8 data_len, const UINT8 *p_data);
UINT8 btsnd_hcic_ble_set_decision_instructions(UINT8 num_tests, const UINT8 *test_flags,
const UINT8 *test_fields, UINT8 test_params_len,
const UINT8 *test_params);
const UINT8 *test_fields, const UINT8 *test_params);
#endif // #if (BLE_FEAT_DBAF == TRUE)
#if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)
#define HCIC_PARAM_SIZE_FRAME_SPACE_UPDATE 9
UINT8 btsnd_hcic_ble_frame_space_update(UINT16 conn_handle, UINT16 frame_space_min,
UINT16 frame_space_max, UINT8 phys, UINT16 spacing_types);
#endif // #if (BLE_FEAT_FRAME_SPACE_UPDATE == TRUE)