123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- /**************************************************************************************************
-
- Phyplus Microelectronics Limited confidential and proprietary.
- All rights reserved.
- IMPORTANT: All rights of this software belong to Phyplus Microelectronics
- Limited ("Phyplus"). Your use of this Software is limited to those
- specific rights granted under the terms of the business contract, the
- confidential agreement, the non-disclosure agreement and any other forms
- of agreements as a customer or a partner of Phyplus. You may not use this
- Software unless you agree to abide by the terms of these agreements.
- You acknowledge that the Software may not be modified, copied,
- distributed or disclosed unless embedded on a Phyplus Bluetooth Low Energy
- (BLE) integrated circuit, either as a product or is integrated into your
- products. Other than for the aforementioned purposes, you may not use,
- reproduce, copy, prepare derivative works of, modify, distribute, perform,
- display or sell this Software and/or its documentation for any purposes.
- YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
- PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
- NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
- PHYPLUS OR ITS SUBSIDIARIES BE LIABLE OR OBLIGATED UNDER CONTRACT,
- NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
- LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
- INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
- OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
- OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
- (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
-
- **************************************************************************************************/
- /**************************************************************************************************
- Filename: l2cap.h
- Revised:
- Revision:
- Description: This file contains the L2CAP definitions.
- **************************************************************************************************/
- #ifndef L2CAP_H
- #define L2CAP_H
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*********************************************************************
- * INCLUDES
- */
- #include "bcomdef.h"
- #include "OSAL.h"
- /*********************************************************************
- * CONSTANTS
- */
- // Minimum supported information payload for the Basic information frame (B-frame)
- #define L2CAP_MTU_SIZE 517//247//23
- // Minimum supported information payload for the Control frame (C-frame)
- #define L2CAP_SIG_MTU_SIZE 23
- // Basic L2CAP header: Length (2 bytes) + Channel ID (2 bytes)
- #define L2CAP_HDR_SIZE 4
- // Minimum size of PDU received from lower layer protocol (incoming
- // packet), or delivered to lower layer protocol (outgoing packet).
- #define L2CAP_PDU_SIZE ( L2CAP_HDR_SIZE + L2CAP_MTU_SIZE )
- // L2CAP Channel Identifiers. Identifiers from 0x0001 to 0x003F are
- // reserved for specific L2CAP functions. Identifiers 0x0001-0x0003
- // are reserved by BR/EDR.
- #define L2CAP_CID_NULL 0x0000 // Illegal Identifier
- #define L2CAP_CID_ATT 0x0004 // Attribute Protocol
- #define L2CAP_CID_SIG 0x0005 // L2CAP Signaling
- #define L2CAP_CID_SMP 0x0006 // Security Management Protocol
- #define L2CAP_CID_GENERIC 0x0007 // Generic Fixed Channel
- // L2CAP Dynamic Channel Identifiers
- #define L2CAP_BASE_DYNAMIC_CID 0x0040
- #define L2CAP_LAST_DYNAMIC_CID ( BASE_DYNAMIC_CID + L2CAP_NUM_CHANNELS - 1 )
-
- // Number of Fixed channels: one for each of ATT, Signaling, SMP channels and one Generic Channel
- #define L2CAP_NUM_FIXED_CHANNELS 4
- // Number of Protocols supported -- for future use
- #define L2CAP_NUM_PROTOCOLS 0
- // Number of Auxiliary channels: one for each of Echo Request, Information
- // Request and Connection Parameter Update Request
- #define L2CAP_NUM_AUX_CHANNELS 3
- // Number of Dynamic channels: one per each protocol supported on each physical connection
- #define L2CAP_NUM_DYNAMIC_CHANNELS ( L2CAP_NUM_PROTOCOLS * MAX_NUM_LL_CONN )
- // Total number of L2CAP channels: Dynamic channels plus Auxiliary channels
- #define L2CAP_NUM_CHANNELS ( L2CAP_NUM_DYNAMIC_CHANNELS + L2CAP_NUM_AUX_CHANNELS )
- // L2CAP Response Timeout expired (RTX) value for Signaling commands (in seconds).
- // The RTX timer is used for response timeout or to terminate a dynamic channel
- // when the remote device is unresponsive to signaling requests. Its value may
- // range from 1 to 60 seconds.
- #define L2CAP_RTX_TIMEOUT 30
- // L2CAP Signaling Codes (type of commands)
- #define L2CAP_CMD_REJECT 0x01
- #define L2CAP_ECHO_REQ 0x08 // No longer supported
- #define L2CAP_ECHO_RSP 0x09 // No longer supported
- #define L2CAP_INFO_REQ 0x0a // No longer supported
- #define L2CAP_INFO_RSP 0x0b // No longer supported
- #define L2CAP_PARAM_UPDATE_REQ 0x12
- #define L2CAP_PARAM_UPDATE_RSP 0x13
- /*********************************************************************
- * Command Reject: Reason Codes
- */
- // Command not understood
- #define L2CAP_REJECT_CMD_NOT_UNDERSTOOD 0x0000
- // Signaling MTU exceeded
- #define L2CAP_REJECT_SIGNAL_MTU_EXCEED 0x0001
- // Invalid CID in request
- #define L2CAP_REJECT_INVALID_CID 0x0002
- /*********************************************************************
- * Information Request/Response: Info Type
- */
- // Connectionless MTU
- #define L2CAP_INFO_CONNLESS_MTU 0x0001
- // Extended features supported
- #define L2CAP_INFO_EXTENDED_FEATURES 0x0002
- // Fixed channels supported
- #define L2CAP_INFO_FIXED_CHANNELS 0x0003
- /*********************************************************************
- * Information Response: Extended Features Mask Values
- */
- // Fixed channels are supported
- #define L2CAP_FIXED_CHANNELS 0x00000080
- // Length of Extended Features bit mask
- #define L2CAP_EXTENDED_FEATURES_SIZE 4
- /*********************************************************************
- * Information Response: Fixed Channels Mask Values
- */
- // Fixed Channel ATT is supported
- #define L2CAP_FIXED_CHANNELS_ATT 0x10
- // Fixed Channel L2CAP Signaling is supported
- #define L2CAP_FIXED_CHANNELS_SIG 0x20
- // Fixed Channel SMP is supported
- #define L2CAP_FIXED_CHANNELS_SMP 0x40
- // Length of Fixed Channels bit mask
- #define L2CAP_FIXED_CHANNELS_SIZE 8
- /*********************************************************************
- * Information Response: Result Values
- */
- // Success
- #define L2CAP_INFO_SUCCESS 0x0000
- // Not supported
- #define L2CAP_INFO_NOT_SUPPORTED 0x0001
- /*********************************************************************
- * Connection Parameter Update Response: Result values
- */
- // Connection Parameters accepted
- #define L2CAP_CONN_PARAMS_ACCEPTED 0x0000
- // Connection Parameters rejected
- #define L2CAP_CONN_PARAMS_REJECTED 0x0001
- /*********************************************************************
- * VARIABLES
- */
- /*********************************************************************
- * MACROS
- */
- /*********************************************************************
- * TYPEDEFS
- */
- // Invalid CID in Request format
- typedef struct
- {
- uint16 localCID; // Destination CID from the rejected command
- uint16 remoteCID; // Source CID from the rejected command
- } l2capInvalidCID_t;
- // Command Reject Reason Data format
- typedef union
- {
- uint16 signalMTU; // Maximum Signaling MTU
- l2capInvalidCID_t invalidCID; // Invalid CID in Request
- } l2capReasonData_t;
- // Command Reject format
- typedef struct
- {
- uint16 reason; // Reason
- l2capReasonData_t reasonData; // Reason Data
- // Shorthand access for union members
- #define maxSignalMTU reasonData.signalMTU
- #define invalidLocalCID reasonData.invalidCID.localCID
- #define invalidRemoteCID reasonData.invalidCID.remoteCID
- } l2capCmdReject_t;
- // Echo Request format
- typedef struct
- {
- uint8 *pData; // Optional data field
- uint16 len; // Length of data
- } l2capEchoReq_t;
- // Echo Response format
- typedef struct
- {
- uint8 *pData; // Optional data field -- must be freed by the application
- uint16 len; // Length of data
- } l2capEchoRsp_t;
- // Information Request format
- typedef struct
- {
- uint16 infoType; // Information type
- } l2capInfoReq_t;
- // Information Response Data field
- typedef union
- {
- uint16 connectionlessMTU; // Connectionless MTU
- uint32 extendedFeatures; // Extended features supported
- uint8 fixedChannels[L2CAP_FIXED_CHANNELS_SIZE]; // Fixed channels supported
- } l2capInfo_t;
- // Information Response format
- typedef struct
- {
- uint16 result; // Result
- uint16 infoType; // Information type
- l2capInfo_t info; // Content of Info field depends on infoType
- } l2capInfoRsp_t;
- // Connection Parameter Update Request format
- typedef struct
- {
- uint16 intervalMin; // Minimum Interval
- uint16 intervalMax; // Maximum Interval
- uint16 slaveLatency; // Slave Latency
- uint16 timeoutMultiplier; // Timeout Multiplier
- } l2capParamUpdateReq_t;
- // Connection Parameter Update Response format
- typedef struct
- {
- uint16 result; // Result
- } l2capParamUpdateRsp_t;
- // Union of all L2CAP Signaling commands
- typedef union
- {
- // Requests
- l2capEchoReq_t echoReq;
- l2capInfoReq_t infoReq;
- l2capParamUpdateReq_t updateReq;
- // Responses
- l2capCmdReject_t cmdReject;
- l2capEchoRsp_t echoRsp;
- l2capInfoRsp_t infoRsp;
- l2capParamUpdateRsp_t updateRsp;
- } l2capSignalCmd_t;
- // OSAL L2CAP_SIGNAL_EVENT message format. This message is used to deliver an
- // incoming Signaling command up to an upper layer application.
- typedef struct
- {
- osal_event_hdr_t hdr; // L2CAP_SIGNAL_EVENT and status
- uint16 connHandle; // connection message was received on
- uint8 id; // identifier to match responses with requests
- uint8 opcode; // type of command
- l2capSignalCmd_t cmd; // command data
- } l2capSignalEvent_t;
- // L2CAP packet structure
- typedef struct
- {
- uint16 CID; // local channel id
- uint8 *pPayload; // pointer to information payload. This contains the payload
- // received from the upper layer protocol (outgoing packet),
- // or delivered to the upper layer protocol (incoming packet).
- uint16 len; // length of information payload
- } l2capPacket_t;
- // OSAL L2CAP_DATA_EVENT message format. This message is used to forward an
- // incoming data packet up to an upper layer application.
- typedef struct
- {
- osal_event_hdr_t hdr; // L2CAP_DATA_EVENT and status
- uint16 connHandle; // connection packet was received on
- l2capPacket_t pkt; // received packet
- } l2capDataEvent_t;
- typedef struct
- {
- uint16 cIdx; // reassemble packet current idx
- l2capPacket_t pkt; // received packet
- } l2capReassemblePkt_t;
- typedef struct
- {
- uint8 len; // pkt len
- uint8* ptr ; // pkt point
- } segmentBuff_t;
- typedef struct
- {
- segmentBuff_t pkt[20];//251/27->9.2 , 20200604 10 --> 20 : support for MTU 517
- uint8 depth;
- uint8 idx;
- uint8* pBufScr; //source buffer ptr
- uint8 fragment;
- } l2capSegmentBuff_t;
- typedef struct
- {
- uint32 reassembleInCnt;
- uint32 reassembleOutCnt;
- uint32 reassembleErrIdx;
- uint32 reassembleErrCID;
- uint32 reassembleErrInComp;
- uint32 reassembleErrMiss;
- uint32 resssambleMemAlocErr;
-
- uint32 segmentInCnt;
- uint32 segmentOutCnt;
- uint32 segmentErrCnt;
- uint32 fragmentSendCounter;
- uint32 segmentMemAlocErr;
- uint32 segmentSentToLinkLayerErr;
-
- } l2capSARDbugCnt_t;
- //typedef enum
- //{
- // DATA_IN_YBUF_FIRST = 0, // YBUF fisrt bufin fisrt shift out
- // DATA_IN_XBUF_FIRST = 1
- //} SegmentBuffOrder_t;
- //typedef struct
- //{
- // l2capSegmentBuff_t xBuf;
- // l2capSegmentBuff_t yBuf;
- // SegmentBuffOrder_t order; //which buffer
- //
- //}l2capSegmentPkt_t;
- /*********************************************************************
- * VARIABLES
- */
- /*********************************************************************
- * FUNCTIONS
- */
- /*
- * Initialize L2CAP layer.
- */
- extern void L2CAP_Init( uint8 taskId );
- /*
- * L2CAP Task event processing function.
- */
- extern uint16 L2CAP_ProcessEvent( uint8 taskId, uint16 events );
- /*
- * Register a protocol/application with an L2CAP channel.
- */
- extern bStatus_t L2CAP_RegisterApp( uint8 taskId, uint16 CID );
- /*
- * Send L2CAP Data Packet.
- */
- extern bStatus_t L2CAP_SendData( uint16 connHandle, l2capPacket_t *pPkt );
- /*
- * Send Command Reject.
- */
- extern bStatus_t L2CAP_CmdReject( uint16 connHandle, uint8 id, l2capCmdReject_t *pCmdReject );
- /*
- * Build Command Reject.
- */
- extern uint16 L2CAP_BuildCmdReject( uint8 *pBuf, uint8 *pCmd );
- /*
- * Send L2CAP Echo Request.
- */
- extern bStatus_t L2CAP_EchoReq( uint16 connHandle, l2capEchoReq_t *pEchoReq, uint8 taskId );
- /*
- * Send L2CAP Information Request.
- */
- extern bStatus_t L2CAP_InfoReq( uint16 connHandle, l2capInfoReq_t *pInfoReq, uint8 taskId );
- /*
- * Build Information Response.
- */
- extern uint16 L2CAP_BuildInfoRsp( uint8 *pBuf, uint8 *pCmd );
- /*
- * Parse Information Request.
- */
- extern bStatus_t L2CAP_ParseInfoReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len );
- /*
- * Send L2CAP Connection Parameter Update Request.
- */
- extern bStatus_t L2CAP_ConnParamUpdateReq( uint16 connHandle, l2capParamUpdateReq_t *pUpdateReq, uint8 taskId );
- /*
- * Parse Connection Parameter Update Request.
- */
- extern bStatus_t L2CAP_ParseParamUpdateReq( l2capSignalCmd_t *pCmd, uint8 *pData, uint16 len );
- /*
- * Send L2CAP Connection Parameter Update Response.
- */
- extern bStatus_t L2CAP_ConnParamUpdateRsp( uint16 connHandle, uint8 id, l2capParamUpdateRsp_t *pUpdateRsp );
- /*
- * Build Connection Parameter Update Response.
- */
- extern uint16 L2CAP_BuildParamUpdateRsp( uint8 *pBuf, uint8 *pData );
- /*
- * Allocate a block of memory at the L2CAP layer.
- */
- extern void *L2CAP_bm_alloc( uint16 size );
- /*
- * This API is used by the upper layer to turn flow control on
- * or off for data packets sent from the Controller to the Host.
- */
- extern void L2CAP_SetControllerToHostFlowCtrl( uint16 hostBuffSize, uint8 flowCtrlMode );
- /*
- * This API is used by the upper layer to notify L2CAP of the
- * number of data packets that have been completed for connection
- * handle since this API was previously called.
- */
- extern void L2CAP_HostNumCompletedPkts( uint16 connHandle, uint16 numCompletedPkts );
- extern uint8 l2capPktToSegmentBuff(uint16 connHandle,l2capSegmentBuff_t* pSegBuf, uint8 blen,uint8* pBuf);
- extern uint8 l2capSegmentBuffToLinkLayer(uint16 connHandle, l2capSegmentBuff_t* pSegBuf);
- extern void l2capPocessFragmentTxData(uint16 connHandle);
- extern void l2capSarBufReset(void);
- extern void L2CAP_ReassemblePkt_Reset(uint16 connHandle);
- extern void L2CAP_SegmentPkt_Reset(uint16 connHandle);
- extern void L2CAP_ExtendFramgents_Config(uint8 flag);
- /*********************************************************************
- *********************************************************************/
- #ifdef __cplusplus
- }
- #endif
- #endif /* L2CAP_H */
|