bsp_sddac.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "include.h"
  2. #include "driver_gpio.h"
  3. #include "driver_sddac.h"
  4. #include "bsp_sddac.h"
  5. #include "utils_ring_buffer.h"
  6. #if AUDIO_OUT_LOCAL_DEBUG
  7. #define SDDAC_PACKET_SIZE ADPCM_BYTE_2_SAMPLE(AUDIO_MIC_PACKET_SIZE)
  8. #define SDDAC_MIC_PACKET_NUM 10
  9. #define SDDAC_MIC_BUFFER_SIZE (SDDAC_PACKET_SIZE * SDDAC_MIC_PACKET_NUM)
  10. uint16_t sddac_buf[SDDAC_PACKET_SIZE * 2] AT(.ram_text.audio.hw);
  11. uint8_t is_playing AT(.ram_text.audio.hw);
  12. uint8_t *sddac_buf_ptr AT(.ram_text.audio.hw);
  13. uint16_t mic_buffer[SDDAC_MIC_BUFFER_SIZE] AT(.ram_text.audio.hw);
  14. ring_buffer_t mic_buffer_cb AT(.ram_text.audio.hw);
  15. AT(.com_text.isr.sddac)
  16. void sddac_isr(void)
  17. {
  18. if (sddac_get_flag(SDDAC_IT_ALL_DONE)) {
  19. sddac_buf_ptr = (u8 *)(sddac_buf + SDDAC_PACKET_SIZE);
  20. if (0 == utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE))) {
  21. is_playing = 0;
  22. sddac_cmd(DISABLE);
  23. }
  24. sddac_clear_flag(SDDAC_IT_ALL_DONE);
  25. }
  26. if (sddac_get_flag(SDDAC_IT_HALF_DONE)) {
  27. sddac_buf_ptr = (u8 *)sddac_buf;
  28. utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE));
  29. sddac_clear_flag(SDDAC_IT_HALF_DONE);
  30. }
  31. }
  32. void bsp_sddac_init(void)
  33. {
  34. gpio_init_typedef gpio_init_structure;
  35. sddac_init_typedef sddac_config;
  36. clk_sdadda_clk_set(CLK_SDADDA_CLK_XOSC24M_CLK_2PLL, 0);
  37. clk_gate0_cmd(CLK_GATE0_DAC, CLK_EN);
  38. gpio_init_structure.gpio_pin = GPIO_PIN_2;
  39. gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
  40. gpio_init_structure.gpio_fen = GPIO_FEN_PER;
  41. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  42. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  43. gpio_init(GPIOA_REG, &gpio_init_structure);
  44. FUNO_PA2SEL(FO_AUDIO);
  45. sddac_config.dma_buf = (u8 *)sddac_buf;
  46. sddac_config.dma_size = sizeof(sddac_buf) / 2;
  47. sddac_config.sample_rate = SDDAC_NORMAL_SPR_16k;
  48. sddac_init(&sddac_config);
  49. sddac_pic_config(sddac_isr, 0, SDDAC_IT_ALL_DONE | SDDAC_IT_HALF_DONE, ENABLE);
  50. is_playing = 0;
  51. memset((u8 *)mic_buffer, 0x00, SAMPLE_2_PCM16_BYTE(SDDAC_MIC_BUFFER_SIZE));
  52. utils_ring_buffer_init(&mic_buffer_cb, (u8 *)mic_buffer, SAMPLE_2_PCM16_BYTE(SDDAC_MIC_BUFFER_SIZE));
  53. }
  54. uint32_t bsp_sddac_pcm_push(uint8_t *buf, uint32_t size)
  55. {
  56. u32 res = utils_ring_buffer_write(&mic_buffer_cb, buf, size);
  57. if (!is_playing) {
  58. bsp_sddac_kick();
  59. }
  60. return res;
  61. }
  62. void bsp_sddac_kick(void)
  63. {
  64. if (!is_playing) {
  65. sddac_buf_ptr = (u8 *)sddac_buf;
  66. is_playing = 1;
  67. if (utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE))) {
  68. printf("[SDDAC] start\n");
  69. sddac_cmd(ENABLE);
  70. }
  71. }
  72. }
  73. #endif // AUDIO_OUT_LOCAL_DEBUG