@@ -106,6 +106,68 @@ static inline pio_sm_config pio_i2s_out_swap_program_get_default_config(uint off
106106}
107107#endif
108108
109+ // ----------- //
110+ // pio_tdm_out //
111+ // ----------- //
112+
113+ #define pio_tdm_out_wrap_target 0
114+ #define pio_tdm_out_wrap 3
115+
116+ static const uint16_t pio_tdm_out_program_instructions [] = {
117+ // .wrap_target
118+ 0xb822 , // 0: mov x, y side 3
119+ 0x6001 , // 1: out pins, 1 side 0
120+ 0x0841 , // 2: jmp x--, 1 side 1
121+ 0x7001 , // 3: out pins, 1 side 2
122+ // .wrap
123+ };
124+
125+ #if !PICO_NO_HARDWARE
126+ static const struct pio_program pio_tdm_out_program = {
127+ .instructions = pio_tdm_out_program_instructions ,
128+ .length = 4 ,
129+ .origin = -1 ,
130+ };
131+
132+ static inline pio_sm_config pio_tdm_out_program_get_default_config (uint offset ) {
133+ pio_sm_config c = pio_get_default_sm_config ();
134+ sm_config_set_wrap (& c , offset + pio_tdm_out_wrap_target , offset + pio_tdm_out_wrap );
135+ sm_config_set_sideset (& c , 2 , false, false);
136+ return c ;
137+ }
138+ #endif
139+
140+ // ---------------- //
141+ // pio_tdm_out_swap //
142+ // ---------------- //
143+
144+ #define pio_tdm_out_swap_wrap_target 0
145+ #define pio_tdm_out_swap_wrap 3
146+
147+ static const uint16_t pio_tdm_out_swap_program_instructions [] = {
148+ // .wrap_target
149+ 0xb822 , // 0: mov x, y side 3
150+ 0x6001 , // 1: out pins, 1 side 0
151+ 0x1041 , // 2: jmp x--, 1 side 2
152+ 0x6801 , // 3: out pins, 1 side 1
153+ // .wrap
154+ };
155+
156+ #if !PICO_NO_HARDWARE
157+ static const struct pio_program pio_tdm_out_swap_program = {
158+ .instructions = pio_tdm_out_swap_program_instructions ,
159+ .length = 4 ,
160+ .origin = -1 ,
161+ };
162+
163+ static inline pio_sm_config pio_tdm_out_swap_program_get_default_config (uint offset ) {
164+ pio_sm_config c = pio_get_default_sm_config ();
165+ sm_config_set_wrap (& c , offset + pio_tdm_out_swap_wrap_target , offset + pio_tdm_out_swap_wrap );
166+ sm_config_set_sideset (& c , 2 , false, false);
167+ return c ;
168+ }
169+ #endif
170+
109171// ------------ //
110172// pio_lsbj_out //
111173// ------------ //
@@ -267,6 +329,26 @@ static inline void pio_i2s_out_program_init(PIO pio, uint sm, uint offset, uint
267329 pio_sm_set_pins (pio , sm , 0 ); // clear pins
268330 pio_sm_exec (pio , sm , pio_encode_set (pio_y , bits - 2 ));
269331}
332+ static 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 ) {
333+ pio_gpio_init (pio , data_pin );
334+ pio_gpio_init (pio , clock_pin_base );
335+ pio_gpio_init (pio , clock_pin_base + 1 );
336+ pio_sm_config sm_config = swap ? pio_tdm_out_swap_program_get_default_config (offset ) : pio_tdm_out_program_get_default_config (offset );
337+ sm_config_set_out_pins (& sm_config , data_pin , 1 );
338+ sm_config_set_sideset_pins (& sm_config , clock_pin_base );
339+ sm_config_set_out_shift (& sm_config , false, true, 32 );
340+ sm_config_set_fifo_join (& sm_config , PIO_FIFO_JOIN_TX );
341+ pio_sm_init (pio , sm , offset , & sm_config );
342+ uint pin_mask = (1u << data_pin ) | (3u << clock_pin_base );
343+ pio_sm_set_pindirs_with_mask (pio , sm , pin_mask , pin_mask );
344+ pio_sm_set_pins (pio , sm , 0 ); // clear pins
345+ // Can't set constant > 31, so push and pop/mov
346+ pio_sm_put_blocking (pio , sm , bits * channels - 2 );
347+ pio_sm_exec (pio , sm , pio_encode_pull (false, false));
348+ pio_sm_exec (pio , sm , pio_encode_mov (pio_y , pio_osr ));
349+ // Need to make OSR believe there's nothing left to shift out, or the 1st word will be the count we just passed in, not a sample
350+ pio_sm_exec (pio , sm , pio_encode_out (pio_osr , 32 ));
351+ }
270352static inline void pio_lsbj_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap ) {
271353 pio_gpio_init (pio , data_pin );
272354 pio_gpio_init (pio , clock_pin_base );
@@ -299,3 +381,4 @@ static inline void pio_i2s_in_program_init(PIO pio, uint sm, uint offset, uint d
299381}
300382
301383#endif
384+
0 commit comments