• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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