526 lines
18 KiB
C
526 lines
18 KiB
C
|
#ifndef HCI_H_
|
||
|
#define HCI_H_
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @addtogroup HCI Host Controller Interface
|
||
|
* @ingroup ROOT
|
||
|
* @brief HCI module handling communication between lower and higher layers in split
|
||
|
* architecture.
|
||
|
* @{
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* INCLUDE FILES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#include "rwip_config.h" // SW configuration
|
||
|
|
||
|
#if (HCI_PRESENT)
|
||
|
|
||
|
#include <stddef.h> // standard definition
|
||
|
#include <stdint.h> // standard integer
|
||
|
#include "co_bt.h" // BT standard definitions
|
||
|
|
||
|
#include "rwip_task.h" // Task definitions
|
||
|
|
||
|
#include "bridge.h"
|
||
|
|
||
|
/*
|
||
|
* DEFINES
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
#if (BLE_EMB_PRESENT || BLE_HOST_PRESENT)
|
||
|
#if (BLE_CENTRAL || BLE_PERIPHERAL)
|
||
|
#define HCI_BLE_CON_SUPPORT 1
|
||
|
#else // (BLE_CENTRAL || BLE_PERIPHERAL)
|
||
|
#define HCI_BLE_CON_SUPPORT 0
|
||
|
#endif // (BLE_CENTRAL || BLE_PERIPHERAL)
|
||
|
#else //(BLE_EMB_PRESENT || BLE_HOST_PRESENT)
|
||
|
#define HCI_BLE_CON_SUPPORT 0
|
||
|
#endif //(BLE_EMB_PRESENT || BLE_HOST_PRESENT)
|
||
|
|
||
|
/// Length of HCI Reset Message
|
||
|
#define HCI_RESET_MSG_LEN 4
|
||
|
|
||
|
/// HCI Reset Message use to resync.
|
||
|
#define HCI_RESET_MSG_BUF {HCI_CMD_MSG_TYPE, (HCI_RESET_CMD_OPCODE & 0xFF), ((HCI_RESET_CMD_OPCODE >> 8) & 0xFF), 0}
|
||
|
|
||
|
/*
|
||
|
* TYPE DEFINITIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/// Message API of the HCI task
|
||
|
enum HCI_MSG
|
||
|
{
|
||
|
HCI_MSG_ID_FIRST = TASK_FIRST_MSG(TASK_ID_HCI),
|
||
|
|
||
|
HCI_CMD_CMP_EVENT,
|
||
|
HCI_CMD_STAT_EVENT,
|
||
|
HCI_EVENT,
|
||
|
HCI_LE_EVENT,
|
||
|
|
||
|
HCI_COMMAND,
|
||
|
|
||
|
#if (HCI_BLE_CON_SUPPORT)
|
||
|
HCI_BLE_ACL_DATA_RX,
|
||
|
HCI_BLE_ACL_DATA_TX,
|
||
|
#endif // (HCI_BLE_CON_SUPPORT)
|
||
|
|
||
|
#if BT_EMB_PRESENT
|
||
|
HCI_BT_ACL_DATA_TX,
|
||
|
HCI_BT_ACL_DATA_RX,
|
||
|
#if VOICE_OVER_HCI
|
||
|
HCI_BT_SYNC_DATA_TX,
|
||
|
HCI_BT_SYNC_DATA_RX,
|
||
|
#endif //VOICE_OVER_HCI
|
||
|
#endif //BT_EMB_PRESENT
|
||
|
|
||
|
HCI_TCI_LMP,
|
||
|
|
||
|
HCI_DBG_EVT,
|
||
|
|
||
|
HCI_MSG_ID_LAST
|
||
|
};
|
||
|
|
||
|
/// Status of HCI command header processing
|
||
|
enum HCI_CMD_HDR
|
||
|
{
|
||
|
/// Header is correct
|
||
|
HCI_CMD_HDR_STATUS_OK,
|
||
|
/// Opcode is unknown
|
||
|
HCI_CMD_HDR_STATUS_UNKNOWN,
|
||
|
/// Header is not correct
|
||
|
HCI_CMD_HDR_STATUS_FAIL
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
///HCI Command header components structure
|
||
|
struct hci_cmd_hdr
|
||
|
{
|
||
|
/// Opcode field
|
||
|
uint16_t opcode;
|
||
|
///Parameter length - the number of bytes of the command parameters
|
||
|
uint8_t parlen;
|
||
|
};
|
||
|
|
||
|
///HCI ACL data packets header structure
|
||
|
struct hci_acl_hdr
|
||
|
{
|
||
|
///Connection handle & Data Flags
|
||
|
uint16_t hdl_flags;
|
||
|
///Data length in number of bytes
|
||
|
uint16_t datalen;
|
||
|
};
|
||
|
|
||
|
#if (BT_EMB_PRESENT)
|
||
|
#if (VOICE_OVER_HCI)
|
||
|
///HCI synchronous data packets header structure
|
||
|
struct hci_sync_hdr
|
||
|
{
|
||
|
/// Connection handle & Data Flags
|
||
|
uint16_t conhdl_flags;
|
||
|
/// Data total length in number of bytes
|
||
|
uint8_t data_total_len;
|
||
|
};
|
||
|
#endif // (VOICE_OVER_HCI)
|
||
|
#endif // (BT_EMB_PRESENT)
|
||
|
|
||
|
///HCI Event header components structure - contains all details possible in an event
|
||
|
struct hci_evt_hdr
|
||
|
{
|
||
|
///Event code
|
||
|
uint8_t code;
|
||
|
///Event parameters length
|
||
|
uint8_t parlen;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* GLOBAL VARIABLE DECLARATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* FUNCTION DECLARATIONS
|
||
|
****************************************************************************************
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Initialize HCI (including transport)
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_init(bool reset);
|
||
|
|
||
|
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Function called when an internal task needs to send a HCI message to Host
|
||
|
*
|
||
|
* This function decides whether the message is sent externally onto HCI Transport Layer
|
||
|
* or redirected into an internal task of the other side of the HCI.
|
||
|
*
|
||
|
* The input message ID, length and parameters must be filled.
|
||
|
* In case the message is an HCI command or event, the source ID must be filled with the
|
||
|
* command opcode or event code.
|
||
|
* In case the message concerns a particular BT or BLE link, the destination ID must be
|
||
|
* filled with the associated link ID.
|
||
|
*
|
||
|
* @param[in] param Pointer to the parameters of the Kernel message carrying the HCI message
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_send_2_host(void *param);
|
||
|
#endif // (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||
|
|
||
|
#if BLE_HOST_PRESENT
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Function called when an internal task needs to send a HCI message to Controller
|
||
|
*
|
||
|
* This function decides whether the message is sent externally onto HCI Transport Layer
|
||
|
* or redirected into an internal task of the other side of the HCI.
|
||
|
*
|
||
|
* The input message ID, length and parameters must be filled.
|
||
|
* In case the message is an HCI command or event, the source ID must be filled with the
|
||
|
* command opcode or event code.
|
||
|
* In case the message concerns a particular BT or BLE link, the destination ID must be
|
||
|
* filled with the associated link ID.
|
||
|
*
|
||
|
* @param[in] param Pointer to the parameters of the Kernel message carrying the HCI message
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_send_2_controller(void *param);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief function used to send a basic command, without parameters to the controller.
|
||
|
*
|
||
|
* @param[in] opcode Operation code of the command
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_basic_cmd_send_2_controller(uint16_t opcode);
|
||
|
#endif //BLE_HOST_PRESENT
|
||
|
|
||
|
#if (BLE_EMB_PRESENT && HCI_BLE_CON_SUPPORT)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Register connection handle for a BLE connection
|
||
|
*
|
||
|
* @param[in] link_id BLE connection link ID
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_ble_conhdl_register(uint8_t link_id);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Unregister a BLE connection
|
||
|
*
|
||
|
* @param[in] link_id BLE connection link ID
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_ble_conhdl_unregister(uint8_t link_id);
|
||
|
#endif //(BLE_EMB_PRESENT && !BLE_HOST_PRESENT && HCI_BLE_CON_SUPPORT)
|
||
|
|
||
|
#if (BT_EMB_PRESENT)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Register BD address for a BT ACL connection
|
||
|
*
|
||
|
* @param[in] link_id BT ACL connection link ID
|
||
|
* @param[in] bd_addr Pointer to the device BD address associated to the connection
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_bt_acl_bdaddr_register(uint8_t link_id, struct bd_addr* bd_addr);
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Register connection handle for a BT ACL connection
|
||
|
*
|
||
|
* @param[in] link_id BT ACL connection link ID
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_bt_acl_conhdl_register(uint8_t link_id);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Unregister a BT ACL connection
|
||
|
*
|
||
|
* @param[in] link_id BT ACL connection link ID
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_bt_acl_bdaddr_unregister(uint8_t link_id);
|
||
|
|
||
|
#endif //(BT_EMB_PRESENT)
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Set the event mask
|
||
|
*
|
||
|
* @param[in] evt_msk Pointer to the new event mask
|
||
|
* @param[in] page indicate which event page should be changed
|
||
|
*
|
||
|
* @return The status of the event mask saving
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_evt_mask_set(struct evt_mask const *evt_msk, uint8_t page);
|
||
|
|
||
|
#if (BT_EMB_PRESENT)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Add an event filter according to the parameters of the HCI command
|
||
|
*
|
||
|
* Note: the consistency of the parameters according to the input has already been checked by HCI during the special
|
||
|
* unpacking.
|
||
|
*
|
||
|
* @param[in] param Pointer to the HCI parameter
|
||
|
*
|
||
|
* @return The status of the filter addition
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_evt_filter_add(struct hci_set_evt_filter_cmd const *param);
|
||
|
|
||
|
#if (MAX_NB_SYNC > 0)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Get voice setting (for SCO auto-accept via event filter)
|
||
|
*
|
||
|
* @return Voice settings
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint16_t hci_voice_settings_get(void);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Set voice setting (for SCO auto-accept via event filter)
|
||
|
*
|
||
|
* @param[in] voice_settings Voice settings
|
||
|
*
|
||
|
* @return Status (0: Success | Others: failure)
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_voice_settings_set(uint16_t voice_settings);
|
||
|
#endif // (MAX_NB_SYNC > 0)
|
||
|
#endif //(BT_EMB_PRESENT)
|
||
|
|
||
|
#if (HCI_TL_SUPPORT)
|
||
|
#if (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Get the maximum parameter size for a specific command
|
||
|
*
|
||
|
* This function is used by TL to know the theoretical maximum parameters size for a
|
||
|
* specific HCI command.
|
||
|
* Note: if the command is not supported by HCI (unknown), the maximum possible value of
|
||
|
* 255 bytes is returned.
|
||
|
*
|
||
|
* @param[in] opcode Opcode received
|
||
|
*
|
||
|
* @return The command maximum parameters size / 255 if command is unknown
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_cmd_get_max_param_size(uint16_t opcode);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Indicates that a HCI command has been received
|
||
|
*
|
||
|
* This function is used by TL to indicate the reception of a HCI command.
|
||
|
*
|
||
|
* @param[in] opcode Command Opcode
|
||
|
* @param[in] length Parameters length
|
||
|
* @param[in] payload Pointer to payload
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_cmd_received(uint16_t opcode, uint8_t length, uint8_t *payload);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Allocates the reception buffer for ACL TX data
|
||
|
*
|
||
|
* @param[in] hdl_flags Connection handle and data flags from HCI ACL packet header
|
||
|
* @param[in] len Length to receive (from HCI ACL packet header)
|
||
|
*
|
||
|
* @return Buffer for data reception (NULL if not possible to allocate one)
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t* hci_acl_tx_data_alloc(uint16_t hdl_flags, uint16_t len);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Indicates that a HCI ACL TX data packet has been received
|
||
|
*
|
||
|
* This function is used by TL to indicate the reception of a HCI ACL TX data.
|
||
|
*
|
||
|
* @param[in] hdl_flags Connection handle and data flags from HCI ACL packet header
|
||
|
* @param[out] datalen Data length
|
||
|
* @param[in] payload Pointer to payload
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_acl_tx_data_received(uint16_t hdl_flags, uint16_t datalen, uint8_t * payload);
|
||
|
|
||
|
#if (BT_EMB_PRESENT)
|
||
|
#if (VOICE_OVER_HCI)
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Allocates the reception buffer for Sync TX data
|
||
|
*
|
||
|
* @param[in] conhdl_flags Connection handle and data flags from HCI Sync packet header
|
||
|
* @param[in] len Length to receive (from HCI Sync packet header)
|
||
|
*
|
||
|
* @return Buffer for data reception (NULL if not possible to allocate one)
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t* hci_sync_tx_data_alloc(uint16_t conhdl_flags, uint8_t len);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Indicates that a HCI Sync TX data packet has been received
|
||
|
*
|
||
|
* This function is used by TL to indicate the reception of a HCI Sync TX data.
|
||
|
*
|
||
|
* @param[in] conhdl_flags Connection handle and data flags from HCI Sync packet header
|
||
|
* @param[in] len Length to receive (from HCI Sync packet header)
|
||
|
* @param[in] payload Pointer to payload
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_sync_tx_data_received(uint16_t conhdl_flags, uint8_t len, uint8_t * payload);
|
||
|
#endif // (VOICE_OVER_HCI)
|
||
|
#endif // (BT_EMB_PRESENT)
|
||
|
#endif // (BLE_EMB_PRESENT || BT_EMB_PRESENT)
|
||
|
|
||
|
#if ((BLE_HOST_PRESENT) && (!BLE_EMB_PRESENT))
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Allocates the reception buffer for ACL RX data
|
||
|
*
|
||
|
* @param[in] hdl_flags Connection handle and data flags from HCI ACL RX packet header
|
||
|
* @param[in] len Length to receive (from HCI ACL packet header)
|
||
|
*
|
||
|
* @return Buffer for data reception (NULL if not possible to allocate one)
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t* hci_acl_rx_data_alloc(uint16_t hdl_flags, uint16_t len);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Indicates that a HCI ACL RX data packet has been received
|
||
|
*
|
||
|
* This function is used by TL to indicate the reception of a HCI ACL RX data.
|
||
|
*
|
||
|
* @param[in] hdl_flags Connection handle and data flags from HCI ACL packet header
|
||
|
* @param[out] datalen Data length
|
||
|
* @param[in] payload Pointer to payload
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
//void hci_acl_rx_data_received(uint16_t hdl_flags, uint16_t datalen, uint8_t * payload);
|
||
|
void hci_acl_rx_data_received_payload(uint16_t hdl_flags, uint16_t datalen, uint8_t *payload, uint8_t *priv);
|
||
|
void hci_acl_rx_data_received(uint16_t hdl_flags, uint16_t datalen, BridgeBuffer *briBuffer);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Indicates that a HCI event has been received
|
||
|
*
|
||
|
* This function is used by TL to indicate the reception of a HCI event.
|
||
|
*
|
||
|
* @param[in] code Event code
|
||
|
* @param[in] length Parameters length
|
||
|
* @param[in] payload Pointer to payload
|
||
|
*
|
||
|
* @return status of receive operation
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
//uint8_t hci_evt_received(uint8_t code, uint8_t length, uint8_t *payload);
|
||
|
uint8_t hci_evt_received_payload(uint8_t code, uint8_t length, uint8_t *payload);
|
||
|
uint8_t hci_evt_received(uint8_t code, uint8_t length, BridgeBuffer *briBuffer);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief Check if passing command opcode is supported by ble stack
|
||
|
*
|
||
|
* This function is used to check if passing command opcode is supported by ble stack
|
||
|
*
|
||
|
* @param[in] opcode Command Opcode
|
||
|
*
|
||
|
* @return 1 if supported or 0
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_is_cmd_opcode_supported(uint16_t opcode);
|
||
|
|
||
|
#endif // ((BLE_HOST_PRESENT) && (!BLE_EMB_PRESENT))
|
||
|
|
||
|
#endif // HCI_TL_SUPPORT
|
||
|
|
||
|
//common for both BLE & BT
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief process HostBufferSize
|
||
|
*
|
||
|
* @param[in] acl_pkt_len ACL packet length
|
||
|
* @param[in] nb_acl_pkts Number of ACL packets
|
||
|
*
|
||
|
* @return status
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_fc_acl_buf_size_set(uint16_t acl_pkt_len, uint16_t nb_acl_pkts);
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief process HostBufferSize
|
||
|
*
|
||
|
* @param[in] sync_pkt_len SYNC packet length
|
||
|
* @param[in] nb_sync_pkts Number of SYNC packets
|
||
|
*
|
||
|
* @return status
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_fc_sync_buf_size_set(uint8_t sync_pkt_len, uint16_t nb_sync_pkts);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief set the state of the ACL flow control
|
||
|
*
|
||
|
* @param[in] flow_enable boolean state of control
|
||
|
*
|
||
|
* @return status
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
uint8_t hci_fc_acl_en(bool flow_enable);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief set the state of the SYNC flow control
|
||
|
*
|
||
|
* @param[in] flow_enable boolean state of control
|
||
|
*****************************************************************************************
|
||
|
*/
|
||
|
void hci_fc_sync_en(bool flow_enable);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief update data packet counters according to HostNumberOfCompletePackets
|
||
|
*
|
||
|
* @param[in] acl_pkt_nb accumulated number for ACL handles
|
||
|
***************************************************************************************a**
|
||
|
*/
|
||
|
void hci_fc_host_nb_acl_pkts_complete(uint16_t acl_pkt_nb);
|
||
|
|
||
|
/**
|
||
|
****************************************************************************************
|
||
|
* @brief update data packet counters according to HostNumberOfCompletePackets
|
||
|
*
|
||
|
* @param[in] sync_pkt_nb accumulated number for SCO handles
|
||
|
***************************************************************************************a**
|
||
|
*/
|
||
|
void hci_fc_host_nb_sync_pkts_complete(uint16_t sync_pkt_nb);
|
||
|
|
||
|
#endif //HCI_PRESENT
|
||
|
|
||
|
/// @} HCI
|
||
|
|
||
|
#endif // HCI_H_
|