From c73f2f3a2b1ef65dc50113a22aadc5a262a92e0f Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 24 Mar 2025 09:49:03 -0500 Subject: [PATCH] i2s: support swapped LRCK / BCK pins --- src/rp2_common/pico_audio_i2s/audio_i2s.c | 4 +++- src/rp2_common/pico_audio_i2s/audio_i2s.pio | 18 ++++++++++++++++++ .../pico_audio_i2s/include/pico/audio_i2s.h | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/rp2_common/pico_audio_i2s/audio_i2s.c b/src/rp2_common/pico_audio_i2s/audio_i2s.c index b9cbdcb..fa3a3f4 100644 --- a/src/rp2_common/pico_audio_i2s/audio_i2s.c +++ b/src/rp2_common/pico_audio_i2s/audio_i2s.c @@ -61,7 +61,9 @@ const audio_format_t *audio_i2s_setup(const audio_format_t *intended_audio_forma pio_sm_claim(audio_pio, sm); - uint offset = pio_add_program(audio_pio, &audio_i2s_program); + const struct pio_program *program = + config->clock_pin_swapped ? &audio_i2s_swapped_program : &audio_i2s_program; + uint offset = pio_add_program(audio_pio, program); audio_i2s_program_init(audio_pio, sm, offset, config->data_pin, config->clock_pin_base); diff --git a/src/rp2_common/pico_audio_i2s/audio_i2s.pio b/src/rp2_common/pico_audio_i2s/audio_i2s.pio index 59e0afc..034adc2 100644 --- a/src/rp2_common/pico_audio_i2s/audio_i2s.pio +++ b/src/rp2_common/pico_audio_i2s/audio_i2s.pio @@ -42,6 +42,24 @@ bitloop0: public entry_point: set x, 14 side 0b11 +.program audio_i2s_swapped +.side_set 2 + + ; /--- BCLK + ; |/-- LRCLK +bitloop1: ; || + out pins, 1 side 0b01 + jmp x-- bitloop1 side 0b11 + out pins, 1 side 0b00 + set x, 14 side 0b10 + +bitloop0: + out pins, 1 side 0b00 + jmp x-- bitloop0 side 0b10 + out pins, 1 side 0b01 +public entry_point: + set x, 14 side 0b11 + % c-sdk { static inline void audio_i2s_program_init(PIO pio, uint sm, uint offset, uint data_pin, uint clock_pin_base) { diff --git a/src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h b/src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h index 3e97d29..f79364e 100644 --- a/src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h +++ b/src/rp2_common/pico_audio_i2s/include/pico/audio_i2s.h @@ -115,6 +115,7 @@ typedef struct audio_i2s_config { uint8_t clock_pin_base; uint8_t dma_channel; uint8_t pio_sm; + bool clock_pin_swapped; } audio_i2s_config_t; /** \brief Set up system to output I2S audio