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.
Files changed (182) hide show
  1. package/dist/cjs/clock/clock.d.ts +11 -11
  2. package/dist/cjs/clock/clock.js +2 -2
  3. package/dist/cjs/clock/mock-clock.d.ts +17 -17
  4. package/dist/cjs/clock/mock-clock.js +52 -52
  5. package/dist/cjs/clock/realtime-clock.d.ts +23 -23
  6. package/dist/cjs/clock/realtime-clock.js +73 -73
  7. package/dist/cjs/cortex-m0-core.d.ts +87 -87
  8. package/dist/cjs/cortex-m0-core.js +1251 -1251
  9. package/dist/cjs/gdb/gdb-connection.d.ts +11 -11
  10. package/dist/cjs/gdb/gdb-connection.js +57 -57
  11. package/dist/cjs/gdb/gdb-server.d.ts +23 -23
  12. package/dist/cjs/gdb/gdb-server.js +232 -232
  13. package/dist/cjs/gdb/gdb-tcp-server.d.ts +10 -10
  14. package/dist/cjs/gdb/gdb-tcp-server.js +34 -34
  15. package/dist/cjs/gdb/gdb-utils.d.ts +9 -9
  16. package/dist/cjs/gdb/gdb-utils.js +48 -48
  17. package/dist/cjs/gpio-pin.d.ts +56 -56
  18. package/dist/cjs/gpio-pin.js +216 -216
  19. package/dist/cjs/index.d.ts +11 -11
  20. package/dist/cjs/index.js +36 -36
  21. package/dist/cjs/interpolator.d.ts +36 -36
  22. package/dist/cjs/interpolator.js +150 -150
  23. package/dist/cjs/irq.d.ts +29 -29
  24. package/dist/cjs/irq.js +33 -33
  25. package/dist/cjs/peripherals/adc.d.ts +52 -52
  26. package/dist/cjs/peripherals/adc.js +261 -261
  27. package/dist/cjs/peripherals/busctrl.d.ts +10 -10
  28. package/dist/cjs/peripherals/busctrl.js +84 -84
  29. package/dist/cjs/peripherals/clocks.d.ts +9 -9
  30. package/dist/cjs/peripherals/clocks.js +42 -42
  31. package/dist/cjs/peripherals/dma.d.ts +109 -109
  32. package/dist/cjs/peripherals/dma.js +520 -520
  33. package/dist/cjs/peripherals/i2c.d.ts +54 -54
  34. package/dist/cjs/peripherals/i2c.js +458 -458
  35. package/dist/cjs/peripherals/io.d.ts +11 -11
  36. package/dist/cjs/peripherals/io.js +100 -100
  37. package/dist/cjs/peripherals/pads.d.ts +13 -13
  38. package/dist/cjs/peripherals/pads.js +58 -58
  39. package/dist/cjs/peripherals/peripheral.d.ts +22 -22
  40. package/dist/cjs/peripherals/peripheral.js +61 -61
  41. package/dist/cjs/peripherals/pio.d.ts +120 -120
  42. package/dist/cjs/peripherals/pio.js +1086 -1086
  43. package/dist/cjs/peripherals/ppb.d.ts +25 -25
  44. package/dist/cjs/peripherals/ppb.js +229 -229
  45. package/dist/cjs/peripherals/pwm.d.ts +65 -65
  46. package/dist/cjs/peripherals/pwm.js +372 -372
  47. package/dist/cjs/peripherals/reset.d.ts +8 -8
  48. package/dist/cjs/peripherals/reset.js +40 -40
  49. package/dist/cjs/peripherals/rtc.d.ts +10 -10
  50. package/dist/cjs/peripherals/rtc.js +74 -74
  51. package/dist/cjs/peripherals/spi.d.ts +38 -38
  52. package/dist/cjs/peripherals/spi.js +240 -240
  53. package/dist/cjs/peripherals/ssi.d.ts +6 -6
  54. package/dist/cjs/peripherals/ssi.js +43 -43
  55. package/dist/cjs/peripherals/syscfg.d.ts +5 -5
  56. package/dist/cjs/peripherals/syscfg.js +26 -26
  57. package/dist/cjs/peripherals/sysinfo.d.ts +4 -4
  58. package/dist/cjs/peripherals/sysinfo.js +22 -22
  59. package/dist/cjs/peripherals/tbman.d.ts +4 -4
  60. package/dist/cjs/peripherals/tbman.js +17 -17
  61. package/dist/cjs/peripherals/timer.d.ts +18 -18
  62. package/dist/cjs/peripherals/timer.js +156 -156
  63. package/dist/cjs/peripherals/uart.d.ts +31 -31
  64. package/dist/cjs/peripherals/uart.js +132 -132
  65. package/dist/cjs/peripherals/usb.d.ts +29 -29
  66. package/dist/cjs/peripherals/usb.js +309 -309
  67. package/dist/cjs/rp2040.d.ts +71 -71
  68. package/dist/cjs/rp2040.js +361 -361
  69. package/dist/cjs/sio.d.ts +21 -21
  70. package/dist/cjs/sio.js +425 -425
  71. package/dist/cjs/usb/cdc.d.ts +20 -20
  72. package/dist/cjs/usb/cdc.js +126 -126
  73. package/dist/cjs/usb/interfaces.d.ts +47 -47
  74. package/dist/cjs/usb/interfaces.js +46 -46
  75. package/dist/cjs/usb/setup.d.ts +5 -5
  76. package/dist/cjs/usb/setup.js +53 -53
  77. package/dist/cjs/utils/assembler.d.ts +79 -79
  78. package/dist/cjs/utils/assembler.js +328 -328
  79. package/dist/cjs/utils/bit.d.ts +3 -3
  80. package/dist/cjs/utils/bit.js +15 -15
  81. package/dist/cjs/utils/fifo.d.ts +15 -15
  82. package/dist/cjs/utils/fifo.js +56 -56
  83. package/dist/cjs/utils/logging.d.ts +23 -23
  84. package/dist/cjs/utils/logging.js +48 -48
  85. package/dist/cjs/utils/pio-assembler.d.ts +45 -45
  86. package/dist/cjs/utils/pio-assembler.js +87 -87
  87. package/dist/cjs/utils/time.d.ts +2 -2
  88. package/dist/cjs/utils/time.js +32 -32
  89. package/dist/cjs/utils/timer32.d.ts +57 -57
  90. package/dist/cjs/utils/timer32.js +208 -208
  91. package/dist/esm/clock/clock.d.ts +11 -11
  92. package/dist/esm/clock/clock.js +1 -1
  93. package/dist/esm/clock/mock-clock.d.ts +17 -17
  94. package/dist/esm/clock/mock-clock.js +47 -47
  95. package/dist/esm/clock/realtime-clock.d.ts +23 -23
  96. package/dist/esm/clock/realtime-clock.js +68 -68
  97. package/dist/esm/cortex-m0-core.d.ts +87 -87
  98. package/dist/esm/cortex-m0-core.js +1247 -1247
  99. package/dist/esm/gdb/gdb-connection.d.ts +11 -11
  100. package/dist/esm/gdb/gdb-connection.js +53 -53
  101. package/dist/esm/gdb/gdb-server.d.ts +23 -23
  102. package/dist/esm/gdb/gdb-server.js +228 -228
  103. package/dist/esm/gdb/gdb-tcp-server.d.ts +10 -10
  104. package/dist/esm/gdb/gdb-tcp-server.js +30 -30
  105. package/dist/esm/gdb/gdb-utils.d.ts +9 -9
  106. package/dist/esm/gdb/gdb-utils.js +36 -36
  107. package/dist/esm/gpio-pin.d.ts +56 -56
  108. package/dist/esm/gpio-pin.js +212 -212
  109. package/dist/esm/index.d.ts +11 -11
  110. package/dist/esm/index.js +11 -11
  111. package/dist/esm/interpolator.d.ts +36 -36
  112. package/dist/esm/interpolator.js +145 -145
  113. package/dist/esm/irq.d.ts +29 -29
  114. package/dist/esm/irq.js +30 -30
  115. package/dist/esm/peripherals/adc.d.ts +52 -52
  116. package/dist/esm/peripherals/adc.js +257 -257
  117. package/dist/esm/peripherals/busctrl.d.ts +10 -10
  118. package/dist/esm/peripherals/busctrl.js +80 -80
  119. package/dist/esm/peripherals/clocks.d.ts +9 -9
  120. package/dist/esm/peripherals/clocks.js +38 -38
  121. package/dist/esm/peripherals/dma.d.ts +109 -109
  122. package/dist/esm/peripherals/dma.js +515 -515
  123. package/dist/esm/peripherals/i2c.d.ts +54 -54
  124. package/dist/esm/peripherals/i2c.js +454 -454
  125. package/dist/esm/peripherals/io.d.ts +11 -11
  126. package/dist/esm/peripherals/io.js +96 -96
  127. package/dist/esm/peripherals/pads.d.ts +13 -13
  128. package/dist/esm/peripherals/pads.js +54 -54
  129. package/dist/esm/peripherals/peripheral.d.ts +22 -22
  130. package/dist/esm/peripherals/peripheral.js +55 -55
  131. package/dist/esm/peripherals/pio.d.ts +120 -120
  132. package/dist/esm/peripherals/pio.js +1081 -1081
  133. package/dist/esm/peripherals/ppb.d.ts +25 -25
  134. package/dist/esm/peripherals/ppb.js +225 -225
  135. package/dist/esm/peripherals/pwm.d.ts +65 -65
  136. package/dist/esm/peripherals/pwm.js +368 -368
  137. package/dist/esm/peripherals/reset.d.ts +8 -8
  138. package/dist/esm/peripherals/reset.js +36 -36
  139. package/dist/esm/peripherals/rtc.d.ts +10 -10
  140. package/dist/esm/peripherals/rtc.js +70 -70
  141. package/dist/esm/peripherals/spi.d.ts +38 -38
  142. package/dist/esm/peripherals/spi.js +236 -236
  143. package/dist/esm/peripherals/ssi.d.ts +6 -6
  144. package/dist/esm/peripherals/ssi.js +39 -39
  145. package/dist/esm/peripherals/syscfg.d.ts +5 -5
  146. package/dist/esm/peripherals/syscfg.js +22 -22
  147. package/dist/esm/peripherals/sysinfo.d.ts +4 -4
  148. package/dist/esm/peripherals/sysinfo.js +18 -18
  149. package/dist/esm/peripherals/tbman.d.ts +4 -4
  150. package/dist/esm/peripherals/tbman.js +13 -13
  151. package/dist/esm/peripherals/timer.d.ts +18 -18
  152. package/dist/esm/peripherals/timer.js +152 -152
  153. package/dist/esm/peripherals/uart.d.ts +31 -31
  154. package/dist/esm/peripherals/uart.js +128 -128
  155. package/dist/esm/peripherals/usb.d.ts +29 -29
  156. package/dist/esm/peripherals/usb.js +305 -305
  157. package/dist/esm/rp2040.d.ts +71 -71
  158. package/dist/esm/rp2040.js +357 -357
  159. package/dist/esm/sio.d.ts +21 -21
  160. package/dist/esm/sio.js +421 -421
  161. package/dist/esm/usb/cdc.d.ts +20 -20
  162. package/dist/esm/usb/cdc.js +121 -121
  163. package/dist/esm/usb/interfaces.d.ts +47 -47
  164. package/dist/esm/usb/interfaces.js +43 -43
  165. package/dist/esm/usb/setup.d.ts +5 -5
  166. package/dist/esm/usb/setup.js +46 -46
  167. package/dist/esm/utils/assembler.d.ts +79 -79
  168. package/dist/esm/utils/assembler.js +245 -245
  169. package/dist/esm/utils/bit.d.ts +3 -3
  170. package/dist/esm/utils/bit.js +9 -9
  171. package/dist/esm/utils/fifo.d.ts +15 -15
  172. package/dist/esm/utils/fifo.js +52 -52
  173. package/dist/esm/utils/logging.d.ts +23 -23
  174. package/dist/esm/utils/logging.js +44 -44
  175. package/dist/esm/utils/pio-assembler.d.ts +45 -45
  176. package/dist/esm/utils/pio-assembler.js +75 -75
  177. package/dist/esm/utils/time.d.ts +2 -2
  178. package/dist/esm/utils/time.js +27 -27
  179. package/dist/esm/utils/timer32.d.ts +57 -57
  180. package/dist/esm/utils/timer32.js +203 -203
  181. package/package.json +33 -22
  182. 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 irq_1 = require("../irq");
5
- const peripheral_1 = require("./peripheral");
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_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_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;
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;