diff --git a/ble/controller/libdrv_bt_phy6220_patch.a b/ble/controller/libdrv_bt_phy6220_patch.a index 134e06adc070358ffe884280428ecb8b7454c76b..d8f13f817514d74cc57fa45081287e737ce1ad01 100755 Binary files a/ble/controller/libdrv_bt_phy6220_patch.a and b/ble/controller/libdrv_bt_phy6220_patch.a differ diff --git a/phy6220_hci.c b/phy6220_hci.c index 365081a34eba5c9ae169257096966759fad2b89d..7a78ee97f1f8f8a1110af83ec050962306add5aa 100755 --- a/phy6220_hci.c +++ b/phy6220_hci.c @@ -60,6 +60,7 @@ extern void ll_hw_go1(void); extern uint8 ll_hw_get_tr_mode(void); extern void gpio_write(gpio_pin_e pin, uint8_t en); extern void WaitRTCCount(uint32_t rtcDelyCnt); +extern void ll_scheduler1(uint32 time); extern llStatus_t LL_SetAdvParam0(uint16 advIntervalMin, uint16 advIntervalMax, uint8 advEvtType, @@ -71,7 +72,6 @@ extern llStatus_t LL_SetAdvParam0(uint16 advIntervalMin, extern int ll_hw_get_rfifo_depth(void); extern uint32_t read_current_fine_time(void); extern void move_to_master_function(void); -extern void move_to_slave_function0(void); extern uint8 LL_ENC_GenerateTrueRandNum1(uint8 *buf, uint8 len); extern void osal_pwrmgr_powerconserve1(); @@ -80,7 +80,6 @@ extern llStatus_t LL_TxData1(uint16 connId, uint8 pktLen, uint8 fragFlag); extern void rf_calibrate1(void); -extern void rf_calibrate2(void); extern llStatus_t LL_SetAdvParam1(uint16 advIntervalMin, uint16 advIntervalMax, uint8 advEvtType, @@ -90,6 +89,8 @@ extern llStatus_t LL_SetAdvParam1(uint16 advIntervalMin, uint8 advChanMap, uint8 advWlPolicy); extern void llMasterEvt_TaskEndOk1(void); +extern void llSlaveEvt_TaskEndOk1(void); + extern void HCI_Init(uint8 task_id); extern size_t __heap_start; @@ -103,7 +104,24 @@ extern uint8 llSecAdvAllow1(void); extern uint32 llCalcMaxScanTime1(void); extern void move_to_slave_function2(); extern void __TIM1_IRQHandler(void); - +extern void config_RTC1(uint32 time); +extern void ll_adptive_adj_next_time1(uint32_t next_time); +extern llStatus_t LL_SetAdvControl1( uint8 advMode ); +extern void llProcessTxData1(llConnState_t *connPtr, uint8 context); +void llProcessSlaveControlPacket1( llConnState_t *connPtr, + uint8 *pBuf ); +void llProcessMasterControlPacket1( llConnState_t *connPtr, + uint8 *pBuf ); +extern void llSetupSecScan1( uint8 chan ); +extern llStatus_t LL_SetScanParam1( uint8 scanType, + uint16 scanInterval, + uint16 scanWindow, + uint8 ownAddrType, + uint8 scanWlPolicy ); +extern llStatus_t LL_SetScanControl1( uint8 scanMode, + uint8 filterReports ); +extern void llProcessSlaveControlPacket2( llConnState_t *connPtr, + uint8 *pBuf ); #ifndef CONFIG_LARGE_HEAP_SIZE #define CONFIG_LARGE_HEAP_SIZE (4 * 1024) #endif @@ -166,6 +184,7 @@ static void *hci_arg; uint8 g_pConnectionBuffer[BLE_CONN_BUF_SIZE] __attribute__((aligned(4))); llConnState_t pConnContext[BLE_MAX_ALLOW_CONNECTION]; volatile uint8 g_clk32K_config; +void __ATTR_FUNC_XIP__(init_config)(void); int hci_api_le_read_buffer_size_complete(uint16_t *le_max_len, uint8_t *le_max_num) { @@ -297,37 +316,6 @@ void osalInitTasks(void) HCI_Init(taskID++); } -__attribute__((section(".__sram.code"))) void move_to_slave_function3(void) -{ - uint8_t *pBuf= g_rx_adv_buf.data; - - uint8_t winSize; - uint16_t winOffset; - uint16_t connInterval; - uint16_t slaveLatency; - uint16_t connTimeout; - - pBuf += 19; // skip initA and AdvA and accessAddr and initCRC - pBuf = llMemCopySrc((uint8 *)&winSize, pBuf, 1); - pBuf = llMemCopySrc((uint8 *)&winOffset, pBuf, 2); - pBuf = llMemCopySrc((uint8 *)&connInterval, pBuf, 2); - pBuf = llMemCopySrc((uint8 *)&slaveLatency, pBuf, 2); - pBuf = llMemCopySrc((uint8 *)&connTimeout, pBuf, 2); - - // TI style: convert to 625us tick - winSize <<= 1; - winOffset <<= 1; - connInterval <<= 1; - connTimeout <<= 4; - - if (((connTimeout <= ((slaveLatency) * connInterval << 1))) - || (connInterval == 0)) { - return; - } - - move_to_slave_function0(); -} - __attribute__((section(".__sram.code"))) void __LL_IRQHandler(void) { extern uint8_t g_intrpt_nested_level[1]; @@ -342,6 +330,7 @@ __attribute__((section(".__sram.code"))) void __LL_IRQHandler(void) g_intrpt_nested_level[0]--; } +extern void efuse_init(void); void hal_rfphy_init(void) { ll_patch_init(); @@ -371,7 +360,8 @@ void hal_rfphy_init(void) #endif XTAL16M_CAP_SETTING(xtalcap); - XTAL16M_CURRENT_SETTING(0x1); + XTAL16M_CURRENT_SETTING(0x01); + efuse_init(); ble_main(); NVIC_DisableIRQ(TIM2_IRQn); @@ -529,11 +519,11 @@ void init_config(void) //------------------------------------------------------------------------ // wakeup advance time, in us + pGlobal_config[WAKEUP_ADVANCE] = 1850;//650;//600;//310; + if (g_system_clk == SYS_CLK_XTAL_16M) { - pGlobal_config[WAKEUP_ADVANCE] = 1850; pGlobal_config[WAKEUP_DELAY] = 16; } else if (g_system_clk == SYS_CLK_DLL_48M) { - pGlobal_config[WAKEUP_ADVANCE] = 2850;//650;//600;//310; pGlobal_config[WAKEUP_DELAY] = 20; } @@ -548,11 +538,11 @@ void init_config(void) // LL engine settle time pGlobal_config[LL_HW_BB_DELAY] = 54;//54-8; pGlobal_config[LL_HW_AFE_DELAY] = 8; - pGlobal_config[LL_HW_PLL_DELAY] = 52; + pGlobal_config[LL_HW_PLL_DELAY] = 40; //reduce PLL_DELAY for scanner 11/11 // Tx2Rx and Rx2Tx interval //Tx2Rx could be advanced a little //Rx2Tx should be ensure T_IFS within150us+-2us - pGlobal_config[LL_HW_Rx_TO_TX_INTV] = 63; + pGlobal_config[LL_HW_Rx_TO_TX_INTV] = 63-RF_PHY_EXT_PREAMBLE_US; pGlobal_config[LL_HW_Tx_TO_RX_INTV] = 50;//65 //------------------------------------------------2MPHY @@ -563,7 +553,7 @@ void init_config(void) // Tx2Rx and Rx2Tx interval //Tx2Rx could be advanced a little //Rx2Tx should be ensure T_IFS within150us+-2us - pGlobal_config[LL_HW_Rx_TO_TX_INTV_2MPHY] = 72;//72 + pGlobal_config[LL_HW_Rx_TO_TX_INTV_2MPHY] = 72-RF_PHY_EXT_PREAMBLE_US;//72 pGlobal_config[LL_HW_Tx_TO_RX_INTV_2MPHY] = 57;//72 //------------------------------------------------CODEPHY 500K @@ -602,12 +592,12 @@ void init_config(void) if (g_system_clk == SYS_CLK_XTAL_16M) { // scan req -> scan rsp timing - pGlobal_config[SCAN_RSP_DELAY] = 13;//23; + pGlobal_config[SCAN_RSP_DELAY] = 16+RF_PHY_EXT_PREAMBLE_US;//13;//23; } else if (g_system_clk == SYS_CLK_DLL_48M) { // scan req -> scan rsp timing - pGlobal_config[SCAN_RSP_DELAY] = 4; // 12 // 2019/3/19 A2: 12 --> 9 + pGlobal_config[SCAN_RSP_DELAY] = 11+RF_PHY_EXT_PREAMBLE_US;//4; // 12 // 2019/3/19 A2: 12 --> 9 } else if (g_system_clk == SYS_CLK_DLL_64M) { // 2019/3/26 add - pGlobal_config[SCAN_RSP_DELAY] = 3; + pGlobal_config[SCAN_RSP_DELAY] = 3+RF_PHY_EXT_PREAMBLE_US; } // conn_req -> slave connection event calibration time, will advance the receive window @@ -656,14 +646,14 @@ void init_config(void) //====== A2 metal change add, for scanner & initiator if (g_system_clk == SYS_CLK_XTAL_16M) { - pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 18;//20; // 2019/3/19 A2: 20 --> 18 - pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 25;//27; // 2019/3/19 A2: 27 --> 25 + pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 18+RF_PHY_EXT_PREAMBLE_US;//20; // 2019/3/19 A2: 20 --> 18 + pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 15+RF_PHY_EXT_PREAMBLE_US;//27; // 2019/3/19 A2: 27 --> 25 //reduce scanner(23) 11/11 } else if (g_system_clk == SYS_CLK_DLL_48M) { - pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 10;//12; // 2019/3/19 A2: 12 --> 10 - pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 10;//18; + pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 10+RF_PHY_EXT_PREAMBLE_US;//12; // 2019/3/19 A2: 12 --> 10 + pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 10+RF_PHY_EXT_PREAMBLE_US;//18; } else if (g_system_clk == SYS_CLK_DLL_64M) { - pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 8; // 2019/3/26 add - pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 10; + pGlobal_config[LL_ADV_TO_SCAN_REQ_DELAY] = 8+RF_PHY_EXT_PREAMBLE_US; // 2019/3/26 add + pGlobal_config[LL_ADV_TO_CONN_REQ_DELAY] = 10+RF_PHY_EXT_PREAMBLE_US; } @@ -686,7 +676,6 @@ void init_config(void) // for simultaneous conn & adv/scan pGlobal_config[LL_NOCONN_ADV_EST_TIME] = 1400; pGlobal_config[LL_NOCONN_ADV_MARGIN] = 2600; //600; to avoid mesh prox llTrigErr 0x05 - pGlobal_config[LL_SEC_SCAN_MARGIN] = 2500;//1400; to avoid mesh proxy llTrigErr 0x15 pGlobal_config[LL_MIN_SCAN_TIME] = 2000; @@ -773,13 +762,23 @@ void ll_patch_init() JUMP_FUNCTION(LL_HW_GO) = (uint32_t)&ll_hw_go1; JUMP_FUNCTION(WAKEUP_INIT) = (uint32_t)&wakeup_init1; JUMP_FUNCTION(LL_TXDATA) = (uint32_t)&LL_TxData1; -// JUMP_FUNCTION(RF_CALIBRATTE) = (uint32_t)&rf_calibrate1; - JUMP_FUNCTION(RF_CALIBRATTE) = (uint32_t)&rf_calibrate2; + JUMP_FUNCTION(RF_CALIBRATTE) = (uint32_t)&rf_calibrate1; JUMP_FUNCTION(LL_SET_ADV_PARAM) = (uint32_t)&LL_SetAdvParam1; JUMP_FUNCTION(LL_CONN_TERMINATE) = (uint32_t)&llConnTerminate1; JUMP_FUNCTION(LL_SEC_ADV_ALLOW) = (uint32_t)&llSecAdvAllow1; JUMP_FUNCTION(LL_CALC_MAX_SCAN_TIME) = (uint32_t)&llCalcMaxScanTime1; - JUMP_FUNCTION(LL_MOVE_TO_SLAVE_FUNCTION) = (uint32_t)&move_to_slave_function3; + JUMP_FUNCTION(LL_MOVE_TO_SLAVE_FUNCTION) = (uint32_t)&move_to_slave_function2; + JUMP_FUNCTION(CONFIG_RTC) = (uint32_t)&config_RTC1; + JUMP_FUNCTION(LL_ADP_ADJ_NEXT_TIME) = (uint32_t)&ll_adptive_adj_next_time1; + JUMP_FUNCTION(LL_SLAVE_EVT_ENDOK) = (uint32_t)&llSlaveEvt_TaskEndOk1; + +#if defined(CONFIG_BT_OBSERVER) + JUMP_FUNCTION(LL_SET_SCAN_PARAM) = (uint32_t)&LL_SetScanParam1; + JUMP_FUNCTION(LL_SET_SCAN_CTRL) = (uint32_t)&LL_SetScanControl1; + JUMP_FUNCTION(LL_SETUP_SEC_SCAN) = (uint32_t )&llSetupSecScan1; + JUMP_FUNCTION(LL_SET_ADV_CONTROL) = (uint32_t)&LL_SetAdvControl1; + JUMP_FUNCTION(LL_SCHEDULER) = (uint32_t)&ll_scheduler1; +#endif #ifdef CONFIG_BT_CENTRAL JUMP_FUNCTION(LL_MASTER_EVT_ENDOK) = (uint32_t)&llMasterEvt_TaskEndOk1; @@ -795,6 +794,24 @@ void ll_patch_init() } +__attribute__((section(".__sram.code"))) void ll_patch_restore(uint8_t flg) +{ + if(flg) + { + JUMP_FUNCTION(LL_CONN_TERMINATE) = (uint32_t)&llConnTerminate1; + JUMP_FUNCTION(LL_PROCESS_TX_DATA) = (uint32_t)&llProcessTxData1; + JUMP_FUNCTION(LL_PROCESS_SLAVE_CTRL_PKT) = (uint32_t)&llProcessSlaveControlPacket1; + JUMP_FUNCTION(LL_PROCESS_MASTER_CTRL_PKT) = (uint32_t)&llProcessMasterControlPacket1; + } + else + { + JUMP_FUNCTION(LL_CONN_TERMINATE) = 0; + JUMP_FUNCTION(LL_PROCESS_TX_DATA) = 0; + JUMP_FUNCTION(LL_PROCESS_SLAVE_CTRL_PKT) = 0; + JUMP_FUNCTION(LL_PROCESS_MASTER_CTRL_PKT) = 0; + } +} + static int phy6220_hci_send(aos_dev_t *dev, uint8_t *data, uint32_t size) { uint16_t connHandle, param;