rp2040js 0.17.16 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/clock/clock.d.ts +11 -11
  3. package/dist/cjs/clock/clock.js +2 -2
  4. package/dist/cjs/clock/mock-clock.d.ts +17 -17
  5. package/dist/cjs/clock/mock-clock.js +52 -52
  6. package/dist/cjs/clock/realtime-clock.d.ts +23 -23
  7. package/dist/cjs/clock/realtime-clock.js +73 -73
  8. package/dist/cjs/cortex-m0-core.d.ts +87 -87
  9. package/dist/cjs/cortex-m0-core.js +1251 -1251
  10. package/dist/cjs/gdb/gdb-connection.d.ts +11 -11
  11. package/dist/cjs/gdb/gdb-connection.js +57 -57
  12. package/dist/cjs/gdb/gdb-server.d.ts +23 -23
  13. package/dist/cjs/gdb/gdb-server.js +232 -232
  14. package/dist/cjs/gdb/gdb-tcp-server.d.ts +10 -10
  15. package/dist/cjs/gdb/gdb-tcp-server.js +34 -34
  16. package/dist/cjs/gdb/gdb-utils.d.ts +9 -9
  17. package/dist/cjs/gdb/gdb-utils.js +48 -48
  18. package/dist/cjs/gpio-pin.d.ts +56 -56
  19. package/dist/cjs/gpio-pin.js +216 -216
  20. package/dist/cjs/index.d.ts +11 -11
  21. package/dist/cjs/index.js +36 -36
  22. package/dist/cjs/interpolator.d.ts +36 -36
  23. package/dist/cjs/interpolator.js +150 -150
  24. package/dist/cjs/irq.d.ts +29 -29
  25. package/dist/cjs/irq.js +33 -33
  26. package/dist/cjs/peripherals/adc.d.ts +52 -52
  27. package/dist/cjs/peripherals/adc.js +261 -261
  28. package/dist/cjs/peripherals/busctrl.d.ts +10 -10
  29. package/dist/cjs/peripherals/busctrl.js +84 -84
  30. package/dist/cjs/peripherals/clocks.d.ts +9 -9
  31. package/dist/cjs/peripherals/clocks.js +42 -42
  32. package/dist/cjs/peripherals/dma.d.ts +109 -109
  33. package/dist/cjs/peripherals/dma.js +520 -520
  34. package/dist/cjs/peripherals/i2c.d.ts +54 -54
  35. package/dist/cjs/peripherals/i2c.js +458 -458
  36. package/dist/cjs/peripherals/io.d.ts +11 -11
  37. package/dist/cjs/peripherals/io.js +100 -100
  38. package/dist/cjs/peripherals/pads.d.ts +13 -13
  39. package/dist/cjs/peripherals/pads.js +58 -58
  40. package/dist/cjs/peripherals/peripheral.d.ts +22 -22
  41. package/dist/cjs/peripherals/peripheral.js +61 -61
  42. package/dist/cjs/peripherals/pio.d.ts +120 -120
  43. package/dist/cjs/peripherals/pio.js +1086 -1086
  44. package/dist/cjs/peripherals/ppb.d.ts +25 -25
  45. package/dist/cjs/peripherals/ppb.js +229 -229
  46. package/dist/cjs/peripherals/pwm.d.ts +65 -65
  47. package/dist/cjs/peripherals/pwm.js +372 -372
  48. package/dist/cjs/peripherals/reset.d.ts +8 -8
  49. package/dist/cjs/peripherals/reset.js +40 -40
  50. package/dist/cjs/peripherals/rtc.d.ts +10 -10
  51. package/dist/cjs/peripherals/rtc.js +74 -74
  52. package/dist/cjs/peripherals/spi.d.ts +38 -30
  53. package/dist/cjs/peripherals/spi.js +240 -218
  54. package/dist/cjs/peripherals/ssi.d.ts +6 -6
  55. package/dist/cjs/peripherals/ssi.js +43 -43
  56. package/dist/cjs/peripherals/syscfg.d.ts +5 -5
  57. package/dist/cjs/peripherals/syscfg.js +26 -26
  58. package/dist/cjs/peripherals/sysinfo.d.ts +4 -4
  59. package/dist/cjs/peripherals/sysinfo.js +22 -22
  60. package/dist/cjs/peripherals/tbman.d.ts +4 -4
  61. package/dist/cjs/peripherals/tbman.js +17 -17
  62. package/dist/cjs/peripherals/timer.d.ts +18 -18
  63. package/dist/cjs/peripherals/timer.js +156 -156
  64. package/dist/cjs/peripherals/uart.d.ts +31 -28
  65. package/dist/cjs/peripherals/uart.js +132 -135
  66. package/dist/cjs/peripherals/usb.d.ts +29 -29
  67. package/dist/cjs/peripherals/usb.js +309 -309
  68. package/dist/cjs/rp2040.d.ts +71 -71
  69. package/dist/cjs/rp2040.js +361 -346
  70. package/dist/cjs/sio.d.ts +21 -21
  71. package/dist/cjs/sio.js +425 -425
  72. package/dist/cjs/usb/cdc.d.ts +20 -20
  73. package/dist/cjs/usb/cdc.js +126 -126
  74. package/dist/cjs/usb/interfaces.d.ts +47 -47
  75. package/dist/cjs/usb/interfaces.js +46 -46
  76. package/dist/cjs/usb/setup.d.ts +5 -5
  77. package/dist/cjs/usb/setup.js +53 -53
  78. package/dist/cjs/utils/assembler.d.ts +79 -79
  79. package/dist/cjs/utils/assembler.js +328 -328
  80. package/dist/cjs/utils/bit.d.ts +3 -3
  81. package/dist/cjs/utils/bit.js +15 -15
  82. package/dist/cjs/utils/fifo.d.ts +15 -15
  83. package/dist/cjs/utils/fifo.js +56 -56
  84. package/dist/cjs/utils/logging.d.ts +23 -23
  85. package/dist/cjs/utils/logging.js +48 -48
  86. package/dist/cjs/utils/pio-assembler.d.ts +45 -45
  87. package/dist/cjs/utils/pio-assembler.js +87 -87
  88. package/dist/cjs/utils/time.d.ts +2 -2
  89. package/dist/cjs/utils/time.js +32 -32
  90. package/dist/cjs/utils/timer32.d.ts +57 -57
  91. package/dist/cjs/utils/timer32.js +208 -208
  92. package/dist/esm/clock/clock.d.ts +11 -11
  93. package/dist/esm/clock/clock.js +1 -1
  94. package/dist/esm/clock/mock-clock.d.ts +17 -17
  95. package/dist/esm/clock/mock-clock.js +47 -47
  96. package/dist/esm/clock/realtime-clock.d.ts +23 -23
  97. package/dist/esm/clock/realtime-clock.js +68 -68
  98. package/dist/esm/cortex-m0-core.d.ts +87 -87
  99. package/dist/esm/cortex-m0-core.js +1247 -1247
  100. package/dist/esm/gdb/gdb-connection.d.ts +11 -11
  101. package/dist/esm/gdb/gdb-connection.js +53 -53
  102. package/dist/esm/gdb/gdb-server.d.ts +23 -23
  103. package/dist/esm/gdb/gdb-server.js +228 -228
  104. package/dist/esm/gdb/gdb-tcp-server.d.ts +10 -10
  105. package/dist/esm/gdb/gdb-tcp-server.js +30 -30
  106. package/dist/esm/gdb/gdb-utils.d.ts +9 -9
  107. package/dist/esm/gdb/gdb-utils.js +36 -36
  108. package/dist/esm/gpio-pin.d.ts +56 -56
  109. package/dist/esm/gpio-pin.js +212 -212
  110. package/dist/esm/index.d.ts +11 -11
  111. package/dist/esm/index.js +11 -11
  112. package/dist/esm/interpolator.d.ts +36 -36
  113. package/dist/esm/interpolator.js +145 -145
  114. package/dist/esm/irq.d.ts +29 -29
  115. package/dist/esm/irq.js +30 -30
  116. package/dist/esm/peripherals/adc.d.ts +52 -52
  117. package/dist/esm/peripherals/adc.js +257 -257
  118. package/dist/esm/peripherals/busctrl.d.ts +10 -10
  119. package/dist/esm/peripherals/busctrl.js +80 -80
  120. package/dist/esm/peripherals/clocks.d.ts +9 -9
  121. package/dist/esm/peripherals/clocks.js +38 -38
  122. package/dist/esm/peripherals/dma.d.ts +109 -109
  123. package/dist/esm/peripherals/dma.js +515 -515
  124. package/dist/esm/peripherals/i2c.d.ts +54 -54
  125. package/dist/esm/peripherals/i2c.js +454 -454
  126. package/dist/esm/peripherals/io.d.ts +11 -11
  127. package/dist/esm/peripherals/io.js +96 -96
  128. package/dist/esm/peripherals/pads.d.ts +13 -13
  129. package/dist/esm/peripherals/pads.js +54 -54
  130. package/dist/esm/peripherals/peripheral.d.ts +22 -22
  131. package/dist/esm/peripherals/peripheral.js +55 -55
  132. package/dist/esm/peripherals/pio.d.ts +120 -120
  133. package/dist/esm/peripherals/pio.js +1081 -1081
  134. package/dist/esm/peripherals/ppb.d.ts +25 -25
  135. package/dist/esm/peripherals/ppb.js +225 -225
  136. package/dist/esm/peripherals/pwm.d.ts +65 -65
  137. package/dist/esm/peripherals/pwm.js +368 -368
  138. package/dist/esm/peripherals/reset.d.ts +8 -8
  139. package/dist/esm/peripherals/reset.js +36 -36
  140. package/dist/esm/peripherals/rtc.d.ts +10 -10
  141. package/dist/esm/peripherals/rtc.js +70 -70
  142. package/dist/esm/peripherals/spi.d.ts +38 -30
  143. package/dist/esm/peripherals/spi.js +236 -214
  144. package/dist/esm/peripherals/ssi.d.ts +6 -6
  145. package/dist/esm/peripherals/ssi.js +39 -39
  146. package/dist/esm/peripherals/syscfg.d.ts +5 -5
  147. package/dist/esm/peripherals/syscfg.js +22 -22
  148. package/dist/esm/peripherals/sysinfo.d.ts +4 -4
  149. package/dist/esm/peripherals/sysinfo.js +18 -18
  150. package/dist/esm/peripherals/tbman.d.ts +4 -4
  151. package/dist/esm/peripherals/tbman.js +13 -13
  152. package/dist/esm/peripherals/timer.d.ts +18 -18
  153. package/dist/esm/peripherals/timer.js +152 -152
  154. package/dist/esm/peripherals/uart.d.ts +31 -28
  155. package/dist/esm/peripherals/uart.js +128 -131
  156. package/dist/esm/peripherals/usb.d.ts +29 -29
  157. package/dist/esm/peripherals/usb.js +305 -305
  158. package/dist/esm/rp2040.d.ts +71 -71
  159. package/dist/esm/rp2040.js +357 -342
  160. package/dist/esm/sio.d.ts +21 -21
  161. package/dist/esm/sio.js +421 -421
  162. package/dist/esm/usb/cdc.d.ts +20 -20
  163. package/dist/esm/usb/cdc.js +121 -121
  164. package/dist/esm/usb/interfaces.d.ts +47 -47
  165. package/dist/esm/usb/interfaces.js +43 -43
  166. package/dist/esm/usb/setup.d.ts +5 -5
  167. package/dist/esm/usb/setup.js +46 -46
  168. package/dist/esm/utils/assembler.d.ts +79 -79
  169. package/dist/esm/utils/assembler.js +245 -245
  170. package/dist/esm/utils/bit.d.ts +3 -3
  171. package/dist/esm/utils/bit.js +9 -9
  172. package/dist/esm/utils/fifo.d.ts +15 -15
  173. package/dist/esm/utils/fifo.js +52 -52
  174. package/dist/esm/utils/logging.d.ts +23 -23
  175. package/dist/esm/utils/logging.js +44 -44
  176. package/dist/esm/utils/pio-assembler.d.ts +45 -45
  177. package/dist/esm/utils/pio-assembler.js +75 -75
  178. package/dist/esm/utils/time.d.ts +2 -2
  179. package/dist/esm/utils/time.js +27 -27
  180. package/dist/esm/utils/timer32.d.ts +57 -57
  181. package/dist/esm/utils/timer32.js +203 -203
  182. package/package.json +34 -22
  183. package/dist/esm/package.json +0 -1
package/dist/esm/sio.js CHANGED
@@ -1,421 +1,421 @@
1
- import { Interpolator } from './interpolator';
2
- const CPUID = 0x000;
3
- // GPIO
4
- const GPIO_IN = 0x004; // Input value for GPIO pins
5
- const GPIO_HI_IN = 0x008; // Input value for QSPI pins
6
- const GPIO_OUT = 0x010; // GPIO output value
7
- const GPIO_OUT_SET = 0x014; // GPIO output value set
8
- const GPIO_OUT_CLR = 0x018; // GPIO output value clear
9
- const GPIO_OUT_XOR = 0x01c; // GPIO output value XOR
10
- const GPIO_OE = 0x020; // GPIO output enable
11
- const GPIO_OE_SET = 0x024; // GPIO output enable set
12
- const GPIO_OE_CLR = 0x028; // GPIO output enable clear
13
- const GPIO_OE_XOR = 0x02c; // GPIO output enable XOR
14
- const GPIO_HI_OUT = 0x030; // QSPI output value
15
- const GPIO_HI_OUT_SET = 0x034; // QSPI output value set
16
- const GPIO_HI_OUT_CLR = 0x038; // QSPI output value clear
17
- const GPIO_HI_OUT_XOR = 0x03c; // QSPI output value XOR
18
- const GPIO_HI_OE = 0x040; // QSPI output enable
19
- const GPIO_HI_OE_SET = 0x044; // QSPI output enable set
20
- const GPIO_HI_OE_CLR = 0x048; // QSPI output enable clear
21
- const GPIO_HI_OE_XOR = 0x04c; // QSPI output enable XOR
22
- const GPIO_MASK = 0x3fffffff;
23
- //HARDWARE DIVIDER
24
- const DIV_UDIVIDEND = 0x060; // Divider unsigned dividend
25
- const DIV_UDIVISOR = 0x064; // Divider unsigned divisor
26
- const DIV_SDIVIDEND = 0x068; // Divider signed dividend
27
- const DIV_SDIVISOR = 0x06c; // Divider signed divisor
28
- const DIV_QUOTIENT = 0x070; // Divider result quotient
29
- const DIV_REMAINDER = 0x074; //Divider result remainder
30
- const DIV_CSR = 0x078;
31
- //INTERPOLATOR
32
- const INTERP0_ACCUM0 = 0x080; // Read/write access to accumulator 0
33
- const INTERP0_ACCUM1 = 0x084; // Read/write access to accumulator 1
34
- const INTERP0_BASE0 = 0x088; // Read/write access to BASE0 register
35
- const INTERP0_BASE1 = 0x08c; // Read/write access to BASE1 register
36
- const INTERP0_BASE2 = 0x090; // Read/write access to BASE2 register
37
- const INTERP0_POP_LANE0 = 0x094; // Read LANE0 result, and simultaneously write lane results to both accumulators (POP)
38
- const INTERP0_POP_LANE1 = 0x098; // Read LANE1 result, and simultaneously write lane results to both accumulators (POP)
39
- const INTERP0_POP_FULL = 0x09c; // Read FULL result, and simultaneously write lane results to both accumulators (POP)
40
- const INTERP0_PEEK_LANE0 = 0x0a0; // Read LANE0 result, without altering any internal state (PEEK)
41
- const INTERP0_PEEK_LANE1 = 0x0a4; // Read LANE1 result, without altering any internal state (PEEK)
42
- const INTERP0_PEEK_FULL = 0x0a8; // Read FULL result, without altering any internal state (PEEK)
43
- const INTERP0_CTRL_LANE0 = 0x0ac; // Control register for lane 0
44
- const INTERP0_CTRL_LANE1 = 0x0b0; // Control register for lane 1
45
- const INTERP0_ACCUM0_ADD = 0x0b4; // Values written here are atomically added to ACCUM0
46
- const INTERP0_ACCUM1_ADD = 0x0b8; // Values written here are atomically added to ACCUM1
47
- const INTERP0_BASE_1AND0 = 0x0bc; // On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously
48
- const INTERP1_ACCUM0 = 0x0c0; // Read/write access to accumulator 0
49
- const INTERP1_ACCUM1 = 0x0c4; // Read/write access to accumulator 1
50
- const INTERP1_BASE0 = 0x0c8; // Read/write access to BASE0 register
51
- const INTERP1_BASE1 = 0x0cc; // Read/write access to BASE1 register
52
- const INTERP1_BASE2 = 0x0d0; // Read/write access to BASE2 register
53
- const INTERP1_POP_LANE0 = 0x0d4; // Read LANE0 result, and simultaneously write lane results to both accumulators (POP)
54
- const INTERP1_POP_LANE1 = 0x0d8; // Read LANE1 result, and simultaneously write lane results to both accumulators (POP)
55
- const INTERP1_POP_FULL = 0x0dc; // Read FULL result, and simultaneously write lane results to both accumulators (POP)
56
- const INTERP1_PEEK_LANE0 = 0x0e0; // Read LANE0 result, without altering any internal state (PEEK)
57
- const INTERP1_PEEK_LANE1 = 0x0e4; // Read LANE1 result, without altering any internal state (PEEK)
58
- const INTERP1_PEEK_FULL = 0x0e8; // Read FULL result, without altering any internal state (PEEK)
59
- const INTERP1_CTRL_LANE0 = 0x0ec; // Control register for lane 0
60
- const INTERP1_CTRL_LANE1 = 0x0f0; // Control register for lane 1
61
- const INTERP1_ACCUM0_ADD = 0x0f4; // Values written here are atomically added to ACCUM0
62
- const INTERP1_ACCUM1_ADD = 0x0f8; // Values written here are atomically added to ACCUM1
63
- const INTERP1_BASE_1AND0 = 0x0fc; // On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously
64
- //SPINLOCK
65
- const SPINLOCK_ST = 0x5c;
66
- const SPINLOCK0 = 0x100;
67
- const SPINLOCK31 = 0x17c;
68
- export class RPSIO {
69
- constructor(rp2040) {
70
- this.rp2040 = rp2040;
71
- this.gpioValue = 0;
72
- this.gpioOutputEnable = 0;
73
- this.qspiGpioValue = 0;
74
- this.qspiGpioOutputEnable = 0;
75
- this.divDividend = 0;
76
- this.divDivisor = 1;
77
- this.divQuotient = 0;
78
- this.divRemainder = 0;
79
- this.divCSR = 0;
80
- this.spinLock = 0;
81
- this.interp0 = new Interpolator(0);
82
- this.interp1 = new Interpolator(1);
83
- }
84
- updateHardwareDivider(signed) {
85
- if (this.divDivisor == 0) {
86
- this.divQuotient = this.divDividend > 0 ? -1 : 1;
87
- this.divRemainder = this.divDividend;
88
- }
89
- else {
90
- if (signed) {
91
- this.divQuotient = (this.divDividend | 0) / (this.divDivisor | 0);
92
- this.divRemainder = (this.divDividend | 0) % (this.divDivisor | 0);
93
- }
94
- else {
95
- this.divQuotient = (this.divDividend >>> 0) / (this.divDivisor >>> 0);
96
- this.divRemainder = (this.divDividend >>> 0) % (this.divDivisor >>> 0);
97
- }
98
- }
99
- this.divCSR = 0b11;
100
- this.rp2040.core.cycles += 8;
101
- }
102
- readUint32(offset) {
103
- if (offset >= SPINLOCK0 && offset <= SPINLOCK31) {
104
- const bitIndexMask = 1 << ((offset - SPINLOCK0) / 4);
105
- if (this.spinLock & bitIndexMask) {
106
- return 0;
107
- }
108
- else {
109
- this.spinLock |= bitIndexMask;
110
- return bitIndexMask;
111
- }
112
- }
113
- switch (offset) {
114
- case GPIO_IN:
115
- return this.rp2040.gpioValues;
116
- case GPIO_HI_IN: {
117
- const { qspi } = this.rp2040;
118
- let result = 0;
119
- for (let qspiIndex = 0; qspiIndex < qspi.length; qspiIndex++) {
120
- if (qspi[qspiIndex].inputValue) {
121
- result |= 1 << qspiIndex;
122
- }
123
- }
124
- return result;
125
- }
126
- case GPIO_OUT:
127
- return this.gpioValue;
128
- case GPIO_OE:
129
- return this.gpioOutputEnable;
130
- case GPIO_HI_OUT:
131
- return this.qspiGpioValue;
132
- case GPIO_HI_OE:
133
- return this.qspiGpioOutputEnable;
134
- case GPIO_OUT_SET:
135
- case GPIO_OUT_CLR:
136
- case GPIO_OUT_XOR:
137
- case GPIO_OE_SET:
138
- case GPIO_OE_CLR:
139
- case GPIO_OE_XOR:
140
- case GPIO_HI_OUT_SET:
141
- case GPIO_HI_OUT_CLR:
142
- case GPIO_HI_OUT_XOR:
143
- case GPIO_HI_OE_SET:
144
- case GPIO_HI_OE_CLR:
145
- case GPIO_HI_OE_XOR:
146
- return 0; // TODO verify with silicone
147
- case CPUID:
148
- // Returns the current CPU core id (always 0 for now)
149
- return 0;
150
- case SPINLOCK_ST:
151
- return this.spinLock;
152
- case DIV_UDIVIDEND:
153
- return this.divDividend;
154
- case DIV_SDIVIDEND:
155
- return this.divDividend;
156
- case DIV_UDIVISOR:
157
- return this.divDivisor;
158
- case DIV_SDIVISOR:
159
- return this.divDivisor;
160
- case DIV_QUOTIENT:
161
- this.divCSR &= ~0b10;
162
- return this.divQuotient;
163
- case DIV_REMAINDER:
164
- return this.divRemainder;
165
- case DIV_CSR:
166
- return this.divCSR;
167
- case INTERP0_ACCUM0:
168
- return this.interp0.accum0;
169
- case INTERP0_ACCUM1:
170
- return this.interp0.accum1;
171
- case INTERP0_BASE0:
172
- return this.interp0.base0;
173
- case INTERP0_BASE1:
174
- return this.interp0.base1;
175
- case INTERP0_BASE2:
176
- return this.interp0.base2;
177
- case INTERP0_CTRL_LANE0:
178
- return this.interp0.ctrl0;
179
- case INTERP0_CTRL_LANE1:
180
- return this.interp0.ctrl1;
181
- case INTERP0_PEEK_LANE0:
182
- return this.interp0.result0;
183
- case INTERP0_PEEK_LANE1:
184
- return this.interp0.result1;
185
- case INTERP0_PEEK_FULL:
186
- return this.interp0.result2;
187
- case INTERP0_POP_LANE0: {
188
- const value = this.interp0.result0;
189
- this.interp0.writeback();
190
- return value;
191
- }
192
- case INTERP0_POP_LANE1: {
193
- const value = this.interp0.result1;
194
- this.interp0.writeback();
195
- return value;
196
- }
197
- case INTERP0_POP_FULL: {
198
- const value = this.interp0.result2;
199
- this.interp0.writeback();
200
- return value;
201
- }
202
- case INTERP0_ACCUM0_ADD:
203
- return this.interp0.smresult0;
204
- case INTERP0_ACCUM1_ADD:
205
- return this.interp0.smresult1;
206
- case INTERP1_ACCUM0:
207
- return this.interp1.accum0;
208
- case INTERP1_ACCUM1:
209
- return this.interp1.accum1;
210
- case INTERP1_BASE0:
211
- return this.interp1.base0;
212
- case INTERP1_BASE1:
213
- return this.interp1.base1;
214
- case INTERP1_BASE2:
215
- return this.interp1.base2;
216
- case INTERP1_CTRL_LANE0:
217
- return this.interp1.ctrl0;
218
- case INTERP1_CTRL_LANE1:
219
- return this.interp1.ctrl1;
220
- case INTERP1_PEEK_LANE0:
221
- return this.interp1.result0;
222
- case INTERP1_PEEK_LANE1:
223
- return this.interp1.result1;
224
- case INTERP1_PEEK_FULL:
225
- return this.interp1.result2;
226
- case INTERP1_POP_LANE0: {
227
- const value = this.interp1.result0;
228
- this.interp1.writeback();
229
- return value;
230
- }
231
- case INTERP1_POP_LANE1: {
232
- const value = this.interp1.result1;
233
- this.interp1.writeback();
234
- return value;
235
- }
236
- case INTERP1_POP_FULL: {
237
- const value = this.interp1.result2;
238
- this.interp1.writeback();
239
- return value;
240
- }
241
- case INTERP1_ACCUM0_ADD:
242
- return this.interp1.smresult0;
243
- case INTERP1_ACCUM1_ADD:
244
- return this.interp1.smresult1;
245
- }
246
- console.warn(`Read from invalid SIO address: ${offset.toString(16)}`);
247
- return 0xffffffff;
248
- }
249
- writeUint32(offset, value) {
250
- if (offset >= SPINLOCK0 && offset <= SPINLOCK31) {
251
- const bitIndexMask = ~(1 << ((offset - SPINLOCK0) / 4));
252
- this.spinLock &= bitIndexMask;
253
- return;
254
- }
255
- const prevGpioValue = this.gpioValue;
256
- const prevGpioOutputEnable = this.gpioOutputEnable;
257
- switch (offset) {
258
- case GPIO_OUT:
259
- this.gpioValue = value & GPIO_MASK;
260
- break;
261
- case GPIO_OUT_SET:
262
- this.gpioValue |= value & GPIO_MASK;
263
- break;
264
- case GPIO_OUT_CLR:
265
- this.gpioValue &= ~value;
266
- break;
267
- case GPIO_OUT_XOR:
268
- this.gpioValue ^= value & GPIO_MASK;
269
- break;
270
- case GPIO_OE:
271
- this.gpioOutputEnable = value & GPIO_MASK;
272
- break;
273
- case GPIO_OE_SET:
274
- this.gpioOutputEnable |= value & GPIO_MASK;
275
- break;
276
- case GPIO_OE_CLR:
277
- this.gpioOutputEnable &= ~value;
278
- break;
279
- case GPIO_OE_XOR:
280
- this.gpioOutputEnable ^= value & GPIO_MASK;
281
- break;
282
- case GPIO_HI_OUT:
283
- this.qspiGpioValue = value & GPIO_MASK;
284
- break;
285
- case GPIO_HI_OUT_SET:
286
- this.qspiGpioValue |= value & GPIO_MASK;
287
- break;
288
- case GPIO_HI_OUT_CLR:
289
- this.qspiGpioValue &= ~value;
290
- break;
291
- case GPIO_HI_OUT_XOR:
292
- this.qspiGpioValue ^= value & GPIO_MASK;
293
- break;
294
- case GPIO_HI_OE:
295
- this.qspiGpioOutputEnable = value & GPIO_MASK;
296
- break;
297
- case GPIO_HI_OE_SET:
298
- this.qspiGpioOutputEnable |= value & GPIO_MASK;
299
- break;
300
- case GPIO_HI_OE_CLR:
301
- this.qspiGpioOutputEnable &= ~value;
302
- break;
303
- case GPIO_HI_OE_XOR:
304
- this.qspiGpioOutputEnable ^= value & GPIO_MASK;
305
- break;
306
- case DIV_UDIVIDEND:
307
- this.divDividend = value;
308
- this.updateHardwareDivider(false);
309
- break;
310
- case DIV_SDIVIDEND:
311
- this.divDividend = value;
312
- this.updateHardwareDivider(true);
313
- break;
314
- case DIV_UDIVISOR:
315
- this.divDivisor = value;
316
- this.updateHardwareDivider(false);
317
- break;
318
- case DIV_SDIVISOR:
319
- this.divDivisor = value;
320
- this.updateHardwareDivider(true);
321
- break;
322
- case DIV_QUOTIENT:
323
- this.divQuotient = value;
324
- this.divCSR = 0b11;
325
- break;
326
- case DIV_REMAINDER:
327
- this.divRemainder = value;
328
- this.divCSR = 0b11;
329
- break;
330
- case INTERP0_ACCUM0:
331
- this.interp0.accum0 = value;
332
- this.interp0.update();
333
- break;
334
- case INTERP0_ACCUM1:
335
- this.interp0.accum1 = value;
336
- this.interp0.update();
337
- break;
338
- case INTERP0_BASE0:
339
- this.interp0.base0 = value;
340
- this.interp0.update();
341
- break;
342
- case INTERP0_BASE1:
343
- this.interp0.base1 = value;
344
- this.interp0.update();
345
- break;
346
- case INTERP0_BASE2:
347
- this.interp0.base2 = value;
348
- this.interp0.update();
349
- break;
350
- case INTERP0_CTRL_LANE0:
351
- this.interp0.ctrl0 = value;
352
- this.interp0.update();
353
- break;
354
- case INTERP0_CTRL_LANE1:
355
- this.interp0.ctrl1 = value;
356
- this.interp0.update();
357
- break;
358
- case INTERP0_ACCUM0_ADD:
359
- this.interp0.accum0 += value;
360
- this.interp0.update();
361
- break;
362
- case INTERP0_ACCUM1_ADD:
363
- this.interp0.accum1 += value;
364
- this.interp0.update();
365
- break;
366
- case INTERP0_BASE_1AND0:
367
- this.interp0.setBase01(value);
368
- break;
369
- case INTERP1_ACCUM0:
370
- this.interp1.accum0 = value;
371
- this.interp1.update();
372
- break;
373
- case INTERP1_ACCUM1:
374
- this.interp1.accum1 = value;
375
- this.interp1.update();
376
- break;
377
- case INTERP1_BASE0:
378
- this.interp1.base0 = value;
379
- this.interp1.update();
380
- break;
381
- case INTERP1_BASE1:
382
- this.interp1.base1 = value;
383
- this.interp1.update();
384
- break;
385
- case INTERP1_BASE2:
386
- this.interp1.base2 = value;
387
- this.interp1.update();
388
- break;
389
- case INTERP1_CTRL_LANE0:
390
- this.interp1.ctrl0 = value;
391
- this.interp1.update();
392
- break;
393
- case INTERP1_CTRL_LANE1:
394
- this.interp1.ctrl1 = value;
395
- this.interp1.update();
396
- break;
397
- case INTERP1_ACCUM0_ADD:
398
- this.interp1.accum0 += value;
399
- this.interp1.update();
400
- break;
401
- case INTERP1_ACCUM1_ADD:
402
- this.interp1.accum1 += value;
403
- this.interp1.update();
404
- break;
405
- case INTERP1_BASE_1AND0:
406
- this.interp1.setBase01(value);
407
- break;
408
- default:
409
- console.warn(`Write to invalid SIO address: ${offset.toString(16)}, value=${value.toString(16)}`);
410
- }
411
- const pinsToUpdate = (this.gpioValue ^ prevGpioValue) | (this.gpioOutputEnable ^ prevGpioOutputEnable);
412
- if (pinsToUpdate) {
413
- const { gpio } = this.rp2040;
414
- for (let gpioIndex = 0; gpioIndex < gpio.length; gpioIndex++) {
415
- if (pinsToUpdate & (1 << gpioIndex)) {
416
- gpio[gpioIndex].checkForUpdates();
417
- }
418
- }
419
- }
420
- }
421
- }
1
+ import { Interpolator } from './interpolator.js';
2
+ const CPUID = 0x000;
3
+ // GPIO
4
+ const GPIO_IN = 0x004; // Input value for GPIO pins
5
+ const GPIO_HI_IN = 0x008; // Input value for QSPI pins
6
+ const GPIO_OUT = 0x010; // GPIO output value
7
+ const GPIO_OUT_SET = 0x014; // GPIO output value set
8
+ const GPIO_OUT_CLR = 0x018; // GPIO output value clear
9
+ const GPIO_OUT_XOR = 0x01c; // GPIO output value XOR
10
+ const GPIO_OE = 0x020; // GPIO output enable
11
+ const GPIO_OE_SET = 0x024; // GPIO output enable set
12
+ const GPIO_OE_CLR = 0x028; // GPIO output enable clear
13
+ const GPIO_OE_XOR = 0x02c; // GPIO output enable XOR
14
+ const GPIO_HI_OUT = 0x030; // QSPI output value
15
+ const GPIO_HI_OUT_SET = 0x034; // QSPI output value set
16
+ const GPIO_HI_OUT_CLR = 0x038; // QSPI output value clear
17
+ const GPIO_HI_OUT_XOR = 0x03c; // QSPI output value XOR
18
+ const GPIO_HI_OE = 0x040; // QSPI output enable
19
+ const GPIO_HI_OE_SET = 0x044; // QSPI output enable set
20
+ const GPIO_HI_OE_CLR = 0x048; // QSPI output enable clear
21
+ const GPIO_HI_OE_XOR = 0x04c; // QSPI output enable XOR
22
+ const GPIO_MASK = 0x3fffffff;
23
+ //HARDWARE DIVIDER
24
+ const DIV_UDIVIDEND = 0x060; // Divider unsigned dividend
25
+ const DIV_UDIVISOR = 0x064; // Divider unsigned divisor
26
+ const DIV_SDIVIDEND = 0x068; // Divider signed dividend
27
+ const DIV_SDIVISOR = 0x06c; // Divider signed divisor
28
+ const DIV_QUOTIENT = 0x070; // Divider result quotient
29
+ const DIV_REMAINDER = 0x074; //Divider result remainder
30
+ const DIV_CSR = 0x078;
31
+ //INTERPOLATOR
32
+ const INTERP0_ACCUM0 = 0x080; // Read/write access to accumulator 0
33
+ const INTERP0_ACCUM1 = 0x084; // Read/write access to accumulator 1
34
+ const INTERP0_BASE0 = 0x088; // Read/write access to BASE0 register
35
+ const INTERP0_BASE1 = 0x08c; // Read/write access to BASE1 register
36
+ const INTERP0_BASE2 = 0x090; // Read/write access to BASE2 register
37
+ const INTERP0_POP_LANE0 = 0x094; // Read LANE0 result, and simultaneously write lane results to both accumulators (POP)
38
+ const INTERP0_POP_LANE1 = 0x098; // Read LANE1 result, and simultaneously write lane results to both accumulators (POP)
39
+ const INTERP0_POP_FULL = 0x09c; // Read FULL result, and simultaneously write lane results to both accumulators (POP)
40
+ const INTERP0_PEEK_LANE0 = 0x0a0; // Read LANE0 result, without altering any internal state (PEEK)
41
+ const INTERP0_PEEK_LANE1 = 0x0a4; // Read LANE1 result, without altering any internal state (PEEK)
42
+ const INTERP0_PEEK_FULL = 0x0a8; // Read FULL result, without altering any internal state (PEEK)
43
+ const INTERP0_CTRL_LANE0 = 0x0ac; // Control register for lane 0
44
+ const INTERP0_CTRL_LANE1 = 0x0b0; // Control register for lane 1
45
+ const INTERP0_ACCUM0_ADD = 0x0b4; // Values written here are atomically added to ACCUM0
46
+ const INTERP0_ACCUM1_ADD = 0x0b8; // Values written here are atomically added to ACCUM1
47
+ const INTERP0_BASE_1AND0 = 0x0bc; // On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously
48
+ const INTERP1_ACCUM0 = 0x0c0; // Read/write access to accumulator 0
49
+ const INTERP1_ACCUM1 = 0x0c4; // Read/write access to accumulator 1
50
+ const INTERP1_BASE0 = 0x0c8; // Read/write access to BASE0 register
51
+ const INTERP1_BASE1 = 0x0cc; // Read/write access to BASE1 register
52
+ const INTERP1_BASE2 = 0x0d0; // Read/write access to BASE2 register
53
+ const INTERP1_POP_LANE0 = 0x0d4; // Read LANE0 result, and simultaneously write lane results to both accumulators (POP)
54
+ const INTERP1_POP_LANE1 = 0x0d8; // Read LANE1 result, and simultaneously write lane results to both accumulators (POP)
55
+ const INTERP1_POP_FULL = 0x0dc; // Read FULL result, and simultaneously write lane results to both accumulators (POP)
56
+ const INTERP1_PEEK_LANE0 = 0x0e0; // Read LANE0 result, without altering any internal state (PEEK)
57
+ const INTERP1_PEEK_LANE1 = 0x0e4; // Read LANE1 result, without altering any internal state (PEEK)
58
+ const INTERP1_PEEK_FULL = 0x0e8; // Read FULL result, without altering any internal state (PEEK)
59
+ const INTERP1_CTRL_LANE0 = 0x0ec; // Control register for lane 0
60
+ const INTERP1_CTRL_LANE1 = 0x0f0; // Control register for lane 1
61
+ const INTERP1_ACCUM0_ADD = 0x0f4; // Values written here are atomically added to ACCUM0
62
+ const INTERP1_ACCUM1_ADD = 0x0f8; // Values written here are atomically added to ACCUM1
63
+ const INTERP1_BASE_1AND0 = 0x0fc; // On write, the lower 16 bits go to BASE0, upper bits to BASE1 simultaneously
64
+ //SPINLOCK
65
+ const SPINLOCK_ST = 0x5c;
66
+ const SPINLOCK0 = 0x100;
67
+ const SPINLOCK31 = 0x17c;
68
+ export class RPSIO {
69
+ constructor(rp2040) {
70
+ this.rp2040 = rp2040;
71
+ this.gpioValue = 0;
72
+ this.gpioOutputEnable = 0;
73
+ this.qspiGpioValue = 0;
74
+ this.qspiGpioOutputEnable = 0;
75
+ this.divDividend = 0;
76
+ this.divDivisor = 1;
77
+ this.divQuotient = 0;
78
+ this.divRemainder = 0;
79
+ this.divCSR = 0;
80
+ this.spinLock = 0;
81
+ this.interp0 = new Interpolator(0);
82
+ this.interp1 = new Interpolator(1);
83
+ }
84
+ updateHardwareDivider(signed) {
85
+ if (this.divDivisor == 0) {
86
+ this.divQuotient = this.divDividend > 0 ? -1 : 1;
87
+ this.divRemainder = this.divDividend;
88
+ }
89
+ else {
90
+ if (signed) {
91
+ this.divQuotient = (this.divDividend | 0) / (this.divDivisor | 0);
92
+ this.divRemainder = (this.divDividend | 0) % (this.divDivisor | 0);
93
+ }
94
+ else {
95
+ this.divQuotient = (this.divDividend >>> 0) / (this.divDivisor >>> 0);
96
+ this.divRemainder = (this.divDividend >>> 0) % (this.divDivisor >>> 0);
97
+ }
98
+ }
99
+ this.divCSR = 0b11;
100
+ this.rp2040.core.cycles += 8;
101
+ }
102
+ readUint32(offset) {
103
+ if (offset >= SPINLOCK0 && offset <= SPINLOCK31) {
104
+ const bitIndexMask = 1 << ((offset - SPINLOCK0) / 4);
105
+ if (this.spinLock & bitIndexMask) {
106
+ return 0;
107
+ }
108
+ else {
109
+ this.spinLock |= bitIndexMask;
110
+ return bitIndexMask;
111
+ }
112
+ }
113
+ switch (offset) {
114
+ case GPIO_IN:
115
+ return this.rp2040.gpioValues;
116
+ case GPIO_HI_IN: {
117
+ const { qspi } = this.rp2040;
118
+ let result = 0;
119
+ for (let qspiIndex = 0; qspiIndex < qspi.length; qspiIndex++) {
120
+ if (qspi[qspiIndex].inputValue) {
121
+ result |= 1 << qspiIndex;
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+ case GPIO_OUT:
127
+ return this.gpioValue;
128
+ case GPIO_OE:
129
+ return this.gpioOutputEnable;
130
+ case GPIO_HI_OUT:
131
+ return this.qspiGpioValue;
132
+ case GPIO_HI_OE:
133
+ return this.qspiGpioOutputEnable;
134
+ case GPIO_OUT_SET:
135
+ case GPIO_OUT_CLR:
136
+ case GPIO_OUT_XOR:
137
+ case GPIO_OE_SET:
138
+ case GPIO_OE_CLR:
139
+ case GPIO_OE_XOR:
140
+ case GPIO_HI_OUT_SET:
141
+ case GPIO_HI_OUT_CLR:
142
+ case GPIO_HI_OUT_XOR:
143
+ case GPIO_HI_OE_SET:
144
+ case GPIO_HI_OE_CLR:
145
+ case GPIO_HI_OE_XOR:
146
+ return 0; // TODO verify with silicone
147
+ case CPUID:
148
+ // Returns the current CPU core id (always 0 for now)
149
+ return 0;
150
+ case SPINLOCK_ST:
151
+ return this.spinLock;
152
+ case DIV_UDIVIDEND:
153
+ return this.divDividend;
154
+ case DIV_SDIVIDEND:
155
+ return this.divDividend;
156
+ case DIV_UDIVISOR:
157
+ return this.divDivisor;
158
+ case DIV_SDIVISOR:
159
+ return this.divDivisor;
160
+ case DIV_QUOTIENT:
161
+ this.divCSR &= ~0b10;
162
+ return this.divQuotient;
163
+ case DIV_REMAINDER:
164
+ return this.divRemainder;
165
+ case DIV_CSR:
166
+ return this.divCSR;
167
+ case INTERP0_ACCUM0:
168
+ return this.interp0.accum0;
169
+ case INTERP0_ACCUM1:
170
+ return this.interp0.accum1;
171
+ case INTERP0_BASE0:
172
+ return this.interp0.base0;
173
+ case INTERP0_BASE1:
174
+ return this.interp0.base1;
175
+ case INTERP0_BASE2:
176
+ return this.interp0.base2;
177
+ case INTERP0_CTRL_LANE0:
178
+ return this.interp0.ctrl0;
179
+ case INTERP0_CTRL_LANE1:
180
+ return this.interp0.ctrl1;
181
+ case INTERP0_PEEK_LANE0:
182
+ return this.interp0.result0;
183
+ case INTERP0_PEEK_LANE1:
184
+ return this.interp0.result1;
185
+ case INTERP0_PEEK_FULL:
186
+ return this.interp0.result2;
187
+ case INTERP0_POP_LANE0: {
188
+ const value = this.interp0.result0;
189
+ this.interp0.writeback();
190
+ return value;
191
+ }
192
+ case INTERP0_POP_LANE1: {
193
+ const value = this.interp0.result1;
194
+ this.interp0.writeback();
195
+ return value;
196
+ }
197
+ case INTERP0_POP_FULL: {
198
+ const value = this.interp0.result2;
199
+ this.interp0.writeback();
200
+ return value;
201
+ }
202
+ case INTERP0_ACCUM0_ADD:
203
+ return this.interp0.smresult0;
204
+ case INTERP0_ACCUM1_ADD:
205
+ return this.interp0.smresult1;
206
+ case INTERP1_ACCUM0:
207
+ return this.interp1.accum0;
208
+ case INTERP1_ACCUM1:
209
+ return this.interp1.accum1;
210
+ case INTERP1_BASE0:
211
+ return this.interp1.base0;
212
+ case INTERP1_BASE1:
213
+ return this.interp1.base1;
214
+ case INTERP1_BASE2:
215
+ return this.interp1.base2;
216
+ case INTERP1_CTRL_LANE0:
217
+ return this.interp1.ctrl0;
218
+ case INTERP1_CTRL_LANE1:
219
+ return this.interp1.ctrl1;
220
+ case INTERP1_PEEK_LANE0:
221
+ return this.interp1.result0;
222
+ case INTERP1_PEEK_LANE1:
223
+ return this.interp1.result1;
224
+ case INTERP1_PEEK_FULL:
225
+ return this.interp1.result2;
226
+ case INTERP1_POP_LANE0: {
227
+ const value = this.interp1.result0;
228
+ this.interp1.writeback();
229
+ return value;
230
+ }
231
+ case INTERP1_POP_LANE1: {
232
+ const value = this.interp1.result1;
233
+ this.interp1.writeback();
234
+ return value;
235
+ }
236
+ case INTERP1_POP_FULL: {
237
+ const value = this.interp1.result2;
238
+ this.interp1.writeback();
239
+ return value;
240
+ }
241
+ case INTERP1_ACCUM0_ADD:
242
+ return this.interp1.smresult0;
243
+ case INTERP1_ACCUM1_ADD:
244
+ return this.interp1.smresult1;
245
+ }
246
+ console.warn(`Read from invalid SIO address: ${offset.toString(16)}`);
247
+ return 0xffffffff;
248
+ }
249
+ writeUint32(offset, value) {
250
+ if (offset >= SPINLOCK0 && offset <= SPINLOCK31) {
251
+ const bitIndexMask = ~(1 << ((offset - SPINLOCK0) / 4));
252
+ this.spinLock &= bitIndexMask;
253
+ return;
254
+ }
255
+ const prevGpioValue = this.gpioValue;
256
+ const prevGpioOutputEnable = this.gpioOutputEnable;
257
+ switch (offset) {
258
+ case GPIO_OUT:
259
+ this.gpioValue = value & GPIO_MASK;
260
+ break;
261
+ case GPIO_OUT_SET:
262
+ this.gpioValue |= value & GPIO_MASK;
263
+ break;
264
+ case GPIO_OUT_CLR:
265
+ this.gpioValue &= ~value;
266
+ break;
267
+ case GPIO_OUT_XOR:
268
+ this.gpioValue ^= value & GPIO_MASK;
269
+ break;
270
+ case GPIO_OE:
271
+ this.gpioOutputEnable = value & GPIO_MASK;
272
+ break;
273
+ case GPIO_OE_SET:
274
+ this.gpioOutputEnable |= value & GPIO_MASK;
275
+ break;
276
+ case GPIO_OE_CLR:
277
+ this.gpioOutputEnable &= ~value;
278
+ break;
279
+ case GPIO_OE_XOR:
280
+ this.gpioOutputEnable ^= value & GPIO_MASK;
281
+ break;
282
+ case GPIO_HI_OUT:
283
+ this.qspiGpioValue = value & GPIO_MASK;
284
+ break;
285
+ case GPIO_HI_OUT_SET:
286
+ this.qspiGpioValue |= value & GPIO_MASK;
287
+ break;
288
+ case GPIO_HI_OUT_CLR:
289
+ this.qspiGpioValue &= ~value;
290
+ break;
291
+ case GPIO_HI_OUT_XOR:
292
+ this.qspiGpioValue ^= value & GPIO_MASK;
293
+ break;
294
+ case GPIO_HI_OE:
295
+ this.qspiGpioOutputEnable = value & GPIO_MASK;
296
+ break;
297
+ case GPIO_HI_OE_SET:
298
+ this.qspiGpioOutputEnable |= value & GPIO_MASK;
299
+ break;
300
+ case GPIO_HI_OE_CLR:
301
+ this.qspiGpioOutputEnable &= ~value;
302
+ break;
303
+ case GPIO_HI_OE_XOR:
304
+ this.qspiGpioOutputEnable ^= value & GPIO_MASK;
305
+ break;
306
+ case DIV_UDIVIDEND:
307
+ this.divDividend = value;
308
+ this.updateHardwareDivider(false);
309
+ break;
310
+ case DIV_SDIVIDEND:
311
+ this.divDividend = value;
312
+ this.updateHardwareDivider(true);
313
+ break;
314
+ case DIV_UDIVISOR:
315
+ this.divDivisor = value;
316
+ this.updateHardwareDivider(false);
317
+ break;
318
+ case DIV_SDIVISOR:
319
+ this.divDivisor = value;
320
+ this.updateHardwareDivider(true);
321
+ break;
322
+ case DIV_QUOTIENT:
323
+ this.divQuotient = value;
324
+ this.divCSR = 0b11;
325
+ break;
326
+ case DIV_REMAINDER:
327
+ this.divRemainder = value;
328
+ this.divCSR = 0b11;
329
+ break;
330
+ case INTERP0_ACCUM0:
331
+ this.interp0.accum0 = value;
332
+ this.interp0.update();
333
+ break;
334
+ case INTERP0_ACCUM1:
335
+ this.interp0.accum1 = value;
336
+ this.interp0.update();
337
+ break;
338
+ case INTERP0_BASE0:
339
+ this.interp0.base0 = value;
340
+ this.interp0.update();
341
+ break;
342
+ case INTERP0_BASE1:
343
+ this.interp0.base1 = value;
344
+ this.interp0.update();
345
+ break;
346
+ case INTERP0_BASE2:
347
+ this.interp0.base2 = value;
348
+ this.interp0.update();
349
+ break;
350
+ case INTERP0_CTRL_LANE0:
351
+ this.interp0.ctrl0 = value;
352
+ this.interp0.update();
353
+ break;
354
+ case INTERP0_CTRL_LANE1:
355
+ this.interp0.ctrl1 = value;
356
+ this.interp0.update();
357
+ break;
358
+ case INTERP0_ACCUM0_ADD:
359
+ this.interp0.accum0 += value;
360
+ this.interp0.update();
361
+ break;
362
+ case INTERP0_ACCUM1_ADD:
363
+ this.interp0.accum1 += value;
364
+ this.interp0.update();
365
+ break;
366
+ case INTERP0_BASE_1AND0:
367
+ this.interp0.setBase01(value);
368
+ break;
369
+ case INTERP1_ACCUM0:
370
+ this.interp1.accum0 = value;
371
+ this.interp1.update();
372
+ break;
373
+ case INTERP1_ACCUM1:
374
+ this.interp1.accum1 = value;
375
+ this.interp1.update();
376
+ break;
377
+ case INTERP1_BASE0:
378
+ this.interp1.base0 = value;
379
+ this.interp1.update();
380
+ break;
381
+ case INTERP1_BASE1:
382
+ this.interp1.base1 = value;
383
+ this.interp1.update();
384
+ break;
385
+ case INTERP1_BASE2:
386
+ this.interp1.base2 = value;
387
+ this.interp1.update();
388
+ break;
389
+ case INTERP1_CTRL_LANE0:
390
+ this.interp1.ctrl0 = value;
391
+ this.interp1.update();
392
+ break;
393
+ case INTERP1_CTRL_LANE1:
394
+ this.interp1.ctrl1 = value;
395
+ this.interp1.update();
396
+ break;
397
+ case INTERP1_ACCUM0_ADD:
398
+ this.interp1.accum0 += value;
399
+ this.interp1.update();
400
+ break;
401
+ case INTERP1_ACCUM1_ADD:
402
+ this.interp1.accum1 += value;
403
+ this.interp1.update();
404
+ break;
405
+ case INTERP1_BASE_1AND0:
406
+ this.interp1.setBase01(value);
407
+ break;
408
+ default:
409
+ console.warn(`Write to invalid SIO address: ${offset.toString(16)}, value=${value.toString(16)}`);
410
+ }
411
+ const pinsToUpdate = (this.gpioValue ^ prevGpioValue) | (this.gpioOutputEnable ^ prevGpioOutputEnable);
412
+ if (pinsToUpdate) {
413
+ const { gpio } = this.rp2040;
414
+ for (let gpioIndex = 0; gpioIndex < gpio.length; gpioIndex++) {
415
+ if (pinsToUpdate & (1 << gpioIndex)) {
416
+ gpio[gpioIndex].checkForUpdates();
417
+ }
418
+ }
419
+ }
420
+ }
421
+ }