706 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			706 lines
		
	
	
		
			19 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 "hw_reg_api.h"
 | 
						|
#include "hw_phy_api.h"
 | 
						|
#include "iot_errno_api.h"
 | 
						|
#include "mac_sys_reg.h"
 | 
						|
#include "phy_dfe_reg.h"
 | 
						|
#include "iot_io.h"
 | 
						|
#include "hw_tonemask.h"
 | 
						|
#include "phy_rxtd_reg.h"
 | 
						|
#include "phy_txrx_pwr.h"
 | 
						|
#include "phy_rx_fd_reg.h"
 | 
						|
#include "phy_tx_reg.h"
 | 
						|
#include "iot_utils_api.h"
 | 
						|
#include "iot_share_task.h"
 | 
						|
#include "plc_mpdu_header.h"
 | 
						|
#include "iot_module_api.h"
 | 
						|
#include "iot_pkt_api.h"
 | 
						|
#include "phy_data_ckb.h"
 | 
						|
#include "phy_reg.h"
 | 
						|
#include "phy_ana.h"
 | 
						|
#include "plc_protocol.h"
 | 
						|
#include "granite_reg.h"
 | 
						|
#include "ahb.h"
 | 
						|
#include "plc_cert_test.h"
 | 
						|
#include "iot_gpio_api.h"
 | 
						|
#include "iot_board_api.h"
 | 
						|
#include "iot_config.h"
 | 
						|
#include "phy_chn.h"
 | 
						|
#include "plc_const.h"
 | 
						|
#include "iot_system.h"
 | 
						|
#include "phy_perf.h"
 | 
						|
#include "math.h"
 | 
						|
#include "phy_dump.h"
 | 
						|
#include "phy_bbai_calu.h"
 | 
						|
#include "phy_math_tb.h"
 | 
						|
#include "phy_nf.h"
 | 
						|
#include "mp_mode.h"
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
#include "phy_tools.h"
 | 
						|
#include "phy_ada_dump.h"
 | 
						|
#endif
 | 
						|
#include "iot_oem_api.h"
 | 
						|
#include "os_utils_api.h"
 | 
						|
#include "clk.h"
 | 
						|
 | 
						|
/* global callback function */
 | 
						|
phy_ctxt_t g_phy_ctxt = {0};
 | 
						|
 | 
						|
/* callback for phy call mac bbai */
 | 
						|
phy_call_mac_func_cb_t phy_call_mac_bbai_cb = NULL;
 | 
						|
/* callback for phy get cert mode */
 | 
						|
phy_get_cert_mode_cb_t phy_get_cert_mode_cb = NULL;
 | 
						|
 | 
						|
void register_phy_call_mac_bbai_cb(phy_call_mac_func_cb_t cb)
 | 
						|
{
 | 
						|
    phy_call_mac_bbai_cb = cb;
 | 
						|
}
 | 
						|
 | 
						|
void register_phy_get_cert_mode_cb(phy_get_cert_mode_cb_t cb)
 | 
						|
{
 | 
						|
    phy_get_cert_mode_cb = cb;
 | 
						|
}
 | 
						|
 | 
						|
void iot_phy_use_mac_func_to_est_chl(uint32_t time_ms)
 | 
						|
{
 | 
						|
    if (phy_call_mac_bbai_cb == NULL) {
 | 
						|
        iot_printf("%s is not register\n!", __FUNCTION__);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    uint32_t ret = phy_call_mac_bbai_cb(time_ms);
 | 
						|
    if (ret) {
 | 
						|
        iot_printf("phy use mac api check spur fail:%d\n!", ret);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_get_cert_mode()
 | 
						|
{
 | 
						|
    if (phy_get_cert_mode_cb) {
 | 
						|
        return phy_get_cert_mode_cb();
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void phy_channel_est_request(void)
 | 
						|
{
 | 
						|
    uint32_t time_ms = PHY_CHN_EST_NF_UPDATE_PERIOD_MS +
 | 
						|
        phy_chn_est_ai_period_ms_get() * PHY_CHN_EST_AI_CERT_RTY_CNT;
 | 
						|
    iot_phy_use_mac_func_to_est_chl(time_ms);
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_cert_is_hw_agc()
 | 
						|
{
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_get_fw_mode(void)
 | 
						|
{
 | 
						|
    uint32_t ret;
 | 
						|
#if ((IOT_MP_TX_MODE_ENABLE == 1) \
 | 
						|
        || (IOT_PT_BOARD_SELECT == 1) \
 | 
						|
        || (IOT_MP_RX_MODE_ENABLE == 1) \
 | 
						|
        || (IOT_MP_MODE_DIRECT_ENABLE == 1))
 | 
						|
    ret = MP_MODE;
 | 
						|
#else
 | 
						|
    ret = g_fw_mode;
 | 
						|
#endif
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
/* channel pre-detect */
 | 
						|
void phy_chn_est_pre_detect(void)
 | 
						|
{
 | 
						|
    int8_t current_gain = 0;
 | 
						|
 | 
						|
#if HW_PLATFORM == HW_PLATFORM_SILICON
 | 
						|
    /* CPU switch to 25M */
 | 
						|
    clk_core_freq_slip_25m_set();
 | 
						|
#endif
 | 
						|
 | 
						|
    /* force enter rx state */
 | 
						|
    phy_txrx_ovr_set(1,1);
 | 
						|
 | 
						|
    /* get rx gain before close swagc */
 | 
						|
    current_gain = phy_rxtd_gain_get();
 | 
						|
 | 
						|
    /* clear shift en */
 | 
						|
    PHY_RXTD_WRITE_REG(CFG_BB_RXTD_SPARE2_ADDR, 0);
 | 
						|
 | 
						|
    /* not fix gain*/
 | 
						|
    phy_agc_gain_lvl_set(0,60,-24,0);
 | 
						|
 | 
						|
    /* enable power satuation and hw adjust gain req*/
 | 
						|
    phy_agc_sat_adj_set(0, 0);
 | 
						|
 | 
						|
    /* bb nf update */
 | 
						|
    phy_chn_nf_update(1);
 | 
						|
 | 
						|
    /* clear shift */
 | 
						|
    phy_gain_shift_set(0,0,0,0);
 | 
						|
 | 
						|
#if HW_PLATFORM == HW_PLATFORM_SILICON
 | 
						|
    /* CPU switch to 150M */
 | 
						|
    clk_core_freq_slip_150m_set();
 | 
						|
#endif
 | 
						|
 | 
						|
    /* bb nf update again */
 | 
						|
    if (!phy_spike_shift_en_get())
 | 
						|
        phy_chn_nf_update(0);
 | 
						|
 | 
						|
    /* cal nf on 3phase */
 | 
						|
    phy_cal_nf_on_3phase();
 | 
						|
 | 
						|
    /* notch filter and gain tbl init */
 | 
						|
    phy_perf_common_init();
 | 
						|
 | 
						|
    /* delay for boot-hang  */
 | 
						|
    os_delay(CHIP_HANG_DELAY);
 | 
						|
 | 
						|
#if PHY_BB_AI_WITH_PULSE_CHECK_EN
 | 
						|
    /* bb ai */
 | 
						|
    phy_chn_est_ai(current_gain, \
 | 
						|
        PHY_CHN_EST_AI_RTY_CNT, PHY_CHN_EST_AI_TIMEOUT);
 | 
						|
 | 
						|
    /* spike check */
 | 
						|
    phy_chn_spike_check();
 | 
						|
 | 
						|
    /* init pulse config */
 | 
						|
    phy_chan_est_flag_clear();
 | 
						|
    phy_anti_pulse_set_clr();
 | 
						|
 | 
						|
    /* check cnt */
 | 
						|
    uint32_t scan_cnt = PHY_CHN_EST_PRE_DET_CNT;
 | 
						|
    while(scan_cnt--)
 | 
						|
    {
 | 
						|
        /* channel estimate start */
 | 
						|
        phy_chn_est_cb( \
 | 
						|
            g_phy_ctxt.dep.band_id, \
 | 
						|
            &g_phy_ctxt.indep.chn_est
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /* clear flag for next check when receive bcn */
 | 
						|
    phy_chan_est_flag_clear();
 | 
						|
#else
 | 
						|
    if(g_phy_ctxt.indep.work_mode == PHY_MODE_NORMAL) {
 | 
						|
        /* bb ai */
 | 
						|
#if HW_PLATFORM == HW_PLATFORM_SILICON
 | 
						|
        phy_anti_spur_set_clr();
 | 
						|
        /* currently FPGA can't simu this behavior */
 | 
						|
        phy_chn_est_ai(current_gain, \
 | 
						|
            PHY_CHN_EST_AI_RTY_CNT, PHY_CHN_EST_AI_TIMEOUT);
 | 
						|
#else
 | 
						|
        (void)current_gain;
 | 
						|
#endif
 | 
						|
 | 
						|
        /* spike check */
 | 
						|
        phy_chn_spike_check();
 | 
						|
    } else if(g_phy_ctxt.indep.work_mode == PHY_MODE_TEST) {
 | 
						|
        /* init flag and spur/pulse config */
 | 
						|
        phy_chan_est_flag_clear();
 | 
						|
        phy_anti_spur_set_clr();
 | 
						|
        phy_anti_pulse_set_clr();
 | 
						|
 | 
						|
        /* check cnt */
 | 
						|
        uint32_t scan_cnt = PHY_CHN_EST_PRE_DET_CNT;
 | 
						|
        while(scan_cnt--)
 | 
						|
        {
 | 
						|
            /* channel estimate start */
 | 
						|
            phy_chn_est_cb( \
 | 
						|
                g_phy_ctxt.indep.chn.band_id, \
 | 
						|
                &g_phy_ctxt.indep.chn_est
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        /* clear flag for next check when receive bcn */
 | 
						|
        phy_chan_est_flag_clear();
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    if(g_phy_cpu_share_ctxt.high_perf_en){
 | 
						|
        phy_high_perf_set(1);
 | 
						|
    }
 | 
						|
 | 
						|
#if (PHY_HIGH_PERF_EN == 1) || \
 | 
						|
    (PHY_CHIP_CERT_EN == 1)
 | 
						|
    phy_high_perf_set(1);
 | 
						|
#endif
 | 
						|
 | 
						|
#if PHY_CHIP_CERT_EN
 | 
						|
    /*always mask the spur for cert*/
 | 
						|
    if (g_phy_ctxt.dep.band_id == IOT_SUPPORT_TONE_100_230) {
 | 
						|
        /* mask 1M spur by notch filter */
 | 
						|
        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x8073);
 | 
						|
        /* 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 (g_phy_ctxt.dep.band_id == IOT_SUPPORT_TONE_32_120) {
 | 
						|
        /* mask 2M spur by notch filter */
 | 
						|
        phy_anf_option_set(PHY_ANF_MODE_FIX,1,1,0x81ca);
 | 
						|
        /* mask 5M spur by notch filter */
 | 
						|
        phy_anf_option_set(PHY_ANF_MODE_FIX,1,2,0x8b10);
 | 
						|
        /* mask 2M spur by spur mask, [-7,7] */
 | 
						|
        phy_spur_mask_set(82,15);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    /* release force */
 | 
						|
    phy_txrx_ovr_set(0,0);
 | 
						|
 | 
						|
    /* recover force phase */
 | 
						|
    /* disable irq */
 | 
						|
    os_disable_irq();
 | 
						|
    phy_set_rx_abort_rx_phase_force_from_isr(false,
 | 
						|
        g_phy_cpu_share_ctxt.rx_phase_force_en,
 | 
						|
        (uint8_t)g_phy_cpu_share_ctxt.rx_phase_force);
 | 
						|
    /* enable irq */
 | 
						|
    os_enable_irq();
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_chn_est_ai_by_time(uint32_t time_ms)
 | 
						|
{
 | 
						|
    uint32_t est_success_cnt = 0;
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    uint32_t est_rty_cnt = 0;
 | 
						|
    uint32_t band_id = phy_band_id_get();
 | 
						|
    int8_t current_gain = 0;
 | 
						|
 | 
						|
    /* force enter rx state */
 | 
						|
    phy_txrx_ovr_set(1,1);
 | 
						|
 | 
						|
    /* get rx gain before close swagc */
 | 
						|
    current_gain = phy_rxtd_gain_get();
 | 
						|
 | 
						|
    /* clear shift en */
 | 
						|
    PHY_RXTD_WRITE_REG(CFG_BB_RXTD_SPARE2_ADDR, 0);
 | 
						|
 | 
						|
    /* not fix gain*/
 | 
						|
    phy_agc_gain_lvl_set(0,60,-24,0);
 | 
						|
 | 
						|
    /* cal nf fast */
 | 
						|
    g_phy_ctxt.dep.cal_nf_fast_flag = 1;
 | 
						|
 | 
						|
#if PHY_HW_SPIKE_OPTIMIZATION
 | 
						|
    /* update nf */
 | 
						|
    phy_chn_nf_update(1);
 | 
						|
    if (!phy_spike_shift_en_get())
 | 
						|
        phy_chn_nf_update(0);
 | 
						|
#else
 | 
						|
    /* must wait for swagc one cycle done, then clr
 | 
						|
       reference config to avoid overwrite */
 | 
						|
    uint8_t tmp_nf = phy_rx_nf_by_rxtd_get(phy_agc_acc_dly_get());
 | 
						|
    if (tmp_nf != PHY_NF_RST_VAL) {
 | 
						|
        g_phy_cpu_share_ctxt.nf_192p = tmp_nf;
 | 
						|
    }
 | 
						|
 | 
						|
    /* updata current nf */
 | 
						|
    phy_updata_nf_of_bbai();
 | 
						|
#endif
 | 
						|
 | 
						|
    /* clear shift */
 | 
						|
    phy_gain_shift_set(0,0,0,0);
 | 
						|
 | 
						|
    /* notch filter and gain tbl init */
 | 
						|
    phy_perf_common_init();
 | 
						|
 | 
						|
    phy_anti_spur_set_clr();
 | 
						|
    /* clear to avoid mask over for time-varying spur */
 | 
						|
    phy_tone_mask_amp_phase_tab_load( \
 | 
						|
        &all_mask_amp_phase_table, \
 | 
						|
        phy_mask_id_get(), \
 | 
						|
        PHY_PROTO_TYPE_GET());
 | 
						|
 | 
						|
    /* init multiband special optimization */
 | 
						|
    if (band_id == IOT_SUPPORT_TONE_MULTI_BAND021) {
 | 
						|
        phy_multi_band_opt_ena(band_id);
 | 
						|
    }
 | 
						|
 | 
						|
#if PHY_HW_SPIKE_OPTIMIZATION
 | 
						|
    g_phy_ctxt.indep.sw_agc_force_off = 0;
 | 
						|
#else
 | 
						|
    /* just kl1 need check */
 | 
						|
    g_phy_ctxt.indep.sw_agc_force_off = (phy_get_cert_mode() > 0);
 | 
						|
#endif
 | 
						|
 | 
						|
    /*clear spur/spike flag */
 | 
						|
    g_phy_cpu_share_ctxt.spur_exist = 0;
 | 
						|
    g_phy_cpu_share_ctxt.spike_exist = 0;
 | 
						|
 | 
						|
    /* get retry cnt */
 | 
						|
    est_rty_cnt = (time_ms - PHY_CHN_EST_NF_UPDATE_PERIOD_MS) / \
 | 
						|
        phy_chn_est_ai_period_ms_get();
 | 
						|
 | 
						|
    /* return successful cnt */
 | 
						|
    est_success_cnt = phy_chn_est_ai(current_gain, \
 | 
						|
        est_rty_cnt, \
 | 
						|
        time_ms - phy_chn_est_ai_period_ms_get());
 | 
						|
 | 
						|
    /* spike check */
 | 
						|
    if (!g_phy_ctxt.indep.sw_agc_force_off){
 | 
						|
        phy_chn_spike_check();
 | 
						|
    }
 | 
						|
 | 
						|
#if ((PHY_HIGH_PERF_EN == 1) || (PHY_CHIP_CERT_EN == 1))
 | 
						|
    if (!g_phy_ctxt.indep.sw_agc_force_off){
 | 
						|
        phy_high_perf_set(1);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    /* release force */
 | 
						|
    phy_txrx_ovr_set(0,0);
 | 
						|
 | 
						|
    /* recover force phase */
 | 
						|
    /* disable irq */
 | 
						|
    os_disable_irq();
 | 
						|
    phy_set_rx_abort_rx_phase_force_from_isr(false,
 | 
						|
        g_phy_cpu_share_ctxt.rx_phase_force_en,
 | 
						|
        g_phy_cpu_share_ctxt.rx_phase_force);
 | 
						|
    /* enable irq */
 | 
						|
    os_enable_irq();
 | 
						|
 | 
						|
    /* recover cal nf */
 | 
						|
    g_phy_ctxt.dep.cal_nf_fast_flag = 0;
 | 
						|
 | 
						|
    iot_printf("spur check success cnt:%d\n", est_success_cnt);
 | 
						|
#else
 | 
						|
    (void)time_ms;
 | 
						|
#endif
 | 
						|
    return est_success_cnt;
 | 
						|
}
 | 
						|
 | 
						|
static uint8_t phy_rx_get_nf_by_phase(uint8_t phase)
 | 
						|
{
 | 
						|
    uint8_t nf_phase;
 | 
						|
#if PLC_SUPPORT_3PHASE_NF
 | 
						|
    if (g_phy_cpu_share_ctxt.cal_3phase_nf_init) {
 | 
						|
        nf_phase = g_phy_cpu_share_ctxt.nf_phase[phase];
 | 
						|
    } else {
 | 
						|
        nf_phase = g_phy_ctxt.dep.nf;
 | 
						|
    }
 | 
						|
#else
 | 
						|
    (void)phase;
 | 
						|
    nf_phase = g_phy_ctxt.dep.nf;
 | 
						|
#endif
 | 
						|
    return nf_phase;
 | 
						|
}
 | 
						|
 | 
						|
int8_t phy_rx_snr_cal(void *phy_info, uint8_t rx_phase)
 | 
						|
{
 | 
						|
    /* fd snr */
 | 
						|
    int8_t fd_snr = 0;
 | 
						|
    int8_t td_snr = 0;
 | 
						|
    iot_phy_info_t *phy_ptr = (iot_phy_info_t *)phy_info;
 | 
						|
    uint8_t nf_phase = phy_rx_get_nf_by_phase(rx_phase);
 | 
						|
 | 
						|
    /* cal pkt rssi */
 | 
						|
    if(phy_ptr) {
 | 
						|
        /* cal fd snr */
 | 
						|
        fd_snr = (int8_t)PHY_SNR_LINEAR_CAL(phy_ptr->avg_snr);
 | 
						|
        /* get td snr */
 | 
						|
        if(phy_ptr->agc_tbl_entry >= PHY_AGC_NB_GAIN_ENTRY_START) {
 | 
						|
            td_snr = phy_ptr->adc_power -
 | 
						|
                (phy_ptr->agc_tbl_entry - PHY_AGC_NB_GAIN_ENTRY_START -
 | 
						|
                PHY_AGC_GAIN_ENTRY_OFFSET) - nf_phase - PHY_SNR_CAL_TH;
 | 
						|
#if PHY_DBG_EN
 | 
						|
            iot_printf("%d,%d,%d,%u,%d\n",
 | 
						|
                (int8_t)fd_snr,
 | 
						|
                phy_ptr->adc_power - (phy_ptr->agc_tbl_entry -
 | 
						|
                    PHY_AGC_NB_GAIN_ENTRY_START - PHY_AGC_GAIN_ENTRY_OFFSET),
 | 
						|
                phy_ptr->adc_power,
 | 
						|
                phy_ptr->agc_tbl_entry,
 | 
						|
                nf_phase);
 | 
						|
#endif
 | 
						|
        } else {
 | 
						|
            td_snr = phy_ptr->adc_power -
 | 
						|
                (phy_ptr->agc_tbl_entry - PHY_AGC_GAIN_ENTRY_OFFSET) -
 | 
						|
                nf_phase - PHY_SNR_CAL_TH;
 | 
						|
#if PHY_DBG_EN
 | 
						|
            iot_printf("%d,%d,%d,%u,%d\n",
 | 
						|
                (int8_t)fd_snr,
 | 
						|
                phy_ptr->adc_power - (phy_ptr->agc_tbl_entry -
 | 
						|
                    PHY_AGC_GAIN_ENTRY_OFFSET),
 | 
						|
                phy_ptr->adc_power,
 | 
						|
                phy_ptr->agc_tbl_entry,
 | 
						|
                nf_phase);
 | 
						|
#endif
 | 
						|
        }
 | 
						|
        uint32_t judge = 0;
 | 
						|
#if PHY_CAL_REASONABLE_SNR
 | 
						|
        /* kl2/3 use td snr */
 | 
						|
        judge = 1;
 | 
						|
#else
 | 
						|
        /* cal max */
 | 
						|
        if (fd_snr > td_snr) {
 | 
						|
            judge = 1;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
        if (judge) {
 | 
						|
            return fd_snr;
 | 
						|
        } else {
 | 
						|
            return td_snr;
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
#if PHY_DBG_EN
 | 
						|
        iot_printf("[PHY]snr cal fail, phy_info pointer is null!\n");
 | 
						|
#endif
 | 
						|
        return ~0;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
int8_t phy_snr_mapping_minus10_90(int8_t raw_snr)
 | 
						|
{
 | 
						|
    if(raw_snr > 90) {
 | 
						|
        /* clip >90 to 90dB */
 | 
						|
        return 90;
 | 
						|
    } else if(raw_snr < -10) {
 | 
						|
        /* clip < -10 to -10dB */
 | 
						|
        return -10;
 | 
						|
    } else {
 | 
						|
        return raw_snr;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void phy_dbg_sts_print()
 | 
						|
{
 | 
						|
    iot_phy_sts_info_t total_sts = {0};
 | 
						|
 | 
						|
    /* get rx and tx cnt and clr */
 | 
						|
    phy_sts_get(&total_sts);
 | 
						|
    iot_printf(\
 | 
						|
        "[phy][dbg]tx_ok:%d/4s\n"\
 | 
						|
        "[phy][dbg]reg_tx_abort_cnt:%d/4s\n"
 | 
						|
#if DEBUG_CANNOT_SENDOUT_PKT
 | 
						|
        "[phy][dbg]intr_tx_abort_cnt:%d\n"
 | 
						|
#endif
 | 
						|
        "[phy][dbg]fc_ok:%d/4s, fc_err:%d/4s, "\
 | 
						|
        "pld_ok:%d/4s, pld_fail:%d/4s, sync_ok:%d/4s\n", \
 | 
						|
        total_sts.mac_tx_ok_cnt, \
 | 
						|
        total_sts.mac_tx_abort_cnt,
 | 
						|
#if DEBUG_CANNOT_SENDOUT_PKT
 | 
						|
        g_phy_cpu_share_ctxt.phy_tx_abort_cnt,
 | 
						|
#endif
 | 
						|
        total_sts.fc_crc_ok_cnt, total_sts.fc_crc_fail_cnt, \
 | 
						|
        total_sts.pld_crc_ok_cnt, total_sts.pld_crc_fail_cnt, \
 | 
						|
        total_sts.sync_ok_cnt);
 | 
						|
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    /* sts print */
 | 
						|
    iot_printf(
 | 
						|
        "[phy][dbg]agc_bus:0x%x, td0:0x%x, td1:0x%x, td2:0x%x, tx3:0x%x, "\
 | 
						|
        "td_fsm:0x%x, fd_fsm:0x%x, force:0x%x\n", \
 | 
						|
        PHY_RXTD_READ_REG(CFG_AGC_DBG_BUS_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS0_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS1_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS2_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS3_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_FSM_DBG_BUS_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_FD_FSM_DBG_BUS_ADDR), \
 | 
						|
        PHY_DFE_READ_REG(CFG_BB_DFE_OPTION_0_ADDR));
 | 
						|
 | 
						|
    /* phy reg */
 | 
						|
    iot_printf(
 | 
						|
        "[phy][dbg]rxtd_bus0:0x%x, bus1:0x%x, bus2:0x%x, bus3:0x%x\n", \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS0_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS1_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS2_ADDR), \
 | 
						|
        PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS3_ADDR));
 | 
						|
    iot_printf(
 | 
						|
        "tx_td_bus:0x%x, tx_fd_fsm:0x%x, pld_fec:0x%x, fc_fec:0x%x, "\
 | 
						|
        "pre_bus:0x%x, agc_bus:0x%x\n", \
 | 
						|
        PHY_READ_REG(CFG_BB_TX_TD_DBG_BUS_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_TX_FD_FSM_DBG_BUS_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_PLD_FEC_DBG_BUS_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_FC_FEC_DBG_BUS_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_PRE_DBG_BUS_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_AGC_DBG_BUS_ADDR));
 | 
						|
    iot_printf(
 | 
						|
        "rtl_parse3:0x%x, rtl_parse2:0x%x, rtl_parse1:0x%x, rtl_parse0:0x%x\n", \
 | 
						|
        PHY_READ_REG(CFG_BB_RTL_PARSE_DBG_3_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RTL_PARSE_DBG_2_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RTL_PARSE_DBG_1_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RTL_PARSE_DBG_0_ADDR));
 | 
						|
    iot_printf(
 | 
						|
        "rx_fc0:0x%x, rx_fc1:0x%x, rx_fc2:0x%x, rx_fc3:0x%x\n", \
 | 
						|
        PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR));
 | 
						|
    iot_printf(
 | 
						|
        "raw_intc0:0x%x, intc1:0x%x, intc2:0x%x, intc3:0x%x\n", \
 | 
						|
        PHY_READ_REG(CFG_BB_INT_RAW_0_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_INT_RAW_1_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_INT_RAW_2_ADDR), \
 | 
						|
        PHY_READ_REG(CFG_BB_INT_RAW_3_ADDR));
 | 
						|
 | 
						|
    /* mac sts */
 | 
						|
    iot_printf(
 | 
						|
        "force0:0x%x, force1:0x%x, force2:0x%x intf0:0x%x, intf1:0x%x\n", \
 | 
						|
        RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR), \
 | 
						|
        RGF_MAC_READ_REG(CFG_PHY_FORCE_1_ADDR), \
 | 
						|
        RGF_MAC_READ_REG(CFG_PHY_FORCE_2_ADDR), \
 | 
						|
        RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_0_ADDR), \
 | 
						|
        RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_1_ADDR));
 | 
						|
 | 
						|
    /* analog sts */
 | 
						|
    phy_ana_dbg_print();
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_chn_nf_get(void)
 | 
						|
{
 | 
						|
    return g_phy_ctxt.dep.nf;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_chn_tx_power_get(void)
 | 
						|
{
 | 
						|
    return (uint8_t)g_phy_ctxt.dep.sw_set_pwr;
 | 
						|
}
 | 
						|
 | 
						|
bool_t phy_pkt_found_flag_get(void)
 | 
						|
{
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    if(g_phy_cpu_share_ctxt.pm_status.fc_ok_found) {
 | 
						|
        return true;
 | 
						|
    } else {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
#else
 | 
						|
    return true;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_pkt_found_flag_clr(void)
 | 
						|
{
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    g_phy_cpu_share_ctxt.pm_status.fc_ok_found = 0;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_get_band_filter_gpio()
 | 
						|
{
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    return iot_board_get_gpio(GPIO_BAND_FILTER);
 | 
						|
#else
 | 
						|
    return 0xff;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_cfg_band_filter_gpio(uint8_t protocol_band_id)
 | 
						|
{
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    uint8_t gpio_pin = phy_get_band_filter_gpio();
 | 
						|
    if (gpio_pin != 0xff) {
 | 
						|
        if (protocol_band_id == IOT_SUPPORT_TONE_80_490 || \
 | 
						|
            protocol_band_id == IOT_SUPPORT_TONE_100_230 ||\
 | 
						|
            protocol_band_id == IOT_SUPPORT_TONE_240_370) {
 | 
						|
            /* not keep 700K filter for power saving
 | 
						|
             * cur enable band filter, would increase power
 | 
						|
             */
 | 
						|
            iot_gpio_value_set((int)gpio_pin, 1);
 | 
						|
        } else {
 | 
						|
            iot_gpio_value_set((int)gpio_pin, 0);
 | 
						|
        }
 | 
						|
    }
 | 
						|
#else
 | 
						|
    (void)protocol_band_id;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_init_band_filter_gpio()
 | 
						|
{
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    uint8_t gpio_pin = phy_get_band_filter_gpio();
 | 
						|
    if (gpio_pin != 0xff) {
 | 
						|
        iot_gpio_open_as_output((int)gpio_pin);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_det_tone_ext_en_set(bool_t en)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.det_tone_extend_en = en;
 | 
						|
}
 | 
						|
 | 
						|
bool_t phy_det_tone_ext_en_get()
 | 
						|
{
 | 
						|
    return  (bool_t)(g_phy_ctxt.indep.det_tone_extend_en);
 | 
						|
}
 | 
						|
 | 
						|
void phy_rise_pwr_flag_set(bool_t en)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.chn.is_pwr_rise = en;
 | 
						|
}
 | 
						|
 | 
						|
phy_ctxt_t *phy_ctxt_get()
 | 
						|
{
 | 
						|
    /* plc phy ctxt */
 | 
						|
    return &g_phy_ctxt;
 | 
						|
}
 | 
						|
 | 
						|
void phy_updata_nf_of_bbai()
 | 
						|
{
 | 
						|
    if (g_phy_ctxt.dep.nf) {
 | 
						|
        g_phy_cpu_share_ctxt.nf_for_bbai =
 | 
						|
            g_phy_ctxt.dep.nf;
 | 
						|
    } else {
 | 
						|
        g_phy_cpu_share_ctxt.nf_for_bbai =
 | 
						|
            g_phy_cpu_share_ctxt.nf_768p;
 | 
						|
    }
 | 
						|
    iot_printf("updata bbai nf:%u\n", \
 | 
						|
        g_phy_cpu_share_ctxt.nf_for_bbai);
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_get_nf_of_bbai()
 | 
						|
{
 | 
						|
    return g_phy_cpu_share_ctxt.nf_for_bbai;
 | 
						|
}
 | 
						|
 | 
						|
void phy_cert_check_spike()
 | 
						|
{
 | 
						|
    extern uint8_t mac_get_cert_test_mode();
 | 
						|
    extern uint8_t mac_cert_get_spike_pd_detect_en();
 | 
						|
    uint8_t cert_mode = mac_get_cert_test_mode();
 | 
						|
    uint8_t cert_spike_detect_en = mac_cert_get_spike_pd_detect_en();
 | 
						|
    if (g_phy_ctxt.indep.work_mode == PHY_MODE_TEST &&
 | 
						|
        cert_mode == CERT_TEST_CMD_ENTER_PHY_T &&
 | 
						|
        cert_spike_detect_en &&
 | 
						|
        g_phy_ctxt.dep.nf != PHY_NF_RST_VAL && g_phy_ctxt.dep.nf >= 73) {
 | 
						|
        phy_spike_shift_en_set(1);
 | 
						|
        phy_chn_spike_check();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_is_sta_role()
 | 
						|
{
 | 
						|
    uint32_t client_mode;
 | 
						|
#if HW_PLATFORM == HW_PLATFORM_SIMU
 | 
						|
 | 
						|
    extern uint8_t ucIsClientMode;
 | 
						|
    client_mode = ucIsClientMode;
 | 
						|
 | 
						|
#else /* HW_PLATFORM == HW_PLATFORM_SIMU */
 | 
						|
 | 
						|
    extern uint32_t g_is_sta;
 | 
						|
    client_mode = (uint8_t)g_is_sta;
 | 
						|
 | 
						|
#endif /* HW_PLATFORM == HW_PLATFORM_SIMU */
 | 
						|
    return client_mode;
 | 
						|
}
 | 
						|
 |