200 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.1 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.
 | |
| 
 | |
| ****************************************************************************/
 | |
| 
 | |
| #ifndef TOPO_ADC_ADP_H
 | |
| #define TOPO_ADC_ADP_H
 | |
| 
 | |
| /* os shim includes */
 | |
| #include "os_types.h"
 | |
| 
 | |
| #include "apb_dma.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* define hw topo working mode */
 | |
| #define IOT_HW_TOPO_MODE_NOR                        0
 | |
| #define IOT_HW_TOPO_MODE_PA                         1
 | |
| #define IOT_HW_TOPO_MODE_INVALID                    2
 | |
| 
 | |
| /* phase definition */
 | |
| #define IOT_HW_TOPO_PHASE_ALL                       0
 | |
| #define IOT_HW_TOPO_PHASE_A                         1
 | |
| #define IOT_HW_TOPO_PHASE_B                         2
 | |
| #define IOT_HW_TOPO_PHASE_C                         3
 | |
| #define IOT_HW_TOPO_PHASE_CNT                       3
 | |
| 
 | |
| /* define the maximum samples number for per power line period */
 | |
| #define IOT_PLC_HW_TOPO_SAMP_NUM_MAX_PER_PERIOD     384
 | |
| 
 | |
| /* defines the gap for automatic gain adjustment, uint is 1ms */
 | |
| #define IOT_PLC_HW_TOPO_AGC_ADJ_GAP                 50
 | |
| 
 | |
| /* adc adapter config descriptor */
 | |
| typedef struct _topo_adc_adp_cfg {
 | |
|     /* topo work mode, see IOT_HW_TOPO_MODE_XXX */
 | |
|     uint8_t mode;
 | |
|     /* is vcm gnd */
 | |
|     uint8_t is_vcm_gnd;
 | |
|     /* is agc enable */
 | |
|     uint8_t agc_en;
 | |
| } topo_adc_adp_cfg_t;
 | |
| 
 | |
| /* agc descriptor */
 | |
| typedef struct _iot_plc_hw_topo_agc_ctrl {
 | |
|     /* sample data buffer */
 | |
|     int32_t     raw_data_buf[IOT_PLC_HW_TOPO_SAMP_NUM_MAX_PER_PERIOD];
 | |
|     /* the index where the sample data will be placed */
 | |
|     uint32_t    idx;
 | |
|     /* mean square value */
 | |
|     uint32_t    rms2;
 | |
|     /* peak value  */
 | |
|     uint32_t    peak;
 | |
|     /* the time stamp of the last gain adjustment, uint is 1s */
 | |
|     uint32_t    adjust_start_ts;
 | |
|     /* flak to mark if rms2 update */
 | |
|     uint32_t    rms2_update : 1,
 | |
|     /* flak to mark if over adc range */
 | |
|                 over        : 1,
 | |
|     /* flasg to if gain is adjusted, in the observation */
 | |
|                 adjusting   : 1,
 | |
|     /* reserved fields for further use */
 | |
|                 rsvd        : 29;
 | |
| } iot_plc_hw_topo_agc_ctrl_t;
 | |
| 
 | |
| /* adc info descriptor */
 | |
| typedef struct {
 | |
|     /* sampling frequency, uint is HZ */
 | |
|     uint32_t   samp_freq;
 | |
|     /* current gain value of ADC */
 | |
|     float      gain[IOT_HW_TOPO_PHASE_CNT];
 | |
|     /* scale factor for energy normalization */
 | |
|     float      scale;
 | |
|     /* current sampled data phase, see IOT_PLC_PHASE_XXX */
 | |
|     uint8_t    cur_smap_phase;
 | |
|     /* simultaneously sampled phase num */
 | |
|     uint8_t    phase_num;
 | |
| } topo_adc_info_t;
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_parse_dma_data parse dma data
 | |
|  *
 | |
|  * @param buf           dma data buffer
 | |
|  * @param index         index in the rebuffer to be parsed
 | |
|  * @param phy_phase     return plc phase, see IOT_PLC_PHASE_XXX
 | |
|  * @param data_val      return adc value
 | |
|  * @retuval: 1 - parse ok, 0 - parse error.
 | |
|  */
 | |
| uint32_t topo_adc_adp_parse_dma_data(uint8_t *buf, uint32_t index,
 | |
|     uint32_t *phy_phase, int32_t *data_val);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_drv_get_sadc_info get adc information
 | |
|  *
 | |
|  * @param info          return information, see topo_adc_info_t
 | |
|  *
 | |
|  * @return none
 | |
|  */
 | |
| void topo_drv_get_sadc_info(topo_adc_info_t *info);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_get_fsb get the maximum value of adc data
 | |
|  *
 | |
|  * @return the maximum value of adc data
 | |
|  */
 | |
| uint32_t topo_adc_adp_get_fsb(void);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_agc_handle agc handle
 | |
|  *
 | |
|  * @param phy_phase     plc phase, see IOT_PLC_PHASE_XXX
 | |
|  * @param agc_ctl       information used for agc control
 | |
|  *
 | |
|  * @return 0:           success
 | |
|  * @return NON-0:       error
 | |
|  */
 | |
| void topo_adc_adp_agc_handle(uint8_t phy_phase,
 | |
|     iot_plc_hw_topo_agc_ctrl_t *agc_ctl);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_samp_phase_cfg change sample phase
 | |
|  *
 | |
|  * @param phy_phase     plc phase, see IOT_PLC_PHASE_XXX
 | |
|  *
 | |
|  * @return none
 | |
|  */
 | |
| void topo_adc_adp_samp_phase_cfg(uint8_t phy_phase);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_samp_start start sample
 | |
|  *
 | |
|  * @param dma_desc      dma descriptor
 | |
|  *
 | |
|  * @return none
 | |
|  */
 | |
| void topo_adc_adp_samp_start(desc_t *dma_desc);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_samp_stop stop sample
 | |
|  *
 | |
|  * @return none
 | |
|  */
 | |
| void topo_adc_adp_samp_stop(void);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_init initialize topo adc
 | |
|  *
 | |
|  * @param madp_cfgode   adapter config, see topo_adc_adp_cfg_t
 | |
|  *
 | |
|  * @return 0:           success
 | |
|  * @return NON-0:       error
 | |
|  */
 | |
| uint32_t topo_adc_adp_init(topo_adc_adp_cfg_t *adp_cfg);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_dma_init initialize topo dma
 | |
|  *
 | |
|  * @param dev_src_addr  dma source address
 | |
|  *
 | |
|  * @return 0:           success
 | |
|  * @return NON-0:       error
 | |
|  */
 | |
| uint32_t topo_adc_adp_dma_init(uint32_t *dev_src_addr);
 | |
| 
 | |
| /**
 | |
|  * @brief topo_adc_adp_dump dump adc data
 | |
|  *
 | |
|  * @param phy_phase     plc phase, see IOT_PLC_PHASE_XXX
 | |
|  * @param gain1_idx     gain 1 index
 | |
|  * @param gain2_idx     gain 2 index
 | |
|  * @param discard_num   discard num for each sample
 | |
|  * @param data_num      data num for each sample
 | |
|  * @param samp_num      number of samples to be sampled
 | |
|  * @param data_buf      data out buffer, it is malloc in this function
 | |
|  *
 | |
|  * @return 0:           success
 | |
|  * @return NON-0:       error
 | |
|  */
 | |
| uint32_t topo_adc_adp_dump(uint8_t phy_phase, uint8_t gain1_idx,
 | |
|     uint8_t gain2_idx, uint8_t shift_num, uint32_t discard_num,
 | |
|     uint32_t data_num, uint32_t samp_num, uint32_t **data_buf);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* TOPO_ADC_ADP_H */
 |