CS7000: audio: manage swap between internal and accessory mic/spk
This commit is contained in:
parent
b69fa48dbb
commit
cfeb2461b2
|
|
@ -48,6 +48,24 @@ const struct audioDevice inputDevices[] =
|
||||||
{&stm32_adc_audio_driver, (const void *) ADC_MIC_CH, STM32_ADC_ADC2, SOURCE_MIC},
|
{&stm32_adc_audio_driver, (const void *) ADC_MIC_CH, STM32_ADC_ADC2, SOURCE_MIC},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool spkEnabled = false;
|
||||||
|
|
||||||
|
static inline void selectSpk()
|
||||||
|
{
|
||||||
|
if(spkEnabled == false)
|
||||||
|
{
|
||||||
|
gpioDev_set(INT_SPK_MUTE);
|
||||||
|
gpioDev_set(EXT_SPK_MUTE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Phone detect pin is active low
|
||||||
|
if(gpio_readPin(PHONE_DETECT) == 0)
|
||||||
|
gpioDev_clear(EXT_SPK_MUTE);
|
||||||
|
else
|
||||||
|
gpioDev_clear(INT_SPK_MUTE);
|
||||||
|
}
|
||||||
|
|
||||||
static void *audio_thread(void *arg)
|
static void *audio_thread(void *arg)
|
||||||
{
|
{
|
||||||
(void) arg;
|
(void) arg;
|
||||||
|
|
@ -58,6 +76,7 @@ static void *audio_thread(void *arg)
|
||||||
|
|
||||||
while(state.devStatus != SHUTDOWN)
|
while(state.devStatus != SHUTDOWN)
|
||||||
{
|
{
|
||||||
|
selectSpk();
|
||||||
Cx000dac_task();
|
Cx000dac_task();
|
||||||
|
|
||||||
now += 4;
|
now += 4;
|
||||||
|
|
@ -77,10 +96,16 @@ void audio_init()
|
||||||
gpio_setMode(C6K_CLK, ALTERNATE | ALTERNATE_FUNC(5));
|
gpio_setMode(C6K_CLK, ALTERNATE | ALTERNATE_FUNC(5));
|
||||||
gpio_setMode(C6K_MOSI, ALTERNATE | ALTERNATE_FUNC(5));
|
gpio_setMode(C6K_MOSI, ALTERNATE | ALTERNATE_FUNC(5));
|
||||||
gpio_setMode(C6K_MISO, ALTERNATE | ALTERNATE_FUNC(5));
|
gpio_setMode(C6K_MISO, ALTERNATE | ALTERNATE_FUNC(5));
|
||||||
|
gpio_setMode(PHONE_DETECT, INPUT_PULL_UP);
|
||||||
|
|
||||||
stm32dac_init(STM32_DAC_CH2, 2048);
|
stm32dac_init(STM32_DAC_CH2, 2048);
|
||||||
stm32adc_init(STM32_ADC_ADC2);
|
stm32adc_init(STM32_ADC_ADC2);
|
||||||
|
|
||||||
|
gpioDev_set(INT_SPK_MUTE);
|
||||||
|
gpioDev_set(EXT_SPK_MUTE);
|
||||||
|
gpioDev_clear(INT_MIC_SEL);
|
||||||
|
gpioDev_clear(EXT_MIC_SEL);
|
||||||
|
|
||||||
gpioDev_clear(C6K_SLEEP);
|
gpioDev_clear(C6K_SLEEP);
|
||||||
delayMs(10);
|
delayMs(10);
|
||||||
spiStm32_init(&c6000_spi, 11000000, SPI_FLAG_CPHA);
|
spiStm32_init(&c6000_spi, 11000000, SPI_FLAG_CPHA);
|
||||||
|
|
@ -119,8 +144,13 @@ void audio_connect(const enum AudioSource source, const enum AudioSink sink)
|
||||||
case PATH(SOURCE_MIC, SINK_SPK):
|
case PATH(SOURCE_MIC, SINK_SPK):
|
||||||
case PATH(SOURCE_MIC, SINK_RTX):
|
case PATH(SOURCE_MIC, SINK_RTX):
|
||||||
case PATH(SOURCE_MIC, SINK_MCU):
|
case PATH(SOURCE_MIC, SINK_MCU):
|
||||||
|
// Phone detect pin is active low
|
||||||
|
if(gpio_readPin(PHONE_DETECT) == 0)
|
||||||
|
gpioDev_set(EXT_MIC_SEL);
|
||||||
|
else
|
||||||
|
gpioDev_set(INT_MIC_SEL);
|
||||||
|
|
||||||
gpioDev_set(MIC_PWR_EN);
|
gpioDev_set(MIC_PWR_EN);
|
||||||
gpioDev_set(INT_MIC_SEL);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PATH(SOURCE_RTX, SINK_SPK):
|
case PATH(SOURCE_RTX, SINK_SPK):
|
||||||
|
|
@ -140,7 +170,7 @@ void audio_connect(const enum AudioSource source, const enum AudioSink sink)
|
||||||
// Anti-pop: unmute speaker after 10ms from amp. power on
|
// Anti-pop: unmute speaker after 10ms from amp. power on
|
||||||
gpioDev_set(AUDIO_AMP_EN);
|
gpioDev_set(AUDIO_AMP_EN);
|
||||||
sleepFor(0, 10);
|
sleepFor(0, 10);
|
||||||
gpioDev_clear(INT_SPK_MUTE);
|
spkEnabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,8 +180,8 @@ void audio_disconnect(const enum AudioSource source, const enum AudioSink sink)
|
||||||
|
|
||||||
if(sink == SINK_SPK)
|
if(sink == SINK_SPK)
|
||||||
{
|
{
|
||||||
gpioDev_set(INT_SPK_MUTE);
|
|
||||||
gpioDev_clear(AUDIO_AMP_EN);
|
gpioDev_clear(AUDIO_AMP_EN);
|
||||||
|
spkEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(path)
|
switch(path)
|
||||||
|
|
@ -161,6 +191,7 @@ void audio_disconnect(const enum AudioSource source, const enum AudioSink sink)
|
||||||
case PATH(SOURCE_MIC, SINK_MCU):
|
case PATH(SOURCE_MIC, SINK_MCU):
|
||||||
gpioDev_clear(MIC_PWR_EN);
|
gpioDev_clear(MIC_PWR_EN);
|
||||||
gpioDev_clear(INT_MIC_SEL);
|
gpioDev_clear(INT_MIC_SEL);
|
||||||
|
gpioDev_clear(EXT_MIC_SEL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PATH(SOURCE_RTX, SINK_SPK):
|
case PATH(SOURCE_RTX, SINK_SPK):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue