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
|
@@ -1,309 +1,309 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RPUSBController = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
// USB DPSRAM Registers
|
|
7
|
-
const EP1_IN_CONTROL = 0x8;
|
|
8
|
-
const EP0_IN_BUFFER_CONTROL = 0x80;
|
|
9
|
-
const EP0_OUT_BUFFER_CONTROL = 0x84;
|
|
10
|
-
const EP15_OUT_BUFFER_CONTROL = 0xfc;
|
|
11
|
-
// Endpoint Control bits
|
|
12
|
-
const USB_CTRL_DOUBLE_BUF = 1 << 30;
|
|
13
|
-
const USB_CTRL_INTERRUPT_PER_TRANSFER = 1 << 29;
|
|
14
|
-
// Buffer Control bits
|
|
15
|
-
const USB_BUF_CTRL_AVAILABLE = 1 << 10;
|
|
16
|
-
const USB_BUF_CTRL_FULL = 1 << 15;
|
|
17
|
-
const USB_BUF_CTRL_LEN_MASK = 0x3ff;
|
|
18
|
-
// Buffer1
|
|
19
|
-
const USB_BUF1_SHIFT = 16;
|
|
20
|
-
const USB_BUF1_OFFSET = 64;
|
|
21
|
-
// USB Peripheral Register
|
|
22
|
-
const MAIN_CTRL = 0x40;
|
|
23
|
-
const SIE_STATUS = 0x50;
|
|
24
|
-
const BUFF_STATUS = 0x58;
|
|
25
|
-
const BUFF_CPU_SHOULD_HANDLE = 0x5c;
|
|
26
|
-
const USB_MUXING = 0x74;
|
|
27
|
-
const INTR = 0x8c;
|
|
28
|
-
const INTE = 0x90;
|
|
29
|
-
const INTF = 0x94;
|
|
30
|
-
const INTS = 0x98;
|
|
31
|
-
// MAIN_CTRL bits
|
|
32
|
-
const SIM_TIMING = 1 << 31;
|
|
33
|
-
const HOST_NDEVICE = 1 << 1;
|
|
34
|
-
const CONTROLLER_EN = 1 << 0;
|
|
35
|
-
// SIE_STATUS bits
|
|
36
|
-
const SIE_DATA_SEQ_ERROR = 1 << 31;
|
|
37
|
-
const SIE_ACK_REC = 1 << 30;
|
|
38
|
-
const SIE_STALL_REC = 1 << 29;
|
|
39
|
-
const SIE_NAK_REC = 1 << 28;
|
|
40
|
-
const SIE_RX_TIMEOUT = 1 << 27;
|
|
41
|
-
const SIE_RX_OVERFLOW = 1 << 26;
|
|
42
|
-
const SIE_BIT_STUFF_ERROR = 1 << 25;
|
|
43
|
-
const SIE_CRC_ERROR = 1 << 24;
|
|
44
|
-
const SIE_BUS_RESET = 1 << 19;
|
|
45
|
-
const SIE_TRANS_COMPLETE = 1 << 18;
|
|
46
|
-
const SIE_SETUP_REC = 1 << 17;
|
|
47
|
-
const SIE_CONNECTED = 1 << 16;
|
|
48
|
-
const SIE_RESUME = 1 << 11;
|
|
49
|
-
const SIE_VBUS_OVER_CURR = 1 << 10;
|
|
50
|
-
const SIE_SPEED = 1 << 9;
|
|
51
|
-
const SIE_SUSPENDED = 1 << 4;
|
|
52
|
-
const SIE_LINE_STATE_MASK = 0x3;
|
|
53
|
-
const SIE_LINE_STATE_SHIFT = 2;
|
|
54
|
-
const SIE_VBUS_DETECTED = 1 << 0;
|
|
55
|
-
// USB_MUXING bits
|
|
56
|
-
const SOFTCON = 1 << 3;
|
|
57
|
-
const TO_DIGITAL_PAD = 1 << 2;
|
|
58
|
-
const TO_EXTPHY = 1 << 1;
|
|
59
|
-
const TO_PHY = 1 << 0;
|
|
60
|
-
// INTR bits
|
|
61
|
-
const INTR_BUFF_STATUS = 1 << 4;
|
|
62
|
-
// SIE Line states
|
|
63
|
-
var SIELineState;
|
|
64
|
-
(function (SIELineState) {
|
|
65
|
-
SIELineState[SIELineState["SE0"] = 0] = "SE0";
|
|
66
|
-
SIELineState[SIELineState["J"] = 1] = "J";
|
|
67
|
-
SIELineState[SIELineState["K"] = 2] = "K";
|
|
68
|
-
SIELineState[SIELineState["SE1"] = 3] = "SE1";
|
|
69
|
-
})(SIELineState || (SIELineState = {}));
|
|
70
|
-
const SIE_WRITECLEAR_MASK = SIE_DATA_SEQ_ERROR |
|
|
71
|
-
SIE_ACK_REC |
|
|
72
|
-
SIE_STALL_REC |
|
|
73
|
-
SIE_NAK_REC |
|
|
74
|
-
SIE_RX_TIMEOUT |
|
|
75
|
-
SIE_RX_OVERFLOW |
|
|
76
|
-
SIE_BIT_STUFF_ERROR |
|
|
77
|
-
SIE_CONNECTED |
|
|
78
|
-
SIE_CRC_ERROR |
|
|
79
|
-
SIE_BUS_RESET |
|
|
80
|
-
SIE_TRANS_COMPLETE |
|
|
81
|
-
SIE_SETUP_REC |
|
|
82
|
-
SIE_RESUME;
|
|
83
|
-
class RPUSBController extends
|
|
84
|
-
constructor() {
|
|
85
|
-
super(...arguments);
|
|
86
|
-
this.mainCtrl = 0;
|
|
87
|
-
this.intRaw = 0;
|
|
88
|
-
this.intEnable = 0;
|
|
89
|
-
this.intForce = 0;
|
|
90
|
-
this.sieStatus = 0;
|
|
91
|
-
this.buffStatus = 0;
|
|
92
|
-
this.readDelayMicroseconds = 1;
|
|
93
|
-
this.writeDelayMicroseconds = 1;
|
|
94
|
-
}
|
|
95
|
-
get intStatus() {
|
|
96
|
-
return (this.intRaw & this.intEnable) | this.intForce;
|
|
97
|
-
}
|
|
98
|
-
readUint32(offset) {
|
|
99
|
-
switch (offset) {
|
|
100
|
-
case MAIN_CTRL:
|
|
101
|
-
return this.mainCtrl;
|
|
102
|
-
case SIE_STATUS:
|
|
103
|
-
return this.sieStatus;
|
|
104
|
-
case BUFF_STATUS:
|
|
105
|
-
return this.buffStatus;
|
|
106
|
-
case BUFF_CPU_SHOULD_HANDLE:
|
|
107
|
-
return 0;
|
|
108
|
-
case INTR:
|
|
109
|
-
return this.intRaw;
|
|
110
|
-
case INTE:
|
|
111
|
-
return this.intEnable;
|
|
112
|
-
case INTF:
|
|
113
|
-
return this.intForce;
|
|
114
|
-
case INTS:
|
|
115
|
-
return this.intStatus;
|
|
116
|
-
}
|
|
117
|
-
return super.readUint32(offset);
|
|
118
|
-
}
|
|
119
|
-
writeUint32(offset, value) {
|
|
120
|
-
var _a, _b;
|
|
121
|
-
switch (offset) {
|
|
122
|
-
case MAIN_CTRL:
|
|
123
|
-
this.mainCtrl = value & (SIM_TIMING | CONTROLLER_EN | HOST_NDEVICE);
|
|
124
|
-
if (value & CONTROLLER_EN && !(value & HOST_NDEVICE)) {
|
|
125
|
-
(_a = this.onUSBEnabled) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
126
|
-
}
|
|
127
|
-
break;
|
|
128
|
-
case BUFF_STATUS:
|
|
129
|
-
this.buffStatus &= ~this.rawWriteValue;
|
|
130
|
-
this.buffStatusUpdated();
|
|
131
|
-
break;
|
|
132
|
-
case USB_MUXING:
|
|
133
|
-
// Workaround for busy wait in hw_enumeration_fix_force_ls_j() / hw_enumeration_fix_finish():
|
|
134
|
-
if (value & TO_DIGITAL_PAD && !(value & TO_PHY)) {
|
|
135
|
-
this.sieStatus |= SIE_CONNECTED;
|
|
136
|
-
}
|
|
137
|
-
break;
|
|
138
|
-
case SIE_STATUS:
|
|
139
|
-
this.sieStatus &= ~(this.rawWriteValue & SIE_WRITECLEAR_MASK);
|
|
140
|
-
if (this.rawWriteValue & SIE_BUS_RESET) {
|
|
141
|
-
(_b = this.onResetReceived) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
142
|
-
this.sieStatus &= ~(SIE_LINE_STATE_MASK << SIE_LINE_STATE_SHIFT);
|
|
143
|
-
this.sieStatus |= (SIELineState.J << SIE_LINE_STATE_SHIFT) | SIE_CONNECTED;
|
|
144
|
-
}
|
|
145
|
-
this.sieStatusUpdated();
|
|
146
|
-
break;
|
|
147
|
-
case INTE:
|
|
148
|
-
this.intEnable = value & 0xfffff;
|
|
149
|
-
this.checkInterrupts();
|
|
150
|
-
break;
|
|
151
|
-
case INTF:
|
|
152
|
-
this.intForce = value & 0xfffff;
|
|
153
|
-
this.checkInterrupts();
|
|
154
|
-
break;
|
|
155
|
-
default:
|
|
156
|
-
super.writeUint32(offset, value);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
readEndpointControlReg(endpoint, out) {
|
|
160
|
-
const controlRegOffset = EP1_IN_CONTROL + 8 * (endpoint - 1) + (out ? 4 : 0);
|
|
161
|
-
return this.rp2040.usbDPRAMView.getUint32(controlRegOffset, true);
|
|
162
|
-
}
|
|
163
|
-
getEndpointBufferOffset(endpoint, out) {
|
|
164
|
-
if (endpoint === 0) {
|
|
165
|
-
return 0x100;
|
|
166
|
-
}
|
|
167
|
-
return this.readEndpointControlReg(endpoint, out) & 0xffc0;
|
|
168
|
-
}
|
|
169
|
-
DPRAMUpdated(offset, value) {
|
|
170
|
-
var _a, _b, _c, _d;
|
|
171
|
-
if (value & USB_BUF_CTRL_AVAILABLE &&
|
|
172
|
-
offset >= EP0_IN_BUFFER_CONTROL &&
|
|
173
|
-
offset <= EP15_OUT_BUFFER_CONTROL) {
|
|
174
|
-
const endpoint = (offset - EP0_IN_BUFFER_CONTROL) >> 3;
|
|
175
|
-
const bufferOut = offset & 4 ? true : false;
|
|
176
|
-
let doubleBuffer = false;
|
|
177
|
-
let interrupt = true;
|
|
178
|
-
if (endpoint != 0) {
|
|
179
|
-
const control = this.readEndpointControlReg(endpoint, bufferOut);
|
|
180
|
-
doubleBuffer = !!(control & USB_CTRL_DOUBLE_BUF);
|
|
181
|
-
interrupt = !!(control & USB_CTRL_INTERRUPT_PER_TRANSFER);
|
|
182
|
-
}
|
|
183
|
-
const bufferLength = value & USB_BUF_CTRL_LEN_MASK;
|
|
184
|
-
const bufferOffset = this.getEndpointBufferOffset(endpoint, bufferOut);
|
|
185
|
-
this.debug(`Start USB transfer, endPoint=${endpoint}, direction=${bufferOut ? 'out' : 'in'} buffer=${bufferOffset.toString(16)} length=${bufferLength}`);
|
|
186
|
-
value &= ~USB_BUF_CTRL_AVAILABLE;
|
|
187
|
-
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
188
|
-
if (bufferOut) {
|
|
189
|
-
(_a = this.onEndpointRead) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, bufferLength);
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
value &= ~USB_BUF_CTRL_FULL;
|
|
193
|
-
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
194
|
-
const buffer = this.rp2040.usbDPRAM.slice(bufferOffset, bufferOffset + bufferLength);
|
|
195
|
-
if (interrupt || !doubleBuffer) {
|
|
196
|
-
this.indicateBufferReady(endpoint, false);
|
|
197
|
-
}
|
|
198
|
-
if (this.writeDelayMicroseconds) {
|
|
199
|
-
this.rp2040.clock.createTimer(this.writeDelayMicroseconds, () => {
|
|
200
|
-
var _a;
|
|
201
|
-
(_a = this.onEndpointWrite) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, buffer);
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
(_b = this.onEndpointWrite) === null || _b === void 0 ? void 0 : _b.call(this, endpoint, buffer);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (doubleBuffer && (value >> USB_BUF1_SHIFT) & USB_BUF_CTRL_AVAILABLE) {
|
|
209
|
-
const bufferLength = (value >> USB_BUF1_SHIFT) & USB_BUF_CTRL_LEN_MASK;
|
|
210
|
-
const bufferOffset = this.getEndpointBufferOffset(endpoint, bufferOut) + USB_BUF1_OFFSET;
|
|
211
|
-
this.debug(`Start USB transfer, endPoint=${endpoint}, direction=${bufferOut ? 'out' : 'in'} buffer=${bufferOffset.toString(16)} length=${bufferLength}`);
|
|
212
|
-
value &= ~(USB_BUF_CTRL_AVAILABLE << USB_BUF1_SHIFT);
|
|
213
|
-
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
214
|
-
if (bufferOut) {
|
|
215
|
-
(_c = this.onEndpointRead) === null || _c === void 0 ? void 0 : _c.call(this, endpoint, bufferLength);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
value &= ~(USB_BUF_CTRL_FULL << USB_BUF1_SHIFT);
|
|
219
|
-
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
220
|
-
const buffer = this.rp2040.usbDPRAM.slice(bufferOffset, bufferOffset + bufferLength);
|
|
221
|
-
this.indicateBufferReady(endpoint, false);
|
|
222
|
-
if (this.writeDelayMicroseconds) {
|
|
223
|
-
this.rp2040.clock.createTimer(this.writeDelayMicroseconds, () => {
|
|
224
|
-
var _a;
|
|
225
|
-
(_a = this.onEndpointWrite) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, buffer);
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
(_d = this.onEndpointWrite) === null || _d === void 0 ? void 0 : _d.call(this, endpoint, buffer);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
endpointReadDone(endpoint, buffer, delay = this.readDelayMicroseconds) {
|
|
236
|
-
if (delay) {
|
|
237
|
-
this.rp2040.clock.createTimer(delay, () => {
|
|
238
|
-
this.finishRead(endpoint, buffer);
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
this.finishRead(endpoint, buffer);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
finishRead(endpoint, buffer) {
|
|
246
|
-
const bufferOffset = this.getEndpointBufferOffset(endpoint, true);
|
|
247
|
-
const bufControlReg = EP0_OUT_BUFFER_CONTROL + endpoint * 8;
|
|
248
|
-
let bufControl = this.rp2040.usbDPRAMView.getUint32(bufControlReg, true);
|
|
249
|
-
const requestedLength = bufControl & USB_BUF_CTRL_LEN_MASK;
|
|
250
|
-
const newLength = Math.min(buffer.length, requestedLength);
|
|
251
|
-
bufControl |= USB_BUF_CTRL_FULL;
|
|
252
|
-
bufControl = (bufControl & ~USB_BUF_CTRL_LEN_MASK) | (newLength & USB_BUF_CTRL_LEN_MASK);
|
|
253
|
-
this.rp2040.usbDPRAMView.setUint32(bufControlReg, bufControl, true);
|
|
254
|
-
this.rp2040.usbDPRAM.set(buffer.subarray(0, newLength), bufferOffset);
|
|
255
|
-
this.indicateBufferReady(endpoint, true);
|
|
256
|
-
}
|
|
257
|
-
checkInterrupts() {
|
|
258
|
-
const { intStatus } = this;
|
|
259
|
-
this.rp2040.setInterrupt(
|
|
260
|
-
}
|
|
261
|
-
resetDevice() {
|
|
262
|
-
this.sieStatus |= SIE_BUS_RESET;
|
|
263
|
-
this.sieStatusUpdated();
|
|
264
|
-
}
|
|
265
|
-
sendSetupPacket(setupPacket) {
|
|
266
|
-
this.rp2040.usbDPRAM.set(setupPacket);
|
|
267
|
-
this.sieStatus |= SIE_SETUP_REC;
|
|
268
|
-
this.sieStatusUpdated();
|
|
269
|
-
}
|
|
270
|
-
indicateBufferReady(endpoint, out) {
|
|
271
|
-
this.buffStatus |= 1 << (endpoint * 2 + (out ? 1 : 0));
|
|
272
|
-
this.buffStatusUpdated();
|
|
273
|
-
}
|
|
274
|
-
buffStatusUpdated() {
|
|
275
|
-
if (this.buffStatus) {
|
|
276
|
-
this.intRaw |= INTR_BUFF_STATUS;
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
this.intRaw &= ~INTR_BUFF_STATUS;
|
|
280
|
-
}
|
|
281
|
-
this.checkInterrupts();
|
|
282
|
-
}
|
|
283
|
-
sieStatusUpdated() {
|
|
284
|
-
const intRegisterMap = [
|
|
285
|
-
[SIE_SETUP_REC, 1 << 16],
|
|
286
|
-
[SIE_RESUME, 1 << 15],
|
|
287
|
-
[SIE_SUSPENDED, 1 << 14],
|
|
288
|
-
[SIE_CONNECTED, 1 << 13],
|
|
289
|
-
[SIE_BUS_RESET, 1 << 12],
|
|
290
|
-
[SIE_VBUS_DETECTED, 1 << 11],
|
|
291
|
-
[SIE_STALL_REC, 1 << 10],
|
|
292
|
-
[SIE_CRC_ERROR, 1 << 9],
|
|
293
|
-
[SIE_BIT_STUFF_ERROR, 1 << 8],
|
|
294
|
-
[SIE_RX_OVERFLOW, 1 << 7],
|
|
295
|
-
[SIE_RX_TIMEOUT, 1 << 6],
|
|
296
|
-
[SIE_DATA_SEQ_ERROR, 1 << 5],
|
|
297
|
-
];
|
|
298
|
-
for (const [sieBit, intRawBit] of intRegisterMap) {
|
|
299
|
-
if (this.sieStatus & sieBit) {
|
|
300
|
-
this.intRaw |= intRawBit;
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
this.intRaw &= ~intRawBit;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
this.checkInterrupts();
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
exports.RPUSBController = RPUSBController;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RPUSBController = void 0;
|
|
4
|
+
const irq_js_1 = require("../irq.js");
|
|
5
|
+
const peripheral_js_1 = require("./peripheral.js");
|
|
6
|
+
// USB DPSRAM Registers
|
|
7
|
+
const EP1_IN_CONTROL = 0x8;
|
|
8
|
+
const EP0_IN_BUFFER_CONTROL = 0x80;
|
|
9
|
+
const EP0_OUT_BUFFER_CONTROL = 0x84;
|
|
10
|
+
const EP15_OUT_BUFFER_CONTROL = 0xfc;
|
|
11
|
+
// Endpoint Control bits
|
|
12
|
+
const USB_CTRL_DOUBLE_BUF = 1 << 30;
|
|
13
|
+
const USB_CTRL_INTERRUPT_PER_TRANSFER = 1 << 29;
|
|
14
|
+
// Buffer Control bits
|
|
15
|
+
const USB_BUF_CTRL_AVAILABLE = 1 << 10;
|
|
16
|
+
const USB_BUF_CTRL_FULL = 1 << 15;
|
|
17
|
+
const USB_BUF_CTRL_LEN_MASK = 0x3ff;
|
|
18
|
+
// Buffer1
|
|
19
|
+
const USB_BUF1_SHIFT = 16;
|
|
20
|
+
const USB_BUF1_OFFSET = 64;
|
|
21
|
+
// USB Peripheral Register
|
|
22
|
+
const MAIN_CTRL = 0x40;
|
|
23
|
+
const SIE_STATUS = 0x50;
|
|
24
|
+
const BUFF_STATUS = 0x58;
|
|
25
|
+
const BUFF_CPU_SHOULD_HANDLE = 0x5c;
|
|
26
|
+
const USB_MUXING = 0x74;
|
|
27
|
+
const INTR = 0x8c;
|
|
28
|
+
const INTE = 0x90;
|
|
29
|
+
const INTF = 0x94;
|
|
30
|
+
const INTS = 0x98;
|
|
31
|
+
// MAIN_CTRL bits
|
|
32
|
+
const SIM_TIMING = 1 << 31;
|
|
33
|
+
const HOST_NDEVICE = 1 << 1;
|
|
34
|
+
const CONTROLLER_EN = 1 << 0;
|
|
35
|
+
// SIE_STATUS bits
|
|
36
|
+
const SIE_DATA_SEQ_ERROR = 1 << 31;
|
|
37
|
+
const SIE_ACK_REC = 1 << 30;
|
|
38
|
+
const SIE_STALL_REC = 1 << 29;
|
|
39
|
+
const SIE_NAK_REC = 1 << 28;
|
|
40
|
+
const SIE_RX_TIMEOUT = 1 << 27;
|
|
41
|
+
const SIE_RX_OVERFLOW = 1 << 26;
|
|
42
|
+
const SIE_BIT_STUFF_ERROR = 1 << 25;
|
|
43
|
+
const SIE_CRC_ERROR = 1 << 24;
|
|
44
|
+
const SIE_BUS_RESET = 1 << 19;
|
|
45
|
+
const SIE_TRANS_COMPLETE = 1 << 18;
|
|
46
|
+
const SIE_SETUP_REC = 1 << 17;
|
|
47
|
+
const SIE_CONNECTED = 1 << 16;
|
|
48
|
+
const SIE_RESUME = 1 << 11;
|
|
49
|
+
const SIE_VBUS_OVER_CURR = 1 << 10;
|
|
50
|
+
const SIE_SPEED = 1 << 9;
|
|
51
|
+
const SIE_SUSPENDED = 1 << 4;
|
|
52
|
+
const SIE_LINE_STATE_MASK = 0x3;
|
|
53
|
+
const SIE_LINE_STATE_SHIFT = 2;
|
|
54
|
+
const SIE_VBUS_DETECTED = 1 << 0;
|
|
55
|
+
// USB_MUXING bits
|
|
56
|
+
const SOFTCON = 1 << 3;
|
|
57
|
+
const TO_DIGITAL_PAD = 1 << 2;
|
|
58
|
+
const TO_EXTPHY = 1 << 1;
|
|
59
|
+
const TO_PHY = 1 << 0;
|
|
60
|
+
// INTR bits
|
|
61
|
+
const INTR_BUFF_STATUS = 1 << 4;
|
|
62
|
+
// SIE Line states
|
|
63
|
+
var SIELineState;
|
|
64
|
+
(function (SIELineState) {
|
|
65
|
+
SIELineState[SIELineState["SE0"] = 0] = "SE0";
|
|
66
|
+
SIELineState[SIELineState["J"] = 1] = "J";
|
|
67
|
+
SIELineState[SIELineState["K"] = 2] = "K";
|
|
68
|
+
SIELineState[SIELineState["SE1"] = 3] = "SE1";
|
|
69
|
+
})(SIELineState || (SIELineState = {}));
|
|
70
|
+
const SIE_WRITECLEAR_MASK = SIE_DATA_SEQ_ERROR |
|
|
71
|
+
SIE_ACK_REC |
|
|
72
|
+
SIE_STALL_REC |
|
|
73
|
+
SIE_NAK_REC |
|
|
74
|
+
SIE_RX_TIMEOUT |
|
|
75
|
+
SIE_RX_OVERFLOW |
|
|
76
|
+
SIE_BIT_STUFF_ERROR |
|
|
77
|
+
SIE_CONNECTED |
|
|
78
|
+
SIE_CRC_ERROR |
|
|
79
|
+
SIE_BUS_RESET |
|
|
80
|
+
SIE_TRANS_COMPLETE |
|
|
81
|
+
SIE_SETUP_REC |
|
|
82
|
+
SIE_RESUME;
|
|
83
|
+
class RPUSBController extends peripheral_js_1.BasePeripheral {
|
|
84
|
+
constructor() {
|
|
85
|
+
super(...arguments);
|
|
86
|
+
this.mainCtrl = 0;
|
|
87
|
+
this.intRaw = 0;
|
|
88
|
+
this.intEnable = 0;
|
|
89
|
+
this.intForce = 0;
|
|
90
|
+
this.sieStatus = 0;
|
|
91
|
+
this.buffStatus = 0;
|
|
92
|
+
this.readDelayMicroseconds = 1;
|
|
93
|
+
this.writeDelayMicroseconds = 1;
|
|
94
|
+
}
|
|
95
|
+
get intStatus() {
|
|
96
|
+
return (this.intRaw & this.intEnable) | this.intForce;
|
|
97
|
+
}
|
|
98
|
+
readUint32(offset) {
|
|
99
|
+
switch (offset) {
|
|
100
|
+
case MAIN_CTRL:
|
|
101
|
+
return this.mainCtrl;
|
|
102
|
+
case SIE_STATUS:
|
|
103
|
+
return this.sieStatus;
|
|
104
|
+
case BUFF_STATUS:
|
|
105
|
+
return this.buffStatus;
|
|
106
|
+
case BUFF_CPU_SHOULD_HANDLE:
|
|
107
|
+
return 0;
|
|
108
|
+
case INTR:
|
|
109
|
+
return this.intRaw;
|
|
110
|
+
case INTE:
|
|
111
|
+
return this.intEnable;
|
|
112
|
+
case INTF:
|
|
113
|
+
return this.intForce;
|
|
114
|
+
case INTS:
|
|
115
|
+
return this.intStatus;
|
|
116
|
+
}
|
|
117
|
+
return super.readUint32(offset);
|
|
118
|
+
}
|
|
119
|
+
writeUint32(offset, value) {
|
|
120
|
+
var _a, _b;
|
|
121
|
+
switch (offset) {
|
|
122
|
+
case MAIN_CTRL:
|
|
123
|
+
this.mainCtrl = value & (SIM_TIMING | CONTROLLER_EN | HOST_NDEVICE);
|
|
124
|
+
if (value & CONTROLLER_EN && !(value & HOST_NDEVICE)) {
|
|
125
|
+
(_a = this.onUSBEnabled) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case BUFF_STATUS:
|
|
129
|
+
this.buffStatus &= ~this.rawWriteValue;
|
|
130
|
+
this.buffStatusUpdated();
|
|
131
|
+
break;
|
|
132
|
+
case USB_MUXING:
|
|
133
|
+
// Workaround for busy wait in hw_enumeration_fix_force_ls_j() / hw_enumeration_fix_finish():
|
|
134
|
+
if (value & TO_DIGITAL_PAD && !(value & TO_PHY)) {
|
|
135
|
+
this.sieStatus |= SIE_CONNECTED;
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
case SIE_STATUS:
|
|
139
|
+
this.sieStatus &= ~(this.rawWriteValue & SIE_WRITECLEAR_MASK);
|
|
140
|
+
if (this.rawWriteValue & SIE_BUS_RESET) {
|
|
141
|
+
(_b = this.onResetReceived) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
142
|
+
this.sieStatus &= ~(SIE_LINE_STATE_MASK << SIE_LINE_STATE_SHIFT);
|
|
143
|
+
this.sieStatus |= (SIELineState.J << SIE_LINE_STATE_SHIFT) | SIE_CONNECTED;
|
|
144
|
+
}
|
|
145
|
+
this.sieStatusUpdated();
|
|
146
|
+
break;
|
|
147
|
+
case INTE:
|
|
148
|
+
this.intEnable = value & 0xfffff;
|
|
149
|
+
this.checkInterrupts();
|
|
150
|
+
break;
|
|
151
|
+
case INTF:
|
|
152
|
+
this.intForce = value & 0xfffff;
|
|
153
|
+
this.checkInterrupts();
|
|
154
|
+
break;
|
|
155
|
+
default:
|
|
156
|
+
super.writeUint32(offset, value);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
readEndpointControlReg(endpoint, out) {
|
|
160
|
+
const controlRegOffset = EP1_IN_CONTROL + 8 * (endpoint - 1) + (out ? 4 : 0);
|
|
161
|
+
return this.rp2040.usbDPRAMView.getUint32(controlRegOffset, true);
|
|
162
|
+
}
|
|
163
|
+
getEndpointBufferOffset(endpoint, out) {
|
|
164
|
+
if (endpoint === 0) {
|
|
165
|
+
return 0x100;
|
|
166
|
+
}
|
|
167
|
+
return this.readEndpointControlReg(endpoint, out) & 0xffc0;
|
|
168
|
+
}
|
|
169
|
+
DPRAMUpdated(offset, value) {
|
|
170
|
+
var _a, _b, _c, _d;
|
|
171
|
+
if (value & USB_BUF_CTRL_AVAILABLE &&
|
|
172
|
+
offset >= EP0_IN_BUFFER_CONTROL &&
|
|
173
|
+
offset <= EP15_OUT_BUFFER_CONTROL) {
|
|
174
|
+
const endpoint = (offset - EP0_IN_BUFFER_CONTROL) >> 3;
|
|
175
|
+
const bufferOut = offset & 4 ? true : false;
|
|
176
|
+
let doubleBuffer = false;
|
|
177
|
+
let interrupt = true;
|
|
178
|
+
if (endpoint != 0) {
|
|
179
|
+
const control = this.readEndpointControlReg(endpoint, bufferOut);
|
|
180
|
+
doubleBuffer = !!(control & USB_CTRL_DOUBLE_BUF);
|
|
181
|
+
interrupt = !!(control & USB_CTRL_INTERRUPT_PER_TRANSFER);
|
|
182
|
+
}
|
|
183
|
+
const bufferLength = value & USB_BUF_CTRL_LEN_MASK;
|
|
184
|
+
const bufferOffset = this.getEndpointBufferOffset(endpoint, bufferOut);
|
|
185
|
+
this.debug(`Start USB transfer, endPoint=${endpoint}, direction=${bufferOut ? 'out' : 'in'} buffer=${bufferOffset.toString(16)} length=${bufferLength}`);
|
|
186
|
+
value &= ~USB_BUF_CTRL_AVAILABLE;
|
|
187
|
+
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
188
|
+
if (bufferOut) {
|
|
189
|
+
(_a = this.onEndpointRead) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, bufferLength);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
value &= ~USB_BUF_CTRL_FULL;
|
|
193
|
+
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
194
|
+
const buffer = this.rp2040.usbDPRAM.slice(bufferOffset, bufferOffset + bufferLength);
|
|
195
|
+
if (interrupt || !doubleBuffer) {
|
|
196
|
+
this.indicateBufferReady(endpoint, false);
|
|
197
|
+
}
|
|
198
|
+
if (this.writeDelayMicroseconds) {
|
|
199
|
+
this.rp2040.clock.createTimer(this.writeDelayMicroseconds, () => {
|
|
200
|
+
var _a;
|
|
201
|
+
(_a = this.onEndpointWrite) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, buffer);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
(_b = this.onEndpointWrite) === null || _b === void 0 ? void 0 : _b.call(this, endpoint, buffer);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (doubleBuffer && (value >> USB_BUF1_SHIFT) & USB_BUF_CTRL_AVAILABLE) {
|
|
209
|
+
const bufferLength = (value >> USB_BUF1_SHIFT) & USB_BUF_CTRL_LEN_MASK;
|
|
210
|
+
const bufferOffset = this.getEndpointBufferOffset(endpoint, bufferOut) + USB_BUF1_OFFSET;
|
|
211
|
+
this.debug(`Start USB transfer, endPoint=${endpoint}, direction=${bufferOut ? 'out' : 'in'} buffer=${bufferOffset.toString(16)} length=${bufferLength}`);
|
|
212
|
+
value &= ~(USB_BUF_CTRL_AVAILABLE << USB_BUF1_SHIFT);
|
|
213
|
+
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
214
|
+
if (bufferOut) {
|
|
215
|
+
(_c = this.onEndpointRead) === null || _c === void 0 ? void 0 : _c.call(this, endpoint, bufferLength);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
value &= ~(USB_BUF_CTRL_FULL << USB_BUF1_SHIFT);
|
|
219
|
+
this.rp2040.usbDPRAMView.setUint32(offset, value, true);
|
|
220
|
+
const buffer = this.rp2040.usbDPRAM.slice(bufferOffset, bufferOffset + bufferLength);
|
|
221
|
+
this.indicateBufferReady(endpoint, false);
|
|
222
|
+
if (this.writeDelayMicroseconds) {
|
|
223
|
+
this.rp2040.clock.createTimer(this.writeDelayMicroseconds, () => {
|
|
224
|
+
var _a;
|
|
225
|
+
(_a = this.onEndpointWrite) === null || _a === void 0 ? void 0 : _a.call(this, endpoint, buffer);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
(_d = this.onEndpointWrite) === null || _d === void 0 ? void 0 : _d.call(this, endpoint, buffer);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
endpointReadDone(endpoint, buffer, delay = this.readDelayMicroseconds) {
|
|
236
|
+
if (delay) {
|
|
237
|
+
this.rp2040.clock.createTimer(delay, () => {
|
|
238
|
+
this.finishRead(endpoint, buffer);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.finishRead(endpoint, buffer);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
finishRead(endpoint, buffer) {
|
|
246
|
+
const bufferOffset = this.getEndpointBufferOffset(endpoint, true);
|
|
247
|
+
const bufControlReg = EP0_OUT_BUFFER_CONTROL + endpoint * 8;
|
|
248
|
+
let bufControl = this.rp2040.usbDPRAMView.getUint32(bufControlReg, true);
|
|
249
|
+
const requestedLength = bufControl & USB_BUF_CTRL_LEN_MASK;
|
|
250
|
+
const newLength = Math.min(buffer.length, requestedLength);
|
|
251
|
+
bufControl |= USB_BUF_CTRL_FULL;
|
|
252
|
+
bufControl = (bufControl & ~USB_BUF_CTRL_LEN_MASK) | (newLength & USB_BUF_CTRL_LEN_MASK);
|
|
253
|
+
this.rp2040.usbDPRAMView.setUint32(bufControlReg, bufControl, true);
|
|
254
|
+
this.rp2040.usbDPRAM.set(buffer.subarray(0, newLength), bufferOffset);
|
|
255
|
+
this.indicateBufferReady(endpoint, true);
|
|
256
|
+
}
|
|
257
|
+
checkInterrupts() {
|
|
258
|
+
const { intStatus } = this;
|
|
259
|
+
this.rp2040.setInterrupt(irq_js_1.IRQ.USBCTRL, !!intStatus);
|
|
260
|
+
}
|
|
261
|
+
resetDevice() {
|
|
262
|
+
this.sieStatus |= SIE_BUS_RESET;
|
|
263
|
+
this.sieStatusUpdated();
|
|
264
|
+
}
|
|
265
|
+
sendSetupPacket(setupPacket) {
|
|
266
|
+
this.rp2040.usbDPRAM.set(setupPacket);
|
|
267
|
+
this.sieStatus |= SIE_SETUP_REC;
|
|
268
|
+
this.sieStatusUpdated();
|
|
269
|
+
}
|
|
270
|
+
indicateBufferReady(endpoint, out) {
|
|
271
|
+
this.buffStatus |= 1 << (endpoint * 2 + (out ? 1 : 0));
|
|
272
|
+
this.buffStatusUpdated();
|
|
273
|
+
}
|
|
274
|
+
buffStatusUpdated() {
|
|
275
|
+
if (this.buffStatus) {
|
|
276
|
+
this.intRaw |= INTR_BUFF_STATUS;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
this.intRaw &= ~INTR_BUFF_STATUS;
|
|
280
|
+
}
|
|
281
|
+
this.checkInterrupts();
|
|
282
|
+
}
|
|
283
|
+
sieStatusUpdated() {
|
|
284
|
+
const intRegisterMap = [
|
|
285
|
+
[SIE_SETUP_REC, 1 << 16],
|
|
286
|
+
[SIE_RESUME, 1 << 15],
|
|
287
|
+
[SIE_SUSPENDED, 1 << 14],
|
|
288
|
+
[SIE_CONNECTED, 1 << 13],
|
|
289
|
+
[SIE_BUS_RESET, 1 << 12],
|
|
290
|
+
[SIE_VBUS_DETECTED, 1 << 11],
|
|
291
|
+
[SIE_STALL_REC, 1 << 10],
|
|
292
|
+
[SIE_CRC_ERROR, 1 << 9],
|
|
293
|
+
[SIE_BIT_STUFF_ERROR, 1 << 8],
|
|
294
|
+
[SIE_RX_OVERFLOW, 1 << 7],
|
|
295
|
+
[SIE_RX_TIMEOUT, 1 << 6],
|
|
296
|
+
[SIE_DATA_SEQ_ERROR, 1 << 5],
|
|
297
|
+
];
|
|
298
|
+
for (const [sieBit, intRawBit] of intRegisterMap) {
|
|
299
|
+
if (this.sieStatus & sieBit) {
|
|
300
|
+
this.intRaw |= intRawBit;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
this.intRaw &= ~intRawBit;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
this.checkInterrupts();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.RPUSBController = RPUSBController;
|