635 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			635 lines
		
	
	
		
			15 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 "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dump.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								#include "phy_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rxtd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rx_fd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_sys_reg.h"
							 | 
						||
| 
								 | 
							
								#include "iot_errno_api.h"
							 | 
						||
| 
								 | 
							
								#include "hw_tonemask.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ana.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dfe_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_data.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_phase.h"
							 | 
						||
| 
								 | 
							
								#include "math.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ana.h"
							 | 
						||
| 
								 | 
							
								#include "math_log10.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dump_hw.h"
							 | 
						||
| 
								 | 
							
								#include "phy_tools.h"
							 | 
						||
| 
								 | 
							
								#include "phy_perf.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t g_nf_buf[TONE_MAX_NUM] = {0};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_snr_dump_mode_set(phy_snr_dump_mode_t mode)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* select dump mode */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SNR_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_SNR_DUMP_MODE,tmp, mode);
							 | 
						||
| 
								 | 
							
								    //REG_FIELD_SET(SW_DUMP_DATA_SHIFT,tmp, 3);
							 | 
						||
| 
								 | 
							
								    PHY_RX_FD_WRITE_REG(CFG_BB_SNR_ADDR,tmp);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)mode;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_snr_dump_en(bool_t en)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* dump en */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SNR_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_SNR_DUMP_EN, tmp, en);
							 | 
						||
| 
								 | 
							
								    PHY_RX_FD_WRITE_REG(CFG_BB_SNR_ADDR,tmp);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)en;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool_t phy_snr_dump_wait_done()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SNR_ADDR);
							 | 
						||
| 
								 | 
							
								    return REG_FIELD_GET(SW_SNR_DUMP_DONE,tmp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_spur_dump_en(bool_t en)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* dump start */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SPUR_STAT_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_SPUR_STAT_START, tmp, en);
							 | 
						||
| 
								 | 
							
								    PHY_RX_FD_WRITE_REG(CFG_BB_SPUR_STAT_ADDR,tmp);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)en;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool_t phy_spur_dump_wait_done()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SPUR_STAT_ADDR);
							 | 
						||
| 
								 | 
							
								    return REG_FIELD_GET(SW_SPUR_STAT_DONE,tmp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_sound_dump_cond_set( \
							 | 
						||
| 
								 | 
							
								    bool_t snid_en, \
							 | 
						||
| 
								 | 
							
								    uint8_t snid, \
							 | 
						||
| 
								 | 
							
								    bool_t dtei_en, \
							 | 
						||
| 
								 | 
							
								    uint8_t dtei)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* dump en */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_RX_FD_READ_REG(CFG_BB_SOUND_DUMP_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_MATCH_DTEI, tmp, dtei);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_MATCH_SNID, tmp, snid);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_MATCH_DTEI_EN, tmp, dtei_en);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_MATCH_SNID_EN, tmp, snid_en);
							 | 
						||
| 
								 | 
							
								    PHY_RX_FD_WRITE_REG(CFG_BB_SOUND_DUMP_ADDR,tmp);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)snid_en;
							 | 
						||
| 
								 | 
							
								    (void)snid;
							 | 
						||
| 
								 | 
							
								    (void)dtei_en;
							 | 
						||
| 
								 | 
							
								    (void)dtei;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* snr calibrate */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_snr_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    int32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    int32_t snr = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* select dump mode */
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_set(PHY_SNR_DUMP_SNR1);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while(!phy_snr_dump_wait_done())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								            return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal snr for every tone */
							 | 
						||
| 
								 | 
							
								    for(tone_idx = start; tone_idx < end; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR + tone_idx*2);
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								        iot_printf( \
							 | 
						||
| 
								 | 
							
								            "[tone id-%d] signal:%d, noise:%d\n"
							 | 
						||
| 
								 | 
							
								            "[tone id-%d] signal:%d, noise:%d\n", \
							 | 
						||
| 
								 | 
							
								            tone_idx, (tmp >> 8) & 0xff,(tmp >> 0) & 0xff, \
							 | 
						||
| 
								 | 
							
								            tone_idx+1, (tmp >> 24) & 0xff,(tmp >> 16) & 0xff);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        snr = (int32_t)((( \
							 | 
						||
| 
								 | 
							
								            ((tmp >> 8) & 0xff) - ((tmp >> 0) & 0xff) \
							 | 
						||
| 
								 | 
							
								            ) * 3) >> 3);
							 | 
						||
| 
								 | 
							
								        buf[i++] = snr;
							 | 
						||
| 
								 | 
							
								        snr = (int32_t)((( \
							 | 
						||
| 
								 | 
							
								            ((tmp >> 24) & 0xff) - ((tmp >> 16) & 0xff) \
							 | 
						||
| 
								 | 
							
								            )*3) >> 3);
							 | 
						||
| 
								 | 
							
								        buf[i++] = snr;
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return ERR_OK;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* softbit dump */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_softbit_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    int32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* select dump mode */
							 | 
						||
| 
								 | 
							
								    PHY_WRITE_REG(CFG_BB_INT_CLR_0_EXT_ADDR, 0xffffffff);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_set(PHY_SNR_DUMP_SOFTBIT);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while (!phy_snr_dump_wait_done())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								           return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* softbit  I/Q for every tone */
							 | 
						||
| 
								 | 
							
								    for (tone_idx = start; tone_idx < end; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR + tone_idx*2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								        int8_t pwr_i = 0, pwr_q = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 I */
							 | 
						||
| 
								 | 
							
								        pwr_i = tmp & 0xff;
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 Q */
							 | 
						||
| 
								 | 
							
								        pwr_q = (tmp >> 8) & 0xff;
							 | 
						||
| 
								 | 
							
								       iot_printf("tone%d softbit:I=%d, Q=%d\n", \
							 | 
						||
| 
								 | 
							
								           tone_idx, pwr_i, pwr_q);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 I */
							 | 
						||
| 
								 | 
							
								        pwr_i = (tmp >> 16) & 0xff;
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 Q */
							 | 
						||
| 
								 | 
							
								        pwr_q = (tmp >> 24) & 0xff;
							 | 
						||
| 
								 | 
							
								        iot_printf("tone%d softbit:I=%d,Q=%d\n", \
							 | 
						||
| 
								 | 
							
								            tone_idx + 1, pwr_i, pwr_q);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        buf[i++] = tmp;
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return ERR_OK;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* csi calibrate */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_csi_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    uint32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								    int16_t pwr_i = 0, pwr_q = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if MAC_RX_TEST_ID == MAC_RX_CSI_SCAN && \
							 | 
						||
| 
								 | 
							
								    HW_PLATFORM >= HW_PLATFORM_SILICON
							 | 
						||
| 
								 | 
							
								    /* right shift for signal saturation */
							 | 
						||
| 
								 | 
							
								    phy_gain_shift_set(0,0,0,3);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* select dump mode */
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_set(PHY_SNR_DUMP_CSI);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while(!phy_snr_dump_wait_done())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								            return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal snr for every tone */
							 | 
						||
| 
								 | 
							
								    for(tone_idx = start; tone_idx < end; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR + tone_idx*2);
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 I */
							 | 
						||
| 
								 | 
							
								        pwr_i = tmp & 0xff;
							 | 
						||
| 
								 | 
							
								        if(pwr_i & 0x80) {
							 | 
						||
| 
								 | 
							
								           pwr_i = pwr_i - 256;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* tone idx 0 Q */
							 | 
						||
| 
								 | 
							
								        pwr_q = (tmp >> 8) & 0xff;
							 | 
						||
| 
								 | 
							
								        if(pwr_q & 0x80) {
							 | 
						||
| 
								 | 
							
								           pwr_q = pwr_q - 256;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								        iot_printf("tone%d csi:I=%d,Q=%d\n", \
							 | 
						||
| 
								 | 
							
								            tone_idx, pwr_i, pwr_q);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        buf[i++] = pow(pwr_i, 2) + pow(pwr_q, 2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* tone idx 1 I */
							 | 
						||
| 
								 | 
							
								        pwr_i = (tmp >> 16) & 0xff;
							 | 
						||
| 
								 | 
							
								       if(pwr_i & 0x80) {
							 | 
						||
| 
								 | 
							
								           pwr_i = pwr_i - 256;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* tone idx 1 Q */
							 | 
						||
| 
								 | 
							
								        pwr_q = (tmp >> 24) & 0xff;
							 | 
						||
| 
								 | 
							
								        if(pwr_q & 0x80) {
							 | 
						||
| 
								 | 
							
								           pwr_q = pwr_q - 256;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								        iot_printf("tone%d csi:I=%d,Q=%d\n", \
							 | 
						||
| 
								 | 
							
								            tone_idx + 1, pwr_i, pwr_q);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        buf[i++] = pow(pwr_i, 2) + pow(pwr_q, 2);
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* spur cal */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_spur_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    uint32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    uint32_t start_time = 0, end_time = 0;
							 | 
						||
| 
								 | 
							
								    int64_t time_span = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* start spur */
							 | 
						||
| 
								 | 
							
								    phy_spur_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    /* start time after enable */
							 | 
						||
| 
								 | 
							
								    start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while (!phy_spur_dump_wait_done()) {
							 | 
						||
| 
								 | 
							
								        if (tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								            return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    /* end time after done */
							 | 
						||
| 
								 | 
							
								    end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    time_span = end_time - start_time;
							 | 
						||
| 
								 | 
							
								    /* wrap around */
							 | 
						||
| 
								 | 
							
								    if (time_span < 0) {
							 | 
						||
| 
								 | 
							
								        time_span = (0x100000000LL) - start_time + end_time;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("[Spur][Elapsed Time] %lldns\r\n", time_span * 40);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal spur for every tone */
							 | 
						||
| 
								 | 
							
								    for (tone_idx = start; tone_idx < end; ) {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR + tone_idx * 2);
							 | 
						||
| 
								 | 
							
								        buf[i++] = tmp & 0xFFFF;
							 | 
						||
| 
								 | 
							
								        buf[i++] = (tmp >> 16) & 0xFFFF;
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* noise floor cal */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_noise_floor_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    uint32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt, \
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_t mode)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    uint32_t start_time = 0, end_time = 0;
							 | 
						||
| 
								 | 
							
								    int64_t time_span = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM == HW_PLATFORM_SILICON
							 | 
						||
| 
								 | 
							
								    /* right shift for signal saturation */
							 | 
						||
| 
								 | 
							
								    phy_gain_shift_set(0, 0, 0, 3);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* en noise floor */
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_set(mode);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    /* start time after enable */
							 | 
						||
| 
								 | 
							
								    start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while(!phy_snr_dump_wait_done())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								            return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								    /* end time after done */
							 | 
						||
| 
								 | 
							
								    end_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    time_span = end_time - start_time;
							 | 
						||
| 
								 | 
							
								    if (time_span < 0) { // wrap around
							 | 
						||
| 
								 | 
							
								        time_span = (0x100000000LL) - start_time + end_time;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("[Noise Floor][Elapsed Time] %lldns\r\n", time_span*40);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal noise floor for every tone */
							 | 
						||
| 
								 | 
							
								    for(tone_idx = start; tone_idx < end; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR+tone_idx*2);
							 | 
						||
| 
								 | 
							
								        buf[i++] = tmp & 0xFFFF;
							 | 
						||
| 
								 | 
							
								        buf[i++] = (tmp >> 16) & 0xFFFF;
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM == HW_PLATFORM_SILICON
							 | 
						||
| 
								 | 
							
								    /* recover right shift */
							 | 
						||
| 
								 | 
							
								    phy_gain_shift_set(0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* sound dump */
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_sound_snr_get( \
							 | 
						||
| 
								 | 
							
								    uint32_t start, \
							 | 
						||
| 
								 | 
							
								    uint32_t end, \
							 | 
						||
| 
								 | 
							
								    int32_t *buf, \
							 | 
						||
| 
								 | 
							
								    uint32_t dly_cnt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    int32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    int32_t snr = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t i = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tone_idx = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* det start and end tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(start,end);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* select dump mode */
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_mode_set(PHY_SNR_DUMP_SOUND_EST);
							 | 
						||
| 
								 | 
							
								    phy_snr_dump_en(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait until dump done */
							 | 
						||
| 
								 | 
							
								    while(!phy_snr_dump_wait_done())
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(tmp++ > dly_cnt) {
							 | 
						||
| 
								 | 
							
								            return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* cal snr for every tone */
							 | 
						||
| 
								 | 
							
								    for(tone_idx = start; tone_idx < end; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tmp = SOC_READ_REG(BB_SNR_BASEADDR + tone_idx*2);
							 | 
						||
| 
								 | 
							
								#if PHY_DBG_EN
							 | 
						||
| 
								 | 
							
								        iot_printf( \
							 | 
						||
| 
								 | 
							
								            "[tone id-%d] signal:%d, noise:%d\n"
							 | 
						||
| 
								 | 
							
								            "[tone id-%d] signal:%d, noise:%d\n", \
							 | 
						||
| 
								 | 
							
								            tone_idx, (tmp >> 8) & 0xff,(tmp >> 0) & 0xff, \
							 | 
						||
| 
								 | 
							
								            tone_idx+1, (tmp >> 24) & 0xff,(tmp >> 16) & 0xff);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								        snr = (int32_t)((( \
							 | 
						||
| 
								 | 
							
								            ((tmp >> 8) & 0xff) - ((tmp >> 0) & 0xff) \
							 | 
						||
| 
								 | 
							
								            ) * 3) >> 3);
							 | 
						||
| 
								 | 
							
								        buf[i++] = snr;
							 | 
						||
| 
								 | 
							
								        snr = (int32_t)((( \
							 | 
						||
| 
								 | 
							
								            ((tmp >> 24) & 0xff) - ((tmp >> 16) & 0xff) \
							 | 
						||
| 
								 | 
							
								            )*3) >> 3);
							 | 
						||
| 
								 | 
							
								        buf[i++] = snr;
							 | 
						||
| 
								 | 
							
								        tone_idx += 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)start;
							 | 
						||
| 
								 | 
							
								    (void)end;
							 | 
						||
| 
								 | 
							
								    (void)buf;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_noise_dump( \
							 | 
						||
| 
								 | 
							
								    uint32_t *buf_ptr, \
							 | 
						||
| 
								 | 
							
								    int8_t gain, \
							 | 
						||
| 
								 | 
							
								    uint8_t pkt_idx, \
							 | 
						||
| 
								 | 
							
								    uint8_t pkt_max)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* check pkt idx and max valid */
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(pkt_idx < pkt_max && pkt_max <= FFT_DUMP_PKT_MAX);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* first dump pkt */
							 | 
						||
| 
								 | 
							
								    if(pkt_idx == 0) {
							 | 
						||
| 
								 | 
							
								        /* save force value */
							 | 
						||
| 
								 | 
							
								        tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
							 | 
						||
| 
								 | 
							
								        g_phy_ctxt.dep.rx_phase_force_en = \
							 | 
						||
| 
								 | 
							
								            REG_FIELD_GET(CFG_PHY_RX_PHASE_SEL_FORCE_EN, tmp);
							 | 
						||
| 
								 | 
							
								        g_phy_ctxt.dep.rx_phase_force = \
							 | 
						||
| 
								 | 
							
								            REG_FIELD_GET(CFG_PHY_RX_PHASE_SEL, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* fix gain and disable agc */
							 | 
						||
| 
								 | 
							
								        phy_agc_gain_lvl_set(1,gain,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* enable rx all phase */
							 | 
						||
| 
								 | 
							
								        phy_rx_phase_force_set(true, PLC_PHASE_ALL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ret = phy_rx_noise_floor_get(0, TONE_MAX_NUM, g_nf_buf, PHY_DUMP_DLY_CNT, PHY_SNR_DUMP_NF);
							 | 
						||
| 
								 | 
							
								        /* disable fix gain */
							 | 
						||
| 
								 | 
							
								        phy_agc_gain_lvl_set(0,60,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(ret != ERR_OK) {
							 | 
						||
| 
								 | 
							
								            iot_printf("file=%s,func=%s,line=%d fail!\n", \
							 | 
						||
| 
								 | 
							
								                __FILE__, __FUNCTION__, __LINE__);
							 | 
						||
| 
								 | 
							
								            return ret;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								        enable_sw_access_csi_buf(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* memcpy data from csi buf to buf */
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(buf_ptr, \
							 | 
						||
| 
								 | 
							
								        g_nf_buf + pkt_idx * (IOT_PHY_CSI_BUF_LEN >> 2), \
							 | 
						||
| 
								 | 
							
								        IOT_PHY_CSI_BUF_LEN);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* last dump pkt */
							 | 
						||
| 
								 | 
							
								    if(pkt_idx == (pkt_max - 1)) {
							 | 
						||
| 
								 | 
							
								        /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								        enable_sw_access_csi_buf(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* recover force */
							 | 
						||
| 
								 | 
							
								        phy_rx_phase_force_set( \
							 | 
						||
| 
								 | 
							
								            g_phy_ctxt.dep.rx_phase_force_en, \
							 | 
						||
| 
								 | 
							
								            g_phy_ctxt.dep.rx_phase_force);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)buf_ptr;
							 | 
						||
| 
								 | 
							
								    (void)gain;
							 | 
						||
| 
								 | 
							
								    (void)pkt_idx;
							 | 
						||
| 
								 | 
							
								    (void)pkt_max;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_fft_dump_prepare()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t fft_loop = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* config det tone */
							 | 
						||
| 
								 | 
							
								    phy_rxfd_rate0_det(0, TOTAL_TONE_MASK_NUM - 4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tone disable  */
							 | 
						||
| 
								 | 
							
								    phy_dfe_tone_cfg(0,0,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* force inte rx state */
							 | 
						||
| 
								 | 
							
								    phy_txrx_ovr_set(1,1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* disable packet detect timeout */
							 | 
						||
| 
								 | 
							
								    phy_pkt_time_out_disable(true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* 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 adj req and sat */
							 | 
						||
| 
								 | 
							
								    phy_agc_sat_adj_set(1,1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_LOOPBACK_EN, tmp, 1);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* en adc and rx, disable dac and tx */
							 | 
						||
| 
								 | 
							
								    phy_ana_tx_en(false);
							 | 
						||
| 
								 | 
							
								    phy_ana_rx_en(true);
							 | 
						||
| 
								 | 
							
								    phy_ana_enlic_en(PHY_ENLIC_TXRX_RX);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* trig fft */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_LOOP_FFT_CYCLE, tmp, fft_loop);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_LOOP_FFT_START, tmp, 1);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_increase_tgt_pwr(uint32_t spur_exist)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)spur_exist;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |