1 /** @file 2 * @brief Bluetooth Channel Sounding handling 3 */ 4 5 /* 6 * Copyright (c) 2024 Nordic Semiconductor ASA 7 * 8 * SPDX-License-Identifier: Apache-2.0 9 */ 10 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_CS_H_ 11 #define ZEPHYR_INCLUDE_BLUETOOTH_CS_H_ 12 13 /** 14 * @brief LE Channel Sounding (CS) 15 * @defgroup bt_le_cs Channel Sounding (CS) 16 * @ingroup bluetooth 17 * @{ 18 */ 19 20 #include <stdint.h> 21 #include <stdbool.h> 22 23 #include <zephyr/bluetooth/hci_types.h> 24 #include <zephyr/bluetooth/conn.h> 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 /** 31 * @brief Macro for getting a specific channel bit in CS channel map 32 * 33 * @param[in] chmap Channel map array 34 * @param[in] bit Bit number to be accessed 35 * 36 * @return Bit value, either 1 or 0 37 */ 38 #define BT_LE_CS_CHANNEL_BIT_GET(chmap, bit) (((chmap)[(bit) / 8] >> ((bit) % 8)) & 1) 39 40 /** 41 * @brief Macro for setting a specific channel bit value in CS channel map 42 * 43 * @param[in] chmap Channel map array 44 * @param[in] bit Bit number to be accessed 45 * @param[in] val Bit value to be set, either 1 or 0 46 */ 47 #define BT_LE_CS_CHANNEL_BIT_SET_VAL(chmap, bit, val) \ 48 ((chmap)[(bit) / 8] = ((chmap)[(bit) / 8] & ~BIT((bit) % 8)) | ((val) << ((bit) % 8))) 49 50 enum bt_le_cs_sync_antenna_selection_opt { 51 /** Use antenna identifier 1 for CS_SYNC packets. */ 52 BT_LE_CS_ANTENNA_SELECTION_OPT_ONE = BT_HCI_OP_LE_CS_ANTENNA_SEL_ONE, 53 /** Use antenna identifier 2 for CS_SYNC packets. */ 54 BT_LE_CS_ANTENNA_SELECTION_OPT_TWO = BT_HCI_OP_LE_CS_ANTENNA_SEL_TWO, 55 /** Use antenna identifier 3 for CS_SYNC packets. */ 56 BT_LE_CS_ANTENNA_SELECTION_OPT_THREE = BT_HCI_OP_LE_CS_ANTENNA_SEL_THREE, 57 /** Use antenna identifier 4 for CS_SYNC packets. */ 58 BT_LE_CS_ANTENNA_SELECTION_OPT_FOUR = BT_HCI_OP_LE_CS_ANTENNA_SEL_FOUR, 59 /** Use antennas in repetitive order from 1 to 4 for CS_SYNC packets. */ 60 BT_LE_CS_ANTENNA_SELECTION_OPT_REPETITIVE = BT_HCI_OP_LE_CS_ANTENNA_SEL_REP, 61 /** No recommendation for local controller antenna selection. */ 62 BT_LE_CS_ANTENNA_SELECTION_OPT_NO_RECOMMENDATION = BT_HCI_OP_LE_CS_ANTENNA_SEL_NONE, 63 }; 64 65 /** Default CS settings in the local Controller */ 66 struct bt_le_cs_set_default_settings_param { 67 /** Enable CS initiator role. */ 68 bool enable_initiator_role; 69 /** Enable CS reflector role. */ 70 bool enable_reflector_role; 71 /** Antenna identifier to be used for CS_SYNC packets by the local controller. 72 */ 73 enum bt_le_cs_sync_antenna_selection_opt cs_sync_antenna_selection; 74 /** Maximum output power (Effective Isotropic Radiated Power) to be used 75 * for all CS transmissions. 76 * 77 * Value range is @ref BT_HCI_OP_LE_CS_MIN_MAX_TX_POWER to 78 * @ref BT_HCI_OP_LE_CS_MAX_MAX_TX_POWER. 79 */ 80 int8_t max_tx_power; 81 }; 82 83 /** CS Test CS_SYNC Antenna Identifier */ 84 enum bt_le_cs_test_cs_sync_antenna_selection { 85 BT_LE_CS_TEST_CS_SYNC_ANTENNA_SELECTION_ONE = BT_HCI_OP_LE_CS_ANTENNA_SEL_ONE, 86 BT_LE_CS_TEST_CS_SYNC_ANTENNA_SELECTION_TWO = BT_HCI_OP_LE_CS_ANTENNA_SEL_TWO, 87 BT_LE_CS_TEST_CS_SYNC_ANTENNA_SELECTION_THREE = BT_HCI_OP_LE_CS_ANTENNA_SEL_THREE, 88 BT_LE_CS_TEST_CS_SYNC_ANTENNA_SELECTION_FOUR = BT_HCI_OP_LE_CS_ANTENNA_SEL_FOUR, 89 }; 90 91 /** CS SNR control options */ 92 enum bt_le_cs_snr_control { 93 BT_LE_CS_SNR_CONTROL_18dB = BT_HCI_OP_LE_CS_SNR_18, 94 BT_LE_CS_SNR_CONTROL_21dB = BT_HCI_OP_LE_CS_SNR_21, 95 BT_LE_CS_SNR_CONTROL_24dB = BT_HCI_OP_LE_CS_SNR_24, 96 BT_LE_CS_SNR_CONTROL_27dB = BT_HCI_OP_LE_CS_SNR_27, 97 BT_LE_CS_SNR_CONTROL_30dB = BT_HCI_OP_LE_CS_SNR_30, 98 BT_LE_CS_SNR_CONTROL_NOT_USED = BT_HCI_OP_LE_CS_SNR_NOT_USED, 99 }; 100 101 /** CS Test Override 3 T_PM Tone Extension */ 102 enum bt_le_cs_test_override_3_pm_tone_ext { 103 /** Initiator and reflector tones sent without tone extension */ 104 BT_LE_CS_TEST_OVERRIDE_3_NO_TONE_EXT = BT_HCI_OP_LE_CS_TEST_TONE_EXT_NONE, 105 /** Initiator tone sent with extension, reflector tone sent without tone extension */ 106 BT_LE_CS_TEST_OVERRIDE_3_INITIATOR_TONE_EXT_ONLY = BT_HCI_OP_LE_CS_TEST_TONE_EXT_INIT, 107 /** Initiator tone sent without extension, reflector tone sent with tone extension */ 108 BT_LE_CS_TEST_OVERRIDE_3_REFLECTOR_TONE_EXT_ONLY = BT_HCI_OP_LE_CS_TEST_TONE_EXT_REFL, 109 /** Initiator and reflector tones sent with tone extension */ 110 BT_LE_CS_TEST_OVERRIDE_3_INITIATOR_AND_REFLECTOR_TONE_EXT = 111 BT_HCI_OP_LE_CS_TEST_TONE_EXT_BOTH, 112 /** Applicable for mode-2 and mode-3 only: 113 * 114 * Loop through: 115 * - @ref BT_LE_CS_TEST_OVERRIDE_3_NO_TONE_EXT 116 * - @ref BT_LE_CS_TEST_OVERRIDE_3_INITIATOR_TONE_EXT_ONLY 117 * - @ref BT_LE_CS_TEST_OVERRIDE_3_REFLECTOR_TONE_EXT_ONLY 118 * - @ref BT_LE_CS_TEST_OVERRIDE_3_INITIATOR_AND_REFLECTOR_TONE_EXT 119 */ 120 BT_LE_CS_TEST_OVERRIDE_3_REPETITIVE_TONE_EXT = BT_HCI_OP_LE_CS_TEST_TONE_EXT_REPEAT, 121 }; 122 123 /** CS Test Override 4 Tone Antenna Permutation. 124 * 125 * These values represent indices in an antenna path permutation table. 126 * 127 * Which table is applicable (and which indices are valid) 128 * depends on the maximum number of antenna paths (N_AP). 129 * 130 * If N_AP = 2, the permutation table is: 131 * 132 * +--------------------------------+------------------------------------------+ 133 * | Antenna Path Permutation Index | Antenna Path Positions After Permutation | 134 * +--------------------------------+------------------------------------------+ 135 * | 0 | A1 A2 | 136 * | 1 | A2 A1 | 137 * +--------------------------------+------------------------------------------+ 138 * 139 * If N_AP = 3, the permutation table is: 140 * 141 * +--------------------------------+------------------------------------------+ 142 * | Antenna Path Permutation Index | Antenna Path Positions After Permutation | 143 * +--------------------------------+------------------------------------------+ 144 * | 0 | A1 A2 A3 | 145 * | 1 | A2 A1 A3 | 146 * | 2 | A1 A3 A2 | 147 * | 3 | A3 A1 A2 | 148 * | 4 | A3 A2 A1 | 149 * | 5 | A2 A3 A1 | 150 * +--------------------------------+------------------------------------------+ 151 * 152 * If N_AP = 4, the permutation table is: 153 * 154 * +--------------------------------+------------------------------------------+ 155 * | Antenna Path Permutation Index | Antenna Path Positions After Permutation | 156 * +--------------------------------+------------------------------------------+ 157 * | 0 | A1 A2 A3 A4 | 158 * | 1 | A2 A1 A3 A4 | 159 * | 2 | A1 A3 A2 A4 | 160 * | 3 | A3 A1 A2 A4 | 161 * | 4 | A3 A2 A1 A4 | 162 * | 5 | A2 A3 A1 A4 | 163 * | 6 | A1 A2 A4 A3 | 164 * | 7 | A2 A1 A4 A3 | 165 * | 8 | A1 A4 A2 A3 | 166 * | 9 | A4 A1 A2 A3 | 167 * | 10 | A4 A2 A1 A3 | 168 * | 11 | A2 A4 A1 A3 | 169 * | 12 | A1 A4 A3 A2 | 170 * | 13 | A4 A1 A3 A2 | 171 * | 14 | A1 A3 A4 A2 | 172 * | 15 | A3 A1 A4 A2 | 173 * | 16 | A3 A4 A1 A2 | 174 * | 17 | A4 A3 A1 A2 | 175 * | 18 | A4 A2 A3 A1 | 176 * | 19 | A2 A4 A3 A1 | 177 * | 20 | A4 A3 A2 A1 | 178 * | 21 | A3 A4 A2 A1 | 179 * | 22 | A3 A2 A4 A1 | 180 * | 23 | A2 A3 A4 A1 | 181 * +--------------------------------+------------------------------------------+ 182 */ 183 enum bt_le_cs_test_override_4_tone_antenna_permutation { 184 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_00 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_00, 185 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_01 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_01, 186 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_02 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_02, 187 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_03 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_03, 188 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_04 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_04, 189 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_05 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_05, 190 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_06 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_06, 191 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_07 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_07, 192 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_08 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_08, 193 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_09 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_09, 194 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_10 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_10, 195 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_11 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_11, 196 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_12 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_12, 197 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_13 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_13, 198 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_14 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_14, 199 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_15 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_15, 200 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_16 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_16, 201 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_17 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_17, 202 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_18 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_18, 203 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_19 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_19, 204 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_20 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_20, 205 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_21 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_21, 206 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_22 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_22, 207 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_23 = BT_HCI_OP_LE_CS_TEST_AP_INDEX_23, 208 /** Loop through all valid Antenna Permutation Indices starting 209 * from the lowest index. 210 */ 211 BT_LE_CS_TEST_OVERRIDE_4_ANTENNA_PERMUTATION_INDEX_LOOP = 212 BT_HCI_OP_LE_CS_TEST_AP_INDEX_LOOP, 213 }; 214 215 /** CS Test Override 7 Sounding Sequence Marker Value */ 216 enum bt_le_cs_test_override_7_ss_marker_value { 217 BT_LE_CS_TEST_OVERRIDE_7_SS_MARKER_VAL_0011 = BT_HCI_OP_LE_CS_TEST_SS_MARKER_VAL_0011, 218 BT_LE_CS_TEST_OVERRIDE_7_SS_MARKER_VAL_1100 = BT_HCI_OP_LE_CS_TEST_SS_MARKER_VAL_1100, 219 /** Loop through pattern '0011' and '1100' (in transmission order) */ 220 BT_LE_CS_TEST_OVERRIDE_7_SS_MARKER_VAL_LOOP = BT_HCI_OP_LE_CS_TEST_SS_MARKER_VAL_LOOP, 221 }; 222 223 /** CS Test Override 8 CS_SYNC Payload Pattern */ 224 enum bt_le_cs_test_override_8_cs_sync_payload_pattern { 225 /** PRBS9 payload sequence. */ 226 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_PRBS9 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_PRBS9, 227 /** Repeated '11110000' payload sequence. */ 228 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_11110000 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_11110000, 229 /** Repeated '10101010' payload sequence. */ 230 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_10101010 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_10101010, 231 /** PRBS15 payload sequence. */ 232 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_PRBS15 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_PRBS15, 233 /** Repeated '11111111' payload sequence. */ 234 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_11111111 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_11111111, 235 /** Repeated '00000000' payload sequence. */ 236 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_00000000 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_00000000, 237 /** Repeated '00001111' payload sequence. */ 238 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_00001111 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_00001111, 239 /** Repeated '01010101' payload sequence. */ 240 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_01010101 = BT_HCI_OP_LE_CS_TEST_PAYLOAD_01010101, 241 /** Custom payload provided by the user. */ 242 BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_USER = BT_HCI_OP_LE_CS_TEST_PAYLOAD_USER, 243 }; 244 245 /** CS Test parameters */ 246 struct bt_le_cs_test_param { 247 /** CS mode to be used during the CS procedure. */ 248 enum bt_conn_le_cs_main_mode main_mode; 249 /** CS sub-mode to be used during the CS procedure. */ 250 enum bt_conn_le_cs_sub_mode sub_mode; 251 /** Number of main mode steps taken from the end of the last CS subevent 252 * to be repeated at the beginning of the current CS subevent directly 253 * after the last mode-0 step of that event. 254 */ 255 uint8_t main_mode_repetition; 256 /** Number of CS mode-0 steps at the beginning of the test CS subevent. */ 257 uint8_t mode_0_steps; 258 /** CS Test role */ 259 enum bt_conn_le_cs_role role; 260 /** RTT variant */ 261 enum bt_conn_le_cs_rtt_type rtt_type; 262 /** CS_SYNC PHY */ 263 enum bt_conn_le_cs_sync_phy cs_sync_phy; 264 /** Antenna identifier to be used for CS_SYNC packets. */ 265 enum bt_le_cs_test_cs_sync_antenna_selection cs_sync_antenna_selection; 266 /** CS subevent length in microseconds. 267 * 268 * Range: 1250us to 4s 269 */ 270 uint32_t subevent_len; 271 /** Gap between the start of two consecutive CS subevents (N * 0.625 ms) 272 * 273 * A value of 0 means that there is only one CS subevent. 274 */ 275 uint16_t subevent_interval; 276 /** Maximum allowed number of subevents in the procedure. 277 * 278 * A value of 0 means that this parameter is ignored. 279 */ 280 uint8_t max_num_subevents; 281 /** Desired TX power level for the CS procedure. 282 * 283 * Value range is @ref BT_HCI_OP_LE_CS_MIN_MAX_TX_POWER to 284 * @ref BT_HCI_OP_LE_CS_MAX_MAX_TX_POWER. 285 * 286 * Special values: 287 * - @ref BT_HCI_OP_LE_CS_TEST_MAXIMIZE_TX_POWER tells the controller 288 * it should use as high a transmit power as possible 289 * - @ref BT_HCI_OP_LE_CS_TEST_MINIMIZE_TX_POWER tells the controller 290 * it should use as low a transmit power as possible 291 */ 292 uint8_t transmit_power_level; 293 /** Interlude time in microseconds between the RTT packets. 294 * 295 * Valid options are: 296 * - 10 us 297 * - 20 us 298 * - 30 us 299 * - 40 us 300 * - 50 us 301 * - 60 us 302 * - 80 us 303 * - 145 us 304 */ 305 uint8_t t_ip1_time; 306 /** Interlude time in microseconds between the CS tones. 307 * 308 * Valid options are: 309 * - 10 us 310 * - 20 us 311 * - 30 us 312 * - 40 us 313 * - 50 us 314 * - 60 us 315 * - 80 us 316 * - 145 us 317 */ 318 uint8_t t_ip2_time; 319 /** Time in microseconds for frequency changes. 320 * 321 * Valid options are: 322 * - 15 us 323 * - 20 us 324 * - 30 us 325 * - 40 us 326 * - 50 us 327 * - 60 us 328 * - 80 us 329 * - 100 us 330 * - 120 us 331 * - 150 us 332 */ 333 uint8_t t_fcs_time; 334 /** Time in microseconds for the phase measurement period of the CS tones. 335 * 336 * Valid options are: 337 * - 10 us 338 * - 20 us 339 * - 40 us 340 */ 341 uint8_t t_pm_time; 342 /** Time in microseconds for the antenna switch period of the CS tones. 343 * 344 * Valid options are: 345 * - 0 us 346 * - 1 us 347 * - 2 us 348 * - 4 us 349 * - 10 us 350 */ 351 uint8_t t_sw_time; 352 /** Antenna Configuration Index used during antenna switching during 353 * the tone phases of CS steps. 354 */ 355 enum bt_conn_le_cs_tone_antenna_config_selection tone_antenna_config_selection; 356 /** Initiator SNR control options */ 357 enum bt_le_cs_snr_control initiator_snr_control; 358 /** Reflector SNR control options */ 359 enum bt_le_cs_snr_control reflector_snr_control; 360 /** Determines octets 14 and 15 of the initial value of the DRBG nonce. */ 361 uint16_t drbg_nonce; 362 363 /** Override configuration. 364 * 365 * This parameter is used to override CS parameters from the DRBG. 366 * Each bit configures a different set of parameters. 367 * 368 * All overrides are optional, except for those configured by bit 0. 369 * 370 * These are: 371 * - Bit 0 set: Override using list of channels 372 * - Bit 0 not set: Override using channel map 373 * - Bit 2 set: Override main mode steps 374 * - Bit 3 set: Override T_PM_Tone_Ext 375 * - Bit 4 set: Override tone antenna permutation 376 * - Bit 5 set: Override CS_SYNC AA 377 * - Bit 6 set: Override SS marker positions 378 * - Bit 7 set: Override SS marker value 379 * - Bit 8 set: Override CS_SYNC payload pattern and user payload 380 * - Bit 10 set: Procedure is replaced with a stable phase test 381 */ 382 uint16_t override_config; 383 384 /** override config bit 0. */ 385 struct { 386 /** Number of times the channels indicated by the channel map or channel field 387 * are cycled through for non-mode-0 steps within a CS procedure. 388 */ 389 uint8_t channel_map_repetition; 390 union { 391 struct { 392 uint8_t num_channels; 393 uint8_t *channels; 394 } set; 395 struct { 396 uint8_t channel_map[10]; 397 enum bt_conn_le_cs_chsel_type channel_selection_type; 398 enum bt_conn_le_cs_ch3c_shape ch3c_shape; 399 uint8_t ch3c_jump; 400 } not_set; 401 }; 402 } override_config_0; 403 404 /** Override config bit 2. These parameters are ignored if the bit is not set. */ 405 struct { 406 uint8_t main_mode_steps; 407 } override_config_2; 408 409 /** Override config bit 3. These parameters are ignored if the bit is not set. */ 410 struct { 411 enum bt_le_cs_test_override_3_pm_tone_ext t_pm_tone_ext; 412 } override_config_3; 413 414 /** Override config bit 4. These parameters are ignored if the bit is not set. */ 415 struct { 416 enum bt_le_cs_test_override_4_tone_antenna_permutation tone_antenna_permutation; 417 } override_config_4; 418 419 /** Override config bit 5. These parameters are ignored if the bit is not set. */ 420 struct { 421 /** Access Address used in CS_SYNC packets sent by the initiator. */ 422 uint32_t cs_sync_aa_initiator; 423 /** Access Address used in CS_SYNC packets sent by the reflector. */ 424 uint32_t cs_sync_aa_reflector; 425 } override_config_5; 426 427 /** Override config bit 6. These parameters are ignored if the bit is not set. */ 428 struct { 429 /** Bit number where the first marker in the channel sounding sequence starts. 430 * 431 * Must be between 0 and 28 when using @ref BT_CONN_LE_CS_RTT_TYPE_32_BIT_SOUNDING. 432 */ 433 uint8_t ss_marker1_position; 434 /** Bit number where the second marker in the channel sounding sequence starts. 435 * 436 * Must be between 67 and 92 when using @ref 437 * BT_CONN_LE_CS_RTT_TYPE_96_BIT_SOUNDING. 438 * 439 * A value of @ref BT_HCI_OP_LE_CS_TEST_SS_MARKER_2_POSITION_NOT_PRESENT 440 * indicates that this sounding sequence or marker is not present. 441 */ 442 uint8_t ss_marker2_position; 443 } override_config_6; 444 445 /** Override config bit 7. These parameters are ignored if the bit is not set. */ 446 struct { 447 /** Value of the Sounding Sequence marker. */ 448 enum bt_le_cs_test_override_7_ss_marker_value ss_marker_value; 449 } override_config_7; 450 451 /** Override config bit 8. These parameters are ignored if the bit is not set. */ 452 struct { 453 /** CS_SYNC payload pattern selection. */ 454 enum bt_le_cs_test_override_8_cs_sync_payload_pattern cs_sync_payload_pattern; 455 /** User payload for CS_SYNC packets. 456 * 457 * This parameter is only used when using 458 * @ref BT_LE_CS_TEST_OVERRIDE_8_PAYLOAD_PATTERN_USER 459 * 460 * The least significant bit corresponds to the most significant bit 461 * of the CS payload. When the sequence is less than 16 octets, 462 * the least significant octets shall be padded with zeros. 463 */ 464 uint8_t cs_sync_user_payload[16]; 465 } override_config_8; 466 }; 467 468 /** CS config creation context */ 469 enum bt_le_cs_create_config_context { 470 /** Write CS configuration in local Controller only */ 471 BT_LE_CS_CREATE_CONFIG_CONTEXT_LOCAL_ONLY, 472 /** Write CS configuration in both local and remote Controller using Channel Sounding 473 * Configuration procedure 474 */ 475 BT_LE_CS_CREATE_CONFIG_CONTEXT_LOCAL_AND_REMOTE 476 }; 477 478 /** CS Create Config params */ 479 struct bt_le_cs_create_config_params { 480 /** CS configuration ID */ 481 uint8_t id; 482 /** Main CS mode type */ 483 enum bt_conn_le_cs_main_mode main_mode_type; 484 /** Sub CS mode type */ 485 enum bt_conn_le_cs_sub_mode sub_mode_type; 486 /** Minimum number of CS main mode steps to be executed before a submode step is executed */ 487 uint8_t min_main_mode_steps; 488 /** Maximum number of CS main mode steps to be executed before a submode step is executed */ 489 uint8_t max_main_mode_steps; 490 /** Number of main mode steps taken from the end of the last CS subevent to be repeated 491 * at the beginning of the current CS subevent directly after the last mode-0 step of that 492 * event 493 */ 494 uint8_t main_mode_repetition; 495 /** Number of CS mode-0 steps to be included at the beginning of each CS subevent */ 496 uint8_t mode_0_steps; 497 /** CS role */ 498 enum bt_conn_le_cs_role role; 499 /** RTT type */ 500 enum bt_conn_le_cs_rtt_type rtt_type; 501 /** CS Sync PHY */ 502 enum bt_conn_le_cs_sync_phy cs_sync_phy; 503 /** The number of times the Channel_Map field will be cycled through for non-mode-0 steps 504 * within a CS procedure 505 */ 506 uint8_t channel_map_repetition; 507 /** Channel selection type */ 508 enum bt_conn_le_cs_chsel_type channel_selection_type; 509 /** User-specified channel sequence shape */ 510 enum bt_conn_le_cs_ch3c_shape ch3c_shape; 511 /** Number of channels skipped in each rising and falling sequence */ 512 uint8_t ch3c_jump; 513 /** Channel map used for CS procedure 514 * Channels n = 0, 1, 23, 24, 25, 77, and 78 are not allowed and shall be set to zero. 515 * Channel 79 is reserved for future use and shall be set to zero. 516 * At least 15 channels shall be enabled. 517 */ 518 uint8_t channel_map[10]; 519 }; 520 521 /** Callbacks for CS Test */ 522 struct bt_le_cs_test_cb { 523 /**@brief CS Test Subevent data. 524 * 525 * @param[in] Subevent results. 526 */ 527 void (*le_cs_test_subevent_data_available)(struct bt_conn_le_cs_subevent_result *data); 528 /**@brief CS Test End Complete. */ 529 void (*le_cs_test_end_complete)(void); 530 }; 531 532 /** Subevent result step */ 533 struct bt_le_cs_subevent_step { 534 /** CS step mode. */ 535 uint8_t mode; 536 /** CS step channel index. */ 537 uint8_t channel; 538 /** Length of role- and mode-specific information being reported. */ 539 uint8_t data_len; 540 /** Pointer to role- and mode-specific information. */ 541 const uint8_t *data; 542 }; 543 544 /** Sign-extended IQ value extracted from step data. */ 545 struct bt_le_cs_iq_sample { 546 int16_t i; 547 int16_t q; 548 }; 549 550 /** @brief Extract in-phase and quadrature terms from HCI-formatted PCT. 551 * 552 * Convenience function for processing 24-bit phase correction terms found 553 * in CS step data. The 12-bit signed real and imaginary components are 554 * converted to host endianness and sign-extended. 555 * 556 * @param pct 24-bit little-endian phase correction term. 557 * 558 * @return struct bt_le_cs_iq_sample containing real and imaginary terms as int16_t 559 */ 560 struct bt_le_cs_iq_sample bt_le_cs_parse_pct(const uint8_t pct[3]); 561 562 /** @brief Set all valid channel map bits 563 * 564 * This command is used to enable all valid channels in a 565 * given CS channel map 566 * 567 * @param channel_map Chanel map 568 */ 569 void bt_le_cs_set_valid_chmap_bits(uint8_t channel_map[10]); 570 571 /** @brief Read Remote Supported Capabilities 572 * 573 * This command is used to query the CS capabilities that are supported 574 * by the remote controller. 575 * 576 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 577 * 578 * @param conn Connection Object. 579 * 580 * @return Zero on success or (negative) error code on failure. 581 */ 582 int bt_le_cs_read_remote_supported_capabilities(struct bt_conn *conn); 583 584 /** @brief Set Channel Sounding default settings. 585 * 586 * This command is used to set default Channel Sounding settings for this 587 * connection. 588 * 589 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 590 * 591 * @param conn Connection Object. 592 * @param params Channel sounding default settings parameters. 593 * 594 * @return Zero on success or (negative) error code on failure. 595 */ 596 int bt_le_cs_set_default_settings(struct bt_conn *conn, 597 const struct bt_le_cs_set_default_settings_param *params); 598 599 /** @brief Read Remote FAE Table 600 * 601 * This command is used to read the per-channel mode-0 Frequency Actuation Error 602 * table of the remote Controller. 603 * 604 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 605 * 606 * @param conn Connection Object. 607 * 608 * @return Zero on success or (negative) error code on failure. 609 */ 610 int bt_le_cs_read_remote_fae_table(struct bt_conn *conn); 611 612 /** @brief Register callbacks for the CS Test mode. 613 * 614 * Existing callbacks can be unregistered by providing NULL function 615 * pointers. 616 * 617 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING_TEST} must be set. 618 * 619 * @param cs_test_cb Set of callbacks to be used with CS Test 620 * 621 * @return Zero on success or (negative) error code on failure. 622 */ 623 int bt_le_cs_test_cb_register(struct bt_le_cs_test_cb cs_test_cb); 624 625 /** @brief Start a CS test 626 * 627 * This command is used to start a CS test where the IUT is placed in the role 628 * of either the initiator or reflector. 629 * 630 * The first mode-0 channel in the list is used as the starting channel for 631 * the test. At the beginning of any test, the IUT in the reflector role shall 632 * listen on the first mode-0 channel until it receives the first transmission 633 * from the initiator. Similarly, with the IUT in the initiator role, the tester 634 * will start by listening on the first mode-0 channel and the IUT shall transmit 635 * on that channel for the first half of the first CS step. Thereafter, the 636 * parameters of this command describe the required transmit and receive behavior 637 * for the CS test. 638 * 639 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING_TEST} must be set. 640 * 641 * @param params CS Test parameters 642 * 643 * @return Zero on success or (negative) error code on failure. 644 */ 645 int bt_le_cs_start_test(const struct bt_le_cs_test_param *params); 646 647 /** @brief Create CS configuration 648 * 649 * This command is used to create a new CS configuration or update an 650 * existing one with the config id specified. 651 * 652 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 653 * 654 * @param conn Connection Object. 655 * @param params CS Create Config parameters 656 * @param context Controls whether the configuration is written to the local controller or 657 * both the local and the remote controller 658 * 659 * @return Zero on success or (negative) error code on failure. 660 */ 661 int bt_le_cs_create_config(struct bt_conn *conn, struct bt_le_cs_create_config_params *params, 662 enum bt_le_cs_create_config_context context); 663 664 /** @brief Create CS configuration 665 * 666 * This command is used to remove a CS configuration from the local controller 667 * identified by the config_id 668 * 669 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 670 * 671 * @param conn Connection Object. 672 * @param config_id CS Config ID 673 * 674 * @return Zero on success or (negative) error code on failure. 675 */ 676 int bt_le_cs_remove_config(struct bt_conn *conn, uint8_t config_id); 677 678 /** @brief Stop ongoing CS Test 679 * 680 * This command is used to stop any CS test that is in progress. 681 * 682 * The controller is expected to finish reporting any subevent results 683 * before completing this termination. 684 * 685 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING_TEST} must be set. 686 * 687 * @return Zero on success or (negative) error code on failure. 688 */ 689 int bt_le_cs_stop_test(void); 690 691 /** @brief Parse CS Subevent Step Data 692 * 693 * A helper for parsing HCI-formatted step data found in channel sounding subevent results. 694 * 695 * A typical use-case is filtering out data which does not meet certain packet quality or NADM 696 * requirements. 697 * 698 * @warning This function will consume the data when parsing. 699 * 700 * @param step_data_buf Pointer to a buffer containing the step data. 701 * @param func Callback function which will be called for each step data found. 702 * The callback should return true to continue parsing, or false to stop. 703 * @param user_data User data to be passed to the callback. 704 */ 705 void bt_le_cs_step_data_parse(struct net_buf_simple *step_data_buf, 706 bool (*func)(struct bt_le_cs_subevent_step *step, void *user_data), 707 void *user_data); 708 709 /** @brief CS Security Enable 710 * 711 * This command is used to start or restart the Channel Sounding Security 712 * Start procedure in the local Controller for the ACL connection identified 713 * in the conn parameter. 714 * 715 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 716 * 717 * @param conn Connection Object. 718 * 719 * @return Zero on success or (negative) error code on failure. 720 */ 721 int bt_le_cs_security_enable(struct bt_conn *conn); 722 723 struct bt_le_cs_procedure_enable_param { 724 uint8_t config_id; 725 enum bt_conn_le_cs_procedure_enable_state enable; 726 }; 727 728 /** @brief CS Procedure Enable 729 * 730 * This command is used to enable or disable the scheduling of CS procedures 731 * by the local Controller, with the remote device identified in the conn 732 * parameter. 733 * 734 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 735 * 736 * @param conn Connection Object. 737 * @param params Parameters for the CS Procedure Enable command. 738 * 739 * @return Zero on success or (negative) error code on failure. 740 */ 741 int bt_le_cs_procedure_enable(struct bt_conn *conn, 742 const struct bt_le_cs_procedure_enable_param *params); 743 744 enum bt_le_cs_procedure_phy { 745 BT_LE_CS_PROCEDURE_PHY_1M = BT_HCI_OP_LE_CS_PROCEDURE_PHY_1M, 746 BT_LE_CS_PROCEDURE_PHY_2M = BT_HCI_OP_LE_CS_PROCEDURE_PHY_2M, 747 BT_LE_CS_PROCEDURE_PHY_CODED_S8 = BT_HCI_OP_LE_CS_PROCEDURE_PHY_CODED_S8, 748 BT_LE_CS_PROCEDURE_PHY_CODED_S2 = BT_HCI_OP_LE_CS_PROCEDURE_PHY_CODED_S2, 749 }; 750 751 #define BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_1 BIT(0) 752 #define BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_2 BIT(1) 753 #define BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_3 BIT(2) 754 #define BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_4 BIT(3) 755 756 struct bt_le_cs_set_procedure_parameters_param { 757 /* The ID associated with the desired configuration (0 to 3) */ 758 uint8_t config_id; 759 760 /* Max. duration for each CS procedure, where T = N * 0.625 ms (0x0001 to 0xFFFF) */ 761 uint16_t max_procedure_len; 762 763 /* Min. number of connection events between consecutive CS procedures (0x0001 to 0xFFFF) */ 764 uint16_t min_procedure_interval; 765 766 /* Max. number of connection events between consecutive CS procedures (0x0001 to 0xFFFF) */ 767 uint16_t max_procedure_interval; 768 769 /* Max. number of procedures to be scheduled (0x0000 for no limit; otherwise 0x0001 770 * to 0xFFFF) 771 */ 772 uint16_t max_procedure_count; 773 774 /* Min. suggested duration for each CS subevent in microseconds (1250 us to 4 s) */ 775 uint32_t min_subevent_len; 776 777 /* Max. suggested duration for each CS subevent in microseconds (1250 us to 4 s) */ 778 uint32_t max_subevent_len; 779 780 /* Antenna configuration index */ 781 enum bt_conn_le_cs_tone_antenna_config_selection tone_antenna_config_selection; 782 783 /* Phy */ 784 enum bt_le_cs_procedure_phy phy; 785 786 /* Transmit power delta, in signed dB, to indicate the recommended difference between the 787 * remote device's power level for the CS tones and RTT packets and the existing power 788 * level for the Phy indicated by the Phy parameter (0x80 for no recommendation) 789 */ 790 int8_t tx_power_delta; 791 792 /* Preferred peer antenna (Bitmask of BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_*) */ 793 uint8_t preferred_peer_antenna; 794 795 /* Initiator SNR control adjustment */ 796 enum bt_le_cs_snr_control snr_control_initiator; 797 798 /* Reflector SNR control adjustment */ 799 enum bt_le_cs_snr_control snr_control_reflector; 800 }; 801 802 /** @brief CS Set Procedure Parameters 803 * 804 * This command is used to set the parameters for the scheduling of one 805 * or more CS procedures by the local controller. 806 * 807 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 808 * 809 * @param conn Connection Object. 810 * @param params Parameters for the CS Set Procedure Parameters command. 811 * 812 * @return Zero on success or (negative) error code on failure. 813 */ 814 int bt_le_cs_set_procedure_parameters(struct bt_conn *conn, 815 const struct bt_le_cs_set_procedure_parameters_param *params); 816 817 /** @brief CS Set Channel Classification 818 * 819 * This command is used to update the channel classification based on 820 * its local information. 821 * 822 * The nth bitfield (in the range 0 to 78) contains the value for the CS 823 * channel index n. Channel Enabled = 1; Channel Disabled = 0. 824 * 825 * Channels n = 0, 1, 23, 24, 25, 77, and 78 shall be reserved for future 826 * use and shall be set to zero. At least 15 channels shall be enabled. 827 * 828 * The most significant bit (bit 79) is reserved for future use. 829 * 830 * @note To use this API, @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 831 * 832 * @param channel_classification Bit fields 833 * 834 * @return Zero on success or (negative) error code on failure. 835 */ 836 int bt_le_cs_set_channel_classification(uint8_t channel_classification[10]); 837 838 /** @brief CS Read Local Supported Capabilities 839 * 840 * This command is used to read the CS capabilities that are supported 841 * by the local Controller. 842 * 843 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 844 * 845 * @param ret Return values for the CS Procedure Enable command. 846 * 847 * @return Zero on success or (negative) error code on failure. 848 */ 849 int bt_le_cs_read_local_supported_capabilities(struct bt_conn_le_cs_capabilities *ret); 850 851 /** @brief CS Write Cached Remote Supported Capabilities 852 * 853 * This command is used to write the cached copy of the CS capabilities 854 * that are supported by the remote Controller for the connection 855 * identified. 856 * 857 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 858 * 859 * @param conn Connection Object. 860 * @param params Parameters for the CS Write Cached Remote Supported Capabilities command. 861 * 862 * @return Zero on success or (negative) error code on failure. 863 */ 864 int bt_le_cs_write_cached_remote_supported_capabilities( 865 struct bt_conn *conn, const struct bt_conn_le_cs_capabilities *params); 866 867 /** @brief CS Write Cached Remote FAE Table 868 * 869 * This command is used to write a cached copy of the per-channel mode-0 870 * Frequency Actuation Error table of the remote device in the local Controller. 871 * 872 * @note To use this API @kconfig{CONFIG_BT_CHANNEL_SOUNDING} must be set. 873 * 874 * @param conn Connection Object. 875 * @param remote_fae_table Per-channel mode-0 FAE table of the local Controller 876 * 877 * @return Zero on success or (negative) error code on failure. 878 */ 879 int bt_le_cs_write_cached_remote_fae_table(struct bt_conn *conn, int8_t remote_fae_table[72]); 880 881 #ifdef __cplusplus 882 } 883 #endif 884 885 /** 886 * @} 887 */ 888 889 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_CS_H_ */ 890