webserial-flasher 1.0.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 +21 -0
- package/README.md +97 -0
- package/dist/autoDetect.d.ts +24 -0
- package/dist/autoDetect.d.ts.map +1 -0
- package/dist/autoDetect.js +66 -0
- package/dist/autoDetect.js.map +1 -0
- package/dist/boards/database.d.ts +17 -0
- package/dist/boards/database.d.ts.map +1 -0
- package/dist/boards/database.js +957 -0
- package/dist/boards/database.js.map +1 -0
- package/dist/core/constants.d.ts +44 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +56 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.d.ts +45 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +92 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/types.d.ts +138 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/avr109/programmer.d.ts +78 -0
- package/dist/protocol/avr109/programmer.d.ts.map +1 -0
- package/dist/protocol/avr109/programmer.js +324 -0
- package/dist/protocol/avr109/programmer.js.map +1 -0
- package/dist/protocol/hexParser.d.ts +12 -0
- package/dist/protocol/hexParser.d.ts.map +1 -0
- package/dist/protocol/hexParser.js +133 -0
- package/dist/protocol/hexParser.js.map +1 -0
- package/dist/protocol/picoboot/constants.d.ts +65 -0
- package/dist/protocol/picoboot/constants.d.ts.map +1 -0
- package/dist/protocol/picoboot/constants.js +80 -0
- package/dist/protocol/picoboot/constants.js.map +1 -0
- package/dist/protocol/picoboot/programmer.d.ts +73 -0
- package/dist/protocol/picoboot/programmer.d.ts.map +1 -0
- package/dist/protocol/picoboot/programmer.js +278 -0
- package/dist/protocol/picoboot/programmer.js.map +1 -0
- package/dist/protocol/picoboot/uf2.d.ts +51 -0
- package/dist/protocol/picoboot/uf2.d.ts.map +1 -0
- package/dist/protocol/picoboot/uf2.js +119 -0
- package/dist/protocol/picoboot/uf2.js.map +1 -0
- package/dist/protocol/receiveData.d.ts +3 -0
- package/dist/protocol/receiveData.d.ts.map +1 -0
- package/dist/protocol/receiveData.js +72 -0
- package/dist/protocol/receiveData.js.map +1 -0
- package/dist/protocol/sendCommand.d.ts +14 -0
- package/dist/protocol/sendCommand.d.ts.map +1 -0
- package/dist/protocol/sendCommand.js +48 -0
- package/dist/protocol/sendCommand.js.map +1 -0
- package/dist/protocol/stk500v2/constants.d.ts +57 -0
- package/dist/protocol/stk500v2/constants.d.ts.map +1 -0
- package/dist/protocol/stk500v2/constants.js +62 -0
- package/dist/protocol/stk500v2/constants.js.map +1 -0
- package/dist/protocol/stk500v2/frame.d.ts +14 -0
- package/dist/protocol/stk500v2/frame.d.ts.map +1 -0
- package/dist/protocol/stk500v2/frame.js +116 -0
- package/dist/protocol/stk500v2/frame.js.map +1 -0
- package/dist/protocol/stk500v2/programmer.d.ts +92 -0
- package/dist/protocol/stk500v2/programmer.d.ts.map +1 -0
- package/dist/protocol/stk500v2/programmer.js +482 -0
- package/dist/protocol/stk500v2/programmer.js.map +1 -0
- package/dist/protocol/updi/constants.d.ts +107 -0
- package/dist/protocol/updi/constants.d.ts.map +1 -0
- package/dist/protocol/updi/constants.js +130 -0
- package/dist/protocol/updi/constants.js.map +1 -0
- package/dist/protocol/updi/link.d.ts +82 -0
- package/dist/protocol/updi/link.d.ts.map +1 -0
- package/dist/protocol/updi/link.js +241 -0
- package/dist/protocol/updi/link.js.map +1 -0
- package/dist/protocol/updi/programmer.d.ts +89 -0
- package/dist/protocol/updi/programmer.d.ts.map +1 -0
- package/dist/protocol/updi/programmer.js +359 -0
- package/dist/protocol/updi/programmer.js.map +1 -0
- package/dist/stk500.d.ts +101 -0
- package/dist/stk500.d.ts.map +1 -0
- package/dist/stk500.js +426 -0
- package/dist/stk500.js.map +1 -0
- package/dist/transport/IPicobootTransport.d.ts +25 -0
- package/dist/transport/IPicobootTransport.d.ts.map +1 -0
- package/dist/transport/IPicobootTransport.js +10 -0
- package/dist/transport/IPicobootTransport.js.map +1 -0
- package/dist/transport/ITransport.d.ts +33 -0
- package/dist/transport/ITransport.d.ts.map +1 -0
- package/dist/transport/ITransport.js +4 -0
- package/dist/transport/ITransport.js.map +1 -0
- package/dist/transport/NodeSerialTransport.d.ts +35 -0
- package/dist/transport/NodeSerialTransport.d.ts.map +1 -0
- package/dist/transport/NodeSerialTransport.js +102 -0
- package/dist/transport/NodeSerialTransport.js.map +1 -0
- package/dist/transport/NodeUSBTransport.d.ts +24 -0
- package/dist/transport/NodeUSBTransport.d.ts.map +1 -0
- package/dist/transport/NodeUSBTransport.js +146 -0
- package/dist/transport/NodeUSBTransport.js.map +1 -0
- package/dist/transport/WebSerialTransport.d.ts +63 -0
- package/dist/transport/WebSerialTransport.d.ts.map +1 -0
- package/dist/transport/WebSerialTransport.js +159 -0
- package/dist/transport/WebSerialTransport.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
// STK500v2 ISP programmer for Arduino Mega 2560 and other wiring-bootloader boards.
|
|
2
|
+
//
|
|
3
|
+
// Protocol: Atmel AVR068 — STK500 Communication Protocol v2
|
|
4
|
+
// Supported bootloaders: wiring (ATmegaBOOT_168 for Mega), STK600
|
|
5
|
+
//
|
|
6
|
+
// Frame format: [0x1B][seq][sizeH][sizeL][0x0E][body...][checksum_xor]
|
|
7
|
+
// All ISP commands embed the raw SPI opcodes for the target AVR.
|
|
8
|
+
import { Cmd, Status } from './constants.js';
|
|
9
|
+
import { encodeFrame, receiveFrame } from './frame.js';
|
|
10
|
+
import { STK500ProtocolError, STK500SyncError, STK500SignatureMismatchError, STK500VerifyError, STK500InvalidHexError, } from '../../core/errors.js';
|
|
11
|
+
import { parseIntelHex } from '../hexParser.js';
|
|
12
|
+
function sleep(ms) {
|
|
13
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
14
|
+
}
|
|
15
|
+
export class STK500v2 {
|
|
16
|
+
constructor(transport, board, opts = {}) {
|
|
17
|
+
this.transport = transport;
|
|
18
|
+
this.board = board;
|
|
19
|
+
this.seq = 0;
|
|
20
|
+
this.syncAttempts = opts.retry?.syncAttempts ?? 5;
|
|
21
|
+
this.retryDelayMs = opts.retry?.retryDelayMs ?? 200;
|
|
22
|
+
if (opts.quiet) {
|
|
23
|
+
this.log = () => { };
|
|
24
|
+
}
|
|
25
|
+
else if (opts.logger) {
|
|
26
|
+
this.log = opts.logger;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.log = (level, msg) => {
|
|
30
|
+
/* istanbul ignore next */
|
|
31
|
+
if (typeof console !== 'undefined') {
|
|
32
|
+
console.log(`[stk500v2] [${level}] ${msg}`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ── Frame I/O ──────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Send a command body and return the full response body.
|
|
40
|
+
* Throws STK500ProtocolError when the device reports failure.
|
|
41
|
+
*/
|
|
42
|
+
async send(body) {
|
|
43
|
+
this.seq = (this.seq + 1) & 0xFF;
|
|
44
|
+
await this.transport.write(encodeFrame(this.seq, body));
|
|
45
|
+
const response = await receiveFrame(this.transport, this.board.timeout);
|
|
46
|
+
if (response.length < 2) {
|
|
47
|
+
throw new STK500ProtocolError(`STK500v2: response too short (${response.length} bytes)`);
|
|
48
|
+
}
|
|
49
|
+
// Response format: [CMD_ECHO, STATUS, ...data...]
|
|
50
|
+
const cmdEcho = body[0] ?? 0;
|
|
51
|
+
if (response[0] !== cmdEcho) {
|
|
52
|
+
throw new STK500ProtocolError(`STK500v2: unexpected command echo 0x${response[0].toString(16)} ` +
|
|
53
|
+
`(expected 0x${cmdEcho.toString(16)})`);
|
|
54
|
+
}
|
|
55
|
+
if (response[1] !== Status.CMD_OK) {
|
|
56
|
+
throw new STK500ProtocolError(`STK500v2: command 0x${cmdEcho.toString(16)} failed, ` +
|
|
57
|
+
`status=0x${response[1].toString(16)}`);
|
|
58
|
+
}
|
|
59
|
+
return response;
|
|
60
|
+
}
|
|
61
|
+
// ── Reset ──────────────────────────────────────────────────────────────────
|
|
62
|
+
async resetDevice() {
|
|
63
|
+
const method = this.board.resetMethod ?? 'dtr';
|
|
64
|
+
const delay = this.board.resetDelayMs ?? 200;
|
|
65
|
+
if (method === 'none' || !this.transport.setSignals) {
|
|
66
|
+
this.log('debug', 'resetDevice: skipped');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.log('info', `resetDevice: toggling ${method.toUpperCase()}`);
|
|
70
|
+
const low = method === 'dtr' ? { dtr: false } : { rts: false };
|
|
71
|
+
const high = method === 'dtr' ? { dtr: true } : { rts: true };
|
|
72
|
+
await this.transport.setSignals(low);
|
|
73
|
+
await sleep(delay);
|
|
74
|
+
await this.transport.setSignals(high);
|
|
75
|
+
await sleep(delay);
|
|
76
|
+
}
|
|
77
|
+
// ── Sync / Sign-On ─────────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Send CMD_SIGN_ON and return the bootloader name string (e.g. "AVRISP_MK2").
|
|
80
|
+
* Throws on timeout or framing error.
|
|
81
|
+
*/
|
|
82
|
+
async signOn() {
|
|
83
|
+
this.log('debug', 'signOn');
|
|
84
|
+
const response = await this.send([Cmd.SIGN_ON]);
|
|
85
|
+
// response: [CMD_SIGN_ON, STATUS_CMD_OK, strLen, ...chars...]
|
|
86
|
+
if (response.length >= 3) {
|
|
87
|
+
const len = response[2];
|
|
88
|
+
const chars = response.slice(3, 3 + len);
|
|
89
|
+
return String.fromCharCode(...chars);
|
|
90
|
+
}
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
async sync(attempts) {
|
|
94
|
+
this.log('debug', `sync (max ${attempts} attempts)`);
|
|
95
|
+
for (let i = 1; i <= attempts; i++) {
|
|
96
|
+
try {
|
|
97
|
+
const name = await this.signOn();
|
|
98
|
+
this.log('debug', `signOn OK on attempt ${i}: "${name}"`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
this.log('debug', `signOn attempt ${i}/${attempts} failed: ` +
|
|
103
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
104
|
+
if (i < attempts)
|
|
105
|
+
await sleep(this.retryDelayMs);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
throw new STK500SyncError(attempts);
|
|
109
|
+
}
|
|
110
|
+
// ── Device Descriptor ──────────────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Send CMD_SET_DEVICE_DESCRIPTOR (0x04).
|
|
113
|
+
* Most wiring-bootloader implementations accept any 52-byte body.
|
|
114
|
+
* Key fields are flash/EEPROM page sizes and boot address.
|
|
115
|
+
*/
|
|
116
|
+
async setDeviceDescriptor() {
|
|
117
|
+
this.log('debug', 'setDeviceDescriptor');
|
|
118
|
+
const desc = this.board.stk500v2Descriptor ?? buildDefaultDescriptor(this.board);
|
|
119
|
+
const body = new Uint8Array(1 + desc.length);
|
|
120
|
+
body[0] = Cmd.SET_DEVICE_DESCRIPTOR;
|
|
121
|
+
body.set(desc, 1);
|
|
122
|
+
await this.send(body);
|
|
123
|
+
}
|
|
124
|
+
// ── Programming Mode ───────────────────────────────────────────────────────
|
|
125
|
+
async enterProgMode() {
|
|
126
|
+
this.log('debug', 'enterProgMode');
|
|
127
|
+
const p = this.board.ispParams ?? {};
|
|
128
|
+
await this.send([
|
|
129
|
+
Cmd.ENTER_PROGMODE_ISP,
|
|
130
|
+
p.timeout ?? 200, // timeout value
|
|
131
|
+
p.stabDelay ?? 100, // stabilisation delay (ms)
|
|
132
|
+
p.cmdexeDelay ?? 25, // command execute delay (ms)
|
|
133
|
+
p.synchLoops ?? 32, // SPI sync loops
|
|
134
|
+
p.byteDelay ?? 0, // byte-level delay (µs)
|
|
135
|
+
p.pollValue ?? 0x53, // expected SPI programming enable response
|
|
136
|
+
p.pollIndex ?? 3, // byte position to check in SPI response
|
|
137
|
+
0xAC, 0x53, 0x00, 0x00, // SPI PROG_ENABLE command (AVR standard)
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
async leaveProgMode() {
|
|
141
|
+
this.log('debug', 'leaveProgMode');
|
|
142
|
+
await this.send([Cmd.LEAVE_PROGMODE_ISP, 1, 1]); // preDelay=1ms, postDelay=1ms
|
|
143
|
+
}
|
|
144
|
+
// ── Erase ──────────────────────────────────────────────────────────────────
|
|
145
|
+
async chipErase() {
|
|
146
|
+
this.log('info', 'chipErase');
|
|
147
|
+
const delay = this.board.ispParams?.eraseDelay ?? 55;
|
|
148
|
+
await this.send([
|
|
149
|
+
Cmd.CHIP_ERASE_ISP,
|
|
150
|
+
(delay >> 8) & 0xFF, // eraseDelay high byte (ms)
|
|
151
|
+
delay & 0xFF, // eraseDelay low byte
|
|
152
|
+
0x00, // pollMethod = 0 (use delay, not polling)
|
|
153
|
+
0xAC, 0x80, 0x00, 0x00, // SPI CHIP_ERASE command
|
|
154
|
+
]);
|
|
155
|
+
await sleep(delay);
|
|
156
|
+
}
|
|
157
|
+
// ── Address ────────────────────────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* CMD_LOAD_ADDRESS — sets the current flash address for subsequent reads/writes.
|
|
160
|
+
* Address is in WORDS (byte_address / 2).
|
|
161
|
+
* For addresses > 65535 words (>128KB), bit 31 is set to indicate extended mode.
|
|
162
|
+
*/
|
|
163
|
+
async loadAddress(wordAddr) {
|
|
164
|
+
// Extended addressing: set bit 31 when word address exceeds 16-bit range
|
|
165
|
+
const addr = wordAddr > 0xFFFF
|
|
166
|
+
? (wordAddr | 0x80000000) >>> 0
|
|
167
|
+
: wordAddr;
|
|
168
|
+
await this.send([
|
|
169
|
+
Cmd.LOAD_ADDRESS,
|
|
170
|
+
(addr >>> 24) & 0xFF,
|
|
171
|
+
(addr >>> 16) & 0xFF,
|
|
172
|
+
(addr >>> 8) & 0xFF,
|
|
173
|
+
addr & 0xFF,
|
|
174
|
+
]);
|
|
175
|
+
}
|
|
176
|
+
// ── Flash Read / Write ─────────────────────────────────────────────────────
|
|
177
|
+
/**
|
|
178
|
+
* Write one flash page (CMD_PROGRAM_FLASH_ISP).
|
|
179
|
+
* @param wordAddr Word address of the page start
|
|
180
|
+
* @param data Page data (must be ≤ board.pageSize bytes)
|
|
181
|
+
*/
|
|
182
|
+
async programFlash(wordAddr, data) {
|
|
183
|
+
await this.loadAddress(wordAddr);
|
|
184
|
+
const size = data.length;
|
|
185
|
+
const mode = this.board.ispParams?.flashMode ?? 0xC1; // page-mode write
|
|
186
|
+
const delay = this.board.ispParams?.flashDelay ?? 6; // page write delay (ms)
|
|
187
|
+
// Body: [CMD, sizeH, sizeL, mode, delay, loadLow, loadHigh, writePage, poll1, poll2, data...]
|
|
188
|
+
const body = new Uint8Array(10 + size);
|
|
189
|
+
body[0] = Cmd.PROGRAM_FLASH_ISP;
|
|
190
|
+
body[1] = (size >> 8) & 0xFF;
|
|
191
|
+
body[2] = size & 0xFF;
|
|
192
|
+
body[3] = mode;
|
|
193
|
+
body[4] = delay;
|
|
194
|
+
body[5] = 0x40; // SPI: load flash page — low byte (AVR universal cmd)
|
|
195
|
+
body[6] = 0x48; // SPI: load flash page — high byte
|
|
196
|
+
body[7] = 0x4C; // SPI: write flash page
|
|
197
|
+
body[8] = 0xFF; // flash readback poll value 1
|
|
198
|
+
body[9] = 0xFF; // flash readback poll value 2
|
|
199
|
+
body.set(data, 10);
|
|
200
|
+
await this.send(body);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Read one flash page (CMD_READ_FLASH_ISP).
|
|
204
|
+
* @param wordAddr Word address of the page start
|
|
205
|
+
* @param size Number of BYTES to read
|
|
206
|
+
* @returns The raw flash bytes
|
|
207
|
+
*/
|
|
208
|
+
async readFlash(wordAddr, size) {
|
|
209
|
+
await this.loadAddress(wordAddr);
|
|
210
|
+
const response = await this.send([
|
|
211
|
+
Cmd.READ_FLASH_ISP,
|
|
212
|
+
(size >> 8) & 0xFF,
|
|
213
|
+
size & 0xFF,
|
|
214
|
+
0x20, // SPI: read program memory (low byte)
|
|
215
|
+
]);
|
|
216
|
+
// Response: [CMD_READ_FLASH_ISP, STATUS_CMD_OK, data..., STATUS_CMD_OK]
|
|
217
|
+
// Data starts at index 2, ends before the trailing status byte
|
|
218
|
+
return response.slice(2, 2 + size);
|
|
219
|
+
}
|
|
220
|
+
// ── Signature ──────────────────────────────────────────────────────────────
|
|
221
|
+
/**
|
|
222
|
+
* Read the 3-byte device signature via three CMD_READ_SIGNATURE_ISP calls.
|
|
223
|
+
*/
|
|
224
|
+
async readSignature() {
|
|
225
|
+
this.log('debug', 'readSignature');
|
|
226
|
+
const sig = new Uint8Array(3);
|
|
227
|
+
for (let i = 0; i < 3; i++) {
|
|
228
|
+
const response = await this.send([
|
|
229
|
+
Cmd.READ_SIGNATURE_ISP,
|
|
230
|
+
1, // returnSize = 1 byte
|
|
231
|
+
0, // delay = 0
|
|
232
|
+
0x30, // SPI: read signature
|
|
233
|
+
0x00,
|
|
234
|
+
i, // byte index (0, 1, or 2)
|
|
235
|
+
0x00,
|
|
236
|
+
]);
|
|
237
|
+
// Response: [CMD, STATUS_CMD_OK, STATUS_ISP_READY, byte]
|
|
238
|
+
sig[i] = response[3] ?? 0;
|
|
239
|
+
}
|
|
240
|
+
return sig;
|
|
241
|
+
}
|
|
242
|
+
async verifySignature() {
|
|
243
|
+
const actual = await this.readSignature();
|
|
244
|
+
const expected = this.board.signature;
|
|
245
|
+
if (!actual.every((b, i) => b === expected[i])) {
|
|
246
|
+
throw new STK500SignatureMismatchError(expected, actual);
|
|
247
|
+
}
|
|
248
|
+
const fmt = (b) => Array.from(b).map((x) => `0x${x.toString(16).padStart(2, '0')}`).join(', ');
|
|
249
|
+
this.log('info', `signature verified: [${fmt(actual)}]`);
|
|
250
|
+
}
|
|
251
|
+
// ── Fuse / Lock read (Phase C) ────────────────────────────────────────────
|
|
252
|
+
/**
|
|
253
|
+
* Read one fuse byte via CMD_READ_FUSE_ISP (0x18).
|
|
254
|
+
* @param fuseType Which fuse: 'low' | 'high' | 'ext' | 'lock'
|
|
255
|
+
*/
|
|
256
|
+
async readFuseIsp(fuseType) {
|
|
257
|
+
this.log('debug', `readFuseIsp: ${fuseType}`);
|
|
258
|
+
// SPI commands for fuse reading
|
|
259
|
+
const spiCmds = {
|
|
260
|
+
low: [0x50, 0x00, 0x00],
|
|
261
|
+
high: [0x58, 0x08, 0x00],
|
|
262
|
+
ext: [0x50, 0x08, 0x00],
|
|
263
|
+
lock: [0x58, 0x00, 0x00],
|
|
264
|
+
};
|
|
265
|
+
const [b1, b2, b3] = spiCmds[fuseType];
|
|
266
|
+
const response = await this.send([
|
|
267
|
+
Cmd.READ_FUSE_ISP,
|
|
268
|
+
1, // returnSize = 1
|
|
269
|
+
0, // delay = 0
|
|
270
|
+
b1, b2, b3, 0x00, // SPI cmd bytes
|
|
271
|
+
]);
|
|
272
|
+
// Response: [CMD, STATUS, STATUS_ISP, fuseVal]
|
|
273
|
+
return response[3] ?? 0;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Read all four fuse/lock bytes in one call.
|
|
277
|
+
*/
|
|
278
|
+
async readFuses() {
|
|
279
|
+
const low = await this.readFuseIsp('low');
|
|
280
|
+
const high = await this.readFuseIsp('high');
|
|
281
|
+
const ext = await this.readFuseIsp('ext');
|
|
282
|
+
const lock = await this.readFuseIsp('lock');
|
|
283
|
+
this.log('info', `fuses: low=0x${low.toString(16)} high=0x${high.toString(16)} ext=0x${ext.toString(16)} lock=0x${lock.toString(16)}`);
|
|
284
|
+
return { low, high, ext, lock };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Write a fuse byte via CMD_PROGRAM_FUSE_ISP (0x17).
|
|
288
|
+
* @param fuseType Which fuse: 'low' | 'high' | 'ext'
|
|
289
|
+
* @param val New fuse value
|
|
290
|
+
*/
|
|
291
|
+
async writeFuseIsp(fuseType, val) {
|
|
292
|
+
this.log('debug', `writeFuseIsp: ${fuseType}=0x${val.toString(16)}`);
|
|
293
|
+
const spiCmds = {
|
|
294
|
+
low: [0xAC, 0xA0],
|
|
295
|
+
high: [0xAC, 0xA8],
|
|
296
|
+
ext: [0xAC, 0xA4],
|
|
297
|
+
};
|
|
298
|
+
const [b1, b2] = spiCmds[fuseType];
|
|
299
|
+
await this.send([
|
|
300
|
+
Cmd.PROGRAM_FUSE_ISP,
|
|
301
|
+
b1, b2, 0x00, val, // SPI write-fuse command
|
|
302
|
+
]);
|
|
303
|
+
await sleep(5);
|
|
304
|
+
}
|
|
305
|
+
// ── EEPROM read / write (Phase C) ─────────────────────────────────────────
|
|
306
|
+
/**
|
|
307
|
+
* Write EEPROM data via CMD_PROGRAM_EEPROM_ISP (0x15).
|
|
308
|
+
* @param byteAddr Byte address in EEPROM
|
|
309
|
+
* @param data Data bytes (length ≤ eepromPageSize, default 8)
|
|
310
|
+
*/
|
|
311
|
+
async programEeprom(byteAddr, data) {
|
|
312
|
+
const eepromPageSize = this.board.eepromPageSize ?? 8;
|
|
313
|
+
if (data.length > eepromPageSize) {
|
|
314
|
+
throw new STK500ProtocolError(`EEPROM chunk too large: ${data.length} > page size ${eepromPageSize}`);
|
|
315
|
+
}
|
|
316
|
+
// EEPROM address is passed as word address (byte / 2 for most devices)
|
|
317
|
+
const wordAddr = byteAddr >> 1;
|
|
318
|
+
await this.loadAddress(wordAddr);
|
|
319
|
+
const size = data.length;
|
|
320
|
+
const body = new Uint8Array(9 + size);
|
|
321
|
+
body[0] = Cmd.PROGRAM_EEPROM_ISP;
|
|
322
|
+
body[1] = (size >> 8) & 0xFF;
|
|
323
|
+
body[2] = size & 0xFF;
|
|
324
|
+
body[3] = 0xA1; // EEPROM page load mode
|
|
325
|
+
body[4] = 20; // delay (ms)
|
|
326
|
+
body[5] = 0xC1; // EEPROM write command (0xC0 for page, 0xC4 for byte)
|
|
327
|
+
body[6] = 10; // page write delay (ms)
|
|
328
|
+
body[7] = 0xFF; // poll value 1
|
|
329
|
+
body[8] = 0xFF; // poll value 2
|
|
330
|
+
body.set(data, 9);
|
|
331
|
+
await this.send(body);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Read EEPROM data via CMD_READ_EEPROM_ISP (0x16).
|
|
335
|
+
* @param byteAddr Byte address in EEPROM
|
|
336
|
+
* @param size Number of bytes to read
|
|
337
|
+
*/
|
|
338
|
+
async readEeprom(byteAddr, size) {
|
|
339
|
+
const wordAddr = byteAddr >> 1;
|
|
340
|
+
await this.loadAddress(wordAddr);
|
|
341
|
+
const response = await this.send([
|
|
342
|
+
Cmd.READ_EEPROM_ISP,
|
|
343
|
+
(size >> 8) & 0xFF,
|
|
344
|
+
size & 0xFF,
|
|
345
|
+
0xA0, // SPI: read EEPROM byte command
|
|
346
|
+
]);
|
|
347
|
+
// Response: [CMD, STATUS, data..., STATUS]
|
|
348
|
+
return response.slice(2, 2 + size);
|
|
349
|
+
}
|
|
350
|
+
// ── Upload / Verify ────────────────────────────────────────────────────────
|
|
351
|
+
async upload(hexData, progressCallback) {
|
|
352
|
+
const { data: hex, byteCount } = parseIntelHex(hexData);
|
|
353
|
+
this.log('info', `upload: ${byteCount} bytes`);
|
|
354
|
+
// Phase G: HEX size validation
|
|
355
|
+
if (this.board.flashSize && byteCount > this.board.flashSize) {
|
|
356
|
+
throw new STK500InvalidHexError(`HEX too large: ${byteCount} bytes exceeds flash size ${this.board.flashSize} bytes`);
|
|
357
|
+
}
|
|
358
|
+
let pageaddr = 0;
|
|
359
|
+
while (pageaddr < hex.length) {
|
|
360
|
+
const wordAddr = pageaddr >> 1; // convert byte address to word address
|
|
361
|
+
const chunkSize = Math.min(this.board.pageSize, hex.length - pageaddr);
|
|
362
|
+
const chunk = hex.subarray(pageaddr, pageaddr + chunkSize);
|
|
363
|
+
await this.programFlash(wordAddr, chunk);
|
|
364
|
+
pageaddr += chunkSize;
|
|
365
|
+
progressCallback?.((pageaddr / hex.length) * 100);
|
|
366
|
+
}
|
|
367
|
+
this.log('info', 'upload complete');
|
|
368
|
+
}
|
|
369
|
+
async verify(hexData, progressCallback) {
|
|
370
|
+
const { data: hex, byteCount } = parseIntelHex(hexData);
|
|
371
|
+
this.log('info', `verify: checking ${byteCount} bytes`);
|
|
372
|
+
let pageaddr = 0;
|
|
373
|
+
while (pageaddr < hex.length) {
|
|
374
|
+
const wordAddr = pageaddr >> 1;
|
|
375
|
+
const chunkSize = Math.min(this.board.pageSize, hex.length - pageaddr);
|
|
376
|
+
const expected = hex.subarray(pageaddr, pageaddr + chunkSize);
|
|
377
|
+
const actual = await this.readFlash(wordAddr, chunkSize);
|
|
378
|
+
for (let i = 0; i < chunkSize; i++) {
|
|
379
|
+
if (actual[i] !== expected[i]) {
|
|
380
|
+
throw new STK500VerifyError(pageaddr + i, expected[i], actual[i]);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
pageaddr += chunkSize;
|
|
384
|
+
progressCallback?.((pageaddr / hex.length) * 100);
|
|
385
|
+
}
|
|
386
|
+
this.log('info', 'verify OK');
|
|
387
|
+
}
|
|
388
|
+
// ── bootload (main entry point) ────────────────────────────────────────────
|
|
389
|
+
async bootload(hexData, progressCallback) {
|
|
390
|
+
const progress = (status, pct) => {
|
|
391
|
+
this.log('info', `${status} (${Math.round(pct)}%)`);
|
|
392
|
+
progressCallback?.(status, pct);
|
|
393
|
+
};
|
|
394
|
+
progress('Resetting device', 0);
|
|
395
|
+
await this.resetDevice();
|
|
396
|
+
progress('Syncing', 5);
|
|
397
|
+
await this.sync(this.syncAttempts);
|
|
398
|
+
progress('Verifying signature', 15);
|
|
399
|
+
await this.verifySignature();
|
|
400
|
+
progress('Configuring device', 20);
|
|
401
|
+
await this.setDeviceDescriptor();
|
|
402
|
+
progress('Entering programming mode', 25);
|
|
403
|
+
await this.enterProgMode();
|
|
404
|
+
progress('Erasing chip', 30);
|
|
405
|
+
await this.chipErase();
|
|
406
|
+
progress('Uploading', 35);
|
|
407
|
+
await this.upload(hexData, (pct) => {
|
|
408
|
+
progress('Uploading', 35 + pct * 0.40);
|
|
409
|
+
});
|
|
410
|
+
progress('Verifying', 75);
|
|
411
|
+
await this.verify(hexData, (pct) => {
|
|
412
|
+
progress('Verifying', 75 + pct * 0.20);
|
|
413
|
+
});
|
|
414
|
+
progress('Exiting programming mode', 95);
|
|
415
|
+
await this.leaveProgMode();
|
|
416
|
+
progress('Complete', 100);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ── Device Descriptor Builder ──────────────────────────────────────────────
|
|
420
|
+
/**
|
|
421
|
+
* Build a standard 52-byte STK500v2 device descriptor from board config.
|
|
422
|
+
* Most wiring-bootloader implementations only check a few fields and ignore the rest.
|
|
423
|
+
* Layout (AVR068 Table 10):
|
|
424
|
+
* [0-7] ucReadIO[8] — I/O read access mask
|
|
425
|
+
* [8-15] ucReadIOShadow[8] — shadow I/O read mask (zeros)
|
|
426
|
+
* [16-23] ucWriteIO[8] — I/O write access mask
|
|
427
|
+
* [24-31] ucWriteIOShadow[8] — shadow I/O write mask (zeros)
|
|
428
|
+
* [32-33] uiFlashPageSize — flash page size in bytes (LE)
|
|
429
|
+
* [34] ucEepromPageSize — EEPROM page size in bytes
|
|
430
|
+
* [35-38] ulBootAddress — boot section word address (LE)
|
|
431
|
+
* [39-40] uiUpperBootSize — boot section size in words (LE)
|
|
432
|
+
* [41-44] ulFlashSize — total flash size in bytes (LE)
|
|
433
|
+
* [45-51] (reserved / zeros)
|
|
434
|
+
*/
|
|
435
|
+
function buildDefaultDescriptor(board) {
|
|
436
|
+
const desc = new Uint8Array(52); // zeros by default
|
|
437
|
+
// I/O space read mask (typical for ATmega2560-class devices)
|
|
438
|
+
desc[0] = 0xB6;
|
|
439
|
+
desc[1] = 0xFF;
|
|
440
|
+
desc[2] = 0xFF;
|
|
441
|
+
desc[3] = 0xFF;
|
|
442
|
+
desc[4] = 0xFF;
|
|
443
|
+
desc[5] = 0x3F;
|
|
444
|
+
desc[6] = 0xFF;
|
|
445
|
+
desc[7] = 0xFF;
|
|
446
|
+
// ucReadIOShadow[8] — zeros (8-15)
|
|
447
|
+
// I/O space write mask
|
|
448
|
+
desc[16] = 0xB4;
|
|
449
|
+
desc[17] = 0x00;
|
|
450
|
+
desc[18] = 0x00;
|
|
451
|
+
desc[19] = 0x00;
|
|
452
|
+
desc[20] = 0x00;
|
|
453
|
+
desc[21] = 0x30;
|
|
454
|
+
desc[22] = 0x00;
|
|
455
|
+
desc[23] = 0x00;
|
|
456
|
+
// ucWriteIOShadow[8] — zeros (24-31)
|
|
457
|
+
// Flash page size (little-endian)
|
|
458
|
+
const page = board.pageSize;
|
|
459
|
+
desc[32] = page & 0xFF;
|
|
460
|
+
desc[33] = (page >> 8) & 0xFF;
|
|
461
|
+
// EEPROM page size
|
|
462
|
+
desc[34] = board.eepromPageSize ?? 8;
|
|
463
|
+
// Boot section start address (word address, little-endian)
|
|
464
|
+
const boot = board.bootAddress ?? 0;
|
|
465
|
+
desc[35] = boot & 0xFF;
|
|
466
|
+
desc[36] = (boot >> 8) & 0xFF;
|
|
467
|
+
desc[37] = (boot >> 16) & 0xFF;
|
|
468
|
+
desc[38] = (boot >> 24) & 0xFF;
|
|
469
|
+
// Upper boot section size (words, little-endian)
|
|
470
|
+
const upper = board.upperBootSize ?? 0;
|
|
471
|
+
desc[39] = upper & 0xFF;
|
|
472
|
+
desc[40] = (upper >> 8) & 0xFF;
|
|
473
|
+
// Flash size (bytes, little-endian)
|
|
474
|
+
const flash = board.flashSize ?? 0;
|
|
475
|
+
desc[41] = flash & 0xFF;
|
|
476
|
+
desc[42] = (flash >> 8) & 0xFF;
|
|
477
|
+
desc[43] = (flash >> 16) & 0xFF;
|
|
478
|
+
desc[44] = (flash >> 24) & 0xFF;
|
|
479
|
+
// Bytes 45-51 remain zero
|
|
480
|
+
return desc;
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=programmer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programmer.js","sourceRoot":"","sources":["../../../src/protocol/stk500v2/programmer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/** UPDI synchronisation byte — sent before every instruction */
|
|
2
|
+
export declare const UPDI_SYNC = 85;
|
|
3
|
+
/** ACK byte returned by device for write operations */
|
|
4
|
+
export declare const UPDI_ACK = 64;
|
|
5
|
+
/** LDS — Load from Data Space (followed by address + returns data) */
|
|
6
|
+
export declare const UPDI_LDS = 0;
|
|
7
|
+
/** STS — Store to Data Space (followed by address + data) */
|
|
8
|
+
export declare const UPDI_STS = 64;
|
|
9
|
+
/** LD — Load indirect (uses pointer register) */
|
|
10
|
+
export declare const UPDI_LD = 32;
|
|
11
|
+
/** ST — Store indirect (uses pointer register) */
|
|
12
|
+
export declare const UPDI_ST = 96;
|
|
13
|
+
/** LDCS — Load from Control/Status Space */
|
|
14
|
+
export declare const UPDI_LDCS = 128;
|
|
15
|
+
/** STCS — Store to Control/Status Space */
|
|
16
|
+
export declare const UPDI_STCS = 192;
|
|
17
|
+
/** REPEAT — Repeat the next instruction N+1 times */
|
|
18
|
+
export declare const UPDI_REPEAT = 160;
|
|
19
|
+
/** KEY — Key broadcast (8 or 16 bytes) */
|
|
20
|
+
export declare const UPDI_KEY = 224;
|
|
21
|
+
/** Address operand: 1-byte address */
|
|
22
|
+
export declare const UPDI_ADDRESS_8 = 0;
|
|
23
|
+
/** Address operand: 2-byte address (default for all AVR NVM access) */
|
|
24
|
+
export declare const UPDI_ADDRESS_16 = 1;
|
|
25
|
+
/** Address operand: 3-byte address (AVR DA/DB extended addressing) */
|
|
26
|
+
export declare const UPDI_ADDRESS_24 = 2;
|
|
27
|
+
/** Data operand: 1-byte data */
|
|
28
|
+
export declare const UPDI_DATA_8 = 0;
|
|
29
|
+
/** Data operand: 2-byte data */
|
|
30
|
+
export declare const UPDI_DATA_16 = 1;
|
|
31
|
+
/** Pointer mode: access *(ptr) */
|
|
32
|
+
export declare const UPDI_PTR = 0;
|
|
33
|
+
/** Pointer mode: access *(ptr++) — post-increment */
|
|
34
|
+
export declare const UPDI_PTR_INC = 1;
|
|
35
|
+
/** Pointer mode: access *(--ptr) — pre-decrement */
|
|
36
|
+
export declare const UPDI_PTR_DEC = 2;
|
|
37
|
+
/** 8-byte (64-bit) key */
|
|
38
|
+
export declare const UPDI_KEY_SIZE_64 = 0;
|
|
39
|
+
/** 16-byte (128-bit) key */
|
|
40
|
+
export declare const UPDI_KEY_SIZE_128 = 1;
|
|
41
|
+
export declare const UPDI_CS_STATUSA = 0;
|
|
42
|
+
export declare const UPDI_CS_STATUSB = 1;
|
|
43
|
+
export declare const UPDI_CS_CTRLA = 2;
|
|
44
|
+
export declare const UPDI_CS_CTRLB = 3;
|
|
45
|
+
/** ASI_KEY_STATUS — shows which key is currently active */
|
|
46
|
+
export declare const UPDI_CS_ASI_KEY_STATUS = 7;
|
|
47
|
+
/** ASI_RESET_REQ — write 0x59 to assert reset, 0x00 to deassert */
|
|
48
|
+
export declare const UPDI_CS_ASI_RESET_REQ = 8;
|
|
49
|
+
export declare const UPDI_CS_ASI_CTRL_A = 9;
|
|
50
|
+
export declare const UPDI_CS_ASI_SYS_CTRLA = 10;
|
|
51
|
+
/** ASI_SYS_STATUS — NVMPROG / LOCKSTATUS / UROWPROG bits */
|
|
52
|
+
export declare const UPDI_CS_ASI_SYS_STATUS = 11;
|
|
53
|
+
/** Guard-time insertion delay (IBDLY) */
|
|
54
|
+
export declare const UPDI_CTRLA_IBDLY = 128;
|
|
55
|
+
/** Guard-time value: 2-cycle inter-byte delay (minimises wait between bytes) */
|
|
56
|
+
export declare const UPDI_CTRLA_GT_2 = 6;
|
|
57
|
+
export declare const UPDI_KEY_CHIPERASE = 8;
|
|
58
|
+
export declare const UPDI_KEY_NVMPROG = 16;
|
|
59
|
+
export declare const UPDI_KEY_UROWWRITE = 32;
|
|
60
|
+
export declare const UPDI_SYS_RSTSYS = 32;
|
|
61
|
+
export declare const UPDI_SYS_INSLEEP = 16;
|
|
62
|
+
export declare const UPDI_SYS_NVMPROG = 8;
|
|
63
|
+
export declare const UPDI_SYS_UROWPROG = 4;
|
|
64
|
+
export declare const UPDI_SYS_LOCKSTATUS = 1;
|
|
65
|
+
export declare const UPDI_RESET_REQ_ASSERT = 89;
|
|
66
|
+
export declare const UPDI_RESET_REQ_DEASSERT = 0;
|
|
67
|
+
export declare const NVM_BASE = 4096;
|
|
68
|
+
export declare const NVM_CTRLA = 4096;
|
|
69
|
+
export declare const NVM_CTRLB = 4097;
|
|
70
|
+
export declare const NVM_STATUS = 4098;
|
|
71
|
+
export declare const NVM_INTCTRL = 4099;
|
|
72
|
+
export declare const NVM_INTFLAGS = 4100;
|
|
73
|
+
export declare const NVM_DATA = 4102;
|
|
74
|
+
export declare const NVM_ADDR = 4104;
|
|
75
|
+
/** Flash busy — poll until cleared after write/erase */
|
|
76
|
+
export declare const NVM_FBUSY = 1;
|
|
77
|
+
/** EEPROM busy */
|
|
78
|
+
export declare const NVM_EEBUSY = 2;
|
|
79
|
+
/** Write error */
|
|
80
|
+
export declare const NVM_WRERR = 4;
|
|
81
|
+
export declare const NVM_CMD_NOP = 0;
|
|
82
|
+
export declare const NVM_CMD_WP = 1;
|
|
83
|
+
export declare const NVM_CMD_ER = 2;
|
|
84
|
+
export declare const NVM_CMD_ERWP = 3;
|
|
85
|
+
export declare const NVM_CMD_PBC = 4;
|
|
86
|
+
export declare const NVM_CMD_CHER = 5;
|
|
87
|
+
export declare const NVM_CMD_EEER = 6;
|
|
88
|
+
export declare const NVM_CMD_WFU = 7;
|
|
89
|
+
/** Default SIGROW base address — contains 3-byte device ID at offset 0 */
|
|
90
|
+
export declare const SIGROW_BASE = 4352;
|
|
91
|
+
/** EEPROM base address (tinyAVR 0/1/2 and megaAVR 0) */
|
|
92
|
+
export declare const EEPROM_BASE = 5120;
|
|
93
|
+
/** Fuse register base (tinyAVR 0/1/2) */
|
|
94
|
+
export declare const FUSE_BASE = 4736;
|
|
95
|
+
/** Number of fuse registers */
|
|
96
|
+
export declare const FUSE_COUNT = 6;
|
|
97
|
+
/**
|
|
98
|
+
* NVMProg key — grants access to NVM controller for flash/EEPROM/fuse writes.
|
|
99
|
+
* ASCII: "NVMProg " reversed to [0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E]
|
|
100
|
+
*/
|
|
101
|
+
export declare const UPDI_KEY_NVM_PROG: Uint8Array;
|
|
102
|
+
/**
|
|
103
|
+
* ChipErase key — grants a single chip erase operation even on a locked device.
|
|
104
|
+
* ASCII: "NVMErase" reversed
|
|
105
|
+
*/
|
|
106
|
+
export declare const UPDI_KEY_CHIP_ERASE_REQ: Uint8Array;
|
|
107
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/protocol/updi/constants.ts"],"names":[],"mappings":"AAOA,gEAAgE;AAChE,eAAO,MAAM,SAAS,KAAO,CAAC;AAE9B,uDAAuD;AACvD,eAAO,MAAM,QAAQ,KAAQ,CAAC;AAI9B,sEAAsE;AACtE,eAAO,MAAM,QAAQ,IAAU,CAAC;AAChC,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,KAAU,CAAC;AAChC,kDAAkD;AAClD,eAAO,MAAM,OAAO,KAAW,CAAC;AAChC,mDAAmD;AACnD,eAAO,MAAM,OAAO,KAAW,CAAC;AAChC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,MAAS,CAAC;AAChC,2CAA2C;AAC3C,eAAO,MAAM,SAAS,MAAS,CAAC;AAChC,qDAAqD;AACrD,eAAO,MAAM,WAAW,MAAO,CAAC;AAChC,2CAA2C;AAC3C,eAAO,MAAM,QAAQ,MAAU,CAAC;AAIhC,sCAAsC;AACtC,eAAO,MAAM,cAAc,IAAK,CAAC;AACjC,uEAAuE;AACvE,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,sEAAsE;AACtE,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,gCAAgC;AAChC,eAAO,MAAM,WAAW,IAAK,CAAC;AAC9B,gCAAgC;AAChC,eAAO,MAAM,YAAY,IAAI,CAAC;AAI9B,kCAAkC;AAClC,eAAO,MAAM,QAAQ,IAAQ,CAAC;AAC9B,qDAAqD;AACrD,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,oDAAoD;AACpD,eAAO,MAAM,YAAY,IAAI,CAAC;AAI9B,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,IAAK,CAAC;AACnC,4BAA4B;AAC5B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAInC,eAAO,MAAM,eAAe,IAAe,CAAC;AAC5C,eAAO,MAAM,eAAe,IAAe,CAAC;AAC5C,eAAO,MAAM,aAAa,IAAiB,CAAC;AAC5C,eAAO,MAAM,aAAa,IAAiB,CAAC;AAC5C,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,IAAQ,CAAC;AAC5C,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,IAAS,CAAC;AAC5C,eAAO,MAAM,kBAAkB,IAAY,CAAC;AAC5C,eAAO,MAAM,qBAAqB,KAAS,CAAC;AAC5C,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,KAAQ,CAAC;AAI5C,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,MAAQ,CAAC;AACtC,gFAAgF;AAChF,eAAO,MAAM,eAAe,IAAS,CAAC;AAItC,eAAO,MAAM,kBAAkB,IAAO,CAAC;AACvC,eAAO,MAAM,gBAAgB,KAAS,CAAC;AACvC,eAAO,MAAM,kBAAkB,KAAO,CAAC;AAIvC,eAAO,MAAM,eAAe,KAAW,CAAC;AACxC,eAAO,MAAM,gBAAgB,KAAU,CAAC;AACxC,eAAO,MAAM,gBAAgB,IAAU,CAAC;AACxC,eAAO,MAAM,iBAAiB,IAAS,CAAC;AACxC,eAAO,MAAM,mBAAmB,IAAO,CAAC;AAIxC,eAAO,MAAM,qBAAqB,KAAS,CAAC;AAC5C,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAI5C,eAAO,MAAM,QAAQ,OAAY,CAAC;AAClC,eAAO,MAAM,SAAS,OAAW,CAAC;AAClC,eAAO,MAAM,SAAS,OAAW,CAAC;AAClC,eAAO,MAAM,UAAU,OAAU,CAAC;AAClC,eAAO,MAAM,WAAW,OAAS,CAAC;AAClC,eAAO,MAAM,YAAY,OAAQ,CAAC;AAClC,eAAO,MAAM,QAAQ,OAAY,CAAC;AAClC,eAAO,MAAM,QAAQ,OAAY,CAAC;AAIlC,wDAAwD;AACxD,eAAO,MAAM,SAAS,IAAQ,CAAC;AAC/B,kBAAkB;AAClB,eAAO,MAAM,UAAU,IAAO,CAAC;AAC/B,kBAAkB;AAClB,eAAO,MAAM,SAAS,IAAQ,CAAC;AAI/B,eAAO,MAAM,WAAW,IAAQ,CAAC;AACjC,eAAO,MAAM,UAAU,IAAS,CAAC;AACjC,eAAO,MAAM,UAAU,IAAS,CAAC;AACjC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,WAAW,IAAQ,CAAC;AACjC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,YAAY,IAAO,CAAC;AACjC,eAAO,MAAM,WAAW,IAAQ,CAAC;AAIjC,0EAA0E;AAC1E,eAAO,MAAM,WAAW,OAAkB,CAAC;AAC3C,wDAAwD;AACxD,eAAO,MAAM,WAAW,OAAkB,CAAC;AAC3C,yCAAyC;AACzC,eAAO,MAAM,SAAS,OAAoB,CAAC;AAC3C,+BAA+B;AAC/B,eAAO,MAAM,UAAU,IAAc,CAAC;AAItC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAE9B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,UAEpC,CAAC"}
|