rp2040js 0.17.17 → 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.
- package/dist/cjs/clock/clock.d.ts +11 -11
- package/dist/cjs/clock/clock.js +2 -2
- package/dist/cjs/clock/mock-clock.d.ts +17 -17
- package/dist/cjs/clock/mock-clock.js +52 -52
- package/dist/cjs/clock/realtime-clock.d.ts +23 -23
- package/dist/cjs/clock/realtime-clock.js +73 -73
- package/dist/cjs/cortex-m0-core.d.ts +87 -87
- package/dist/cjs/cortex-m0-core.js +1251 -1251
- package/dist/cjs/gdb/gdb-connection.d.ts +11 -11
- package/dist/cjs/gdb/gdb-connection.js +57 -57
- package/dist/cjs/gdb/gdb-server.d.ts +23 -23
- package/dist/cjs/gdb/gdb-server.js +232 -232
- package/dist/cjs/gdb/gdb-tcp-server.d.ts +10 -10
- package/dist/cjs/gdb/gdb-tcp-server.js +34 -34
- package/dist/cjs/gdb/gdb-utils.d.ts +9 -9
- package/dist/cjs/gdb/gdb-utils.js +48 -48
- package/dist/cjs/gpio-pin.d.ts +56 -56
- package/dist/cjs/gpio-pin.js +216 -216
- package/dist/cjs/index.d.ts +11 -11
- package/dist/cjs/index.js +36 -36
- package/dist/cjs/interpolator.d.ts +36 -36
- package/dist/cjs/interpolator.js +150 -150
- package/dist/cjs/irq.d.ts +29 -29
- package/dist/cjs/irq.js +33 -33
- package/dist/cjs/peripherals/adc.d.ts +52 -52
- package/dist/cjs/peripherals/adc.js +261 -261
- package/dist/cjs/peripherals/busctrl.d.ts +10 -10
- package/dist/cjs/peripherals/busctrl.js +84 -84
- package/dist/cjs/peripherals/clocks.d.ts +9 -9
- package/dist/cjs/peripherals/clocks.js +42 -42
- package/dist/cjs/peripherals/dma.d.ts +109 -109
- package/dist/cjs/peripherals/dma.js +520 -520
- package/dist/cjs/peripherals/i2c.d.ts +54 -54
- package/dist/cjs/peripherals/i2c.js +458 -458
- package/dist/cjs/peripherals/io.d.ts +11 -11
- package/dist/cjs/peripherals/io.js +100 -100
- package/dist/cjs/peripherals/pads.d.ts +13 -13
- package/dist/cjs/peripherals/pads.js +58 -58
- package/dist/cjs/peripherals/peripheral.d.ts +22 -22
- package/dist/cjs/peripherals/peripheral.js +61 -61
- package/dist/cjs/peripherals/pio.d.ts +120 -120
- package/dist/cjs/peripherals/pio.js +1086 -1086
- package/dist/cjs/peripherals/ppb.d.ts +25 -25
- package/dist/cjs/peripherals/ppb.js +229 -229
- package/dist/cjs/peripherals/pwm.d.ts +65 -65
- package/dist/cjs/peripherals/pwm.js +372 -372
- package/dist/cjs/peripherals/reset.d.ts +8 -8
- package/dist/cjs/peripherals/reset.js +40 -40
- package/dist/cjs/peripherals/rtc.d.ts +10 -10
- package/dist/cjs/peripherals/rtc.js +74 -74
- package/dist/cjs/peripherals/spi.d.ts +38 -38
- package/dist/cjs/peripherals/spi.js +240 -240
- package/dist/cjs/peripherals/ssi.d.ts +6 -6
- package/dist/cjs/peripherals/ssi.js +43 -43
- package/dist/cjs/peripherals/syscfg.d.ts +5 -5
- package/dist/cjs/peripherals/syscfg.js +26 -26
- package/dist/cjs/peripherals/sysinfo.d.ts +4 -4
- package/dist/cjs/peripherals/sysinfo.js +22 -22
- package/dist/cjs/peripherals/tbman.d.ts +4 -4
- package/dist/cjs/peripherals/tbman.js +17 -17
- package/dist/cjs/peripherals/timer.d.ts +18 -18
- package/dist/cjs/peripherals/timer.js +156 -156
- package/dist/cjs/peripherals/uart.d.ts +31 -31
- package/dist/cjs/peripherals/uart.js +132 -132
- package/dist/cjs/peripherals/usb.d.ts +29 -29
- package/dist/cjs/peripherals/usb.js +309 -309
- package/dist/cjs/rp2040.d.ts +71 -71
- package/dist/cjs/rp2040.js +361 -361
- package/dist/cjs/sio.d.ts +21 -21
- package/dist/cjs/sio.js +425 -425
- package/dist/cjs/usb/cdc.d.ts +20 -20
- package/dist/cjs/usb/cdc.js +126 -126
- package/dist/cjs/usb/interfaces.d.ts +47 -47
- package/dist/cjs/usb/interfaces.js +46 -46
- package/dist/cjs/usb/setup.d.ts +5 -5
- package/dist/cjs/usb/setup.js +53 -53
- package/dist/cjs/utils/assembler.d.ts +79 -79
- package/dist/cjs/utils/assembler.js +328 -328
- package/dist/cjs/utils/bit.d.ts +3 -3
- package/dist/cjs/utils/bit.js +15 -15
- package/dist/cjs/utils/fifo.d.ts +15 -15
- package/dist/cjs/utils/fifo.js +56 -56
- package/dist/cjs/utils/logging.d.ts +23 -23
- package/dist/cjs/utils/logging.js +48 -48
- package/dist/cjs/utils/pio-assembler.d.ts +45 -45
- package/dist/cjs/utils/pio-assembler.js +87 -87
- package/dist/cjs/utils/time.d.ts +2 -2
- package/dist/cjs/utils/time.js +32 -32
- package/dist/cjs/utils/timer32.d.ts +57 -57
- package/dist/cjs/utils/timer32.js +208 -208
- package/dist/esm/clock/clock.d.ts +11 -11
- package/dist/esm/clock/clock.js +1 -1
- package/dist/esm/clock/mock-clock.d.ts +17 -17
- package/dist/esm/clock/mock-clock.js +47 -47
- package/dist/esm/clock/realtime-clock.d.ts +23 -23
- package/dist/esm/clock/realtime-clock.js +68 -68
- package/dist/esm/cortex-m0-core.d.ts +87 -87
- package/dist/esm/cortex-m0-core.js +1247 -1247
- package/dist/esm/gdb/gdb-connection.d.ts +11 -11
- package/dist/esm/gdb/gdb-connection.js +53 -53
- package/dist/esm/gdb/gdb-server.d.ts +23 -23
- package/dist/esm/gdb/gdb-server.js +228 -228
- package/dist/esm/gdb/gdb-tcp-server.d.ts +10 -10
- package/dist/esm/gdb/gdb-tcp-server.js +30 -30
- package/dist/esm/gdb/gdb-utils.d.ts +9 -9
- package/dist/esm/gdb/gdb-utils.js +36 -36
- package/dist/esm/gpio-pin.d.ts +56 -56
- package/dist/esm/gpio-pin.js +212 -212
- package/dist/esm/index.d.ts +11 -11
- package/dist/esm/index.js +11 -11
- package/dist/esm/interpolator.d.ts +36 -36
- package/dist/esm/interpolator.js +145 -145
- package/dist/esm/irq.d.ts +29 -29
- package/dist/esm/irq.js +30 -30
- package/dist/esm/peripherals/adc.d.ts +52 -52
- package/dist/esm/peripherals/adc.js +257 -257
- package/dist/esm/peripherals/busctrl.d.ts +10 -10
- package/dist/esm/peripherals/busctrl.js +80 -80
- package/dist/esm/peripherals/clocks.d.ts +9 -9
- package/dist/esm/peripherals/clocks.js +38 -38
- package/dist/esm/peripherals/dma.d.ts +109 -109
- package/dist/esm/peripherals/dma.js +515 -515
- package/dist/esm/peripherals/i2c.d.ts +54 -54
- package/dist/esm/peripherals/i2c.js +454 -454
- package/dist/esm/peripherals/io.d.ts +11 -11
- package/dist/esm/peripherals/io.js +96 -96
- package/dist/esm/peripherals/pads.d.ts +13 -13
- package/dist/esm/peripherals/pads.js +54 -54
- package/dist/esm/peripherals/peripheral.d.ts +22 -22
- package/dist/esm/peripherals/peripheral.js +55 -55
- package/dist/esm/peripherals/pio.d.ts +120 -120
- package/dist/esm/peripherals/pio.js +1081 -1081
- package/dist/esm/peripherals/ppb.d.ts +25 -25
- package/dist/esm/peripherals/ppb.js +225 -225
- package/dist/esm/peripherals/pwm.d.ts +65 -65
- package/dist/esm/peripherals/pwm.js +368 -368
- package/dist/esm/peripherals/reset.d.ts +8 -8
- package/dist/esm/peripherals/reset.js +36 -36
- package/dist/esm/peripherals/rtc.d.ts +10 -10
- package/dist/esm/peripherals/rtc.js +70 -70
- package/dist/esm/peripherals/spi.d.ts +38 -38
- package/dist/esm/peripherals/spi.js +236 -236
- package/dist/esm/peripherals/ssi.d.ts +6 -6
- package/dist/esm/peripherals/ssi.js +39 -39
- package/dist/esm/peripherals/syscfg.d.ts +5 -5
- package/dist/esm/peripherals/syscfg.js +22 -22
- package/dist/esm/peripherals/sysinfo.d.ts +4 -4
- package/dist/esm/peripherals/sysinfo.js +18 -18
- package/dist/esm/peripherals/tbman.d.ts +4 -4
- package/dist/esm/peripherals/tbman.js +13 -13
- package/dist/esm/peripherals/timer.d.ts +18 -18
- package/dist/esm/peripherals/timer.js +152 -152
- package/dist/esm/peripherals/uart.d.ts +31 -31
- package/dist/esm/peripherals/uart.js +128 -128
- package/dist/esm/peripherals/usb.d.ts +29 -29
- package/dist/esm/peripherals/usb.js +305 -305
- package/dist/esm/rp2040.d.ts +71 -71
- package/dist/esm/rp2040.js +357 -357
- package/dist/esm/sio.d.ts +21 -21
- package/dist/esm/sio.js +421 -421
- package/dist/esm/usb/cdc.d.ts +20 -20
- package/dist/esm/usb/cdc.js +121 -121
- package/dist/esm/usb/interfaces.d.ts +47 -47
- package/dist/esm/usb/interfaces.js +43 -43
- package/dist/esm/usb/setup.d.ts +5 -5
- package/dist/esm/usb/setup.js +46 -46
- package/dist/esm/utils/assembler.d.ts +79 -79
- package/dist/esm/utils/assembler.js +245 -245
- package/dist/esm/utils/bit.d.ts +3 -3
- package/dist/esm/utils/bit.js +9 -9
- package/dist/esm/utils/fifo.d.ts +15 -15
- package/dist/esm/utils/fifo.js +52 -52
- package/dist/esm/utils/logging.d.ts +23 -23
- package/dist/esm/utils/logging.js +44 -44
- package/dist/esm/utils/pio-assembler.d.ts +45 -45
- package/dist/esm/utils/pio-assembler.js +75 -75
- package/dist/esm/utils/time.d.ts +2 -2
- package/dist/esm/utils/time.js +27 -27
- package/dist/esm/utils/timer32.d.ts +57 -57
- package/dist/esm/utils/timer32.js +203 -203
- package/package.json +33 -22
- 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
|
+
}
|