rp2040js 0.17.17 → 0.18.1
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 +38 -27
- package/dist/esm/package.json +0 -1
package/dist/esm/gpio-pin.js
CHANGED
|
@@ -1,212 +1,212 @@
|
|
|
1
|
-
import { WaitType } from './peripherals/pio';
|
|
2
|
-
export var GPIOPinState;
|
|
3
|
-
(function (GPIOPinState) {
|
|
4
|
-
GPIOPinState[GPIOPinState["Low"] = 0] = "Low";
|
|
5
|
-
GPIOPinState[GPIOPinState["High"] = 1] = "High";
|
|
6
|
-
GPIOPinState[GPIOPinState["Input"] = 2] = "Input";
|
|
7
|
-
GPIOPinState[GPIOPinState["InputPullUp"] = 3] = "InputPullUp";
|
|
8
|
-
GPIOPinState[GPIOPinState["InputPullDown"] = 4] = "InputPullDown";
|
|
9
|
-
})(GPIOPinState || (GPIOPinState = {}));
|
|
10
|
-
export const FUNCTION_PWM = 4;
|
|
11
|
-
export const FUNCTION_SIO = 5;
|
|
12
|
-
export const FUNCTION_PIO0 = 6;
|
|
13
|
-
export const FUNCTION_PIO1 = 7;
|
|
14
|
-
function applyOverride(value, overrideType) {
|
|
15
|
-
switch (overrideType) {
|
|
16
|
-
case 0:
|
|
17
|
-
return value;
|
|
18
|
-
case 1:
|
|
19
|
-
return !value;
|
|
20
|
-
case 2:
|
|
21
|
-
return false;
|
|
22
|
-
case 3:
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
console.error('applyOverride received invalid override type', overrideType);
|
|
26
|
-
return value;
|
|
27
|
-
}
|
|
28
|
-
const IRQ_EDGE_HIGH = 1 << 3;
|
|
29
|
-
const IRQ_EDGE_LOW = 1 << 2;
|
|
30
|
-
const IRQ_LEVEL_HIGH = 1 << 1;
|
|
31
|
-
const IRQ_LEVEL_LOW = 1 << 0;
|
|
32
|
-
export class GPIOPin {
|
|
33
|
-
constructor(rp2040, index, name = index.toString()) {
|
|
34
|
-
this.rp2040 = rp2040;
|
|
35
|
-
this.index = index;
|
|
36
|
-
this.name = name;
|
|
37
|
-
this.rawInputValue = false;
|
|
38
|
-
this.lastValue = this.value;
|
|
39
|
-
this.ctrl = 0x1f;
|
|
40
|
-
this.padValue = 0b0110110;
|
|
41
|
-
this.irqEnableMask = 0;
|
|
42
|
-
this.irqForceMask = 0;
|
|
43
|
-
this.irqStatus = 0;
|
|
44
|
-
this.listeners = new Set();
|
|
45
|
-
}
|
|
46
|
-
get rawInterrupt() {
|
|
47
|
-
return !!((this.irqStatus & this.irqEnableMask) | this.irqForceMask);
|
|
48
|
-
}
|
|
49
|
-
get isSlewFast() {
|
|
50
|
-
return !!(this.padValue & 1);
|
|
51
|
-
}
|
|
52
|
-
get schmittEnabled() {
|
|
53
|
-
return !!(this.padValue & 2);
|
|
54
|
-
}
|
|
55
|
-
get pulldownEnabled() {
|
|
56
|
-
return !!(this.padValue & 4);
|
|
57
|
-
}
|
|
58
|
-
get pullupEnabled() {
|
|
59
|
-
return !!(this.padValue & 8);
|
|
60
|
-
}
|
|
61
|
-
get driveStrength() {
|
|
62
|
-
return (this.padValue >> 4) & 0x3;
|
|
63
|
-
}
|
|
64
|
-
get inputEnable() {
|
|
65
|
-
return !!(this.padValue & 0x40);
|
|
66
|
-
}
|
|
67
|
-
get outputDisable() {
|
|
68
|
-
return !!(this.padValue & 0x80);
|
|
69
|
-
}
|
|
70
|
-
get functionSelect() {
|
|
71
|
-
return this.ctrl & 0x1f;
|
|
72
|
-
}
|
|
73
|
-
get outputOverride() {
|
|
74
|
-
return (this.ctrl >> 8) & 0x3;
|
|
75
|
-
}
|
|
76
|
-
get outputEnableOverride() {
|
|
77
|
-
return (this.ctrl >> 12) & 0x3;
|
|
78
|
-
}
|
|
79
|
-
get inputOverride() {
|
|
80
|
-
return (this.ctrl >> 16) & 0x3;
|
|
81
|
-
}
|
|
82
|
-
get irqOverride() {
|
|
83
|
-
return (this.ctrl >> 28) & 0x3;
|
|
84
|
-
}
|
|
85
|
-
get rawOutputEnable() {
|
|
86
|
-
const { index, rp2040, functionSelect } = this;
|
|
87
|
-
const bitmask = 1 << index;
|
|
88
|
-
switch (functionSelect) {
|
|
89
|
-
case FUNCTION_PWM:
|
|
90
|
-
return !!(rp2040.pwm.gpioDirection & bitmask);
|
|
91
|
-
case FUNCTION_SIO:
|
|
92
|
-
return !!(rp2040.sio.gpioOutputEnable & bitmask);
|
|
93
|
-
case FUNCTION_PIO0:
|
|
94
|
-
return !!(rp2040.pio[0].pinDirections & bitmask);
|
|
95
|
-
case FUNCTION_PIO1:
|
|
96
|
-
return !!(rp2040.pio[1].pinDirections & bitmask);
|
|
97
|
-
default:
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
get rawOutputValue() {
|
|
102
|
-
const { index, rp2040, functionSelect } = this;
|
|
103
|
-
const bitmask = 1 << index;
|
|
104
|
-
switch (functionSelect) {
|
|
105
|
-
case FUNCTION_PWM:
|
|
106
|
-
return !!(rp2040.pwm.gpioValue & bitmask);
|
|
107
|
-
case FUNCTION_SIO:
|
|
108
|
-
return !!(rp2040.sio.gpioValue & bitmask);
|
|
109
|
-
case FUNCTION_PIO0:
|
|
110
|
-
return !!(rp2040.pio[0].pinValues & bitmask);
|
|
111
|
-
case FUNCTION_PIO1:
|
|
112
|
-
return !!(rp2040.pio[1].pinValues & bitmask);
|
|
113
|
-
default:
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
get inputValue() {
|
|
118
|
-
return applyOverride(this.rawInputValue && this.inputEnable, this.inputOverride);
|
|
119
|
-
}
|
|
120
|
-
get irqValue() {
|
|
121
|
-
return applyOverride(this.rawInterrupt, this.irqOverride);
|
|
122
|
-
}
|
|
123
|
-
get outputEnable() {
|
|
124
|
-
return applyOverride(this.rawOutputEnable, this.outputEnableOverride);
|
|
125
|
-
}
|
|
126
|
-
get outputValue() {
|
|
127
|
-
return applyOverride(this.rawOutputValue, this.outputOverride);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Returns the STATUS register value for the pin, as outlined in section 2.19.6 of the datasheet
|
|
131
|
-
*/
|
|
132
|
-
get status() {
|
|
133
|
-
const irqToProc = this.irqValue ? 1 << 26 : 0;
|
|
134
|
-
const irqFromPad = this.rawInterrupt ? 1 << 24 : 0;
|
|
135
|
-
const inToPeri = this.inputValue ? 1 << 19 : 0;
|
|
136
|
-
const inFromPad = this.rawInputValue ? 1 << 17 : 0;
|
|
137
|
-
const oeToPad = this.outputEnable ? 1 << 13 : 0;
|
|
138
|
-
const oeFromPeri = this.rawOutputEnable ? 1 << 12 : 0;
|
|
139
|
-
const outToPad = this.outputValue ? 1 << 9 : 0;
|
|
140
|
-
const outFromPeri = this.rawOutputValue ? 1 << 8 : 0;
|
|
141
|
-
return (irqToProc | irqFromPad | inToPeri | inFromPad | oeToPad | oeFromPeri | outToPad | outFromPeri);
|
|
142
|
-
}
|
|
143
|
-
get value() {
|
|
144
|
-
if (this.outputEnable) {
|
|
145
|
-
return this.outputValue ? GPIOPinState.High : GPIOPinState.Low;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// TODO: check what happens when we enable both pullup/pulldown
|
|
149
|
-
if (this.pulldownEnabled) {
|
|
150
|
-
return GPIOPinState.InputPullDown;
|
|
151
|
-
}
|
|
152
|
-
if (this.pullupEnabled) {
|
|
153
|
-
return GPIOPinState.InputPullUp;
|
|
154
|
-
}
|
|
155
|
-
return GPIOPinState.Input;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
setInputValue(value) {
|
|
159
|
-
this.rawInputValue = value;
|
|
160
|
-
const prevIrqValue = this.irqValue;
|
|
161
|
-
if (value && this.inputEnable) {
|
|
162
|
-
this.irqStatus |= IRQ_EDGE_HIGH | IRQ_LEVEL_HIGH;
|
|
163
|
-
this.irqStatus &= ~IRQ_LEVEL_LOW;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
this.irqStatus |= IRQ_EDGE_LOW | IRQ_LEVEL_LOW;
|
|
167
|
-
this.irqStatus &= ~IRQ_LEVEL_HIGH;
|
|
168
|
-
}
|
|
169
|
-
if (this.irqValue !== prevIrqValue) {
|
|
170
|
-
this.rp2040.updateIOInterrupt();
|
|
171
|
-
}
|
|
172
|
-
if (this.functionSelect === FUNCTION_PWM) {
|
|
173
|
-
this.rp2040.pwm.gpioOnInput(this.index);
|
|
174
|
-
}
|
|
175
|
-
for (const pio of this.rp2040.pio) {
|
|
176
|
-
for (const machine of pio.machines) {
|
|
177
|
-
if (machine.enabled &&
|
|
178
|
-
machine.waiting &&
|
|
179
|
-
machine.waitType === WaitType.Pin &&
|
|
180
|
-
machine.waitIndex === this.index) {
|
|
181
|
-
machine.checkWait();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
checkForUpdates() {
|
|
187
|
-
const { lastValue, value } = this;
|
|
188
|
-
if (value !== lastValue) {
|
|
189
|
-
this.lastValue = value;
|
|
190
|
-
for (const listener of this.listeners) {
|
|
191
|
-
listener(value, lastValue);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
refreshInput() {
|
|
196
|
-
this.setInputValue(this.rawInputValue);
|
|
197
|
-
}
|
|
198
|
-
updateIRQValue(value) {
|
|
199
|
-
if (value & IRQ_EDGE_LOW && this.irqStatus & IRQ_EDGE_LOW) {
|
|
200
|
-
this.irqStatus &= ~IRQ_EDGE_LOW;
|
|
201
|
-
this.rp2040.updateIOInterrupt();
|
|
202
|
-
}
|
|
203
|
-
if (value & IRQ_EDGE_HIGH && this.irqStatus & IRQ_EDGE_HIGH) {
|
|
204
|
-
this.irqStatus &= ~IRQ_EDGE_HIGH;
|
|
205
|
-
this.rp2040.updateIOInterrupt();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
addListener(callback) {
|
|
209
|
-
this.listeners.add(callback);
|
|
210
|
-
return () => this.listeners.delete(callback);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
1
|
+
import { WaitType } from './peripherals/pio.js';
|
|
2
|
+
export var GPIOPinState;
|
|
3
|
+
(function (GPIOPinState) {
|
|
4
|
+
GPIOPinState[GPIOPinState["Low"] = 0] = "Low";
|
|
5
|
+
GPIOPinState[GPIOPinState["High"] = 1] = "High";
|
|
6
|
+
GPIOPinState[GPIOPinState["Input"] = 2] = "Input";
|
|
7
|
+
GPIOPinState[GPIOPinState["InputPullUp"] = 3] = "InputPullUp";
|
|
8
|
+
GPIOPinState[GPIOPinState["InputPullDown"] = 4] = "InputPullDown";
|
|
9
|
+
})(GPIOPinState || (GPIOPinState = {}));
|
|
10
|
+
export const FUNCTION_PWM = 4;
|
|
11
|
+
export const FUNCTION_SIO = 5;
|
|
12
|
+
export const FUNCTION_PIO0 = 6;
|
|
13
|
+
export const FUNCTION_PIO1 = 7;
|
|
14
|
+
function applyOverride(value, overrideType) {
|
|
15
|
+
switch (overrideType) {
|
|
16
|
+
case 0:
|
|
17
|
+
return value;
|
|
18
|
+
case 1:
|
|
19
|
+
return !value;
|
|
20
|
+
case 2:
|
|
21
|
+
return false;
|
|
22
|
+
case 3:
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
console.error('applyOverride received invalid override type', overrideType);
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
const IRQ_EDGE_HIGH = 1 << 3;
|
|
29
|
+
const IRQ_EDGE_LOW = 1 << 2;
|
|
30
|
+
const IRQ_LEVEL_HIGH = 1 << 1;
|
|
31
|
+
const IRQ_LEVEL_LOW = 1 << 0;
|
|
32
|
+
export class GPIOPin {
|
|
33
|
+
constructor(rp2040, index, name = index.toString()) {
|
|
34
|
+
this.rp2040 = rp2040;
|
|
35
|
+
this.index = index;
|
|
36
|
+
this.name = name;
|
|
37
|
+
this.rawInputValue = false;
|
|
38
|
+
this.lastValue = this.value;
|
|
39
|
+
this.ctrl = 0x1f;
|
|
40
|
+
this.padValue = 0b0110110;
|
|
41
|
+
this.irqEnableMask = 0;
|
|
42
|
+
this.irqForceMask = 0;
|
|
43
|
+
this.irqStatus = 0;
|
|
44
|
+
this.listeners = new Set();
|
|
45
|
+
}
|
|
46
|
+
get rawInterrupt() {
|
|
47
|
+
return !!((this.irqStatus & this.irqEnableMask) | this.irqForceMask);
|
|
48
|
+
}
|
|
49
|
+
get isSlewFast() {
|
|
50
|
+
return !!(this.padValue & 1);
|
|
51
|
+
}
|
|
52
|
+
get schmittEnabled() {
|
|
53
|
+
return !!(this.padValue & 2);
|
|
54
|
+
}
|
|
55
|
+
get pulldownEnabled() {
|
|
56
|
+
return !!(this.padValue & 4);
|
|
57
|
+
}
|
|
58
|
+
get pullupEnabled() {
|
|
59
|
+
return !!(this.padValue & 8);
|
|
60
|
+
}
|
|
61
|
+
get driveStrength() {
|
|
62
|
+
return (this.padValue >> 4) & 0x3;
|
|
63
|
+
}
|
|
64
|
+
get inputEnable() {
|
|
65
|
+
return !!(this.padValue & 0x40);
|
|
66
|
+
}
|
|
67
|
+
get outputDisable() {
|
|
68
|
+
return !!(this.padValue & 0x80);
|
|
69
|
+
}
|
|
70
|
+
get functionSelect() {
|
|
71
|
+
return this.ctrl & 0x1f;
|
|
72
|
+
}
|
|
73
|
+
get outputOverride() {
|
|
74
|
+
return (this.ctrl >> 8) & 0x3;
|
|
75
|
+
}
|
|
76
|
+
get outputEnableOverride() {
|
|
77
|
+
return (this.ctrl >> 12) & 0x3;
|
|
78
|
+
}
|
|
79
|
+
get inputOverride() {
|
|
80
|
+
return (this.ctrl >> 16) & 0x3;
|
|
81
|
+
}
|
|
82
|
+
get irqOverride() {
|
|
83
|
+
return (this.ctrl >> 28) & 0x3;
|
|
84
|
+
}
|
|
85
|
+
get rawOutputEnable() {
|
|
86
|
+
const { index, rp2040, functionSelect } = this;
|
|
87
|
+
const bitmask = 1 << index;
|
|
88
|
+
switch (functionSelect) {
|
|
89
|
+
case FUNCTION_PWM:
|
|
90
|
+
return !!(rp2040.pwm.gpioDirection & bitmask);
|
|
91
|
+
case FUNCTION_SIO:
|
|
92
|
+
return !!(rp2040.sio.gpioOutputEnable & bitmask);
|
|
93
|
+
case FUNCTION_PIO0:
|
|
94
|
+
return !!(rp2040.pio[0].pinDirections & bitmask);
|
|
95
|
+
case FUNCTION_PIO1:
|
|
96
|
+
return !!(rp2040.pio[1].pinDirections & bitmask);
|
|
97
|
+
default:
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
get rawOutputValue() {
|
|
102
|
+
const { index, rp2040, functionSelect } = this;
|
|
103
|
+
const bitmask = 1 << index;
|
|
104
|
+
switch (functionSelect) {
|
|
105
|
+
case FUNCTION_PWM:
|
|
106
|
+
return !!(rp2040.pwm.gpioValue & bitmask);
|
|
107
|
+
case FUNCTION_SIO:
|
|
108
|
+
return !!(rp2040.sio.gpioValue & bitmask);
|
|
109
|
+
case FUNCTION_PIO0:
|
|
110
|
+
return !!(rp2040.pio[0].pinValues & bitmask);
|
|
111
|
+
case FUNCTION_PIO1:
|
|
112
|
+
return !!(rp2040.pio[1].pinValues & bitmask);
|
|
113
|
+
default:
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
get inputValue() {
|
|
118
|
+
return applyOverride(this.rawInputValue && this.inputEnable, this.inputOverride);
|
|
119
|
+
}
|
|
120
|
+
get irqValue() {
|
|
121
|
+
return applyOverride(this.rawInterrupt, this.irqOverride);
|
|
122
|
+
}
|
|
123
|
+
get outputEnable() {
|
|
124
|
+
return applyOverride(this.rawOutputEnable, this.outputEnableOverride);
|
|
125
|
+
}
|
|
126
|
+
get outputValue() {
|
|
127
|
+
return applyOverride(this.rawOutputValue, this.outputOverride);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns the STATUS register value for the pin, as outlined in section 2.19.6 of the datasheet
|
|
131
|
+
*/
|
|
132
|
+
get status() {
|
|
133
|
+
const irqToProc = this.irqValue ? 1 << 26 : 0;
|
|
134
|
+
const irqFromPad = this.rawInterrupt ? 1 << 24 : 0;
|
|
135
|
+
const inToPeri = this.inputValue ? 1 << 19 : 0;
|
|
136
|
+
const inFromPad = this.rawInputValue ? 1 << 17 : 0;
|
|
137
|
+
const oeToPad = this.outputEnable ? 1 << 13 : 0;
|
|
138
|
+
const oeFromPeri = this.rawOutputEnable ? 1 << 12 : 0;
|
|
139
|
+
const outToPad = this.outputValue ? 1 << 9 : 0;
|
|
140
|
+
const outFromPeri = this.rawOutputValue ? 1 << 8 : 0;
|
|
141
|
+
return (irqToProc | irqFromPad | inToPeri | inFromPad | oeToPad | oeFromPeri | outToPad | outFromPeri);
|
|
142
|
+
}
|
|
143
|
+
get value() {
|
|
144
|
+
if (this.outputEnable) {
|
|
145
|
+
return this.outputValue ? GPIOPinState.High : GPIOPinState.Low;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// TODO: check what happens when we enable both pullup/pulldown
|
|
149
|
+
if (this.pulldownEnabled) {
|
|
150
|
+
return GPIOPinState.InputPullDown;
|
|
151
|
+
}
|
|
152
|
+
if (this.pullupEnabled) {
|
|
153
|
+
return GPIOPinState.InputPullUp;
|
|
154
|
+
}
|
|
155
|
+
return GPIOPinState.Input;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
setInputValue(value) {
|
|
159
|
+
this.rawInputValue = value;
|
|
160
|
+
const prevIrqValue = this.irqValue;
|
|
161
|
+
if (value && this.inputEnable) {
|
|
162
|
+
this.irqStatus |= IRQ_EDGE_HIGH | IRQ_LEVEL_HIGH;
|
|
163
|
+
this.irqStatus &= ~IRQ_LEVEL_LOW;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.irqStatus |= IRQ_EDGE_LOW | IRQ_LEVEL_LOW;
|
|
167
|
+
this.irqStatus &= ~IRQ_LEVEL_HIGH;
|
|
168
|
+
}
|
|
169
|
+
if (this.irqValue !== prevIrqValue) {
|
|
170
|
+
this.rp2040.updateIOInterrupt();
|
|
171
|
+
}
|
|
172
|
+
if (this.functionSelect === FUNCTION_PWM) {
|
|
173
|
+
this.rp2040.pwm.gpioOnInput(this.index);
|
|
174
|
+
}
|
|
175
|
+
for (const pio of this.rp2040.pio) {
|
|
176
|
+
for (const machine of pio.machines) {
|
|
177
|
+
if (machine.enabled &&
|
|
178
|
+
machine.waiting &&
|
|
179
|
+
machine.waitType === WaitType.Pin &&
|
|
180
|
+
machine.waitIndex === this.index) {
|
|
181
|
+
machine.checkWait();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
checkForUpdates() {
|
|
187
|
+
const { lastValue, value } = this;
|
|
188
|
+
if (value !== lastValue) {
|
|
189
|
+
this.lastValue = value;
|
|
190
|
+
for (const listener of this.listeners) {
|
|
191
|
+
listener(value, lastValue);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
refreshInput() {
|
|
196
|
+
this.setInputValue(this.rawInputValue);
|
|
197
|
+
}
|
|
198
|
+
updateIRQValue(value) {
|
|
199
|
+
if (value & IRQ_EDGE_LOW && this.irqStatus & IRQ_EDGE_LOW) {
|
|
200
|
+
this.irqStatus &= ~IRQ_EDGE_LOW;
|
|
201
|
+
this.rp2040.updateIOInterrupt();
|
|
202
|
+
}
|
|
203
|
+
if (value & IRQ_EDGE_HIGH && this.irqStatus & IRQ_EDGE_HIGH) {
|
|
204
|
+
this.irqStatus &= ~IRQ_EDGE_HIGH;
|
|
205
|
+
this.rp2040.updateIOInterrupt();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
addListener(callback) {
|
|
209
|
+
this.listeners.add(callback);
|
|
210
|
+
return () => this.listeners.delete(callback);
|
|
211
|
+
}
|
|
212
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { GDBConnection } from './gdb/gdb-connection';
|
|
2
|
-
export { GDBServer } from './gdb/gdb-server';
|
|
3
|
-
export { GPIOPin, GPIOPinState } from './gpio-pin';
|
|
4
|
-
export { BasePeripheral, Peripheral } from './peripherals/peripheral';
|
|
5
|
-
export { RPI2C, I2CSpeed, I2CMode } from './peripherals/i2c';
|
|
6
|
-
export { RPUSBController } from './peripherals/usb';
|
|
7
|
-
export { RP2040 } from './rp2040';
|
|
8
|
-
export { USBCDC } from './usb/cdc';
|
|
9
|
-
export { DataDirection, DescriptorType, ISetupPacketParams, SetupRecipient, SetupRequest, SetupType, } from './usb/interfaces';
|
|
10
|
-
export { createSetupPacket, getDescriptorPacket, setDeviceAddressPacket, setDeviceConfigurationPacket, } from './usb/setup';
|
|
11
|
-
export { ConsoleLogger, Logger, LogLevel } from './utils/logging';
|
|
1
|
+
export { GDBConnection } from './gdb/gdb-connection.js';
|
|
2
|
+
export { GDBServer } from './gdb/gdb-server.js';
|
|
3
|
+
export { GPIOPin, GPIOPinState } from './gpio-pin.js';
|
|
4
|
+
export { BasePeripheral, Peripheral } from './peripherals/peripheral.js';
|
|
5
|
+
export { RPI2C, I2CSpeed, I2CMode } from './peripherals/i2c.js';
|
|
6
|
+
export { RPUSBController } from './peripherals/usb.js';
|
|
7
|
+
export { RP2040 } from './rp2040.js';
|
|
8
|
+
export { USBCDC } from './usb/cdc.js';
|
|
9
|
+
export { DataDirection, DescriptorType, ISetupPacketParams, SetupRecipient, SetupRequest, SetupType, } from './usb/interfaces.js';
|
|
10
|
+
export { createSetupPacket, getDescriptorPacket, setDeviceAddressPacket, setDeviceConfigurationPacket, } from './usb/setup.js';
|
|
11
|
+
export { ConsoleLogger, Logger, LogLevel } from './utils/logging.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { GDBConnection } from './gdb/gdb-connection';
|
|
2
|
-
export { GDBServer } from './gdb/gdb-server';
|
|
3
|
-
export { GPIOPin, GPIOPinState } from './gpio-pin';
|
|
4
|
-
export { BasePeripheral } from './peripherals/peripheral';
|
|
5
|
-
export { RPI2C, I2CSpeed, I2CMode } from './peripherals/i2c';
|
|
6
|
-
export { RPUSBController } from './peripherals/usb';
|
|
7
|
-
export { RP2040 } from './rp2040';
|
|
8
|
-
export { USBCDC } from './usb/cdc';
|
|
9
|
-
export { DataDirection, DescriptorType, SetupRecipient, SetupRequest, SetupType, } from './usb/interfaces';
|
|
10
|
-
export { createSetupPacket, getDescriptorPacket, setDeviceAddressPacket, setDeviceConfigurationPacket, } from './usb/setup';
|
|
11
|
-
export { ConsoleLogger, LogLevel } from './utils/logging';
|
|
1
|
+
export { GDBConnection } from './gdb/gdb-connection.js';
|
|
2
|
+
export { GDBServer } from './gdb/gdb-server.js';
|
|
3
|
+
export { GPIOPin, GPIOPinState } from './gpio-pin.js';
|
|
4
|
+
export { BasePeripheral } from './peripherals/peripheral.js';
|
|
5
|
+
export { RPI2C, I2CSpeed, I2CMode } from './peripherals/i2c.js';
|
|
6
|
+
export { RPUSBController } from './peripherals/usb.js';
|
|
7
|
+
export { RP2040 } from './rp2040.js';
|
|
8
|
+
export { USBCDC } from './usb/cdc.js';
|
|
9
|
+
export { DataDirection, DescriptorType, SetupRecipient, SetupRequest, SetupType, } from './usb/interfaces.js';
|
|
10
|
+
export { createSetupPacket, getDescriptorPacket, setDeviceAddressPacket, setDeviceConfigurationPacket, } from './usb/setup.js';
|
|
11
|
+
export { ConsoleLogger, LogLevel } from './utils/logging.js';
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
export declare class InterpolatorConfig {
|
|
2
|
-
shift: number;
|
|
3
|
-
maskLSB: number;
|
|
4
|
-
maskMSB: number;
|
|
5
|
-
signed: boolean;
|
|
6
|
-
crossInput: boolean;
|
|
7
|
-
crossResult: boolean;
|
|
8
|
-
addRaw: boolean;
|
|
9
|
-
forceMSB: number;
|
|
10
|
-
blend: boolean;
|
|
11
|
-
clamp: boolean;
|
|
12
|
-
overf0: boolean;
|
|
13
|
-
overf1: boolean;
|
|
14
|
-
overf: boolean;
|
|
15
|
-
constructor(value: number);
|
|
16
|
-
toUint32(): number;
|
|
17
|
-
}
|
|
18
|
-
export declare class Interpolator {
|
|
19
|
-
private readonly index;
|
|
20
|
-
accum0: number;
|
|
21
|
-
accum1: number;
|
|
22
|
-
base0: number;
|
|
23
|
-
base1: number;
|
|
24
|
-
base2: number;
|
|
25
|
-
ctrl0: number;
|
|
26
|
-
ctrl1: number;
|
|
27
|
-
result0: number;
|
|
28
|
-
result1: number;
|
|
29
|
-
result2: number;
|
|
30
|
-
smresult0: number;
|
|
31
|
-
smresult1: number;
|
|
32
|
-
constructor(index: number);
|
|
33
|
-
update(): void;
|
|
34
|
-
writeback(): void;
|
|
35
|
-
setBase01(value: number): void;
|
|
36
|
-
}
|
|
1
|
+
export declare class InterpolatorConfig {
|
|
2
|
+
shift: number;
|
|
3
|
+
maskLSB: number;
|
|
4
|
+
maskMSB: number;
|
|
5
|
+
signed: boolean;
|
|
6
|
+
crossInput: boolean;
|
|
7
|
+
crossResult: boolean;
|
|
8
|
+
addRaw: boolean;
|
|
9
|
+
forceMSB: number;
|
|
10
|
+
blend: boolean;
|
|
11
|
+
clamp: boolean;
|
|
12
|
+
overf0: boolean;
|
|
13
|
+
overf1: boolean;
|
|
14
|
+
overf: boolean;
|
|
15
|
+
constructor(value: number);
|
|
16
|
+
toUint32(): number;
|
|
17
|
+
}
|
|
18
|
+
export declare class Interpolator {
|
|
19
|
+
private readonly index;
|
|
20
|
+
accum0: number;
|
|
21
|
+
accum1: number;
|
|
22
|
+
base0: number;
|
|
23
|
+
base1: number;
|
|
24
|
+
base2: number;
|
|
25
|
+
ctrl0: number;
|
|
26
|
+
ctrl1: number;
|
|
27
|
+
result0: number;
|
|
28
|
+
result1: number;
|
|
29
|
+
result2: number;
|
|
30
|
+
smresult0: number;
|
|
31
|
+
smresult1: number;
|
|
32
|
+
constructor(index: number);
|
|
33
|
+
update(): void;
|
|
34
|
+
writeback(): void;
|
|
35
|
+
setBase01(value: number): void;
|
|
36
|
+
}
|