123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575 |
- /**************************************************************************************************
-
- 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.
-
- **************************************************************************************************/
- #ifndef LL_DEF_H_
- #define LL_DEF_H_
- #include "types.h"
- #include "comdef.h"
- #include "bcomdef.h"
- #include "ll_buf.h"
- //#include "ll.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) | (p & (~m))
- #define GET_BITS(p,l,m) (p&m)>>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
- 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;
- // 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
- } resolvingListInfo_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
-
- uint8_t 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;
- 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
- uint8_t tx_power; // not setting now, reserve for TxPwr field
- 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;
- 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; // ----- Phyplus
- uint8_t rx_crcok; // ----- Phyplus
- 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;
- 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;
- /*bug-fix for : multi-role SMP, When already master established,then as slave smp,
- that smp shall relative with conn handle and role*/
- uint8 connRole;
- } 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;
- uint8 syncEstOk;
- 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
|