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