217 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			217 lines
		
	
	
		
			10 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. | ||
|  |  * | ||
|  |  * ****************************************************************************/ | ||
|  | 
 | ||
|  | /* os shim includes */ | ||
|  | #include "os_types.h"
 | ||
|  | #include "os_task.h"
 | ||
|  | #include "os_utils.h"
 | ||
|  | #include "os_task_api.h"
 | ||
|  | 
 | ||
|  | /* common includes */ | ||
|  | #include "iot_io.h"
 | ||
|  | #include "iot_errno_api.h"
 | ||
|  | #include "iot_module.h"
 | ||
|  | #include "apb_glb_reg.h"
 | ||
|  | #include "ahb_rf.h"
 | ||
|  | #include "phy_ana_glb.h"
 | ||
|  | #include "phy_dfe_reg.h"
 | ||
|  | #include "phy_rxtd_reg.h"
 | ||
|  | #include "phy_reg.h"
 | ||
|  | #include "phy_bb.h"
 | ||
|  | #include "hw_reg_api.h"
 | ||
|  | #include "granite_reg.h"
 | ||
|  | #include "sadc.h"
 | ||
|  | #include "sadc0_reg.h"
 | ||
|  | 
 | ||
|  | #include "adc.h"
 | ||
|  | #include "mac_sys_reg.h"
 | ||
|  | #include "sadc_t.h"
 | ||
|  | #include "phy_ana.h"
 | ||
|  | #include "ana_pmu_wrap_rf.h"
 | ||
|  | 
 | ||
|  | void sadc_reg_dump() | ||
|  | { | ||
|  |     iot_printf("dump sadc register:\n"); | ||
|  |     iot_printf("CFG_SADC0_CHN_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_CHN_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_CHN_MUX_SEL_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_CHN_MUX_SEL_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_CHN_SAMPLE_TIME_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_CHN_SAMPLE_TIME_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_CHN_FILTER_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_CHN_FILTER_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE0_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE0_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE1_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE1_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE2_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE2_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE3_0_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE3_0_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE3_1_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE3_1_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE3_2_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE3_2_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE3_3_THRS_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE3_3_THRS_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR_SEL_MUX_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_MTR_SEL_MUX_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_VCM_CH1_SEL_MUX_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_VCM_CH1_SEL_MUX_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_RST_CH1_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_RST_CH1_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_IFRED_CH1_EN_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_IFRED_CH1_EN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR2PAD_EN_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_MTR2PAD_EN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR2PAD_EN_NEG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_MTR2PAD_EN_NEG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR3PAD_EN_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_MTR3PAD_EN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_ATB2PAD_EN_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_ATB2PAD_EN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_SCLR_CTRL_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_SCLR_CTRL_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_SUB_DC_THRS_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_SUB_DC_THRS_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_DBG_BUS0_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_DBG_BUS0_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_SUB_DC_THRS_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_SUB_DC_THRS_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_TSW_SENS_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_TSW_SENS_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_TSW_PD_PGA_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_TSW_PD_PGA_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_TSW_METER_PGA_GAIN_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_TSW_METER_PGA_GAIN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_INT_RAW_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_INT_RAW_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_INT_ST_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_INT_ST_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_INT_ENA_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_INT_ENA_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE_EXTHRS_SEL_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE_EXTHRS_SEL_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_PHASE_DMA_OUT_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_PHASE_DMA_OUT_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_CHN_CFG1_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_CHN_CFG1_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_DBG_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC0_DBG_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC_COMMON_CFG_ADDR: 0x%x\n", SADC0_READ_REG(CFG_SADC_COMMON_CFG_ADDR)); | ||
|  |     iot_printf("******************************\n"); | ||
|  |     iot_printf("CFG_SADC0_CHN_MUX_SEL_CFG_ADDR 0x%x: 0x%x\n",CFG_SADC0_CHN_MUX_SEL_CFG_ADDR, SADC0_READ_REG(CFG_SADC0_CHN_MUX_SEL_CFG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR2PAD_EN_NEG_ADDR 0x%x: 0x%x\n",CFG_SADC0_MTR2PAD_EN_NEG_ADDR,SADC0_READ_REG(CFG_SADC0_MTR2PAD_EN_NEG_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_MTR3PAD_EN_ADDR 0x%x: 0x%x\n",CFG_SADC0_MTR3PAD_EN_ADDR,SADC0_READ_REG(CFG_SADC0_MTR3PAD_EN_ADDR)); | ||
|  |     iot_printf("CFG_SADC0_TSW_PD_PGA_ADDR 0x%x: 0x%x\n",CFG_SADC0_TSW_PD_PGA_ADDR,SADC0_READ_REG(CFG_SADC0_TSW_PD_PGA_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG2_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG2_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG2_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG3_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG3_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG3_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG8_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG8_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG8_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG6_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG6_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG6_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG5_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG5_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG5_ADDR)); | ||
|  |     iot_printf("CFG_ANA_PMU_REG_CFG10_ADDR 0x%x: 0x%x\n",CFG_ANA_PMU_REG_CFG10_ADDR,ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG10_ADDR)); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void sadc_ana_pmu_set(sada_test_mode_t sada_test_mode) | ||
|  | { | ||
|  |     uint32_t tmp = 0; | ||
|  | 
 | ||
|  |     /* ana pmu 0xc */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG3_ADDR); | ||
|  |     REG_FIELD_SET(METER_ADC_PD_CH1, tmp, 0); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG3_ADDR, tmp); | ||
|  |     /* vcm pad 0x8 */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG2_ADDR); | ||
|  |     REG_FIELD_SET(GPIO_REFCM_DIGEN, tmp, 0); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG2_ADDR, tmp); | ||
|  |     /* ref vcm chopper on 0x18 */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG6_ADDR); | ||
|  |     REG_FIELD_SET(METER_BG_PD_CLK, tmp, 0); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG6_ADDR, tmp); | ||
|  |     /* meter gpio dig en */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG2_ADDR); | ||
|  |     REG_FIELD_SET(GPIO_M_DIGEN, tmp, 0x000); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG2_ADDR, tmp); | ||
|  | 
 | ||
|  |     /* CP meter 0x14 */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG5_ADDR); | ||
|  |     REG_FIELD_SET(METER_BG_BYP_R, tmp, 0x1); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG5_ADDR, tmp); | ||
|  |     /* ch0 chopper 0x20 */ | ||
|  |     tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG8_ADDR); | ||
|  |     REG_FIELD_SET(TSW_FCHP_BYPS_CH1, tmp, 0x0); | ||
|  |     ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG8_ADDR, tmp); | ||
|  |     if (sada_test_mode != CP) { | ||
|  |         /* ch0 chopper 0x20 */ | ||
|  |         tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG8_ADDR); | ||
|  |         REG_FIELD_SET(TSW_IC2PAD_EN, tmp, 0x1); | ||
|  |         ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG8_ADDR, tmp); | ||
|  | 
 | ||
|  |         /* ch0 chopper 0x28 */ | ||
|  |         tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG10_ADDR); | ||
|  |         REG_FIELD_SET(ICPTAT_CAL_EN, tmp, 0x1); | ||
|  |         ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG10_ADDR, tmp); | ||
|  |     } else { | ||
|  |         /* ch0 chopper 0x20 */ | ||
|  |         tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG8_ADDR); | ||
|  |         REG_FIELD_SET(TSW_IC2PAD_EN, tmp, 0x0); | ||
|  |         ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG8_ADDR, tmp); | ||
|  | 
 | ||
|  |         /* ch0 chopper 0x28 */ | ||
|  |         tmp = ANA_PMU_WRAP_RF_READ_REG(CFG_ANA_PMU_REG_CFG10_ADDR); | ||
|  |         REG_FIELD_SET(ICPTAT_CAL_EN, tmp, 0x0); | ||
|  |         ANA_PMU_WRAP_RF_WRITE_REG(CFG_ANA_PMU_REG_CFG10_ADDR, tmp); | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | int32_t sadc_ref_voltg_test(uint8_t phase_num, uint8_t sel_scl,sada_test_mode_t sada_test_mode) | ||
|  | { | ||
|  |     uint8_t timeout = 0; | ||
|  |     uint32_t sample_data = 0; | ||
|  |     int32_t sum_data_tmp = 0; | ||
|  |     int32_t sum_data = 0; | ||
|  |     int32_t sample_tmp = 0; | ||
|  | 
 | ||
|  |     /* adc init */ | ||
|  |     sadc_init(ANA_SADC0, NULL); | ||
|  | 
 | ||
|  |     sadc_ana_pmu_set(sada_test_mode); | ||
|  | 
 | ||
|  |     /* 1 phase mode */ | ||
|  |     sadc_phase_mode_set(ANA_SADC0, 0); | ||
|  |     sadc_phase_sel(ANA_SADC0, phase_num); | ||
|  | 
 | ||
|  |     /* mtr sel scl from Meter */ | ||
|  |     sadc_mtr_sel_scl_mux(phase_num, 0x0); | ||
|  | 
 | ||
|  |     sadc_mtr3pad_en(phase_num, 1); | ||
|  |     if (sada_test_mode == CP) { | ||
|  |         sadc_mtr2pad_en_neg(phase_num, 1); | ||
|  |     } else { | ||
|  |         sadc_mtr2pad_en_neg(phase_num, 0); | ||
|  |     } | ||
|  | 
 | ||
|  |     /* sel scl */ | ||
|  |     sadc_phase_sel_scl_mux(phase_num, sel_scl); | ||
|  | 
 | ||
|  |     sadc_tsw_meter_pga_gain(ANA_SADC0, phase_num, 1); | ||
|  | 
 | ||
|  |     /* start en */ | ||
|  |     sadc_start_en(ANA_SADC0, 1); | ||
|  | 
 | ||
|  |     /* init discard number for crosstalk */ | ||
|  |     sadc_discard_num_set(ANA_SADC0, phase_num, 6); | ||
|  | 
 | ||
|  |     /* dump sadc register value */ | ||
|  |     //sadc_reg_dump();
 | ||
|  | 
 | ||
|  |     int loop = 500; | ||
|  |     while (loop--) { | ||
|  |         sample_data = sadc_poll_data_start(phase_num, \ | ||
|  |                 0, | ||
|  |                 0, | ||
|  |                 &timeout); | ||
|  | 
 | ||
|  |         if (1 == timeout) { | ||
|  |             iot_printf("sadc_sum_get time out!\n"); | ||
|  |         } else { | ||
|  |             sample_data = sample_data & 0xfffff; | ||
|  |             if (sample_data & 0x80000) { | ||
|  |                 sample_tmp = sample_data - 0x100000; | ||
|  |             } else { | ||
|  |                 sample_tmp = sample_data; | ||
|  |             } | ||
|  |             sum_data_tmp +=sample_tmp; | ||
|  |             if (loop%50 == 0) { | ||
|  |                 iot_printf("%d\n", sum_data_tmp); | ||
|  |                 sum_data = sum_data_tmp; | ||
|  |                 sum_data_tmp = 0; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     return sum_data; | ||
|  | 
 | ||
|  | } | ||
|  | 
 |