hpm_ffa_drv.h 5.0 KB

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