blob: bf7e48bc42f39a841c5a246030c4dbf38407cbc4 [file] [log] [blame]
/*
* Copyright (c) 2023, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* @brief
* This file defines a OpenThread BLE GATT peripheral interface driver.
*
*/
#ifndef OPENTHREAD_PLATFORM_BLE_H_
#define OPENTHREAD_PLATFORM_BLE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <openthread/error.h>
#include <openthread/instance.h>
/**
* @addtogroup plat-ble
*
* @brief
* This module includes the platform abstraction for BLE Host communication.
* The platform needs to implement Bluetooth LE 4.2 or higher.
*
* @{
*
*/
/**
* Time slot duration on PHY layer in microseconds (0.625ms).
*
*/
#define OT_BLE_TIMESLOT_UNIT 625
/**
* Minimum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (20ms).
*
*/
#define OT_BLE_ADV_INTERVAL_MIN 0x0020
/**
* Maximum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (10.24s).
*
*/
#define OT_BLE_ADV_INTERVAL_MAX 0x4000
/**
* Default interval for advertising packet (ms).
*
*/
#define OT_BLE_ADV_INTERVAL_DEFAULT 100
/**
* Unit used to calculate interval duration (0.625ms).
*
*/
#define OT_BLE_ADV_INTERVAL_UNIT OT_BLE_TIMESLOT_UNIT
/**
* Maximum allowed ATT MTU size (must be >= 23).
*
*/
#define OT_BLE_ATT_MTU_MAX 67
/**
* Default power value for BLE.
*/
#define OT_BLE_DEFAULT_POWER 0
/**
* Represents a BLE packet.
*
*/
typedef struct otBleRadioPacket
{
uint8_t *mValue; ///< The value of an attribute
uint16_t mLength; ///< Length of the @p mValue.
int8_t mPower; ///< Transmit/receive power in dBm.
} otBleRadioPacket;
/*******************************************************************************
* @section Bluetooth Low Energy management.
******************************************************************************/
/**
* Enable the Bluetooth Low Energy radio.
*
* @note BLE Device should use the highest ATT_MTU supported that does not
* exceed OT_BLE_ATT_MTU_MAX octets.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval OT_ERROR_NONE Successfully enabled.
* @retval OT_ERROR_FAILED The BLE radio could not be enabled.
*/
otError otPlatBleEnable(otInstance *aInstance);
/**
* Disable the Bluetooth Low Energy radio.
*
* When disabled, the BLE stack will flush event queues and not generate new
* events. The BLE peripheral is turned off or put into a low power sleep
* state. Any dynamic memory used by the stack should be released,
* but static memory may remain reserved.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval OT_ERROR_NONE Successfully transitioned to disabled.
* @retval OT_ERROR_FAILED The BLE radio could not be disabled.
*
*/
otError otPlatBleDisable(otInstance *aInstance);
/****************************************************************************
* @section Bluetooth Low Energy GAP.
***************************************************************************/
/**
* Starts BLE Advertising procedure.
*
* The BLE device shall use undirected advertising with no filter applied.
* A single BLE Advertising packet must be sent on all advertising
* channels (37, 38 and 39).
*
* @note This function shall be used only for BLE Peripheral role.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aInterval The interval between subsequent advertising packets
* in OT_BLE_ADV_INTERVAL_UNIT units.
* Shall be within OT_BLE_ADV_INTERVAL_MIN and
* OT_BLE_ADV_INTERVAL_MAX range or OT_BLE_ADV_INTERVAL_DEFAULT
* for a default value set at compile time.
*
* @retval OT_ERROR_NONE Advertising procedure has been started.
* @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval OT_ERROR_INVALID_ARGS Invalid interval value has been supplied.
*
*/
otError otPlatBleGapAdvStart(otInstance *aInstance, uint16_t aInterval);
/**
* Stops BLE Advertising procedure.
*
* @note This function shall be used only for BLE Peripheral role.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval OT_ERROR_NONE Advertising procedure has been stopped.
* @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state.
*
*/
otError otPlatBleGapAdvStop(otInstance *aInstance);
/**
* The BLE driver calls this method to notify OpenThread that a BLE Central Device has
* been connected.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aConnectionId The identifier of the open connection.
*
*/
extern void otPlatBleGapOnConnected(otInstance *aInstance, uint16_t aConnectionId);
/**
* The BLE driver calls this method to notify OpenThread that the BLE Central Device
* has been disconnected.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aConnectionId The identifier of the closed connection.
*
*/
extern void otPlatBleGapOnDisconnected(otInstance *aInstance, uint16_t aConnectionId);
/**
* Disconnects BLE connection.
*
* The BLE device shall use the Remote User Terminated Connection (0x13) reason
* code when disconnecting from the peer BLE device..
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval OT_ERROR_NONE Disconnection procedure has been started.
* @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state.
*
*/
otError otPlatBleGapDisconnect(otInstance *aInstance);
/*******************************************************************************
* @section Bluetooth Low Energy GATT Common.
*******************************************************************************/
/**
* Reads currently use value of ATT_MTU.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[out] aMtu A pointer to output the current ATT_MTU value.
*
* @retval OT_ERROR_NONE ATT_MTU value has been placed in @p aMtu.
* @retval OT_ERROR_FAILED BLE Device cannot determine its ATT_MTU.
*
*/
otError otPlatBleGattMtuGet(otInstance *aInstance, uint16_t *aMtu);
/**
* The BLE driver calls this method to notify OpenThread that ATT_MTU has been updated.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aMtu The updated ATT_MTU value.
*
*/
extern void otPlatBleGattOnMtuUpdate(otInstance *aInstance, uint16_t aMtu);
/*******************************************************************************
* @section Bluetooth Low Energy GATT Server.
******************************************************************************/
/**
* Sends ATT Handle Value Indication.
*
* @note This function shall be used only for GATT Server.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle of the attribute to be indicated.
* @param[in] aPacket A pointer to the packet contains value to be indicated.
*
* @retval OT_ERROR_NONE ATT Handle Value Indication has been sent.
* @retval OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval OT_ERROR_INVALID_ARGS Invalid handle value, data or data length has been supplied.
* @retval OT_ERROR_NO_BUFS No available internal buffer found.
*
*/
otError otPlatBleGattServerIndicate(otInstance *aInstance, uint16_t aHandle, const otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an ATT Write Request
* packet has been received.
*
* @note This function shall be used only for GATT Server.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle of the attribute to be written.
* @param[in] aPacket A pointer to the packet contains value to be written to the attribute.
*
*/
extern void otPlatBleGattServerOnWriteRequest(otInstance *aInstance, uint16_t aHandle, const otBleRadioPacket *aPacket);
/**
* @}
*
*/
#ifdef __cplusplus
} // end of extern "C"
#endif
#endif // OPENTHREAD_PLATFORM_BLE_H_