Files
pwm32e_pro/component/ble/ip/bt/src/lc.h
T
moyuhai 41a602f89c V1.0
2026-06-09 16:39:17 +08:00

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_