Files
kunlun/driver/inc/topo_adc_adp.h
2024-09-28 14:24:04 +08:00

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