blob: 0a66beaa9ce168fd753552a2f73341f8a7369fef [file] [log] [blame]
/*
* Copyright (c) 2018, 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 generic OpenThread BLE driver HOST interface.
*
*/
#ifndef OT_PLATFORM_BLE_H_
#define OT_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.
*
* @{
*
*/
enum
{
/**
* The size of the Bluetooth Device Address [bytes].
*/
OT_BLE_ADDRESS_LENGTH = 6,
/**
* Time slot duration on PHY layer in microseconds (0.625ms).
*/
OT_BLE_TIMESLOT_UNIT = 625,
/**
* Unit used to calculate connection interval (1.25ms)
*/
OT_BLE_CONN_INTERVAL_UNIT = 2 * OT_BLE_TIMESLOT_UNIT,
/**
* Minimum allowed connection interval in OT_BLE_CONN_INTERVAL_UNIT units (7.5ms).
* See v4.2 [Vol 2, Part E] page 946
*/
OT_BLE_CONN_INTERVAL_MIN = 0x0006,
/**
* Maximum allowed connection interval in OT_BLE_CONN_INTERVAL_UNIT units (4s).
* See v4.2 [Vol 2, Part E] page 946
*/
OT_BLE_CONN_INTERVAL_MAX = 0x0C80,
/**
* Maximum allowed slave latency in units of connection events.
* See v4.2 [Vol 2, Part E] page 946
*/
OT_BLE_CONN_SLAVE_LATENCY_MAX = 0x01F3,
/**
* Minimum allowed connection timeout in units of 10ms (100ms).
* See v4.2 [Vol 2, Part E] page 946
*/
OT_BLE_CONN_SUPERVISOR_TIMEOUT_MIN = 0x000A,
/**
* Maximum allowed connection timeout (32s).
* See v4.2 [Vol 2, Part E] page 946
*/
OT_BLE_CONN_SUPERVISOR_TIMEOUT_MAX = 0x0C80,
/**
* Unit used to calculate connection supervisor timeout (10ms).
*/
OT_BLE_CONN_SUPERVISOR_UNIT = 16 * OT_BLE_TIMESLOT_UNIT,
/**
* Maximum length of the device name characteristic [bytes].
*/
OT_BLE_DEV_NAME_MAX_LENGTH = 248,
/**
* Maximum length of advertising data [bytes].
*/
OT_BLE_ADV_DATA_MAX_LENGTH = 31,
/**
* Maximum length of scan response data [bytes].
*/
OT_BLE_SCAN_RESPONSE_MAX_LENGTH = 31,
/**
* Minimum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (20ms).
*/
OT_BLE_ADV_INTERVAL_MIN = 0x0020,
/**
* Maximum allowed interval for advertising packet in OT_BLE_ADV_INTERVAL_UNIT units (10.24s).
*/
OT_BLE_ADV_INTERVAL_MAX = 0x4000,
/**
* Unit used to calculate interval duration (0.625ms).
*/
OT_BLE_ADV_INTERVAL_UNIT = OT_BLE_TIMESLOT_UNIT,
/**
* Minimum allowed scan interval (2.5ms).
*/
OT_BLE_SCAN_INTERVAL_MIN = 0x0004,
/**
* Maximum allowed scan interval (10.24s).
*/
OT_BLE_SCAN_INTERVAL_MAX = 0x4000,
/**
* Unit used to calculate scan interval duration (0.625ms).
*/
OT_BLE_SCAN_INTERVAL_UNIT = OT_BLE_TIMESLOT_UNIT,
/**
* Minimum allowed scan window in OT_BLE_TIMESLOT_UNIT units (2.5ms).
*/
OT_BLE_SCAN_WINDOW_MIN = 0x0004,
/**
* Maximum allowed scan window in OT_BLE_TIMESLOT_UNIT units (10.24s).
*/
OT_BLE_SCAN_WINDOW_MAX = 0x4000,
/**
* Unit used to calculate scan window duration (0.625ms).
*/
OT_BLE_SCAN_WINDOW_UNIT = OT_BLE_TIMESLOT_UNIT,
/**
* BLE HCI code for remote user terminated connection.
*/
OT_BLE_HCI_REMOTE_USER_TERMINATED = 0x13,
/**
* Value of invalid/unknown handle.
*/
OT_BLE_INVALID_HANDLE = 0x0000,
/**
* Maximum size of BLE Characteristic [bytes].
*/
OT_BLE_CHARACTERISTIC_MAX_LENGTH = 512,
/**
* Maximum value of ATT_MTU [bytes].
*/
OT_BLE_ATT_MTU_MAX = 511,
/**
* Length of full BLE UUID in bytes.
*/
OT_BLE_UUID_LENGTH = 16,
/**
* Uuid of Client Configuration Characteristic Descriptor.
*/
OT_BLE_UUID_CCCD = 0x2902,
};
/// Convert the advertising interval from [ms] to [ble symbol times].
#define OT_BLE_MS_TO_TICKS(x) (((x)*1000) / OT_BLE_ADV_INTERVAL_UNIT)
/**
* This enum represents BLE Device Address types.
*
*/
typedef enum otPlatBleAddressType
{
OT_BLE_ADDRESS_TYPE_PUBLIC = 0, ///< Bluetooth public device address.
OT_BLE_ADDRESS_TYPE_RANDOM_STATIC = 1, ///< Bluetooth random static address.
OT_BLE_ADDRESS_TYPE_RANDOM_PRIVATE_RESOLVABLE = 2, ///< Bluetooth random private resolvable address.
OT_BLE_ADDRESS_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE = 3, ///< Bluetooth random private non-resolvable address.
} otPlatBleAddressType;
/**
* This enumeration defines the characterstic properties flags for a
* Client Characteristic Configuration Descriptor (CCCD).
*
* See v4.2 [Vol 3, Part G] 3.3.1.1 Characteristic Properties - Table 3.5
*/
typedef enum otPlatBleCccdFlags
{
/**
* If set, permits broadcasts of the Characteristic Value using Characteristic Configuration Descriptor.
*/
OT_BLE_CHAR_PROP_BROADCAST = (1 << 0),
/**
* If set, permits reads of the Characteristic Value.
*/
OT_BLE_CHAR_PROP_READ = (1 << 1),
/**
* If set, permit writes of the Characteristic Value without response.
*/
OT_BLE_CHAR_PROP_WRITE_NO_RESPONSE = (1 << 2),
/**
* If set, permits writes of the Characteristic Value with response.
*/
OT_BLE_CHAR_PROP_WRITE = (1 << 3),
/**
* If set, permits notifications of a Characteristic Value without acknowledgement.
*/
OT_BLE_CHAR_PROP_NOTIFY = (1 << 4),
/**
* If set, permits indications of a Characteristic Value with acknowledgement.
*/
OT_BLE_CHAR_PROP_INDICATE = (1 << 5),
/**
* If set, permits signed writes to the Characteristic Value.
*/
OT_BLE_CHAR_PROP_AUTH_SIGNED_WRITE = (1 << 6),
/**
* If set, additional characteristic properties are defined in the Characteristic Extended Properties Descriptor.
*/
OT_BLE_CHAR_PROP_EXTENDED = (1 << 7),
} otPlatBleCccdFlags;
/**
* This structure represents BLE Device Address.
*
*/
typedef struct otPlatBleDeviceAddr
{
uint8_t mAddrType; ///< Bluetooth device address type.
uint8_t mAddr[OT_BLE_ADDRESS_LENGTH]; ///< An 48-bit address of Bluetooth device in LSB format.
} otPlatBleDeviceAddr;
/**
* This enumeration defines flags for BLE advertisement mode.
*
*/
typedef enum otPlatBleAdvMode
{
/**
* If set, advertising device will allow connections to be initiated.
*/
OT_BLE_ADV_MODE_CONNECTABLE = (1 << 0),
/**
* If set, advertising device will respond to scan requests.
*/
OT_BLE_ADV_MODE_SCANNABLE = (1 << 1),
} otPlatBleAdvMode;
/**
* This structure represents BLE connection parameters.
*
*/
typedef struct otPlatBleGapConnParams
{
/**
* Preferred minimum connection interval in OT_BLE_TIMESLOT_UNIT units.
* Shall be in OT_BLE_CONN_INTERVAL_MIN and OT_BLE_CONN_INTERVAL_MAX range.
*/
uint16_t mConnMinInterval;
/**
* Preferred maximum connection interval in OT_BLE_TIMESLOT_UNIT units.
* Shall be in OT_BLE_CONN_INTERVAL_MIN and OT_BLE_CONN_INTERVAL_MAX range.
*/
uint16_t mConnMaxInterval;
/**
* Slave Latency in number of connection events.
* Shall not exceed OT_BLE_CONN_SLAVE_LATENCY_MAX value.
*/
uint16_t mConnSlaveLatency;
/**
* Defines connection timeout parameter in OT_BLE_CONN_SUPERVISOR_UNIT units. Shall be in
* OT_BLE_CONN_SUPERVISOR_TIMEOUT_MIN and OT_BLE_CONN_SUPERVISOR_TIMEOUT_MIN range.
*/
uint16_t mConnSupervisionTimeout;
} otPlatBleGapConnParams;
/**
* This enumeration represents BLE UUID value.
*
*/
typedef enum otPlatBleUuidType
{
OT_BLE_UUID_TYPE_NONE = 0, ///< UUID uninitialized value.
OT_BLE_UUID_TYPE_16 = 1, ///< UUID represented by 16-bit value.
OT_BLE_UUID_TYPE_32 = 2, ///< UUID represented by 32-bit value.
OT_BLE_UUID_TYPE_128 = 3, ///< UUID represented by 128-bit value.
} otPlatBleUuidType;
/**
* This structure represents BLE UUID value.
*
*/
typedef union otPlatBleUuidValue
{
uint8_t *mUuid128; ///< A pointer to 128-bit UUID value.
uint32_t mUuid32; ///< A 32-bit UUID value.
uint16_t mUuid16; ///< A 16-bit UUID value.
} otPlatBleUuidValue;
/**
* This structure represents BLE UUID.
*
*/
typedef struct otPlatBleUuid
{
otPlatBleUuidType mType; ///< A type of UUID in @p mValue.
otPlatBleUuidValue mValue; ///< A value of UUID.
} otPlatBleUuid;
/**
* This structure represents GATT Characteristic.
*
*/
typedef struct otPlatBleGattCharacteristic
{
otPlatBleUuid mUuid; ///< [in] A UUID value of a characteristic.
uint16_t mHandleValue; ///< [out] Characteristic value handle.
uint16_t mHandleCccd; ///< [out] CCCD handle or OT_BLE_INVALID_HANDLE if CCCD is not present.
uint8_t mProperties; ///< [in] Characteristic properties.
} otPlatBleGattCharacteristic;
/**
* This structure represents GATT Descriptor.
*
*/
typedef struct otPlatBleGattDescriptor
{
otPlatBleUuid mUuid; ///< A UUID value of descriptor.
uint16_t mHandle; ///< Descriptor handle.
} otPlatBleGattDescriptor;
/**
* Registration descriptor for a GATT service.
*
*/
typedef struct otPlatBleGattService
{
/**
* Pointer to service UUID; use BLE_UUIDxx_DECLARE macros to declare
* proper UUID; NULL if there are no more characteristics in the service.
*/
const otPlatBleUuid mUuid;
/**
* Handle of service; written to by stack after call to
* otPlatBleGattServerServicesRegister.
*/
uint16_t mHandle;
/**
* Array of characteristic definitions corresponding to characteristics
* belonging to this service.
*/
otPlatBleGattCharacteristic *mCharacteristics;
} otPlatBleGattService;
/**
* This structure represents an 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;
/**
* The enum indicates the outcome of the L2CAP connection request procedure.
* See Bluetooth v5.0 | Vol 3, Part A, 4.23, Table 4.20.
*/
typedef enum otPlatBleL2capError
{
OT_BLE_L2C_ERROR_NONE = 0x00, ///< Connection successful.
OT_BLE_L2C_ERROR_INVALID_PSM = 0x02, ///< Connection refused – LE_PSM not supported.
OT_BLE_L2C_ERROR_NO_MEM = 0x04, ///< Connection refused – no resources available.
OT_BLE_L2C_ERROR_INVALID_PARAMS = 0x0b, ///< Connection refused – unacceptable parameters.
} otPlatBleL2capError;
/*******************************************************************************
* @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);
/**
* Reset the Bluetooth Low Energy subsystem.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval ::OT_ERROR_NONE Successfully reset.
* @retval ::OT_ERROR_FAILED The BLE stack could not be reset.
*/
otError otPlatBleReset(otInstance *aInstance);
/**
* Check whether Bluetooth Low Energy radio is enabled or not.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval ::true Bluetooth Low Energy radio is enabled.
* @retval ::false Bluetooth Low Energy radio is disabled.
*/
bool otPlatBleIsEnabled(otInstance *aInstance);
/**
* Callback sent when Bluetooth Low Energy is ready after being enabled.
*
* @param[in] aInstance The OpenThread instance structure.
*/
extern void otPlatBleOnEnabled(otInstance *aInstance);
/****************************************************************************
* @section Bluetooth Low Energy GAP.
***************************************************************************/
/**
* Gets Bluetooth Device Address.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[out] aAddress The pointer to Bluetooth Device Address.
*
* @retval ::OT_ERROR_NONE Request has been successfully done.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
*/
otError otPlatBleGapAddressGet(otInstance *aInstance, otPlatBleDeviceAddr *aAddress);
/**
* Sets Bluetooth Device Address.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aAddress The pointer to Bluetooth Device Address.
*
* @retval ::OT_ERROR_NONE Request has been successfully done.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
*/
otError otPlatBleGapAddressSet(otInstance *aInstance, const otPlatBleDeviceAddr *aAddress);
/**
* Sets BLE device name and appearance that is visible as GATT Based service.
*
* The BLE Host stack should set the security mode 1, level 1 (no security) for
* those characteristics.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aDeviceName A pointer to device name string (null terminated).
* Shall not exceed OT_BLE_DEV_NAME_MAX_LENGTH.
* @param[in] aAppearance The value of appearance characteristic.
*
* @retval ::OT_ERROR_NONE Connection parameters have been
* successfully set.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
*/
otError otPlatBleGapServiceSet(otInstance *aInstance, const char *aDeviceName, uint16_t aAppearance);
/**
* Sets desired BLE Connection Parameters.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aConnParams A pointer to connection parameters structure.
*
* @retval ::OT_ERROR_NONE Connection parameters have been
* successfully set.
* @retval ::OT_ERROR_INVALID_ARGS Invalid connection parameters have been
* supplied.
*/
otError otPlatBleGapConnParamsSet(otInstance *aInstance, const otPlatBleGapConnParams *aConnParams);
/**
* Sets BLE Advertising packet content.
*
* @note This function shall be used only for BLE Peripheral role.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aAdvData A pointer to advertising data content in raw format.
* @param[in] aAdvDataLength The size of advertising data.
* Shall not exceed OT_BLE_ADV_DATA_MAX_LENGTH.
*
* @retval ::OT_ERROR_NONE Advertising data has been successfully set.
* @retval ::OT_ERROR_INVALID_ARGS Invalid advertising data has been supplied.
*/
otError otPlatBleGapAdvDataSet(otInstance *aInstance, const uint8_t *aAdvData, uint8_t aAdvDataLength);
/**
* Sets BLE Scan Response packet content.
*
* @note This function shall be used only for BLE Peripheral role.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aScanResponse A pointer to scan response data in raw format.
* @param[in] aScanResponseLength The size of scan response data.
* Shall not exceed OT_BLE_SCAN_RESPONSE_MAX_LENGTH.
*
* @retval ::OT_ERROR_NONE Scan response data has been successfully set.
* @retval ::OT_ERROR_INVALID_ARGS Invalid scan response data has been supplied.
*/
otError otPlatBleGapScanResponseSet(otInstance *aInstance, const uint8_t *aScanResponse, uint8_t aScanResponseLength);
/**
* 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.
* @param[in] aType The advertisement properties as a bitmask:
* whether it is connectable | scannable.
*
* @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, uint8_t aType);
/**
* 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 BLE 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 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);
/**
* Starts BLE Scanning procedure.
*
* @note This function shall be used only for BLE Central role.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aInterval The scanning interval in OT_BLE_SCAN_INTERVAL_UNIT
* units. Shall be in OT_BLE_SCAN_INTERVAL_MIN and
* OT_BLE_SCAN_INTERVAL_MAX range.
* @param[in] aWindow The scanning window in OT_BLE_SCAN_WINDOW_UNIT units.
* Shall be in OT_BLE_SCAN_WINDOW_MIN and OT_BLE_SCAN_WINDOW_MAX
* range.
*
* @retval ::OT_ERROR_NONE Scanning procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid interval or window value has been
* supplied.
*/
otError otPlatBleGapScanStart(otInstance *aInstance, uint16_t aInterval, uint16_t aWindow);
/**
* Stops BLE Scanning procedure.
*
* @note This function shall be used only for BLE Central role.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval ::OT_ERROR_NONE Scanning procedure has been stopped.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
*/
otError otPlatBleGapScanStop(otInstance *aInstance);
/**
* The BLE driver calls this method to notify OpenThread that an advertisement
* packet has been received.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aAddress An address of the advertising device.
* @param[in] aPacket A pointer to the received packet.
*
*/
extern void otPlatBleGapOnAdvReceived(otInstance *aInstance, otPlatBleDeviceAddr *aAddress, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that a scan response packet has been received.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aAddress An address of the advertising device.
* @param[in] aPacket A pointer to the received packet.
*
*/
extern void otPlatBleGapOnScanRespReceived(otInstance * aInstance,
otPlatBleDeviceAddr *aAddress,
otBleRadioPacket * aPacket);
/**
* Starts BLE Connection procedure.
*
* @note This function shall be used only for BLE Central role.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aAddress An address of the advertising device.
* @param[in] aInterval The scanning interval in OT_BLE_SCAN_INTERVAL_UNIT units. Shall be in
* OT_BLE_SCAN_INTERVAL_MIN and OT_BLE_SCAN_INTERVAL_MAX range.
* @param[in] aWindow The scanning window in OT_BLE_SCAN_WINDOW_UNIT units. Shall be in
* OT_BLE_SCAN_WINDOW_MIN and OT_BLE_SCAN_WINDOW_MAX range.
*
* @retval ::OT_ERROR_NONE Connection procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid address, interval or window value has been supplied.
*/
otError otPlatBleGapConnect(otInstance *aInstance, otPlatBleDeviceAddr *aAddress, uint16_t aInterval, uint16_t aWindow);
/**
* Disconnects BLE connection.
*
* The BLE device shall indicate the OT_BLE_HCI_REMOTE_USER_TERMINATED HCI code reason.
*
* @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.
*******************************************************************************/
/**
* Registers vendor specific UUID Base.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aUuid A pointer to vendor specific 128-bit UUID Base.
*
*/
otError otPlatBleGattVendorUuidRegister(otInstance *aInstance, const otPlatBleUuid *aUuid);
/**
* Reads currently use value of ATT_MTU.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[out] aMtu A pointer contains 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);
/*******************************************************************************
* @section Bluetooth Low Energy GATT Client.
******************************************************************************/
/**
* Sends ATT Read Request.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle of the attribute to be read.
*
* @retval ::OT_ERROR_NONE ATT Write Request has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid handle value has been supplied.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientRead(otInstance *aInstance, uint16_t aHandle);
/**
* The BLE driver calls this method to notify OpenThread that ATT Read Response
* packet has been received.
*
* This method is called only if @p otPlatBleGattClientRead was previously requested.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aPacket A pointer to the packet contains read value.
*
*/
extern void otPlatBleGattClientOnReadResponse(otInstance *aInstance, otBleRadioPacket *aPacket);
/**
* Sends ATT Write Request.
*
* @note This function shall be used only for GATT Client.
*
* @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.
*
* @retval ::OT_ERROR_NONE ATT Write Request 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 otPlatBleGattClientWrite(otInstance *aInstance, uint16_t aHandle, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that ATT Write Response
* packet has been received.
*
* This method is called only if @p otPlatBleGattClientWrite was previously requested.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle on which ATT Write Response has been sent.
*
*/
extern void otPlatBleGattClientOnWriteResponse(otInstance *aInstance, uint16_t aHandle);
/**
* Subscribes for characteristic indications.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle of the attribute to be written.
* @param[in] aSubscribing True if subscribing, otherwise unsubscribing.
*
* @retval ::OT_ERROR_NONE Subscription 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 otPlatBleGattClientSubscribeRequest(otInstance *aInstance, uint16_t aHandle, bool aSubscribing);
/**
* The BLE driver calls this method to notify OpenThread that subscribe response
* has been received.
*
* This method is called only if @p otPlatBleGattClienSubscribe was previously requested.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle on which ATT Write Response has been sent.
*
*/
extern void otPlatBleGattClientOnSubscribeResponse(otInstance *aInstance, uint16_t aHandle);
/**
* The BLE driver calls this method to notify OpenThread that an ATT Handle Value
* Indication has been received.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle on which ATT Handle Value Indication has been sent.
* @param[in] aPacket A pointer to the packet contains indicated value.
*
*/
extern void otPlatBleGattClientOnIndication(otInstance *aInstance, uint16_t aHandle, otBleRadioPacket *aPacket);
/**
* Performs GATT Primary Service Discovery of all services available.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
*
* @retval ::OT_ERROR_NONE Service Discovery procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid service UUID has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientServicesDiscover(otInstance *aInstance);
/**
* Performs GATT Primary Service Discovery by UUID procedure of specific service.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aUuid The UUID of a service to be registered.
*
* @retval ::OT_ERROR_NONE Service Discovery procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid service UUID has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientServiceDiscover(otInstance *aInstance, const otPlatBleUuid *aUuid);
/**
* The BLE driver calls this method to notify OpenThread that the next entry
* from GATT Primary Service Discovery has been found.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aStartHandle The start handle of a service.
* @param[in] aEndHandle The end handle of a service.
* @param[in] aServiceUuid The Uuid16 for the service entry.
* @param[in] aError The value of OT_ERROR_NONE indicates that service has been found
* and structure @p aStartHandle and @p aEndHandle contain valid handles.
* OT_ERROR_NOT_FOUND error should be set if service has not been found.
* Otherwise error indicates the reason of failure is used.
*
*/
extern void otPlatBleGattClientOnServiceDiscovered(otInstance *aInstance,
uint16_t aStartHandle,
uint16_t aEndHandle,
uint16_t aServiceUuid,
otError aError);
/**
* Performs GATT Characteristic Discovery of a service.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aStartHandle The start handle of a service.
* @param[in] aEndHandle The end handle of a service.
*
* @retval ::OT_ERROR_NONE Characteristic Discovery procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid start or end handle has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientCharacteristicsDiscover(otInstance *aInstance, uint16_t aStartHandle, uint16_t aEndHandle);
/**
* The BLE driver calls this method to notify OpenThread that GATT Characteristic
* Discovery of a service has been done.
*
* In case of success, all elements inside @p aChars should have a valid mHandleValue value.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aChars A pointer to discovered characteristic list.
* @param[in] aCount Number of characteristics in @p aChar list.
* @param[in] aError The value of OT_ERROR_NONE indicates that at least one characteristic
* has been found and the total number of them is stored in @p aCount.
* OT_ERROR_NOT_FOUND error should be set if no charactertistics are found.
* Otherwise error indicates the reason of failure is used.
*
*/
extern void otPlatBleGattClientOnCharacteristicsDiscoverDone(otInstance * aInstance,
otPlatBleGattCharacteristic *aChars,
uint16_t aCount,
otError aError);
/**
* Performs GATT Descriptor Discovery.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aStartHandle The start handle.
* @param[in] aEndHandle The end handle.
*
* @retval ::OT_ERROR_NONE Descriptor Discovery procedure has been started.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid start or end handle has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientDescriptorsDiscover(otInstance *aInstance, uint16_t aStartHandle, uint16_t aEndHandle);
/**
* The BLE driver calls this method to notify OpenThread that GATT Descriptor
* Discovery has been done.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aDescs A pointer to discovered descriptor list.
* @param[in] aCount Number of descriptors in @p aDescs list.
* @param[in] aError The value of OT_ERROR_NONE indicates that at least one descriptor
* has been found and the total number of them is stored in @p aCount.
* OT_ERROR_NOT_FOUND error should be set if no descriptors are found.
* Otherwise error indicates the reason of failure is used.
*
*/
extern void otPlatBleGattClientOnDescriptorsDiscoverDone(otInstance * aInstance,
otPlatBleGattDescriptor *aDescs,
uint16_t aCount,
otError aError);
/**
* Sends Exchange MTU Request.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aMtu A value of GATT Client receive MTU size.
*
* @retval ::OT_ERROR_NONE Exchange MTU Request has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid aMtu has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattClientMtuExchangeRequest(otInstance *aInstance, uint16_t aMtu);
/**
* The BLE driver calls this method to notify OpenThread that Exchange MTU
* Response has been received.
*
* @note This function shall be used only for GATT Client.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aMtu Attribute server receive MTU size.
* @param[in] aError The value of OT_ERROR_NONE indicates that valid
* Exchange MTU Response has been received. Otherwise error
* indicates the reason of failure is used.
*
*/
extern void otPlatBleGattClientOnMtuExchangeResponse(otInstance *aInstance, uint16_t aMtu, otError aError);
/*******************************************************************************
* @section Bluetooth Low Energy GATT Server.
******************************************************************************/
/**
* Registers a list of GATT Services and their enclosed Characteristics.
* The generated handles will be written back into this structure when the
* BLE stack is enabled.
*
* @note This function shall be used only for GATT Server.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aServices Null terminated array of service structures to register.
*
* @retval ::OT_ERROR_NONE Service has been successfully registered.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state.
* @retval ::OT_ERROR_INVALID_ARGS Invalid service UUID has been provided.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*/
otError otPlatBleGattServerServicesRegister(otInstance *aInstance, otPlatBleGattService *aServices);
/**
* 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, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an ATT Handle
* Value Confirmation has been received.
*
* This method is called only if @p otPlatBleGattServerIndicate was previously requested.
*
* @note This function shall be used only for GATT Server.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aHandle The handle on which ATT Handle Value Confirmation has been sent.
*
*/
extern void otPlatBleGattServerOnIndicationConfirmation(otInstance *aInstance, uint16_t aHandle);
/**
* 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, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an ATT Read 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 read.
* @param[out] aPacket A pointer to the packet to be filled with pointers to attribute data to be read.
*
*/
extern void otPlatBleGattServerOnReadRequest(otInstance *aInstance, uint16_t aHandle, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an ATT Subscription
* 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] aSubscribing True if subscribing, otherwise unsubscribing.
*
*/
extern void otPlatBleGattServerOnSubscribeRequest(otInstance *aInstance, uint16_t aHandle, bool aSubscribing);
/****************************************************************************
* @section Bluetooth Low Energy L2CAP Connection Oriented Channels.
***************************************************************************/
/**
* Sends LE Credit Based Connection Request.
*
* @note Platform layer is responsible for credits management and segmentation (MPS).
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aPsm The value of LE Protocol/Service Multiplexer.
* @param[in] aMtu The value specifies the maximum SDU size (in octets) that the L2CAP
* layer entity sending the LE Credit Based Connection Request can receive
* on this channel.
* @param[out] aCid The source CID represents a channel endpoint on the device.
*
* @retval ::OT_ERROR_NONE LE Credit Based Connection Request has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state e.g. not in the GAP connection.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*
*/
otError otPlatBleL2capConnectionRequest(otInstance *aInstance, uint16_t aPsm, uint16_t aMtu, uint16_t *aCid);
/**
* The BLE driver calls this method to notify OpenThread that an LE Credit Based Connection
* Request packet has been received.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aPsm The value of LE Protocol/Service Multiplexer.
* @param[in] aMtu The value specifies the maximum SDU size (in octets) that the L2CAP
* layer entity sending the LE Credit Based Connection Request can receive
* on this channel.
* @param[in] aPeerCid The CID represents a channel endpoint on the peer device.
*
*/
extern void otPlatBleL2capOnConnectionRequest(otInstance *aInstance, uint16_t aPsm, uint16_t aMtu, uint16_t aPeerCid);
/**
* Sends LE Credit Based Connection Response.
*
* @note Platform layer is responsible for credits management and segmentation (MPS).
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aError The error value indicates the outcome of the connection request.
* @param[in] aMtu The value specifies the maximum SDU size (in octets) that the L2CAP
* layer entity sending the LE Credit Based Connection Response can receive
* on this channel.
* @param[out] aCid The source CID represents a channel endpoint on the device. If @p aResult
* value is different from @p OT_BLE_L2C_ERROR_NONE, this variable is
* unused and should be set to NULL.
*
* @retval ::OT_ERROR_NONE LE Credit Based Connection Response has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state e.g. not in the GAP connection.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*
*/
otError otPlatBleL2capConnectionResponse(otInstance * aInstance,
otPlatBleL2capError aError,
uint16_t aMtu,
uint16_t * aCid);
/**
* The BLE driver calls this method to notify OpenThread that an LE Credit Based Connection
* Response packet has been received.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aError The error value indicates the outcome of the connection request.
* @param[in] aMtu The value specifies the maximum SDU size (in octets) that the L2CAP
* layer entity sending the LE Credit Based Connection Response can receive
* on this channel.
* @param[in] aPeerCid The CID represents a channel endpoint on the peer device.
*
*/
extern void otPlatBleL2capOnConnectionResponse(otInstance * aInstance,
otPlatBleL2capError aError,
uint16_t aMtu,
uint16_t aPeerCid);
/**
* Sends an SDU on an L2CAP channel.
*
* @note Platform layer is responsible for credits management and segmentation (MPS).
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aLocalCid The local channel endpoint ID value.
* @param[in] aPeerCid The peer channel endpoint ID value.
* @param[in] aPacket A pointer to the packet containing SDU.
*
* @retval ::OT_ERROR_NONE LE Credit Based Connection Request has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state e.g. not in the GAP connection.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*
*/
otError otPlatBleL2capSduSend(otInstance *aInstance, uint16_t aLocalCid, uint16_t aPeerCid, otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an L2CAP SDU has been received.
*
* @note Platform layer is responsible for credits management and segmentation (MPS).
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aLocalCid The local channel endpoint ID value.
* @param[in] aPeerCid The peer channel endpoint ID value.
* @param[in] aPacket A pointer to the packet containing SDU.
*
*/
extern void otPlatBleL2capOnSduReceived(otInstance * aInstance,
uint16_t aLocalCid,
uint16_t aPeerCid,
otBleRadioPacket *aPacket);
/**
* The BLE driver calls this method to notify OpenThread that an L2CAP SDU has been sent.
*
* @param[in] aInstance The OpenThread instance structure.
*
*/
extern void otPlatBleL2capOnSduSent(otInstance *aInstance);
/**
* Sends an L2CAP Disconnection Request.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aLocalCid The local channel endpoint ID value.
* @param[in] aPeerCid The peer channel endpoint ID value.
*
* @retval ::OT_ERROR_NONE L2CAP Disconnection Request has been sent.
* @retval ::OT_ERROR_INVALID_STATE BLE Device is in invalid state e.g. not in the GAP connection.
* @retval ::OT_ERROR_INVALID_ARGS Invalid parameters has been supplied.
* @retval ::OT_ERROR_NO_BUFS No available internal buffer found.
*
*/
otError otPlatBleL2capDisconnect(otInstance *aInstance, uint16_t aLocalCid, uint16_t aPeerCid);
/**
* The BLE driver calls this method to notify OpenThread that an L2CAP Disconnection Request has been
* received.
*
* @note Platform layer is responsible to response with L2CAP Disconnection Response internally.
*
* @param[in] aInstance The OpenThread instance structure.
* @param[in] aLocalCid The local channel endpoint ID value.
* @param[in] aPeerCid The peer channel endpoint ID value.
*
*/
extern void otPlatBleL2capOnDisconnect(otInstance *aInstance, uint16_t aLocalCid, uint16_t aPeerCid);
/**
* @}
*
*/
#ifdef __cplusplus
} // end of extern "C"
#endif
#endif // OT_PLATFORM_BLE_H_