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) */
|
||
|
|