|
@@ -13,8 +13,9 @@
|
|
|
#define DBG_LVL DBG_INFO
|
|
|
#include <rtdbg.h>
|
|
|
|
|
|
-#define SAI_AUDIO_FREQUENCY_44K ((uint32_t)44100u)
|
|
|
#define SAI_AUDIO_FREQUENCY_48K ((uint32_t)48000u)
|
|
|
+#define SAI_AUDIO_FREQUENCY_44K ((uint32_t)44100u)
|
|
|
+#define SAI_AUDIO_FREQUENCY_38K ((uint32_t)38000u)
|
|
|
#define TX_FIFO_SIZE (1024)
|
|
|
|
|
|
struct sound_device
|
|
@@ -22,10 +23,11 @@ struct sound_device
|
|
|
struct rt_audio_device audio;
|
|
|
struct rt_audio_configure replay_config;
|
|
|
rt_sem_t semaphore;
|
|
|
- rt_thread_t thread;
|
|
|
+ rt_thread_t thread;
|
|
|
rt_uint8_t *tx_fifo;
|
|
|
rt_uint8_t *rx_fifo;
|
|
|
rt_uint8_t volume;
|
|
|
+ rt_uint8_t dma_to_aubuf;
|
|
|
};
|
|
|
|
|
|
static struct sound_device snd_dev = {0};
|
|
@@ -120,16 +122,15 @@ void audio_sem_pend(void)
|
|
|
|
|
|
void saia_frequency_set(uint32_t frequency)
|
|
|
{
|
|
|
+ DACDIGCON0 &= ~(0xf << 2);
|
|
|
if (frequency == SAI_AUDIO_FREQUENCY_48K) {
|
|
|
- DACDIGCON0 |= BIT(1);
|
|
|
- DACDIGCON0 &= ~(0xf << 2);
|
|
|
- DACDIGCON0 |= BIT(6);
|
|
|
+ DACDIGCON0 |= (0 << 2);
|
|
|
} else if (frequency == SAI_AUDIO_FREQUENCY_44K) {
|
|
|
- DACDIGCON0 &= ~BIT(1);
|
|
|
- DACDIGCON0 &= ~(0xf << 2);
|
|
|
- DACDIGCON0 |= BIT(1);
|
|
|
- DACDIGCON0 |= BIT(6);
|
|
|
+ DACDIGCON0 |= (1 << 2);
|
|
|
+ } else if (frequency == SAI_AUDIO_FREQUENCY_38K) {
|
|
|
+ DACDIGCON0 |= (2 << 2);
|
|
|
}
|
|
|
+ DACDIGCON0 |= BIT(6);
|
|
|
}
|
|
|
|
|
|
void saia_channels_set(uint8_t channels)
|
|
@@ -271,6 +272,10 @@ static rt_err_t sound_configure(struct rt_audio_device *audio, struct rt_audio_c
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ case AUDIO_MIXER_EXTEND:
|
|
|
+ snd_dev->dma_to_aubuf = caps->udata.value;
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
result = -RT_ERROR;
|
|
|
break;
|
|
@@ -349,6 +354,7 @@ static rt_err_t sound_init(struct rt_audio_device *audio)
|
|
|
/* set default params */
|
|
|
saia_frequency_set(snd_dev->replay_config.samplerate);
|
|
|
saia_channels_set(snd_dev->replay_config.channels);
|
|
|
+ saia_volume_set(snd_dev->volume);
|
|
|
|
|
|
return RT_EOK;
|
|
|
}
|
|
@@ -368,9 +374,7 @@ static rt_err_t sound_start(struct rt_audio_device *audio, int stream)
|
|
|
AUBUFSIZE |= (TX_FIFO_SIZE / 8) << 16;
|
|
|
AUBUFSTARTADDR = DMA_ADR(snd_dev->rx_fifo);
|
|
|
|
|
|
- DACDIGCON0 = BIT(0) | BIT(10); // (0x01<<2)
|
|
|
- DACVOLCON = 0x7fff; // -60DB
|
|
|
- DACVOLCON |= BIT(20);
|
|
|
+ DACDIGCON0 |= BIT(0) | BIT(10); // (0x01<<2)
|
|
|
|
|
|
AUBUFCON |= BIT(1);
|
|
|
}
|
|
@@ -380,13 +384,11 @@ static rt_err_t sound_start(struct rt_audio_device *audio, int stream)
|
|
|
|
|
|
static rt_err_t sound_stop(struct rt_audio_device *audio, int stream)
|
|
|
{
|
|
|
- struct sound_device *snd_dev = RT_NULL;
|
|
|
-
|
|
|
RT_ASSERT(audio != RT_NULL);
|
|
|
- snd_dev = (struct sound_device *)audio->parent.user_data;
|
|
|
|
|
|
if (stream == AUDIO_STREAM_REPLAY)
|
|
|
{
|
|
|
+ DACDIGCON0 = 0;
|
|
|
AUBUFCON &= ~BIT(4);
|
|
|
LOG_D("close sound device");
|
|
|
}
|
|
@@ -463,7 +465,7 @@ static void audio_thread_entry(void *parameter)
|
|
|
{
|
|
|
while (1)
|
|
|
{
|
|
|
- if (snd_dev.audio.replay->activated == RT_TRUE) {
|
|
|
+ if ((snd_dev.dma_to_aubuf == RT_FALSE) && (snd_dev.audio.replay->activated == RT_TRUE)) {
|
|
|
rt_audio_tx_complete(&snd_dev.audio);
|
|
|
} else {
|
|
|
rt_thread_mdelay(50);
|
|
@@ -506,7 +508,7 @@ static int rt_hw_sound_init(void)
|
|
|
RT_NULL,
|
|
|
1024,
|
|
|
20, // must equal or lower than tshell priority
|
|
|
- 5
|
|
|
+ 1
|
|
|
);
|
|
|
|
|
|
if (snd_dev.thread != RT_NULL)
|
|
@@ -516,7 +518,7 @@ static int rt_hw_sound_init(void)
|
|
|
|
|
|
/* init default configuration */
|
|
|
{
|
|
|
- snd_dev.replay_config.samplerate = 48000;
|
|
|
+ snd_dev.replay_config.samplerate = SAI_AUDIO_FREQUENCY_48K;
|
|
|
snd_dev.replay_config.channels = 2;
|
|
|
snd_dev.replay_config.samplebits = 16;
|
|
|
snd_dev.volume = 55;
|