From cfeb2461b2f9ff6ecefe950f9486a008403ee469 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sun, 16 Feb 2025 19:16:57 +0100 Subject: [PATCH] CS7000: audio: manage swap between internal and accessory mic/spk --- platform/drivers/audio/audio_CS7000.cpp | 37 +++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/platform/drivers/audio/audio_CS7000.cpp b/platform/drivers/audio/audio_CS7000.cpp index 81878e78..68546b1d 100644 --- a/platform/drivers/audio/audio_CS7000.cpp +++ b/platform/drivers/audio/audio_CS7000.cpp @@ -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):