@@ -324,6 +324,49 @@ static inline pio_sm_config pio_i2s_in_program_get_default_config(uint offset) {
324324}
325325#endif
326326
327+ // ---------------- //
328+ // pio_i2s_in_slave //
329+ // ---------------- //
330+
331+ #define pio_i2s_in_slave_wrap_target 3
332+ #define pio_i2s_in_slave_wrap 11
333+ #define pio_i2s_in_slave_pio_version 0
334+
335+ static const uint16_t pio_i2s_in_slave_program_instructions [] = {
336+ 0x2021 , // 0: wait 0 pin, 1
337+ 0x20a1 , // 1: wait 1 pin, 1
338+ 0x00c0 , // 2: jmp pin, 0
339+ // .wrap_target
340+ 0x2021 , // 3: wait 0 pin, 1
341+ 0x20a1 , // 4: wait 1 pin, 1
342+ 0x4001 , // 5: in pins, 1
343+ 0x00c8 , // 6: jmp pin, 8
344+ 0x0003 , // 7: jmp 3
345+ 0x2021 , // 8: wait 0 pin, 1
346+ 0x20a1 , // 9: wait 1 pin, 1
347+ 0x4001 , // 10: in pins, 1
348+ 0x00c8 , // 11: jmp pin, 8
349+ // .wrap
350+ };
351+
352+ #if !PICO_NO_HARDWARE
353+ static const struct pio_program pio_i2s_in_slave_program = {
354+ .instructions = pio_i2s_in_slave_program_instructions ,
355+ .length = 12 ,
356+ .origin = -1 ,
357+ .pio_version = pio_i2s_in_slave_pio_version ,
358+ #if PICO_PIO_VERSION > 0
359+ .used_gpio_ranges = 0x0
360+ #endif
361+ };
362+
363+ static inline pio_sm_config pio_i2s_in_slave_program_get_default_config (uint offset ) {
364+ pio_sm_config c = pio_get_default_sm_config ();
365+ sm_config_set_wrap (& c , offset + pio_i2s_in_slave_wrap_target , offset + pio_i2s_in_slave_wrap );
366+ return c ;
367+ }
368+ #endif
369+
327370// ------------- //
328371// pio_i2s_inout //
329372// ------------- //
@@ -511,6 +554,21 @@ static inline void pio_i2s_in_program_init I2S_INIT_PARAMS {
511554 pio_sm_exec (pio , sm , pio_encode_in (pio_pins , bits )); // Shift in 1st L data
512555 pio_sm_exec (pio , sm , pio_encode_in (pio_pins , bits - 1 )); // Shift in 1st R data modulo one bit, avoiding bit shift from #2037
513556}
557+ static inline void pio_i2s_in_slave_program_init I2S_INIT_PARAMS {
558+ I2S_INIT_PARAMS_VOID ;
559+ // Note that the CLOCK_BASE pin is ignored. It's DIN, BCLK, LRCLK consecutive due to PIO limitations
560+ pio_gpio_init (pio , data_in_pin );
561+ pio_gpio_init (pio , data_in_pin + 1 );
562+ pio_gpio_init (pio , data_in_pin + 2 );
563+ pio_sm_config sm_config = pio_i2s_in_slave_program_get_default_config (offset );
564+ sm_config_set_in_pins (& sm_config , data_in_pin );
565+ sm_config_set_in_pin_count (& sm_config , 3 );
566+ sm_config_set_in_shift (& sm_config , false, true, (bits <= 16 ) ? 2 * bits : bits );
567+ sm_config_set_fifo_join (& sm_config , PIO_FIFO_JOIN_RX );
568+ sm_config_set_jmp_pin (& sm_config , data_in_pin + 2 );
569+ pio_sm_init (pio , sm , offset , & sm_config );
570+ pio_sm_set_consecutive_pindirs (pio , sm , data_in_pin , 3 , false);
571+ }
514572static inline void pio_i2s_inout_program_init I2S_INIT_PARAMS {
515573 I2S_INIT_PARAMS_VOID ;
516574 pio_gpio_init (pio , data_in_pin );
0 commit comments