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
13 /**
14 * @brief FFA driver APIs
15 * @defgroup ffa_interface FFA driver APIs
16 * @ingroup ffa_interfaces
17 * @{
18 *
19 */
20
21 /***********************************************************************************************************************
22 *
23 * Definitions
24 *
25 **********************************************************************************************************************/
26 /**
27 * @brief Operation commands supported by FFA
28 */
29 #define FFA_OPCMD_FIR (0U) /* !< FIR operation command index */
30 #define FFA_OPCMD_FFT (2U) /* !< FFT operation command index */
31
32 /**
33 * @brief Data type supported by FFA
34 */
35 #define FFA_DATA_TYPE_REAL_Q31 (0U) /* !< FFA Data type: Real Q31 */
36 #define FFA_DATA_TYPE_REAL_Q15 (1U) /* !< FFA Data type: Real Q15 */
37 #define FFA_DATA_TYPE_COMPLEX_Q31 (2U) /* !< FFA Data type: Complex Q31 */
38 #define FFA_DATA_TYPE_COMPLEX_Q15 (3U) /* !< FFA Data type: Complex Q15 */
39
40 /**
41 * @brief FFA Q31 data type definition
42 */
43 typedef int32_t ffa_q31_t;
44
45 /**
46 * @brief FFA Q15 data type definition
47 */
48 typedef int16_t ffa_q15_t;
49
50 /**
51 * @brief FFA complex Q31 data type definition
52 */
53 typedef struct {
54 ffa_q31_t real;
55 ffa_q31_t image;
56 } ffa_complex_q31_t;
57
58 /**
59 * @brief FFA complex Q15 data type definition
60 */
61 typedef struct {
62 ffa_q15_t real;
63 ffa_q15_t image;
64 } ffa_complex_q15_t;
65
66 /**
67 * @brief FFT transform context
68 */
69 typedef struct {
70 uint16_t is_ifft; /* !< Is Inverse FFT transform */
71 uint8_t src_data_type; /* !< Source data type */
72 uint8_t dst_data_type; /* !< Destination date type */
73 uint32_t num_points; /* !< Number of points */
74 const void *src; /* !< Source data buffer */
75 void *dst; /* !< Destination Data buffer */
76 uint32_t interrupt_mask; /* !< Interrupt mask */
77 } fft_xfer_t;
78
79 /**
80 * @brief FIR transform context
81 */
82 typedef struct {
83 uint16_t data_type; /* !< Data type */
84 uint16_t coef_taps; /* !< Coefficient taps */
85 uint32_t input_taps; /* !< Input data taps */
86 const void *src; /* !< Source data buffer */
87 const void *coeff; /* !< Coefficient data buffer */
88 void *dst; /* !< Destination data buffer */
89 uint32_t interrupt_mask; /* !< Interrupt mask */
90 } fir_xfer_t;
91
92 /**
93 * @brief FFA error codes
94 */
95 enum {
96 status_ffa_fir_overflow = MAKE_STATUS(status_group_ffa, 0), /* !< FIR overflow */
97 status_ffa_fft_overflow = MAKE_STATUS(status_group_ffa, 1), /* !< FFR overflow */
98 status_ffa_write_error = MAKE_STATUS(status_group_ffa, 2), /* !< FFA write error */
99 status_ffa_read_next_error = MAKE_STATUS(status_group_ffa, 3), /* !< FFA read next data error */
100 status_ffa_read_error = MAKE_STATUS(status_group_ffa, 4), /*!< FFA read error */
101 };
102
103 #ifdef __cplusplus
104 extern "C" {
105 #endif
106
107 /**
108 * @brief Enable FFA module and start an specified FFA operation
109 *
110 * @param [in] ptr FFA base address
111 */
ffa_enable(FFA_Type * ptr)112 static inline void ffa_enable(FFA_Type *ptr)
113 {
114 ptr->CTRL = (ptr->CTRL & ~FFA_CTRL_SFTRST_MASK) | FFA_CTRL_EN_MASK;
115 }
116
117 /**
118 * @brief Stop FFA module
119 *
120 * @param [in] ptr FFA base address
121 */
ffa_disable(FFA_Type * ptr)122 static inline void ffa_disable(FFA_Type *ptr)
123 {
124 ptr->CTRL = (ptr->CTRL & ~FFA_CTRL_EN_MASK) | FFA_CTRL_SFTRST_MASK;
125 }
126
127 /**
128 * @brief Get FFA status
129 *
130 * @param [in] ptr FFA base address
131 * @return FFA status register value
132 */
ffa_get_status(FFA_Type * ptr)133 static inline uint32_t ffa_get_status(FFA_Type *ptr)
134 {
135 return ptr->STATUS;
136 }
137
138 /**
139 * @brief Enable FFA Interrupt
140 *
141 * @param [in] ptr FFA base address
142 * @param [in] mask FFA interrupt mask
143 */
ffa_enable_interrupt(FFA_Type * ptr,uint32_t mask)144 static inline void ffa_enable_interrupt(FFA_Type *ptr, uint32_t mask)
145 {
146 ptr->INT_EN |= mask;
147 }
148
149 /**
150 * @brief Disable FFA interrupt
151 *
152 * @param [in] ptr FFA base address
153 * @param [in] mask FFA interrupt mask
154 */
ffa_disable_interrupt(FFA_Type * ptr,uint32_t mask)155 static inline void ffa_disable_interrupt(FFA_Type *ptr, uint32_t mask)
156 {
157 ptr->INT_EN &= ~mask;
158 }
159
160 /**
161 * @brief Start an FFT operation
162 *
163 * @param [in] ptr FFA base address
164 * @param [in] fft_xfer FFT transform context
165 */
166 void ffa_start_fft(FFA_Type *ptr, fft_xfer_t *fft_xfer);
167
168 /**
169 * @brief Start an FIR operation
170 *
171 * @param [in] ptr FFA base address
172 * @param [in] fir_xfer FIR transform context
173 */
174 void ffa_start_fir(FFA_Type *ptr, fir_xfer_t *fir_xfer);
175
176 /**
177 * @brief Perform FFT transformation in blocking mode
178 *
179 * @param [in] ptr FFA base address
180 * @param [in, out] fft_xfer FFT transform context
181 * @return FFT operation result
182 */
183 hpm_stat_t ffa_calculate_fft_blocking(FFA_Type *ptr, fft_xfer_t *fft_xfer);
184
185 /**
186 * @brief Perform FIR transform in blocking mode
187 *
188 * @param [in] ptr FFA base address
189 * @param [in, out] fir_xfer FIR transform context
190 * @return FIR operation result
191 */
192 hpm_stat_t ffa_calculate_fir_blocking(FFA_Type *ptr, fir_xfer_t *fir_xfer);
193
194
195 #ifdef __cplusplus
196 }
197 #endif
198 /**
199 * @}
200 *
201 */
202
203
204 #endif /* HPM_FFA_DRV_H */
205