/**************************************************************************** * * 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; }