vos/ambiq-hal-sys/ambiq-sparkfun-sdk/third_party/exactle/ble-host/include/l2c_api.h
2022-10-23 23:45:43 -07:00

477 lines
18 KiB
C

/*************************************************************************************************/
/*!
* \file
*
* \brief L2CAP subsystem API.
*
* Copyright (c) 2009-2018 Arm Ltd.
*
* Copyright (c) 2019 Packetcraft, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*************************************************************************************************/
#ifndef L2C_API_H
#define L2C_API_H
#include "dm_api.h"
#include "l2c_defs.h"
#ifdef __cplusplus
extern "C" {
#endif
/*! \addtogroup STACK_L2CAP_API
* \{ */
/**************************************************************************************************
Macros
**************************************************************************************************/
/** \name L2CAP Control Callback Events
* Control callback message events
*/
/**@{*/
#define L2C_CTRL_FLOW_ENABLE_IND 0 /*!< \brief Data flow enabled */
#define L2C_CTRL_FLOW_DISABLE_IND 1 /*!< \brief Data flow disabled */
/**@}*/
/*! \brief Invalid channel registration ID for connection oriented channels */
#define L2C_COC_REG_ID_NONE 0
/*! \brief Invalid channel ID for connection oriented channels */
#define L2C_COC_CID_NONE 0
/*! \brief Invalid signal identifier */
#define L2C_SIGNAL_ID_INVALID 0
/** \name L2CAP COC Channel Roles
* Connection oriented channel initiator/acceptor role
*/
/**@{*/
#define L2C_COC_ROLE_NONE 0x00 /*!< \brief No role (unallocated) */
#define L2C_COC_ROLE_INITIATOR 0x01 /*!< \brief Channel initiator */
#define L2C_COC_ROLE_ACCEPTOR 0x02 /*!< \brief Channel acceptor */
/**@}*/
/** \name L2CAP COC Data Confirm Codes
* Connection oriented channel data confirm status values
*/
/**@{*/
#define L2C_COC_DATA_SUCCESS 0 /*!< \brief Data request successful */
#define L2C_COC_DATA_ERR_MEMORY 1 /*!< \brief Out of memory */
#define L2C_COC_DATA_ERR_OVERFLOW 2 /*!< \brief Transaction overflow */
/**@}*/
/** \name L2CAP COC Callback Events
* Connection oriented channel callback events.
*/
/**@{*/
#define L2C_COC_CBACK_START 0x70 /*!< \brief L2C callback event starting value */
/*! \brief COC callback events */
enum
{
L2C_COC_CONNECT_IND = L2C_COC_CBACK_START, /*!< \brief Channel connect indication */
L2C_COC_DISCONNECT_IND, /*!< \brief Channel disconnect indication */
L2C_COC_DATA_IND, /*!< \brief Received data indication */
L2C_COC_DATA_CNF /*!< \brief Transmit data confirm */
};
#define L2C_COC_CBACK_CBACK_END L2C_COC_DATA_CNF /*!< \brief L2C callback event ending value */
/**@}*/
/**************************************************************************************************
Data Types
**************************************************************************************************/
/*! \brief Connection oriented channel registration ID */
typedef uint16_t l2cCocRegId_t;
/*! \brief Connection oriented channel registration structure */
typedef struct
{
uint16_t psm; /*!< \brief Protocol service multiplexer */
uint16_t mps; /*!< \brief Maximum receive PDU fragment size */
uint16_t mtu; /*!< \brief Maximum receive data packet size */
uint16_t credits; /*!< \brief Data packet receive credits for this channel */
bool_t authoriz; /*!< \brief TRUE if authorization is required */
uint8_t secLevel; /*!< \brief Channel minimum security level requirements */
uint8_t role; /*!< \brief Channel initiator/acceptor role */
} l2cCocReg_t;
/*! \brief Connection oriented channel connect indication structure */
typedef struct
{
wsfMsgHdr_t hdr; /*!< \brief Header structure */
uint16_t cid; /*!< \brief Local channel ID */
uint16_t peerMtu; /*!< \brief Data packet MTU peer can receive */
uint16_t psm; /*!< \brief Connected PSM */
} l2cCocConnectInd_t;
/*! \brief Connection oriented channel disconnect indication structure */
typedef struct
{
wsfMsgHdr_t hdr; /*!< \brief Header structure */
uint16_t cid; /*!< \brief Local channel ID */
uint16_t result; /*!< \brief Connection failure result code */
} l2cCocDisconnectInd_t;
/*! \brief Connection oriented channel data indication structure */
typedef struct
{
wsfMsgHdr_t hdr; /*!< \brief Header structure */
uint16_t cid; /*!< \brief Local channel ID */
uint8_t *pData; /*!< \brief Pointer to packet data */
uint16_t dataLen; /*!< \brief packet data length */
} l2cCocDataInd_t;
/*! \brief Connection oriented channel disconnect indication structure */
typedef struct
{
wsfMsgHdr_t hdr; /*!< \brief Header structure */
uint16_t cid; /*!< \brief Local channel ID */
} l2cCocDataCnf_t;
/*!
* \brief Connection oriented channel event structure
*
* Connection oriented channel callback header parameters:
*
* \param hdr.event Callback event
* \param hdr.param DM connection ID
* \param hdr.status Event status (L2C_COC_DATA_CNF only)
*/
typedef union
{
wsfMsgHdr_t hdr; /*!< \brief Header structure */
l2cCocConnectInd_t connectInd; /*!< \brief Channel connect indication */
l2cCocDisconnectInd_t disconnectInd; /*!< \brief Channel disconnect indication */
l2cCocDataInd_t dataInd; /*!< \brief Received data indication */
l2cCocDataCnf_t dataCnf; /*!< \brief Transmit data confirm */
} l2cCocEvt_t;
/*! \brief Configurable parameters */
typedef struct
{
uint16_t reqTimeout; /*!< \brief Request timeout in seconds */
} l2cCfg_t;
/*! \} */ /* STACK_L2CAP_API */
/**************************************************************************************************
Global Variables;
**************************************************************************************************/
/*! \addtogroup STACK_INIT
* \{ */
/** \name L2CAP Configuration Structure
* Pointer to structure containing initialization details of the L2CAP Subsystem. To be configured
* by Application.
*/
/**@{*/
/*! \brief Configuration pointer */
extern l2cCfg_t *pL2cCfg;
/**@}*/
/*! \} */ /* STACK_INIT */
/**************************************************************************************************
Callback Function Types
**************************************************************************************************/
/*! \addtogroup STACK_L2CAP_API
* \{ */
/*************************************************************************************************/
/*!
* \brief This callback function sends a received L2CAP packet to the client.
*
* \param handle The connection handle.
* \param len The length of the L2CAP payload data in pPacket.
* \param pPacket A buffer containing the packet.
*
* \return None.
*/
/*************************************************************************************************/
typedef void (*l2cDataCback_t)(uint16_t handle, uint16_t len, uint8_t *pPacket);
/*************************************************************************************************/
/*!
* \brief This callback function sends control messages to the client.
*
* \param pMsg Pointer to message structure.
*
* \return None.
*/
/*************************************************************************************************/
typedef void (*l2cCtrlCback_t)(wsfMsgHdr_t *pMsg);
/*************************************************************************************************/
/*!
* \brief This callback function sends data and other events to connection oriented
* channels clients.
*
* \param pMsg Pointer to message structure.
*
* \return None.
*/
/*************************************************************************************************/
typedef void (*l2cCocCback_t)(l2cCocEvt_t *pMsg);
/*************************************************************************************************/
/*!
* \brief This callback function is used for authoriztion of connection oriented channels.
*
* \param connId DM connection ID.
* \param regId The registration instance requiring authorization.
* \param psm The PSM of the registration instance.
*
* \return L2C_CONN_SUCCESS if authorization is successful, any other value for failure.
*/
/*************************************************************************************************/
typedef uint16_t (*l2cCocAuthorCback_t)(dmConnId_t connId, l2cCocRegId_t regId, uint16_t psm);
/**************************************************************************************************
Function Declarations
**************************************************************************************************/
/** \name L2CAP Initialization
* Initialization and registration functions
*/
/**@{*/
/*************************************************************************************************/
/*!
* \brief Initialize L2C subsystem.
*
* \return None.
*/
/*************************************************************************************************/
void L2cInit(void);
/*************************************************************************************************/
/*!
* \brief Initialize L2C for operation as a Bluetooth LE master.
*
* \return None.
*/
/*************************************************************************************************/
void L2cMasterInit(void);
/*************************************************************************************************/
/*!
* \brief Initialize L2C for operation as a Bluetooth LE slave.
*
* \return None.
*/
/*************************************************************************************************/
void L2cSlaveInit(void);
/**@}*/
/** \name L2CAP CID Functions
* Register and send data over a CID
*/
/**@{*/
/*************************************************************************************************/
/*!
* \brief called by the L2C client, such as ATT or SMP, to register for the given CID.
*
* \param cid channel identifier.
* \param dataCback Callback function for L2CAP data received for this CID.
* \param ctrlCback Callback function for control events for this CID.
*
* \return None.
*/
/*************************************************************************************************/
void L2cRegister(uint16_t cid, l2cDataCback_t dataCback, l2cCtrlCback_t ctrlCback);
/*************************************************************************************************/
/*!
* \brief Send an L2CAP data packet on the given CID.
*
* \param cid The channel identifier.
* \param handle The connection handle. The client receives this handle from DM.
* \param len The length of the payload data in pPacket.
* \param pL2cPacket A buffer containing the packet.
*
* \return None.
*/
/*************************************************************************************************/
void L2cDataReq(uint16_t cid, uint16_t handle, uint16_t len, uint8_t *pL2cPacket);
/*************************************************************************************************/
/*!
* \brief Build and send a signaling packet.
*
* \param handle The connection handle.
* \param code Type of command.
* \param len Length of the parameter.
* \param pParam parameters of command to send.
*
* \return None.
*/
/*************************************************************************************************/
void L2cDmSigReq(uint16_t handle, uint8_t code, uint16_t len, uint8_t *pParam);
/**@}*/
/** \name L2CAP COC Functions
* Connection Oriented Channels Functions
*/
/**@{*/
/*************************************************************************************************/
/*!
* \brief Initialize L2C connection oriented channel subsystem.
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocInit(void);
/*************************************************************************************************/
/*!
* \brief Register to use a connection oriented channel, as either a channel acceptor,
* initiator, or both. If registering as channel acceptor then the PSM is specified.
* After registering a connection can be established by the client using this
* registration instance.
*
* \param cback Client callback function.
* \param pReg Registration parameter structure.
*
* \return Registration instance ID or L2C_COC_REG_ID_NONE if registration failed.
*/
/*************************************************************************************************/
l2cCocRegId_t L2cCocRegister(l2cCocCback_t cback, l2cCocReg_t *pReg);
/*************************************************************************************************/
/*!
* \brief Deregister and deallocate a connection oriented channel registration instance.
* This function should only be called if there are no active channels using this
* registration instance.
*
* \param regId Registration instance ID.
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocDeregister(l2cCocRegId_t regId);
/*************************************************************************************************/
/*!
* \brief Initiate a connection to the given peer PSM.
*
* \param connId DM connection ID.
* \param regId The associated registration instance.
* \param psm Peer PSM.
*
* \return Local CID or L2C_COC_CID_NONE none if failure.
*/
/*************************************************************************************************/
uint16_t L2cCocConnectReq(dmConnId_t connId, l2cCocRegId_t regId, uint16_t psm);
/*************************************************************************************************/
/*!
* \brief Disconnect the channel for the given CID.
*
* \param cid Channel ID.
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocDisconnectReq(uint16_t cid);
/*************************************************************************************************/
/*!
* \brief Send an L2CAP data packet on the given connection oriented CID.
*
* \param cid The local channel identifier.
* \param len The length of the payload data in pPacket.
* \param pPayload Packet payload data.
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocDataReq(uint16_t cid, uint16_t len, uint8_t *pPayload);
/*************************************************************************************************/
/*!
* \brief For testing purposes only.
*
* \param result Result code
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocErrorTest(uint16_t result);
/*************************************************************************************************/
/*!
* \brief For testing purposes only.
*
* \param cid The local channel identifier.
* \param credits Credits to send.
*
* \return None.
*/
/*************************************************************************************************/
void L2cCocCreditSendTest(uint16_t cid, uint16_t credits);
/**@}*/
/** \name L2CAP Connection Parameter Update Functions
*
*/
/**@{*/
/*************************************************************************************************/
/*!
* \brief For internal use only. This function is called by DM to send an L2CAP
* connection update request.
*
* \param handle The connection handle.
* \param pConnSpec Pointer to the connection specification structure.
*
* \return None.
*/
/*************************************************************************************************/
void L2cDmConnUpdateReq(uint16_t handle, hciConnSpec_t *pConnSpec);
/*************************************************************************************************/
/*!
* \brief For internal use only. This function is called by DM to send an L2CAP
* connection update response.
*
* \param identifier Identifier value previously passed from L2C to DM.
* \param handle The connection handle.
* \param result Connection update response result.
*
* \return None.
*/
/*************************************************************************************************/
void L2cDmConnUpdateRsp(uint8_t identifier, uint16_t handle, uint16_t result);
/**@}*/
/*! \} */ /*! STACK_L2CAP_API */
#ifdef __cplusplus
};
#endif
#endif /* L2C_API_H */