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
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* RP2040 GDB Server
|
|
4
|
-
*
|
|
5
|
-
* Copyright (C) 2021, Uri Shaked
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.GDBServer = exports.STOP_REPLY_TRAP = exports.STOP_REPLY_SIGINT = void 0;
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
exports.STOP_REPLY_SIGINT = 'S02';
|
|
13
|
-
exports.STOP_REPLY_TRAP = 'S05';
|
|
14
|
-
/* string value: armv6m-none-unknown-eabi */
|
|
15
|
-
const lldbTriple = '61726d76366d2d6e6f6e652d756e6b6e6f776e2d65616269';
|
|
16
|
-
const registers = [
|
|
17
|
-
`name:r0;bitsize:32;offset:0;encoding:int;format:hex;set:General Purpose Registers;generic:arg1;gcc:0;dwarf:0;`,
|
|
18
|
-
`name:r1;bitsize:32;offset:4;encoding:int;format:hex;set:General Purpose Registers;generic:arg2;gcc:1;dwarf:1;`,
|
|
19
|
-
`name:r2;bitsize:32;offset:8;encoding:int;format:hex;set:General Purpose Registers;generic:arg3;gcc:2;dwarf:2;`,
|
|
20
|
-
`name:r3;bitsize:32;offset:12;encoding:int;format:hex;set:General Purpose Registers;generic:arg4;gcc:3;dwarf:3;`,
|
|
21
|
-
`name:r4;bitsize:32;offset:16;encoding:int;format:hex;set:General Purpose Registers;gcc:4;dwarf:4;`,
|
|
22
|
-
`name:r5;bitsize:32;offset:20;encoding:int;format:hex;set:General Purpose Registers;gcc:5;dwarf:5;`,
|
|
23
|
-
`name:r6;bitsize:32;offset:24;encoding:int;format:hex;set:General Purpose Registers;gcc:6;dwarf:6;`,
|
|
24
|
-
`name:r7;bitsize:32;offset:28;encoding:int;format:hex;set:General Purpose Registers;gcc:7;dwarf:7;`,
|
|
25
|
-
`name:r8;bitsize:32;offset:32;encoding:int;format:hex;set:General Purpose Registers;gcc:8;dwarf:8;`,
|
|
26
|
-
`name:r9;bitsize:32;offset:36;encoding:int;format:hex;set:General Purpose Registers;gcc:9;dwarf:9;`,
|
|
27
|
-
`name:r10;bitsize:32;offset:40;encoding:int;format:hex;set:General Purpose Registers;gcc:10;dwarf:10;`,
|
|
28
|
-
`name:r11;bitsize:32;offset:44;encoding:int;format:hex;set:General Purpose Registers;generic:fp;gcc:11;dwarf:11;`,
|
|
29
|
-
`name:r12;bitsize:32;offset:48;encoding:int;format:hex;set:General Purpose Registers;gcc:12;dwarf:12;`,
|
|
30
|
-
`name:sp;bitsize:32;offset:52;encoding:int;format:hex;set:General Purpose Registers;generic:sp;alt-name:r13;gcc:13;dwarf:13;`,
|
|
31
|
-
`name:lr;bitsize:32;offset:56;encoding:int;format:hex;set:General Purpose Registers;generic:ra;alt-name:r14;gcc:14;dwarf:14;`,
|
|
32
|
-
`name:pc;bitsize:32;offset:60;encoding:int;format:hex;set:General Purpose Registers;generic:pc;alt-name:r15;gcc:15;dwarf:15;`,
|
|
33
|
-
`name:cpsr;bitsize:32;offset:64;encoding:int;format:hex;set:General Purpose Registers;generic:flags;alt-name:psr;gcc:16;dwarf:16;`,
|
|
34
|
-
];
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RP2040 GDB Server
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2021, Uri Shaked
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.GDBServer = exports.STOP_REPLY_TRAP = exports.STOP_REPLY_SIGINT = void 0;
|
|
9
|
+
const cortex_m0_core_js_1 = require("../cortex-m0-core.js");
|
|
10
|
+
const logging_js_1 = require("../utils/logging.js");
|
|
11
|
+
const gdb_utils_js_1 = require("./gdb-utils.js");
|
|
12
|
+
exports.STOP_REPLY_SIGINT = 'S02';
|
|
13
|
+
exports.STOP_REPLY_TRAP = 'S05';
|
|
14
|
+
/* string value: armv6m-none-unknown-eabi */
|
|
15
|
+
const lldbTriple = '61726d76366d2d6e6f6e652d756e6b6e6f776e2d65616269';
|
|
16
|
+
const registers = [
|
|
17
|
+
`name:r0;bitsize:32;offset:0;encoding:int;format:hex;set:General Purpose Registers;generic:arg1;gcc:0;dwarf:0;`,
|
|
18
|
+
`name:r1;bitsize:32;offset:4;encoding:int;format:hex;set:General Purpose Registers;generic:arg2;gcc:1;dwarf:1;`,
|
|
19
|
+
`name:r2;bitsize:32;offset:8;encoding:int;format:hex;set:General Purpose Registers;generic:arg3;gcc:2;dwarf:2;`,
|
|
20
|
+
`name:r3;bitsize:32;offset:12;encoding:int;format:hex;set:General Purpose Registers;generic:arg4;gcc:3;dwarf:3;`,
|
|
21
|
+
`name:r4;bitsize:32;offset:16;encoding:int;format:hex;set:General Purpose Registers;gcc:4;dwarf:4;`,
|
|
22
|
+
`name:r5;bitsize:32;offset:20;encoding:int;format:hex;set:General Purpose Registers;gcc:5;dwarf:5;`,
|
|
23
|
+
`name:r6;bitsize:32;offset:24;encoding:int;format:hex;set:General Purpose Registers;gcc:6;dwarf:6;`,
|
|
24
|
+
`name:r7;bitsize:32;offset:28;encoding:int;format:hex;set:General Purpose Registers;gcc:7;dwarf:7;`,
|
|
25
|
+
`name:r8;bitsize:32;offset:32;encoding:int;format:hex;set:General Purpose Registers;gcc:8;dwarf:8;`,
|
|
26
|
+
`name:r9;bitsize:32;offset:36;encoding:int;format:hex;set:General Purpose Registers;gcc:9;dwarf:9;`,
|
|
27
|
+
`name:r10;bitsize:32;offset:40;encoding:int;format:hex;set:General Purpose Registers;gcc:10;dwarf:10;`,
|
|
28
|
+
`name:r11;bitsize:32;offset:44;encoding:int;format:hex;set:General Purpose Registers;generic:fp;gcc:11;dwarf:11;`,
|
|
29
|
+
`name:r12;bitsize:32;offset:48;encoding:int;format:hex;set:General Purpose Registers;gcc:12;dwarf:12;`,
|
|
30
|
+
`name:sp;bitsize:32;offset:52;encoding:int;format:hex;set:General Purpose Registers;generic:sp;alt-name:r13;gcc:13;dwarf:13;`,
|
|
31
|
+
`name:lr;bitsize:32;offset:56;encoding:int;format:hex;set:General Purpose Registers;generic:ra;alt-name:r14;gcc:14;dwarf:14;`,
|
|
32
|
+
`name:pc;bitsize:32;offset:60;encoding:int;format:hex;set:General Purpose Registers;generic:pc;alt-name:r15;gcc:15;dwarf:15;`,
|
|
33
|
+
`name:cpsr;bitsize:32;offset:64;encoding:int;format:hex;set:General Purpose Registers;generic:flags;alt-name:psr;gcc:16;dwarf:16;`,
|
|
34
|
+
];
|
|
35
35
|
const targetXML = `<?xml version="1.0"?>
|
|
36
36
|
<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
37
37
|
<target version="1.0">
|
|
@@ -63,201 +63,201 @@ const targetXML = `<?xml version="1.0"?>
|
|
|
63
63
|
<reg name="faultmask" bitsize="1" regnum="21" save-restore="yes" type="int8" group="system"/>
|
|
64
64
|
<reg name="control" bitsize="2" regnum="22" save-restore="yes" type="int8" group="system"/>
|
|
65
65
|
</feature>
|
|
66
|
-
</target>`;
|
|
67
|
-
const LOG_NAME = 'GDBServer';
|
|
68
|
-
class GDBServer {
|
|
69
|
-
constructor(rp2040) {
|
|
70
|
-
this.rp2040 = rp2040;
|
|
71
|
-
this.logger = new
|
|
72
|
-
this.connections = new Set();
|
|
73
|
-
}
|
|
74
|
-
processGDBMessage(cmd) {
|
|
75
|
-
const { rp2040 } = this;
|
|
76
|
-
const { core } = rp2040;
|
|
77
|
-
if (cmd === 'Hg0') {
|
|
78
|
-
return
|
|
79
|
-
}
|
|
80
|
-
switch (cmd[0]) {
|
|
81
|
-
case '?':
|
|
82
|
-
return
|
|
83
|
-
case 'q':
|
|
84
|
-
// Query things
|
|
85
|
-
if (cmd.startsWith('qSupported:')) {
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
if (cmd === 'qAttached') {
|
|
89
|
-
return
|
|
90
|
-
}
|
|
91
|
-
if (cmd.startsWith('qXfer:features:read:target.xml')) {
|
|
92
|
-
return
|
|
93
|
-
}
|
|
94
|
-
if (cmd.startsWith('qRegisterInfo')) {
|
|
95
|
-
const index = parseInt(cmd.substring(13), 16);
|
|
96
|
-
const register = registers[index];
|
|
97
|
-
if (register) {
|
|
98
|
-
return
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
return
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (cmd === 'qHostInfo') {
|
|
105
|
-
return
|
|
106
|
-
}
|
|
107
|
-
if (cmd === 'qProcessInfo') {
|
|
108
|
-
return
|
|
109
|
-
}
|
|
110
|
-
return
|
|
111
|
-
case 'v':
|
|
112
|
-
if (cmd === 'vCont?') {
|
|
113
|
-
return
|
|
114
|
-
}
|
|
115
|
-
if (cmd.startsWith('vCont;c')) {
|
|
116
|
-
if (!rp2040.executing) {
|
|
117
|
-
rp2040.execute();
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (cmd.startsWith('vCont;s')) {
|
|
122
|
-
rp2040.step();
|
|
123
|
-
const registerStatus = [];
|
|
124
|
-
for (let i = 0; i < 17; i++) {
|
|
125
|
-
const value = i === 16 ? core.xPSR : core.registers[i];
|
|
126
|
-
registerStatus.push(`${
|
|
127
|
-
}
|
|
128
|
-
return
|
|
129
|
-
}
|
|
130
|
-
break;
|
|
131
|
-
case 'c':
|
|
132
|
-
if (!rp2040.executing) {
|
|
133
|
-
rp2040.execute();
|
|
134
|
-
}
|
|
135
|
-
return
|
|
136
|
-
case 'g': {
|
|
137
|
-
// Read registers
|
|
138
|
-
const buf = new Uint32Array(17);
|
|
139
|
-
buf.set(core.registers);
|
|
140
|
-
buf[16] = core.xPSR;
|
|
141
|
-
return
|
|
142
|
-
}
|
|
143
|
-
case 'p': {
|
|
144
|
-
// Read register
|
|
145
|
-
const registerIndex = parseInt(cmd.substr(1), 16);
|
|
146
|
-
if (registerIndex >= 0 && registerIndex <= 15) {
|
|
147
|
-
return
|
|
148
|
-
}
|
|
149
|
-
const specialRegister = (sysm) =>
|
|
150
|
-
switch (registerIndex) {
|
|
151
|
-
case 0x10:
|
|
152
|
-
return
|
|
153
|
-
case 0x11:
|
|
154
|
-
return specialRegister(
|
|
155
|
-
case 0x12:
|
|
156
|
-
return specialRegister(
|
|
157
|
-
case 0x13:
|
|
158
|
-
return specialRegister(
|
|
159
|
-
case 0x14:
|
|
160
|
-
this.logger.warn(LOG_NAME, 'TODO BASEPRI');
|
|
161
|
-
return
|
|
162
|
-
case 0x15:
|
|
163
|
-
this.logger.warn(LOG_NAME, 'TODO faultmask');
|
|
164
|
-
return
|
|
165
|
-
case 0x16:
|
|
166
|
-
return specialRegister(
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
case 'P': {
|
|
171
|
-
// Write register
|
|
172
|
-
const params = cmd.substr(1).split('=');
|
|
173
|
-
const registerIndex = parseInt(params[0], 16);
|
|
174
|
-
const registerValue = params[1].trim();
|
|
175
|
-
const registerBytes = registerIndex > 0x12 ? 1 : 4;
|
|
176
|
-
const decodedValue =
|
|
177
|
-
if (registerIndex < 0 || registerIndex > 0x16 || decodedValue.length !== registerBytes) {
|
|
178
|
-
return
|
|
179
|
-
}
|
|
180
|
-
const valueBuffer = new Uint8Array(4);
|
|
181
|
-
valueBuffer.set(decodedValue.slice(0, 4));
|
|
182
|
-
const value = new DataView(valueBuffer.buffer).getUint32(0, true);
|
|
183
|
-
switch (registerIndex) {
|
|
184
|
-
case 0x10:
|
|
185
|
-
core.xPSR = value;
|
|
186
|
-
break;
|
|
187
|
-
case 0x11:
|
|
188
|
-
core.writeSpecialRegister(
|
|
189
|
-
break;
|
|
190
|
-
case 0x12:
|
|
191
|
-
core.writeSpecialRegister(
|
|
192
|
-
break;
|
|
193
|
-
case 0x13:
|
|
194
|
-
core.writeSpecialRegister(
|
|
195
|
-
break;
|
|
196
|
-
case 0x14:
|
|
197
|
-
this.logger.warn(LOG_NAME, 'TODO BASEPRI');
|
|
198
|
-
break; // TODO BASEPRI
|
|
199
|
-
case 0x15:
|
|
200
|
-
this.logger.warn(LOG_NAME, 'TODO faultmask');
|
|
201
|
-
break; // TODO faultmask
|
|
202
|
-
case 0x16:
|
|
203
|
-
core.writeSpecialRegister(
|
|
204
|
-
break;
|
|
205
|
-
default:
|
|
206
|
-
core.registers[registerIndex] = value;
|
|
207
|
-
break;
|
|
208
|
-
}
|
|
209
|
-
return
|
|
210
|
-
}
|
|
211
|
-
case 'm': {
|
|
212
|
-
// Read memory
|
|
213
|
-
const params = cmd.substr(1).split(',');
|
|
214
|
-
const address = parseInt(params[0], 16);
|
|
215
|
-
const length = parseInt(params[1], 16);
|
|
216
|
-
let result = '';
|
|
217
|
-
for (let i = 0; i < length; i++) {
|
|
218
|
-
result +=
|
|
219
|
-
}
|
|
220
|
-
return
|
|
221
|
-
}
|
|
222
|
-
case 'M': {
|
|
223
|
-
// Write memory
|
|
224
|
-
const params = cmd.substr(1).split(/[,:]/);
|
|
225
|
-
const address = parseInt(params[0], 16);
|
|
226
|
-
const length = parseInt(params[1], 16);
|
|
227
|
-
const data =
|
|
228
|
-
for (let i = 0; i < data.length; i++) {
|
|
229
|
-
this.debug(`Write ${data[i].toString(16)} to ${(address + i).toString(16)}`);
|
|
230
|
-
rp2040.writeUint8(address + i, data[i]);
|
|
231
|
-
}
|
|
232
|
-
return
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
return
|
|
236
|
-
}
|
|
237
|
-
addConnection(connection) {
|
|
238
|
-
this.connections.add(connection);
|
|
239
|
-
this.rp2040.onBreak = () => {
|
|
240
|
-
this.rp2040.stop();
|
|
241
|
-
this.rp2040.core.PC -= this.rp2040.core.breakRewind;
|
|
242
|
-
for (const connection of this.connections) {
|
|
243
|
-
connection.onBreakpoint();
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
removeConnection(connection) {
|
|
248
|
-
this.connections.delete(connection);
|
|
249
|
-
}
|
|
250
|
-
debug(msg) {
|
|
251
|
-
this.logger.debug(LOG_NAME, msg);
|
|
252
|
-
}
|
|
253
|
-
info(msg) {
|
|
254
|
-
this.logger.info(LOG_NAME, msg);
|
|
255
|
-
}
|
|
256
|
-
warn(msg) {
|
|
257
|
-
this.logger.warn(LOG_NAME, msg);
|
|
258
|
-
}
|
|
259
|
-
error(msg) {
|
|
260
|
-
this.logger.error(LOG_NAME, msg);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
exports.GDBServer = GDBServer;
|
|
66
|
+
</target>`;
|
|
67
|
+
const LOG_NAME = 'GDBServer';
|
|
68
|
+
class GDBServer {
|
|
69
|
+
constructor(rp2040) {
|
|
70
|
+
this.rp2040 = rp2040;
|
|
71
|
+
this.logger = new logging_js_1.ConsoleLogger(logging_js_1.LogLevel.Warn, true);
|
|
72
|
+
this.connections = new Set();
|
|
73
|
+
}
|
|
74
|
+
processGDBMessage(cmd) {
|
|
75
|
+
const { rp2040 } = this;
|
|
76
|
+
const { core } = rp2040;
|
|
77
|
+
if (cmd === 'Hg0') {
|
|
78
|
+
return (0, gdb_utils_js_1.gdbMessage)('OK');
|
|
79
|
+
}
|
|
80
|
+
switch (cmd[0]) {
|
|
81
|
+
case '?':
|
|
82
|
+
return (0, gdb_utils_js_1.gdbMessage)(exports.STOP_REPLY_TRAP);
|
|
83
|
+
case 'q':
|
|
84
|
+
// Query things
|
|
85
|
+
if (cmd.startsWith('qSupported:')) {
|
|
86
|
+
return (0, gdb_utils_js_1.gdbMessage)('PacketSize=4000;vContSupported+;qXfer:features:read+');
|
|
87
|
+
}
|
|
88
|
+
if (cmd === 'qAttached') {
|
|
89
|
+
return (0, gdb_utils_js_1.gdbMessage)('1');
|
|
90
|
+
}
|
|
91
|
+
if (cmd.startsWith('qXfer:features:read:target.xml')) {
|
|
92
|
+
return (0, gdb_utils_js_1.gdbMessage)('l' + targetXML);
|
|
93
|
+
}
|
|
94
|
+
if (cmd.startsWith('qRegisterInfo')) {
|
|
95
|
+
const index = parseInt(cmd.substring(13), 16);
|
|
96
|
+
const register = registers[index];
|
|
97
|
+
if (register) {
|
|
98
|
+
return (0, gdb_utils_js_1.gdbMessage)(register);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return (0, gdb_utils_js_1.gdbMessage)(`E45`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (cmd === 'qHostInfo') {
|
|
105
|
+
return (0, gdb_utils_js_1.gdbMessage)(`triple:${lldbTriple};endian:little;ptrsize:4;`);
|
|
106
|
+
}
|
|
107
|
+
if (cmd === 'qProcessInfo') {
|
|
108
|
+
return (0, gdb_utils_js_1.gdbMessage)('pid:1;endian:little;ptrsize:4;');
|
|
109
|
+
}
|
|
110
|
+
return (0, gdb_utils_js_1.gdbMessage)('');
|
|
111
|
+
case 'v':
|
|
112
|
+
if (cmd === 'vCont?') {
|
|
113
|
+
return (0, gdb_utils_js_1.gdbMessage)('vCont;c;C;s;S');
|
|
114
|
+
}
|
|
115
|
+
if (cmd.startsWith('vCont;c')) {
|
|
116
|
+
if (!rp2040.executing) {
|
|
117
|
+
rp2040.execute();
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (cmd.startsWith('vCont;s')) {
|
|
122
|
+
rp2040.step();
|
|
123
|
+
const registerStatus = [];
|
|
124
|
+
for (let i = 0; i < 17; i++) {
|
|
125
|
+
const value = i === 16 ? core.xPSR : core.registers[i];
|
|
126
|
+
registerStatus.push(`${(0, gdb_utils_js_1.encodeHexByte)(i)}:${(0, gdb_utils_js_1.encodeHexUint32)(value)}`);
|
|
127
|
+
}
|
|
128
|
+
return (0, gdb_utils_js_1.gdbMessage)(`T05${registerStatus.join(';')};reason:trace;`);
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case 'c':
|
|
132
|
+
if (!rp2040.executing) {
|
|
133
|
+
rp2040.execute();
|
|
134
|
+
}
|
|
135
|
+
return (0, gdb_utils_js_1.gdbMessage)('OK');
|
|
136
|
+
case 'g': {
|
|
137
|
+
// Read registers
|
|
138
|
+
const buf = new Uint32Array(17);
|
|
139
|
+
buf.set(core.registers);
|
|
140
|
+
buf[16] = core.xPSR;
|
|
141
|
+
return (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexBuf)(new Uint8Array(buf.buffer)));
|
|
142
|
+
}
|
|
143
|
+
case 'p': {
|
|
144
|
+
// Read register
|
|
145
|
+
const registerIndex = parseInt(cmd.substr(1), 16);
|
|
146
|
+
if (registerIndex >= 0 && registerIndex <= 15) {
|
|
147
|
+
return (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexUint32)(core.registers[registerIndex]));
|
|
148
|
+
}
|
|
149
|
+
const specialRegister = (sysm) => (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexUint32)(core.readSpecialRegister(sysm)));
|
|
150
|
+
switch (registerIndex) {
|
|
151
|
+
case 0x10:
|
|
152
|
+
return (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexUint32)(core.xPSR));
|
|
153
|
+
case 0x11:
|
|
154
|
+
return specialRegister(cortex_m0_core_js_1.SYSM_MSP);
|
|
155
|
+
case 0x12:
|
|
156
|
+
return specialRegister(cortex_m0_core_js_1.SYSM_PSP);
|
|
157
|
+
case 0x13:
|
|
158
|
+
return specialRegister(cortex_m0_core_js_1.SYSM_PRIMASK);
|
|
159
|
+
case 0x14:
|
|
160
|
+
this.logger.warn(LOG_NAME, 'TODO BASEPRI');
|
|
161
|
+
return (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexUint32)(0)); // TODO BASEPRI
|
|
162
|
+
case 0x15:
|
|
163
|
+
this.logger.warn(LOG_NAME, 'TODO faultmask');
|
|
164
|
+
return (0, gdb_utils_js_1.gdbMessage)((0, gdb_utils_js_1.encodeHexUint32)(0)); // TODO faultmask
|
|
165
|
+
case 0x16:
|
|
166
|
+
return specialRegister(cortex_m0_core_js_1.SYSM_CONTROL);
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
case 'P': {
|
|
171
|
+
// Write register
|
|
172
|
+
const params = cmd.substr(1).split('=');
|
|
173
|
+
const registerIndex = parseInt(params[0], 16);
|
|
174
|
+
const registerValue = params[1].trim();
|
|
175
|
+
const registerBytes = registerIndex > 0x12 ? 1 : 4;
|
|
176
|
+
const decodedValue = (0, gdb_utils_js_1.decodeHexBuf)(registerValue);
|
|
177
|
+
if (registerIndex < 0 || registerIndex > 0x16 || decodedValue.length !== registerBytes) {
|
|
178
|
+
return (0, gdb_utils_js_1.gdbMessage)('E00');
|
|
179
|
+
}
|
|
180
|
+
const valueBuffer = new Uint8Array(4);
|
|
181
|
+
valueBuffer.set(decodedValue.slice(0, 4));
|
|
182
|
+
const value = new DataView(valueBuffer.buffer).getUint32(0, true);
|
|
183
|
+
switch (registerIndex) {
|
|
184
|
+
case 0x10:
|
|
185
|
+
core.xPSR = value;
|
|
186
|
+
break;
|
|
187
|
+
case 0x11:
|
|
188
|
+
core.writeSpecialRegister(cortex_m0_core_js_1.SYSM_MSP, value);
|
|
189
|
+
break;
|
|
190
|
+
case 0x12:
|
|
191
|
+
core.writeSpecialRegister(cortex_m0_core_js_1.SYSM_PSP, value);
|
|
192
|
+
break;
|
|
193
|
+
case 0x13:
|
|
194
|
+
core.writeSpecialRegister(cortex_m0_core_js_1.SYSM_PRIMASK, value);
|
|
195
|
+
break;
|
|
196
|
+
case 0x14:
|
|
197
|
+
this.logger.warn(LOG_NAME, 'TODO BASEPRI');
|
|
198
|
+
break; // TODO BASEPRI
|
|
199
|
+
case 0x15:
|
|
200
|
+
this.logger.warn(LOG_NAME, 'TODO faultmask');
|
|
201
|
+
break; // TODO faultmask
|
|
202
|
+
case 0x16:
|
|
203
|
+
core.writeSpecialRegister(cortex_m0_core_js_1.SYSM_CONTROL, value);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
core.registers[registerIndex] = value;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
return (0, gdb_utils_js_1.gdbMessage)('OK');
|
|
210
|
+
}
|
|
211
|
+
case 'm': {
|
|
212
|
+
// Read memory
|
|
213
|
+
const params = cmd.substr(1).split(',');
|
|
214
|
+
const address = parseInt(params[0], 16);
|
|
215
|
+
const length = parseInt(params[1], 16);
|
|
216
|
+
let result = '';
|
|
217
|
+
for (let i = 0; i < length; i++) {
|
|
218
|
+
result += (0, gdb_utils_js_1.encodeHexByte)(rp2040.readUint8(address + i));
|
|
219
|
+
}
|
|
220
|
+
return (0, gdb_utils_js_1.gdbMessage)(result);
|
|
221
|
+
}
|
|
222
|
+
case 'M': {
|
|
223
|
+
// Write memory
|
|
224
|
+
const params = cmd.substr(1).split(/[,:]/);
|
|
225
|
+
const address = parseInt(params[0], 16);
|
|
226
|
+
const length = parseInt(params[1], 16);
|
|
227
|
+
const data = (0, gdb_utils_js_1.decodeHexBuf)(params[2].substr(0, length * 2));
|
|
228
|
+
for (let i = 0; i < data.length; i++) {
|
|
229
|
+
this.debug(`Write ${data[i].toString(16)} to ${(address + i).toString(16)}`);
|
|
230
|
+
rp2040.writeUint8(address + i, data[i]);
|
|
231
|
+
}
|
|
232
|
+
return (0, gdb_utils_js_1.gdbMessage)('OK');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return (0, gdb_utils_js_1.gdbMessage)('');
|
|
236
|
+
}
|
|
237
|
+
addConnection(connection) {
|
|
238
|
+
this.connections.add(connection);
|
|
239
|
+
this.rp2040.onBreak = () => {
|
|
240
|
+
this.rp2040.stop();
|
|
241
|
+
this.rp2040.core.PC -= this.rp2040.core.breakRewind;
|
|
242
|
+
for (const connection of this.connections) {
|
|
243
|
+
connection.onBreakpoint();
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
removeConnection(connection) {
|
|
248
|
+
this.connections.delete(connection);
|
|
249
|
+
}
|
|
250
|
+
debug(msg) {
|
|
251
|
+
this.logger.debug(LOG_NAME, msg);
|
|
252
|
+
}
|
|
253
|
+
info(msg) {
|
|
254
|
+
this.logger.info(LOG_NAME, msg);
|
|
255
|
+
}
|
|
256
|
+
warn(msg) {
|
|
257
|
+
this.logger.warn(LOG_NAME, msg);
|
|
258
|
+
}
|
|
259
|
+
error(msg) {
|
|
260
|
+
this.logger.error(LOG_NAME, msg);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
exports.GDBServer = GDBServer;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { Socket } from 'net';
|
|
3
|
-
import { GDBServer } from './gdb-server';
|
|
4
|
-
import { RP2040 } from '../rp2040';
|
|
5
|
-
export declare class GDBTCPServer extends GDBServer {
|
|
6
|
-
readonly port: number;
|
|
7
|
-
private socketServer;
|
|
8
|
-
constructor(rp2040: RP2040, port?: number);
|
|
9
|
-
handleConnection(socket: Socket): void;
|
|
10
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Socket } from 'net';
|
|
3
|
+
import { GDBServer } from './gdb-server.js';
|
|
4
|
+
import { RP2040 } from '../rp2040.js';
|
|
5
|
+
export declare class GDBTCPServer extends GDBServer {
|
|
6
|
+
readonly port: number;
|
|
7
|
+
private socketServer;
|
|
8
|
+
constructor(rp2040: RP2040, port?: number);
|
|
9
|
+
handleConnection(socket: Socket): void;
|
|
10
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GDBTCPServer = void 0;
|
|
4
|
-
const net_1 = require("net");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
class GDBTCPServer extends
|
|
8
|
-
constructor(rp2040, port = 3333) {
|
|
9
|
-
super(rp2040);
|
|
10
|
-
this.port = port;
|
|
11
|
-
this.socketServer = net_1.createServer();
|
|
12
|
-
this.socketServer.listen(port);
|
|
13
|
-
this.socketServer.on('connection', (socket) => this.handleConnection(socket));
|
|
14
|
-
}
|
|
15
|
-
handleConnection(socket) {
|
|
16
|
-
this.info('GDB connected');
|
|
17
|
-
socket.setNoDelay(true);
|
|
18
|
-
const connection = new
|
|
19
|
-
socket.write(data);
|
|
20
|
-
});
|
|
21
|
-
socket.on('data', (data) => {
|
|
22
|
-
connection.feedData(data.toString('utf-8'));
|
|
23
|
-
});
|
|
24
|
-
socket.on('error', (err) => {
|
|
25
|
-
this.removeConnection(connection);
|
|
26
|
-
this.error(`GDB socket error ${err}`);
|
|
27
|
-
});
|
|
28
|
-
socket.on('close', () => {
|
|
29
|
-
this.removeConnection(connection);
|
|
30
|
-
this.info('GDB disconnected');
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.GDBTCPServer = GDBTCPServer;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GDBTCPServer = void 0;
|
|
4
|
+
const net_1 = require("net");
|
|
5
|
+
const gdb_connection_js_1 = require("./gdb-connection.js");
|
|
6
|
+
const gdb_server_js_1 = require("./gdb-server.js");
|
|
7
|
+
class GDBTCPServer extends gdb_server_js_1.GDBServer {
|
|
8
|
+
constructor(rp2040, port = 3333) {
|
|
9
|
+
super(rp2040);
|
|
10
|
+
this.port = port;
|
|
11
|
+
this.socketServer = (0, net_1.createServer)();
|
|
12
|
+
this.socketServer.listen(port);
|
|
13
|
+
this.socketServer.on('connection', (socket) => this.handleConnection(socket));
|
|
14
|
+
}
|
|
15
|
+
handleConnection(socket) {
|
|
16
|
+
this.info('GDB connected');
|
|
17
|
+
socket.setNoDelay(true);
|
|
18
|
+
const connection = new gdb_connection_js_1.GDBConnection(this, (data) => {
|
|
19
|
+
socket.write(data);
|
|
20
|
+
});
|
|
21
|
+
socket.on('data', (data) => {
|
|
22
|
+
connection.feedData(data.toString('utf-8'));
|
|
23
|
+
});
|
|
24
|
+
socket.on('error', (err) => {
|
|
25
|
+
this.removeConnection(connection);
|
|
26
|
+
this.error(`GDB socket error ${err}`);
|
|
27
|
+
});
|
|
28
|
+
socket.on('close', () => {
|
|
29
|
+
this.removeConnection(connection);
|
|
30
|
+
this.info('GDB disconnected');
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.GDBTCPServer = GDBTCPServer;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export declare function encodeHexByte(value: number): string;
|
|
2
|
-
export declare function encodeHexBuf(buf: Uint8Array): string;
|
|
3
|
-
export declare function encodeHexUint32BE(value: number): string;
|
|
4
|
-
export declare function encodeHexUint32(value: number): string;
|
|
5
|
-
export declare function decodeHexBuf(encoded: string): Uint8Array;
|
|
6
|
-
export declare function decodeHexUint32Array(encoded: string): Uint32Array;
|
|
7
|
-
export declare function decodeHexUint32(encoded: string): number;
|
|
8
|
-
export declare function gdbChecksum(text: string): string;
|
|
9
|
-
export declare function gdbMessage(value: string): string;
|
|
1
|
+
export declare function encodeHexByte(value: number): string;
|
|
2
|
+
export declare function encodeHexBuf(buf: Uint8Array): string;
|
|
3
|
+
export declare function encodeHexUint32BE(value: number): string;
|
|
4
|
+
export declare function encodeHexUint32(value: number): string;
|
|
5
|
+
export declare function decodeHexBuf(encoded: string): Uint8Array;
|
|
6
|
+
export declare function decodeHexUint32Array(encoded: string): Uint32Array;
|
|
7
|
+
export declare function decodeHexUint32(encoded: string): number;
|
|
8
|
+
export declare function gdbChecksum(text: string): string;
|
|
9
|
+
export declare function gdbMessage(value: string): string;
|