Periodic advertising synchronization create had a timeout set to fixed value of 10 seconds. BT 5.3 Core specification defines synchronization timeout as 6 consecutive periodic advertising events. When advertiser set the periodic interval to be more than 1.6 second it was possible the application timeout is reached before time allowed by BT Core specification. Changed implementation of timeout to depend on the periodic advertising interval. Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no>
338 lines
13 KiB
C
338 lines
13 KiB
C
/** @file
|
|
* @brief Bluetooth Generic Access Profile defines and Assigned Numbers.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2019 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_GAP_H_
|
|
#define ZEPHYR_INCLUDE_BLUETOOTH_GAP_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Bluetooth Generic Access Profile defines and Assigned Numbers.
|
|
* @defgroup bt_gap_defines Defines and Assigned Numbers
|
|
* @ingroup bluetooth
|
|
* @{
|
|
*/
|
|
|
|
/** Company Identifiers (see Bluetooth Assigned Numbers) */
|
|
#define BT_COMP_ID_LF 0x05f1 /* The Linux Foundation */
|
|
|
|
/** EIR/AD data type definitions */
|
|
#define BT_DATA_FLAGS 0x01 /* AD flags */
|
|
#define BT_DATA_UUID16_SOME 0x02 /* 16-bit UUID, more available */
|
|
#define BT_DATA_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
|
|
#define BT_DATA_UUID32_SOME 0x04 /* 32-bit UUID, more available */
|
|
#define BT_DATA_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
|
|
#define BT_DATA_UUID128_SOME 0x06 /* 128-bit UUID, more available */
|
|
#define BT_DATA_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
|
|
#define BT_DATA_NAME_SHORTENED 0x08 /* Shortened name */
|
|
#define BT_DATA_NAME_COMPLETE 0x09 /* Complete name */
|
|
#define BT_DATA_TX_POWER 0x0a /* Tx Power */
|
|
#define BT_DATA_SM_TK_VALUE 0x10 /* Security Manager TK Value */
|
|
#define BT_DATA_SM_OOB_FLAGS 0x11 /* Security Manager OOB Flags */
|
|
#define BT_DATA_SOLICIT16 0x14 /* Solicit UUIDs, 16-bit */
|
|
#define BT_DATA_SOLICIT128 0x15 /* Solicit UUIDs, 128-bit */
|
|
#define BT_DATA_SVC_DATA16 0x16 /* Service data, 16-bit UUID */
|
|
#define BT_DATA_GAP_APPEARANCE 0x19 /* GAP appearance */
|
|
#define BT_DATA_LE_BT_DEVICE_ADDRESS 0x1b /* LE Bluetooth Device Address */
|
|
#define BT_DATA_LE_ROLE 0x1c /* LE Role */
|
|
#define BT_DATA_SOLICIT32 0x1f /* Solicit UUIDs, 32-bit */
|
|
#define BT_DATA_SVC_DATA32 0x20 /* Service data, 32-bit UUID */
|
|
#define BT_DATA_SVC_DATA128 0x21 /* Service data, 128-bit UUID */
|
|
#define BT_DATA_LE_SC_CONFIRM_VALUE 0x22 /* LE SC Confirmation Value */
|
|
#define BT_DATA_LE_SC_RANDOM_VALUE 0x23 /* LE SC Random Value */
|
|
#define BT_DATA_URI 0x24 /* URI */
|
|
#define BT_DATA_LE_SUPPORTED_FEATURES 0x27 /* LE Supported Features */
|
|
#define BT_DATA_CHANNEL_MAP_UPDATE_IND 0x28 /* Channel Map Update Indication */
|
|
#define BT_DATA_MESH_PROV 0x29 /* Mesh Provisioning PDU */
|
|
#define BT_DATA_MESH_MESSAGE 0x2a /* Mesh Networking PDU */
|
|
#define BT_DATA_MESH_BEACON 0x2b /* Mesh Beacon */
|
|
#define BT_DATA_BIG_INFO 0x2c /* BIGInfo */
|
|
#define BT_DATA_BROADCAST_CODE 0x2d /* Broadcast Code */
|
|
#define BT_DATA_CSIS_RSI 0x2e /* CSIS Random Set ID type */
|
|
|
|
#define BT_DATA_MANUFACTURER_DATA 0xff /* Manufacturer Specific Data */
|
|
|
|
#define BT_LE_AD_LIMITED 0x01 /* Limited Discoverable */
|
|
#define BT_LE_AD_GENERAL 0x02 /* General Discoverable */
|
|
#define BT_LE_AD_NO_BREDR 0x04 /* BR/EDR not supported */
|
|
|
|
/* Defined GAP timers */
|
|
#define BT_GAP_SCAN_FAST_INTERVAL 0x0060 /* 60 ms */
|
|
#define BT_GAP_SCAN_FAST_WINDOW 0x0030 /* 30 ms */
|
|
#define BT_GAP_SCAN_SLOW_INTERVAL_1 0x0800 /* 1.28 s */
|
|
#define BT_GAP_SCAN_SLOW_WINDOW_1 0x0012 /* 11.25 ms */
|
|
#define BT_GAP_SCAN_SLOW_INTERVAL_2 0x1000 /* 2.56 s */
|
|
#define BT_GAP_SCAN_SLOW_WINDOW_2 0x0012 /* 11.25 ms */
|
|
#define BT_GAP_ADV_FAST_INT_MIN_1 0x0030 /* 30 ms */
|
|
#define BT_GAP_ADV_FAST_INT_MAX_1 0x0060 /* 60 ms */
|
|
#define BT_GAP_ADV_FAST_INT_MIN_2 0x00a0 /* 100 ms */
|
|
#define BT_GAP_ADV_FAST_INT_MAX_2 0x00f0 /* 150 ms */
|
|
#define BT_GAP_ADV_SLOW_INT_MIN 0x0640 /* 1 s */
|
|
#define BT_GAP_ADV_SLOW_INT_MAX 0x0780 /* 1.2 s */
|
|
#define BT_GAP_PER_ADV_FAST_INT_MIN_1 0x0018 /* 30 ms */
|
|
#define BT_GAP_PER_ADV_FAST_INT_MAX_1 0x0030 /* 60 ms */
|
|
#define BT_GAP_PER_ADV_FAST_INT_MIN_2 0x0050 /* 100 ms */
|
|
#define BT_GAP_PER_ADV_FAST_INT_MAX_2 0x0078 /* 150 ms */
|
|
#define BT_GAP_PER_ADV_SLOW_INT_MIN 0x0320 /* 1 s */
|
|
#define BT_GAP_PER_ADV_SLOW_INT_MAX 0x03C0 /* 1.2 s */
|
|
#define BT_GAP_INIT_CONN_INT_MIN 0x0018 /* 30 ms */
|
|
#define BT_GAP_INIT_CONN_INT_MAX 0x0028 /* 50 ms */
|
|
|
|
/** LE PHY types */
|
|
enum {
|
|
/** Convenience macro for when no PHY is set. */
|
|
BT_GAP_LE_PHY_NONE = 0,
|
|
/** LE 1M PHY */
|
|
BT_GAP_LE_PHY_1M = BIT(0),
|
|
/** LE 2M PHY */
|
|
BT_GAP_LE_PHY_2M = BIT(1),
|
|
/** LE Coded PHY */
|
|
BT_GAP_LE_PHY_CODED = BIT(2),
|
|
};
|
|
|
|
/** Advertising PDU types */
|
|
enum {
|
|
/** Scannable and connectable advertising. */
|
|
BT_GAP_ADV_TYPE_ADV_IND = 0x00,
|
|
/** Directed connectable advertising. */
|
|
BT_GAP_ADV_TYPE_ADV_DIRECT_IND = 0x01,
|
|
/** Non-connectable and scannable advertising. */
|
|
BT_GAP_ADV_TYPE_ADV_SCAN_IND = 0x02,
|
|
/** Non-connectable and non-scannable advertising. */
|
|
BT_GAP_ADV_TYPE_ADV_NONCONN_IND = 0x03,
|
|
/** Additional advertising data requested by an active scanner. */
|
|
BT_GAP_ADV_TYPE_SCAN_RSP = 0x04,
|
|
/** Extended advertising, see advertising properties. */
|
|
BT_GAP_ADV_TYPE_EXT_ADV = 0x05,
|
|
};
|
|
|
|
/** Advertising PDU properties */
|
|
enum {
|
|
/** Connectable advertising. */
|
|
BT_GAP_ADV_PROP_CONNECTABLE = BIT(0),
|
|
/** Scannable advertising. */
|
|
BT_GAP_ADV_PROP_SCANNABLE = BIT(1),
|
|
/** Directed advertising. */
|
|
BT_GAP_ADV_PROP_DIRECTED = BIT(2),
|
|
/** Additional advertising data requested by an active scanner. */
|
|
BT_GAP_ADV_PROP_SCAN_RESPONSE = BIT(3),
|
|
/** Extended advertising. */
|
|
BT_GAP_ADV_PROP_EXT_ADV = BIT(4),
|
|
};
|
|
|
|
/** Maximum advertising data length. */
|
|
#define BT_GAP_ADV_MAX_ADV_DATA_LEN 31
|
|
/** Maximum extended advertising data length.
|
|
*
|
|
* @note The maximum advertising data length that can be sent by an extended
|
|
* advertiser is defined by the controller.
|
|
*/
|
|
#define BT_GAP_ADV_MAX_EXT_ADV_DATA_LEN 1650
|
|
|
|
#define BT_GAP_TX_POWER_INVALID 0x7f
|
|
#define BT_GAP_RSSI_INVALID 0x7f
|
|
#define BT_GAP_SID_INVALID 0xff
|
|
#define BT_GAP_NO_TIMEOUT 0x0000
|
|
|
|
/* The maximum allowed high duty cycle directed advertising timeout, 1.28
|
|
* seconds in 10 ms unit.
|
|
*/
|
|
#define BT_GAP_ADV_HIGH_DUTY_CYCLE_MAX_TIMEOUT 128
|
|
|
|
#define BT_GAP_DATA_LEN_DEFAULT 0x001b /* 27 bytes */
|
|
#define BT_GAP_DATA_LEN_MAX 0x00fb /* 251 bytes */
|
|
|
|
#define BT_GAP_DATA_TIME_DEFAULT 0x0148 /* 328 us */
|
|
#define BT_GAP_DATA_TIME_MAX 0x4290 /* 17040 us */
|
|
|
|
#define BT_GAP_SID_MAX 0x0F
|
|
#define BT_GAP_PER_ADV_MAX_SKIP 0x01F3
|
|
#define BT_GAP_PER_ADV_MIN_TIMEOUT 0x000A
|
|
#define BT_GAP_PER_ADV_MAX_TIMEOUT 0x4000
|
|
/** Minimum Periodic Advertising Interval (N * 1.25 ms) */
|
|
#define BT_GAP_PER_ADV_MIN_INTERVAL 0x0006
|
|
/** Maximum Periodic Advertising Interval (N * 1.25 ms) */
|
|
#define BT_GAP_PER_ADV_MAX_INTERVAL 0xFFFF
|
|
|
|
/**
|
|
* @brief Convert periodic advertising interval (N * 1.25 ms) to milliseconds
|
|
*
|
|
* 5 / 4 represents 1.25 ms unit.
|
|
*/
|
|
#define BT_GAP_PER_ADV_INTERVAL_TO_MS(interval) ((interval) * 5 / 4)
|
|
|
|
/** Constant Tone Extension (CTE) types */
|
|
enum {
|
|
/** Angle of Arrival */
|
|
BT_GAP_CTE_AOA = 0x00,
|
|
/** Angle of Departure with 1 us slots */
|
|
BT_GAP_CTE_AOD_1US = 0x01,
|
|
/** Angle of Departure with 2 us slots */
|
|
BT_GAP_CTE_AOD_2US = 0x02,
|
|
/** No extensions */
|
|
BT_GAP_CTE_NONE = 0xFF,
|
|
};
|
|
|
|
/** @brief Peripheral sleep clock accuracy (SCA) in ppm (parts per million) */
|
|
enum {
|
|
BT_GAP_SCA_UNKNOWN = 0,
|
|
BT_GAP_SCA_251_500 = 0,
|
|
BT_GAP_SCA_151_250 = 1,
|
|
BT_GAP_SCA_101_150 = 2,
|
|
BT_GAP_SCA_76_100 = 3,
|
|
BT_GAP_SCA_51_75 = 4,
|
|
BT_GAP_SCA_31_50 = 5,
|
|
BT_GAP_SCA_21_30 = 6,
|
|
BT_GAP_SCA_0_20 = 7,
|
|
};
|
|
|
|
/**
|
|
* @brief Encode 40 least significant bits of 64-bit LE Supported Features into array values
|
|
* in little-endian format.
|
|
*
|
|
* Helper macro to encode 40 least significant bits of 64-bit LE Supported Features value into
|
|
* advertising data. The number of bits that are encoded is a number of LE Supported Features
|
|
* defined by BT 5.3 Core specification.
|
|
*
|
|
* Example of how to encode the `0x000000DFF00DF00D` into advertising data.
|
|
*
|
|
* @code
|
|
* BT_DATA_BYTES(BT_DATA_LE_SUPPORTED_FEATURES, BT_LE_SUPP_FEAT_40_ENCODE(0x000000DFF00DF00D))
|
|
* @endcode
|
|
*
|
|
* @param w64 LE Supported Features value (64-bits)
|
|
*
|
|
* @return The comma separated values for LE Supported Features value that
|
|
* may be used directly as an argument for @ref BT_DATA_BYTES.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_40_ENCODE(w64) \
|
|
(((w64) >> 0) & 0xFF), \
|
|
(((w64) >> 8) & 0xFF), \
|
|
(((w64) >> 16) & 0xFF), \
|
|
(((w64) >> 24) & 0xFF), \
|
|
(((w64) >> 32) & 0xFF)
|
|
|
|
/** @brief Encode 4 least significant bytes of 64-bit LE Supported Features into
|
|
* 4 bytes long array of values in little-endian format.
|
|
*
|
|
* Helper macro to encode 64-bit LE Supported Features value into advertising
|
|
* data. The macro encodes 4 least significant bytes into advertising data.
|
|
* Other 4 bytes are not encoded.
|
|
*
|
|
* Example of how to encode the `0x000000DFF00DF00D` into advertising data.
|
|
*
|
|
* @code
|
|
* BT_DATA_BYTES(BT_DATA_LE_SUPPORTED_FEATURES, BT_LE_SUPP_FEAT_32_ENCODE(0x000000DFF00DF00D))
|
|
* @endcode
|
|
*
|
|
* @param w64 LE Supported Features value (64-bits)
|
|
*
|
|
* @return The comma separated values for LE Supported Features value that
|
|
* may be used directly as an argument for @ref BT_DATA_BYTES.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_32_ENCODE(w64) \
|
|
(((w64) >> 0) & 0xFF), \
|
|
(((w64) >> 8) & 0xFF), \
|
|
(((w64) >> 16) & 0xFF), \
|
|
(((w64) >> 24) & 0xFF)
|
|
|
|
/**
|
|
* @brief Encode 3 least significant bytes of 64-bit LE Supported Features into
|
|
* 3 bytes long array of values in little-endian format.
|
|
*
|
|
* Helper macro to encode 64-bit LE Supported Features value into advertising
|
|
* data. The macro encodes 3 least significant bytes into advertising data.
|
|
* Other 5 bytes are not encoded.
|
|
*
|
|
* Example of how to encode the `0x000000DFF00DF00D` into advertising data.
|
|
*
|
|
* @code
|
|
* BT_DATA_BYTES(BT_DATA_LE_SUPPORTED_FEATURES, BT_LE_SUPP_FEAT_24_ENCODE(0x000000DFF00DF00D))
|
|
* @endcode
|
|
*
|
|
* @param w64 LE Supported Features value (64-bits)
|
|
*
|
|
* @return The comma separated values for LE Supported Features value that
|
|
* may be used directly as an argument for @ref BT_DATA_BYTES.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_24_ENCODE(w64) \
|
|
(((w64) >> 0) & 0xFF), \
|
|
(((w64) >> 8) & 0xFF), \
|
|
(((w64) >> 16) & 0xFF),
|
|
|
|
/**
|
|
* @brief Encode 2 least significant bytes of 64-bit LE Supported Features into
|
|
* 2 bytes long array of values in little-endian format.
|
|
*
|
|
* Helper macro to encode 64-bit LE Supported Features value into advertising
|
|
* data. The macro encodes 3 least significant bytes into advertising data.
|
|
* Other 6 bytes are not encoded.
|
|
*
|
|
* Example of how to encode the `0x000000DFF00DF00D` into advertising data.
|
|
*
|
|
* @code
|
|
* BT_DATA_BYTES(BT_DATA_LE_SUPPORTED_FEATURES, BT_LE_SUPP_FEAT_16_ENCODE(0x000000DFF00DF00D))
|
|
* @endcode
|
|
*
|
|
* @param w64 LE Supported Features value (64-bits)
|
|
*
|
|
* @return The comma separated values for LE Supported Features value that
|
|
* may be used directly as an argument for @ref BT_DATA_BYTES.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_16_ENCODE(w64) \
|
|
(((w64) >> 0) & 0xFF), \
|
|
(((w64) >> 8) & 0xFF),
|
|
|
|
/**
|
|
* @brief Encode the least significant byte of 64-bit LE Supported Features into
|
|
* single byte long array.
|
|
*
|
|
* Helper macro to encode 64-bit LE Supported Features value into advertising
|
|
* data. The macro encodes the least significant byte into advertising data.
|
|
* Other 7 bytes are not encoded.
|
|
*
|
|
* Example of how to encode the `0x000000DFF00DF00D` into advertising data.
|
|
*
|
|
* @code
|
|
* BT_DATA_BYTES(BT_DATA_LE_SUPPORTED_FEATURES, BT_LE_SUPP_FEAT_8_ENCODE(0x000000DFF00DF00D))
|
|
* @endcode
|
|
*
|
|
* @param w64 LE Supported Features value (64-bits)
|
|
*
|
|
* @return The value of least significant byte of LE Supported Features value
|
|
* that may be used directly as an argument for @ref BT_DATA_BYTES.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_8_ENCODE(w64) \
|
|
(((w64) >> 0) & 0xFF)
|
|
|
|
/**
|
|
* @brief Validate wheather LE Supported Features value does not use bits that are reserved for
|
|
* future use.
|
|
*
|
|
* Helper macro to check if @p w64 has zeros as bits 40-63. The macro is compliant with BT 5.3
|
|
* Core Specifiaction where bits 0-40 has assigned values. In case of invalid value, build time
|
|
* error is reported.
|
|
*/
|
|
#define BT_LE_SUPP_FEAT_VALIDATE(w64) \
|
|
BUILD_ASSERT(!((w64) & (~BIT64_MASK(40))), \
|
|
"RFU bit in LE Supported Features are not zeros.")
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_GAP_H_ */
|