@@ -43,6 +43,41 @@ static inline pio_sm_config pio_i2s_out_program_get_default_config(uint offset)
43
43
}
44
44
#endif
45
45
46
+ // ---------------- //
47
+ // pio_i2s_out_swap //
48
+ // ---------------- //
49
+
50
+ #define pio_i2s_out_swap_wrap_target 0
51
+ #define pio_i2s_out_swap_wrap 7
52
+
53
+ static const uint16_t pio_i2s_out_swap_program_instructions [] = {
54
+ // .wrap_target
55
+ 0xb022 , // 0: mov x, y side 2
56
+ 0x6001 , // 1: out pins, 1 side 0
57
+ 0x1041 , // 2: jmp x--, 1 side 2
58
+ 0x6801 , // 3: out pins, 1 side 1
59
+ 0xb822 , // 4: mov x, y side 3
60
+ 0x6801 , // 5: out pins, 1 side 1
61
+ 0x1845 , // 6: jmp x--, 5 side 3
62
+ 0x6001 , // 7: out pins, 1 side 0
63
+ // .wrap
64
+ };
65
+
66
+ #if !PICO_NO_HARDWARE
67
+ static const struct pio_program pio_i2s_out_swap_program = {
68
+ .instructions = pio_i2s_out_swap_program_instructions ,
69
+ .length = 8 ,
70
+ .origin = -1 ,
71
+ };
72
+
73
+ static inline pio_sm_config pio_i2s_out_swap_program_get_default_config (uint offset ) {
74
+ pio_sm_config c = pio_get_default_sm_config ();
75
+ sm_config_set_wrap (& c , offset + pio_i2s_out_swap_wrap_target , offset + pio_i2s_out_swap_wrap );
76
+ sm_config_set_sideset (& c , 2 , false, false);
77
+ return c ;
78
+ }
79
+ #endif
80
+
46
81
// ------------ //
47
82
// pio_lsbj_out //
48
83
// ------------ //
@@ -78,6 +113,41 @@ static inline pio_sm_config pio_lsbj_out_program_get_default_config(uint offset)
78
113
}
79
114
#endif
80
115
116
+ // ----------------- //
117
+ // pio_lsbj_out_swap //
118
+ // ----------------- //
119
+
120
+ #define pio_lsbj_out_swap_wrap_target 0
121
+ #define pio_lsbj_out_swap_wrap 7
122
+
123
+ static const uint16_t pio_lsbj_out_swap_program_instructions [] = {
124
+ // .wrap_target
125
+ 0xb022 , // 0: mov x, y side 2
126
+ 0x6801 , // 1: out pins, 1 side 1
127
+ 0x1841 , // 2: jmp x--, 1 side 3
128
+ 0x6801 , // 3: out pins, 1 side 1
129
+ 0xb822 , // 4: mov x, y side 3
130
+ 0x6001 , // 5: out pins, 1 side 0
131
+ 0x1045 , // 6: jmp x--, 5 side 2
132
+ 0x6001 , // 7: out pins, 1 side 0
133
+ // .wrap
134
+ };
135
+
136
+ #if !PICO_NO_HARDWARE
137
+ static const struct pio_program pio_lsbj_out_swap_program = {
138
+ .instructions = pio_lsbj_out_swap_program_instructions ,
139
+ .length = 8 ,
140
+ .origin = -1 ,
141
+ };
142
+
143
+ static inline pio_sm_config pio_lsbj_out_swap_program_get_default_config (uint offset ) {
144
+ pio_sm_config c = pio_get_default_sm_config ();
145
+ sm_config_set_wrap (& c , offset + pio_lsbj_out_swap_wrap_target , offset + pio_lsbj_out_swap_wrap );
146
+ sm_config_set_sideset (& c , 2 , false, false);
147
+ return c ;
148
+ }
149
+ #endif
150
+
81
151
// ---------- //
82
152
// pio_i2s_in //
83
153
// ---------- //
@@ -111,12 +181,47 @@ static inline pio_sm_config pio_i2s_in_program_get_default_config(uint offset) {
111
181
sm_config_set_sideset (& c , 2 , false, false);
112
182
return c ;
113
183
}
184
+ #endif
185
+
186
+ // --------------- //
187
+ // pio_i2s_in_swap //
188
+ // --------------- //
189
+
190
+ #define pio_i2s_in_swap_wrap_target 0
191
+ #define pio_i2s_in_swap_wrap 7
114
192
115
- static inline void pio_i2s_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits ) {
193
+ static const uint16_t pio_i2s_in_swap_program_instructions [] = {
194
+ // .wrap_target
195
+ 0xa022 , // 0: mov x, y side 0
196
+ 0x5001 , // 1: in pins, 1 side 2
197
+ 0x0041 , // 2: jmp x--, 1 side 0
198
+ 0x5801 , // 3: in pins, 1 side 3
199
+ 0xa822 , // 4: mov x, y side 1
200
+ 0x5801 , // 5: in pins, 1 side 3
201
+ 0x0845 , // 6: jmp x--, 5 side 1
202
+ 0x5001 , // 7: in pins, 1 side 2
203
+ // .wrap
204
+ };
205
+
206
+ #if !PICO_NO_HARDWARE
207
+ static const struct pio_program pio_i2s_in_swap_program = {
208
+ .instructions = pio_i2s_in_swap_program_instructions ,
209
+ .length = 8 ,
210
+ .origin = -1 ,
211
+ };
212
+
213
+ static inline pio_sm_config pio_i2s_in_swap_program_get_default_config (uint offset ) {
214
+ pio_sm_config c = pio_get_default_sm_config ();
215
+ sm_config_set_wrap (& c , offset + pio_i2s_in_swap_wrap_target , offset + pio_i2s_in_swap_wrap );
216
+ sm_config_set_sideset (& c , 2 , false, false);
217
+ return c ;
218
+ }
219
+
220
+ static inline void pio_i2s_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap ) {
116
221
pio_gpio_init (pio , data_pin );
117
222
pio_gpio_init (pio , clock_pin_base );
118
223
pio_gpio_init (pio , clock_pin_base + 1 );
119
- pio_sm_config sm_config = pio_i2s_out_program_get_default_config (offset );
224
+ pio_sm_config sm_config = swap ? pio_i2s_out_swap_program_get_default_config ( offset ) : pio_i2s_out_program_get_default_config (offset );
120
225
sm_config_set_out_pins (& sm_config , data_pin , 1 );
121
226
sm_config_set_sideset_pins (& sm_config , clock_pin_base );
122
227
sm_config_set_out_shift (& sm_config , false, true, (bits <= 16 ) ? 2 * bits : bits );
@@ -127,11 +232,11 @@ static inline void pio_i2s_out_program_init(PIO pio, uint sm, uint offset, uint
127
232
pio_sm_set_pins (pio , sm , 0 ); // clear pins
128
233
pio_sm_exec (pio , sm , pio_encode_set (pio_y , bits - 2 ));
129
234
}
130
- static inline void pio_lsbj_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits ) {
235
+ static inline void pio_lsbj_out_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap ) {
131
236
pio_gpio_init (pio , data_pin );
132
237
pio_gpio_init (pio , clock_pin_base );
133
238
pio_gpio_init (pio , clock_pin_base + 1 );
134
- pio_sm_config sm_config = pio_lsbj_out_program_get_default_config (offset );
239
+ pio_sm_config sm_config = swap ? pio_lsbj_out_swap_program_get_default_config ( offset ) : pio_lsbj_out_program_get_default_config (offset );
135
240
sm_config_set_out_pins (& sm_config , data_pin , 1 );
136
241
sm_config_set_sideset_pins (& sm_config , clock_pin_base );
137
242
sm_config_set_out_shift (& sm_config , false, true, (bits <= 16 ) ? 2 * bits : bits );
@@ -142,11 +247,11 @@ static inline void pio_lsbj_out_program_init(PIO pio, uint sm, uint offset, uint
142
247
pio_sm_set_pins (pio , sm , 0 ); // clear pins
143
248
pio_sm_exec (pio , sm , pio_encode_set (pio_y , bits - 2 ));
144
249
}
145
- static inline void pio_i2s_in_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits ) {
250
+ static inline void pio_i2s_in_program_init (PIO pio , uint sm , uint offset , uint data_pin , uint clock_pin_base , uint bits , bool swap ) {
146
251
pio_gpio_init (pio , data_pin );
147
252
pio_gpio_init (pio , clock_pin_base );
148
253
pio_gpio_init (pio , clock_pin_base + 1 );
149
- pio_sm_config sm_config = pio_i2s_in_program_get_default_config (offset );
254
+ pio_sm_config sm_config = swap ? pio_i2s_in_swap_program_get_default_config ( offset ) : pio_i2s_in_program_get_default_config (offset );
150
255
sm_config_set_in_pins (& sm_config , data_pin );
151
256
sm_config_set_sideset_pins (& sm_config , clock_pin_base );
152
257
sm_config_set_in_shift (& sm_config , false, true, (bits <= 16 ) ? 2 * bits : bits );
@@ -159,3 +264,4 @@ static inline void pio_i2s_in_program_init(PIO pio, uint sm, uint offset, uint d
159
264
}
160
265
161
266
#endif
267
+
0 commit comments