THB2/bthome_phy6222/SDK/components/ble/controller/ll_common.h

345 lines
12 KiB
C

/*************
ll_common.h
SDK_LICENSE
***************/
#ifndef _LL_H_
#define _LL_H_
#include "types.h"
#include "mcu.h"
#include "ll.h"
#include "ll_def.h"
#define LL_DATA_PDU( pktHdr ) ((pktHdr) != LL_DATA_PDU_HDR_LLID_CONTROL_PKT)
#define LL_CTRL_PDU( pktHdr ) ((pktHdr) == LL_DATA_PDU_HDR_LLID_CONTROL_PKT)
#define LL_INVALID_LLID( pktHdr ) ((pktHdr) == LL_DATA_PDU_HDR_LLID_RESERVED)
void LL_IRQHandler(void);
void move_to_slave_function(void);
void LL_slave_conn_event(void);
void LL_master_conn_event(void);
void LL_set_default_conn_params(llConnState_t *connPtr);
//void ll_setMem(uint8_t *buf, uint8_t v, int n);
//void ll_cpyMem(uint8_t *dst, uint8_t *src, int n);
void LL_evt_schedule(void);
llStatus_t llSetupAdv( void );
void llConvertLstoToEvent( llConnState_t *connPtr,
connParam_t *connParams );
void llSlaveEvt_TaskEndOk( void );
// for master process
void llMasterEvt_TaskEndOk( void );
// Connection Management
extern llConnState_t *llAllocConnId( void );
extern void llReleaseConnId( llConnState_t *connPtr );
extern void llReleaseAllConnId( void );
extern uint16 llGetMinCI( uint16 connInterval );
extern uint8 llGetNextConn( void );
extern void llConnCleanup( llConnState_t *connPtr );
extern void llConnTerminate( llConnState_t *connPtr, uint8 reason );
extern uint8 llPendingUpdateParam( void );
extern void llInitFeatureSet( void );
extern uint32 llGenerateValidAccessAddr( void );
extern uint32 llGenerateCRC( void );
extern uint8 llEventInRange( uint16 curEvent, uint16 nextEvent, uint16 updateEvent );
extern uint16 llEventDelta( uint16 eventA, uint16 eventB );
extern void llConvertLstoToEvent( llConnState_t *connPtr, connParam_t *connParams );
extern void llConvertCtrlProcTimeoutToEvent( llConnState_t *connPtr );
// Task Setup
extern llStatus_t llSetupAdv( void );
extern void llSetupDirectedAdvEvt( void );
extern void llSetupUndirectedAdvEvt( void );
extern void llSetupNonConnectableAdvEvt( void );
extern void llSetupScannableAdvEvt( void );
extern void llSetupScan( uint8 chan );
extern void llSetupScanInit( void );
extern void llSetupInit( uint8 connId );
extern void llSetupConn( void );
// A2 added
extern uint8 llSetupSecNonConnectableAdvEvt( void );
// A2 multi-connection
extern uint8 llSetupSecConnectableAdvEvt( void );
extern uint8 llSetupSecScannableAdvEvt( void );
extern void llSetupSecScan( uint8 chan );
extern uint32 llCalcMaxScanTime(void);
extern uint8 llSecAdvAllow(void);
// A2 multi-connection
extern uint8 llSetupSecAdvEvt( void );
extern void llSetupSecInit( uint8 chan );
extern uint8_t ll_get_next_active_conn(uint8_t current_conn_id);
extern uint32 ll_get_next_timer(uint8 current_conn_id);
extern void ll_scheduler(uint32 time);
extern void ll_addTask(uint8 connId, uint32 time);
extern void ll_deleteTask(uint8 connId);
// extended adv scheduler functions
void ll_adv_scheduler(void);
void ll_add_adv_task(extAdvInfo_t *pExtAdv);
void ll_delete_adv_task(uint8 index);
uint8 llSetupExtAdvEvent(extAdvInfo_t *pAdvInfo);
// periodic adv functions
void ll_add_adv_task_periodic(periodicAdvInfo_t *pPrdAdv, extAdvInfo_t *pExtAdv);
void ll_add_adv_task_periodic(periodicAdvInfo_t *pPrdAdv, extAdvInfo_t *pExtAdv);
void ll_delete_adv_task_periodic(uint8 index);
uint8 llSetupPrdAdvEvent(periodicAdvInfo_t *pPrdAdv, extAdvInfo_t *pExtAdv);
void ll_adv_scheduler_periodic(void);
// extended scan functions
extern void llSetupExtScan( uint8 chan );
extern void llSetupExtInit(void);
extern void llSetupPrdScan( void );
extern uint16 llAllocateSyncHandle(void);
extern uint8 llDeleteSyncHandle(uint16 sync_handle);
// Data Management
extern uint8 llEnqueueDataQ( llDataQ_t *pDataQ, txData_t *pTxData );
extern uint8 llEnqueueHeadDataQ( llDataQ_t *pDataQ, txData_t *pTxData );
extern txData_t *llDequeueDataQ( llDataQ_t *pDataQ );
extern uint8 llDataQEmpty( llDataQ_t *pDataQ );
extern uint8 llWriteTxData ( llConnState_t *connPtr, uint8 pktHdr, uint8 pktLen, uint8 *pBuf );
extern uint8 *llMemCopySrc( uint8 *pDst, uint8 *pSrc, uint8 len );
extern uint8 *llMemCopyDst( uint8 *pDst, uint8 *pSrc, uint8 len );
extern void llProcessMasterControlPacket( llConnState_t *connPtr, uint8 *pBuf );
extern void llProcessSlaveControlPacket( llConnState_t *connPtr, uint8 *pBuf );
extern void llProcessTxData( llConnState_t *connPtr, uint8 context );
extern uint8 llProcessRxData( void );
// Control Procedure Setup
extern uint8 llSetupUpdateParamReq( llConnState_t *connPtr ); // M
extern uint8 llSetupUpdateChanReq( llConnState_t *connPtr ); // M
extern uint8 llSetupEncReq( llConnState_t *connPtr ); // M
extern uint8 llSetupEncRsp( llConnState_t *connPtr ); // S
extern uint8 llSetupStartEncReq( llConnState_t *connPtr ); // S
extern uint8 llSetupStartEncRsp( llConnState_t *connPtr ); // M, S
extern uint8 llSetupPauseEncReq( llConnState_t *connPtr ); // M
extern uint8 llSetupPauseEncRsp( llConnState_t *connPtr ); // S
extern uint8 llSetupRejectInd( llConnState_t *connPtr ,uint8 errCode); // S
extern uint8 llSetupFeatureSetReq( llConnState_t *connPtr ); // M, S
extern uint8 llSetupFeatureSetRsp( llConnState_t *connPtr ); // M, S
extern uint8 llSetupVersionIndReq( llConnState_t *connPtr ); // M
extern uint8 llSetupTermInd( llConnState_t *connPtr ); // M, S
extern uint8 llSetupUnknownRsp( llConnState_t *connPtr ); // M, S
extern uint8 llSetupDataLenghtReq( llConnState_t *connPtr );//M,S
extern uint8 llSetupDataLenghtRsp( llConnState_t *connPtr );//M,S
extern uint8 llSetupPhyReq( llConnState_t *connPtr ); //M,S
extern uint8 llSetupPhyRsp( llConnState_t *connPtr ); //M,S
extern uint8 llSetupPhyUpdateInd( llConnState_t *connPtr );//M
extern uint8 llSetupRejectExtInd( llConnState_t *connPtr ,uint8 errCode);
// Control Procedure Management
extern void llEnqueueCtrlPkt( llConnState_t *connPtr, uint8 ctrlType );
extern void llDequeueCtrlPkt( llConnState_t *connPtr );
extern void llReplaceCtrlPkt( llConnState_t *connPtr, uint8 ctrlType );
// Data Channel Management
extern void llProcessChanMap( llConnState_t *connPtr, uint8 *chanMap );
extern uint8 llGetNextDataChan( llConnState_t *connPtr, uint16 numEvents );
extern void llSetNextDataChan( llConnState_t *connPtr );
extern uint8 llAtLeastTwoChans( uint8 *chanMap );
//2020-01-20 add for LL CTE
extern uint8 llSetupCTEReq( llConnState_t *connPtr );
extern uint8 llSetupCTERsp( llConnState_t *connPtr );
uint8_t llTimeCompare(int base_time, int fine_time);
uint32_t calculateTimeDelta(int base_time, int fine_time);
void llSetNextDataChan( llConnState_t *connPtr );
// White List Related
extern llStatus_t llCheckWhiteListUsage( void );
// function add by HZF
void llResetConnId( uint8 connId );
void llResetRfCounters(void);
extern void llInitFeatureSet( void );
extern uint16 llCalcScaFactor( uint8 masterSCA );
extern void llCalcTimerDrift( uint32 connInterval,
uint16 slaveLatency,
uint8 sleepClkAccuracy,
uint32 *timerDrift );
// add by HZF
uint8 llGetNextAdvChn(uint8 cur_chn);
// Tx loop buffer process
void update_tx_write_ptr(llConnState_t *connPtr);
void update_tx_read_ptr(llConnState_t *connPtr);
uint8_t getTxBufferSize(llConnState_t *connPtr);
uint8_t getTxBufferFree(llConnState_t *connPtr);
uint8_t get_tx_read_ptr(llConnState_t *connPtr);
uint8_t get_tx_write_ptr(llConnState_t *connPtr);
// Rx loop buffer process
void update_rx_write_ptr(llConnState_t *connPtr);
void update_rx_read_ptr(llConnState_t *connPtr);
uint8_t getRxBufferSize(llConnState_t *connPtr);
uint8_t getRxBufferFree(llConnState_t *connPtr);
uint8_t get_rx_read_ptr(llConnState_t *connPtr);
uint8_t get_rx_write_ptr(llConnState_t *connPtr);
// reset buffer
void reset_conn_buf(uint8 index);
void ll_schedule_next_event(int time);
uint16 ll_generateTxBuffer(int txFifo_vacancy, uint16 *pSave_ptr);
void ll_read_rxfifo(void);
void ll_hw_read_tfifo_rtlp(void);
int ll_hw_read_tfifo_packet(uint8 *pkt);
// function in ll_slaveEndCause.c
uint8 llSetupNextSlaveEvent( void );
uint8 llProcessSlaveControlProcedures( llConnState_t *connPtr );
uint8 llCheckForLstoDuringSL( llConnState_t *connPtr );
// function in ll_hwItf.c
void ll_hw_process_RTO(uint32 ack_num);
void ll_debug_output(uint32 state);
void llAdjSlaveLatencyValue( llConnState_t *connPtr );
//function for DLE add by ZQ
void llPduLengthManagmentReset(void);
void llTrxNumAdaptiveConfig(void);
void llPduLengthUpdate(uint16 connHandle);
//uint8 LL_PLUS_GetLocalPduDataLength(ll_pdu_length_ctrl_t * pduLen);
//function for PHY UPDATE add by ZQ
void llPhyModeCtrlReset(void);
void llPhyModeCtrlUpdateNotify(llConnState_t *connPtr, uint8 status);
//llStatus_t LL_PLUS_GetLocalPhyMode(ll_phy_ctrl_t * phyCtrl);
void llSetNextPhyMode( llConnState_t *connPtr );
extern void llInitFeatureSetDLE(uint8 enable);
extern void llInitFeatureSet2MPHY(uint8 enable);
extern void llInitFeatureSetCodedPHY(uint8 enable);
// function for whitelist
extern uint8 ll_isAddrInWhiteList(uint8 addrType, uint8 *addr);
// function for resolving list
uint8 ll_readLocalIRK(uint8 **localIrk, uint8 *peerAddr, uint8 peerAddrType);
uint8 ll_readPeerIRK(uint8 **peerIrk, uint8 *peerAddr, uint8 peerAddrType);
uint8_t ll_getRPAListEntry(uint8 *peerAddr);
uint8_t ll_isIrkAllZero(uint8 *irk);
uint8_t ll_CalcRandomAddr( uint8 *pIRK, uint8 *pNewAddr );
uint8_t ll_ResolveRandomAddrs(uint8 *pIRK, uint8 *pAddr);
uint16 ll_generateExtAdvDid(uint16 old);
// extended advertiser process
uint8 LL_extAdvTimerExpProcess(void);
uint8 LL_prdAdvTimerExpProcess(void);
uint8 LL_prdScanTimerExpProcess(void);
uint8 ll_isFirstAdvChn(uint8 chnMap, uint8 chan);
uint8 ll_getFirstAdvChn(uint8 chnMap);
void ll_ext_adv_schedule_next_event(int time);
void ll_prd_adv_schedule_next_event(int time);
void ll_ext_scan_schedule_next_event(int time);
void ll_ext_init_schedule_next_event(int time);
void ll_prd_scan_schedule_next_event(int time);
uint8 ll_allocAuxAdvTimeSlot(uint8 index);
void ll_updateAuxAdvTimeSlot(uint8 index);
void ll_updateExtAdvRemainderTime(uint32 time);
uint8 ll_allocAuxAdvTimeSlot_prd(uint8 index);
void LL_extScanTimerExpProcess(void);
void LL_extInitTimerExpProcess(void);
void ll_parseExtHeader(uint8 *payload, uint16 length);
uint8 llGetNextAuxAdvChn(uint8 current);
/******************************************************************************
* fn: llGetNextDataChanCSA2
*
* brief: 2020-01-07 add for CSA 2
*
* input parameters: counter : event counter( PA Counter or connection counter)
* chan_id : current data or periodic advertising channel Identifier,
* calculate from Access Address
* chan_map: PA or connection channel map
* cMap_tab: current chan map table that is in use for connection or PA event
* chanCnt : used channel count
*
* output parameters: None
*
*
* return uint8 : next channel index
*
******************************************************************************/
uint8 llGetNextDataChanCSA2(uint16_t counter ,uint16_t chan_id,uint8 *chan_map,uint8 *cMap_tab,uint8 chanCnt);
#endif