@microbit/microbit-connection 0.0.0-tab.change.177 → 0.1.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/LICENSE.md +21 -0
- package/README.md +94 -5
- package/build/cjs/accelerometer-service.js +106 -0
- package/build/cjs/accelerometer-service.js.map +1 -0
- package/build/cjs/accelerometer.js +16 -0
- package/build/cjs/accelerometer.js.map +1 -0
- package/build/cjs/async-util.js +27 -0
- package/build/cjs/async-util.js.map +1 -0
- package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +7 -1
- package/build/cjs/bluetooth-device-wrapper.js +467 -0
- package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
- package/build/cjs/bluetooth-profile.js +86 -0
- package/build/cjs/bluetooth-profile.js.map +1 -0
- package/build/cjs/bluetooth.d.ts +108 -0
- package/build/cjs/bluetooth.js +272 -0
- package/build/cjs/bluetooth.js.map +1 -0
- package/build/cjs/board-id.js +81 -0
- package/build/cjs/board-id.js.map +1 -0
- package/build/cjs/board-serial-info.js +51 -0
- package/build/cjs/board-serial-info.js.map +1 -0
- package/build/cjs/button-service.js +80 -0
- package/build/cjs/button-service.js.map +1 -0
- package/build/cjs/buttons.js +22 -0
- package/build/cjs/buttons.js.map +1 -0
- package/build/cjs/constants.js +73 -0
- package/build/cjs/constants.js.map +1 -0
- package/build/{device.d.ts → cjs/device.d.ts} +6 -31
- package/build/cjs/device.js +133 -0
- package/build/cjs/device.js.map +1 -0
- package/build/{events.d.ts → cjs/events.d.ts} +1 -2
- package/build/cjs/events.js +109 -0
- package/build/cjs/events.js.map +1 -0
- package/build/cjs/hex-flash-data-source.js +26 -0
- package/build/cjs/hex-flash-data-source.js.map +1 -0
- package/build/cjs/index.d.ts +17 -0
- package/build/cjs/index.js +36 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/led-service.js +120 -0
- package/build/{led-service.js.map → cjs/led-service.js.map} +1 -1
- package/build/cjs/led.js +3 -0
- package/build/cjs/led.js.map +1 -0
- package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
- package/build/cjs/logging.js +16 -0
- package/build/cjs/logging.js.map +1 -0
- package/build/cjs/magnetometer-service.d.ts +22 -0
- package/build/cjs/magnetometer-service.js +129 -0
- package/build/cjs/magnetometer-service.js.map +1 -0
- package/build/cjs/magnetometer.d.ts +9 -0
- package/build/cjs/magnetometer.js +16 -0
- package/build/cjs/magnetometer.js.map +1 -0
- package/build/cjs/package.json +1 -0
- package/build/cjs/promise-queue.js +78 -0
- package/build/cjs/promise-queue.js.map +1 -0
- package/build/cjs/serial-events.d.ts +20 -0
- package/build/cjs/serial-events.js +69 -0
- package/build/cjs/serial-events.js.map +1 -0
- package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
- package/build/cjs/service-events.js +39 -0
- package/build/cjs/service-events.js.map +1 -0
- package/build/cjs/setupTests.js.map +1 -0
- package/build/cjs/uart-service.d.ts +13 -0
- package/build/cjs/uart-service.js +76 -0
- package/build/cjs/uart-service.js.map +1 -0
- package/build/cjs/uart.d.ts +4 -0
- package/build/cjs/uart.js +16 -0
- package/build/cjs/uart.js.map +1 -0
- package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
- package/build/cjs/usb-device-wrapper.js +412 -0
- package/build/cjs/usb-device-wrapper.js.map +1 -0
- package/build/cjs/usb-partial-flashing-utils.js +133 -0
- package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
- package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
- package/build/cjs/usb-partial-flashing.js +341 -0
- package/build/cjs/usb-partial-flashing.js.map +1 -0
- package/build/cjs/usb-radio-bridge.d.ts +24 -0
- package/build/cjs/usb-radio-bridge.js +516 -0
- package/build/cjs/usb-radio-bridge.js.map +1 -0
- package/build/cjs/usb-serial-protocol.js +183 -0
- package/build/cjs/usb-serial-protocol.js.map +1 -0
- package/build/cjs/usb.d.ts +64 -0
- package/build/cjs/usb.js +647 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- package/build/{accelerometer-service.js → esm/accelerometer-service.js} +1 -1
- package/build/esm/accelerometer-service.js.map +1 -0
- package/build/esm/accelerometer.d.ts +9 -0
- package/build/esm/accelerometer.js.map +1 -0
- package/build/esm/async-util.d.ts +13 -0
- package/build/esm/async-util.js.map +1 -0
- package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
- package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +39 -10
- package/build/esm/bluetooth-device-wrapper.js.map +1 -0
- package/build/esm/bluetooth-profile.d.ts +139 -0
- package/build/esm/bluetooth-profile.js.map +1 -0
- package/build/esm/bluetooth.d.ts +108 -0
- package/build/{bluetooth.js → esm/bluetooth.js} +29 -4
- package/build/esm/bluetooth.js.map +1 -0
- package/build/esm/board-id.d.ts +36 -0
- package/build/esm/board-id.js.map +1 -0
- package/build/esm/board-serial-info.d.ts +14 -0
- package/build/esm/board-serial-info.js.map +1 -0
- package/build/esm/button-service.d.ts +13 -0
- package/build/esm/button-service.js.map +1 -0
- package/build/esm/buttons.d.ts +10 -0
- package/build/esm/buttons.js.map +1 -0
- package/build/esm/constants.d.ts +48 -0
- package/build/esm/constants.js.map +1 -0
- package/build/esm/device.d.ts +181 -0
- package/build/{device.js → esm/device.js} +1 -57
- package/build/esm/device.js.map +1 -0
- package/build/esm/events.d.ts +110 -0
- package/build/esm/events.js.map +1 -0
- package/build/esm/hex-flash-data-source.d.ts +7 -0
- package/build/esm/hex-flash-data-source.js.map +1 -0
- package/build/esm/index.d.ts +17 -0
- package/build/esm/index.js +12 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/led-service.d.ts +20 -0
- package/build/esm/led-service.js.map +1 -0
- package/build/esm/led.d.ts +6 -0
- package/build/esm/led.js.map +1 -0
- package/build/esm/logging.d.ts +21 -0
- package/build/esm/logging.js.map +1 -0
- package/build/esm/magnetometer-service.d.ts +22 -0
- package/build/esm/magnetometer-service.js +125 -0
- package/build/esm/magnetometer-service.js.map +1 -0
- package/build/esm/magnetometer.d.ts +9 -0
- package/build/esm/magnetometer.js +12 -0
- package/build/esm/magnetometer.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/build/esm/promise-queue.d.ts +27 -0
- package/build/esm/promise-queue.js.map +1 -0
- package/build/esm/serial-events.d.ts +20 -0
- package/build/esm/serial-events.js +61 -0
- package/build/esm/serial-events.js.map +1 -0
- package/build/esm/service-events.d.ts +17 -0
- package/build/{service-events.js → esm/service-events.js} +12 -0
- package/build/esm/service-events.js.map +1 -0
- package/build/esm/setupTests.d.ts +6 -0
- package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
- package/build/esm/uart-service.d.ts +13 -0
- package/build/esm/uart-service.js +72 -0
- package/build/esm/uart-service.js.map +1 -0
- package/build/esm/uart.d.ts +4 -0
- package/build/esm/uart.js +12 -0
- package/build/esm/uart.js.map +1 -0
- package/build/esm/usb-device-wrapper.d.ts +47 -0
- package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +10 -9
- package/build/esm/usb-device-wrapper.js.map +1 -0
- package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
- package/build/esm/usb-partial-flashing-utils.js.map +1 -0
- package/build/esm/usb-partial-flashing.d.ts +69 -0
- package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
- package/build/esm/usb-partial-flashing.js.map +1 -0
- package/build/esm/usb-radio-bridge.d.ts +24 -0
- package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +11 -4
- package/build/esm/usb-radio-bridge.js.map +1 -0
- package/build/esm/usb-serial-protocol.d.ts +66 -0
- package/build/esm/usb-serial-protocol.js.map +1 -0
- package/build/esm/usb.d.ts +64 -0
- package/build/{usb.js → esm/usb.js} +228 -35
- package/build/esm/usb.js.map +1 -0
- package/package.json +21 -8
- package/typedoc.json +14 -0
- package/build/accelerometer-service.js.map +0 -1
- package/build/accelerometer.js.map +0 -1
- package/build/async-util.js.map +0 -1
- package/build/bluetooth-device-wrapper.js.map +0 -1
- package/build/bluetooth-profile.js.map +0 -1
- package/build/bluetooth.d.ts +0 -54
- package/build/bluetooth.js.map +0 -1
- package/build/board-id.js.map +0 -1
- package/build/board-serial-info.js.map +0 -1
- package/build/button-service.js.map +0 -1
- package/build/buttons.js.map +0 -1
- package/build/constants.js.map +0 -1
- package/build/device.js.map +0 -1
- package/build/events.js.map +0 -1
- package/build/hex-flash-data-source.js.map +0 -1
- package/build/index.d.ts +0 -10
- package/build/index.js +0 -8
- package/build/index.js.map +0 -1
- package/build/led.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/promise-queue.js.map +0 -1
- package/build/service-events.js.map +0 -1
- package/build/usb-device-wrapper.js.map +0 -1
- package/build/usb-partial-flashing-utils.js.map +0 -1
- package/build/usb-partial-flashing.js.map +0 -1
- package/build/usb-radio-bridge.d.ts +0 -41
- package/build/usb-radio-bridge.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- package/build/usb.d.ts +0 -54
- package/build/usb.js.map +0 -1
- package/vite.config.ts +0 -34
- /package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +0 -0
- /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
- /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
- /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
- /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
- /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
- /package/build/{button-service.d.ts → cjs/button-service.d.ts} +0 -0
- /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
- /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
- /package/build/{led-service.d.ts → cjs/led-service.d.ts} +0 -0
- /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
- /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
- /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
- /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
- /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
- /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
- /package/build/{async-util.js → esm/async-util.js} +0 -0
- /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
- /package/build/{board-id.js → esm/board-id.js} +0 -0
- /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
- /package/build/{button-service.js → esm/button-service.js} +0 -0
- /package/build/{buttons.js → esm/buttons.js} +0 -0
- /package/build/{constants.js → esm/constants.js} +0 -0
- /package/build/{events.js → esm/events.js} +0 -0
- /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
- /package/build/{led-service.js → esm/led-service.js} +0 -0
- /package/build/{led.js → esm/led.js} +0 -0
- /package/build/{logging.js → esm/logging.js} +0 -0
- /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
- /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
- /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DAPWrapper = void 0;
|
|
27
|
+
/**
|
|
28
|
+
* (c) 2021, Micro:bit Educational Foundation and contributors
|
|
29
|
+
*
|
|
30
|
+
* SPDX-License-Identifier: MIT
|
|
31
|
+
*/
|
|
32
|
+
const dapjs = __importStar(require("dapjs"));
|
|
33
|
+
const { CortexM: CortexMValue, DAPLink: DAPLinkValue, WebUSB: WebUSBValue, } = dapjs;
|
|
34
|
+
const constants_js_1 = require("./constants.js");
|
|
35
|
+
const usb_partial_flashing_utils_js_1 = require("./usb-partial-flashing-utils.js");
|
|
36
|
+
const board_serial_info_js_1 = require("./board-serial-info.js");
|
|
37
|
+
class DAPWrapper {
|
|
38
|
+
constructor(device, logging) {
|
|
39
|
+
Object.defineProperty(this, "device", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: device
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "logging", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: logging
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(this, "transport", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: void 0
|
|
56
|
+
});
|
|
57
|
+
Object.defineProperty(this, "daplink", {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
configurable: true,
|
|
60
|
+
writable: true,
|
|
61
|
+
value: void 0
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(this, "cortexM", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: void 0
|
|
68
|
+
});
|
|
69
|
+
Object.defineProperty(this, "_pageSize", {
|
|
70
|
+
enumerable: true,
|
|
71
|
+
configurable: true,
|
|
72
|
+
writable: true,
|
|
73
|
+
value: void 0
|
|
74
|
+
});
|
|
75
|
+
Object.defineProperty(this, "_numPages", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
configurable: true,
|
|
78
|
+
writable: true,
|
|
79
|
+
value: void 0
|
|
80
|
+
});
|
|
81
|
+
Object.defineProperty(this, "_deviceId", {
|
|
82
|
+
enumerable: true,
|
|
83
|
+
configurable: true,
|
|
84
|
+
writable: true,
|
|
85
|
+
value: void 0
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(this, "loggedBoardSerialInfo", {
|
|
88
|
+
enumerable: true,
|
|
89
|
+
configurable: true,
|
|
90
|
+
writable: true,
|
|
91
|
+
value: void 0
|
|
92
|
+
});
|
|
93
|
+
Object.defineProperty(this, "initialConnectionComplete", {
|
|
94
|
+
enumerable: true,
|
|
95
|
+
configurable: true,
|
|
96
|
+
writable: true,
|
|
97
|
+
value: false
|
|
98
|
+
});
|
|
99
|
+
this.transport = new WebUSBValue(this.device);
|
|
100
|
+
this.daplink = new DAPLinkValue(this.transport);
|
|
101
|
+
this.cortexM = new CortexMValue(this.transport);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The page size. Throws if we've not connected.
|
|
105
|
+
*/
|
|
106
|
+
get pageSize() {
|
|
107
|
+
if (this._pageSize === undefined) {
|
|
108
|
+
throw new Error("pageSize not defined until connected");
|
|
109
|
+
}
|
|
110
|
+
return this._pageSize;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The number of pages. Throws if we've not connected.
|
|
114
|
+
*/
|
|
115
|
+
get numPages() {
|
|
116
|
+
if (this._numPages === undefined) {
|
|
117
|
+
throw new Error("numPages not defined until connected");
|
|
118
|
+
}
|
|
119
|
+
return this._numPages;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The number of pages. Undefined if we've not connected.
|
|
123
|
+
*/
|
|
124
|
+
get deviceId() {
|
|
125
|
+
return this._deviceId;
|
|
126
|
+
}
|
|
127
|
+
get boardSerialInfo() {
|
|
128
|
+
return board_serial_info_js_1.BoardSerialInfo.parse(this.device, this.logging.log.bind(this.logging));
|
|
129
|
+
}
|
|
130
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L119
|
|
131
|
+
async reconnectAsync() {
|
|
132
|
+
if (this.initialConnectionComplete) {
|
|
133
|
+
await this.disconnectAsync();
|
|
134
|
+
this.transport = new WebUSBValue(this.device);
|
|
135
|
+
this.daplink = new DAPLinkValue(this.transport);
|
|
136
|
+
this.cortexM = new CortexMValue(this.transport);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.initialConnectionComplete = true;
|
|
140
|
+
}
|
|
141
|
+
await this.daplink.connect();
|
|
142
|
+
await this.cortexM.connect();
|
|
143
|
+
this.logging.event({
|
|
144
|
+
type: "WebUSB-info",
|
|
145
|
+
message: "connected",
|
|
146
|
+
});
|
|
147
|
+
const serialInfo = this.boardSerialInfo;
|
|
148
|
+
this.logging.log(`Detected board ID ${serialInfo.id}`);
|
|
149
|
+
if (!this.loggedBoardSerialInfo ||
|
|
150
|
+
!this.loggedBoardSerialInfo.eq(this.boardSerialInfo)) {
|
|
151
|
+
this.loggedBoardSerialInfo = this.boardSerialInfo;
|
|
152
|
+
this.logging.event({
|
|
153
|
+
type: "WebUSB-info",
|
|
154
|
+
message: "board-id/" + this.boardSerialInfo.id,
|
|
155
|
+
});
|
|
156
|
+
this.logging.event({
|
|
157
|
+
type: "WebUSB-info",
|
|
158
|
+
message: "board-family-hic/" +
|
|
159
|
+
this.boardSerialInfo.familyId +
|
|
160
|
+
this.boardSerialInfo.hic,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// https://support.microbit.org/support/solutions/articles/19000067679-how-to-find-the-name-of-your-micro-bit
|
|
164
|
+
// We wait on errors as immediately after flash the micro:bit won't be ready to respond
|
|
165
|
+
this._deviceId = await this.readMem32WaitOnError(constants_js_1.FICR.DEVICE_ID_1);
|
|
166
|
+
this._pageSize = await this.readMem32WaitOnError(constants_js_1.FICR.CODEPAGESIZE);
|
|
167
|
+
this._numPages = await this.readMem32WaitOnError(constants_js_1.FICR.CODESIZE);
|
|
168
|
+
}
|
|
169
|
+
async readMem32WaitOnError(register) {
|
|
170
|
+
let retries = 0;
|
|
171
|
+
let lastError;
|
|
172
|
+
while (retries < 20) {
|
|
173
|
+
try {
|
|
174
|
+
return await this.cortexM.readMem32(register);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
if (e instanceof Error) {
|
|
178
|
+
lastError = e;
|
|
179
|
+
if (/^Transfer/.test(e.message)) {
|
|
180
|
+
retries++;
|
|
181
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw e;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
throw lastError;
|
|
190
|
+
}
|
|
191
|
+
async startSerial(listener) {
|
|
192
|
+
const currentBaud = await this.daplink.getSerialBaudrate();
|
|
193
|
+
if (currentBaud !== 115200) {
|
|
194
|
+
// Changing the baud rate causes a micro:bit reset, so only do it if necessary
|
|
195
|
+
await this.daplink.setSerialBaudrate(115200);
|
|
196
|
+
}
|
|
197
|
+
this.daplink.addListener(DAPLinkValue.EVENT_SERIAL_DATA, listener);
|
|
198
|
+
await this.daplink.startSerialRead(1);
|
|
199
|
+
}
|
|
200
|
+
stopSerial(listener) {
|
|
201
|
+
this.daplink.stopSerialRead();
|
|
202
|
+
this.daplink.removeListener(DAPLinkValue.EVENT_SERIAL_DATA, listener);
|
|
203
|
+
}
|
|
204
|
+
async disconnectAsync() {
|
|
205
|
+
if (this.device.opened &&
|
|
206
|
+
this.transport.interfaceNumber !== undefined) {
|
|
207
|
+
return this.daplink.disconnect();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Send a packet to the micro:bit directly via WebUSB and return the response.
|
|
211
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/transport/cmsis_dap.ts#L161
|
|
212
|
+
async send(packet) {
|
|
213
|
+
const array = Uint8Array.from(packet);
|
|
214
|
+
await this.transport.write(array.buffer);
|
|
215
|
+
const response = await this.transport.read();
|
|
216
|
+
return new Uint8Array(response.buffer);
|
|
217
|
+
}
|
|
218
|
+
// Send a command along with relevant data to the micro:bit directly via WebUSB and handle the response.
|
|
219
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/transport/cmsis_dap.ts#L74
|
|
220
|
+
async cmdNums(op /* DapCmd */, data) {
|
|
221
|
+
data.unshift(op);
|
|
222
|
+
const buf = await this.send(data);
|
|
223
|
+
if (buf[0] !== op) {
|
|
224
|
+
throw new Error(`Bad response for ${op} -> ${buf[0]}`);
|
|
225
|
+
}
|
|
226
|
+
switch (op) {
|
|
227
|
+
case constants_js_1.DapCmd.DAP_CONNECT:
|
|
228
|
+
case constants_js_1.DapCmd.DAP_INFO:
|
|
229
|
+
case constants_js_1.DapCmd.DAP_TRANSFER:
|
|
230
|
+
case constants_js_1.DapCmd.DAP_TRANSFER_BLOCK:
|
|
231
|
+
break;
|
|
232
|
+
default:
|
|
233
|
+
if (buf[1] !== 0) {
|
|
234
|
+
throw new Error(`Bad status for ${op} -> ${buf[1]}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return buf;
|
|
238
|
+
}
|
|
239
|
+
// Read a certain register a specified amount of times.
|
|
240
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/dap/dap.ts#L117
|
|
241
|
+
async readRegRepeat(regId /* Reg */, cnt) {
|
|
242
|
+
const request = (0, usb_partial_flashing_utils_js_1.regRequest)(regId);
|
|
243
|
+
const sendargs = [0, cnt];
|
|
244
|
+
for (let i = 0; i < cnt; ++i) {
|
|
245
|
+
sendargs.push(request);
|
|
246
|
+
}
|
|
247
|
+
// Transfer the read requests to the micro:bit and retrieve the data read.
|
|
248
|
+
const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER, sendargs);
|
|
249
|
+
if (buf[1] !== cnt) {
|
|
250
|
+
throw new Error("(many) Bad #trans " + buf[1]);
|
|
251
|
+
}
|
|
252
|
+
else if (buf[2] !== 1) {
|
|
253
|
+
throw new Error("(many) Bad transfer status " + buf[2]);
|
|
254
|
+
}
|
|
255
|
+
return buf.subarray(3, 3 + cnt * 4);
|
|
256
|
+
}
|
|
257
|
+
// Write to a certain register a specified amount of data.
|
|
258
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/dap/dap.ts#L138
|
|
259
|
+
async writeRegRepeat(regId /* Reg */, data) {
|
|
260
|
+
const request = (0, usb_partial_flashing_utils_js_1.regRequest)(regId, true);
|
|
261
|
+
const sendargs = [0, data.length, 0, request];
|
|
262
|
+
data.forEach((d) => {
|
|
263
|
+
// separate d into bytes
|
|
264
|
+
sendargs.push(d & 0xff, (d >> 8) & 0xff, (d >> 16) & 0xff, (d >> 24) & 0xff);
|
|
265
|
+
});
|
|
266
|
+
// Transfer the write requests to the micro:bit and retrieve the response status.
|
|
267
|
+
const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER_BLOCK, sendargs);
|
|
268
|
+
if (buf[3] !== 1) {
|
|
269
|
+
throw new Error("(many-wr) Bad transfer status " + buf[2]);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Core functionality reading a block of data from micro:bit RAM at a specified address.
|
|
273
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/memory/memory.ts#L181
|
|
274
|
+
async readBlockCore(addr, words) {
|
|
275
|
+
// Set up CMSIS-DAP to read/write from/to the RAM address addr using the register
|
|
276
|
+
// ApReg.DRW to write to or read from.
|
|
277
|
+
await this.cortexM.writeAP(constants_js_1.ApReg.CSW, constants_js_1.Csw.CSW_VALUE | constants_js_1.Csw.CSW_SIZE32);
|
|
278
|
+
await this.cortexM.writeAP(constants_js_1.ApReg.TAR, addr);
|
|
279
|
+
let lastSize = words % 15;
|
|
280
|
+
if (lastSize === 0) {
|
|
281
|
+
lastSize = 15;
|
|
282
|
+
}
|
|
283
|
+
const blocks = [];
|
|
284
|
+
for (let i = 0; i < Math.ceil(words / 15); i++) {
|
|
285
|
+
const b = await this.readRegRepeat((0, usb_partial_flashing_utils_js_1.apReg)(constants_js_1.ApReg.DRW, constants_js_1.DapVal.READ), i === blocks.length - 1 ? lastSize : 15);
|
|
286
|
+
blocks.push(b);
|
|
287
|
+
}
|
|
288
|
+
return (0, usb_partial_flashing_utils_js_1.bufferConcat)(blocks).subarray(0, words * 4);
|
|
289
|
+
}
|
|
290
|
+
// Core functionality writing a block of data to micro:bit RAM at a specified address.
|
|
291
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/memory/memory.ts#L205
|
|
292
|
+
async writeBlockCore(addr, words) {
|
|
293
|
+
try {
|
|
294
|
+
// Set up CMSIS-DAP to read/write from/to the RAM address addr using the register ApReg.DRW to write to or read from.
|
|
295
|
+
await this.cortexM.writeAP(constants_js_1.ApReg.CSW, constants_js_1.Csw.CSW_VALUE | constants_js_1.Csw.CSW_SIZE32);
|
|
296
|
+
await this.cortexM.writeAP(constants_js_1.ApReg.TAR, addr);
|
|
297
|
+
await this.writeRegRepeat((0, usb_partial_flashing_utils_js_1.apReg)(constants_js_1.ApReg.DRW, constants_js_1.DapVal.WRITE), words);
|
|
298
|
+
}
|
|
299
|
+
catch (e) {
|
|
300
|
+
if (e.dapWait) {
|
|
301
|
+
// Retry after a delay if required.
|
|
302
|
+
this.logging.log(`Transfer wait, write block`);
|
|
303
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
304
|
+
return await this.writeBlockCore(addr, words);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
throw e;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Reads a block of data from micro:bit RAM at a specified address.
|
|
312
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/memory/memory.ts#L143
|
|
313
|
+
async readBlockAsync(addr, words) {
|
|
314
|
+
const bufs = [];
|
|
315
|
+
const end = addr + words * 4;
|
|
316
|
+
let ptr = addr;
|
|
317
|
+
// Read a single page at a time.
|
|
318
|
+
while (ptr < end) {
|
|
319
|
+
let nextptr = ptr + this.pageSize;
|
|
320
|
+
if (ptr === addr) {
|
|
321
|
+
nextptr &= ~(this.pageSize - 1);
|
|
322
|
+
}
|
|
323
|
+
const len = Math.min(nextptr - ptr, end - ptr);
|
|
324
|
+
bufs.push(await this.readBlockCore(ptr, len >> 2));
|
|
325
|
+
ptr = nextptr;
|
|
326
|
+
}
|
|
327
|
+
const result = (0, usb_partial_flashing_utils_js_1.bufferConcat)(bufs);
|
|
328
|
+
return result.subarray(0, words * 4);
|
|
329
|
+
}
|
|
330
|
+
// Writes a block of data to micro:bit RAM at a specified address.
|
|
331
|
+
async writeBlockAsync(address, data) {
|
|
332
|
+
let payloadSize = this.transport.packetSize - 8;
|
|
333
|
+
if (data.buffer.byteLength > payloadSize) {
|
|
334
|
+
let start = 0;
|
|
335
|
+
let end = payloadSize;
|
|
336
|
+
// Split write up into smaller writes whose data can each be held in a single packet.
|
|
337
|
+
while (start !== end) {
|
|
338
|
+
let temp = new Uint32Array(data.buffer.slice(start, end));
|
|
339
|
+
await this.writeBlockCore(address + start, temp);
|
|
340
|
+
start = end;
|
|
341
|
+
end = Math.min(data.buffer.byteLength, end + payloadSize);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
await this.writeBlockCore(address, data);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Execute code at a certain address with specified values in the registers.
|
|
349
|
+
// Waits for execution to halt.
|
|
350
|
+
async executeAsync(address, code, sp, pc, lr, ...registers) {
|
|
351
|
+
if (registers.length > 12) {
|
|
352
|
+
throw new Error(`Only 12 general purpose registers but got ${registers.length} values`);
|
|
353
|
+
}
|
|
354
|
+
await this.cortexM.halt(true);
|
|
355
|
+
await this.writeBlockAsync(address, code);
|
|
356
|
+
await this.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.PC, pc);
|
|
357
|
+
await this.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.LR, lr);
|
|
358
|
+
await this.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.SP, sp);
|
|
359
|
+
for (let i = 0; i < registers.length; ++i) {
|
|
360
|
+
await this.cortexM.writeCoreRegister(i, registers[i]);
|
|
361
|
+
}
|
|
362
|
+
await this.cortexM.resume(true);
|
|
363
|
+
return this.waitForHalt();
|
|
364
|
+
}
|
|
365
|
+
// Checks whether the micro:bit has halted or timeout has been reached.
|
|
366
|
+
// Recurses otherwise.
|
|
367
|
+
async waitForHaltCore(halted, deadline) {
|
|
368
|
+
if (new Date().getTime() > deadline) {
|
|
369
|
+
throw new Error("timeout");
|
|
370
|
+
}
|
|
371
|
+
if (!halted) {
|
|
372
|
+
const isHalted = await this.cortexM.isHalted();
|
|
373
|
+
// NB this is a Promise so no stack risk.
|
|
374
|
+
return this.waitForHaltCore(isHalted, deadline);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Initial function to call to wait for the micro:bit halt.
|
|
378
|
+
async waitForHalt(timeToWait = 10000) {
|
|
379
|
+
const deadline = new Date().getTime() + timeToWait;
|
|
380
|
+
return this.waitForHaltCore(false, deadline);
|
|
381
|
+
}
|
|
382
|
+
// Resets the micro:bit in software by writing to NVIC_AIRCR.
|
|
383
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/cortex/cortex.ts#L347
|
|
384
|
+
async softwareReset() {
|
|
385
|
+
await this.cortexM.writeMem32(constants_js_1.CortexSpecialReg.NVIC_AIRCR, constants_js_1.CortexSpecialReg.NVIC_AIRCR_VECTKEY |
|
|
386
|
+
constants_js_1.CortexSpecialReg.NVIC_AIRCR_SYSRESETREQ);
|
|
387
|
+
// wait for the system to come out of reset
|
|
388
|
+
let dhcsr = await this.cortexM.readMem32(constants_js_1.CortexSpecialReg.DHCSR);
|
|
389
|
+
while ((dhcsr & constants_js_1.CortexSpecialReg.S_RESET_ST) !== 0) {
|
|
390
|
+
dhcsr = await this.cortexM.readMem32(constants_js_1.CortexSpecialReg.DHCSR);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Reset the micro:bit, possibly halting the core on reset.
|
|
394
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/cortex/cortex.ts#L248
|
|
395
|
+
async reset(halt = false) {
|
|
396
|
+
if (halt) {
|
|
397
|
+
await this.cortexM.halt(true);
|
|
398
|
+
// VC_CORERESET causes the core to halt on reset.
|
|
399
|
+
const demcr = await this.cortexM.readMem32(constants_js_1.CortexSpecialReg.DEMCR);
|
|
400
|
+
await this.cortexM.writeMem32(constants_js_1.CortexSpecialReg.DEMCR, constants_js_1.CortexSpecialReg.DEMCR | constants_js_1.CortexSpecialReg.DEMCR_VC_CORERESET);
|
|
401
|
+
await this.softwareReset();
|
|
402
|
+
await this.waitForHalt();
|
|
403
|
+
// Unset the VC_CORERESET bit
|
|
404
|
+
await this.cortexM.writeMem32(constants_js_1.CortexSpecialReg.DEMCR, demcr);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
await this.softwareReset();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
exports.DAPWrapper = DAPWrapper;
|
|
412
|
+
//# sourceMappingURL=usb-device-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usb-device-wrapper.js","sourceRoot":"","sources":["../../lib/usb-device-wrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,6CAA+B;AAG/B,MAAM,EACJ,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,WAAW,GACpB,GAAG,KAAK,CAAC;AAEV,iDAOwB;AACxB,mFAKyC;AACzC,iEAAyD;AAEzD,MAAa,UAAU;IAarB,YACS,MAAiB,EAChB,OAAgB;QADxB;;;;mBAAO,MAAM;WAAW;QACxB;;;;mBAAQ,OAAO;WAAS;QAd1B;;;;;WAAkB;QAClB;;;;;WAAiB;QACjB;;;;;WAAiB;QAEjB;;;;;WAA8B;QAC9B;;;;;WAA8B;QAC9B;;;;;WAA8B;QAEtB;;;;;WAAmD;QAEnD;;;;mBAAqC,KAAK;WAAC;QAMjD,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,sCAAe,CAAC,KAAK,CAC1B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,+HAA+H;IAC/H,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAEvD,IACE,CAAC,IAAI,CAAC,qBAAqB;YAC3B,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EACpD,CAAC;YACD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE;aAC/C,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,aAAa;gBACnB,OAAO,EACL,mBAAmB;oBACnB,IAAI,CAAC,eAAe,CAAC,QAAQ;oBAC7B,IAAI,CAAC,eAAe,CAAC,GAAG;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,6GAA6G;QAC7G,uFAAuF;QACvF,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,mBAAI,CAAC,WAAW,CAAC,CAAC;QAEnE,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,mBAAI,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,mBAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QACzC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAA4B,CAAC;QACjC,OAAO,OAAO,GAAG,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;oBACvB,SAAS,GAAG,CAAC,CAAC;oBACd,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChC,OAAO,EAAE,CAAC;wBACV,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC1D,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgC;QAChD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC3D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,8EAA8E;YAC9E,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,QAAgC;QACzC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IACE,IAAI,CAAC,MAAM,CAAC,MAAM;YACjB,IAAI,CAAC,SAAiB,CAAC,eAAe,KAAK,SAAS,EACrD,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,4HAA4H;IACpH,KAAK,CAAC,IAAI,CAAC,MAAgB;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,wGAAwG;IACxG,2HAA2H;IACnH,KAAK,CAAC,OAAO,CACnB,EAAU,CAAC,YAAY,EACvB,IAAc;QAEd,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,qBAAM,CAAC,WAAW,CAAC;YACxB,KAAK,qBAAM,CAAC,QAAQ,CAAC;YACrB,KAAK,qBAAM,CAAC,YAAY,CAAC;YACzB,KAAK,qBAAM,CAAC,kBAAkB;gBAC5B,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvD,CAAC;QACL,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,uDAAuD;IACvD,gHAAgH;IACxG,KAAK,CAAC,aAAa,CACzB,KAAa,CAAC,SAAS,EACvB,GAAW;QAEX,MAAM,OAAO,GAAG,IAAA,0CAAU,EAAC,KAAK,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,0EAA0E;QAC1E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,0DAA0D;IAC1D,gHAAgH;IACxG,KAAK,CAAC,cAAc,CAC1B,KAAa,CAAC,SAAS,EACvB,IAAiB;QAEjB,MAAM,OAAO,GAAG,IAAA,0CAAU,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,wBAAwB;YACxB,QAAQ,CAAC,IAAI,CACX,CAAC,GAAG,IAAI,EACR,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EACf,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAChB,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,iFAAiF;QACjF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAEpE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,wFAAwF;IACxF,sHAAsH;IAC9G,KAAK,CAAC,aAAa,CACzB,IAAY,EACZ,KAAa;QAEb,iFAAiF;QACjF,sCAAsC;QACtC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAK,CAAC,GAAG,EAAE,kBAAG,CAAC,SAAS,GAAG,kBAAG,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE5C,IAAI,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAe,MAAM,IAAI,CAAC,aAAa,CAC5C,IAAA,qCAAK,EAAC,oBAAK,CAAC,GAAG,EAAE,qBAAM,CAAC,IAAI,CAAC,EAC7B,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,IAAA,4CAAY,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,sFAAsF;IACtF,sHAAsH;IAC9G,KAAK,CAAC,cAAc,CAC1B,IAAY,EACZ,KAAkB;QAElB,IAAI,CAAC;YACH,qHAAqH;YACrH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAK,CAAC,GAAG,EAAE,kBAAG,CAAC,SAAS,GAAG,kBAAG,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAE5C,MAAM,IAAI,CAAC,cAAc,CAAC,IAAA,qCAAK,EAAC,oBAAK,CAAC,GAAG,EAAE,qBAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,mCAAmC;gBACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,sHAAsH;IACtH,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,KAAa;QAC9C,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC;QAEf,gCAAgC;QAChC,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YAClC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnD,GAAG,GAAG,OAAO,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,4CAAY,EAAC,IAAI,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,IAAiB;QACtD,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,WAAW,EAAE,CAAC;YACzC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,GAAG,GAAG,WAAW,CAAC;YAEtB,qFAAqF;YACrF,OAAO,KAAK,KAAK,GAAG,EAAE,CAAC;gBACrB,IAAI,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC1D,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEjD,KAAK,GAAG,GAAG,CAAC;gBACZ,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,+BAA+B;IAC/B,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,IAAiB,EACjB,EAAU,EACV,EAAU,EACV,EAAU,EACV,GAAG,SAAmB;QAEtB,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,CAAC,MAAM,SAAS,CACvE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,4CAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,4CAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,4CAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,uEAAuE;IACvE,sBAAsB;IACd,KAAK,CAAC,eAAe,CAC3B,MAAe,EACf,QAAgB;QAEhB,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC/C,yCAAyC;YACzC,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK;QAClC,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;QACnD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,6DAA6D;IAC7D,sHAAsH;IACtH,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAC3B,+BAAgB,CAAC,UAAU,EAC3B,+BAAgB,CAAC,kBAAkB;YACjC,+BAAgB,CAAC,sBAAsB,CAC1C,CAAC;QAEF,2CAA2C;QAC3C,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,+BAAgB,CAAC,KAAK,CAAC,CAAC;QAEjE,OAAO,CAAC,KAAK,GAAG,+BAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,+BAAgB,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,sHAAsH;IACtH,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;QACtB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE9B,iDAAiD;YACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,+BAAgB,CAAC,KAAK,CAAC,CAAC;YACnE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAC3B,+BAAgB,CAAC,KAAK,EACtB,+BAAgB,CAAC,KAAK,GAAG,+BAAgB,CAAC,kBAAkB,CAC7D,CAAC;YAEF,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAEzB,6BAA6B;YAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,+BAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAxaD,gCAwaC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.onlyChanged = exports.pageAlignBlocks = exports.Page = exports.regRequest = exports.apReg = exports.murmur3_core = exports.bufferConcat = exports.read32FromUInt8Array = exports.CoreRegister = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* (c) 2021, Micro:bit Educational Foundation and contributors
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
*/
|
|
9
|
+
const constants_js_1 = require("./constants.js");
|
|
10
|
+
// Represents the micro:bit's core registers
|
|
11
|
+
// Drawn from https://armmbed.github.io/dapjs/docs/enums/coreregister.html
|
|
12
|
+
exports.CoreRegister = {
|
|
13
|
+
SP: 13,
|
|
14
|
+
LR: 14,
|
|
15
|
+
PC: 15,
|
|
16
|
+
};
|
|
17
|
+
const read32FromUInt8Array = (data, i) => {
|
|
18
|
+
return ((data[i] |
|
|
19
|
+
(data[i + 1] << 8) |
|
|
20
|
+
(data[i + 2] << 16) |
|
|
21
|
+
(data[i + 3] << 24)) >>>
|
|
22
|
+
0);
|
|
23
|
+
};
|
|
24
|
+
exports.read32FromUInt8Array = read32FromUInt8Array;
|
|
25
|
+
const bufferConcat = (bufs) => {
|
|
26
|
+
let len = 0;
|
|
27
|
+
for (const b of bufs) {
|
|
28
|
+
len += b.length;
|
|
29
|
+
}
|
|
30
|
+
const r = new Uint8Array(len);
|
|
31
|
+
len = 0;
|
|
32
|
+
for (const b of bufs) {
|
|
33
|
+
r.set(b, len);
|
|
34
|
+
len += b.length;
|
|
35
|
+
}
|
|
36
|
+
return r;
|
|
37
|
+
};
|
|
38
|
+
exports.bufferConcat = bufferConcat;
|
|
39
|
+
// Returns the MurmurHash of the data passed to it, used for checksum calculation.
|
|
40
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L14
|
|
41
|
+
const murmur3_core = (data) => {
|
|
42
|
+
let h0 = 0x2f9be6cc;
|
|
43
|
+
let h1 = 0x1ec3a6c8;
|
|
44
|
+
for (let i = 0; i < data.byteLength; i += 4) {
|
|
45
|
+
let k = (0, exports.read32FromUInt8Array)(data, i) >>> 0;
|
|
46
|
+
k = Math.imul(k, 0xcc9e2d51);
|
|
47
|
+
k = (k << 15) | (k >>> 17);
|
|
48
|
+
k = Math.imul(k, 0x1b873593);
|
|
49
|
+
h0 ^= k;
|
|
50
|
+
h1 ^= k;
|
|
51
|
+
h0 = (h0 << 13) | (h0 >>> 19);
|
|
52
|
+
h1 = (h1 << 13) | (h1 >>> 19);
|
|
53
|
+
h0 = (Math.imul(h0, 5) + 0xe6546b64) >>> 0;
|
|
54
|
+
h1 = (Math.imul(h1, 5) + 0xe6546b64) >>> 0;
|
|
55
|
+
}
|
|
56
|
+
return [h0, h1];
|
|
57
|
+
};
|
|
58
|
+
exports.murmur3_core = murmur3_core;
|
|
59
|
+
// Returns a representation of an Access Port Register.
|
|
60
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/util.ts#L63
|
|
61
|
+
const apReg = (r, mode) => {
|
|
62
|
+
const v = r | mode | constants_js_1.DapVal.AP_ACC;
|
|
63
|
+
return 4 + ((v & 0x0c) >> 2);
|
|
64
|
+
};
|
|
65
|
+
exports.apReg = apReg;
|
|
66
|
+
// Returns a code representing a request to read/write a certain register.
|
|
67
|
+
// Drawn from https://github.com/mmoskal/dapjs/blob/a32f11f54e9e76a9c61896ddd425c1cb1a29c143/src/util.ts#L92
|
|
68
|
+
const regRequest = (regId, isWrite = false) => {
|
|
69
|
+
let request = !isWrite ? 1 << 1 /* READ */ : 0 << 1; /* WRITE */
|
|
70
|
+
if (regId < 4) {
|
|
71
|
+
request |= 0 << 0 /* DP_ACC */;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
request |= 1 << 0 /* AP_ACC */;
|
|
75
|
+
}
|
|
76
|
+
request |= (regId & 3) << 2;
|
|
77
|
+
return request;
|
|
78
|
+
};
|
|
79
|
+
exports.regRequest = regRequest;
|
|
80
|
+
class Page {
|
|
81
|
+
constructor(targetAddr, data) {
|
|
82
|
+
Object.defineProperty(this, "targetAddr", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
configurable: true,
|
|
85
|
+
writable: true,
|
|
86
|
+
value: targetAddr
|
|
87
|
+
});
|
|
88
|
+
Object.defineProperty(this, "data", {
|
|
89
|
+
enumerable: true,
|
|
90
|
+
configurable: true,
|
|
91
|
+
writable: true,
|
|
92
|
+
value: data
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.Page = Page;
|
|
97
|
+
// Split buffer into pages, each of pageSize size.
|
|
98
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L209
|
|
99
|
+
const pageAlignBlocks = (buffer, targetAddr, pageSize) => {
|
|
100
|
+
let unaligned = new Uint8Array(buffer);
|
|
101
|
+
let pages = [];
|
|
102
|
+
for (let i = 0; i < unaligned.byteLength;) {
|
|
103
|
+
let newbuf = new Uint8Array(pageSize).fill(0xff);
|
|
104
|
+
let startPad = (targetAddr + i) & (pageSize - 1);
|
|
105
|
+
let newAddr = targetAddr + i - startPad;
|
|
106
|
+
for (; i < unaligned.byteLength; ++i) {
|
|
107
|
+
if (targetAddr + i >= newAddr + pageSize)
|
|
108
|
+
break;
|
|
109
|
+
newbuf[targetAddr + i - newAddr] = unaligned[i];
|
|
110
|
+
}
|
|
111
|
+
let page = new Page(newAddr, newbuf);
|
|
112
|
+
pages.push(page);
|
|
113
|
+
}
|
|
114
|
+
return pages;
|
|
115
|
+
};
|
|
116
|
+
exports.pageAlignBlocks = pageAlignBlocks;
|
|
117
|
+
// Filter out all pages whose calculated checksum matches the corresponding checksum passed as an argument.
|
|
118
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L523
|
|
119
|
+
const onlyChanged = (pages, checksums, pageSize) => {
|
|
120
|
+
return pages.filter((page) => {
|
|
121
|
+
let idx = page.targetAddr / pageSize;
|
|
122
|
+
if (idx * 8 + 8 > checksums.length)
|
|
123
|
+
return true; // out of range?
|
|
124
|
+
let c0 = (0, exports.read32FromUInt8Array)(checksums, idx * 8);
|
|
125
|
+
let c1 = (0, exports.read32FromUInt8Array)(checksums, idx * 8 + 4);
|
|
126
|
+
let ch = (0, exports.murmur3_core)(page.data);
|
|
127
|
+
if (c0 === ch[0] && c1 === ch[1])
|
|
128
|
+
return false;
|
|
129
|
+
return true;
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
exports.onlyChanged = onlyChanged;
|
|
133
|
+
//# sourceMappingURL=usb-partial-flashing-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usb-partial-flashing-utils.js","sourceRoot":"","sources":["../../lib/usb-partial-flashing-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
*/
|
|
40
40
|
import { Logging } from "./logging.js";
|
|
41
41
|
import { DAPWrapper } from "./usb-device-wrapper.js";
|
|
42
|
-
import MemoryMap from "nrf-intel-hex";
|
|
43
42
|
import { BoardVersion } from "./device.js";
|
|
43
|
+
import MemoryMap from "nrf-intel-hex";
|
|
44
44
|
type ProgressCallback = (n: number, partial: boolean) => void;
|
|
45
45
|
/**
|
|
46
46
|
* Uses a DAPWrapper to flash the micro:bit.
|
|
@@ -58,8 +58,8 @@ export declare class PartialFlashing {
|
|
|
58
58
|
private partialFlashPageAsync;
|
|
59
59
|
private partialFlashCoreAsync;
|
|
60
60
|
private partialFlashAsync;
|
|
61
|
-
fullFlashAsync(data: string | Uint8Array | MemoryMap
|
|
62
|
-
flashAsync(data: string | Uint8Array | MemoryMap
|
|
61
|
+
fullFlashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<void>;
|
|
62
|
+
flashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<boolean>;
|
|
63
63
|
private convertDataToHexString;
|
|
64
64
|
private convertDataToPaddedBytes;
|
|
65
65
|
private hexStringToPaddedBytes;
|