/************* ll_def.h SDK_LICENSE ***************/ #ifndef LL_DEF_H_ #define LL_DEF_H_ #include "types.h" #include "comdef.h" #include "bcomdef.h" #include "ll_buf.h" #if (MAX_NUM_LL_CONN_ROM_LIMT > 1) #define MULTI_ROLE #endif #define MAX_NUM_LL_PRD_ADV_SYNC 2 // for periodic adv listener #define LL_INVALID_CONNECTION_ID 0xFF #define LL_PKT_PREAMBLE_LEN 1 #define LL_PKT_SYNCH_LEN 4 #define LL_PKT_LLID_LEN 1 #define LL_PKT_HDR_LEN 2 #define LL_PKT_MIC_LEN 4 #define LL_PKT_CRC_LEN 3 #define LL_DATA_PDU_HDR_LLID_RESERVED 0 #define LL_DATA_PDU_HDR_LLID_DATA_PKT_NEXT 1 #define LL_DATA_PDU_HDR_LLID_DATA_PKT_FIRST 2 #define LL_DATA_PDU_HDR_LLID_CONTROL_PKT 3 ///adv header shift and mask #define PDU_TYPE_SHIFT 0 #define PDU_TYPE_MASK 0xf #define CHSEL_SHIFT 5 #define CHSEL_MASK 0x20 #define TX_ADD_SHIFT 6 #define TX_ADD_MASK 0x40 #define RX_ADD_SHIFT 7 #define RX_ADD_MASK 0x80 #define LENGTH_SHIFT 8 #define LENGTH_MASK 0xFf00 // macro for bit operations #define SET_BITS(p,f,l,m) p=(f<>l // Receive Flow Control #define LL_RX_FLOW_CONTROL_DISABLED 0 #define LL_RX_FLOW_CONTROL_ENABLED 1 //LL packet type #define ADV_IND 0 //Connectable Undirected Event #define ADV_DIRECT_IND 1 //Connectable Directed Event #define ADV_NONCONN_IND 2 //Non-connectable Undirected Event #define ADV_SCAN_REQ 3 #define ADV_AUX_SCAN_REQ 3 #define ADV_SCAN_RSP 4 #define ADV_CONN_REQ 5 #define ADV_AUX_CONN_REQ 5 #define ADV_SCAN_IND 6 //Scannable Undirected Event #define ADV_EXT_TYPE 7 #define ADV_AUX_CONN_RSP 8 // LL state defines #define LL_STATE_IDLE 0x00 #define LL_STATE_ADV_UNDIRECTED 0x01 #define LL_STATE_ADV_DIRECTED 0x02 #define LL_STATE_ADV_SCAN 0x03 #define LL_STATE_ADV_NONCONN 0x04 #define LL_STATE_SCAN 0x05 #define LL_STATE_INIT 0x06 #define LL_STATE_CONN_SLAVE 0x07 #define LL_STATE_CONN_MASTER 0x08 #define LL_STATE_DIRECT_TEST_MODE_TX 0x09 #define LL_STATE_DIRECT_TEST_MODE_RX 0x0A #define LL_STATE_MODEM_TEST_TX 0x0B #define LL_STATE_MODEM_TEST_RX 0x0C #define LL_STATE_MODEM_TEST_TX_FREQ_HOPPING 0x0D #define LL_STATE_ADV_EXT 0x0E #define LL_STATE_ADV_PERIODIC 0x0F /* ** LL Buffers Supported */ #define LL_MAX_NUM_DATA_BUFFERS 12 #define LL_MAX_NUM_CMD_BUFFERS 1 /* ** LL API Parameters */ // LL Parameter Limits #define LL_ADV_CONN_INTERVAL_MIN 32 // 20ms in 625us #define LL_ADV_CONN_INTERVAL_MAX 16384 // 10.24s in 625us #define LL_ADV_NONCONN_INTERVAL_MIN 160 // 100ms in 625us #define LL_ADV_NONCONN_INTERVAL_MAX 16384 // 10.24s in 625us // temporary macro define : align to version 5.1 non-conn intv 20ms // affect function LL_SetAdvControl #define LL_ADV_V51_NONCONN_INTERVAL_MIN 32 #define LL_ADV_DELAY_MIN 0 // in ms #define LL_ADV_DELAY_MAX 10 // in ms #define LL_SCAN_INTERVAL_MIN 4 // 2.5ms in 625us #define LL_SCAN_INTERVAL_MAX 16384 // 10.24s in 625us #define LL_SCAN_WINDOW_MIN 4 // 2.5ms in 625us #define LL_SCAN_WINDOW_MAX 16384 // 10.24s in 625us #define LL_CONN_INTERVAL_MIN 6 // 7.5ms in 1.25ms #define LL_CONN_INTERVAL_MAX 3200 // 4s in 1.25ms #define LL_CONN_TIMEOUT_MIN 10 // 100ms in 10ms #define LL_CONN_TIMEOUT_MAX 3200 // 32s in 10ms #define LL_SLAVE_LATENCY_MIN 0 #define LL_SLAVE_LATENCY_MAX 499 #define LL_HOP_LENGTH_MIN 5 #define LL_HOP_LENGTH_MAX 16 #define LL_INSTANT_NUMBER_MIN 6 #define LL_ADV_INTERVAL_DEFAULT 160 // 100ms in 625us ticks #define LL_SCAN_INTERVAL_DEFAULT 640 // 400ms in 625us ticks // LL Advertiser Channels #define LL_ADV_CHAN_37 1 #define LL_ADV_CHAN_38 2 #define LL_ADV_CHAN_39 4 #define LL_ADV_CHAN_ALL (LL_ADV_CHAN_37 | LL_ADV_CHAN_38 | LL_ADV_CHAN_39) #define LL_MAX_NUM_DATA_CHAN 37 // 0 - 36 // Advertiser Synchronization Word #define ADV_SYNCH_WORD 0x8E89BED6 // Adv channel sync #define ADV_CRC_INIT_VALUE 0x00555555 // not needed; handled by NR hardware automatically // Packet Lengths #define LL_DEVICE_ADDR_LEN 6 #define LL_MAX_ADV_DATA_LEN 31 #define LL_MAX_ADV_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_ADV_DATA_LEN) #define LL_MAX_SCAN_DATA_LEN 31 #define LL_MAX_SCAN_PAYLOAD_LEN (LL_DEVICE_ADDR_LEN + LL_MAX_SCAN_DATA_LEN) #define LL_MAX_LINK_DATA_LEN 27 // ZQ 20181030 for DLE feature //replaced by g_llPduLen.local.MaxTxOctets // =============== add in A2 for simultaneous slave and adv/scan #define LL_SEC_STATE_IDLE 0x00 #define LL_SEC_STATE_SCAN 0x01 #define LL_SEC_STATE_ADV 0x02 #define LL_SEC_STATE_SCAN_PENDING 0x03 #define LL_SEC_STATE_ADV_PENDING 0x04 #define LL_SEC_STATE_IDLE_PENDING 0x05 #define LL_SEC_STATE_INIT 0x06 #define LL_SEC_STATE_INIT_PENDING 0x07 // ============= for multi-role #define LL_ROLE_SLAVE 0x01 #define LL_ROLE_MASTER 0x02 #define LL_ROLE_INVALID 0xFF #define LL_INVALID_TIME 0xFFFFFFFF #define LL_TASK_MASTER_DURATION 3000 #define LL_TASK_SLAVE_DURATION 2700 enum { LL_SCH_PRIO_LOW = 0, LL_SCH_PRIO_MED, LL_SCH_PRIO_HIGH, LL_SCH_PRIO_IMMED, LL_SCH_PRIO_LAST }; // ===== A2 End // 2020-01-15 CTE Macro define #define LL_CTE_MAX_ANTENNA_LEN 8 #define LL_CTE_MAX_ANT_ID (LL_CTE_MAX_ANTENNA_LEN - 1) #define LL_CTE_MAX_PATTERN_LEN 16 #define LL_CTE_MIN_SUPP_LEN 0x2 #define LL_CTE_MAX_SUPP_LEN 0x14 // CTE MAX Support length in 8us units( MAX 160us) #define LL_CTE_SUPP_LEN_UNIT 0x08 #define LL_CTE_MAX_PA_INTV_CNT 0x10 #define LL_CTE_MAX_IQ_SAMP_CNT 0x10 #define LL_CTE_ENABLE 0x1 #define LL_CTE_DISABLE 0x0 #define LL_IQ_SAMP_ENABLE 0x1 #define LL_IQ_SAMP_DISABLE 0x0 #define LL_CONN_IQSAMP_ENABLE 0x1 #define LL_CONN_IQSAMP_DISENABLE 0x0 #define LL_CONN_IQTX_ENABLE 0x1 #define LL_CONN_IQTX_DISENABLE 0x0 #define LL_CONN_CTE_REQ_ENABLE 0x1 #define LL_CONN_CTE_REQ_DISENABLE 0x0 #define LL_CONN_CTE_RSP_ENABLE 0x1 #define LL_CONN_CTE_RSP_DISENABLE 0x0 #define LL_IQ_SW_SAMP_1US 0x1 #define LL_IQ_SW_SAMP_2US 0x2 #define LL_CONTROLLER_SUPP_1US_AOD_TX 0x1 #define LL_CONTROLLER_SUPP_1US_AOD_SAMP 0x2 #define LL_CONTROLLER_SUPP_1US_AOA_TX_SAMP 0x4 // 2020-01-20 add for Extended advertising #define LL_SECOND_ADV_PHY_1M 0x1 #define LL_SECOND_ADV_PHY_2M 0x2 #define LL_SECOND_ADV_PHY_CODE 0x3 #define LL_PHY_1M 0x1 #define LL_PHY_2M 0x2 #define LL_PHY_CODE 0x3 //LL connecction control type #define LL_CONNECTION_UPDATE_REQ 0 #define LL_CHANNEL_MAP_REQ 1 #define LL_TERMINATE_IND 2 #define LL_ENC_REQ 3 #define LL_ENC_RSP 4 #define LL_START_ENC_REQ 5 #define LL_START_ENC_RSP 6 #define LL_UNKNOWN_RSP 7 #define LL_FEATURE_REQ 8 #define LL_FEATURE_RSP 9 #define LL_PAUSE_ENC_REQ 10 #define LL_PAUSE_ENC_RSP 11 #define LL_VERSION_IND 12 #define LL_REJECT_IND 13 #define LL_SLAVE_FEATURE_REQ 14 #define LL_CONNECTION_PARAM_REQ 15 #define LL_CONNECTION_PARAM_RSP 16 #define LL_REJECT_IND_EXT 17 #define LL_PING_REQ 18 #define LL_PING_RSP 19 #define LL_LENGTH_REQ 20 #define LL_LENGTH_RSP 21 #define LL_PHY_REQ 22 #define LL_PHY_RSP 23 #define LL_PHY_UPDATE_IND 24 #define LL_CONNECT_REQ_PAYLOAD_LEN 18 #define LL_CONN_UPDATE_REQ_PAYLOAD_LEN 12 #define LL_CHAN_MAP_REQ_PAYLOAD_LEN 8 #define LL_TERM_IND_PAYLOAD_LEN 2 #define LL_ENC_REQ_PAYLOAD_LEN 23 #define LL_ENC_RSP_PAYLOAD_LEN 13 #define LL_START_ENC_REQ_PAYLOAD_LEN 1 #define LL_START_ENC_RSP_PAYLOAD_LEN 1 #define LL_PAUSE_ENC_REQ_PAYLOAD_LEN 1 #define LL_PAUSE_ENC_RSP_PAYLOAD_LEN 1 #define LL_REJECT_IND_PAYLOAD_LEN 2 #define LL_REJECT_EXT_IND_PAYLOAD_LEN 3 #define LL_FEATURE_REQ_PAYLOAD_LEN 9 #define LL_FEATURE_RSP_PAYLOAD_LEN 9 #define LL_VERSION_IND_PAYLOAD_LEN 6 #define LL_UNKNOWN_RSP_PAYLOAD_LEN 2 #define LL_LENGTH_REQ_PAYLOAD_LEN 9 #define LL_LENGTH_RSP_PAYLOAD_LEN 9 #define LL_PHY_REQ_PAYLOAD_LEN 3 #define LL_PHY_RSP_PAYLOAD_LEN 3 #define LL_PHY_UPDATE_IND_PAYLOAD_LEN 5 // 2020-01-20 add for CTE #define LL_CTE_REQ_LEN 2 #define LL_CTE_RSP_LEN 1 #define LL_MAX_NUM_CTRL_PROC_PKTS 4 #define LL_CTRL_UNDEFINED_PKT 0xFF // LL Events #define LL_EVT_POST_PROCESS_NR 0x0001 #define LL_EVT_DIRECTED_ADV_FAILED 0x0002 #define LL_EVT_SLAVE_CONN_CREATED 0x0004 #define LL_EVT_NEXT_INTERVAL 0x0008 #define LL_EVT_MASTER_CONN_CANCELLED 0x0010 #define LL_EVT_TASK_TIMER_FENCE_EXPIRED 0x0020 #define LL_EVT_SLAVE_CONN_CREATED_BAD_PARAM 0x0040 #define LL_EVT_START_32KHZ_XOSC_DELAY 0x0080 #define LL_EVT_32KHZ_XOSC_DELAY 0x0100 #define LL_EVT_RESET_SYSTEM_HARD 0x0200 #define LL_EVT_RESET_SYSTEM_SOFT 0x0400 #define LL_EVT_MASTER_CONN_CREATED 0x0800 #define LL_EVT_SECONDARY_SCAN 0x1000 #define LL_EVT_SECONDARY_ADV 0x2000 #define LL_EVT_SECONDARY_INIT 0x4000 #define LL_EVT_RPA_TIMEOUT 0x8000 #define LL_ADV_NONCONN_STATE 0x00 #define LL_ADV_DISCOV_STATE 0x01 #define LL_ADV_UNDIRECT_STATE 0x02 #define LL_ADV_HDC_DIRECT_STATE 0x03 #define LL_SCAN_PASSIVE_STATE 0x04 #define LL_SCAN_ACTIVE_STATE 0x05 #define LL_INIT_STATE 0x06 // connection state in master role also supported #define LL_SLAVE_STATE 0x07 // #define LL_ADV_NONCONN_SCAN_PASSIVE_STATE 0x10 #define LL_ADV_DISCOV_SCAN_PASSIVE_STATE 0x11 #define LL_ADV_UNDIRECT_SCAN_PASSIVE_STATE 0x12 #define LL_ADV_HDC_DIRECT_SCAN_PASSIVE_STATE 0x13 #define LL_ADV_NONCONN_SCAN_ACTIVE_STATE 0x14 #define LL_ADV_DISCOV_SCAN_ACTIVE_STATE 0x15 #define LL_ADV_UNDIRECT_SCAN_ACTIVE_STATE 0x16 #define LL_ADV_HDC_DIRECT_SCAN_ACTIVE_STATE 0x17 // #define LL_ADV_NONCONN_INIT_STATE 0x20 #define LL_ADV_DISCOV_INIT_STATE 0x21 #define LL_ADV_NONCONN_MASTER_STATE 0x22 #define LL_ADV_DISCOV_MASTER_STATE 0x23 #define LL_ADV_NONCONN_SLAVE_STATE 0x24 #define LL_ADV_DISCOV_SLAVE_STATE 0x25 #define LL_SCAN_PASSIVE_INIT_STATE 0x26 #define LL_SCAN_ACTIVE_INIT_STATE 0x27 // #define LL_SCAN_PASSIVE_MASTER_STATE 0x30 #define LL_SCAN_ACTIVE_MASTER_STATE 0x31 #define LL_SCAN_PASSIVE_SLAVE_STATE 0x32 #define LL_SCAN_ACTIVE_SLAVE_STATE 0x33 #define LL_INIT_MASTER_STATE 0x34 // master role and master role combination also supported // #define LL_ADV_LDC_DIRECT_STATE 0x35 #define LL_ADV_LDC_DIRECT_SCAN_PASSIVE_STATE 0x36 #define LL_ADV_LDC_DIRECT_SCAN_ACTIVE_STATE 0x37 #define HCI_RX_PKT_HDR_SIZE 5 #define LL_NUM_BYTES_FOR_CHAN_MAP 5 //(LL_MAX_NUM_ADV_CHAN+LL_MAX_NUM_DATA_CHAN)/sizeof(uint8) #define LL_CTRL_PROC_STATUS_SUCCESS 0 #define LL_CTRL_PROC_STATUS_TERMINATE 1 // A2 multi-connection #define LL_PROC_LINK_KEEP 0 #define LL_PROC_LINK_TERMINATE 1 #define LL_TX_DATA_CONTEXT_POST_PROCESSING 2 #define LL_TX_DATA_CONTEXT_SEND_DATA 0 #define LL_LINK_SETUP_TIMEOUT 5 // 6 connection intervals (i.e. 0..5) // Setup Next Slave Procedure Actions #define LL_SETUP_NEXT_LINK_STATUS_SUCCESS 0 #define LL_SETUP_NEXT_LINK_STATUS_TERMINATE 1 // Data PDU Control Packet Types #define LL_CTRL_CONNECTION_UPDATE_REQ 0 // M #define LL_CTRL_CHANNEL_MAP_REQ 1 // M #define LL_CTRL_TERMINATE_IND 2 // M, S #define LL_CTRL_ENC_REQ 3 // M #define LL_CTRL_ENC_RSP 4 // , S #define LL_CTRL_START_ENC_REQ 5 // , S #define LL_CTRL_START_ENC_RSP 6 // M, S #define LL_CTRL_UNKNOWN_RSP 7 // M, S #define LL_CTRL_FEATURE_REQ 8 // M #define LL_CTRL_FEATURE_RSP 9 // , S , also could be M in ver4.2 ... HZF #define LL_CTRL_PAUSE_ENC_REQ 10 // M #define LL_CTRL_PAUSE_ENC_RSP 11 // , S #define LL_CTRL_VERSION_IND 12 // M, S #define LL_CTRL_REJECT_IND 13 // , S // BLE 4.2 #define LL_CTRL_SLAVE_FEATURE_REQ 14 #define LL_CTRL_CONNECTION_PARAM_REQ 15 #define LL_CTRL_CONNECTION_PARAM_RSP 16 #define LL_CTRL_REJECT_EXT_IND 17 #define LL_CTRL_PING_REQ 18 #define LL_CTRL_PING_RSP 19 #define LL_CTRL_LENGTH_REQ 20 #define LL_CTRL_LENGTH_RSP 21 // BLE 5.0 #define LL_CTRL_PHY_REQ 22 #define LL_CTRL_PHY_RSP 23 #define LL_CTRL_PHY_UPDATE_IND 24 #define LL_CTRL_MIN_USED_CHANNELS_IND 25 // TODO 2020-02-07 change , default: 26 #define LL_CTRL_TERMINATE_RX_WAIT_FOR_TX_ACK 0xFE //26 // M (internal to LL only) // 2020-01-19 add for CTE #define LL_CTRL_CTE_REQ 0x1A #define LL_CTRL_CTE_RSP 0x1B // control procedure timeout in coarse timer ticks #define LL_MAX_CTRL_PROC_TIMEOUT 64000 // 40s // Encryption Related #define LL_ENC_RAND_LEN 8 #define LL_ENC_EDIV_LEN 2 #define LL_ENC_LTK_LEN 16 #define LL_ENC_IRK_LEN 16 #define LL_ENC_IV_M_LEN 4 #define LL_ENC_IV_S_LEN 4 #define LL_ENC_IV_LINK_LEN 4 #define LL_ENC_IV_LEN (LL_ENC_IV_M_LEN + LL_ENC_IV_S_LEN) #define LL_ENC_SKD_M_LEN 8 #define LL_ENC_SKD_S_LEN 8 #define LL_ENC_SKD_LINK_LEN 8 #define LL_ENC_SKD_LEN (LL_ENC_SKD_M_LEN + LL_ENC_SKD_S_LEN) #define LL_ENC_SK_LEN 16 #define LL_ENC_NONCE_LEN 13 #define LL_END_NONCE_IV_OFFSET 5 #define LL_ENC_MIC_LEN LL_PKT_MIC_LEN // #define LL_ENC_IV_M_OFFSET LL_ENC_IV_S_LEN #define LL_ENC_IV_S_OFFSET 0 #define LL_ENC_SKD_M_OFFSET LL_ENC_SKD_S_LEN #define LL_ENC_SKD_S_OFFSET 0 // #define LL_ENC_BLOCK_LEN 16 #define LL_ENC_CCM_BLOCK_LEN LL_ENC_BLOCK_LEN #define LL_ENC_BLOCK_B0_FLAGS 0x49 #define LL_ENC_BLOCK_A0_FLAGS 0x01 // Resolving Private Address list #define LEN_24BIT 3 // Number of bytes in a 24 bit number #define PRAND_SIZE LEN_24BIT // PRAND size in the Private Resolvable Address calculation // Address header bits #define RANDOM_ADDR_HDR 0xC0 // Used for LL RANDOM Address #define STATIC_ADDR_HDR 0xC0 // Host Static Address, same as RANDOM address #define PRIVATE_RESOLVE_ADDR_HDR 0x40 // Extended advertiser setting #define LL_MAX_ADVERTISER_SET_LENGTH 0x672 // spec range: 0x1F ~ 0x672 #define LL_INVALID_ADV_SET_HANDLE 0xFF //////////////////// for scan // Scanner Advertisment Channels #define LL_SCAN_ADV_CHAN_37 37 #define LL_SCAN_ADV_CHAN_38 38 #define LL_SCAN_ADV_CHAN_39 39 // add by HZF for whitelist #define LL_WHITELIST_ENTRY_NUM 8 // BBB ROM code: resolving list size #define LL_RESOLVINGLIST_ENTRY_NUM 8 // Periodic advertiser list size #define LL_PRD_ADV_ENTRY_NUM 8 struct bd_addr{ uint8_t addr[6]; }; typedef struct { uint8_t peerAddrType; // peer device address type of public or random uint8_t peerAddr[ 6 ]; // peer device address } peerInfo_t; #define NETWORK_PRIVACY_MODE 0 #define DEVICE_PRIVACY_MODE 1 // BBB ROM code add typedef struct { uint8_t localIrk[16]; uint8_t peerIrk[16]; uint8_t peerAddrType; // peer device address type of public or random uint8_t peerAddr[6]; // peer device address uint8_t privacyMode; // privacy mode, Network privacy mode or Device privacy mode // ==== add after BBB ROM code freeze uint8_t localRpa[6]; // local resolvable address } resolvingListInfo_t; // Periodic Advertiser list typedef struct { uint8_t addrType; // Advertising address type uint8_t addr[6]; // Advertising address uint8_t sid; // Advertising SID } periodicAdvertiserListInfo_t; /// Advertising parameters typedef struct { uint8_t active; uint16_t advInterval; // the advertiser interval, based on advIntMin and advIntMax /// Advertising type uint16_t advMode; // flag to indicate if currently advertising uint8_t ownAddrType; // own device address type of public or random uint8_t ownAddr[LL_DEVICE_ADDR_LEN]; // own device address uint8_t advChanMap; // saved Adv channel map; note, only lower three bits used uint8_t advEvtType; //connectable directed, undirected, discoverable, or non-connectable uint8_t wlPolicy; // white list policy for Adv uint16_t scaValue; // Slave SCA in PPM uint8_t advDataLen; // advertiser data length // Scan Repsonse Parameters uint8_t scanRspLen; // scan response data length // add by HZF uint8 advNextChan; // multi-connection uint8 connId; }advInfo_t; /// Extended Advertising parameters typedef struct { // uint8_t advHandle; // range: 0x00 - 0xEF uint8_t advertisingSID; // range: 0x00 - 0x0F uint16_t advEventProperties; // adv event type uint32_t priAdvIntMin; // 3 octets, minimum primary adv interval uint32_t priAdvgIntMax; // 3 octets, maximum primary adv interval uint8_t priAdvChnMap; uint8_t ownAddrType; // own device address type of public or random uint8_t isOwnRandomAddressSet; // own random address type set flag. The address is set by HCI_LE_SET_ADVERTISING_SET_RANDOM_ADDRESS uint8_t ownRandomAddress[LL_DEVICE_ADDR_LEN]; uint8_t peerAddrType; uint8_t peerAddress[LL_DEVICE_ADDR_LEN]; uint8_t wlPolicy; // white list policy for Adv int8 advTxPower; uint8_t primaryAdvPHY; uint8_t secondaryAdvPHY; uint8_t secondaryAdvMaxSkip; // the maximum number of advertising events that can be skipped before the AUX_ADV_IND can be sent uint8_t scanReqNotificationEnable; }extAdvParameter_t; /// data of Advertising set or scan response data typedef struct { // uint8_t advHandle; uint8_t dataComplete; // all data of advert set received uint8 fragmentPreference; uint16 advertisingDataLength; uint8 *advertisingData; // LL generated uint16 DIDInfo; // 12bits }advSetData_t; /// extended adv parameters, include spec parameters & implemented-specific parameters typedef struct { uint8_t advHandle; extAdvParameter_t parameter; advSetData_t data; // only for extended adv uint16 scanRspMaxLength; // length of scan rsp data uint8 *scanRspData; // ===================== advertisement enable info uint32_t duration; // unit us, note spec parameter is 10ms unit uint8_t maxExtAdvEvents; // ================= advertisement context parameters uint8_t isPeriodic; // is the adv parameters for periodic adv uint8_t active; // extended adv enable or not uint32_t primary_advertising_interval; uint16_t adv_event_counter; // counter for extend adv event uint32_t adv_event_duration; // duration of advertise int8 tx_power; // range -127 ~ 127 dBm, will be filled to field TxPower uint8_t sendingAuxAdvInd; // below parameters only applicable to extended adv, not for periodic adv uint8_t currentChn; // current adv channel uint8_t auxChn; // 1st aux PDU channel No. uint16_t currentAdvOffset; // current read ptr of adv data set, for fill AUX_XXX_IND PDUs } extAdvInfo_t; typedef struct { uint16 syncPacketOffset : 13; // 13bits uint16 offsetUnit : 1; // 1 bit uint16 offsetAdj : 1; // 1 bit uint16 rfu : 1; // 1 bit } syncInfoOffset_t; typedef struct { uint8 chn_map : 5; // 5bits uint8 sca : 3; // 3 bit } chanMap4_t; typedef struct { syncInfoOffset_t offset; uint16 interval; uint8 chn_map[4]; chanMap4_t chn_map4; uint8 AA[4]; uint8 crcInit[3]; uint16 event_counter; } syncInfo_t; /// data of periodic Advertising set typedef struct { uint8 dataComplete; // all data of advert set received uint16 advertisingDataLength; uint8 *advertisingData; }periodicAdvSetData_t; // 2020-01-15 add for connection & connectionless parameter typedef struct { // common // uint16 handle; // syncConnHandle for connectionless , connHandle for connection uint8 enable; // uint8 CTE_Length; // connectionless transmit CTE length or connection request and response CTE Length uint8 CTE_Type; // AOA, ADO 1us , AOD 2us uint8 CTE_Count; // number of CTE to transmit in each PA interval // IQ Sample:max number of CTE to sample and report in each PA interval uint8 CTE_Count_Idx; // record the number of times that the CTE send , max equal to CTE_Count uint8 pattern_LEN; uint8 AntID[LL_CTE_MAX_PATTERN_LEN]; uint8 slot_Duration; // switching and sampling slot 1us or 2us // connectionless transmit param // uint8 advSet; // identify connectionless advertising set // CTEInfo_t merge to periodicAdvInfo_t , advSet not used // connection CTE request & response enable command uint16 CTE_Request_Intv; }CTEInfo_t; // periodic adv: data + parameters + enable flag // note that periodic adv also need extended adv parameters + enable typedef struct { uint8_t advHandle; periodicAdvSetData_t data; uint16 adv_interval_min; uint16 adv_interval_max; uint16_t adv_event_properties; // adv event type // ================= advertisement context parameters uint8_t active; // extended adv enable or not uint32_t adv_interval; uint8_t secondaryAdvPHY; // reserved, should we copy this setting from ext adv info? ext adv may be disabled while keep periodic adv alive uint8 chn_map[5]; // 37 bits uint8_t chanMapTable[LL_MAX_NUM_DATA_CHAN]; uint8_t numUsedChans; // count of the number of usable data channels uint8 sca; // 3 bit uint32 AA; uint32 crcInit; uint8_t tx_power; // not setting now, reserve for TxPwr field uint16_t periodic_adv_event_counter; // counter for periodic adv event uint8 pa_current_chn; // current periodic adv channel uint8_t currentChn; // current adv channel uint16_t currentAdvOffset; // current read ptr of adv data set, for fill AUX_XXX_IND PDUs // 2020-01-15 CTE global variable CTEInfo_t PrdCTEInfo; } periodicAdvInfo_t; /////////////////////////////////////////////////////////// // Scanner Event Parameters typedef struct { // taskInfo_t *llTask; // pointer to associated task block uint8 ownAddrType; // own device address type of public or random uint8 ownAddr[ LL_DEVICE_ADDR_LEN ]; // own device address uint8 initPending; // flag to indicate if Scan needs to be initialized uint8 scanMode; // flag to indicate if currently scanning uint8 scanType; // passive or active scan uint16 scanInterval; // the interval between scan events uint16 scanWindow; // the duration of a scan event uint8 wlPolicy; // white list policy for Scan uint8 filterReports; // flag to indicate if duplicate Adv packet reports are to be filtered uint16 scanBackoffUL; // backoff upper limit count uint8 nextScanChan; // advertising channel to be used by scanner uint8 numSuccess; // for adjusting backoff count by tracking successive successes uint8 numFailure; // for adjusting backoff count by tracking successive failures uint16 currentBackoff; // current back off count, uint16 because the upper limit is 256 } scanInfo_t; /////////////////////////////////////////////////////////// // Extended Scanner Parameters #define LL_MAX_EXTENDED_SCAN_PHYS 2 #define LL_MAX_EXTENDED_INIT_PHYS 3 #define LL_SCAN_PHY_1M_BITMASK 0x01 #define LL_CONN_PHY_2M_BITMASK 0x02 // only for init #define LL_SCAN_PHY_CODED_BITMASK 0x04 typedef struct { uint8 enable; uint8 ownAddrType; // own device address type of public or random uint8 ownAddr[ LL_DEVICE_ADDR_LEN ]; // own device address uint8 wlPolicy; // white list policy for Scan uint8 numOfScanPHY; uint8 scanPHYs[LL_MAX_EXTENDED_SCAN_PHYS]; // scan PHYs uint8 scanType[LL_MAX_EXTENDED_SCAN_PHYS]; // passive or active scan uint16 scanInterval[LL_MAX_EXTENDED_SCAN_PHYS]; // the interval between scan events uint16 scanWindow[LL_MAX_EXTENDED_SCAN_PHYS]; // the duration of a scan event uint8 filterDuplicate; // Duplicate filtering setting uint16 duration; // scan duration in a scan period uint16 period; // scan period // scan context uint8 current_index; // current scan parameter index, 0 or 1 uint8 current_scan_PHY; uint8 current_chn; // TODO: check below members are required or not uint16 adv_data_offset; // offset of long adv data uint16 adv_data_buf_len; // adv data buffer size uint8 *adv_data; } extScanInfo_t; typedef struct { uint8 valid; uint8 options; uint8 advertising_SID; uint8 advertiser_Address_Type; uint8 advertiser_Address[LL_DEVICE_ADDR_LEN]; uint16 skip; uint16 sync_Timeout; uint8 sync_CTE_Type; } scannerSyncInfo_t; typedef struct { uint8 header; uint8 advA[LL_DEVICE_ADDR_LEN]; uint8 targetA[LL_DEVICE_ADDR_LEN]; uint8 cteInfo; uint16 adi; struct { uint8 chn_idx; uint8 ca; uint8 offset_unit; uint16 aux_offset; uint8 aux_phy; } auxPtr; uint8 syncInfo[18]; uint8 txPower; } extAdvHdr_t; /////////////////// Initiator Event Parameters typedef struct { uint8 ownAddrType; // own device address type of public or random uint8 ownAddr[ LL_DEVICE_ADDR_LEN ]; // own device address // uint8 initPending; // flag to indicate if Scan needs to be initialized uint8 scanMode; // flag to indicate if currently scanning uint16 scanInterval; // the interval between scan events uint16 scanWindow; // the duration of a scan event uint8 nextScanChan; // advertising channel to be used by scanner uint8 wlPolicy; // white list policy for Init uint8 connId; // allocated connection ID uint8 scaValue; // Master SCA as an ordinal value for PPM } initInfo_t; typedef struct { uint8 ownAddrType; // own device address type of public or random uint8 ownAddr[ LL_DEVICE_ADDR_LEN ]; // own device address uint8 wlPolicy; // white list policy for Init // uint8 initPending; // flag to indicate if Scan needs to be initialized uint8 scanMode; // flag to indicate if currently scanning uint8 numOfScanPHY; uint8 initPHYs[LL_MAX_EXTENDED_SCAN_PHYS]; // scan PHYs uint16 scanInterval[LL_MAX_EXTENDED_SCAN_PHYS]; // the interval between scan events uint16 scanWindow[LL_MAX_EXTENDED_SCAN_PHYS]; // the duration of a scan event uint16 conn_interval_min[LL_MAX_EXTENDED_SCAN_PHYS]; uint16 conn_interval_max[LL_MAX_EXTENDED_SCAN_PHYS]; uint16 conn_latency[LL_MAX_EXTENDED_SCAN_PHYS]; uint16 supervision_timeout[LL_MAX_EXTENDED_SCAN_PHYS]; uint16 minimum_CE_length[LL_MAX_EXTENDED_SCAN_PHYS]; uint16 maximum_CE_length[LL_MAX_EXTENDED_SCAN_PHYS]; // initiator parameters for 2Mbps PHY uint8 is_2M_parameter_present; uint16 conn_interval_min_2Mbps; uint16 conn_interval_max_2Mbps; uint16 conn_latency_2Mbps; uint16 supervision_timeout_2Mbps; uint16 minimum_CE_length_2Mbps; uint16 maximum_CE_length_2Mbps; // scan context uint8 current_index; // current scan parameter index, 0 or 1 uint8 current_scan_PHY; uint8 current_chn; uint8 connId; // allocated connection ID uint8 scaValue; // Master SCA as an ordinal value for PPM } extInitInfo_t; ///////////////////////////////////////////////////////////////// typedef struct { uint8_t winSize; // window size uint16_t winOffset; // window offset uint16_t connInterval; // connection interval uint16_t slaveLatency; // number of connection events the slave can ignore uint16_t connTimeout; // supervision connection timeout } connParam_t; typedef struct { uint8_t verNum; // controller spec version uint16_t comId; // company identifier uint16_t subverNum; // implementation version } verInfo_t; typedef struct { uint8_t connId; // connection ID uint8_t termIndRcvd; // indicates a TERMINATE_IND was received uint8_t reason; // reason code to return to Host when connection finally ends } termInfo_t; // TX Data typedef struct txData_t { struct txData_t *pNext; // pointer to next Tx data entry on queue } txData_t; // Data Packet Queue typedef struct { txData_t *head; // pointer to head of queue txData_t *tail; // pointer to tail of queue } llDataQ_t; // Version Information Exchange typedef struct { uint8_t peerInfoValid; // flag to indicate the peer's version information is valid uint8_t hostRequest; // flag to indicate the host has requested the peer's version information uint8_t verInfoSent; // flag to indicate this device's version information has been sent } verExchange_t; // Feature Set Data typedef struct { uint8_t featureRspRcved; // flag to indicate the Feature Request has been responded to uint8_t featureSet[ 8 ]; } featureSet_t; // Channel Map typedef struct { uint8_t chanMap[ 5 ]; // bit map corresponding to the data channels 0..39 } chanMap_t; // Control Procedure Information typedef struct { uint8_t ctrlPktActive; // flag that indicates a control packet is being processed uint8_t ctrlPkts[ LL_MAX_NUM_CTRL_PROC_PKTS ]; // queue of control packets to be processed uint8_t ctrlPktCount; // number of queued control packets uint16_t ctrlTimeoutVal; // timeout in CI events for control procedure for this connection uint16_t ctrlTimeout; // timeout counter in CI events for control procedure } ctrlPktInfo_t; typedef struct { uint16_t MaxTxOctets; uint16_t MaxTxTime; uint16_t MaxRxOctets; uint16_t MaxRxTime; }ll_pdu_length_ctrl_t; typedef struct { ll_pdu_length_ctrl_t local; ll_pdu_length_ctrl_t remote; ll_pdu_length_ctrl_t suggested; // global setting uint8_t isProcessingReq; uint8_t isWatingRsp; uint8_t isChanged; uint8_t dummy[1]; }llPduLenManagment_t; typedef struct { uint8_t allPhy; uint8_t txPhy; uint8_t rxPhy; uint8_t dummy[1]; }ll_phy_ctrl_t; typedef struct { uint8_t m2sPhy; uint8_t s2mPhy; uint16_t instant; }ll_phy_update_ind_t; typedef struct { ll_phy_ctrl_t def; ll_phy_ctrl_t local; ll_phy_ctrl_t req; ll_phy_ctrl_t rsp; uint16_t phyOptions; uint8_t isChanged; uint8_t isProcessingReq; uint8_t isWatingRsp; uint8_t status; uint8_t dummy[2]; }llPhyModeManagment_t; // 2020-02-21 add for CTE req & rsp logic typedef struct { uint8_t isChanged; uint8_t isProcessingReq; uint8_t isWatingRsp; // wait other Ctrl command procedure uint8_t errorCode; }llCTEModeManagement_t; // for timer drift adjust typedef struct { uint32 coarse; // number of 625us ticks at SFD capture uint16 fine; // number of 31.25ns ticks at SFD capture } sysTime_t; // Encryption typedef struct { // Note: IV and SKD provide enough room for the full IV and SKD. When the // Master and Slave values are provided, the result is one combined // (concatenated) value. uint8 IV[ LL_ENC_IV_LEN ]; // combined master and slave IV values concatenated uint8 SKD [ LL_ENC_SKD_LEN ]; // combined master and slave SKD values concatenated uint8 RAND[ LL_ENC_RAND_LEN ]; // random vector from Master uint8 EDIV[ LL_ENC_EDIV_LEN ]; // encrypted diversifier from Master uint8 nonce[ LL_ENC_NONCE_LEN ]; // current nonce with current IV value uint8 SK[ LL_ENC_SK_LEN ]; // session key derived from LTK and SKD uint8 LTK[ LL_ENC_LTK_LEN ]; // Long Term Key from Host uint8 SKValid; // flag that indicates the Session Key is valid uint8 LTKValid; // Long Term Key is valid uint32 txPktCount; // used for nonce formation during encryption (Note: 39 bits!)?? uint32 rxPktCount; // used for nonce formation during encryption (Note: 39 bits!)?? uint8 encRestart; // flag to indicate if an encryption key change took place uint8 encRejectErrCode; // error code for rejecting encryption request // ALT: COULD USE ONE VARIABLE AND STATES FOR THESE FLAGS; IF SO, THE // CONTROL PROCEDURE WOULD NEED TO BE REWORKED. uint8 startEncRspRcved; // flag to indicate the Start Request has been responded to uint8 pauseEncRspRcved; // flag to indicate the Pause Request has been responded to uint8 encReqRcved; // flag to indicate an Enc Req was received in a Enc Pause procedure uint8 startEncReqRcved; // flag to indicate the Start Request has been responded to uint8 rejectIndRcved; // flag to indicate the Start Encryption needs to be aborted } encInfo_t; // Packet Error Rate Information - General typedef struct { uint16 numPkts; // total number of packets uint16 numCrcErr; // total number of packets with CRC error uint16 numEvents; // total number of connection events uint16 numMissedEvts; // total number of missed connection events } perInfo_t; typedef struct { // adv channel statistics int ll_send_undirect_adv_cnt; int ll_send_nonconn_adv_cnt; int ll_send_scan_adv_cnt; int ll_send_hdc_dir_adv_cnt; int ll_send_ldc_dir_adv_cnt; // adv in conn event int ll_send_conn_adv_cnt; int ll_conn_adv_pending_cnt; // scan in conn event int ll_conn_scan_pending_cnt; // slave counter int ll_recv_scan_req_cnt; int ll_send_scan_rsp_cnt; int ll_recv_conn_req_cnt; int ll_send_conn_rsp_cnt; // whitelist int ll_filter_scan_req_cnt; int ll_filter_conn_req_cnt; // scan int ll_recv_adv_pkt_cnt; int ll_send_scan_req_cnt; int ll_recv_scan_rsp_cnt; // connection event counters int ll_conn_succ_cnt; // LL accept connect, but not always sync succ int ll_link_lost_cnt; int ll_link_estab_fail_cnt; // connection packet statistics // int ll_recv_ctrl_pkt_cnt; // int ll_recv_data_pkt_cnt; // int ll_recv_invalid_pkt_cnt; // // int ll_recv_abnormal_cnt; // // int ll_send_data_pkt_cnt; // // int ll_conn_event_cnt; // int ll_recv_crcerr_event_cnt; // CRC error detected in the connection event // int ll_conn_event_timeout_cnt; // timeout connection event countt int ll_rx_peer_cnt; // scan/conn request counter, to consider whether we need it // LL <-> HCI packets statistics // int ll_to_hci_pkt_cnt; // int ll_hci_to_ll_pkt_cnt; // // int ll_hci_buffer_alloc_err_cnt; //ll_hw err cnt int ll_evt_shc_err; //ll_hw err cnt int ll_trigger_err; int ll_rfifo_rst_err; int ll_rfifo_rst_cnt; int ll_rfifo_read_err; // reserve counter int ll_tbd_cnt1; int ll_tbd_cnt2; int ll_tbd_cnt3; int ll_tbd_cnt4; int ll_tbd_cnt5; int ll_tbd_cnt6; int ll_tbd_cnt7; int ll_tbd_cnt8; } llGlobalStatistics_t; // ======= multi-connection typedef struct { // connection packet statistics uint32_t ll_recv_ctrl_pkt_cnt; uint32_t ll_recv_data_pkt_cnt; uint32_t ll_recv_invalid_pkt_cnt; uint32_t ll_recv_abnormal_cnt; uint32_t ll_send_data_pkt_cnt; uint32_t ll_conn_event_cnt; uint32_t ll_recv_crcerr_event_cnt; // CRC error detected in the connection event uint32_t ll_conn_event_timeout_cnt; // timeout connection event countt // LL <-> HCI packets statistics uint32_t ll_to_hci_pkt_cnt; uint32_t ll_hci_to_ll_pkt_cnt; uint32_t ll_hci_buffer_alloc_err_cnt; uint32_t ll_miss_master_evt_cnt; uint32_t ll_miss_slave_evt_cnt; // reserve counter uint32_t ll_tbd_cnt1; uint32_t ll_tbd_cnt2; uint32_t ll_tbd_cnt3; uint32_t ll_tbd_cnt4; } llLinkStatistics_t; typedef struct { uint8_t chanMap[5]; uint16_t chanMapUpdateEvent; // event count to indicate when to apply pending chan map update uint8_t chanMapUpdated; } preChanMapUpdate_t; // Connection Data typedef struct { uint8_t rx_timeout; // ----- uint8_t rx_crcok; // ----- uint8_t allocConn; // flag to indicate if this connection is allocated uint8_t active; // flag to indicate if this connection is active uint8_t connId; // connection ID uint8_t firstPacket; // flag to indicate when the first packet has been received. 0 means TURE, 1 means FALSE uint16_t currentEvent; // current event number uint16_t nextEvent; // next active event number uint16_t lastCurrentEvent; uint16_t expirationEvent; // event at which the LSTO has expired uint16_t expirationValue; // number of events to a LSTO expiration uint16_t scaFactor; // SCA factor for timer drift calculation uint32_t timerDrift; // saved timer drift adjustment to avoid recalc uint32_t accuTimerDrift; // accumulate timer drift // Connection Parameters uint32_t lastTimeToNextEvt; // the time to next event from the previous connection event uint8_t slaveLatencyAllowed; // flag to indicate slave latency is permitted uint16_t slaveLatency; // current slave latency; 0 means inactive uint8_t lastSlaveLatency; // last slave latency value used uint16_t slaveLatencyValue; // current slave latency value (when enabled) uint32_t accessAddr; // saved synchronization word to be used by Slave uint32_t initCRC; // connection CRC initialization value (24 bits) uint8_t sleepClkAccuracy; // peer's sleep clock accurracy; used by own device to determine timer drift connParam_t curParam; // current connection parameters // Channel Map uint8_t nextChan; // the channel for the next active connection event uint8_t currentChan; // the channel for the currently completed connection event uint8_t lastCurrentChan; // the channel for the last currentChan for disable slavelatency usage uint8_t numUsedChans; // count of the number of usable data channels // uint8_t hopLength; // used for finding next data channel at next connection event uint8_t chanMapTable[LL_MAX_NUM_DATA_CHAN]; // current chan map table that is in use for this connection uint8_t chanMap[5]; chanMap_t chanMapUpdate; // slave chanMapUpdate for different connId preChanMapUpdate_t preChanMapUpdate; // used for disable latency uint8_t hop; // TX Related uint8_t txDataEnabled; // flag that indicates whether data output is allowed llDataQ_t txDataQ; // queue of Tx Data packets // RX Related uint8_t rxDataEnabled; // flag that indicates whether data input is allowed uint8_t lastRssi; // last data packet RSSI received on this connection uint16_t foff; // A2 add, sync qualitiy indicator, estimated by rx BB uint8_t carrSens; // A2 add, estimated freq offset by rx BB ,foff-512-->[-512 511]KHz // Control Packet Information ctrlPktInfo_t ctrlPktInfo; // information for control procedure processing // Parameter Update Control Procedure uint8_t pendingParamUpdate; // flag to indicate connection parameter update is pending uint16_t paramUpdateEvent; // event count to indicate when to apply pending param update connParam_t paramUpdate; // update parameters // Channel Map Update Control Procedure uint8_t pendingChanUpdate; // flag to indicate connection channel map update is pending uint16 chanMapUpdateEvent; // event count to indicate when to apply pending chan map update // Encryption Data Control Procedure uint8 encEnabled; // flag to indicate that encryption is enabled for this connection encInfo_t encInfo; // structure that holds encryption related data // Feature Set featureSet_t featureSetInfo; // feature set for this connection // Version Information verExchange_t verExchange; // version information exchange verInfo_t verInfo; // peer version information // Termination Control Procedure termInfo_t termInfo; // structure that holds connection termination data // Unknnown Control Packet uint8 unknownCtrlType; // value of unknown control type // Packet Error Rate perInfo_t perInfo; // PER uint8_t isCollision; uint8_t rejectOpCode; ll_phy_update_ind_t phyUpdateInfo; // ll_phy update // Parameter Update Control Procedure uint8_t pendingPhyModeUpdate; // flag to indicate connection ll phy update is pending uint16_t phyModeUpdateEvent; uint8_t sn_nesn; // use to save last sn/nesn in new IC // for new IC uint8_t llMode; // for RTLP & TRLP loop, may need change the HW engine mode. // =============== A2 multi connection uint8_t ctrlDataIsProcess ; // seding a control packet or not uint8_t ctrlDataIsPending ; // control packet is pending to be sent // uint8_t dummy[2]; // for 4-bytes align int anchor_point_base_time; // do we need it? int anchor_point_fine_time; // do we need it? int next_event_base_time; // do we need it? int next_event_fine_time; // do we need it? ctrl_packet_buf ctrlData; llLinkBuf_t ll_buf; // DLE llPduLenManagment_t llPduLen; llPhyModeManagment_t llPhyModeCtrl; // add after BBB ROM release, PHY format uint8_t llRfPhyPktFmt; // add after BBB ROM release, channel selection algorithm uint8_t channel_selection; llLinkStatistics_t pmCounter; // 2020-01-19 add for CTE // llCTE_ReqFlag,llCTE_RspFlag only indicate CTE Request and Response enable or disable status uint8 llCTE_ReqFlag; uint8 llCTE_RspFlag; // CTE REQ & RSP Control llCTEModeManagement_t llCTEModeCtrl; CTEInfo_t llConnCTE; // reserved variables uint32 llTbd1; uint32 llTbd2; uint32 llTbd3; uint32 llTbd4; } llConnState_t; typedef struct { uint8 rsc_idx; // connection ID, reserved for dynamic resource allocate uint8 priority; uint8 linkRole; // link role, slave(LL_ROLE_SLAVE) or master(LL_ROLE_MASTER) uint32 task_period; // schedule period, calculate from connection interval, in us. required??? uint32 task_duration; // task duration uint32 remainder; // remainder time // uint32 lastTimerValue; // last timer configure value } llScheduleInfo_t; // Per BLE LL Connection (max number is BLE_LL_MAX_NUM_LL_CONNS) typedef struct { uint8 numLLConns; // number of allocated connections uint8 numLLMasterConns; // number of master, to check whether we need it uint8 currentConn; // the LL connection currently in use llScheduleInfo_t scheduleInfo[MAX_NUM_LL_CONN_ROM_LIMT]; // scheduler information // ========== common link parameter for all master connection uint16 connInterval; // connection interval uint16 slaveLatency; // number of connection events the slave can ignore uint16 connTimeout; // supervision connection timeout uint32 per_slot_time; // delta T per resource slot uint32 timerExpiryTick; // last LL timer expiry tick in 1s timer uint32 current_timer; // LL timer initial load value } llConns_t; // for extended/periodic adv shceduler typedef struct { // uint8 advInfoIdx; // index in the adv parameters array // uint8 advSetIdx; // index in the adv parameters array uint8 adv_handler; extAdvInfo_t *pAdvInfo; // uint8 eventType; // adv event type // uint32 task_period; // schedule period, calculate from connection interval, in us. required??? // uint32 task_duration; // task duration uint32 nextEventRemainder; // remainder time uint32 auxPduRemainder; // remainder time } llAdvScheduleInfo_t; typedef struct { // uint8 advInfoIdx; // index in the adv parameters array // uint8 advSetIdx; // index in the adv parameters array uint8 adv_handler; periodicAdvInfo_t *pAdvInfo_prd; extAdvInfo_t *pAdvInfo; // uint32 task_period; // schedule period, calculate from connection interval, in us. required??? // uint32 task_duration; // task duration uint32 nextEventRemainder; // primary channel PDU remainder time uint32 auxPduRemainder; // auxilary channel PDU remainder time } llPeriodicAdvScheduleInfo_t; // periodic scanner context typedef struct { uint16 syncHandler; uint8 valid; // the syncInfo is valid or not uint8 syncEstOk; // sync the periodic adv event OK? uint8 event1stFlag; // indicate LL is searching AUX_SYNC_IND PDU uint16 skip; uint32 syncTimeout; // unit us, need *1250 when convert from HCI value uint8 syncCteType; // syncInfoOffset_t offset; uint32 advInterval; // periodic adv event interval, unit us, need *1250 when convert from air interface PDU value uint8 chnMap[5]; uint8_t chanMapTable[LL_MAX_NUM_DATA_CHAN]; uint8_t numUsedChans; // count of the number of usable data channels uint8 sca; uint8 accessAddress[4]; uint16 channelIdentifier; uint8 crcInit[3]; uint8 advPhy; uint8 current_channel; // current scan channel, for AUX_CHAIN_IND, it may different with 1st PDU channel uint8 currentEventChannel; // current periodic adv event 1st PDU channel uint16 eventCounter; // periodic adv event counter uint16 syncLostTime; uint32 nextEventRemainder; // next periodic advertisement event remainder time // 2020-01-17 add for CTE Sampling CTEInfo_t IQSampleInfo; } llPeriodicScannerInfo_t; // ===== BBB ROM code added typedef struct { uint8 isTimer1RecoverRequired; uint32 timer1Remainder; // uint8 isTimer2RecoverRequired; // uint32 timer2Remainder; // // uint8 isTimer3RecoverRequired; // uint32 timer3Remainder; uint8 isTimer4RecoverRequired; uint32 timer4Remainder; } llSleepContext; typedef uint8 llStatus_t; // Packet Error Rate Information By Channel typedef struct { uint16 numPkts[ LL_MAX_NUM_DATA_CHAN ]; uint16 numCrcErr[ LL_MAX_NUM_DATA_CHAN ]; } perByChan_t; typedef struct { uint16 rxNumPkts[ LL_MAX_NUM_DATA_CHAN ]; uint16 rxNumCrcErr[ LL_MAX_NUM_DATA_CHAN ]; uint16 txNumRetry[ LL_MAX_NUM_DATA_CHAN ]; uint16 TxNumAck[ LL_MAX_NUM_DATA_CHAN ]; uint16 rxToCnt[ LL_MAX_NUM_DATA_CHAN ]; uint16 connEvtCnt[ LL_MAX_NUM_DATA_CHAN ]; } perStatsByChan_t; typedef struct { uint16 rxNumPkts; uint16 rxNumCrcErr; uint16 txNumRetry; uint16 TxNumAck; uint16 rxToCnt; uint16 connEvtCnt; } perStats_t; typedef enum{ LE_1M_PHY= 0x01, LE_2M_PHY= 0x02, LE_CODED_PHY=0x04, }PhyModeCtrl_e; typedef uint8_t ( *LL_PLUS_AdvDataFilterCB_t )(void); typedef uint8_t ( *LL_PLUS_ScanRequestFilterCB_t )(void); // Counters typedef struct { uint8 numTxDone; // TX pkts ACK'ed (auto-empty not counted) uint8 numTxAck; // TX pkts ACK'ed (both auto-empty and TX FIFO packets) uint8 numTxCtrlAck; // TX control pkts ACK'ed uint8 numTxCtrl; // TX control pkts TX'ed uint8 numTxRetrans; // retrans + auto-empty retrans uint8 numTx; // trans (incl. auto-empty) + retrans (incl. auto-empty) uint8 numRxOk; // non-empty correctly RX'ed and not ignored data and control pkts uint8 numRxCtrl; // correctly RX'ed control pkts uint8 numRxNotOk; // RX'ed with bad CRC uint8 numRxIgnored; // correctly RX'ed, but ignored uint8 numRxEmpty; // correctly RX'ed empty packets uint8 numRxFifoFull; // correctly RX'ed but discarded due to full RX FIFO } rfCounters_t; // global variables extern uint8_t LL_TaskID; extern uint8_t llState; extern peerInfo_t peerInfo; extern advInfo_t adv_param; extern scanInfo_t scanInfo; // scan data extern initInfo_t initInfo; // Initiator info extern extScanInfo_t extScanInfo; // extended Scanner info extern extInitInfo_t extInitInfo; // extended Initiator info extern chanMap_t chanMapUpdate; extern featureSet_t deviceFeatureSet; //extern preChanMapUpdate_t preChanMapUpdate[]; extern uint8 g_maxConnNum; extern uint8 g_maxPktPerEventTx; extern uint8 g_maxPktPerEventRx; extern llConnState_t *conn_param; extern uint8 numComplPkts; extern uint8 numComplPktsLimit; extern verInfo_t verInfo; extern rfCounters_t rfCounters; extern llConns_t g_ll_conn_ctx; extern llGlobalStatistics_t g_pmCounters; extern llPduLenManagment_t g_llPduLen; //extern llPhyModeManagment_t g_llPhyModeCtrl; extern peerInfo_t g_llWhitelist[]; // Resolving list extern resolvingListInfo_t g_llResolvinglist[]; extern uint8 g_llRlEnable; extern uint8 g_llRlDeviceNum; // current device number in resolving list, should not exceed LL_RESOLVINGLIST_ENTRY_NUM extern uint16 g_llRlTimeout; // extended advertiser extern extAdvInfo_t *g_pExtendedAdvInfo; extern periodicAdvInfo_t *g_pPeriodicAdvInfo; extern uint8 g_extAdvNumber; // number of ext adv set extern uint8 g_perioAdvNumber; // number of periodic adv set extern uint16 g_advSetMaximumLen; // extended adv scheduler context extern llAdvScheduleInfo_t *g_pAdvSchInfo; extern uint8 g_schExtAdvNum; // current schedule extended adv number extern uint8 g_currentExtAdv; // current schedule extended adv index // ==== periodic adv scheduler context extern llPeriodicAdvScheduleInfo_t *g_pAdvSchInfo_periodic; // periodic adv scheduler info extern uint8 g_schExtAdvNum_periodic; // current scheduler periodic adv number extern uint8 g_currentExtAdv_periodic; // current scheduler periodic adv index extern uint32 g_advPerSlotTick; // us extern uint32 g_advSlotPeriodic; // us extern uint32 g_currentAdvTimer; // us extern uint32 g_timerExpiryTick; // us extern uint8 g_currentTimerTask; extern llSleepContext g_llSleepContext; extern llPeriodicScannerInfo_t g_llPeriodAdvSyncInfo[]; // =========== BBB ROM code #define LL_TASK_EXTENDED_ADV 0x01 #define LL_TASK_PERIODIC_ADV 0x02 #define LL_TASK_EXTENDED_SCAN 0x03 #define LL_TASK_EXTENDED_INIT 0x04 #define LL_TASK_PERIODIC_SCAN 0x05 //#define LL_TASK_SLAVE_CONN 0x03 //#define LL_TASK_MASTER_CONN 0x04 #define LL_TASK_OTHERS 0x10 #define LL_TASK_INVALID 0xFF extern uint8 llTaskState; extern extAdvHdr_t ext_adv_hdr; // 2020-02-15 add for connectionless IQ Sample buffer extern uint16 *g_pLLcteISample; extern uint16 *g_pLLcteQSample; #endif