|
19 | 19 | #include "bindings/rp2pio/StateMachine.h" |
20 | 20 |
|
21 | 21 | const uint16_t i2s_program[] = { |
22 | | -// ; Load the next set of samples |
23 | | -// ; /--- LRCLK |
24 | | -// ; |/-- BCLK |
25 | | -// ; || |
26 | | -// pull noblock side 0b01 ; Loads OSR with the next FIFO value or X |
27 | | - 0x8880, |
28 | | -// mov x osr side 0b01 ; Save the new value in case we need it again |
29 | | - 0xa827, |
30 | | -// set y 14 side 0b01 |
31 | | - 0xe84e, |
32 | | -// bitloop1: |
33 | | -// out pins 1 side 0b00 [2] |
34 | | - 0x6201, |
35 | | -// jmp y-- bitloop1 side 0b01 [2] |
36 | | - 0x0a83, |
37 | | -// out pins 1 side 0b10 [2] |
38 | | - 0x7201, |
39 | | -// set y 14 side 0b11 [2] |
40 | | - 0xfa4e, |
41 | | -// bitloop0: |
42 | | -// out pins 1 side 0b10 [2] |
43 | | - 0x7201, |
44 | | -// jmp y-- bitloop0 side 0b11 [2] |
45 | | - 0x1a87, |
46 | | -// out pins 1 side 0b00 [2] |
47 | | - 0x6201 |
| 22 | + |
| 23 | +/* From i2s.pio: |
| 24 | +
|
| 25 | +.program i2s |
| 26 | +.side_set 2 |
| 27 | +
|
| 28 | +; Load the next set of samples |
| 29 | + ; /--- LRCLK |
| 30 | + ; |/-- BCLK |
| 31 | + ; || |
| 32 | + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X |
| 33 | + mov x osr side 0b11 ; Save the new value in case we need it again |
| 34 | + set y 14 side 0b11 |
| 35 | +bitloop1: |
| 36 | + out pins 1 side 0b10 [2] ; Right channel first |
| 37 | + jmp y-- bitloop1 side 0b11 [2] |
| 38 | + out pins 1 side 0b00 [2] |
| 39 | + set y 14 side 0b01 [2] |
| 40 | +bitloop0: |
| 41 | + out pins 1 side 0b00 [2] ; Then left channel |
| 42 | + jmp y-- bitloop0 side 0b01 [2] |
| 43 | + out pins 1 side 0b10 [2] |
| 44 | +*/ |
| 45 | + // Above assembled with pioasm. |
| 46 | + 0x9880, // 0: pull noblock side 3 |
| 47 | + 0xb827, // 1: mov x, osr side 3 |
| 48 | + 0xf84e, // 2: set y, 14 side 3 |
| 49 | + 0x7201, // 3: out pins, 1 side 2 [2] |
| 50 | + 0x1a83, // 4: jmp y--, 3 side 3 [2] |
| 51 | + 0x6201, // 5: out pins, 1 side 0 [2] |
| 52 | + 0xea4e, // 6: set y, 14 side 1 [2] |
| 53 | + 0x6201, // 7: out pins, 1 side 0 [2] |
| 54 | + 0x0a87, // 8: jmp y--, 7 side 1 [2] |
| 55 | + 0x7201, // 9: out pins, 1 side 2 [2] |
48 | 56 | }; |
49 | 57 |
|
| 58 | + |
50 | 59 | const uint16_t i2s_program_left_justified[] = { |
51 | | -// ; Load the next set of samples |
52 | | -// ; /--- LRCLK |
53 | | -// ; |/-- BCLK |
54 | | -// ; || |
55 | | -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X |
56 | | - 0x9880, |
57 | | -// mov x osr side 0b11 ; Save the new value in case we need it again |
58 | | - 0xb827, |
59 | | -// set y 14 side 0b11 |
60 | | - 0xf84e, |
61 | | -// bitloop1: |
62 | | -// out pins 1 side 0b00 [2] |
63 | | - 0x6201, |
64 | | -// jmp y-- bitloop1 side 0b01 [2] |
65 | | - 0x0a83, |
66 | | -// out pins 1 side 0b00 [2] |
67 | | - 0x6201, |
68 | | -// set y 14 side 0b01 [2] |
69 | | - 0xea4e, |
70 | | -// bitloop0: |
71 | | -// out pins 1 side 0b10 [2] |
72 | | - 0x7201, |
73 | | -// jmp y-- bitloop0 side 0b11 [2] |
74 | | - 0x1a87, |
75 | | -// out pins 1 side 0b10 [2] |
76 | | - 0x7201 |
| 60 | +/* From i2s_left.pio: |
| 61 | +
|
| 62 | +.program i2s |
| 63 | +.side_set 2 |
| 64 | +
|
| 65 | +; Load the next set of samples |
| 66 | + ; /--- LRCLK |
| 67 | + ; |/-- BCLK |
| 68 | + ; || |
| 69 | + pull noblock side 0b01 ; Loads OSR with the next FIFO value or X |
| 70 | + mov x osr side 0b01 ; Save the new value in case we need it again |
| 71 | + set y 14 side 0b01 |
| 72 | +bitloop1: |
| 73 | + out pins 1 side 0b10 [2] ; Right channel first |
| 74 | + jmp y-- bitloop1 side 0b11 [2] |
| 75 | + out pins 1 side 0b10 [2] |
| 76 | + set y 14 side 0b11 [2] |
| 77 | +bitloop0: |
| 78 | + out pins 1 side 0b00 [2] ; Then left channel |
| 79 | + jmp y-- bitloop0 side 0b01 [2] |
| 80 | + out pins 1 side 0b00 [2] |
| 81 | +*/ |
| 82 | + // Above assembled with pioasm. |
| 83 | + 0x8880, // 0: pull noblock side 1 |
| 84 | + 0xa827, // 1: mov x, osr side 1 |
| 85 | + 0xe84e, // 2: set y, 14 side 1 |
| 86 | + 0x7201, // 3: out pins, 1 side 2 [2] |
| 87 | + 0x1a83, // 4: jmp y--, 3 side 3 [2] |
| 88 | + 0x7201, // 5: out pins, 1 side 2 [2] |
| 89 | + 0xfa4e, // 6: set y, 14 side 3 [2] |
| 90 | + 0x6201, // 7: out pins, 1 side 0 [2] |
| 91 | + 0x0a87, // 8: jmp y--, 7 side 1 [2] |
| 92 | + 0x6201, // 9: out pins, 1 side 0 [2] |
77 | 93 | }; |
78 | 94 |
|
79 | 95 | // Another version of i2s_program with the LRCLC and BCLK pin swapped |
80 | 96 | const uint16_t i2s_program_swap[] = { |
81 | | -// ; Load the next set of samples |
82 | | -// ; /--- BCLK |
83 | | -// ; |/-- LRCLK |
84 | | -// ; || |
85 | | -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X |
86 | | - 0x9880, |
87 | | -// mov x osr side 0b11 ; Save the new value in case we need it again |
88 | | - 0xb827, |
89 | | -// set y 14 side 0b11 |
90 | | - 0xf84e, |
91 | | -// bitloop1: |
92 | | -// out pins 1 side 0b01 [2] |
93 | | - 0x6a01, |
94 | | -// jmp y-- bitloop1 side 0b11 [2] |
95 | | - 0x1a83, |
96 | | -// out pins 1 side 0b00 [2] |
97 | | - 0x6201, |
98 | | -// set y 14 side 0b10 [2] |
99 | | - 0xf24e, |
100 | | -// bitloop0: |
101 | | -// out pins 1 side 0b00 [2] |
102 | | - 0x6201, |
103 | | -// jmp y-- bitloop0 side 0b10 [2] |
104 | | - 0x1287, |
105 | | -// out pins 1 side 0b01 [2] |
106 | | - 0x6a01 |
| 97 | +/* From i2s_swap.pio: |
| 98 | +
|
| 99 | +.program i2s |
| 100 | +.side_set 2 |
| 101 | +
|
| 102 | +; Load the next set of samples |
| 103 | + ; /--- BCLK |
| 104 | + ; |/-- LRCLK |
| 105 | + ; || |
| 106 | + pull noblock side 0b11 ; Loads OSR with the next FIFO value or X |
| 107 | + mov x osr side 0b11 ; Save the new value in case we need it again |
| 108 | + set y 14 side 0b11 |
| 109 | +bitloop1: |
| 110 | + out pins 1 side 0b01 [2] ; Right channel first |
| 111 | + jmp y-- bitloop1 side 0b11 [2] |
| 112 | + out pins 1 side 0b00 [2] |
| 113 | + set y 14 side 0b10 [2] |
| 114 | +bitloop0: |
| 115 | + out pins 1 side 0b00 [2] ; Then left channel |
| 116 | + jmp y-- bitloop0 side 0b10 [2] |
| 117 | + out pins 1 side 0b01 [2] |
| 118 | +*/ |
| 119 | + // Above assembled with pioasm. |
| 120 | + 0x9880, // 0: pull noblock side 3 |
| 121 | + 0xb827, // 1: mov x, osr side 3 |
| 122 | + 0xf84e, // 2: set y, 14 side 3 |
| 123 | + 0x6a01, // 3: out pins, 1 side 1 [2] |
| 124 | + 0x1a83, // 4: jmp y--, 3 side 3 [2] |
| 125 | + 0x6201, // 5: out pins, 1 side 0 [2] |
| 126 | + 0xf24e, // 6: set y, 14 side 2 [2] |
| 127 | + 0x6201, // 7: out pins, 1 side 0 [2] |
| 128 | + 0x1287, // 8: jmp y--, 7 side 2 [2] |
| 129 | + 0x6a01, // 9: out pins, 1 side 1 [2] |
107 | 130 | }; |
108 | 131 |
|
109 | 132 | // Another version of i2s_program_left_justified with the LRCLC and BCLK pin |
110 | 133 | // swapped. |
111 | 134 | const uint16_t i2s_program_left_justified_swap[] = { |
112 | | -// ; Load the next set of samples |
113 | | -// ; /--- BCLK |
114 | | -// ; |/-- LRCLK |
115 | | -// ; || |
116 | | -// pull noblock side 0b11 ; Loads OSR with the next FIFO value or X |
117 | | - 0x9880, |
118 | | -// mov x osr side 0b11 ; Save the new value in case we need it again |
119 | | - 0xb827, |
120 | | -// set y 14 side 0b11 |
121 | | - 0xf84e, |
122 | | -// bitloop1: |
123 | | -// out pins 1 side 0b00 [2] |
124 | | - 0x6201, |
125 | | -// jmp y-- bitloop1 side 0b10 [2] |
126 | | - 0x1283, |
127 | | -// out pins 1 side 0b00 [2] |
128 | | - 0x6201, |
129 | | -// set y 14 side 0b10 [2] |
130 | | - 0xf24e, |
131 | | -// bitloop0: |
132 | | -// out pins 1 side 0b01 [2] |
133 | | - 0x6a01, |
134 | | -// jmp y-- bitloop0 side 0b11 [2] |
135 | | - 0x1a87, |
136 | | -// out pins 1 side 0b01 [2] |
137 | | - 0x6a01 |
| 135 | +/* From i2s_swap_left.pio: |
| 136 | +
|
| 137 | +.program i2s |
| 138 | +.side_set 2 |
| 139 | +
|
| 140 | +; Load the next set of samples |
| 141 | + ; /--- BCLK |
| 142 | + ; |/-- LRCLK |
| 143 | + ; || |
| 144 | + pull noblock side 0b10 ; Loads OSR with the next FIFO value or X |
| 145 | + mov x osr side 0b10 ; Save the new value in case we need it again |
| 146 | + set y 14 side 0b10 |
| 147 | +bitloop1: |
| 148 | + out pins 1 side 0b01 [2] ; Right channel first |
| 149 | + jmp y-- bitloop1 side 0b11 [2] |
| 150 | + out pins 1 side 0b01 [2] |
| 151 | + set y 14 side 0b11 [2] |
| 152 | +bitloop0: |
| 153 | + out pins 1 side 0b00 [2] ; Then left channel |
| 154 | + jmp y-- bitloop0 side 0b10 [2] |
| 155 | + out pins 1 side 0b00 [2] |
| 156 | +*/ |
| 157 | + // Above assembled with pioasm. |
| 158 | + 0x9080, // 0: pull noblock side 2 |
| 159 | + 0xb027, // 1: mov x, osr side 2 |
| 160 | + 0xf04e, // 2: set y, 14 side 2 |
| 161 | + 0x6a01, // 3: out pins, 1 side 1 [2] |
| 162 | + 0x1a83, // 4: jmp y--, 3 side 3 [2] |
| 163 | + 0x6a01, // 5: out pins, 1 side 1 [2] |
| 164 | + 0xfa4e, // 6: set y, 14 side 3 [2] |
| 165 | + 0x6201, // 7: out pins, 1 side 0 [2] |
| 166 | + 0x1287, // 8: jmp y--, 7 side 2 [2] |
| 167 | + 0x6201, // 9: out pins, 1 side 0 [2] |
138 | 168 | }; |
139 | 169 |
|
140 | 170 | void i2sout_reset(void) { |
|
0 commit comments