CS7000: audio: manage swap between internal and accessory mic/spk

This commit is contained in:
Silvano Seva 2025-02-16 19:16:57 +01:00
parent b69fa48dbb
commit cfeb2461b2
1 changed files with 34 additions and 3 deletions

View File

@ -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):