| /* |
| * Copyright (c) 2020 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /* @brief Max supported CTE length in 8us units */ |
| #define LLL_DF_MAX_CTE_LEN 20 |
| /* @brief Min supported CTE length in 8us units */ |
| #define LLL_DF_MIN_CTE_LEN 2 |
| |
| /* @brief Min supported length of antenna switching pattern */ |
| #define LLL_DF_MIN_ANT_PATTERN_LEN 3 |
| |
| /* @brief Macro to convert length of CTE to [us] */ |
| #define CTE_LEN_US(n) ((n) * 8U) |
| |
| #if defined(CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN) |
| #define BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN \ |
| CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN |
| #else |
| #define BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN 0 |
| #endif |
| |
| /* @brief Configuration of Constant Tone Extension for connectionless |
| * transmission. |
| */ |
| struct lll_df_adv_cfg { |
| uint8_t is_enabled:1; |
| uint8_t is_started:1; |
| uint8_t cte_length:6; /* Length of CTE in 8us units */ |
| uint8_t cte_type:2; |
| uint8_t cte_count:6; |
| uint8_t ant_sw_len:6; |
| uint8_t ant_ids[BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN]; |
| }; |
| |
| /* BT 5.1 Vol 6, Part B, Section 2.5.4 reference period is sampled with 1us |
| * spacing. Thus we may have 8 IQ samples from reference period. |
| */ |
| #define IQ_SAMPLE_REF_CNT 8 |
| /* BT 5.1 Vol 6, Part B, Section 2.5.4 |
| * If 1us sampling slots are supported maximum number of IQ samples in single CTE |
| * is 74 (sample spacing is 2us). If it is not supported maximum number of IQ |
| * samples is 37 (sample spacing is 4us). |
| */ |
| #if defined(CONFIG_BT_CTLR_DF_CTE_RX_SAMPLE_1US) |
| #define IQ_SAMPLE_SWITCH_CNT 74 |
| #else |
| #define IQ_SAMPLE_SWITCH_CNT 37 |
| #endif |
| |
| #define IQ_SAMPLE_TOTAL_CNT ((IQ_SAMPLE_REF_CNT) + (IQ_SAMPLE_SWITCH_CNT)) |
| #define IQ_SAMPLE_CNT (PDU_DC_LL_HEADER_SIZE + LL_LENGTH_OCTETS_RX_MAX) |
| |
| #define RSSI_DBM_TO_DECI_DBM(x) (-(x) * 10) |
| #define IQ_SHIFT_12_TO_8_BIT(x) ((x) >> 4) |
| |
| /* Structure to store an single IQ sample */ |
| struct iq_sample { |
| int16_t i; |
| int16_t q; |
| }; |
| |
| /* Receive node aimed to report collected IQ samples during CTE receive */ |
| struct node_rx_iq_report { |
| struct node_rx_hdr hdr; |
| uint8_t sample_count; |
| struct pdu_cte_info cte_info; |
| uint8_t local_slot_durations; |
| uint8_t packet_status; |
| uint8_t rssi_ant_id; |
| union { |
| uint8_t pdu[0] __aligned(4); |
| struct iq_sample sample[0]; |
| }; |
| }; |
| |
| /* @brief Configuration of Constant Tone Extension for connectionless |
| * reception. |
| */ |
| struct lll_df_sync_cfg { |
| uint8_t is_enabled:1; |
| uint8_t slot_durations:2; /* One of possible values: 1us, 2us. */ |
| uint8_t max_cte_count:5; /* Max number of received CTEs. */ |
| uint8_t cte_count:5; /* Received CTEs count. */ |
| uint8_t ant_sw_len:7; |
| uint8_t ant_ids[BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN]; |
| }; |
| |
| /* Double buffer to store DF sync configuration */ |
| struct lll_df_sync { |
| uint8_t volatile first; |
| uint8_t last; |
| struct lll_df_sync_cfg cfg[DOUBLE_BUFFER_SIZE]; |
| }; |