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; | ||
|  | } |