1 /* 2 * Copyright (c) 2023, The OpenThread Authors. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. Neither the name of the copyright holder nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /** 30 * @file 31 * @brief 32 * This file defines a OpenThread BLE GATT peripheral interface driver. 33 * 34 */ 35 36 #ifndef OPENTHREAD_PLATFORM_BLE_H_ 37 #define OPENTHREAD_PLATFORM_BLE_H_ 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 #include <stdint.h> 44 45 #include <openthread/error.h> 46 #include <openthread/instance.h> 47 48 /** 49 * @addtogroup plat-ble 50 * 51 * @brief 52 * This module includes the platform abstraction for BLE Host communication. 53 * The platform needs to implement Bluetooth LE 4.2 or higher. 54 * 55 * @{ 56 * 57 */ 58 59 /** 60 * Time slot duration on PHY layer in microseconds (0.625ms). 61 * 62 */ 63 64 #define OT_BLE_TIMESLOT_UNIT 625 65 66 /** 67 * Minimum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (20ms). 68 * 69 */ 70 71 #define OT_BLE_ADV_INTERVAL_MIN 0x0020 72 73 /** 74 * Maximum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (10.24s). 75 * 76 */ 77 78 #define OT_BLE_ADV_INTERVAL_MAX 0x4000 79 80 /** 81 * Default interval for advertising packet (ms). 82 * 83 */ 84 85 #define OT_BLE_ADV_INTERVAL_DEFAULT 100 86 87 /** 88 * Unit used to calculate interval duration (0.625ms). 89 * 90 */ 91 92 #define OT_BLE_ADV_INTERVAL_UNIT OT_BLE_TIMESLOT_UNIT 93 94 /** 95 * Maximum allowed ATT MTU size (must be >= 23). 96 * 97 */ 98 99 #define OT_BLE_ATT_MTU_MAX 67 100 101 /** 102 * Default power value for BLE. 103 */ 104 105 #define OT_BLE_DEFAULT_POWER 0 106 107 /** 108 * TOBLE service UUID 109 */ 110 111 #define OT_TOBLE_SERVICE_UUID 0xfffb 112 113 /** 114 * Represent BLE link capabilities 115 * 116 */ 117 typedef struct otBleLinkCapabilities 118 { 119 uint8_t mRsv : 6; 120 bool mL2CapDirect : 1; 121 bool mGattNotifications : 1; 122 } otBleLinkCapabilities; 123 124 /** 125 * Represents a BLE packet. 126 * 127 */ 128 typedef struct otBleRadioPacket 129 { 130 uint8_t *mValue; ///< The value of an attribute 131 uint16_t mLength; ///< Length of the @p mValue. 132 int8_t mPower; ///< Transmit/receive power in dBm. 133 } otBleRadioPacket; 134 135 /******************************************************************************* 136 * @section Bluetooth Low Energy management. 137 ******************************************************************************/ 138 139 /** 140 * Enable the Bluetooth Low Energy radio. 141 * 142 * @note BLE Device should use the highest ATT_MTU supported that does not 143 * exceed OT_BLE_ATT_MTU_MAX octets. 144 * 145 * @param[in] aInstance The OpenThread instance structure. 146 * 147 * @retval OT_ERROR_NONE Successfully enabled. 148 * @retval OT_ERROR_FAILED The BLE radio could not be enabled. 149 */ 150 otError otPlatBleEnable(otInstance *aInstance); 151 152 /** 153 * Disable the Bluetooth Low Energy radio. 154 * 155 * When disabled, the BLE stack will flush event queues and not generate new 156 * events. The BLE peripheral is turned off or put into a low power sleep 157 * state. Any dynamic memory used by the stack should be released, 158 * but static memory may remain reserved. 159 * 160 * @param[in] aInstance The OpenThread instance structure. 161 * 162 * @retval OT_ERROR_NONE Successfully transitioned to disabled. 163 * @retval OT_ERROR_FAILED The BLE radio could not be disabled. 164 * 165 */ 166 otError otPlatBleDisable(otInstance *aInstance); 167 168 /**************************************************************************** 169 * @section Bluetooth Low Energy GAP. 170 ***************************************************************************/ 171 /** 172 * Gets BLE Advertising buffer. 173 * 174 * @note This function shall be used only for BLE Peripheral role. 175 * Returned buffer should have enough space to fit max advertisement 176 * defined by specification. 177 * 178 * @param[in] aInstance The OpenThread instance structure. 179 * @param[in] aAdvertisementData The formatted TCAT advertisement frame. 180 * @param[in] aAdvertisementLen The TCAT advertisement frame length. 181 * 182 * @retval OT_ERROR_NONE Advertising procedure has been started. 183 * @retval OT_ERROR_NO_BUFS No bufferspace available. 184 * 185 */ 186 otError otPlatBleGetAdvertisementBuffer(otInstance *aInstance, uint8_t **aAdvertisementBuffer); 187 188 /** 189 * Sets BLE Advertising data. 190 * 191 * @note This function shall be used only for BLE Peripheral role. 192 * 193 * @param[in] aInstance The OpenThread instance structure. 194 * @param[in] aAdvertisementData The formatted TCAT advertisement frame. 195 * @param[in] aAdvertisementLen The TCAT advertisement frame length. 196 * 197 * @retval OT_ERROR_NONE Advertising procedure has been started. 198 * @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state. 199 * @retval OT_ERROR_INVALID_ARGS Invalid value has been supplied. 200 * 201 */ 202 otError otPlatBleGapAdvSetData(otInstance *aInstance, uint8_t *aAdvertisementData, uint16_t aAdvertisementLen); 203 204 /** 205 * Starts BLE Advertising procedure. 206 * 207 * The BLE device shall use undirected advertising with no filter applied. 208 * A single BLE Advertising packet must be sent on all advertising 209 * channels (37, 38 and 39). 210 * 211 * @note This function shall be used only for BLE Peripheral role. 212 * 213 * @param[in] aInstance The OpenThread instance structure. 214 * @param[in] aInterval The interval between subsequent advertising packets 215 * in OT_BLE_ADV_INTERVAL_UNIT units. 216 * Shall be within OT_BLE_ADV_INTERVAL_MIN and 217 * OT_BLE_ADV_INTERVAL_MAX range or OT_BLE_ADV_INTERVAL_DEFAULT 218 * for a default value set at compile time. 219 * 220 * @retval OT_ERROR_NONE Advertising procedure has been started. 221 * @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state. 222 * @retval OT_ERROR_INVALID_ARGS Invalid interval value has been supplied. 223 * 224 */ 225 otError otPlatBleGapAdvStart(otInstance *aInstance, uint16_t aInterval); 226 227 /** 228 * Stops BLE Advertising procedure. 229 * 230 * @note This function shall be used only for BLE Peripheral role. 231 * 232 * @param[in] aInstance The OpenThread instance structure. 233 * 234 * @retval OT_ERROR_NONE Advertising procedure has been stopped. 235 * @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state. 236 * 237 */ 238 otError otPlatBleGapAdvStop(otInstance *aInstance); 239 240 /** 241 * The BLE driver calls this method to notify OpenThread that a BLE Central Device has 242 * been connected. 243 * 244 * @param[in] aInstance The OpenThread instance structure. 245 * @param[in] aConnectionId The identifier of the open connection. 246 * 247 */ 248 extern void otPlatBleGapOnConnected(otInstance *aInstance, uint16_t aConnectionId); 249 250 /** 251 * The BLE driver calls this method to notify OpenThread that the BLE Central Device 252 * has been disconnected. 253 * 254 * @param[in] aInstance The OpenThread instance structure. 255 * @param[in] aConnectionId The identifier of the closed connection. 256 * 257 */ 258 extern void otPlatBleGapOnDisconnected(otInstance *aInstance, uint16_t aConnectionId); 259 260 /** 261 * Disconnects BLE connection. 262 * 263 * The BLE device shall use the Remote User Terminated Connection (0x13) reason 264 * code when disconnecting from the peer BLE device.. 265 * 266 * @param[in] aInstance The OpenThread instance structure. 267 * 268 * @retval OT_ERROR_NONE Disconnection procedure has been started. 269 * @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state. 270 * 271 */ 272 otError otPlatBleGapDisconnect(otInstance *aInstance); 273 274 /******************************************************************************* 275 * @section Bluetooth Low Energy GATT Common. 276 *******************************************************************************/ 277 278 /** 279 * Reads currently use value of ATT_MTU. 280 * 281 * @param[in] aInstance The OpenThread instance structure. 282 * @param[out] aMtu A pointer to output the current ATT_MTU value. 283 * 284 * @retval OT_ERROR_NONE ATT_MTU value has been placed in @p aMtu. 285 * @retval OT_ERROR_FAILED BLE Device cannot determine its ATT_MTU. 286 * 287 */ 288 otError otPlatBleGattMtuGet(otInstance *aInstance, uint16_t *aMtu); 289 290 /** 291 * The BLE driver calls this method to notify OpenThread that ATT_MTU has been updated. 292 * 293 * @param[in] aInstance The OpenThread instance structure. 294 * @param[in] aMtu The updated ATT_MTU value. 295 * 296 */ 297 extern void otPlatBleGattOnMtuUpdate(otInstance *aInstance, uint16_t aMtu); 298 299 /******************************************************************************* 300 * @section Bluetooth Low Energy GATT Server. 301 ******************************************************************************/ 302 303 /** 304 * Sends ATT Handle Value Indication. 305 * 306 * @note This function shall be used only for GATT Server. 307 * 308 * @param[in] aInstance The OpenThread instance structure. 309 * @param[in] aHandle The handle of the attribute to be indicated. 310 * @param[in] aPacket A pointer to the packet contains value to be indicated. 311 * 312 * @retval OT_ERROR_NONE ATT Handle Value Indication has been sent. 313 * @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state. 314 * @retval OT_ERROR_INVALID_ARGS Invalid handle value, data or data length has been supplied. 315 * @retval OT_ERROR_NO_BUFS No available internal buffer found. 316 * 317 */ 318 otError otPlatBleGattServerIndicate(otInstance *aInstance, uint16_t aHandle, const otBleRadioPacket *aPacket); 319 320 /** 321 * The BLE driver calls this method to notify OpenThread that an ATT Write Request 322 * packet has been received. 323 * 324 * @note This function shall be used only for GATT Server. 325 * 326 * @param[in] aInstance The OpenThread instance structure. 327 * @param[in] aHandle The handle of the attribute to be written. 328 * @param[in] aPacket A pointer to the packet contains value to be written to the attribute. 329 * 330 */ 331 extern void otPlatBleGattServerOnWriteRequest(otInstance *aInstance, uint16_t aHandle, const otBleRadioPacket *aPacket); 332 333 /** 334 * Function to retrieve from platform BLE link capabilities. 335 * 336 * @param[in] aInstance The OpenThread instance structure. 337 * @param[out] aBleLinkCapabilities The pointer to retrieve the BLE ling capabilities. 338 * 339 */ 340 void otPlatBleGetLinkCapabilities(otInstance *aInstance, otBleLinkCapabilities *aBleLinkCapabilities); 341 342 /** 343 * Function to retrieve from platform multiradio support of BLE and IEEE. 344 * 345 * @param[in] aInstance The OpenThread instance structure. 346 * 347 */ 348 bool otPlatBleSupportsMultiRadio(otInstance *aInstance); 349 /** 350 * @} 351 * 352 */ 353 354 #ifdef __cplusplus 355 } // end of extern "C" 356 #endif 357 358 #endif // OPENTHREAD_PLATFORM_BLE_H_ 359