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