@@ -81,6 +81,95 @@ static inline pio_sm_config pio_i2s_out_program_get_default_config(uint offset)
8181}
8282#endif
8383
84+ // -------------------- //
85+ // pio_i2s_out_slave_16 //
86+ // -------------------- //
87+
88+ #define pio_i2s_out_slave_16_wrap_target 3
89+ #define pio_i2s_out_slave_16_wrap 12
90+ #define pio_i2s_out_slave_16_pio_version 0
91+
92+ static const uint16_t pio_i2s_out_slave_16_program_instructions [] = {
93+ 0x2020 , // 0: wait 0 pin, 0
94+ 0x20a0 , // 1: wait 1 pin, 0
95+ 0x00c0 , // 2: jmp pin, 0
96+ // .wrap_target
97+ 0x8080 , // 3: pull noblock
98+ 0x2020 , // 4: wait 0 pin, 0
99+ 0x6001 , // 5: out pins, 1
100+ 0x20a0 , // 6: wait 1 pin, 0
101+ 0x00c9 , // 7: jmp pin, 9
102+ 0x0004 , // 8: jmp 4
103+ 0x2020 , // 9: wait 0 pin, 0
104+ 0x6001 , // 10: out pins, 1
105+ 0x20a0 , // 11: wait 1 pin, 0
106+ 0x00c9 , // 12: jmp pin, 9
107+ // .wrap
108+ };
109+
110+ #if !PICO_NO_HARDWARE
111+ static const struct pio_program pio_i2s_out_slave_16_program = {
112+ .instructions = pio_i2s_out_slave_16_program_instructions ,
113+ .length = 13 ,
114+ .origin = -1 ,
115+ .pio_version = pio_i2s_out_slave_16_pio_version ,
116+ #if PICO_PIO_VERSION > 0
117+ .used_gpio_ranges = 0x0
118+ #endif
119+ };
120+
121+ static inline pio_sm_config pio_i2s_out_slave_16_program_get_default_config (uint offset ) {
122+ pio_sm_config c = pio_get_default_sm_config ();
123+ sm_config_set_wrap (& c , offset + pio_i2s_out_slave_16_wrap_target , offset + pio_i2s_out_slave_16_wrap );
124+ return c ;
125+ }
126+ #endif
127+
128+ // -------------------- //
129+ // pio_i2s_out_slave_32 //
130+ // -------------------- //
131+
132+ #define pio_i2s_out_slave_32_wrap_target 3
133+ #define pio_i2s_out_slave_32_wrap 13
134+ #define pio_i2s_out_slave_32_pio_version 0
135+
136+ static const uint16_t pio_i2s_out_slave_32_program_instructions [] = {
137+ 0x2020 , // 0: wait 0 pin, 0
138+ 0x20a0 , // 1: wait 1 pin, 0
139+ 0x00c0 , // 2: jmp pin, 0
140+ // .wrap_target
141+ 0x8080 , // 3: pull noblock
142+ 0x2020 , // 4: wait 0 pin, 0
143+ 0x6001 , // 5: out pins, 1
144+ 0x20a0 , // 6: wait 1 pin, 0
145+ 0x00ca , // 7: jmp pin, 10
146+ 0x0004 , // 8: jmp 4
147+ 0x8080 , // 9: pull noblock
148+ 0x2020 , // 10: wait 0 pin, 0
149+ 0x6001 , // 11: out pins, 1
150+ 0x20a0 , // 12: wait 1 pin, 0
151+ 0x00ca , // 13: jmp pin, 10
152+ // .wrap
153+ };
154+
155+ #if !PICO_NO_HARDWARE
156+ static const struct pio_program pio_i2s_out_slave_32_program = {
157+ .instructions = pio_i2s_out_slave_32_program_instructions ,
158+ .length = 14 ,
159+ .origin = -1 ,
160+ .pio_version = pio_i2s_out_slave_32_pio_version ,
161+ #if PICO_PIO_VERSION > 0
162+ .used_gpio_ranges = 0x0
163+ #endif
164+ };
165+
166+ static inline pio_sm_config pio_i2s_out_slave_32_program_get_default_config (uint offset ) {
167+ pio_sm_config c = pio_get_default_sm_config ();
168+ sm_config_set_wrap (& c , offset + pio_i2s_out_slave_32_wrap_target , offset + pio_i2s_out_slave_32_wrap );
169+ return c ;
170+ }
171+ #endif
172+
84173// ---------------- //
85174// pio_i2s_out_swap //
86175// ---------------- //
@@ -535,15 +624,31 @@ static inline void pio_i2s_out_program_init(PIO pio, uint sm, uint offset, uint
535624 sm_config_set_out_shift (& sm_config , false, true, (bits <= 16 ) ? 2 * bits : bits );
536625 sm_config_set_fifo_join (& sm_config , PIO_FIFO_JOIN_TX );
537626 pio_sm_init (pio , sm , offset , & sm_config );
538- //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base);
539- //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask);
540- //pio_sm_set_pins(pio, sm, 0); // clear pins
541627 pio_sm_set_consecutive_pindirs (pio , sm , data_pin , 1 , true);
542628 pio_sm_set_consecutive_pindirs (pio , sm , clock_pin_base , 2 , true);
543629 pio_sm_set_set_pins (pio , sm , data_pin , 1 );
544630 pio_sm_set_set_pins (pio , sm , clock_pin_base , 2 );
545631 pio_sm_exec (pio , sm , pio_encode_set (pio_y , bits - 2 ));
546632}
633+ static inline void pio_i2s_out_slave_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap ) {
634+ pio_gpio_init (pio , data_pin );
635+ pio_gpio_init (pio , clock_pin_base );
636+ pio_gpio_init (pio , clock_pin_base + 1 );
637+ // 16-bits does a pull every L+R frame. 24/32 bits do a pull every L or R side
638+ pio_sm_config sm_config = bits > 16 ? pio_i2s_out_slave_32_program_get_default_config (offset ) : pio_i2s_out_slave_16_program_get_default_config (offset ); //TBD swap ? pio_i2s_out_swap_program_get_default_config(offset) : pio_i2s_out_program_get_default_config(offset);
639+ sm_config_set_out_pins (& sm_config , data_pin , 1 );
640+ sm_config_set_in_pins (& sm_config , clock_pin_base );
641+ sm_config_set_in_pin_count (& sm_config , 2 ); // BLCK and LRCLK
642+ sm_config_set_jmp_pin (& sm_config , clock_pin_base + 1 );
643+ sm_config_set_out_shift (& sm_config , false, false, (bits <= 16 ) ? 2 * bits : bits );
644+ sm_config_set_fifo_join (& sm_config , PIO_FIFO_JOIN_TX );
645+ pio_sm_init (pio , sm , offset , & sm_config );
646+ pio_sm_set_consecutive_pindirs (pio , sm , data_pin , 1 , true);
647+ pio_sm_set_consecutive_pindirs (pio , sm , clock_pin_base , 2 , false);
648+ pio_sm_set_out_pins (pio , sm , data_pin , 1 );
649+ pio_sm_set_in_pins (pio , sm , clock_pin_base );
650+ pio_sm_exec (pio , sm , pio_encode_set (pio_x , 0 ));
651+ }
547652static inline void pio_tdm_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap , uint channels ) {
548653 pio_gpio_init (pio , data_pin );
549654 pio_gpio_init (pio , clock_pin_base );
0 commit comments