• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  * Copyright (c) 2022 Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK")
3  * All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************/
18 #ifndef BLE_COMMON_H
19 #define BLE_COMMON_H
20 
21 #include "tl_common.h"
22 
23 typedef enum {
24     BLE_SUCCESS = 0,
25 
26     //// HCI Status, See the Core_v5.0(Vol 2/Part D/1.3 "list of Error Codes") for more information)
27     HCI_ERR_UNKNOWN_HCI_CMD = 0x01,
28     HCI_ERR_UNKNOWN_CONN_ID = 0x02,
29     HCI_ERR_HW_FAILURE = 0x03,
30     HCI_ERR_PAGE_TIMEOUT = 0x04,
31     HCI_ERR_AUTH_FAILURE = 0x05,
32     HCI_ERR_PIN_KEY_MISSING = 0x06,
33     HCI_ERR_MEM_CAP_EXCEEDED = 0x07,
34     HCI_ERR_CONN_TIMEOUT = 0x08,
35     HCI_ERR_CONN_LIMIT_EXCEEDED = 0x09,
36     HCI_ERR_SYNCH_CONN_LIMIT_EXCEEDED = 0x0A,
37     HCI_ERR_CONN_ALREADY_EXISTS = 0x0B,
38     HCI_ERR_CMD_DISALLOWED = 0x0C,
39     HCI_ERR_CONN_REJ_LIMITED_RESOURCES = 0x0D,
40     HCI_ERR_CONN_REJECTED_SECURITY_REASONS = 0x0E,
41     HCI_ERR_CONN_REJECTED_UNACCEPTABLE_BDADDR = 0x0F,
42     HCI_ERR_CONN_ACCEPT_TIMEOUT_EXCEEDED = 0x10,
43     HCI_ERR_UNSUPPORTED_FEATURE_PARAM_VALUE = 0x11,
44     HCI_ERR_INVALID_HCI_CMD_PARAMS = 0x12,
45     HCI_ERR_REMOTE_USER_TERM_CONN = 0x13,
46     HCI_ERR_REMOTE_DEVICE_TERM_CONN_LOW_RESOURCES = 0x14,
47     HCI_ERR_REMOTE_DEVICE_TERM_CONN_POWER_OFF = 0x15,
48     HCI_ERR_CONN_TERM_BY_LOCAL_HOST = 0x16,
49     HCI_ERR_REPEATED_ATTEMPTS = 0x17,
50     HCI_ERR_PAIRING_NOT_ALLOWED = 0x18,
51     HCI_ERR_UNKNOWN_LMP_PDU = 0x19,
52     HCI_ERR_UNSUPPORTED_REMOTE_FEATURE = 0x1A,
53     HCI_ERR_SCO_OFFSET_REJ = 0x1B,
54     HCI_ERR_SCO_INTERVAL_REJ = 0x1C,
55     HCI_ERR_SCO_AIR_MODE_REJ = 0x1D,
56     HCI_ERR_INVALID_LMP_PARAMS = 0x1E,
57     HCI_ERR_UNSPECIFIED_ERROR = 0x1F,
58     HCI_ERR_UNSUPPORTED_LMP_PARAM_VAL = 0x20,
59     HCI_ERR_ROLE_CHANGE_NOT_ALLOWED = 0x21,
60     HCI_ERR_LMP_LL_RESP_TIMEOUT = 0x22,
61     HCI_ERR_LMP_ERR_TRANSACTION_COLLISION = 0x23,
62     HCI_ERR_LMP_PDU_NOT_ALLOWED = 0x24,
63     HCI_ERR_ENCRYPT_MODE_NOT_ACCEPTABLE = 0x25,
64     HCI_ERR_LINK_KEY_CAN_NOT_BE_CHANGED = 0x26,
65     HCI_ERR_REQ_QOS_NOT_SUPPORTED = 0x27,
66     HCI_ERR_INSTANT_PASSED = 0x28,
67     HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED = 0x29,
68     HCI_ERR_DIFFERENT_TRANSACTION_COLLISION = 0x2A,
69     HCI_ERR_RESERVED1 = 0x2B,
70     HCI_ERR_QOS_UNACCEPTABLE_PARAM = 0x2C,
71     HCI_ERR_QOS_REJ = 0x2D,
72     HCI_ERR_CHAN_ASSESSMENT_NOT_SUPPORTED = 0x2E,
73     HCI_ERR_INSUFFICIENT_SECURITY = 0x2F,
74     HCI_ERR_PARAM_OUT_OF_MANDATORY_RANGE = 0x30,
75     HCI_ERR_RESERVED2 = 0x31,
76     HCI_ERR_ROLE_SWITCH_PENDING = 0x32,
77     HCI_ERR_RESERVED3 = 0x33,
78     HCI_ERR_RESERVED_SLOT_VIOLATION = 0x34,
79     HCI_ERR_ROLE_SWITCH_FAILED = 0x35,
80     HCI_ERR_EXTENDED_INQUIRY_RESP_TOO_LARGE = 0x36,
81     HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST = 0x37,
82     HCI_ERR_HOST_BUSY_PAIRING = 0x38,
83     HCI_ERR_CONN_REJ_NO_SUITABLE_CHAN_FOUND = 0x39,
84     HCI_ERR_CONTROLLER_BUSY = 0x3A,
85     HCI_ERR_UNACCEPTABLE_CONN_INTERVAL = 0x3B,
86     HCI_ERR_ADVERTISING_TIMEOUT = 0x3C,
87     HCI_ERR_CONN_TERM_MIC_FAILURE = 0x3D,
88     HCI_ERR_CONN_FAILED_TO_ESTABLISH = 0x3E,
89     HCI_ERR_MAC_CONN_FAILED = 0x3F,
90     HCI_ERR_COARSE_CLOCK_ADJUSTMENT_REJECT = 0x40,
91     HCI_ERR_TYPE0_SUBMAP_NOT_DEFINED = 0x41,
92     HCI_ERR_UNKNOWN_ADV_IDENTIFIER = 0x42,
93     HCI_ERR_LIMIT_REACHED = 0x43,
94     HCI_ERR_OP_CANCELLED_BY_HOST = 0x44,
95     HCI_ERR_PACKET_TOO_LONG = 0x45,
96     // DBG used only for CIS
97     HCI_ERR_CONN_TERM_CIS_MIC_FAILURE = 0xD3,
98 
99     ///////////////////////// TELINK define status /////////////////////////////
100 
101     // LL status
102     LL_ERR_CONNECTION_NOT_ESTABLISH = 0x80,
103     LL_ERR_TX_FIFO_NOT_ENOUGH,
104     LL_ERR_ENCRYPTION_BUSY,
105     LL_ERR_CURRENT_STATE_NOT_SUPPORTED_THIS_CMD,
106     LL_ERR_INVALID_PARAMETER,
107     LL_ERR_UNKNOWN_OPCODE,
108 
109     LL_ERR_CIS_SYNC_FAIL,
110     LL_ERR_CIS_DISCONNECT,
111 
112     // L2CAP status
113     L2CAP_ERR_INVALID_PARAMETER = 0x90,
114     L2CAP_ERR_INVALID_HANDLE,
115     L2CAP_ERR_INSUFFICIENT_RESOURCES,
116     L2CAP_ERR_PSM_NOT_REGISTER,
117     L2CAP_ERR_CONTROL_NOT_READY,
118     L2CAP_ERR_PSM_HAVE_ESTABLISH,
119 
120     // SMP status
121     SMP_ERR_INVALID_PARAMETER = 0xA0,
122     SMP_ERR_PAIRING_BUSY,
123 
124     // GATT status
125     GATT_ERR_INVALID_PARAMETER = 0xB0,
126     GATT_ERR_PREVIOUS_INDICATE_DATA_HAS_NOT_CONFIRMED,
127     GATT_ERR_SERVICE_DISCOVERY_TIEMOUT,
128     GATT_ERR_NOTIFY_INDICATION_NOT_PERMITTED,
129     GATT_ERR_DATA_PENDING_DUE_TO_SERVICE_DISCOVERY_BUSY,
130     GATT_ERR_DATA_LENGTH_EXCEED_MTU_SIZE,
131 
132     // GAP status
133     GAP_ERR_INVALID_PARAMETER = 0xC0,
134     // IAL
135     IAL_ERR_SDU_LEN_EXCEED_SDU_MAX,
136     IAL_ERR_LOSS_SDU_INTRVEL,
137     IAL_ERR_ISO_TX_FIFO_NOT_ENOUGH,
138     IAL_ERR_SDU_BUFF_INVALID,
139     IAL_ERR_EVENT_PASSED,
140 
141     // Service status
142     SERVICE_ERR_INVALID_PARAMETER = 0xD0,
143 
144     // Application buffer check error code
145     LL_ACL_RX_BUF_NO_INIT = 0xE0,
146     LL_ACL_RX_BUF_PARAM_INVALID,
147     LL_ACL_RX_BUF_SIZE_NOT_MEET_MAX_RX_OCT,
148     LL_ACL_TX_BUF_NO_INIT,
149     LL_ACL_TX_BUF_PARAM_INVALID,
150     LL_ACL_TX_BUF_SIZE_MUL_NUM_EXCEED_4K,
151     LL_ACL_TX_BUF_SIZE_NOT_MEET_MAX_TX_OCT,
152 
153     LL_CIS_RX_BUF_NO_INIT,
154     LL_CIS_RX_BUF_PARAM_INVALID,
155     LL_CIS_TX_BUF_NO_INIT,
156     LL_CIS_TX_BUF_PARAM_INVALID,
157     LL_CIS_RX_EVT_BUF_NO_INIT,
158     LL_CIS_RX_EVT_BUF_PARAM_INVALID,
159 
160     LL_BIS_TX_BUF_NO_INIT,
161     LL_BIS_TX_BUF_PARAM_INVALID,
162     LL_BIS_RX_BUF_NO_INIT,
163     LL_BIS_RX_BUF_PARAM_INVALID,
164     LL_BIS_RX_PDU_INVALID,
165     LL_BIS_RX_PDU_EMPTY,
166     LL_BIS_RX_EVT_BUF_NO_INIT,
167     LL_BIS_RX_EVT_BUF_PARAM_INVALID,
168 
169     HCI_ACL_DATA_BUF_PARAM_INVALID,
170     HCI_ACL_DATA_BUF_SIZE_NOT_MEET_MAX_TX_OCT,
171 } ble_sts_t;
172 
173 /////////////////////////////// BLE  MAC ADDRESS //////////////////////////////////////////////
174 #define BLE_ADDR_PUBLIC  0
175 #define BLE_ADDR_RANDOM  1
176 #define BLE_ADDR_INVALID 0xff
177 #define BLE_ADDR_LEN     6
178 
179 // Definition for BLE Common Address Type
180 /*
181  *
182  *				  |--public  .................................................BLE_DEVICE_ADDRESS_PUBLIC
183  *                |
184  * Address Type --|		      |-- random static  .............................BLE_DEVICE_ADDRESS_RANDOM_STATIC
185  *           	  |           |
186  *    			  |--random --|
187  * 			   				  |				       |--non_resolvable private..BLE_DEVICE_ADDRESS_NON_RESOLVABLE_PRIVATE
188  * 			 				  |-- random private --|
189  *           					                   |--resolvable private......BLE_DEVICE_ADDRESS_RESOLVABLE_PRIVATE
190  *
191  */
192 
193 #define BLE_DEVICE_ADDRESS_PUBLIC                 1
194 #define BLE_DEVICE_ADDRESS_RANDOM_STATIC          2
195 #define BLE_DEVICE_ADDRESS_NON_RESOLVABLE_PRIVATE 3
196 #define BLE_DEVICE_ADDRESS_RESOLVABLE_PRIVATE     4
197 
198 #define IS_PUBLIC_ADDR(Type, Addr)  					((Type)==BLE_ADDR_PUBLIC)
199 #define IS_RANDOM_STATIC_ADDR(Type, Addr)          ((Type) == BLE_ADDR_RANDOM && (Addr[5] & 0xC0) == 0xC0)
200 #define IS_NON_RESOLVABLE_PRIVATE_ADDR(Type, Addr) ((Type) == BLE_ADDR_RANDOM && (Addr[5] & 0xC0) == 0x00)
201 #define IS_RESOLVABLE_PRIVATE_ADDR(Type, Addr)     ((Type) == BLE_ADDR_RANDOM && (Addr[5] & 0xC0) == 0x40)
202 
203 #define MAC_MATCH8(md, ms)                                                                                            \
204     (md[0] == ms[0] && md[1] == ms[1] && md[2] == ms[2] && md[3] == ms[3] && md[4] == ms[4] && md[5] == ms[5])
205 #define MAC_MATCH16(md, ms) (md[0] == ms[0] && md[1] == ms[1] && md[2] == ms[2])
206 #define MAC_MATCH32(md, ms) (md[0] == ms[0] && md[1] == ms[1])
207 /////////////////////////////////////////////////////////////////////////////
208 
209 /******************************************** ATT ***************************************************************/
210 /**
211  *  @brief  Definition for Attribute protocol PDUs
212  */
213 typedef enum {
214     ATT_OP_ERROR_RSP = 0x01,
215     ATT_OP_EXCHANGE_MTU_REQ = 0x02,
216     ATT_OP_EXCHANGE_MTU_RSP = 0x03,
217     ATT_OP_FIND_INFORMATION_REQ = 0x04,
218     ATT_OP_FIND_INFO_REQ = 0x04,
219     ATT_OP_FIND_INFORMATION_RSP = 0x05,
220     ATT_OP_FIND_INFO_RSP = 0x05,
221     ATT_OP_FIND_BY_TYPE_VALUE_REQ = 0x06,
222     ATT_OP_FIND_BY_TYPE_VALUE_RSP = 0x07,
223     ATT_OP_READ_BY_TYPE_REQ = 0x08,
224     ATT_OP_READ_BY_TYPE_RSP = 0x09,
225     ATT_OP_READ_REQ = 0x0A,
226     ATT_OP_READ_RSP = 0x0B,
227     ATT_OP_READ_BLOB_REQ = 0x0C,
228     ATT_OP_READ_BLOB_RSP = 0x0D,
229     ATT_OP_READ_MULTIPLE_REQ = 0x0E,
230     ATT_OP_READ_MULTI_REQ = 0x0E,
231     ATT_OP_READ_MULTIPLE_RSP = 0x0F,
232     ATT_OP_READ_BY_GROUP_TYPE_REQ = 0x10,
233     ATT_OP_READ_BY_GROUP_TYPE_RSP = 0x11,
234     ATT_OP_WRITE_REQ = 0x12,
235     ATT_OP_WRITE_RSP = 0x13,
236     ATT_OP_PREPARE_WRITE_REQ = 0x16,
237     ATT_OP_PREPARE_WRITE_RSP = 0x17,
238     ATT_OP_EXECUTE_WRITE_REQ = 0x18,
239     ATT_OP_EXECUTE_WRITE_RSP = 0x19,
240 
241     ATT_OP_HANDLE_VALUE_NTF = 0x1B,
242     ATT_OP_HANDLE_VALUE_NOTI = 0x1B,
243     ATT_OP_HANDLE_VALUE_IND = 0x1D,
244     ATT_OP_HANDLE_VALUE_CFM = 0x1E,
245 
246     ATT_OP_READ_MULTIPLE_VARIABLE_REQ = 0x20,  // core_5.2
247     ATT_OP_READ_MULTIPLE_VARIABLE_RSP = 0x21,  // core_5.2
248     ATT_OP_MULTIPLE_HANDLE_VALUE_NTF = 0x23,   // core_5.2
249 
250     ATT_OP_WRITE_CMD = 0x52,
251     ATT_OP_SIGNED_WRITE_CMD = 0xD2,
252 } att_pdu_type;
253 
254 /******************************************** GAP ***************************************************************/
255 
256 // https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/
257 // EIR Data Type, Advertising Data Type (AD Type) and OOB Data Type Definitions
258 
259 typedef enum {
260     DT_FLAGS = 0x01,                              //	Flag
261     DT_INCOMPLT_LIST_16BIT_SERVICE_UUID = 0x02,   //	Incomplete List of 16-bit Service Class UUIDs
262     DT_COMPLETE_LIST_16BIT_SERVICE_UUID = 0x03,   //	Complete List of 16-bit Service Class UUIDs
263     DT_INCOMPLT_LIST_32BIT_SERVICE_UUID = 0x04,   //	Incomplete List of 32-bit Service Class UUIDs
264     DT_COMPLETE_LIST_32BIT_SERVICE_UUID = 0x05,   //	Complete List of 32-bit Service Class UUIDs
265     DT_INCOMPLT_LIST_128BIT_SERVICE_UUID = 0x06,  //	Incomplete List of 128-bit Service Class UUIDs
266     DT_COMPLETE_LIST_128BIT_SERVICE_UUID = 0x07,  //	Complete List of 128-bit Service Class UUIDs
267     DT_SHORTENED_LOCAL_NAME = 0x08,               //	Shortened Local Name
268     DT_COMPLETE_LOCAL_NAME = 0x09,                //	Complete Local Name
269     DT_TX_POWER_LEVEL = 0x0A,                     //	Tx Power Level
270 
271     DT_CLASS_OF_DEVICE = 0x0D,  //	Class of Device
272 
273     DT_APPEARANCE = 0x19,  //	Appearance
274 
275     DT_CHM_UPT_IND = 0x28,          //	Channel Map Update Indication
276     DT_BIGINFO = 0x2C,              //	BIGInfo
277     DT_BROADCAST_CODE = 0x2D,       // 	Broadcast_Code
278     DT_3D_INFORMATION_DATA = 0x3D,  //	3D Information Data
279 
280     DATA_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF,  //	Manufacturer Specific Data
281 } data_type_t;
282 
283 /**
284  * @brief	HCI ACL DATA buffer length = LE_ACL_Data_Packet_Length + 4, pkt_len is integer multiple of 4,
285  *          so result is 4 Byte align
286  *			4 = 2(connHandle) + 1(PBFlag) + 1(length)
287  */
288 #define CALCULATE_HCI_ACL_DATA_FIFO_SIZE(pkt_len) ((pkt_len) + 4)
289 
290 /**
291  * @brief	6 = header(2)+l2cap_len(2)+CID(2)
292  */
293 #define CAL_MTU_BUFF_SIZE(n) ((((n) + 6) + 3) / 4 * 4)
294 
295 /**
296  * @brief	12 = type(1) + len(1) + l2cap_len(2) + cid(2) + sud_len(2) + mic(4)
297  */
298 #define L2CAP_ALLIGN4_KFRAM_DMA_BUFF(n) ((((n) + 12) + 3) / 4 * 4)
299 
300 // 7 = rf_packet_ll_data_t
301 #define CIS_PDU_ALLIGN4_TXBUFF(n)                                                                                     \
302     DATA_LENGTH_ALLIGN4((CAL_LL_ISO_TX_FIFO_SIZE(n) + DATA_LENGTH_ALLIGN4(CIS_TX_PDU_BUFFER_LENGTH - 7)))
303 
304 #define CIS_PDU_ALLIGN4_RXBUFF(n) DATA_LENGTH_ALLIGN4(CAL_LL_ISO_RX_FIFO_SIZE(n))
305 
306 #define BIS_PDU_ALLIGN4_TXBUFF(n)                                                                                     \
307     DATA_LENGTH_ALLIGN4((CAL_LL_ISO_TX_FIFO_SIZE(n) + DATA_LENGTH_ALLIGN4(BIS_TX_PDU_BUFFER_LENGTH - 7)))
308 
309 #define BIS_PDU_ALLIGN4_RXBUFF(n) DATA_LENGTH_ALLIGN4(BIS_LL_RX_PDU_FIFO_SIZE(n))
310 
311 #define IAL_SDU_ALLIGN4_BUFF(n) ((((n) + 16) + 3) / 4 * 4)
312 
313 #define HCI_ISO_ALLIGN4_BUFF(n) ((((n) + 4) + 3) / 4 * 4)  // DMA len 4
314 
315 #endif
316