AudioInterrupt.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include <stddef.h>
  2. #include "audio_drv.h"
  3. #include "arm_vsi.h"
  4. #ifdef _RTE_
  5. #include "RTE_Components.h"
  6. #endif
  7. #include CMSIS_device_header
  8. #include "cmsis_os2.h"
  9. #include "RingBuffer.h"
  10. #include "arm_math.h"
  11. #include "SchedEvents.h"
  12. #include "AudioConfig.h"
  13. #include "RingConfig.h"
  14. #include "RingInit.h"
  15. extern osThreadId_t gStreamingThreadID;
  16. // Number of bytes read by DMA
  17. #define AUDIO_BLOCK_SIZE_RX RING_BUFSIZE_RX
  18. #define AUDIO_BLOCK_SIZE_TX RING_BUFSIZE_TX
  19. // Number of DMA blocks
  20. #define AUDIO_DMA_NB_BLOCKS RING_NBBUFS
  21. #if AUDIO_DRV_RX_ENABLED
  22. extern ring_config_t ringConfigRX;
  23. #ifdef __FVP_PY
  24. __attribute__((section(".ARM.__at_0x90000000")))
  25. #endif
  26. #if CGSTATIC_VHT_TX_RX_ORDERING
  27. __ALIGNED(16) static uint8_t dmaRX[AUDIO_BLOCK_SIZE_RX];
  28. int rxCount=0;
  29. #endif
  30. __ALIGNED(16) static uint8_t audio_bufferRX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE_RX];
  31. static uint8_t *reservedBufRX=NULL;
  32. #endif
  33. #if AUDIO_DRV_TX_ENABLED
  34. extern ring_config_t ringConfigTX;
  35. #ifdef __FVP_PY
  36. __attribute__((section(".ARM.__at_0x9FFF0000")))
  37. #endif
  38. #if CGSTATIC_VHT_TX_RX_ORDERING
  39. __ALIGNED(16) static uint8_t dmaTX[AUDIO_BLOCK_SIZE_TX];
  40. int txCount=0;
  41. #endif
  42. __ALIGNED(16) static uint8_t audio_bufferTX[AUDIO_DMA_NB_BLOCKS*AUDIO_BLOCK_SIZE_TX];
  43. static uint8_t *reservedBufTX=NULL;
  44. #endif
  45. uint8_t* AudioRXBuffer()
  46. {
  47. #if AUDIO_DRV_RX_ENABLED
  48. return(audio_bufferRX);
  49. #else
  50. return(NULL);
  51. #endif
  52. }
  53. uint8_t* AudioTXBuffer()
  54. {
  55. #if AUDIO_DRV_TX_ENABLED
  56. return(audio_bufferTX);
  57. #else
  58. return(NULL);
  59. #endif
  60. }
  61. static void AudioEvent (uint32_t event) {
  62. #if AUDIO_DRV_RX_ENABLED
  63. if (event & AUDIO_DRV_EVENT_RX_DATA)
  64. {
  65. #if CGSTATIC_VHT_TX_RX_ORDERING
  66. memcpy(reservedBufRX,dmaRX,RING_BUFSIZE_RX);
  67. (void)AudioDrv_Control(AUDIO_DRV_CONTROL_RX_DISABLE);
  68. (void)AudioDrv_Control(AUDIO_DRV_CONTROL_TX_ENABLE);
  69. #endif
  70. ringInterruptReleaseBuffer(&ringConfigRX,(void *)gStreamingThreadID);
  71. int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
  72. reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
  73. }
  74. #endif
  75. #if AUDIO_DRV_TX_ENABLED
  76. if (event & AUDIO_DRV_EVENT_TX_DATA)
  77. {
  78. #if CGSTATIC_VHT_TX_RX_ORDERING
  79. memcpy(dmaTX,reservedBufTX,RING_BUFSIZE_TX);
  80. (void)AudioDrv_Control(AUDIO_DRV_CONTROL_TX_DISABLE);
  81. (void)AudioDrv_Control(AUDIO_DRV_CONTROL_RX_ENABLE);
  82. #endif
  83. ringInterruptReleaseBuffer(&ringConfigTX,(void *)gStreamingThreadID);
  84. int reservedTX=ringInterruptReserveBuffer(&ringConfigTX);
  85. reservedBufTX=ringGetBufferAddress(&ringConfigTX,reservedTX);
  86. }
  87. #endif
  88. }
  89. int32_t AudioDrv_Setup(void) {
  90. int32_t ret;
  91. ret = AudioDrv_Initialize(AudioEvent);
  92. if (ret != 0) {
  93. return ret;
  94. }
  95. #if AUDIO_DRV_RX_ENABLED
  96. ret = AudioDrv_Configure(AUDIO_DRV_INTERFACE_RX,
  97. AUDIO_DRV_NBCHANNELS_RX, /* single channel */
  98. 8U * AUDIO_DRV_CHANNEL_ENCODING_RX, /* 16 sample bits */
  99. static_cast<uint32_t>(AUDIO_DRV_SAMPLINGFREQUENCY_RX));
  100. if (ret != 0) {
  101. return ret;
  102. }
  103. /* Work because user process not started yet
  104. */
  105. int reservedRX=ringInterruptReserveBuffer(&ringConfigRX);
  106. reservedBufRX=ringGetBufferAddress(&ringConfigRX,reservedRX);
  107. #if CGSTATIC_VHT_TX_RX_ORDERING
  108. ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_RX,
  109. dmaRX, 1,AUDIO_BLOCK_SIZE_RX);
  110. #else
  111. ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_RX,
  112. audio_bufferRX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE_RX);
  113. #endif
  114. if (ret != 0) {
  115. return ret;
  116. }
  117. #if !CGSTATIC_VHT_TX_RX_ORDERING
  118. ret = AudioDrv_Control(AUDIO_DRV_CONTROL_RX_ENABLE);
  119. if (ret != 0) {
  120. return ret;
  121. }
  122. #endif
  123. #endif /* AUDIO_DRV_RX_ENABLED */
  124. #if AUDIO_DRV_TX_ENABLED
  125. ret = AudioDrv_Configure(AUDIO_DRV_INTERFACE_TX,
  126. AUDIO_DRV_NBCHANNELS_TX, /* single channel */
  127. 8U * AUDIO_DRV_CHANNEL_ENCODING_TX, /* 16 sample bits */
  128. static_cast<uint32_t>(AUDIO_DRV_SAMPLINGFREQUENCY_TX));
  129. if (ret != 0) {
  130. return ret;
  131. }
  132. /* Work because user process not started yet
  133. */
  134. /* dataflow must be 1 packet ahead of the TX interrupt*/
  135. ringUserReserveBuffer(&ringConfigTX);
  136. ringUserReleaseBuffer(&ringConfigTX);
  137. ringUserReserveBuffer(&ringConfigTX);
  138. ringUserReleaseBuffer(&ringConfigTX);
  139. int reservedTX=ringInterruptReserveBuffer(&ringConfigTX);
  140. reservedBufTX=ringGetBufferAddress(&ringConfigTX,reservedTX);
  141. #if CGSTATIC_VHT_TX_RX_ORDERING
  142. ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_TX,
  143. dmaTX, 1 ,AUDIO_BLOCK_SIZE_TX);
  144. #else
  145. ret = AudioDrv_SetBuf(AUDIO_DRV_INTERFACE_TX,
  146. audio_bufferTX, AUDIO_DMA_NB_BLOCKS,AUDIO_BLOCK_SIZE_TX);
  147. #endif
  148. if (ret != 0) {
  149. return ret;
  150. }
  151. ret = AudioDrv_Control(AUDIO_DRV_CONTROL_TX_ENABLE);
  152. if (ret != 0) {
  153. return ret;
  154. }
  155. #endif /* AUDIO_DRV_TX_ENABLED */
  156. return 0;
  157. }