fix(ble/bluedroid): Fixed BLE no data length change event

This commit is contained in:
zhanghaipeng 2024-04-30 14:38:33 +08:00
parent c0e0af03d1
commit 818644cf5a
8 changed files with 46 additions and 16 deletions

View File

@ -2363,6 +2363,7 @@ void btc_gap_ble_call_handler(btc_msg_t *msg)
//register connection parameter update callback //register connection parameter update callback
void btc_gap_callback_init(void) void btc_gap_callback_init(void)
{ {
BTM_BleRegiseterPktLengthChangeCallback(btc_set_pkt_length_callback);
BTM_BleRegiseterConnParamCallback(btc_update_conn_param_callback); BTM_BleRegiseterConnParamCallback(btc_update_conn_param_callback);
#if (BLE_50_FEATURE_SUPPORT == TRUE) #if (BLE_50_FEATURE_SUPPORT == TRUE)
BTM_BleGapRegisterCallback(btc_ble_5_gap_callback); BTM_BleGapRegisterCallback(btc_ble_5_gap_callback);

View File

@ -312,6 +312,20 @@ void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn
conn_param_update_cb.update_conn_param_cb = update_conn_param_cb; conn_param_update_cb.update_conn_param_cb = update_conn_param_cb;
} }
/*******************************************************************************
**
** Function BTM_BleRegiseterPktLengthChangeCallback
**
** Description Registers a callback function for packet length changes.
**
** Returns void
**
*******************************************************************************/
void BTM_BleRegiseterPktLengthChangeCallback(tBTM_SET_PKT_DATA_LENGTH_CBACK *ptk_len_chane_cb)
{
conn_param_update_cb.set_pkt_data_length_cb = ptk_len_chane_cb;
}
/******************************************************************************* /*******************************************************************************
** **
** Function BTM_BleUpdateAdvWhitelist ** Function BTM_BleUpdateAdvWhitelist

View File

@ -959,6 +959,8 @@ typedef struct {
typedef struct{ typedef struct{
//connection parameters update callback //connection parameters update callback
tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb; tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb;
// setting packet data length callback
tBTM_SET_PKT_DATA_LENGTH_CBACK *set_pkt_data_length_cb;
}tBTM_CallbackFunc; }tBTM_CallbackFunc;
extern tBTM_CallbackFunc conn_param_update_cb; extern tBTM_CallbackFunc conn_param_update_cb;

View File

@ -1466,7 +1466,6 @@ static void btu_hcif_command_status_evt(uint8_t status, BT_HDR *command, void *c
hack->context = context; hack->context = context;
event->event = BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK; event->event = BTU_POST_TO_TASK_NO_GOOD_HORRIBLE_HACK;
if (btu_task_post(SIG_BTU_HCI_MSG, event, OSI_THREAD_MAX_TIMEOUT) == false) { if (btu_task_post(SIG_BTU_HCI_MSG, event, OSI_THREAD_MAX_TIMEOUT) == false) {
osi_free(event); osi_free(event);
} }

View File

@ -1365,6 +1365,7 @@ extern "C" {
** **
*******************************************************************************/ *******************************************************************************/
void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb); void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb);
void BTM_BleRegiseterPktLengthChangeCallback(tBTM_SET_PKT_DATA_LENGTH_CBACK *ptk_len_chane_cb);
/******************************************************************************* /*******************************************************************************
** **

View File

@ -287,7 +287,7 @@ UINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr)
** **
** Function l2cble_notify_le_connection ** Function l2cble_notify_le_connection
** **
** Description This function notifiy the l2cap connection to the app layer ** Description This function notify the l2cap connection to the app layer
** **
** Returns none ** Returns none
** **
@ -868,7 +868,7 @@ void l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len)
** **
** Function l2cble_init_direct_conn ** Function l2cble_init_direct_conn
** **
** Description This function is to initate a direct connection ** Description This function is to initiate a direct connection
** **
** Returns TRUE connection initiated, FALSE otherwise. ** Returns TRUE connection initiated, FALSE otherwise.
** **
@ -894,7 +894,7 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
/* There can be only one BLE connection request outstanding at a time */ /* There can be only one BLE connection request outstanding at a time */
if (p_dev_rec == NULL) { if (p_dev_rec == NULL) {
L2CAP_TRACE_WARNING ("unknown device, can not initate connection"); L2CAP_TRACE_WARNING ("unknown device, can not initiate connection");
return (FALSE); return (FALSE);
} }
@ -947,7 +947,7 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) { if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) {
l2cu_release_lcb (p_lcb); l2cu_release_lcb (p_lcb);
L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation"); L2CAP_TRACE_ERROR("initiate direct connection fail, topology limitation");
return FALSE; return FALSE;
} }
uint32_t link_timeout = L2CAP_BLE_LINK_CONNECT_TOUT; uint32_t link_timeout = L2CAP_BLE_LINK_CONNECT_TOUT;
@ -981,7 +981,7 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
BLE_CE_LEN_MIN, /* UINT16 min_len */ BLE_CE_LEN_MIN, /* UINT16 min_len */
BLE_CE_LEN_MIN)) { /* UINT16 max_len */ BLE_CE_LEN_MIN)) { /* UINT16 max_len */
l2cu_release_lcb (p_lcb); l2cu_release_lcb (p_lcb);
L2CAP_TRACE_ERROR("initate direct connection fail, no resources"); L2CAP_TRACE_ERROR("initiate direct connection fail, no resources");
return (FALSE); return (FALSE);
} else { } else {
p_lcb->link_state = LST_CONNECTING; p_lcb->link_state = LST_CONNECTING;
@ -1033,7 +1033,7 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
btm_ble_set_conn_st (BLE_DIR_CONN); btm_ble_set_conn_st (BLE_DIR_CONN);
if(!btsnd_hcic_ble_create_ext_conn(&aux_conn)) { if(!btsnd_hcic_ble_create_ext_conn(&aux_conn)) {
l2cu_release_lcb (p_lcb); l2cu_release_lcb (p_lcb);
L2CAP_TRACE_ERROR("initate Aux connection failed, no resources"); L2CAP_TRACE_ERROR("initiate Aux connection failed, no resources");
} }
#else #else
L2CAP_TRACE_ERROR("BLE 5.0 not support!\n"); L2CAP_TRACE_ERROR("BLE 5.0 not support!\n");
@ -1324,15 +1324,18 @@ void l2cble_process_data_length_change_event(UINT16 handle, UINT16 tx_data_len,
if(p_acl) { if(p_acl) {
p_acl->data_length_params = data_length_params; p_acl->data_length_params = data_length_params;
if (p_acl->p_set_pkt_data_cback) { if (p_acl->p_set_pkt_data_cback) {
// Only when the corresponding API is called will the callback be registered
(*p_acl->p_set_pkt_data_cback)(BTM_SUCCESS, &data_length_params); (*p_acl->p_set_pkt_data_cback)(BTM_SUCCESS, &data_length_params);
} else {
// If the callback is not registered,using global callback
(*conn_param_update_cb.set_pkt_data_length_cb)(BTM_SUCCESS, &data_length_params);
} }
p_acl->data_len_updating = false; p_acl->data_len_updating = false;
if(p_acl->data_len_waiting) { if(p_acl->data_len_waiting) {
p_acl->data_len_waiting = false; p_acl->data_len_waiting = false;
p_acl->p_set_pkt_data_cback = p_acl->p_set_data_len_cback_waiting; p_acl->p_set_pkt_data_cback = p_acl->p_set_data_len_cback_waiting;
p_acl->p_set_data_len_cback_waiting = NULL; p_acl->p_set_data_len_cback_waiting = NULL;
// if value is same, triger callback directly // if value is same, trigger callback directly
if(p_acl->tx_len_waiting == p_acl->data_length_params.tx_len) { if(p_acl->tx_len_waiting == p_acl->data_length_params.tx_len) {
if(p_acl->p_set_pkt_data_cback) { if(p_acl->p_set_pkt_data_cback) {
(*p_acl->p_set_pkt_data_cback)(BTM_SUCCESS, &p_acl->data_length_params); (*p_acl->p_set_pkt_data_cback)(BTM_SUCCESS, &p_acl->data_length_params);

View File

@ -1,10 +1,8 @@
/* /*
This example code is in the Public Domain (or CC0 licensed, at your option.) * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
*
Unless required by applicable law or agreed to in writing, this * SPDX-License-Identifier: Unlicense OR CC0-1.0
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR */
CONDITIONS OF ANY KIND, either express or implied.
*/
@ -402,6 +400,12 @@ static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *par
param->update_conn_params.latency, param->update_conn_params.latency,
param->update_conn_params.timeout); param->update_conn_params.timeout);
break; break;
case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
ESP_LOGI(GATTC_TAG, "packet length updated: rx = %d, tx = %d, status = %d",
param->pkt_data_length_cmpl.params.rx_len,
param->pkt_data_length_cmpl.params.tx_len,
param->pkt_data_length_cmpl.status);
break;
default: default:
break; break;
} }

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Unlicense OR CC0-1.0 * SPDX-License-Identifier: Unlicense OR CC0-1.0
*/ */
@ -233,6 +233,12 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param
param->update_conn_params.latency, param->update_conn_params.latency,
param->update_conn_params.timeout); param->update_conn_params.timeout);
break; break;
case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
ESP_LOGI(GATTS_TAG, "packet length updated: rx = %d, tx = %d, status = %d",
param->pkt_data_length_cmpl.params.rx_len,
param->pkt_data_length_cmpl.params.tx_len,
param->pkt_data_length_cmpl.status);
break;
default: default:
break; break;
} }