529 lines
13 KiB
C
529 lines
13 KiB
C
/**
|
|
****************************************************************************************
|
|
*
|
|
* @file lc.h
|
|
*
|
|
* @brief Main API file for the Link Controller
|
|
*
|
|
* Copyright (C) RivieraWaves 2009-2015
|
|
*
|
|
****************************************************************************************
|
|
*/
|
|
|
|
#ifndef LC_H_
|
|
#define LC_H_
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @defgroup LC Link Controller
|
|
* @ingroup ROOT
|
|
* @brief BT Lower Layers
|
|
*
|
|
* The CONTROLLER contains the modules allowing the physical link establishment,
|
|
* maintenance and management.
|
|
* @{
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* INCLUDE FILES
|
|
****************************************************************************************
|
|
*/
|
|
|
|
#include "rwip_task.h" // Task definitions
|
|
#include "ke_task.h" // kernel task definitions
|
|
#include "co_bt.h"
|
|
|
|
/*
|
|
* DEFINES
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/// No connection handle
|
|
#define NO_CON_HDL 65535
|
|
/// No TID
|
|
#define NO_TID_FREE NO_CON_HDL
|
|
|
|
/*
|
|
* ENUMERATION DEFINITIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/// Message API of the LC task
|
|
enum LC_CON_REASON
|
|
{
|
|
LC_MASTER_CON,
|
|
LC_SLAVE_CON,
|
|
LC_REM_NAME,
|
|
};
|
|
|
|
/*
|
|
* TYPE DEFINITIONS
|
|
****************************************************************************************
|
|
*/
|
|
///Key status
|
|
enum
|
|
{
|
|
KEY_ABSENT = 0,
|
|
KEY_PRESENT,
|
|
KEY_PENDING,
|
|
};
|
|
|
|
///Pin Status
|
|
enum{
|
|
PIN_ABSENT = 0,
|
|
PIN_PRESENT,
|
|
};
|
|
|
|
/*
|
|
* MESSAGES
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/// Message API of the LC task
|
|
/*@TRACE*/
|
|
enum lc_msg_id
|
|
{
|
|
LC_MSG_ID_MSG_FIRST = TASK_FIRST_MSG(TASK_ID_LC),
|
|
|
|
/*
|
|
* ************** Msg LC->LC****************
|
|
*/
|
|
|
|
LC_LMP_RX,
|
|
LC_SYNC_IND,
|
|
LC_COMPUTE_DHKEY,
|
|
LC_ECC_RESULT_IND,
|
|
|
|
LC_LMP_RSP_TO,
|
|
LC_CON_ACCEPT_TO,
|
|
LC_AFH_REPORT_TO,
|
|
LC_AFH_UPDATE_IND,
|
|
LC_AUTH_PAYL_NEARLY_TO,
|
|
LC_AUTH_PAYL_REAL_TO,
|
|
|
|
LC_LMP_RSP_TO_FLOW_SPEC,
|
|
LC_OP_LOC_SWITCH_REQ,
|
|
LC_OP_LOC_SNIFF_REQ,
|
|
LC_OP_LOC_UNSNIFF_REQ,
|
|
#if MAX_NB_SYNC
|
|
LC_OP_LOC_SYNC_CON_REQ,
|
|
#endif // MAX_NB_SYNC
|
|
|
|
LC_SAM_SUBMAP_UPDATE_IND,
|
|
LC_SAM_MAP_UPDATE_IND,
|
|
|
|
/*
|
|
* ************** Msg LB->LC****************
|
|
*/
|
|
LC_MST_KEY_REQ,
|
|
#if PCA_SUPPORT
|
|
LC_PCA_SSCAN_CLK_IND,
|
|
#endif // PCA_SUPPORT
|
|
|
|
/*
|
|
* ************** Msg LMP****************
|
|
*/
|
|
LC_OP_FEAT_IND,
|
|
LC_OP_VERS_IND,
|
|
LC_OP_CLKOFF_IND,
|
|
LC_OP_TIMACC_IND,
|
|
LC_OP_PT_IND,
|
|
#if RW_BT_MWS_COEX
|
|
LC_OP_SAM_IND,
|
|
LC_OP_SAM_CFM,
|
|
#endif //RW_BT_MWS_COEX
|
|
LC_OP_HL_CNX_IND,
|
|
LC_OP_HL_CNX_CONT_IND,
|
|
LC_OP_AUTH_IND,
|
|
LC_OP_ENC_IND,
|
|
LC_OP_EPR_IND,
|
|
LC_OP_SET_CMP_IND,
|
|
LC_OP_NAME_REQ_IND,
|
|
LC_OP_SSRNEGO_IND,
|
|
LC_OP_QOS_IND,
|
|
LC_OP_DETACH_IND,
|
|
|
|
LC_AUTH_STG1_RANDN,
|
|
LC_QUERY_HOST_EXP_IND,
|
|
|
|
/*
|
|
* ************** Msg LD->LC****************
|
|
*/
|
|
LC_LMP_RX_IND,
|
|
LC_LMP_TX_CFM,
|
|
LC_ACL_RX_IND,
|
|
LC_ACL_RX_MIC_ERR_IND,
|
|
LC_ACL_TX_CFM,
|
|
|
|
LC_ACL_DISC_IND,
|
|
|
|
LC_RSW_END_IND,
|
|
LC_RSW_SLOT_OFFSET_IND,
|
|
LC_PWR_INCR_IND,
|
|
LC_PWR_DECR_IND,
|
|
LC_PWR_MAX_IND,
|
|
LC_SSR_INST_IND,
|
|
|
|
LC_SNIFF_OFFSET_UPD_IND,
|
|
LC_SCO_OFFSET_UPD_IND,
|
|
|
|
#if VOICE_OVER_HCI
|
|
LC_SYNC_RX_IND,
|
|
LC_SYNC_TX_CFM,
|
|
#endif //VOICE_OVER_HCI
|
|
|
|
#if PCA_SUPPORT
|
|
LC_LOCAL_PCA_REQ,
|
|
LC_PCA_SSCAN_START_REQ,
|
|
#endif // PCA_SUPPORT
|
|
|
|
LC_MWS_PATTERN_IND,
|
|
};
|
|
|
|
/*
|
|
* ************** API LD->LC ****************
|
|
*/
|
|
|
|
/// LC LMP reception indication structure
|
|
/*@TRACE*/
|
|
struct lc_lmp_rx_ind
|
|
{
|
|
/// PDU length
|
|
uint8_t length;
|
|
/// PDU (packed)
|
|
uint8_t pdu[__ARRAY_EMPTY];
|
|
};
|
|
|
|
/// LC LMP reception structure
|
|
/*@TRACE*/
|
|
struct lc_lmp_rx
|
|
{
|
|
/// PDU (unpacked)
|
|
uint8_t pdu[1];
|
|
};
|
|
|
|
/// LC LMP transmission confirmation structure
|
|
/*@TRACE*/
|
|
struct lc_lmp_tx_cfm
|
|
{
|
|
/// EM buffer containing PDU
|
|
uint16_t em_buf;
|
|
};
|
|
|
|
/// LC ACL reception indication structure
|
|
/*@TRACE*/
|
|
struct lc_acl_rx_ind
|
|
{
|
|
/// EM buffer containing PDU
|
|
uint16_t em_buf;
|
|
/// Data length + Data Flags (PBF + BF)
|
|
uint16_t data_len_flags;
|
|
};
|
|
|
|
/// LC ACL transmission confirmation structure
|
|
/*@TRACE*/
|
|
struct lc_acl_tx_cfm
|
|
{
|
|
/// Indicated whether buffer has been successfully transmitted (False) or flushed (True)
|
|
bool flushed;
|
|
};
|
|
|
|
/// LC Role Switch end indication structure
|
|
/*@TRACE*/
|
|
struct lc_rsw_end_ind
|
|
{
|
|
/// Status
|
|
uint8_t status;
|
|
};
|
|
|
|
/// LC sniff offset update indication structure
|
|
/*@TRACE*/
|
|
struct lc_sniff_offset_upd_ind
|
|
{
|
|
/// Sniff offset in half-slots
|
|
uint16_t sniff_offset;
|
|
};
|
|
|
|
/// LC SCO offset update indication structure
|
|
/*@TRACE*/
|
|
struct lc_sco_offset_upd_ind
|
|
{
|
|
/// SCO link id
|
|
uint8_t sco_link_id;
|
|
/// SCO offset in slots
|
|
uint16_t sco_offset;
|
|
};
|
|
|
|
#if VOICE_OVER_HCI
|
|
/// LC SYNC reception indication structure
|
|
/*@TRACE*/
|
|
struct lc_sync_rx_ind
|
|
{
|
|
/// EM buffer containing PDU
|
|
uint16_t em_buf;
|
|
/// Data length
|
|
uint8_t data_len;
|
|
/// Packet status flag
|
|
uint8_t packet_status_flag;
|
|
/// Synchronous link identifier
|
|
uint8_t sync_link_id;
|
|
};
|
|
|
|
/// LC SYNC transmission confirmation structure
|
|
/*@TRACE*/
|
|
struct lc_sync_tx_cfm
|
|
{
|
|
/// Synchronous link identifier
|
|
uint8_t sync_link_id;
|
|
};
|
|
#endif //VOICE_OVER_HCI
|
|
|
|
#if PCA_SUPPORT
|
|
/// LC PCA local adjustment request structure
|
|
/*@TRACE*/
|
|
struct lc_local_pca_req
|
|
{
|
|
/// Clock adjusted us
|
|
int16_t clk_adj_us;
|
|
/// Clock adjusted slots
|
|
uint8_t clk_adj_slots;
|
|
/// Clock adjusted period (slots)
|
|
uint8_t clk_adj_period;
|
|
};
|
|
|
|
/// LC Sync Scan start request for PCA recovery mode
|
|
/*@TRACE*/
|
|
struct lc_pca_sscan_start_req
|
|
{
|
|
/// Scan Window
|
|
uint16_t scan_window;
|
|
/// Scan Interval
|
|
uint16_t scan_interval;
|
|
/// Scan Timeout
|
|
uint32_t scan_timeout;
|
|
};
|
|
#endif // PCA_SUPPORT
|
|
|
|
/*
|
|
* ************** API LB->LC ****************
|
|
*/
|
|
///LC master key request message structure
|
|
/*@TRACE*/
|
|
struct lc_mst_key_req
|
|
{
|
|
///New key flag
|
|
uint8_t new_key_flag;
|
|
};
|
|
|
|
#if PCA_SUPPORT
|
|
///LB indicates clock recovery data to LC
|
|
/*@TRACE*/
|
|
struct lc_pca_sscan_clk_ind
|
|
{
|
|
/// Clock_Offset (28 bits) - (CLKNslave - CLK) modulo 2^28
|
|
uint32_t clock_offset;
|
|
/// Bit offset (CLKNslave - CLK) modulo 2^28
|
|
int16_t bit_offset;
|
|
/// BD_ADDR
|
|
struct bd_addr bd_addr;
|
|
};
|
|
#endif // PCA_SUPPORT
|
|
|
|
/*
|
|
* ************** API LC->LC ****************
|
|
*/
|
|
|
|
/// Setup synchronous connection message structure
|
|
/*@TRACE*/
|
|
struct lc_op_loc_sniff_req
|
|
{
|
|
/// Maximum interval (in slots)
|
|
uint16_t max_int;
|
|
/// Minimum interval (in slots)
|
|
uint16_t min_int;
|
|
/// Attempts (number of receive slots) (in slots)
|
|
uint16_t attempt;
|
|
/// Timeout (number of receive slots) (in slots)
|
|
uint16_t timeout;
|
|
};
|
|
|
|
#if MAX_NB_SYNC
|
|
/// Setup synchronous connection message structure
|
|
/*@TRACE*/
|
|
struct lc_op_loc_sync_con_req
|
|
{
|
|
/// Connection handle
|
|
uint16_t conhdl;
|
|
/// Indicate if the incoming HCI command is HCI_Setup_Sync_Con or HCI_Enhanced_Setup_Sync_Con
|
|
bool old_style;
|
|
/// Indicate if the procedure is initiated by the host (true) or not (false)
|
|
bool host_initiated;
|
|
};
|
|
#endif // MAX_NB_SYNC
|
|
|
|
/// LC SAM Submap update indication structure
|
|
struct lc_sam_submap_update_ind
|
|
{
|
|
/// Update mode
|
|
uint8_t update_mode;
|
|
/// Submap
|
|
uint8_t submap[SAM_TYPE0_SUBMAP_LEN];
|
|
/// num Tx slots
|
|
uint16_t n_tx_slots;
|
|
/// num Rx slots
|
|
uint16_t n_rx_slots;
|
|
};
|
|
|
|
/// LC SAM Map update indication structure
|
|
struct lc_sam_map_update_ind
|
|
{
|
|
/// SAM Pattern Index
|
|
uint8_t pattern_index;
|
|
/// Tsam-sm (slots)
|
|
uint8_t t_sam_sm;
|
|
/// Nsam-sm (slots)
|
|
uint8_t n_sam_sm;
|
|
/// SAM Submaps
|
|
struct sam_submaps submaps;
|
|
};
|
|
|
|
/// LC MWS Pattern index update indication strucutre
|
|
struct lc_mws_pattern_ind
|
|
{
|
|
/// Active pattern index
|
|
uint8_t pattern_index;
|
|
/// Interval
|
|
//uint16_t interval;
|
|
/// Time when pattern will be activated
|
|
rwip_time_t time;
|
|
/// Tsam - length of SAM pattern (slots)
|
|
uint16_t t_sam;
|
|
/// Tsam_sm = length of SAM submaps (slots)
|
|
uint8_t t_sam_sm;
|
|
/// Number of TX slots in this pattern
|
|
uint16_t n_tx_slots;
|
|
/// Number of RX slots in this pattern
|
|
uint16_t n_rx_slots;
|
|
/// Number of external submaps in this pattern
|
|
uint8_t n_ex_sm;
|
|
};
|
|
|
|
|
|
/*
|
|
* FUNCTION DECLARATIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Initialization of the BT LC task
|
|
*
|
|
* This function initializes the LC task, as well as the environment of the LC
|
|
****************************************************************************************
|
|
*/
|
|
void lc_init(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Reset the BT LC task
|
|
****************************************************************************************
|
|
*/
|
|
void lc_reset(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief Start an LC task instance
|
|
*
|
|
* This function starts an LC task instance for a connection establishment or name
|
|
* request.
|
|
*
|
|
* @param[in] link_id Link identifier
|
|
* @param[in] reason Purpose of the connection (0: Master | 1: Slave | 2: Rem Name)
|
|
* @param[in] bd_addr Peer device bd_addr
|
|
* @param[in] pkt_type ACL packet types (master links only)
|
|
* @param[in] switch_en Indicates whether role switch is enabled or not (master links only)
|
|
* @param[in] class_of_dev Peer device Class of Device (slave links only)
|
|
* @param[in] link_pol_stg Default link policy settings
|
|
* @param[in] slave_timing_info_ptr Slave timing information pointer (slave links only)
|
|
****************************************************************************************
|
|
*/
|
|
void lc_start(uint8_t link_id, uint8_t reason, struct bd_addr bd_addr, uint16_t pkt_type, uint8_t switch_en, struct devclass class_of_dev, uint8_t link_pol_stg, void* slave_timing_info_ptr);
|
|
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief LC util to get max packet size - used external to LC
|
|
*
|
|
* @param[in] pkt_type ACL packet types
|
|
*
|
|
* @return max packet size
|
|
****************************************************************************************
|
|
*/
|
|
uint16_t lc_util_get_max_packet_size(uint16_t PacketType);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function is used to compute the number of slot required.
|
|
*
|
|
* @param[in] PacketType Packet type
|
|
*
|
|
* @return Nb of computed slot of the packet type.
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t LM_MaxSlot(uint16_t PacketType);
|
|
|
|
#if PCA_SUPPORT
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function prepares all slaves in advance of an LMP_clk_adj.
|
|
*
|
|
* @return status as a result of processing the request.
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lc_prepare_all_slaves_for_clk_adj(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function notifies all slaves of clk_adj procedure completion.
|
|
*
|
|
****************************************************************************************
|
|
*/
|
|
void lc_notify_all_slaves_clk_adj_complete(void);
|
|
#endif // PCA_SUPPORT
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function checks if all connected support secure connections.
|
|
*
|
|
* @return True: secure connection supported by all slaves / False otherwise
|
|
****************************************************************************************
|
|
*/
|
|
bool lc_check_all_slaves_support_sec_con(void);
|
|
|
|
#if (MAX_NB_SYNC > 0)
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function returns the number of synchronous links.
|
|
*
|
|
* @return number of synchronous links present.
|
|
*
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lm_get_nb_sync_link(void);
|
|
|
|
/**
|
|
****************************************************************************************
|
|
* @brief This function returns the minimum synchronous link interval.
|
|
*
|
|
* @return minimum synchronous link interval, else 0xFF if no synchronous links are present.
|
|
*
|
|
****************************************************************************************
|
|
*/
|
|
uint8_t lm_get_min_sync_intv(void);
|
|
#endif //(MAX_NB_SYNC > 0)
|
|
|
|
/// @} LC
|
|
|
|
#endif // LC_H_
|