@microbit/microbit-connection 0.0.0-alpha.32 → 0.0.0-alpha.33
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/README.md +89 -6
- 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/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/{bluetooth.d.ts → cjs/bluetooth.d.ts} +1 -2
- package/build/cjs/bluetooth.js +268 -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/cjs/device.js +199 -0
- package/build/cjs/device.js.map +1 -0
- 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 +16 -0
- package/build/cjs/index.js +33 -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.js +129 -0
- package/build/cjs/magnetometer-service.js.map +1 -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/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.js +76 -0
- package/build/cjs/uart-service.js.map +1 -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.js +509 -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.js +520 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- 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/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 +60 -0
- 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 +208 -0
- package/build/esm/device.js.map +1 -0
- package/build/esm/events.d.ts +111 -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 +16 -0
- package/build/esm/index.js +11 -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.map +1 -0
- package/build/esm/magnetometer.d.ts +9 -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/service-events.d.ts +17 -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.map +1 -0
- package/build/esm/uart.d.ts +4 -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 +41 -0
- 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 +58 -0
- package/build/esm/usb.js.map +1 -0
- package/package.json +19 -6
- package/typedoc.json +13 -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.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 -13
- package/build/index.js +0 -10
- package/build/index.js.map +0 -1
- package/build/led.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/magnetometer-service.js.map +0 -1
- package/build/magnetometer.js.map +0 -1
- package/build/promise-queue.js.map +0 -1
- package/build/service-events.js.map +0 -1
- package/build/uart-service.js.map +0 -1
- package/build/uart.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.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- 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-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.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/{device.d.ts → cjs/device.d.ts} +0 -0
- /package/build/{events.d.ts → cjs/events.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/{magnetometer-service.d.ts → cjs/magnetometer-service.d.ts} +0 -0
- /package/build/{magnetometer.d.ts → cjs/magnetometer.d.ts} +0 -0
- /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
- /package/build/{service-events.d.ts → cjs/service-events.d.ts} +0 -0
- /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
- /package/build/{uart-service.d.ts → cjs/uart-service.d.ts} +0 -0
- /package/build/{uart.d.ts → cjs/uart.d.ts} +0 -0
- /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
- /package/build/{usb-radio-bridge.d.ts → cjs/usb-radio-bridge.d.ts} +0 -0
- /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
- /package/build/{usb.d.ts → cjs/usb.d.ts} +0 -0
- /package/build/{accelerometer-service.js → esm/accelerometer-service.js} +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-device-wrapper.js → esm/bluetooth-device-wrapper.js} +0 -0
- /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
- /package/build/{bluetooth.js → esm/bluetooth.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/{device.js → esm/device.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/{magnetometer-service.js → esm/magnetometer-service.js} +0 -0
- /package/build/{magnetometer.js → esm/magnetometer.js} +0 -0
- /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
- /package/build/{service-events.js → esm/service-events.js} +0 -0
- /package/build/{uart-service.js → esm/uart-service.js} +0 -0
- /package/build/{uart.js → esm/uart.js} +0 -0
- /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
- /package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +0 -0
- /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
- /package/build/{usb.js → esm/usb.js} +0 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* (c) 2021, Micro:bit Educational Foundation and contributors
|
|
4
|
+
*
|
|
5
|
+
* SPDX-License-Identifier: MIT
|
|
6
|
+
*
|
|
7
|
+
* This file is made up of a combination of original code, along with code
|
|
8
|
+
* extracted from the following repositories:
|
|
9
|
+
*
|
|
10
|
+
* https://github.com/mmoskal/dapjs/tree/a32f11f54e9e76a9c61896ddd425c1cb1a29c143
|
|
11
|
+
* https://github.com/microsoft/pxt-microbit
|
|
12
|
+
*
|
|
13
|
+
* The pxt-microbit license is included below.
|
|
14
|
+
*
|
|
15
|
+
* PXT - Programming Experience Toolkit
|
|
16
|
+
*
|
|
17
|
+
* The MIT License (MIT)
|
|
18
|
+
*
|
|
19
|
+
* Copyright (c) Microsoft Corporation
|
|
20
|
+
*
|
|
21
|
+
* All rights reserved.
|
|
22
|
+
*
|
|
23
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
24
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
25
|
+
* in the Software without restriction, including without limitation the rights
|
|
26
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
27
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
28
|
+
* furnished to do so, subject to the following conditions:
|
|
29
|
+
*
|
|
30
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
31
|
+
* copies or substantial portions of the Software.
|
|
32
|
+
*
|
|
33
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
34
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
35
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
36
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
37
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
38
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
39
|
+
* SOFTWARE.
|
|
40
|
+
*/
|
|
41
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
42
|
+
if (k2 === undefined) k2 = k;
|
|
43
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
44
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
45
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
46
|
+
}
|
|
47
|
+
Object.defineProperty(o, k2, desc);
|
|
48
|
+
}) : (function(o, m, k, k2) {
|
|
49
|
+
if (k2 === undefined) k2 = k;
|
|
50
|
+
o[k2] = m[k];
|
|
51
|
+
}));
|
|
52
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
53
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
54
|
+
}) : function(o, v) {
|
|
55
|
+
o["default"] = v;
|
|
56
|
+
});
|
|
57
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
58
|
+
if (mod && mod.__esModule) return mod;
|
|
59
|
+
var result = {};
|
|
60
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
61
|
+
__setModuleDefault(result, mod);
|
|
62
|
+
return result;
|
|
63
|
+
};
|
|
64
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
65
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
66
|
+
};
|
|
67
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
68
|
+
exports.PartialFlashing = void 0;
|
|
69
|
+
/**
|
|
70
|
+
* Implementation of partial flashing for the micro:bit.
|
|
71
|
+
*
|
|
72
|
+
* Latest Microsoft implementation is here:
|
|
73
|
+
* https://github.com/microsoft/pxt-microbit/blob/master/editor/flash.ts
|
|
74
|
+
*/
|
|
75
|
+
// dapjs import faff needed for Vitest https://github.com/ARMmbed/dapjs/issues/118
|
|
76
|
+
const dapjs = __importStar(require("dapjs"));
|
|
77
|
+
const { DAPLink: DAPLinkValue } = dapjs;
|
|
78
|
+
const async_util_js_1 = require("./async-util.js");
|
|
79
|
+
const usb_partial_flashing_utils_js_1 = require("./usb-partial-flashing-utils.js");
|
|
80
|
+
const nrf_intel_hex_1 = __importDefault(require("nrf-intel-hex"));
|
|
81
|
+
// Source code for binaries in can be found at https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/external/sha/source/main.c
|
|
82
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L243
|
|
83
|
+
// Update from https://github.com/microsoft/pxt-microbit/commit/a35057717222b8e48335144f497b55e29e9b0f25
|
|
84
|
+
// prettier-ignore
|
|
85
|
+
const flashPageBIN = new Uint32Array([
|
|
86
|
+
0xbe00be00, // bkpt - LR is set to this
|
|
87
|
+
0x2502b5f0, 0x4c204b1f, 0xf3bf511d, 0xf3bf8f6f, 0x25808f4f, 0x002e00ed,
|
|
88
|
+
0x2f00595f, 0x25a1d0fc, 0x515800ed, 0x2d00599d, 0x2500d0fc, 0xf3bf511d,
|
|
89
|
+
0xf3bf8f6f, 0x25808f4f, 0x002e00ed, 0x2f00595f, 0x2501d0fc, 0xf3bf511d,
|
|
90
|
+
0xf3bf8f6f, 0x599d8f4f, 0xd0fc2d00, 0x25002680, 0x00f60092, 0xd1094295,
|
|
91
|
+
0x511a2200, 0x8f6ff3bf, 0x8f4ff3bf, 0x2a00599a, 0xbdf0d0fc, 0x5147594f,
|
|
92
|
+
0x2f00599f, 0x3504d0fc, 0x46c0e7ec, 0x4001e000, 0x00000504,
|
|
93
|
+
]);
|
|
94
|
+
// void computeHashes(uint32_t *dst, uint8_t *ptr, uint32_t pageSize, uint32_t numPages)
|
|
95
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L253
|
|
96
|
+
// prettier-ignore
|
|
97
|
+
const computeChecksums2 = new Uint32Array([
|
|
98
|
+
0x4c27b5f0, 0x44a52680, 0x22009201, 0x91004f25, 0x00769303, 0x24080013,
|
|
99
|
+
0x25010019, 0x40eb4029, 0xd0002900, 0x3c01407b, 0xd1f52c00, 0x468c0091,
|
|
100
|
+
0xa9044665, 0x506b3201, 0xd1eb42b2, 0x089b9b01, 0x23139302, 0x9b03469c,
|
|
101
|
+
0xd104429c, 0x2000be2a, 0x449d4b15, 0x9f00bdf0, 0x4d149e02, 0x49154a14,
|
|
102
|
+
0x3e01cf08, 0x2111434b, 0x491341cb, 0x405a434b, 0x4663405d, 0x230541da,
|
|
103
|
+
0x4b10435a, 0x466318d2, 0x230541dd, 0x4b0d435d, 0x2e0018ed, 0x6002d1e7,
|
|
104
|
+
0x9a009b01, 0x18d36045, 0x93003008, 0xe7d23401, 0xfffffbec, 0xedb88320,
|
|
105
|
+
0x00000414, 0x1ec3a6c8, 0x2f9be6cc, 0xcc9e2d51, 0x1b873593, 0xe6546b64,
|
|
106
|
+
]);
|
|
107
|
+
const membase = 0x20000000;
|
|
108
|
+
const loadAddr = membase;
|
|
109
|
+
const dataAddr = 0x20002000;
|
|
110
|
+
const stackAddr = 0x20001000;
|
|
111
|
+
/**
|
|
112
|
+
* Uses a DAPWrapper to flash the micro:bit.
|
|
113
|
+
*
|
|
114
|
+
* Intented to be used for a single flash with a pre-connected DAPWrapper.
|
|
115
|
+
*/
|
|
116
|
+
class PartialFlashing {
|
|
117
|
+
constructor(dapwrapper, logging, boardVersion) {
|
|
118
|
+
Object.defineProperty(this, "dapwrapper", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
configurable: true,
|
|
121
|
+
writable: true,
|
|
122
|
+
value: dapwrapper
|
|
123
|
+
});
|
|
124
|
+
Object.defineProperty(this, "logging", {
|
|
125
|
+
enumerable: true,
|
|
126
|
+
configurable: true,
|
|
127
|
+
writable: true,
|
|
128
|
+
value: logging
|
|
129
|
+
});
|
|
130
|
+
Object.defineProperty(this, "boardVersion", {
|
|
131
|
+
enumerable: true,
|
|
132
|
+
configurable: true,
|
|
133
|
+
writable: true,
|
|
134
|
+
value: boardVersion
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
log(v) {
|
|
138
|
+
this.logging.log(v);
|
|
139
|
+
}
|
|
140
|
+
// Runs the checksum algorithm on the micro:bit's whole flash memory, and returns the results.
|
|
141
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L365
|
|
142
|
+
async getFlashChecksumsAsync() {
|
|
143
|
+
await this.dapwrapper.executeAsync(loadAddr, computeChecksums2, stackAddr, loadAddr + 1, 0xffffffff, dataAddr, 0, this.dapwrapper.pageSize, this.dapwrapper.numPages);
|
|
144
|
+
return this.dapwrapper.readBlockAsync(dataAddr, this.dapwrapper.numPages * 2);
|
|
145
|
+
}
|
|
146
|
+
// Runs the code on the micro:bit to copy a single page of data from RAM address addr to the ROM address specified by the page.
|
|
147
|
+
// Does not wait for execution to halt.
|
|
148
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L340
|
|
149
|
+
async runFlash(page, addr) {
|
|
150
|
+
await this.dapwrapper.cortexM.halt(true);
|
|
151
|
+
await Promise.all([
|
|
152
|
+
this.dapwrapper.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.PC, loadAddr + 4 + 1),
|
|
153
|
+
this.dapwrapper.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.LR, loadAddr + 1),
|
|
154
|
+
this.dapwrapper.cortexM.writeCoreRegister(usb_partial_flashing_utils_js_1.CoreRegister.SP, stackAddr),
|
|
155
|
+
this.dapwrapper.cortexM.writeCoreRegister(0, page.targetAddr),
|
|
156
|
+
this.dapwrapper.cortexM.writeCoreRegister(1, addr),
|
|
157
|
+
this.dapwrapper.cortexM.writeCoreRegister(2, this.dapwrapper.pageSize >> 2),
|
|
158
|
+
]);
|
|
159
|
+
return this.dapwrapper.cortexM.resume(false);
|
|
160
|
+
}
|
|
161
|
+
// Write a single page of data to micro:bit ROM by writing it to micro:bit RAM and copying to ROM.
|
|
162
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L385
|
|
163
|
+
async partialFlashPageAsync(page, nextPage, i) {
|
|
164
|
+
// TODO: This short-circuits UICR, do we need to update this?
|
|
165
|
+
if (page.targetAddr >= 0x10000000) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Use two slots in RAM to allow parallelisation of the following two tasks.
|
|
169
|
+
// 1. DAPjs writes a page to one slot.
|
|
170
|
+
// 2. flashPageBIN copies a page to flash from the other slot.
|
|
171
|
+
let thisAddr = i & 1 ? dataAddr : dataAddr + this.dapwrapper.pageSize;
|
|
172
|
+
let nextAddr = i & 1 ? dataAddr + this.dapwrapper.pageSize : dataAddr;
|
|
173
|
+
// Write first page to slot in RAM.
|
|
174
|
+
// All subsequent pages will have already been written to RAM.
|
|
175
|
+
if (i === 0) {
|
|
176
|
+
let u32data = new Uint32Array(page.data.length / 4);
|
|
177
|
+
for (let j = 0; j < page.data.length; j += 4) {
|
|
178
|
+
u32data[j >> 2] = (0, usb_partial_flashing_utils_js_1.read32FromUInt8Array)(page.data, j);
|
|
179
|
+
}
|
|
180
|
+
await this.dapwrapper.writeBlockAsync(thisAddr, u32data);
|
|
181
|
+
}
|
|
182
|
+
await this.runFlash(page, thisAddr);
|
|
183
|
+
// Write next page to micro:bit RAM if it exists.
|
|
184
|
+
if (nextPage) {
|
|
185
|
+
let buf = new Uint32Array(nextPage.data.buffer);
|
|
186
|
+
await this.dapwrapper.writeBlockAsync(nextAddr, buf);
|
|
187
|
+
}
|
|
188
|
+
return this.dapwrapper.waitForHalt();
|
|
189
|
+
}
|
|
190
|
+
// Write pages of data to micro:bit ROM.
|
|
191
|
+
async partialFlashCoreAsync(pages, updateProgress) {
|
|
192
|
+
this.log("Partial flash");
|
|
193
|
+
for (let i = 0; i < pages.length; ++i) {
|
|
194
|
+
updateProgress(i / pages.length, true);
|
|
195
|
+
await this.partialFlashPageAsync(pages[i], pages[i + 1], i);
|
|
196
|
+
}
|
|
197
|
+
updateProgress(1, true);
|
|
198
|
+
}
|
|
199
|
+
// Flash the micro:bit's ROM with the provided image by only copying over the pages that differ.
|
|
200
|
+
// Falls back to a full flash if partial flashing fails.
|
|
201
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L335
|
|
202
|
+
async partialFlashAsync(data, updateProgress) {
|
|
203
|
+
const flashBytes = this.convertDataToPaddedBytes(data);
|
|
204
|
+
const checksums = await this.getFlashChecksumsAsync();
|
|
205
|
+
await this.dapwrapper.writeBlockAsync(loadAddr, flashPageBIN);
|
|
206
|
+
let aligned = (0, usb_partial_flashing_utils_js_1.pageAlignBlocks)(flashBytes, 0, this.dapwrapper.pageSize);
|
|
207
|
+
const totalPages = aligned.length;
|
|
208
|
+
this.log("Total pages: " + totalPages);
|
|
209
|
+
aligned = (0, usb_partial_flashing_utils_js_1.onlyChanged)(aligned, checksums, this.dapwrapper.pageSize);
|
|
210
|
+
this.log("Changed pages: " + aligned.length);
|
|
211
|
+
let partial;
|
|
212
|
+
if (aligned.length > totalPages / 2) {
|
|
213
|
+
try {
|
|
214
|
+
await this.fullFlashAsync(data, updateProgress);
|
|
215
|
+
partial = false;
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
this.log(e);
|
|
219
|
+
this.log("Full flash failed, attempting partial flash.");
|
|
220
|
+
await this.partialFlashCoreAsync(aligned, updateProgress);
|
|
221
|
+
partial = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
try {
|
|
226
|
+
await this.partialFlashCoreAsync(aligned, updateProgress);
|
|
227
|
+
partial = true;
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
this.log(e);
|
|
231
|
+
this.log("Partial flash failed, attempting full flash.");
|
|
232
|
+
await this.fullFlashAsync(data, updateProgress);
|
|
233
|
+
partial = false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await this.dapwrapper.reset();
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
// Allow errors on resetting, user can always manually reset if necessary.
|
|
241
|
+
}
|
|
242
|
+
this.log("Flashing complete");
|
|
243
|
+
return partial;
|
|
244
|
+
}
|
|
245
|
+
// Perform full flash of micro:bit's ROM using daplink.
|
|
246
|
+
async fullFlashAsync(data, updateProgress) {
|
|
247
|
+
this.log("Full flash");
|
|
248
|
+
const fullFlashProgress = (progress) => {
|
|
249
|
+
updateProgress(progress, false);
|
|
250
|
+
};
|
|
251
|
+
this.dapwrapper.daplink.on(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
|
|
252
|
+
try {
|
|
253
|
+
data = this.convertDataToHexString(data);
|
|
254
|
+
await this.dapwrapper.transport.open();
|
|
255
|
+
await this.dapwrapper.daplink.flash(new TextEncoder().encode(data));
|
|
256
|
+
this.logging.event({
|
|
257
|
+
type: "WebUSB-info",
|
|
258
|
+
message: "full-flash-successful",
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
this.dapwrapper.daplink.removeListener(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Flash the micro:bit's ROM with the provided image, resetting the micro:bit first.
|
|
266
|
+
// Drawn from https://github.com/microsoft/pxt-microbit/blob/dec5b8ce72d5c2b4b0b20aafefce7474a6f0c7b2/editor/extension.tsx#L439
|
|
267
|
+
async flashAsync(data, updateProgress) {
|
|
268
|
+
let resetPromise = (async () => {
|
|
269
|
+
// Reset micro:bit to ensure interface responds correctly.
|
|
270
|
+
this.log("Begin reset");
|
|
271
|
+
try {
|
|
272
|
+
await this.dapwrapper.reset(true);
|
|
273
|
+
}
|
|
274
|
+
catch (e) {
|
|
275
|
+
this.log("Retrying reset");
|
|
276
|
+
await this.dapwrapper.reconnectAsync();
|
|
277
|
+
await this.dapwrapper.reset(true);
|
|
278
|
+
}
|
|
279
|
+
})();
|
|
280
|
+
try {
|
|
281
|
+
try {
|
|
282
|
+
await (0, async_util_js_1.withTimeout)(resetPromise, 1000);
|
|
283
|
+
this.log("Begin flashing");
|
|
284
|
+
return await this.partialFlashAsync(data, updateProgress);
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
if (e instanceof async_util_js_1.TimeoutError) {
|
|
288
|
+
this.log("Resetting micro:bit timed out");
|
|
289
|
+
this.log("Partial flashing failed. Attempting full flash");
|
|
290
|
+
this.logging.event({
|
|
291
|
+
type: "WebUSB-info",
|
|
292
|
+
message: "flash-failed/attempting-full-flash",
|
|
293
|
+
});
|
|
294
|
+
await this.fullFlashAsync(data, updateProgress);
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
throw e;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
// NB cannot return Promises above!
|
|
304
|
+
await this.dapwrapper.disconnectAsync();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
convertDataToHexString(data) {
|
|
308
|
+
if (typeof data === "string") {
|
|
309
|
+
return data;
|
|
310
|
+
}
|
|
311
|
+
if (data instanceof Uint8Array) {
|
|
312
|
+
return this.paddedBytesToHexString(data);
|
|
313
|
+
}
|
|
314
|
+
return data.asHexString();
|
|
315
|
+
}
|
|
316
|
+
convertDataToPaddedBytes(data) {
|
|
317
|
+
if (data instanceof Uint8Array) {
|
|
318
|
+
return data;
|
|
319
|
+
}
|
|
320
|
+
if (typeof data === "string") {
|
|
321
|
+
return this.hexStringToPaddedBytes(data);
|
|
322
|
+
}
|
|
323
|
+
return this.memoryMapToPaddedBytes(data);
|
|
324
|
+
}
|
|
325
|
+
hexStringToPaddedBytes(hex) {
|
|
326
|
+
const m = nrf_intel_hex_1.default.fromHex(hex);
|
|
327
|
+
return this.memoryMapToPaddedBytes(m);
|
|
328
|
+
}
|
|
329
|
+
paddedBytesToHexString(data) {
|
|
330
|
+
return nrf_intel_hex_1.default.fromPaddedUint8Array(data).asHexString();
|
|
331
|
+
}
|
|
332
|
+
memoryMapToPaddedBytes(memoryMap) {
|
|
333
|
+
const flashSize = {
|
|
334
|
+
V1: 256 * 1024,
|
|
335
|
+
V2: 512 * 1024,
|
|
336
|
+
}[this.boardVersion];
|
|
337
|
+
return memoryMap.slicePad(0, flashSize);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
exports.PartialFlashing = PartialFlashing;
|
|
341
|
+
//# sourceMappingURL=usb-partial-flashing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usb-partial-flashing.js","sourceRoot":"","sources":["../../lib/usb-partial-flashing.ts"],"names":[],"mappings":"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"}
|