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},
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
(void) arg;
|
||||
|
|
@ -58,6 +76,7 @@ static void *audio_thread(void *arg)
|
|||
|
||||
while(state.devStatus != SHUTDOWN)
|
||||
{
|
||||
selectSpk();
|
||||
Cx000dac_task();
|
||||
|
||||
now += 4;
|
||||
|
|
@ -77,10 +96,16 @@ void audio_init()
|
|||
gpio_setMode(C6K_CLK, ALTERNATE | ALTERNATE_FUNC(5));
|
||||
gpio_setMode(C6K_MOSI, 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);
|
||||
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);
|
||||
delayMs(10);
|
||||
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_RTX):
|
||||
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(INT_MIC_SEL);
|
||||
break;
|
||||
|
||||
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
|
||||
gpioDev_set(AUDIO_AMP_EN);
|
||||
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)
|
||||
{
|
||||
gpioDev_set(INT_SPK_MUTE);
|
||||
gpioDev_clear(AUDIO_AMP_EN);
|
||||
spkEnabled = false;
|
||||
}
|
||||
|
||||
switch(path)
|
||||
|
|
@ -161,6 +191,7 @@ void audio_disconnect(const enum AudioSource source, const enum AudioSink sink)
|
|||
case PATH(SOURCE_MIC, SINK_MCU):
|
||||
gpioDev_clear(MIC_PWR_EN);
|
||||
gpioDev_clear(INT_MIC_SEL);
|
||||
gpioDev_clear(EXT_MIC_SEL);
|
||||
break;
|
||||
|
||||
case PATH(SOURCE_RTX, SINK_SPK):
|
||||
|
|
|
|||
Loading…
Reference in New Issue