181 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| 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 IOT_SW_DMA_API_H
 | |
| #define IOT_SW_DMA_API_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** \defgroup SW_DMA_APIs SW_DMA APIs
 | |
|  *  @brief SW_DMA APIs
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /** @addtogroup SW_DMA_APIs
 | |
|  * @{
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @brief Usage:
 | |
| 
 | |
|     // init sw dma, selece channel 0
 | |
|     iot_dma_sw_init(0);
 | |
| 
 | |
|     iot_dma_sw_cfg(output_buf, input_float_512, 2048, 0, NULL);
 | |
| 
 | |
|     iot_dma_sw_start(0);
 | |
| 
 | |
|     // get min
 | |
|     float output_min = 0;
 | |
|     uint32_t output_index = 0;
 | |
|     iot_dma_sw_cfg(output_buf, input_float_512, 512*4, DMA_FP_MIN, NULL);
 | |
| 
 | |
|     iot_dma_sw_start(0);
 | |
| 
 | |
|     iot_dma_sw_max_min(0, &output_min, &output_index);
 | |
| 
 | |
|     // get sum
 | |
|     float output_sum = 0;
 | |
|     iot_dma_sw_cfg(output_buf, input_float_512, 512*4, DMA_FP_SUM, NULL);
 | |
| 
 | |
|     iot_dma_sw_start(0);
 | |
| 
 | |
|     iot_dma_sw_sum(0, &output_sum);
 | |
| 
 | |
|     // input value multiply by fac_val
 | |
|     iot_fp_ctrl_t fp_ctrl = {0};
 | |
|     fp_ctrl.abs_ena = DMA_ABS_DIS;
 | |
|     fp_ctrl.fac_cfg = DMA_FAC_IN_MUL;
 | |
|     fp_ctrl.fac_val = 2;
 | |
|     iot_dma_sw_cfg(sw_out, input_float_512, 512*4, DMA_FP_LOG2, &fp_ctrl);
 | |
| 
 | |
|     iot_dma_sw_start(0);
 | |
| 
 | |
|  */
 | |
| /**
 | |
|  * @brief iot_dma_sw_fp_t - supported float point operation
 | |
|  * @param DMA_FP_SQRT           output format is the square root of the input
 | |
|  * @param DMA_FP_1_SQRT         output format is the inverse square of the input
 | |
|  * @param DMA_FP_LOG2           output format is the base-2 logarithmic of the input
 | |
|  * @param DMA_FP_EXP2           output format is the base-2 exponential of the input
 | |
|  * @param DMA_FP_MIN            get the minimum of the input
 | |
|  * @param DMA_FP_MAX            get the maximum of the input
 | |
|  * @param DMA_FP_SUM            get the sum of the input
 | |
|  * @param DMA_FP_FTOI           transform FLOAT input to INT32 output
 | |
|  * @param DMA_FP_ITOF           transform INT32 input to FLOAT output
 | |
|  */
 | |
| 
 | |
| typedef enum _iot_dma_sw_fp {
 | |
|     DMA_FP_SQRT = 0,
 | |
|     DMA_FP_1_SQRT = 1,
 | |
|     DMA_FP_LOG2 = 2,
 | |
|     DMA_FP_EXP2 = 3,
 | |
|     DMA_FP_MIN = 4,
 | |
|     DMA_FP_MAX = 5,
 | |
|     DMA_FP_SUM = 6,
 | |
|     DMA_FP_FTOI = 7,
 | |
|     DMA_FP_ITOF = 8,
 | |
|     DMA_FP_INVR = 9,
 | |
| 
 | |
|     DMA_FP_NONE = 10,
 | |
| } iot_dma_sw_fp_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_fp_fac_t - configure float point factor
 | |
|  * @param DMA_FAC_NONE          no additional multiplication
 | |
|  * @param DMA_FAC_IN_MUL        input multiply by the factor
 | |
|  * @param DMA_FAC_OUT_MUL       output multiply by the facotr
 | |
|  */
 | |
| typedef enum _iot_fp_fac {
 | |
|     DMA_FAC_NONE = 0,
 | |
|     DMA_FAC_IN_MUL = 1,
 | |
|     DMA_FAC_OUT_MUL = 2,
 | |
| } iot_fp_fac_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_fp_fac_t - configure float point factor
 | |
|  * @param DMA_ABS_DIS           don't do abs before process max/min
 | |
|  * @param DMA_ABS_ENA           do abs before process max/min
 | |
|  */
 | |
| typedef enum _iot_fp_abs {
 | |
|     DMA_ABS_DIS = 0,
 | |
|     DMA_ABS_ENA = 1,
 | |
| } iot_fp_abs_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_fp_ctrl_t - the structure of float point control
 | |
|  * @param abs_ena               abs enable, reference to iot_fp_abs_t
 | |
|  * @param fac_cfg               factor mode config, reference to iot_fp_fac_t
 | |
|  * @param fac_val               the factor value
 | |
|  */
 | |
| typedef struct _iot_fp_ctrl_t {
 | |
|     uint8_t abs_ena;
 | |
|     uint8_t fac_cfg;
 | |
|     float fac_val;
 | |
| } iot_fp_ctrl_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_dma_sw_init() - init sw dma
 | |
| 
 | |
|  * @param chl           the sw dma channel
 | |
|  */
 | |
| void iot_dma_sw_init(uint8_t chl);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_dma_sw_cfg() - configure input and output, with float operation
 | |
| 
 | |
|  * @param dest          the output buffer pointer
 | |
|  * @param src           the input buffer pointer
 | |
|  * @param len           the length of buffer, maximum is 4096 bype
 | |
|  * @param op            the operation of float point
 | |
|                         reference to iot_dma_sw_fp_t
 | |
|  * @param fp_ctrl       float pointer control
 | |
|  */
 | |
| void iot_dma_sw_cfg(void *dest, void *src, uint16_t len,
 | |
|             uint8_t op, iot_fp_ctrl_t *fp_ctrl);
 | |
| 
 | |
| void iot_dma_sw_start(uint8_t chl);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_dma_sw_max_min() - get the maximum or minimum value of the input,
 | |
|                         the function can only valid if op select DMA_FP_MIN or
 | |
|                         DMA_FP_MAX
 | |
| 
 | |
|  * @param chl           the sw dma channel
 | |
|  * @param value         the pointer of output value
 | |
|  * @param value         the index of max/min value
 | |
|  */
 | |
| void iot_dma_sw_max_min(uint8_t chl, void *value, uint32_t *index);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_dma_sw_sum() - get the sum value of the input, the function
 | |
|                         can only valid if op select DMA_FP_SUM
 | |
| 
 | |
|  * @param chl           the sw dma channel
 | |
|  * @param value         the pointer of output value
 | |
|  */
 | |
| void iot_dma_sw_sum(uint8_t chl, void *value);
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif //IOT_SW_DMA_API_H
 |