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