1 /*
2  * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <string.h>
8 
9 #include "esp_bt_main.h"
10 #include "btc/btc_manage.h"
11 
12 #include "btc_l2cap.h"
13 #include "esp_l2cap_bt_api.h"
14 #include "common/bt_target.h"
15 
16 #if (defined BTC_L2CAP_INCLUDED && BTC_L2CAP_INCLUDED == TRUE)
17 
esp_bt_l2cap_register_callback(esp_bt_l2cap_cb_t callback)18 esp_err_t esp_bt_l2cap_register_callback(esp_bt_l2cap_cb_t callback)
19 {
20     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
21 
22     if (callback == NULL) {
23         return ESP_FAIL;
24     }
25 
26     btc_profile_cb_set(BTC_PID_L2CAP, callback);
27     return ESP_OK;
28 }
29 
esp_bt_l2cap_init(void)30 esp_err_t esp_bt_l2cap_init(void)
31 {
32     btc_msg_t msg;
33     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
34 
35     msg.sig = BTC_SIG_API_CALL;
36     msg.pid = BTC_PID_L2CAP;
37     msg.act = BTC_L2CAP_ACT_INIT;
38 
39     return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
40 }
41 
esp_bt_l2cap_deinit(void)42 esp_err_t esp_bt_l2cap_deinit(void)
43 {
44     btc_msg_t msg;
45     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
46 
47     msg.sig = BTC_SIG_API_CALL;
48     msg.pid = BTC_PID_L2CAP;
49     msg.act = BTC_L2CAP_ACT_UNINIT;
50 
51     return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
52 }
53 
esp_bt_l2cap_connect(esp_bt_l2cap_cntl_flags_t cntl_flag,uint16_t remote_psm,esp_bd_addr_t peer_bd_addr)54 esp_err_t esp_bt_l2cap_connect(esp_bt_l2cap_cntl_flags_t cntl_flag, uint16_t remote_psm, esp_bd_addr_t peer_bd_addr)
55 {
56     btc_msg_t msg;
57     btc_l2cap_args_t arg;
58     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
59 
60     msg.sig = BTC_SIG_API_CALL;
61     msg.pid = BTC_PID_L2CAP;
62     msg.act = BTC_L2CAP_ACT_CONNECT;
63 
64     arg.connect.sec_mask = (cntl_flag & 0xffff);
65     arg.connect.remote_psm = remote_psm;
66     memcpy(arg.connect.peer_bd_addr, peer_bd_addr, ESP_BD_ADDR_LEN);
67 
68     return (btc_transfer_context(&msg, &arg, sizeof(btc_l2cap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
69 }
70 
esp_bt_l2cap_start_srv(esp_bt_l2cap_cntl_flags_t cntl_flag,uint16_t local_psm)71 esp_err_t esp_bt_l2cap_start_srv(esp_bt_l2cap_cntl_flags_t cntl_flag, uint16_t local_psm)
72 {
73     btc_msg_t msg;
74     btc_l2cap_args_t arg;
75     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
76 
77     msg.sig = BTC_SIG_API_CALL;
78     msg.pid = BTC_PID_L2CAP;
79     msg.act = BTC_L2CAP_ACT_START_SRV;
80 
81     arg.start_srv.sec_mask = (cntl_flag & 0xffff);
82     arg.start_srv.local_psm = local_psm;
83 
84     return (btc_transfer_context(&msg, &arg, sizeof(btc_l2cap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
85 }
86 
esp_bt_l2cap_stop_all_srv(void)87 esp_err_t esp_bt_l2cap_stop_all_srv(void)
88 {
89     btc_msg_t msg;
90     btc_l2cap_args_t arg;
91     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
92 
93     msg.sig = BTC_SIG_API_CALL;
94     msg.pid = BTC_PID_L2CAP;
95     msg.act = BTC_L2CAP_ACT_STOP_SRV;
96 
97     arg.stop_srv.psm = BTC_L2CAP_INVALID_PSM;
98 
99     return (btc_transfer_context(&msg, &arg, sizeof(btc_l2cap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
100 }
101 
esp_bt_l2cap_stop_srv(uint16_t local_psm)102 esp_err_t esp_bt_l2cap_stop_srv(uint16_t local_psm)
103 {
104     btc_msg_t msg;
105     btc_l2cap_args_t arg;
106     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
107 
108     msg.sig = BTC_SIG_API_CALL;
109     msg.pid = BTC_PID_L2CAP;
110     msg.act = BTC_L2CAP_ACT_STOP_SRV;
111 
112     arg.stop_srv.psm = local_psm;
113 
114     return (btc_transfer_context(&msg, &arg, sizeof(btc_l2cap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
115 }
116 
esp_bt_l2cap_vfs_register(void)117 esp_err_t esp_bt_l2cap_vfs_register(void)
118 {
119     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
120 
121     return btc_l2cap_vfs_register();
122 }
123 
esp_bt_l2cap_vfs_unregister(void)124 esp_err_t esp_bt_l2cap_vfs_unregister(void)
125 {
126     ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
127 
128     return btc_l2cap_vfs_unregister();
129 }
130 
131 #endif ///defined BTC_L2CAP_INCLUDED && BTC_L2CAP_INCLUDED == TRUE
132