| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "include.h"
- #include "driver_gpio.h"
- #include "driver_sddac.h"
- #include "bsp_sddac.h"
- #include "utils_ring_buffer.h"
- #if AUDIO_OUT_LOCAL_DEBUG
- #define SDDAC_PACKET_SIZE ADPCM_BYTE_2_SAMPLE(AUDIO_MIC_PACKET_SIZE)
- #define SDDAC_MIC_PACKET_NUM 10
- #define SDDAC_MIC_BUFFER_SIZE (SDDAC_PACKET_SIZE * SDDAC_MIC_PACKET_NUM)
- uint16_t sddac_buf[SDDAC_PACKET_SIZE * 2] AT(.ram_text.audio.hw);
- uint8_t is_playing AT(.ram_text.audio.hw);
- uint8_t *sddac_buf_ptr AT(.ram_text.audio.hw);
- uint16_t mic_buffer[SDDAC_MIC_BUFFER_SIZE] AT(.ram_text.audio.hw);
- ring_buffer_t mic_buffer_cb AT(.ram_text.audio.hw);
- AT(.com_text.isr.sddac)
- void sddac_isr(void)
- {
- if (sddac_get_flag(SDDAC_IT_ALL_DONE)) {
- sddac_buf_ptr = (u8 *)(sddac_buf + SDDAC_PACKET_SIZE);
- if (0 == utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE))) {
- is_playing = 0;
- sddac_cmd(DISABLE);
- }
- sddac_clear_flag(SDDAC_IT_ALL_DONE);
- }
- if (sddac_get_flag(SDDAC_IT_HALF_DONE)) {
- sddac_buf_ptr = (u8 *)sddac_buf;
- utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE));
- sddac_clear_flag(SDDAC_IT_HALF_DONE);
- }
- }
- void bsp_sddac_init(void)
- {
- gpio_init_typedef gpio_init_structure;
- sddac_init_typedef sddac_config;
- clk_sdadda_clk_set(CLK_SDADDA_CLK_XOSC24M_CLK_2PLL, 0);
- clk_gate0_cmd(CLK_GATE0_DAC, CLK_EN);
- gpio_init_structure.gpio_pin = GPIO_PIN_2;
- gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
- gpio_init_structure.gpio_fen = GPIO_FEN_PER;
- gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
- gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
- gpio_init(GPIOA_REG, &gpio_init_structure);
- FUNO_PA2SEL(FO_AUDIO);
- sddac_config.dma_buf = (u8 *)sddac_buf;
- sddac_config.dma_size = sizeof(sddac_buf) / 2;
- sddac_config.sample_rate = SDDAC_NORMAL_SPR_16k;
- sddac_init(&sddac_config);
- sddac_pic_config(sddac_isr, 0, SDDAC_IT_ALL_DONE | SDDAC_IT_HALF_DONE, ENABLE);
- is_playing = 0;
- memset((u8 *)mic_buffer, 0x00, SAMPLE_2_PCM16_BYTE(SDDAC_MIC_BUFFER_SIZE));
- utils_ring_buffer_init(&mic_buffer_cb, (u8 *)mic_buffer, SAMPLE_2_PCM16_BYTE(SDDAC_MIC_BUFFER_SIZE));
- }
- uint32_t bsp_sddac_pcm_push(uint8_t *buf, uint32_t size)
- {
- u32 res = utils_ring_buffer_write(&mic_buffer_cb, buf, size);
- if (!is_playing) {
- bsp_sddac_kick();
- }
- return res;
- }
- void bsp_sddac_kick(void)
- {
- if (!is_playing) {
- sddac_buf_ptr = (u8 *)sddac_buf;
- is_playing = 1;
- if (utils_ring_buffer_read(&mic_buffer_cb, sddac_buf_ptr, SAMPLE_2_PCM16_BYTE(SDDAC_PACKET_SIZE))) {
- printf("[SDDAC] start\n");
- sddac_cmd(ENABLE);
- }
- }
- }
- #endif // AUDIO_OUT_LOCAL_DEBUG
|