Bluetooth: host: Add set connectionless CTE TX params wrapper function

Add implementation of a wrapper for HCI_LE_Set_-
Connectionless_CTE_Transmit_Parameters send command.

Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no>
This commit is contained in:
Piotr Pryga 2020-11-20 05:20:28 -08:00 committed by Carles Cufí
commit 098f767298
3 changed files with 109 additions and 0 deletions

View file

@ -187,6 +187,8 @@ struct bt_hci_cmd_hdr {
BT_LE_FEAT_BIT_PER_ADV)
#define BT_FEAT_LE_CONNECTIONLESS_CTE_TX(feat) BT_LE_FEAT_TEST(feat, \
BT_LE_FEAT_BIT_CONNECTIONLESS_CTE_TX)
#define BT_FEAT_LE_ANT_SWITCH_TX_AOD(feat) BT_LE_FEAT_TEST(feat, \
BT_LE_FEAT_BIT_ANT_SWITCH_TX_AOD)
#define BT_FEAT_LE_PAST_SEND(feat) BT_LE_FEAT_TEST(feat, \
BT_LE_FEAT_BIT_PAST_SEND)
#define BT_FEAT_LE_PAST_RECV(feat) BT_LE_FEAT_TEST(feat, \

View file

@ -11,7 +11,9 @@
#include <bluetooth/conn.h>
#include <sys/byteorder.h>
#include "hci_core.h"
#include "conn_internal.h"
#include "direction.h"
#include "direction_internal.h"
#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_DF)
@ -41,6 +43,71 @@ static struct bt_le_df_ant_info df_ant_info;
#define DF_AOA_RX_1US_SUPPORT(supp) (DF_SUPP_TEST(supp, \
BT_HCI_LE_1US_AOA_RX))
static int hci_df_set_cl_cte_tx_params(const struct bt_le_ext_adv *adv,
const struct bt_le_df_adv_cte_tx_params *params)
{
struct bt_hci_cp_le_set_cl_cte_tx_params *cp;
struct net_buf *buf;
/* If AoD is not enabled, ant_ids are ignored by controller:
* BT Core spec 5.2 Vol 4, Part E sec. 7.8.80.
*/
if (params->cte_type == BT_HCI_LE_AOD_CTE_1US ||
params->cte_type == BT_HCI_LE_AOD_CTE_2US) {
if (!BT_FEAT_LE_ANT_SWITCH_TX_AOD(bt_dev.le.features)) {
return -EINVAL;
}
if (params->cte_type == BT_HCI_LE_AOD_CTE_1US &&
!DF_AOD_TX_1US_SUPPORT(df_ant_info.switch_sample_rates)) {
return -EINVAL;
}
if (params->num_ant_ids < BT_HCI_LE_SWITCH_PATTERN_LEN_MIN ||
params->num_ant_ids > BT_HCI_LE_SWITCH_PATTERN_LEN_MAX ||
!params->ant_ids) {
return -EINVAL;
}
} else if (params->cte_type != BT_HCI_LE_AOA_CTE) {
return -EINVAL;
}
if (params->cte_len < BT_HCI_LE_CTE_LEN_MIN ||
params->cte_len > BT_HCI_LE_CTE_LEN_MAX) {
return -EINVAL;
}
if (params->cte_count < BT_HCI_LE_CTE_COUNT_MIN ||
params->cte_count > BT_HCI_LE_CTE_COUNT_MAX) {
return -EINVAL;
}
buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
sizeof(*cp) + params->num_ant_ids);
if (!buf) {
return -ENOBUFS;
}
cp = net_buf_add(buf, sizeof(*cp));
cp->handle = adv->handle;
cp->cte_len = params->cte_len;
cp->cte_type = params->cte_type;
cp->cte_count = params->cte_count;
if (params->num_ant_ids) {
uint8_t *dest_ant_ids = net_buf_add(buf, params->num_ant_ids);
memcpy(dest_ant_ids, params->ant_ids, params->num_ant_ids);
cp->switch_pattern_len = params->num_ant_ids;
} else {
cp->switch_pattern_len = 0;
}
return bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
buf, NULL);
}
/* @brief Function provides information about DF antennae numer and
* controller capabilities related with Constant Tone Extension.
*

View file

@ -0,0 +1,40 @@
/*
* Copyright (c) 2020 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_SUBSYS_BLUETOOTH_HOST_DF_H_
#define ZEPHYR_SUBSYS_BLUETOOTH_HOST_DF_H_
/* @brief Optional switching and sampling rates for Angle of Departure
* and Angle or Arrival modes.
*/
enum bt_df_opt_swich_sample_rates {
/* Support Angle of Departure 1us switching TX */
DF_AOD_1US_SWITCH_TX_SUPP = BIT(0),
/* Support Angle of departure 1us sampling RX */
DF_AOD_1US_SAMPL_RX_SUPP = BIT(1),
/* Support Angle of Arrival 1us switching and sampling RX */
DF_AOA_1US_SWITCH_SAMPL_RX_SUPP = BIT(2),
};
/* @brief Constant Tone Extension parameters for connectionless
* transmission.
*
* The structure holds information required to setup CTE transmission
* in periodic advertising.
*/
struct bt_le_df_adv_cte_tx_params {
/* Length of CTE in 8us units */
uint8_t cte_len;
/* CTE Type: AoA, AoD 1us slots, AoD 2us slots */
uint8_t cte_type;
/* Number of CTE to transmit in each periodic adv interval */
uint8_t cte_count;
/* Number of Antenna IDs in the switch pattern */
uint8_t num_ant_ids;
/* List of antenna IDs in the pattern */
uint8_t *ant_ids;
};
#endif /* ZEPHYR_SUBSYS_BLUETOOTH_HOST_DF_H_ */