| /****************************************************************************** |
| * @file ll_ext_adv.h |
| * |
| * @brief for TLSR chips |
| * |
| * @author public@telink-semi.com; |
| * @date Sep. 30, 2010 |
| * |
| * @attention |
| * |
| * Copyright (C) 2019-2020 Telink Semiconductor (Shanghai) Co., Ltd. |
| * |
| * 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 LL_ADV_EXT_H_ |
| #define LL_ADV_EXT_H_ |
| |
| |
| #include <stack/ble/ble_common.h> |
| #include <stack/ble/blt_config.h> |
| #include <stack/ble/hci/hci_const.h> |
| #include <stack/ble/hci/hci_event.h> |
| #include <stack/ble/hci/hci_cmd.h> |
| #include <stack/ble/ll/ll_ext.h> |
| #include <stack/ble/ll/ll_adv.h> |
| #include <stack/ble/ll/ll_whitelist.h> |
| #include <stack/ble/phy/phy.h> |
| |
| #include "tl_common.h" |
| |
| |
| |
| |
| #define INVALID_ADVHD_FLAG 0xFF |
| |
| |
| #define AUX_ADV_FEA BIT(0) |
| #define PER_ADV_FEA BIT(1) |
| |
| |
| |
| |
| /* Advertising_Handle */ |
| #define ADV_HANDLE0 0x00 |
| #define ADV_HANDLE1 0x01 |
| #define ADV_HANDLE2 0x02 |
| #define ADV_HANDLE3 0x03 |
| |
| |
| |
| |
| /* Advertising_Handle */ |
| #define ADV_SID_0 0x00 |
| #define ADV_SID_1 0x01 |
| #define ADV_SID_2 0x02 |
| #define ADV_SID_3 0x03 |
| |
| |
| |
| /* Advertising Event Properties |
| * See the Core_v5.0(Vol 2/Part E/7.8.53 & Vol 6/Part B/4.4.2/Table 4.1) for more information |
| */ |
| typedef enum{ |
| ADV_EVT_PROP_LEGACY_CONNECTABLE_SCANNABLE_UNDIRECTED = 0x0013, // 0001 0011'b ADV_IND |
| ADV_EVT_PROP_LEGACY_CONNECTABLE_DIRECTED_LOW_DUTY = 0x0015, // 0001 0101'b ADV_DIRECT_IND(low duty cycle) |
| ADV_EVT_PROP_LEGACY_CONNECTABLE_DIRECTED_HIGH_DUTY = 0x001D, // 0001 1101'b ADV_DIRECT_IND(high duty cycle) |
| ADV_EVT_PROP_LEGACY_SCANNABLE_UNDIRECTED = 0x0012, // 0001 0010'b ADV_SCAN_IND |
| ADV_EVT_PROP_LEGACY_NON_CONNECTABLE_NON_SCANNABLE_UNDIRECTED = 0x0010, // 0001 0000'b ADV_NONCONN_IND |
| |
| |
| ADV_EVT_PROP_EXTENDED_NON_CONNECTABLE_NON_SCANNABLE_UNDIRECTED = 0x0000, // 0000 0000'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| ADV_EVT_PROP_EXTENDED_CONNECTABLE_UNDIRECTED = 0x0001, // 0000 0001'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| ADV_EVT_PROP_EXTENDED_SCANNABLE_UNDIRECTED = 0x0002, // 0000 0010'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| ADV_EVT_PROP_EXTENDED_NON_CONNECTABLE_NON_SCANNABLE_DIRECTED = 0x0004, // 0000 0100'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| ADV_EVT_PROP_EXTENDED_CONNECTABLE_DIRECTED = 0x0005, // 0000 0101'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| ADV_EVT_PROP_EXTENDED_SCANNABLE_DIRECTED = 0x0006, // 0000 0110'b ADV_EXT_IND + AUX_ADV_IND/AUX_CHAIN_IND |
| |
| |
| ADV_EVT_PROP_EXTENDED_MASK_ANONYMOUS_ADV = 0x0020, //if this mask on(only extended ADV event can mask it), anonymous advertising |
| ADV_EVT_PROP_EXTENDED_MASK_TX_POWER_INCLUDE = 0x0040, //if this mask on(only extended ADV event can mask it), TX power include |
| |
| }adv_event_prop_t; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| typedef struct{ |
| u32 dma_len; |
| |
| u8 type :4; |
| u8 rfu1 :1; |
| u8 chan_sel:1; |
| u8 txAddr :1; |
| u8 rxAddr :1; |
| |
| u8 rf_len; |
| u8 advA[6]; //address |
| u8 data[31]; //0-31 byte |
| }rf_pkt_pri_adv_t; |
| #define MAX_LENGTH_PRIMARY_ADV_PKT 44 //sizeof(rf_pkt_pri_adv_t) = 43 |
| |
| |
| |
| |
| |
| |
| typedef struct{ |
| u8 chn_ind :6; |
| u8 ca :1; |
| u8 off_unit :1; |
| u16 aux_off :13; |
| u16 aux_phy :3; |
| } aux_ptr_t; |
| |
| |
| |
| |
| |
| |
| |
| //NOTE: this data structure must 4 bytes aligned |
| typedef struct |
| { |
| u8 adv_handle; |
| u8 extAdv_en; |
| u8 adv_chn_mask; |
| u8 adv_chn_num; |
| |
| u8 own_addr_type; |
| u8 peer_addr_type; |
| u8 pri_phy; |
| u8 sec_phy; |
| |
| |
| u8 max_ext_adv_evt; |
| u8 run_ext_adv_evt; |
| u8 unfinish_advData; |
| u8 unfinish_scanRsp; |
| |
| |
| u8 adv_filterPolicy; |
| u8 scan_req_noti_en; |
| u8 coding_ind; //s2 or s8 |
| u8 param_update_flag; |
| |
| |
| u8 with_aux_adv_ind; //ADV_EXT_IND with AUX_ADV_IND |
| u8 with_aux_chain_ind; |
| u8 rand_adr_flg; |
| u8 adv_sid; |
| |
| |
| // u8 s_adv_max_skip; |
| |
| |
| u16 adv_did; // BIT<11:0> |
| u16 evt_props; |
| u16 advInt_use; |
| u16 send_dataLen; |
| u16 maxLen_advData; //for each ADV sets, this value can be different to save SRAM |
| u16 curLen_advData; |
| u16 maxLen_scanRsp; //for each ADV sets, this value can be different to save SRAM |
| u16 curLen_scanRsp; |
| |
| u16 send_dataLenBackup; |
| u16 rsvd_16_1; |
| |
| |
| u32 adv_duration_tick; |
| u32 adv_begin_tick; //24 |
| u32 adv_event_tick; |
| |
| u8* dat_extAdv; |
| u8* dat_scanRsp; //Scan response data. |
| rf_pkt_pri_adv_t* primary_adv; |
| rf_pkt_ext_adv_t* secondary_adv; |
| |
| u8 rand_adr[6]; |
| u8 peer_addr[6]; |
| }ll_ext_adv_t; |
| |
| |
| #define ADV_SET_PARAM_LENGTH (sizeof(ll_ext_adv_t)) //sizeof(ll_ext_adv_t) = , must 4 byte aligned |
| |
| |
| |
| |
| #if 0 |
| // u16 advInt_min; |
| // u16 advInt_max; |
| u8 periodicAdv_en; |
| u16 maxLen_periodicAdv; |
| u16 curLen_periodicAdv; |
| u8* dat_periodicAdv; |
| u8 adv_secondary_chan; |
| s8 adv_tx_pow; |
| #endif |
| |
| |
| |
| |
| |
| |
| typedef struct |
| { |
| u8 maxNum_advSets; |
| u8 useNum_advSets; |
| u8 last_advSet; |
| u8 last_advHand; |
| |
| |
| u8 T_SCAN_RSP_INTVL; |
| u8 custom_aux_chn; |
| u8 T_AUX_RSP_INTVL; //settle aux_scan_rsp/aux_conn_rsp's IFS 150s |
| u8 rsvd3; |
| |
| u32 rand_delay; |
| |
| }ll_adv_mng_t; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| /******************************************** User Interface ********************************************************************/ |
| //initialization |
| void blc_ll_initExtendedAdvertising_module( u8 *pAdvCtrl, u8 *pPriAdv,int num_sets); |
| |
| void blc_ll_initExtSecondaryAdvPacketBuffer(u8 *pSecAdv, int sec_adv_buf_len); |
| |
| void blc_ll_initExtAdvDataBuffer(u8 *pExtAdvData, int max_len_advData); //set AdvData buffer for all adv_set |
| void blc_ll_initExtAdvDataBuffer_by_advHandle(u8 *pExtAdvData, u8 advHandle, int max_len_advData); //set AdvData buffer for specific adv_set |
| |
| void blc_ll_initExtScanRspDataBuffer(u8 *pScanRspData, int max_len_scanRspData); |
| void blc_ll_initExtScanRspDataBuffer_by_advHandle(u8 *pScanRspData, u8 advHandle, int max_len_scanRspData); |
| |
| |
| |
| //Set Extended ADV parameters |
| ble_sts_t blc_ll_setAdvRandomAddr(u8 advHandle, u8* rand_addr); |
| |
| |
| ble_sts_t blc_ll_setExtAdvParam( u8 advHandle, adv_event_prop_t adv_evt_prop, u32 pri_advIntervalMin, u32 pri_advIntervalMax, |
| u8 pri_advChnMap, own_addr_type_t ownAddrType, u8 peerAddrType, u8 *peerAddr, |
| adv_fp_type_t advFilterPolicy, tx_power_t adv_tx_pow, le_phy_type_t pri_adv_phy, u8 sec_adv_max_skip, |
| le_phy_type_t sec_adv_phy, u8 adv_sid, u8 scan_req_noti_en); |
| ble_sts_t blc_ll_setExtAdvData (u8 advHandle, data_oper_t operation, data_fragm_t fragment_prefer, u8 adv_dataLen, u8 *advdata); |
| ble_sts_t blc_ll_setExtScanRspData(u8 advHandle, data_oper_t operation, data_fragm_t fragment_prefer, u8 scanRsp_dataLen, u8 *scanRspData); |
| ble_sts_t blc_ll_setExtAdvEnable_1(u32 extAdv_en, u8 sets_num, u8 advHandle, u16 duration, u8 max_extAdvEvt); |
| ble_sts_t blc_ll_setExtAdvEnable_n(u32 extAdv_en, u8 sets_num, u8 *pData); |
| |
| |
| ble_sts_t blc_ll_removeAdvSet(u8 advHandle); |
| ble_sts_t blc_ll_clearAdvSets(void); |
| |
| |
| // if Coded PHY is used, this API set default S2/S8 mode for Extended ADV |
| void blc_ll_setDefaultExtAdvCodingIndication(u8 advHandle, le_ci_prefer_t prefer_CI); |
| |
| |
| void blc_ll_setAuxAdvChnIdxByCustomers(u8 aux_chn); |
| void blc_ll_setMaxAdvDelay_for_AdvEvent(u8 max_delay_ms); //unit: mS, only 8/4/2/1/0 available |
| |
| |
| /****************************************** Stack Interface, user can not use!!! *************************************************/ |
| ble_sts_t blc_hci_le_setExtAdvParam( hci_le_setExtAdvParam_cmdParam_t *para, u8 *pTxPower); |
| ble_sts_t blc_hci_le_setExtAdvEnable(u8 extAdv_en, u8 sets_num, u8 *pData); |
| |
| u16 blc_ll_readMaxAdvDataLength(void); |
| u8 blc_ll_readNumberOfSupportedAdvSets(void); |
| |
| |
| int blt_ext_adv_proc(void); |
| int blt_send_adv2(void); |
| int blt_send_legacy_adv(void); |
| int blt_send_extend_adv(void); |
| void blt_send_extend_no_aux_adv(void); |
| int blt_send_aux_adv(void); |
| ble_sts_t blt_ll_clearAdvSets(void); |
| void blt_clearAdvSetsParam(ll_ext_adv_t *pEadv); |
| u8 blt_ll_searchExistingAdvSet(u8 advHandle); |
| u8 blt_ll_searchAvailableAdvSet(u8 advHandle); |
| void blt_ll_updateAdvState(void); |
| ble_sts_t blt_ll_enableExtAdv(int adv_en); |
| void blt_ll_procAuxConnectReq(u8 * prx); |
| int blt_ll_updateAdvPacket(void); |
| void blt_ll_reset_ext_adv(void); |
| |
| #endif /* LL_ADV_EXT_H_ */ |