blob: d3ced61b11400ba1bfcd46875c8e842391469c99 [file]
// SPDX-License-Identifier: LGPL-2.1-or-later
/*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
*/
#include <stdbool.h>
#include <inttypes.h>
#include "src/shared/io.h"
#include "bluetooth/mgmt.h"
#include "src/shared/hci.h"
struct bt_rap;
struct gatt_db;
struct bt_gatt_client;
/* Channel Sounding Events */
struct bt_rap_hci_cs_options {
uint8_t role;
uint8_t cs_sync_ant_sel;
int8_t max_tx_power;
int rtt_type;
};
#define CS_MODE_ZERO 0x00
#define CS_MODE_ONE 0x01
#define CS_MODE_TWO 0x02
#define CS_MODE_THREE 0x03
#define CS_REFLECTOR 0x01
#define CS_INITIATOR 0x00
#define CS_MAX_ANT_PATHS 0x05
#define CS_MAX_STEPS 0xA0
#define CS_MAX_STEP_DATA_LEN 0xFF
struct rap_ev_cs_config_cmplt {
uint8_t status;
uint16_t conn_hdl;
uint8_t config_id;
uint8_t action;
uint8_t main_mode_type;
uint8_t sub_mode_type;
uint8_t min_main_mode_steps;
uint8_t max_main_mode_steps;
uint8_t main_mode_rep;
uint8_t mode_0_steps;
uint8_t role;
uint8_t rtt_type;
uint8_t cs_sync_phy;
uint8_t channel_map[10];
uint8_t channel_map_rep;
uint8_t channel_sel_type;
uint8_t ch3c_shape;
uint8_t ch3c_jump;
uint8_t reserved;
uint8_t t_ip1_time;
uint8_t t_ip2_time;
uint8_t t_fcs_time;
uint8_t t_pm_time;
};
struct rap_ev_cs_sec_enable_cmplt {
uint8_t status;
uint16_t conn_hdl;
};
struct rap_ev_cs_proc_enable_cmplt {
uint8_t status;
uint16_t conn_hdl;
uint8_t config_id;
uint8_t state;
uint8_t tone_ant_config_sel;
int8_t sel_tx_pwr;
uint8_t sub_evt_len[3];
uint8_t sub_evts_per_evt;
uint16_t sub_evt_intrvl;
uint16_t evt_intrvl;
uint16_t proc_intrvl;
uint16_t proc_counter;
uint16_t max_proc_len;
};
struct pct_iq_sample {
int16_t i_sample;
int16_t q_sample;
};
struct cs_mode_zero_data {
uint8_t packet_quality;
uint8_t packet_rssi_dbm;
uint8_t packet_ant;
uint16_t init_measured_freq_offset;
};
struct cs_mode_one_data {
uint8_t packet_quality;
uint8_t packet_nadm;
uint8_t packet_rssi_dbm;
int16_t toa_tod_init;
int16_t tod_toa_refl;
uint8_t packet_ant;
struct pct_iq_sample packet_pct1;
struct pct_iq_sample packet_pct2;
};
struct cs_mode_two_data {
uint8_t ant_perm_index;
struct pct_iq_sample tone_pct[5];
uint8_t tone_quality_indicator[5];
};
struct cs_mode_three_data {
struct cs_mode_one_data mode_one_data;
struct cs_mode_two_data mode_two_data;
};
union cs_mode_data {
struct cs_mode_zero_data mode_zero_data;
struct cs_mode_one_data mode_one_data;
struct cs_mode_two_data mode_two_data;
struct cs_mode_three_data mode_three_data;
};
struct cs_step_data {
uint8_t step_mode;
uint8_t step_chnl;
uint8_t step_data_length;
union cs_mode_data step_mode_data;
};
struct rap_ev_cs_subevent_result {
uint16_t conn_hdl;
uint8_t config_id;
uint16_t start_acl_conn_evt_counter;
uint16_t proc_counter;
uint16_t freq_comp;
uint8_t ref_pwr_lvl;
uint8_t proc_done_status;
uint8_t subevt_done_status;
uint8_t abort_reason;
uint8_t num_ant_paths;
uint8_t num_steps_reported;
struct cs_step_data step_data[];
};
struct rap_ev_cs_subevent_result_cont {
uint16_t conn_hdl;
uint8_t config_id;
uint8_t proc_done_status;
uint8_t subevt_done_status;
uint8_t abort_reason;
uint8_t num_ant_paths;
uint8_t num_steps_reported;
struct cs_step_data step_data[];
};
typedef void (*bt_rap_debug_func_t)(const char *str, void *user_data);
typedef void (*bt_rap_ready_func_t)(struct bt_rap *rap, void *user_data);
typedef void (*bt_rap_destroy_func_t)(void *user_data);
typedef void (*bt_rap_func_t)(struct bt_rap *rap, void *user_data);
struct bt_rap *bt_rap_ref(struct bt_rap *rap);
void bt_rap_unref(struct bt_rap *rap);
void bt_rap_add_db(struct gatt_db *db);
bool bt_rap_attach(struct bt_rap *rap, struct bt_gatt_client *client);
void bt_rap_detach(struct bt_rap *rap);
struct bt_att *bt_rap_get_att(struct bt_rap *rap);
bool bt_rap_set_user_data(struct bt_rap *rap, void *user_data);
bool bt_rap_set_debug(struct bt_rap *rap, bt_rap_debug_func_t func,
void *user_data, bt_rap_destroy_func_t destroy);
/* session related functions */
unsigned int bt_rap_register(bt_rap_func_t attached, bt_rap_func_t detached,
void *user_data);
unsigned int bt_rap_ready_register(struct bt_rap *rap,
bt_rap_ready_func_t func, void *user_data,
bt_rap_destroy_func_t destroy);
bool bt_rap_ready_unregister(struct bt_rap *rap, unsigned int id);
bool bt_rap_unregister(unsigned int id);
struct bt_rap *bt_rap_new(struct gatt_db *ldb, struct gatt_db *rdb);
/* HCI Raw Channel Approach */
void bt_rap_hci_cs_config_complete_callback(uint16_t length,
const void *param,
void *user_data);
void bt_rap_hci_cs_sec_enable_complete_callback(uint16_t length,
const void *param,
void *user_data);
void bt_rap_hci_cs_procedure_enable_complete_callback(uint16_t length,
const void *param,
void *user_data);
void bt_rap_hci_cs_subevent_result_callback(uint16_t length,
const void *param,
void *user_data);
void bt_rap_hci_cs_subevent_result_cont_callback(uint16_t length,
const void *param,
void *user_data);
void *bt_rap_attach_hci(struct bt_rap *rap, struct bt_hci *hci,
uint8_t role, uint8_t cs_sync_ant_sel,
int8_t max_tx_power);
void bt_rap_detach_hci(struct bt_rap *rap, void *hci_sm);
/* Connection handle mapping functions */
bool bt_rap_set_conn_handle(void *hci_sm, struct bt_rap *rap, uint16_t handle,
const uint8_t *bdaddr, uint8_t bdaddr_type);
void bt_rap_clear_conn_handle(void *hci_sm, uint16_t handle);