655 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			655 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								#include "chip_reg_base.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "iot_errno_api.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_perf.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "math_log10.h"
							 | 
						||
| 
								 | 
							
								#include "phy_cal.h"
							 | 
						||
| 
								 | 
							
								#include "hw_tonemask.h"
							 | 
						||
| 
								 | 
							
								#include "phy_data.h"
							 | 
						||
| 
								 | 
							
								#include "phy_math_tb.h"
							 | 
						||
| 
								 | 
							
								#include "phy_nf.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ana.h"
							 | 
						||
| 
								 | 
							
								#include "phy_chn.h"
							 | 
						||
| 
								 | 
							
								#include "phy_txrx_pwr.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "mac_sys_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dfe_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rxtd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rx_fd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_tx_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_reg.h"
							 | 
						||
| 
								 | 
							
								#include "ahb.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rxtd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "granite_reg.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								#include "iot_utils_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_share_task.h"
							 | 
						||
| 
								 | 
							
								#include "iot_module_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_pkt_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_system.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "plc_mpdu_header.h"
							 | 
						||
| 
								 | 
							
								#include "plc_protocol.h"
							 | 
						||
| 
								 | 
							
								#include "plc_const.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dfe_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_nf.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_anti_spur_set(int8_t bw_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint8_t tgt_pwr = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t low = 0, hi = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tgt power = 110 */
							 | 
						||
| 
								 | 
							
								    phy_agc_rcv_tgt_get(&tgt_pwr, &low, &hi);
							 | 
						||
| 
								 | 
							
								#if PHY_BB_AI_WITH_PULSE_CHECK_EN
							 | 
						||
| 
								 | 
							
								    /* Disable AGC satuation */
							 | 
						||
| 
								 | 
							
								    phy_agc_sat_adj_set(1, 0);
							 | 
						||
| 
								 | 
							
								    phy_agc_rcv_tgt_set(113, low, hi);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    phy_agc_rcv_tgt_set(110, low, hi);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(bw_id == IOT_SUPPORT_TONE_80_490) { /* band0  80-490,  1M/8M/15M spurs exist */
							 | 
						||
| 
								 | 
							
								        /* mask 1M spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x8073);
							 | 
						||
| 
								 | 
							
								        /* mask 8M spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,2,0x9bb0);
							 | 
						||
| 
								 | 
							
								        /* mask 8M spur by spur mask, [-15,15] */
							 | 
						||
| 
								 | 
							
								        phy_spur_mask_set(328,30);
							 | 
						||
| 
								 | 
							
								    } else if (bw_id == IOT_SUPPORT_TONE_100_230) { /* band1 100-230, 1M/3M/6M spurs exist */
							 | 
						||
| 
								 | 
							
								        /* mask 3M spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x8405);
							 | 
						||
| 
								 | 
							
								        /* mask 6M spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,2,0x8fd5);
							 | 
						||
| 
								 | 
							
								        /* mask 3M spur by spur mask, [-7,7] */
							 | 
						||
| 
								 | 
							
								        phy_spur_mask_set(123,15);
							 | 
						||
| 
								 | 
							
								    } else if (bw_id == IOT_SUPPORT_TONE_32_120 || \
							 | 
						||
| 
								 | 
							
								        bw_id == IOT_SUPPORT_TONE_72_120) {
							 | 
						||
| 
								 | 
							
								        /* mask 500K spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x801c);
							 | 
						||
| 
								 | 
							
								        /* mask 2M spur by notch filter */
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,2,0x81ca);
							 | 
						||
| 
								 | 
							
								        /* mask 2M spur by spur mask, [-7,7] */
							 | 
						||
| 
								 | 
							
								        phy_spur_mask_set(82,15);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)bw_id;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_anti_spur_set_clr()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint8_t tgt_pwr = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t low = 0, hi = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tgt power = 100 */
							 | 
						||
| 
								 | 
							
								    phy_agc_rcv_tgt_get(&tgt_pwr, &low, &hi);
							 | 
						||
| 
								 | 
							
								    phy_agc_rcv_tgt_set(phy_rx_tgt_pwr_get(), low, hi);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* clr 1M spur by notch filter */
							 | 
						||
| 
								 | 
							
								    phy_anf_option_set(PHY_ANF_MODE_BYPASS,0,0,0);
							 | 
						||
| 
								 | 
							
								    /* clr 8M spur by spur mask, [-15,15] */
							 | 
						||
| 
								 | 
							
								    phy_spur_mask_clr(328,30);
							 | 
						||
| 
								 | 
							
								    /* clr 3M spur by spur mask, [-7,7] */
							 | 
						||
| 
								 | 
							
								    phy_spur_mask_clr(123,15);
							 | 
						||
| 
								 | 
							
								    /* clr 2M spur by spur mask, [-7,7] */
							 | 
						||
| 
								 | 
							
								    phy_spur_mask_clr(82,15);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_anti_pulse_set()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								    uint32_t bw_id = phy_band_id_get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Loweer Packet detection threshold */
							 | 
						||
| 
								 | 
							
								    if(bw_id != IOT_SUPPORT_TONE_72_120 && \
							 | 
						||
| 
								 | 
							
								        bw_id != IOT_SUPPORT_TONE_32_120) {
							 | 
						||
| 
								 | 
							
								        phy_rxfd_pkt_det_thd_set(8,16);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Fix gain to MAXA gain */
							 | 
						||
| 
								 | 
							
								    phy_agc_gain_lvl_set(1,60,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Bypass DC blocker */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_DC_BLK_BYPASS, tmp, 1);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Disable AGC satuation */
							 | 
						||
| 
								 | 
							
								    phy_agc_sat_adj_set(1, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_BB_AI_WITH_PULSE_CHECK_EN
							 | 
						||
| 
								 | 
							
								    /* clear shift en */
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_RXTD_SPARE2_ADDR, 0);
							 | 
						||
| 
								 | 
							
								    /* dly a cycle */
							 | 
						||
| 
								 | 
							
								    phy_rx_nf_by_rxtd_get(14);
							 | 
						||
| 
								 | 
							
								    /* clear shift */
							 | 
						||
| 
								 | 
							
								    phy_gain_shift_set(0,0,0,0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_anti_pulse_set_clr()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								    uint32_t bw_id = phy_band_id_get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* Loweer Packet detection threshold */
							 | 
						||
| 
								 | 
							
								    if(bw_id != IOT_SUPPORT_TONE_72_120 && \
							 | 
						||
| 
								 | 
							
								        bw_id != IOT_SUPPORT_TONE_32_120) {
							 | 
						||
| 
								 | 
							
								        phy_rxfd_pkt_det_thd_set(16,32);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* free gain to MAXA gain */
							 | 
						||
| 
								 | 
							
								    phy_agc_gain_lvl_set(0,60,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable DC blocker */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_DC_BLK_BYPASS, tmp, 0);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable AGC satuation */
							 | 
						||
| 
								 | 
							
								    phy_agc_sat_adj_set(0, 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_perf_common_init(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t range_id = IOT_PLC_PHY_BAND_RANGE_DFT;
							 | 
						||
| 
								 | 
							
								    uint32_t band_id = phy_band_id_get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* bypass anf 1 */
							 | 
						||
| 
								 | 
							
								    phy_anf_option_set(PHY_ANF_MODE_BYPASS, 0, 2, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* notch filter 1.8M */
							 | 
						||
| 
								 | 
							
								    if(range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND && \
							 | 
						||
| 
								 | 
							
								        band_id == IOT_SUPPORT_TONE_32_120) {
							 | 
						||
| 
								 | 
							
								        /* use external gain table */
							 | 
						||
| 
								 | 
							
								        phy_gain_table_ovr_set(1,1);
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_BYPASS,0,0,0);
							 | 
						||
| 
								 | 
							
								    } else if(range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND && \
							 | 
						||
| 
								 | 
							
								        band_id == IOT_SUPPORT_TONE_72_120) {
							 | 
						||
| 
								 | 
							
								        phy_gain_table_ovr_set(0,0);
							 | 
						||
| 
								 | 
							
								        phy_anf_sel_set(0);
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_BYPASS,0,0,0);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        phy_gain_table_ovr_set(0,0);
							 | 
						||
| 
								 | 
							
								        phy_anf_sel_set(0);
							 | 
						||
| 
								 | 
							
								        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x8174);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* bypass fnf */
							 | 
						||
| 
								 | 
							
								    phy_fnf_option_set(PHY_FNF_MODE_BYPASS, 0, 0);
							 | 
						||
| 
								 | 
							
								    phy_fnf_sel_set(1, 2);
							 | 
						||
| 
								 | 
							
								    phy_fnf_sel_set(2, 2);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_chn_est_cb(uint32_t band_id, void *chn_ptr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t start_time = 0, end_time = 0;
							 | 
						||
| 
								 | 
							
								    uint64_t time_span = 0;
							 | 
						||
| 
								 | 
							
								    int16_t csi_i = 0, csi_q = 0;
							 | 
						||
| 
								 | 
							
								#if PHY_BB_AI_WITH_PULSE_CHECK_EN == 0
							 | 
						||
| 
								 | 
							
								    uint32_t center_pwr_8m = 0, ext_pwr_8m = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t center_pwr_3m = 0, ext_pwr_3m = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t center_pwr_2m = 0, ext_pwr_2m = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#if PHY_BB_AI_WITH_PULSE_CHECK_EN == 0
							 | 
						||
| 
								 | 
							
								    static uint8_t spur_8m_cnt = 0, spur_3m_cnt =0, \
							 | 
						||
| 
								 | 
							
								        spur_2m_cnt =0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pkt_buf = NULL;
							 | 
						||
| 
								 | 
							
								    uint32_t *csi_buf = NULL;
							 | 
						||
| 
								 | 
							
								    phy_chn_est_t *chn_est = (phy_chn_est_t *)chn_ptr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get start time */
							 | 
						||
| 
								 | 
							
								    start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* return if one scenario flag set */
							 | 
						||
| 
								 | 
							
								    if(chn_est->spur_8m_done_flag | \
							 | 
						||
| 
								 | 
							
								        chn_est->spur_3m_done_flag | \
							 | 
						||
| 
								 | 
							
								        chn_est->spur_2m_done_flag | \
							 | 
						||
| 
								 | 
							
								        chn_est->pulse_done_flag) {
							 | 
						||
| 
								 | 
							
								        iot_printf("phy cert flag:%x checked!\n", \
							 | 
						||
| 
								 | 
							
								            chn_est->spur_8m_done_flag | \
							 | 
						||
| 
								 | 
							
								            (chn_est->spur_3m_done_flag << 1) | \
							 | 
						||
| 
								 | 
							
								            (chn_est->spur_2m_done_flag << 2) | \
							 | 
						||
| 
								 | 
							
								            (chn_est->pulse_done_flag << 3));
							 | 
						||
| 
								 | 
							
								        return ret;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get mem from iot_pkt to save csi data */
							 | 
						||
| 
								 | 
							
								    IOT_PKT_GET(pkt_buf, IOT_PHY_CSI_BUF_LEN, 0, PLC_PHY_COMMON_MID);
							 | 
						||
| 
								 | 
							
								    if(!pkt_buf) {
							 | 
						||
| 
								 | 
							
								        iot_printf("phy chn est fatal error, iot_pkt_get fail\n");
							 | 
						||
| 
								 | 
							
								        return ret;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    csi_buf = (uint32_t *)iot_pkt_put(pkt_buf, IOT_PHY_CSI_BUF_LEN);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* check csi buf pointer valid and flag */
							 | 
						||
| 
								 | 
							
								    if(csi_buf != NULL) {
							 | 
						||
| 
								 | 
							
								        /* rst to trig enable */
							 | 
						||
| 
								 | 
							
								        phy_reset(PHY_RST_REASON_WARM);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* trig fft to dump */
							 | 
						||
| 
								 | 
							
								        phy_rx_fft_dump(csi_buf, 0, 0, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DEBUG_EN
							 | 
						||
| 
								 | 
							
								        /* cal csi for every tone for debug*/
							 | 
						||
| 
								 | 
							
								        for(tone_idx = 0; tone_idx < IOT_PHY_CSI_BUF_LEN/4; tone_idx++)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            csi_i = (int16_t)(*(csi_buf + tone_idx) & 0xFFFF);
							 | 
						||
| 
								 | 
							
								            csi_q = (int16_t)(*(csi_buf + tone_idx) >> 16);
							 | 
						||
| 
								 | 
							
								            iot_printf("csi_i:%d, csi_q:%d, dB:%u\n", \
							 | 
						||
| 
								 | 
							
								                csi_i, \
							 | 
						||
| 
								 | 
							
								                csi_q, \
							 | 
						||
| 
								 | 
							
								                (uint32_t)(10 * mlog10(csi_i * csi_i + csi_q * csi_q + 1)));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_BB_AI_WITH_PULSE_CHECK_EN == 0
							 | 
						||
| 
								 | 
							
								        /* spur check */
							 | 
						||
| 
								 | 
							
								        if(!chn_est->spur_8m_done_flag && \
							 | 
						||
| 
								 | 
							
								            !chn_est->spur_3m_done_flag && \
							 | 
						||
| 
								 | 
							
								            !chn_est->spur_2m_done_flag) {
							 | 
						||
| 
								 | 
							
								            if(band_id == IOT_SUPPORT_TONE_80_490) {
							 | 
						||
| 
								 | 
							
								                /* spur: scan 8M with 32 point */
							 | 
						||
| 
								 | 
							
								                for(tone_idx = IOT_SPUR_8M_CENTER_TONE - 16; \
							 | 
						||
| 
								 | 
							
								                    tone_idx <= IOT_SPUR_8M_CENTER_TONE + 16; tone_idx++)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    csi_i = (int16_t)(*(csi_buf + tone_idx) & 0xFFFF);
							 | 
						||
| 
								 | 
							
								                    csi_q = (int16_t)(*(csi_buf + tone_idx) >> 16);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(tone_idx > (IOT_SPUR_8M_CENTER_TONE - 8) && \
							 | 
						||
| 
								 | 
							
								                        tone_idx <= (IOT_SPUR_8M_CENTER_TONE + 8)) {
							 | 
						||
| 
								 | 
							
								                        center_pwr_8m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        ext_pwr_8m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                iot_printf("center_pwr_8m:%u, ext_pwr_8m:%u\n", \
							 | 
						||
| 
								 | 
							
								                    center_pwr_8m, ext_pwr_8m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* compare 8M thd */
							 | 
						||
| 
								 | 
							
								                if(center_pwr_8m/ext_pwr_8m > IOT_SPUR_8M_CMP_THD) {
							 | 
						||
| 
								 | 
							
								                    spur_8m_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(spur_8m_cnt >= 2) {
							 | 
						||
| 
								 | 
							
								                        phy_anti_spur_set(band_id);
							 | 
						||
| 
								 | 
							
								                        iot_printf("band %u phy_anti_spur_set done!\n", \
							 | 
						||
| 
								 | 
							
								                            band_id);
							 | 
						||
| 
								 | 
							
								                        spur_8m_cnt = 0;
							 | 
						||
| 
								 | 
							
								                        chn_est->spur_8m_done_flag = 1;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* spur: scan 3M with 32 point */
							 | 
						||
| 
								 | 
							
								                for(tone_idx = IOT_SPUR_3M_CENTER_TONE - 16; \
							 | 
						||
| 
								 | 
							
								                    tone_idx <= IOT_SPUR_3M_CENTER_TONE + 16; tone_idx++)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    csi_i = (int16_t)(*(csi_buf + tone_idx) & 0xFFFF);
							 | 
						||
| 
								 | 
							
								                    csi_q = (int16_t)(*(csi_buf + tone_idx) >> 16);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(tone_idx > (IOT_SPUR_3M_CENTER_TONE - 8) && \
							 | 
						||
| 
								 | 
							
								                        tone_idx <= (IOT_SPUR_3M_CENTER_TONE + 8)) {
							 | 
						||
| 
								 | 
							
								                        center_pwr_3m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        ext_pwr_3m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                iot_printf("center_pwr_3m:%u, ext_pwr_3m:%u\n", \
							 | 
						||
| 
								 | 
							
								                    center_pwr_3m, ext_pwr_3m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* compare 3M thd */
							 | 
						||
| 
								 | 
							
								                if(center_pwr_3m/ext_pwr_3m > IOT_SPUR_3M_CMP_THD) {
							 | 
						||
| 
								 | 
							
								                    //mask 3M spur by notch filter
							 | 
						||
| 
								 | 
							
								                    phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x8405);
							 | 
						||
| 
								 | 
							
								                    //mask 3M spur by spur mask, [-7,7]
							 | 
						||
| 
								 | 
							
								                    phy_spur_mask_set(123,15);
							 | 
						||
| 
								 | 
							
								                    iot_printf("band %u phy 3M att done!\n", band_id);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } else if(band_id == IOT_SUPPORT_TONE_100_230) {
							 | 
						||
| 
								 | 
							
								                /* spur: scan 3M with 32 point */
							 | 
						||
| 
								 | 
							
								                for(tone_idx = IOT_SPUR_3M_CENTER_TONE - 16; \
							 | 
						||
| 
								 | 
							
								                    tone_idx <= IOT_SPUR_3M_CENTER_TONE + 16; tone_idx++)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    csi_i = (int16_t)(*(csi_buf + tone_idx) & 0xFFFF);
							 | 
						||
| 
								 | 
							
								                    csi_q = (int16_t)(*(csi_buf + tone_idx) >> 16);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(tone_idx > (IOT_SPUR_3M_CENTER_TONE - 8) && \
							 | 
						||
| 
								 | 
							
								                        tone_idx <= (IOT_SPUR_3M_CENTER_TONE + 8)) {
							 | 
						||
| 
								 | 
							
								                        center_pwr_3m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        ext_pwr_3m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                iot_printf("center_pwr_3m:%u, ext_pwr_3m:%u\n", \
							 | 
						||
| 
								 | 
							
								                    center_pwr_3m, ext_pwr_3m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* compare 3M thd */
							 | 
						||
| 
								 | 
							
								                if(center_pwr_3m/ext_pwr_3m > IOT_SPUR_3M_CMP_THD) {
							 | 
						||
| 
								 | 
							
								                    spur_3m_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(spur_3m_cnt >= 2) {
							 | 
						||
| 
								 | 
							
								                        phy_anti_spur_set(band_id);
							 | 
						||
| 
								 | 
							
								                        iot_printf("band %u phy_anti_spur_set done!\n", \
							 | 
						||
| 
								 | 
							
								                            band_id);
							 | 
						||
| 
								 | 
							
								                        spur_3m_cnt = 0;
							 | 
						||
| 
								 | 
							
								                        chn_est->spur_3m_done_flag = 1;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } else if(band_id == IOT_SUPPORT_TONE_32_120 || \
							 | 
						||
| 
								 | 
							
								                band_id == IOT_SUPPORT_TONE_72_120) {
							 | 
						||
| 
								 | 
							
								                /* spur: scan 2M with 32 point */
							 | 
						||
| 
								 | 
							
								                for(tone_idx = IOT_SPUR_2M_CENTER_TONE - 16; \
							 | 
						||
| 
								 | 
							
								                    tone_idx <= IOT_SPUR_2M_CENTER_TONE + 16; tone_idx++)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    csi_i = (int16_t)(*(csi_buf + tone_idx) & 0xFFFF);
							 | 
						||
| 
								 | 
							
								                    csi_q = (int16_t)(*(csi_buf + tone_idx) >> 16);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(tone_idx > (IOT_SPUR_2M_CENTER_TONE - 8) && \
							 | 
						||
| 
								 | 
							
								                        tone_idx <= (IOT_SPUR_2M_CENTER_TONE + 8)) {
							 | 
						||
| 
								 | 
							
								                        center_pwr_2m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        ext_pwr_2m += csi_i * csi_i + csi_q * csi_q;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                iot_printf("center_pwr_2m:%u, ext_pwr_2m:%u\n", \
							 | 
						||
| 
								 | 
							
								                    center_pwr_2m, ext_pwr_2m);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* compare 2M thd */
							 | 
						||
| 
								 | 
							
								                if(center_pwr_2m/ext_pwr_2m > IOT_SPUR_2M_CMP_THD) {
							 | 
						||
| 
								 | 
							
								                    spur_2m_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if(spur_2m_cnt >= 2) {
							 | 
						||
| 
								 | 
							
								                        phy_anti_spur_set(band_id);
							 | 
						||
| 
								 | 
							
								                        iot_printf("band %u phy_anti_spur_set done!\n", \
							 | 
						||
| 
								 | 
							
								                            band_id);
							 | 
						||
| 
								 | 
							
								                        spur_2m_cnt = 0;
							 | 
						||
| 
								 | 
							
								                        chn_est->spur_2m_done_flag = 1;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        iot_printf("csi buf pointer get fail from iot_pkt!\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* free iot pkt */
							 | 
						||
| 
								 | 
							
								    iot_pkt_free(pkt_buf);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get end time */
							 | 
						||
| 
								 | 
							
								    end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal span time */
							 | 
						||
| 
								 | 
							
								    time_span = end_time - start_time;
							 | 
						||
| 
								 | 
							
								    if (time_span < 0) { // wrap around
							 | 
						||
| 
								 | 
							
								        time_span = (0x100000000LL) - start_time + end_time;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("start_time:%u, end time:%u, span:%llu=%llu us\n", \
							 | 
						||
| 
								 | 
							
								        start_time, end_time, time_span, (uint64_t)(time_span / 25));
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)band_id;
							 | 
						||
| 
								 | 
							
								    (void)chn_ptr;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* todo: pack ref info */
							 | 
						||
| 
								 | 
							
								void phy_chan_est_flag_clear(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* clear all channel est flag */
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.chn_est.spur_8m_done_flag = 0;
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.chn_est.spur_3m_done_flag = 0;
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.chn_est.spur_2m_done_flag = 0;
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.chn_est.pulse_done_flag = 0;
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.chn_est.bcn_check_cnt = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_chn_est_ai_period_ms_get(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* TODO: support more different clock sources */
							 | 
						||
| 
								 | 
							
								    return PHY_CHN_EST_AI_PERIOD_MS;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_chn_nf_update(uint8_t need_fix_gain)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t origin_hs = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t dly_exp = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t tmp_nf_192p, tmp_nf_384p, tmp_nf_768p;
							 | 
						||
| 
								 | 
							
								    uint8_t tmp_nf_1536p, tmp_nf_3072p;
							 | 
						||
| 
								 | 
							
								    int8_t max_gain, min_gain, ini_gain;
							 | 
						||
| 
								 | 
							
								    uint8_t fix_gain_en;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_HW_SPIKE_OPTIMIZATION
							 | 
						||
| 
								 | 
							
								    /* NOTE: KL2 before check nf, need trun off spike detection */
							 | 
						||
| 
								 | 
							
								    phy_spike_check_set(0xFF, 0, 3);
							 | 
						||
| 
								 | 
							
								    phy_impuse_cancel_set(0, 6, 14);
							 | 
						||
| 
								 | 
							
								    phy_hpf_set(1, 230);
							 | 
						||
| 
								 | 
							
								    phy_ana_set_filter_init(phy_band_id_get());
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* stop systick nf cal */
							 | 
						||
| 
								 | 
							
								    phy_cal_nf_systick_stop();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (need_fix_gain) {
							 | 
						||
| 
								 | 
							
								        tmp = PHY_RXTD_READ_REG(CFG_BB_AGC_GAIN_LEVEL_ADDR);
							 | 
						||
| 
								 | 
							
								        max_gain = (int8_t)REG_FIELD_GET(SW_MAX_GAIN, tmp);
							 | 
						||
| 
								 | 
							
								        min_gain = (int8_t)REG_FIELD_GET(SW_MIN_GAIN, tmp);
							 | 
						||
| 
								 | 
							
								        ini_gain = (int8_t)REG_FIELD_GET(SW_INI_GAIN, tmp);
							 | 
						||
| 
								 | 
							
								        fix_gain_en = REG_FIELD_GET(SW_FIX_GAIN_EN, tmp);
							 | 
						||
| 
								 | 
							
								        /* nf dump fix gain 0 */
							 | 
						||
| 
								 | 
							
								        phy_agc_gain_lvl_set(1, 0, -24,0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* 192 point */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RXTD_READ_REG(CFG_BB_AGC_ACC_STEP_ADDR);
							 | 
						||
| 
								 | 
							
								    /* backup hs */
							 | 
						||
| 
								 | 
							
								    origin_hs = (uint8_t)REG_FIELD_GET(SW_AGC_ACC_STEP_HS, tmp);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, PHY_AGC_ACC_STEP_192P);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    dly_exp = phy_agc_acc_dly_get();
							 | 
						||
| 
								 | 
							
								    tmp_nf_192p = phy_rx_nf_by_rxtd_get(dly_exp);
							 | 
						||
| 
								 | 
							
								    if (tmp_nf_192p != PHY_NF_RST_VAL) {
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_192p = tmp_nf_192p;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* 384 point */
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, PHY_AGC_ACC_STEP_384P);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    dly_exp = phy_agc_acc_dly_get();
							 | 
						||
| 
								 | 
							
								    tmp_nf_384p = phy_rx_nf_by_rxtd_get(dly_exp);
							 | 
						||
| 
								 | 
							
								    if (tmp_nf_384p != PHY_NF_RST_VAL) {
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_384p = tmp_nf_384p;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* 768 point */
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, PHY_AGC_ACC_STEP_768P);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    dly_exp = phy_agc_acc_dly_get();
							 | 
						||
| 
								 | 
							
								    tmp_nf_768p = phy_rx_nf_by_rxtd_get(dly_exp);
							 | 
						||
| 
								 | 
							
								    if (tmp_nf_768p != PHY_NF_RST_VAL) {
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_768p = tmp_nf_768p;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* 1536 point */
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, PHY_AGC_ACC_STEP_1536P);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    dly_exp = phy_agc_acc_dly_get();
							 | 
						||
| 
								 | 
							
								    tmp_nf_1536p = phy_rx_nf_by_rxtd_get(dly_exp);
							 | 
						||
| 
								 | 
							
								    if (tmp_nf_1536p != PHY_NF_RST_VAL) {
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_1536p = tmp_nf_1536p;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* 3072 point */
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, PHY_AGC_ACC_STEP_3072P);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    dly_exp = phy_agc_acc_dly_get();
							 | 
						||
| 
								 | 
							
								    tmp_nf_3072p = phy_rx_nf_by_rxtd_get(dly_exp);
							 | 
						||
| 
								 | 
							
								    if (tmp_nf_3072p != PHY_NF_RST_VAL) {
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_3072p = tmp_nf_3072p;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* revert hs */
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_AGC_ACC_STEP_HS, tmp, origin_hs);
							 | 
						||
| 
								 | 
							
								    PHY_RXTD_WRITE_REG(CFG_BB_AGC_ACC_STEP_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* check rssi - nf thd: contiguous or max-min */
							 | 
						||
| 
								 | 
							
								    if((tmp_nf_192p != PHY_NF_RST_VAL && tmp_nf_384p != PHY_NF_RST_VAL &&
							 | 
						||
| 
								 | 
							
								        tmp_nf_192p <= (tmp_nf_384p - PHY_SPIKE_FIND_THD)) ||
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        (tmp_nf_384p != PHY_NF_RST_VAL && tmp_nf_768p != PHY_NF_RST_VAL &&
							 | 
						||
| 
								 | 
							
								        tmp_nf_384p <= (tmp_nf_768p - PHY_SPIKE_FIND_THD)) ||
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        (tmp_nf_768p != PHY_NF_RST_VAL && tmp_nf_1536p != PHY_NF_RST_VAL &&
							 | 
						||
| 
								 | 
							
								        tmp_nf_768p <= (tmp_nf_1536p - PHY_SPIKE_FIND_THD)) ||
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        (tmp_nf_1536p != PHY_NF_RST_VAL && tmp_nf_3072p != PHY_NF_RST_VAL &&
							 | 
						||
| 
								 | 
							
								        tmp_nf_1536p <= (tmp_nf_3072p - PHY_SPIKE_FIND_THD)) ||
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        (tmp_nf_192p != PHY_NF_RST_VAL && tmp_nf_3072p != PHY_NF_RST_VAL &&
							 | 
						||
| 
								 | 
							
								        tmp_nf_192p <= (tmp_nf_3072p - PHY_SPIKE_FIND_THD))) {
							 | 
						||
| 
								 | 
							
								        phy_spike_shift_en_set(1);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        phy_spike_shift_en_set(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* updata current nf */
							 | 
						||
| 
								 | 
							
								    phy_updata_nf_of_bbai();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!g_phy_ctxt.dep.nf) {
							 | 
						||
| 
								 | 
							
								        g_phy_ctxt.dep.nf = g_phy_cpu_share_ctxt.nf_for_bbai;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* recover gain */
							 | 
						||
| 
								 | 
							
								    if (need_fix_gain)
							 | 
						||
| 
								 | 
							
								        phy_agc_gain_lvl_set(fix_gain_en, max_gain, min_gain, ini_gain);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("[PHY]nf_192p: %d, nf_384p: %d, nf_768p: %d "\
							 | 
						||
| 
								 | 
							
								        "nf_1536p: %d, nf_3072p: %d, spike_shift_en: %d!\n", \
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_192p, \
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_384p, \
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_768p, \
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_1536p, \
							 | 
						||
| 
								 | 
							
								        g_phy_cpu_share_ctxt.nf_3072p, \
							 | 
						||
| 
								 | 
							
								        phy_spike_shift_en_get());
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)need_fix_gain;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rx_tgt_pwr_set(uint8_t pwr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.tgt_pwr = pwr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t phy_rx_tgt_pwr_get()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return (uint8_t)(g_phy_ctxt.indep.tgt_pwr);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_spike_shift_en_set(bool_t en)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    g_phy_ctxt.indep.spike_shift_en= en;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool_t phy_spike_shift_en_get()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return  (bool_t)(g_phy_ctxt.indep.spike_shift_en);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool_t phy_high_noise_sts_get()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* diff between big spur/pulse and packet */
							 | 
						||
| 
								 | 
							
								    if (g_phy_ctxt.dep.nf >= PHY_CHN_HIGH_NOISE_NF_THD) {
							 | 
						||
| 
								 | 
							
								        /* TODO: detect more in the future */
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_csma_ignore_cca(bool_t en)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = PHY_DFE_READ_REG(CFG_BB_DFE_OPTION_0_ADDR);
							 | 
						||
| 
								 | 
							
								    if (true == en) {
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(SW_CCA_OVR, tmp, 0);
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(SW_CCA_OVR_EN, tmp, 1);
							 | 
						||
| 
								 | 
							
								        PHY_DFE_WRITE_REG(CFG_BB_DFE_OPTION_0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        if (REG_FIELD_GET(SW_CCA_OVR_EN, tmp)) {
							 | 
						||
| 
								 | 
							
								            REG_FIELD_SET(SW_CCA_OVR_EN, tmp, 0);
							 | 
						||
| 
								 | 
							
								            PHY_DFE_WRITE_REG(CFG_BB_DFE_OPTION_0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("ignore CCA:%d, dfe_option:0x%x\n", en, tmp);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_pkt_thd_set(uint8_t percent)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* check valid */
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(percent <= 100);
							 | 
						||
| 
								 | 
							
								    uint32_t ret = ERR_FAIL;
							 | 
						||
| 
								 | 
							
								    uint8_t thd0_dft, thd1_dft;
							 | 
						||
| 
								 | 
							
								    /* thd0 from 8 to 32 */
							 | 
						||
| 
								 | 
							
								    uint8_t thd0 = \
							 | 
						||
| 
								 | 
							
								        PHY_CHN_PKT_DET_THD1_DFT + (percent * 24) / 100;
							 | 
						||
| 
								 | 
							
								    /* thd1 from 16 to 48 */
							 | 
						||
| 
								 | 
							
								    uint8_t thd1 = \
							 | 
						||
| 
								 | 
							
								        PHY_CHN_PKT_DET_THD2_DFT + (percent * 32) / 100;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get current config */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_pkt_det_thd_get(&thd0_dft, &thd1_dft);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get max */
							 | 
						||
| 
								 | 
							
								    thd0 = (thd0 > thd0_dft) ? thd0 : thd0_dft;
							 | 
						||
| 
								 | 
							
								    thd1 = (thd1 > thd1_dft) ? thd1 : thd1_dft;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* increase pkt detect threshold for decrease warnning */
							 | 
						||
| 
								 | 
							
								    if (g_phy_ctxt.indep.work_mode == PHY_MODE_NORMAL) {
							 | 
						||
| 
								 | 
							
								        phy_rxfd_pkt_det_thd_set(thd0, thd1);
							 | 
						||
| 
								 | 
							
								        ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								        iot_printf("phy pkt_det_thd %d-%d\n", thd0, thd1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 |