265 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2024 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 "iot_errno_api.h"
 | 
						|
#include "iot_io.h"
 | 
						|
#include "iot_pkt_api.h"
 | 
						|
#include "iot_share_task.h"
 | 
						|
#include "os_mem_api.h"
 | 
						|
#include "os_timer_api.h"
 | 
						|
#include "os_utils_api.h"
 | 
						|
#include "phy_ana.h"
 | 
						|
#include "phy_bb.h"
 | 
						|
#include "phy_data_ckb.h"
 | 
						|
#include "phy_phase.h"
 | 
						|
 | 
						|
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
 | 
						|
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
#include "phy_ada_dump.h"
 | 
						|
#include "phy_perf.h"
 | 
						|
#include "phy_tools.h"
 | 
						|
#include "phy_ana.h"
 | 
						|
#if HPLC_RF_DEV_SUPPORT
 | 
						|
#include "bb_rf_cfg.h"
 | 
						|
#include "mac_rf.h"
 | 
						|
#include "phy_rf_init.h"
 | 
						|
#include "rf_phy_rx.h"
 | 
						|
#include "rf_phy_tx.h"
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define PHY_GAIN_CFG_AUTO                   (0x7F)
 | 
						|
 | 
						|
static iot_phy_chn_dump_cb g_phy_chn_rx_dump_cb;
 | 
						|
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
 | 
						|
static uint32_t iot_phy_dump_handle(uint32_t size, int8_t gain,
 | 
						|
    ADC_DUMP_MODE mode, iot_phy_chn_dump_rt_speed_t speed,
 | 
						|
    phy_trig_dump_cond *trig_dump)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
    uint32_t trig_offset = 0;
 | 
						|
    int8_t curr_gain = 0;
 | 
						|
    uint32_t adc_buf_addr, buf_len;
 | 
						|
    iot_phy_chn_dump_report_t dump_report = { 0 };
 | 
						|
 | 
						|
    /* check dump busy flag */
 | 
						|
    if (phy_busy_get(&g_phy_ctxt, PHY_BUSY_DUMP)) {
 | 
						|
        dump_report.params.dump_rst = ERR_BUSY;
 | 
						|
        g_phy_chn_rx_dump_cb(0, 0, 0, &dump_report);
 | 
						|
        return ERR_BUSY;
 | 
						|
    } else {
 | 
						|
        phy_dump_busy_set(true);
 | 
						|
    }
 | 
						|
 | 
						|
    /* check not empty */
 | 
						|
    IOT_ASSERT(g_phy_chn_rx_dump_cb != NULL);
 | 
						|
 | 
						|
    /* force enter rx state */
 | 
						|
    phy_txrx_ovr_set(1, 1);
 | 
						|
    /* phy reset*/
 | 
						|
    phy_reset(PHY_RST_REASON_WARM);
 | 
						|
    /* ada soft reset */
 | 
						|
    warm_rst_ada();
 | 
						|
    /* notch filter bypass */
 | 
						|
    phy_anf_option_set(PHY_ANF_MODE_BYPASS, 0, 0, 0);
 | 
						|
    phy_fnf_option_set(PHY_FNF_MODE_BYPASS, 0, 0);
 | 
						|
 | 
						|
    /* reset spike cancel and filter */
 | 
						|
    phy_spike_check_set(0xFF, 0, 3);
 | 
						|
    phy_impuse_cancel_set(0, 6, 14);
 | 
						|
    phy_hpf_set(1, 230);
 | 
						|
    phy_ana_rx_fe_selc_hpf(3);
 | 
						|
    phy_ana_rx_fe_selc_pgf_bq(115);
 | 
						|
 | 
						|
    /* fix gain or auto gain */
 | 
						|
    if (gain == PHY_GAIN_CFG_AUTO) {
 | 
						|
        /* enable power satuation and hw adjust gain req */
 | 
						|
        phy_agc_sat_adj_set(0, 0);
 | 
						|
        phy_agc_seg_num_set(1);
 | 
						|
        phy_agc_sat_jug_cnt_set(32);
 | 
						|
        /* not fix gain*/
 | 
						|
        phy_agc_gain_lvl_set(0, 60, -24, 0);
 | 
						|
        /* get current gain */
 | 
						|
        os_delay(5);
 | 
						|
        /* get current gain */
 | 
						|
        curr_gain = phy_gain_get_from_agc() - 3;
 | 
						|
    } else {
 | 
						|
        curr_gain = gain;
 | 
						|
    }
 | 
						|
    /* fix gain and disable agc */
 | 
						|
    phy_agc_gain_lvl_set(1, curr_gain, -24, 0);
 | 
						|
 | 
						|
    buf_len = phy_ada_dump_addr_get(&adc_buf_addr);
 | 
						|
    if (size > (buf_len >> 1)) {
 | 
						|
        size = (buf_len >> 1);
 | 
						|
    }
 | 
						|
 | 
						|
    /* start force dump, word for register, 2 byte each point */
 | 
						|
    ret = phy_dump_from_ada(size >> 1, size >> 1, 0, ADC_DUMP_MODE_FORCE,
 | 
						|
        PHY_PHASE_OVR_A, &trig_offset, (uint8_t *)adc_buf_addr, speed,
 | 
						|
        trig_dump);
 | 
						|
 | 
						|
    /* call cb api if dump success */
 | 
						|
    if (ret == ERR_OK) {
 | 
						|
        dump_report.params.trig_offset = trig_offset;
 | 
						|
        g_phy_chn_rx_dump_cb((uint8_t *)adc_buf_addr,
 | 
						|
            size << 1, curr_gain, &dump_report);
 | 
						|
    } else {
 | 
						|
        dump_report.params.dump_rst = ERR_FAIL;
 | 
						|
        g_phy_chn_rx_dump_cb(0, 0, 0, &dump_report);
 | 
						|
    }
 | 
						|
 | 
						|
    /* clr dump flag */
 | 
						|
    phy_dump_busy_set(false);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_phy_dump_force_cb(iot_phy_chn_dump_rt_param_t *force_dump)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
    ret = iot_phy_dump_handle(force_dump->size, force_dump->gain,
 | 
						|
        ADC_DUMP_MODE_FORCE, ADC_DUMP_SPEED_SUPPORT, NULL);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_phy_dump_auto_cb(iot_phy_chn_dump_trig_thd_param_t *trig_thd)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
    phy_trig_dump_cond trig_dump = { 0 };
 | 
						|
 | 
						|
    /* ADC threshhold conf */
 | 
						|
    trig_dump.thd = trig_thd->thd;
 | 
						|
 | 
						|
    ret = iot_phy_dump_handle(trig_thd->trig_common.buf_size,
 | 
						|
        trig_thd->trig_common.gain, ADC_DUMP_MODE_AUTO,
 | 
						|
        trig_thd->trig_common.speed, &trig_dump);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t iot_phy_dump_trig_phy_cb(iot_phy_chn_dump_trig_phy_param_t *trig_phy)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
    phy_trig_dump_cond trig_dump = { 0 };
 | 
						|
 | 
						|
    /* trig param */
 | 
						|
    trig_dump.trig_id = trig_phy->trig_id;
 | 
						|
 | 
						|
    ret = iot_phy_dump_handle(trig_phy->trig_common.buf_size,
 | 
						|
        trig_phy->trig_common.gain, ADC_DUMP_MODE_PHY,
 | 
						|
        trig_phy->trig_common.speed, &trig_dump);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
static uint32_t iot_phy_rf_rx_dump_cb(iot_phy_chn_dump_rf_param_t *rf_dump)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
#if HPLC_RF_DEV_SUPPORT
 | 
						|
    int8_t curr_gain = 0;
 | 
						|
    uint32_t adc_buf_addr, buf_len;
 | 
						|
    uint8_t option = mac_rf_get_self_option();
 | 
						|
    iot_phy_chn_dump_report_t dump_report = { 0 };
 | 
						|
 | 
						|
    /* check dump busy flag */
 | 
						|
    if (phy_busy_get(&g_phy_ctxt, PHY_BUSY_DUMP)) {
 | 
						|
        dump_report.params.dump_rst = ERR_BUSY;
 | 
						|
        g_phy_chn_rx_dump_cb(0, 0, 0, &dump_report);
 | 
						|
        return ERR_BUSY;
 | 
						|
    } else {
 | 
						|
        phy_dump_busy_set(true);
 | 
						|
    }
 | 
						|
 | 
						|
    /* check not empty */
 | 
						|
    IOT_ASSERT(g_phy_chn_rx_dump_cb != NULL);
 | 
						|
 | 
						|
    /* phy tx common init interface */
 | 
						|
    rf_phy_tx_init(phy_rf_get_band_sel() , option);
 | 
						|
    bb_rf_rx_cfg(option, rf_dump->lo_freq);
 | 
						|
    if (rf_dump->rx_filter != 0) {
 | 
						|
        bb_rf_set_filter(rf_dump->rx_filter);
 | 
						|
    }
 | 
						|
 | 
						|
    /* fix gain or auto gain */
 | 
						|
    if (rf_dump->gain == 0) {
 | 
						|
        /* get current gain */
 | 
						|
        curr_gain = bb_rf_get_cur_gain();
 | 
						|
    } else {
 | 
						|
        /* fix gain and disable agc */
 | 
						|
        curr_gain = (int8_t)(rf_dump->gain);
 | 
						|
    }
 | 
						|
    curr_gain = rf_phy_rx_gain_lock(curr_gain - 13);
 | 
						|
    bb_rf_debug_rx_immd();
 | 
						|
 | 
						|
    buf_len = phy_ada_dump_addr_get(&adc_buf_addr);
 | 
						|
    if (rf_dump->size > (buf_len >> 2)) {
 | 
						|
        rf_dump->size = (buf_len >> 2);
 | 
						|
    }
 | 
						|
    buf_len = rf_dump->size << 2;
 | 
						|
 | 
						|
    rf_phy_ada_dump_entry(adc_buf_addr, buf_len);
 | 
						|
 | 
						|
    /* call cb api */
 | 
						|
    dump_report.params.trig_offset = 0;
 | 
						|
    g_phy_chn_rx_dump_cb((uint8_t *)adc_buf_addr, rf_dump->size << 1, curr_gain,
 | 
						|
        &dump_report);
 | 
						|
 | 
						|
#else /* HPLC_RF_DEV_SUPPORT */
 | 
						|
    (void)rf_dump;
 | 
						|
#endif /* HPLC_RF_DEV_SUPPORT */
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* HW_PLATFORM >= HW_PLATFORM_FPGA */
 | 
						|
 | 
						|
uint32_t iot_phy_chn_dump_start(iot_phy_chn_dump_rt_cfg_t *dump_cfg)
 | 
						|
{
 | 
						|
    uint32_t ret = ERR_FAIL;
 | 
						|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
 | 
						|
    switch (dump_cfg->dump_typ) {
 | 
						|
    case IOT_PHY_CHN_DUMP_NOISE:
 | 
						|
        iot_phy_dump_force_cb(&dump_cfg->param.force_dump);
 | 
						|
        break;
 | 
						|
    case IOT_PHY_CHN_DUMP_TRIG_THD:
 | 
						|
        iot_phy_dump_auto_cb(&dump_cfg->param.trig_thd);
 | 
						|
        break;
 | 
						|
    case IOT_PHY_CHN_DUMP_TRIG_FC:
 | 
						|
        iot_phy_dump_trig_phy_cb(&dump_cfg->param.trig_phy);
 | 
						|
        break;
 | 
						|
    case IOT_PHY_CHN_DUMP_RF:
 | 
						|
        iot_phy_rf_rx_dump_cb(&dump_cfg->param.rf_dump);
 | 
						|
        break;
 | 
						|
    default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
#else
 | 
						|
    (void)dump_cfg;
 | 
						|
#endif
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
void iot_phy_chn_dump_cb_register(iot_phy_chn_dump_cb cb)
 | 
						|
{
 | 
						|
    g_phy_chn_rx_dump_cb = cb;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA) */
 | 
						|
 |