Skip to content

Commit 03c229e

Browse files
committed
Merge branch 'feat/add_l2cap_register_event' into 'master'
feat(bt): Added events for l2cap register and unregister vfs Closes BTQABR2023-465 See merge request espressif/esp-idf!38138
2 parents 25f9c37 + 4b5ccbe commit 03c229e

File tree

9 files changed

+86
-26
lines changed

9 files changed

+86
-26
lines changed

components/bt/host/bluedroid/api/esp_l2cap_bt_api.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,26 @@ esp_err_t esp_bt_l2cap_stop_srv(uint16_t local_psm)
116116

117117
esp_err_t esp_bt_l2cap_vfs_register(void)
118118
{
119+
btc_msg_t msg;
119120
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
120121

121-
return btc_l2cap_vfs_register();
122+
msg.sig = BTC_SIG_API_CALL;
123+
msg.pid = BTC_PID_L2CAP;
124+
msg.act = BTC_L2CAP_ACT_VFS_REGISTER;
125+
126+
return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
122127
}
123128

124129
esp_err_t esp_bt_l2cap_vfs_unregister(void)
125130
{
131+
btc_msg_t msg;
126132
ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
127133

128-
return btc_l2cap_vfs_unregister();
134+
msg.sig = BTC_SIG_API_CALL;
135+
msg.pid = BTC_PID_L2CAP;
136+
msg.act = BTC_L2CAP_ACT_VFS_UNREGISTER;
137+
138+
return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
129139
}
130140

131141
esp_err_t esp_bt_l2cap_get_protocol_status(esp_bt_l2cap_protocol_status_t *status)

components/bt/host/bluedroid/api/include/api/esp_l2cap_bt_api.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ typedef enum {
5959
ESP_BT_L2CAP_START_EVT = 18, /*!< When L2CAP server started, the event comes */
6060
ESP_BT_L2CAP_CL_INIT_EVT = 19, /*!< When L2CAP client initiated a connection, the event comes */
6161
ESP_BT_L2CAP_SRV_STOP_EVT = 36, /*!< When L2CAP server stopped, the event comes */
62+
ESP_BT_L2CAP_VFS_REGISTER_EVT = 38, /*!< When L2CAP VFS register, the event comes */
63+
ESP_BT_L2CAP_VFS_UNREGISTER_EVT = 39, /*!< When L2CAP VFS unregister, the event comes */
6264
} esp_bt_l2cap_cb_event_t;
6365

6466
/**
@@ -125,6 +127,20 @@ typedef union {
125127
uint8_t psm; /*!< local psm */
126128
} srv_stop; /*!< L2CAP callback param of ESP_BT_L2CAP_SRV_STOP_EVT */
127129

130+
/**
131+
* @brief ESP_BT_L2CAP_VFS_REGISTER_EVT
132+
*/
133+
struct l2cap_vfs_register_evt_param {
134+
esp_bt_l2cap_status_t status; /*!< status */
135+
} vfs_register; /*!< L2CAP callback param of ESP_BT_L2CAP_VFS_REGISTER_EVT */
136+
137+
/**
138+
* @brief ESP_BT_L2CAP_VFS_UNREGISTER_EVT
139+
*/
140+
struct l2cap_vfs_unregister_evt_param {
141+
esp_bt_l2cap_status_t status; /*!< status */
142+
} vfs_unregister; /*!< L2CAP callback param of ESP_BT_L2CAP_VFS_UNREGISTER_EVT */
143+
128144
} esp_bt_l2cap_cb_param_t;
129145

130146
/**
@@ -234,6 +250,7 @@ esp_err_t esp_bt_l2cap_stop_srv(uint16_t local_psm);
234250
/**
235251
* @brief This function is used to register VFS.
236252
* Only supports write, read and close.
253+
* When the operation is completed, the callback function will be called with ESP_BT_L2CAP_VFS_REGISTER_EVT.
237254
* This function must be called after esp_bt_l2cap_init() successful and before esp_bt_l2cap_deinit().
238255
*
239256
* @return
@@ -244,6 +261,7 @@ esp_err_t esp_bt_l2cap_vfs_register(void);
244261

245262
/**
246263
* @brief This function is used to unregister VFS.
264+
* When the operation is completed, the callback function will be called with ESP_BT_L2CAP_VFS_UNREGISTER_EVT.
247265
* This function must be called after esp_bt_l2cap_init() successful and before esp_bt_l2cap_deinit().
248266
*
249267
* @return

components/bt/host/bluedroid/btc/profile/std/include/btc_l2cap.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ typedef enum {
2424
BTC_L2CAP_ACT_CONNECT,
2525
BTC_L2CAP_ACT_START_SRV,
2626
BTC_L2CAP_ACT_STOP_SRV,
27+
BTC_L2CAP_ACT_VFS_REGISTER,
28+
BTC_L2CAP_ACT_VFS_UNREGISTER,
2729
} btc_l2cap_act_t;
2830

2931
/* btc_l2cap_args_t */
@@ -65,8 +67,7 @@ typedef union {
6567

6668
void btc_l2cap_call_handler(btc_msg_t *msg);
6769
void btc_l2cap_cb_handler(btc_msg_t *msg);
68-
esp_err_t btc_l2cap_vfs_register(void);
69-
esp_err_t btc_l2cap_vfs_unregister(void);
70+
7071
void btc_l2cap_get_protocol_status(esp_bt_l2cap_protocol_status_t *param);
7172

7273
#endif ///defined BTC_L2CAP_INCLUDED && BTC_L2CAP_INCLUDED == TRUE

components/bt/host/bluedroid/btc/profile/std/l2cap/btc_l2cap.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ typedef struct {
7272
uint8_t service_uuid[16];
7373
} l2cap_slot_t;
7474

75-
7675
typedef struct {
7776
l2cap_slot_t *l2cap_slots[BTA_JV_MAX_L2C_CONN + 1];
7877
uint32_t l2cap_slot_id;
@@ -81,7 +80,12 @@ typedef struct {
8180
esp_vfs_id_t l2cap_vfs_id;
8281
} l2cap_local_param_t;
8382

83+
#if L2CAP_DYNAMIC_MEMORY == FALSE
8484
static l2cap_local_param_t l2cap_local_param;
85+
#else
86+
static l2cap_local_param_t *l2cap_local_param_ptr;
87+
#define l2cap_local_param (*l2cap_local_param_ptr)
88+
#endif
8589

8690
/* L2CAP default options for OBEX connections */
8791
static const tL2CAP_FCR_OPTS obex_l2c_fcr_opts_def =
@@ -103,13 +107,15 @@ static const tL2CAP_ERTM_INFO obex_l2c_etm_opt =
103107
OBX_FCR_TX_POOL_ID
104108
};
105109

106-
107110
#if L2CAP_DYNAMIC_MEMORY == FALSE
108111
#define is_l2cap_init() (l2cap_local_param.l2cap_slot_mutex != NULL)
109112
#else
110113
#define is_l2cap_init() (&l2cap_local_param != NULL && l2cap_local_param.l2cap_slot_mutex != NULL)
111114
#endif
112115

116+
static void btc_l2cap_vfs_register(void);
117+
static void btc_l2cap_vfs_unregister(void);
118+
113119
static void l2cap_osi_free(void *p)
114120
{
115121
osi_free(p);
@@ -756,6 +762,12 @@ void btc_l2cap_call_handler(btc_msg_t *msg)
756762
case BTC_L2CAP_ACT_STOP_SRV:
757763
btc_l2cap_stop_srv(arg);
758764
break;
765+
case BTC_L2CAP_ACT_VFS_REGISTER:
766+
btc_l2cap_vfs_register();
767+
break;
768+
case BTC_L2CAP_ACT_VFS_UNREGISTER:
769+
btc_l2cap_vfs_unregister();
770+
break;
759771
default:
760772
BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
761773
break;
@@ -1199,14 +1211,14 @@ static ssize_t l2cap_vfs_read(int fd, void * dst, size_t size)
11991211
return item_size;
12001212
}
12011213

1202-
esp_err_t btc_l2cap_vfs_register(void)
1214+
static void btc_l2cap_vfs_register(void)
12031215
{
1204-
esp_err_t ret = ESP_OK;
1216+
esp_bt_l2cap_status_t ret = ESP_BT_L2CAP_SUCCESS;
12051217

12061218
do {
12071219
if (!is_l2cap_init()) {
12081220
BTC_TRACE_ERROR("%s L2CAP have not been init\n", __func__);
1209-
ret = ESP_FAIL;
1221+
ret = ESP_BT_L2CAP_NEED_INIT;
12101222
break;
12111223
}
12121224

@@ -1223,33 +1235,38 @@ esp_err_t btc_l2cap_vfs_register(void)
12231235
// No FD range is registered here: l2cap_vfs_id is used to register/unregister
12241236
// file descriptors
12251237
if (esp_vfs_register_with_id(&vfs, NULL, &l2cap_local_param.l2cap_vfs_id) != ESP_OK) {
1226-
ret = ESP_FAIL;
1238+
ret = ESP_BT_L2CAP_FAILURE;
12271239
break;
12281240
}
12291241
} while (0);
12301242

1231-
return ret;
1243+
esp_bt_l2cap_cb_param_t param = {0};
1244+
param.vfs_register.status = ret;
1245+
btc_l2cap_cb_to_app(ESP_BT_L2CAP_VFS_REGISTER_EVT, &param);
12321246
}
12331247

1234-
esp_err_t btc_l2cap_vfs_unregister(void)
1248+
static void btc_l2cap_vfs_unregister(void)
12351249
{
1236-
esp_err_t ret = ESP_OK;
1250+
esp_bt_l2cap_status_t ret = ESP_BT_L2CAP_SUCCESS;
1251+
12371252
do {
12381253
if (!is_l2cap_init()) {
12391254
BTC_TRACE_ERROR("%s L2CAP have not been init\n", __func__);
1240-
ret = ESP_FAIL;
1255+
ret = ESP_BT_L2CAP_NEED_INIT;
12411256
break;
12421257
}
12431258

12441259
if (l2cap_local_param.l2cap_vfs_id != -1) {
12451260
if (esp_vfs_unregister_with_id(l2cap_local_param.l2cap_vfs_id) != ESP_OK) {
1246-
ret = ESP_FAIL;
1261+
ret = ESP_BT_L2CAP_FAILURE;
12471262
}
12481263
}
12491264
l2cap_local_param.l2cap_vfs_id = -1;
12501265
} while (0);
12511266

1252-
return ret;
1267+
esp_bt_l2cap_cb_param_t param = {0};
1268+
param.vfs_unregister.status = ret;
1269+
btc_l2cap_cb_to_app(ESP_BT_L2CAP_VFS_UNREGISTER_EVT, &param);
12531270
}
12541271

12551272
void btc_l2cap_get_protocol_status(esp_bt_l2cap_protocol_status_t *param)

components/bt/host/bluedroid/stack/include/stack/dyn_mem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#define LLCP_DYNAMIC_MEMORY TRUE
5757
#define BTC_SBC_DEC_DYNAMIC_MEMORY TRUE
5858
#define BTC_GAP_BT_DYNAMIC_MEMORY TRUE
59+
#define L2CAP_DYNAMIC_MEMORY TRUE
5960

6061
#else /* #if UC_BT_BLE_DYNAMIC_ENV_MEMORY */
6162
#define BTU_DYNAMIC_MEMORY FALSE
@@ -93,6 +94,7 @@
9394
#define LLCP_DYNAMIC_MEMORY FALSE
9495
#define BTC_SBC_DEC_DYNAMIC_MEMORY FALSE
9596
#define BTC_GAP_BT_DYNAMIC_MEMORY FALSE
97+
#define L2CAP_DYNAMIC_MEMORY FALSE
9698

9799
#endif /* #if UC_BT_BLE_DYNAMIC_ENV_MEMORY */
98100

examples/bluetooth/bluedroid/classic_bt/bt_l2cap_client/main/bt_app_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void bt_app_task_shut_down(void)
134134

135135
void l2cap_wr_task_start_up(l2cap_wr_task_cb_t p_cback, int fd)
136136
{
137-
xTaskCreate(p_cback, "write_read", 2048, (void *)fd, 5, NULL);
137+
xTaskCreate(p_cback, "write_read", 4096, (void *)fd, 5, NULL);
138138
}
139139

140140
void l2cap_wr_task_shut_down(void)

examples/bluetooth/bluedroid/classic_bt/bt_l2cap_client/main/main.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
@@ -255,7 +255,8 @@ static void esp_bt_l2cap_cb(esp_bt_l2cap_cb_event_t event, esp_bt_l2cap_cb_param
255255
case ESP_BT_L2CAP_CLOSE_EVT:
256256
case ESP_BT_L2CAP_CL_INIT_EVT:
257257
case ESP_BT_L2CAP_START_EVT:
258-
case ESP_BT_L2CAP_SRV_STOP_EVT: {
258+
case ESP_BT_L2CAP_SRV_STOP_EVT:
259+
case ESP_BT_L2CAP_VFS_REGISTER_EVT: {
259260
bt_app_work_dispatch(esp_hdl_bt_l2cap_cb_evt, event, param, sizeof(esp_bt_l2cap_cb_param_t), NULL);
260261
break;
261262
}
@@ -306,6 +307,9 @@ static void esp_hdl_bt_l2cap_cb_evt(uint16_t event, void *p_param)
306307
case ESP_BT_L2CAP_SRV_STOP_EVT:
307308
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_CLOSE_EVT: status:%d, psm = 0x%x", l2cap_param->srv_stop.status, l2cap_param->srv_stop.psm);
308309
break;
310+
case ESP_BT_L2CAP_VFS_REGISTER_EVT:
311+
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_VFS_REGISTER_EVT: status:%d", l2cap_param->vfs_register.status);
312+
break;
309313
default:
310314
break;
311315
}

examples/bluetooth/bluedroid/classic_bt/bt_l2cap_server/main/bt_app_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void bt_app_task_shut_down(void)
134134

135135
void l2cap_wr_task_start_up(l2cap_wr_task_cb_t p_cback, int fd)
136136
{
137-
xTaskCreate(p_cback, "write_read", 2048, (void *)fd, 5, NULL);
137+
xTaskCreate(p_cback, "write_read", 4096, (void *)fd, 5, NULL);
138138
}
139139

140140
void l2cap_wr_task_shut_down(void)

examples/bluetooth/bluedroid/classic_bt/bt_l2cap_server/main/main.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
@@ -162,7 +162,8 @@ static void esp_bt_l2cap_cb(esp_bt_l2cap_cb_event_t event, esp_bt_l2cap_cb_param
162162
case ESP_BT_L2CAP_CLOSE_EVT:
163163
case ESP_BT_L2CAP_CL_INIT_EVT:
164164
case ESP_BT_L2CAP_START_EVT:
165-
case ESP_BT_L2CAP_SRV_STOP_EVT: {
165+
case ESP_BT_L2CAP_SRV_STOP_EVT:
166+
case ESP_BT_L2CAP_VFS_REGISTER_EVT: {
166167
bt_app_work_dispatch(esp_hdl_bt_l2cap_cb_evt, event, param, sizeof(esp_bt_l2cap_cb_param_t), NULL);
167168
break;
168169
}
@@ -182,9 +183,8 @@ static void esp_hdl_bt_l2cap_cb_evt(uint16_t event, void *p_param)
182183
if (l2cap_param->init.status == ESP_BT_L2CAP_SUCCESS) {
183184
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_INIT_EVT: status:%d", l2cap_param->init.status);
184185
esp_bt_l2cap_vfs_register();
185-
esp_bt_l2cap_start_srv(sec_mask, BT_L2CAP_DYNMIC_PSM);
186186
} else {
187-
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_INIT_EVT: status:%d", l2cap_param->init.status);
187+
ESP_LOGE(L2CAP_TAG, "ESP_BT_L2CAP_INIT_EVT: status:%d", l2cap_param->init.status);
188188
}
189189
break;
190190
case ESP_BT_L2CAP_UNINIT_EVT:
@@ -196,7 +196,7 @@ static void esp_hdl_bt_l2cap_cb_evt(uint16_t event, void *p_param)
196196
l2cap_param->open.fd, l2cap_param->open.tx_mtu, bda2str(l2cap_param->open.rem_bda, bda_str, sizeof(bda_str)));
197197
l2cap_wr_task_start_up(l2cap_read_handle, l2cap_param->open.fd);
198198
} else {
199-
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_OPEN_EVT: status:%d", l2cap_param->open.status);
199+
ESP_LOGE(L2CAP_TAG, "ESP_BT_L2CAP_OPEN_EVT: status:%d", l2cap_param->open.status);
200200
}
201201
break;
202202
case ESP_BT_L2CAP_CLOSE_EVT:
@@ -211,12 +211,20 @@ static void esp_hdl_bt_l2cap_cb_evt(uint16_t event, void *p_param)
211211
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_START_EVT: status:%d, hdl:0x%"PRIx32", sec_id:0x%x",
212212
l2cap_param->start.status, l2cap_param->start.handle, l2cap_param->start.sec_id);
213213
} else {
214-
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_START_EVT: status:%d", l2cap_param->start.status);
214+
ESP_LOGE(L2CAP_TAG, "ESP_BT_L2CAP_START_EVT: status:%d", l2cap_param->start.status);
215215
}
216216
break;
217217
case ESP_BT_L2CAP_SRV_STOP_EVT:
218218
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_SRV_STOP_EVT: status:%d, psm = 0x%x", l2cap_param->srv_stop.status, l2cap_param->srv_stop.psm);
219219
break;
220+
case ESP_BT_L2CAP_VFS_REGISTER_EVT:
221+
if (l2cap_param->vfs_register.status == ESP_BT_L2CAP_SUCCESS) {
222+
ESP_LOGI(L2CAP_TAG, "ESP_BT_L2CAP_VFS_REGISTER_EVT: status:%d", l2cap_param->vfs_register.status);
223+
esp_bt_l2cap_start_srv(sec_mask, BT_L2CAP_DYNMIC_PSM);
224+
} else {
225+
ESP_LOGE(L2CAP_TAG, "ESP_BT_L2CAP_VFS_REGISTER_EVT: status:%d", l2cap_param->vfs_register.status);
226+
}
227+
break;
220228
default:
221229
break;
222230
}

0 commit comments

Comments
 (0)