HPM SDK
HPMicro Software Development Kit
hpm_ffa_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #ifndef HPM_FFA_DRV_H
8 #define HPM_FFA_DRV_H
9 
10 #include "hpm_common.h"
11 #include "hpm_ffa_regs.h"
12 #include "hpm_soc_feature.h"
13 #include "hpm_soc_ip_feature.h"
14 
23 /***********************************************************************************************************************
24  *
25  * Definitions
26  *
27  **********************************************************************************************************************/
31 #define FFA_OPCMD_FIR (0U) /* !< FIR operation command index */
32 #define FFA_OPCMD_FFT (2U) /* !< FFT operation command index */
33 
37 #define FFA_DATA_TYPE_REAL_Q31 (0U) /* !< FFA Data type: Real Q31 */
38 #define FFA_DATA_TYPE_REAL_Q15 (1U) /* !< FFA Data type: Real Q15 */
39 #define FFA_DATA_TYPE_COMPLEX_Q31 (2U) /* !< FFA Data type: Complex Q31 */
40 #define FFA_DATA_TYPE_COMPLEX_Q15 (3U) /* !< FFA Data type: Complex Q15 */
41 #if defined(HPM_IP_FEATURE_FFA_FP32) && HPM_IP_FEATURE_FFA_FP32
42 #define FFA_DATA_TYPE_COMPLEX_FP32 (4U) /* !< FFA Data type: Complex Q15 */
43 #define FFA_DATA_TYPE_REAL_FP32 (5U) /* !< FFA Data type: Complex Q15 */
44 #endif
45 
49 typedef int32_t ffa_q31_t;
50 
54 typedef int16_t ffa_q15_t;
55 
59 typedef struct {
63 
67 typedef struct {
71 
75 typedef struct {
76  uint16_t is_ifft; /* !< Is Inverse FFT transform */
77  uint8_t src_data_type; /* !< Source data type */
78  uint8_t dst_data_type; /* !< Destination date type */
79  uint32_t num_points; /* !< Number of points */
80  const void *src; /* !< Source data buffer */
81  void *dst; /* !< Destination Data buffer */
82  uint32_t interrupt_mask; /* !< Interrupt mask */
83 } fft_xfer_t;
84 
88 typedef struct {
89  uint16_t data_type; /* !< Data type */
90  uint16_t coef_taps; /* !< Coefficient taps */
91  uint32_t input_taps; /* !< Input data taps */
92  const void *src; /* !< Source data buffer */
93  const void *coeff; /* !< Coefficient data buffer */
94  void *dst; /* !< Destination data buffer */
95  uint32_t interrupt_mask; /* !< Interrupt mask */
96 } fir_xfer_t;
97 
101 enum {
104  status_ffa_write_error = MAKE_STATUS(status_group_ffa, 2), /* !< FFA write error */
105  status_ffa_read_next_error = MAKE_STATUS(status_group_ffa, 3), /* !< FFA read next data error */
107 };
108 
109 #if defined(HPM_IP_FEATURE_FFA_FP32) && HPM_IP_FEATURE_FFA_FP32
110 typedef enum {
111  input_data = 0,
112  output_data = 1,
113  coeff_data = 2
114 } ffa_fp32_status_source_t;
115 #endif
116 
117 #ifdef __cplusplus
118 extern "C" {
119 #endif
120 
126 static inline void ffa_enable(FFA_Type *ptr)
127 {
128  ptr->CTRL = (ptr->CTRL & ~FFA_CTRL_SFTRST_MASK) | FFA_CTRL_EN_MASK;
129 }
130 
136 static inline void ffa_disable(FFA_Type *ptr)
137 {
138  ptr->CTRL = (ptr->CTRL & ~FFA_CTRL_EN_MASK) | FFA_CTRL_SFTRST_MASK;
139 }
140 
147 static inline uint32_t ffa_get_status(FFA_Type *ptr)
148 {
149  return ptr->STATUS;
150 }
151 
158 static inline void ffa_enable_interrupt(FFA_Type *ptr, uint32_t mask)
159 {
160  ptr->INT_EN |= mask;
161 }
162 
169 static inline void ffa_disable_interrupt(FFA_Type *ptr, uint32_t mask)
170 {
171  ptr->INT_EN &= ~mask;
172 }
173 
174 #if defined(HPM_IP_FEATURE_FFA_FP32) && HPM_IP_FEATURE_FFA_FP32
175 
176 static inline void ffa_enable_fp32_interrupt(FFA_Type *ptr, uint32_t mask)
177 {
178  ptr->FP_CTRL |= mask;
179 }
180 
181 static inline void ffa_disable_fp32_interrupt(FFA_Type *ptr, uint32_t mask)
182 {
183  ptr->FP_CTRL &= ~mask;
184 }
185 
186 static inline void ffa_set_fp_status_source(FFA_Type *ptr, ffa_fp32_status_source_t source)
187 {
188  ptr->FP_CTRL = FFA_FP_CTRL_EXP_ST_SEL_SET(source);
189 }
190 
191 static inline void ffa_enable_fp_bias(FFA_Type *ptr)
192 {
194 }
195 
196 static inline void ffa_disable_fp_bias(FFA_Type *ptr)
197 {
199 }
200 
201 static inline void ffa_set_coef_max_index(FFA_Type *ptr, uint8_t max)
202 {
204 }
205 
206 static inline void ffa_set_output_max_index(FFA_Type *ptr, uint8_t max)
207 {
209 }
210 
211 static inline void ffa_set_input_max_index(FFA_Type *ptr, uint8_t max)
212 {
214 }
215 
216 static inline uint32_t ffa_get_fp_status(FFA_Type *ptr)
217 {
218  return ptr->FP_ST;
219 }
220 
221 #endif
222 
229 void ffa_start_fft(FFA_Type *ptr, fft_xfer_t *fft_xfer);
230 
237 void ffa_start_fir(FFA_Type *ptr, fir_xfer_t *fir_xfer);
238 
247 
256 
257 
258 #ifdef __cplusplus
259 }
260 #endif
267 #endif /* HPM_FFA_DRV_H */
#define FFA_CTRL_EN_MASK
Definition: hpm_ffa_regs.h:67
#define FFA_CTRL_SFTRST_MASK
Definition: hpm_ffa_regs.h:57
#define FFA_FP_CTRL_COEF_MAX_MASK
Definition: hpm_ffa_regs.h:313
#define FFA_FP_CTRL_EXP_ST_SEL_SET(x)
Definition: hpm_ffa_regs.h:295
#define FFA_FP_CTRL_IN_MAX_MASK
Definition: hpm_ffa_regs.h:333
#define FFA_FP_CTRL_OPT_BIAS_EXP_MASK
Definition: hpm_ffa_regs.h:303
#define FFA_FP_CTRL_COEF_MAX_SET(x)
Definition: hpm_ffa_regs.h:315
#define FFA_FP_CTRL_IN_MAX_SET(x)
Definition: hpm_ffa_regs.h:335
#define FFA_FP_CTRL_OUT_MAX_SET(x)
Definition: hpm_ffa_regs.h:325
#define FFA_FP_CTRL_OUT_MAX_MASK
Definition: hpm_ffa_regs.h:323
uint32_t hpm_stat_t
Definition: hpm_common.h:123
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:132
@ status_group_ffa
Definition: hpm_common.h:160
static void ffa_enable(FFA_Type *ptr)
Enable FFA module and start an specified FFA operation.
Definition: hpm_ffa_drv.h:126
static uint32_t ffa_get_status(FFA_Type *ptr)
Get FFA status.
Definition: hpm_ffa_drv.h:147
static void ffa_enable_interrupt(FFA_Type *ptr, uint32_t mask)
Enable FFA Interrupt.
Definition: hpm_ffa_drv.h:158
hpm_stat_t ffa_calculate_fir_blocking(FFA_Type *ptr, fir_xfer_t *fir_xfer)
Perform FIR transform in blocking mode.
Definition: hpm_ffa_drv.c:138
void ffa_start_fft(FFA_Type *ptr, fft_xfer_t *fft_xfer)
Start an FFT operation.
Definition: hpm_ffa_drv.c:34
int16_t ffa_q15_t
FFA Q15 data type definition.
Definition: hpm_ffa_drv.h:54
hpm_stat_t ffa_calculate_fft_blocking(FFA_Type *ptr, fft_xfer_t *fft_xfer)
Perform FFT transformation in blocking mode.
Definition: hpm_ffa_drv.c:118
void ffa_start_fir(FFA_Type *ptr, fir_xfer_t *fir_xfer)
Start an FIR operation.
Definition: hpm_ffa_drv.c:64
static void ffa_disable_interrupt(FFA_Type *ptr, uint32_t mask)
Disable FFA interrupt.
Definition: hpm_ffa_drv.h:169
int32_t ffa_q31_t
FFA Q31 data type definition.
Definition: hpm_ffa_drv.h:49
static void ffa_disable(FFA_Type *ptr)
Stop FFA module.
Definition: hpm_ffa_drv.h:136
@ status_ffa_write_error
Definition: hpm_ffa_drv.h:104
@ status_ffa_read_next_error
Definition: hpm_ffa_drv.h:105
@ status_ffa_fft_overflow
Definition: hpm_ffa_drv.h:103
@ status_ffa_read_error
Definition: hpm_ffa_drv.h:106
@ status_ffa_fir_overflow
Definition: hpm_ffa_drv.h:102
Definition: hpm_ffa_regs.h:12
__RW uint32_t INT_EN
Definition: hpm_ffa_regs.h:15
__RW uint32_t FP_ST
Definition: hpm_ffa_regs.h:18
__RW uint32_t FP_CTRL
Definition: hpm_ffa_regs.h:17
__RW uint32_t STATUS
Definition: hpm_ffa_regs.h:14
__RW uint32_t CTRL
Definition: hpm_ffa_regs.h:13
FFA complex Q15 data type definition.
Definition: hpm_ffa_drv.h:67
ffa_q15_t real
Definition: hpm_ffa_drv.h:68
ffa_q15_t image
Definition: hpm_ffa_drv.h:69
FFA complex Q31 data type definition.
Definition: hpm_ffa_drv.h:59
ffa_q31_t image
Definition: hpm_ffa_drv.h:61
ffa_q31_t real
Definition: hpm_ffa_drv.h:60
FFT transform context.
Definition: hpm_ffa_drv.h:75
void * dst
Definition: hpm_ffa_drv.h:81
uint8_t dst_data_type
Definition: hpm_ffa_drv.h:78
uint32_t interrupt_mask
Definition: hpm_ffa_drv.h:82
uint8_t src_data_type
Definition: hpm_ffa_drv.h:77
const void * src
Definition: hpm_ffa_drv.h:80
uint32_t num_points
Definition: hpm_ffa_drv.h:79
uint16_t is_ifft
Definition: hpm_ffa_drv.h:76
FIR transform context.
Definition: hpm_ffa_drv.h:88
uint32_t input_taps
Definition: hpm_ffa_drv.h:91
const void * coeff
Definition: hpm_ffa_drv.h:93
const void * src
Definition: hpm_ffa_drv.h:92
uint16_t data_type
Definition: hpm_ffa_drv.h:89
uint32_t interrupt_mask
Definition: hpm_ffa_drv.h:95
uint16_t coef_taps
Definition: hpm_ffa_drv.h:90
void * dst
Definition: hpm_ffa_drv.h:94