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