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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/autoDetect.d.ts +24 -0
  4. package/dist/autoDetect.d.ts.map +1 -0
  5. package/dist/autoDetect.js +66 -0
  6. package/dist/autoDetect.js.map +1 -0
  7. package/dist/boards/database.d.ts +17 -0
  8. package/dist/boards/database.d.ts.map +1 -0
  9. package/dist/boards/database.js +957 -0
  10. package/dist/boards/database.js.map +1 -0
  11. package/dist/core/constants.d.ts +44 -0
  12. package/dist/core/constants.d.ts.map +1 -0
  13. package/dist/core/constants.js +56 -0
  14. package/dist/core/constants.js.map +1 -0
  15. package/dist/core/errors.d.ts +45 -0
  16. package/dist/core/errors.d.ts.map +1 -0
  17. package/dist/core/errors.js +92 -0
  18. package/dist/core/errors.js.map +1 -0
  19. package/dist/core/types.d.ts +138 -0
  20. package/dist/core/types.d.ts.map +1 -0
  21. package/dist/core/types.js +3 -0
  22. package/dist/core/types.js.map +1 -0
  23. package/dist/index.d.ts +24 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +25 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/protocol/avr109/programmer.d.ts +78 -0
  28. package/dist/protocol/avr109/programmer.d.ts.map +1 -0
  29. package/dist/protocol/avr109/programmer.js +324 -0
  30. package/dist/protocol/avr109/programmer.js.map +1 -0
  31. package/dist/protocol/hexParser.d.ts +12 -0
  32. package/dist/protocol/hexParser.d.ts.map +1 -0
  33. package/dist/protocol/hexParser.js +133 -0
  34. package/dist/protocol/hexParser.js.map +1 -0
  35. package/dist/protocol/picoboot/constants.d.ts +65 -0
  36. package/dist/protocol/picoboot/constants.d.ts.map +1 -0
  37. package/dist/protocol/picoboot/constants.js +80 -0
  38. package/dist/protocol/picoboot/constants.js.map +1 -0
  39. package/dist/protocol/picoboot/programmer.d.ts +73 -0
  40. package/dist/protocol/picoboot/programmer.d.ts.map +1 -0
  41. package/dist/protocol/picoboot/programmer.js +278 -0
  42. package/dist/protocol/picoboot/programmer.js.map +1 -0
  43. package/dist/protocol/picoboot/uf2.d.ts +51 -0
  44. package/dist/protocol/picoboot/uf2.d.ts.map +1 -0
  45. package/dist/protocol/picoboot/uf2.js +119 -0
  46. package/dist/protocol/picoboot/uf2.js.map +1 -0
  47. package/dist/protocol/receiveData.d.ts +3 -0
  48. package/dist/protocol/receiveData.d.ts.map +1 -0
  49. package/dist/protocol/receiveData.js +72 -0
  50. package/dist/protocol/receiveData.js.map +1 -0
  51. package/dist/protocol/sendCommand.d.ts +14 -0
  52. package/dist/protocol/sendCommand.d.ts.map +1 -0
  53. package/dist/protocol/sendCommand.js +48 -0
  54. package/dist/protocol/sendCommand.js.map +1 -0
  55. package/dist/protocol/stk500v2/constants.d.ts +57 -0
  56. package/dist/protocol/stk500v2/constants.d.ts.map +1 -0
  57. package/dist/protocol/stk500v2/constants.js +62 -0
  58. package/dist/protocol/stk500v2/constants.js.map +1 -0
  59. package/dist/protocol/stk500v2/frame.d.ts +14 -0
  60. package/dist/protocol/stk500v2/frame.d.ts.map +1 -0
  61. package/dist/protocol/stk500v2/frame.js +116 -0
  62. package/dist/protocol/stk500v2/frame.js.map +1 -0
  63. package/dist/protocol/stk500v2/programmer.d.ts +92 -0
  64. package/dist/protocol/stk500v2/programmer.d.ts.map +1 -0
  65. package/dist/protocol/stk500v2/programmer.js +482 -0
  66. package/dist/protocol/stk500v2/programmer.js.map +1 -0
  67. package/dist/protocol/updi/constants.d.ts +107 -0
  68. package/dist/protocol/updi/constants.d.ts.map +1 -0
  69. package/dist/protocol/updi/constants.js +130 -0
  70. package/dist/protocol/updi/constants.js.map +1 -0
  71. package/dist/protocol/updi/link.d.ts +82 -0
  72. package/dist/protocol/updi/link.d.ts.map +1 -0
  73. package/dist/protocol/updi/link.js +241 -0
  74. package/dist/protocol/updi/link.js.map +1 -0
  75. package/dist/protocol/updi/programmer.d.ts +89 -0
  76. package/dist/protocol/updi/programmer.d.ts.map +1 -0
  77. package/dist/protocol/updi/programmer.js +359 -0
  78. package/dist/protocol/updi/programmer.js.map +1 -0
  79. package/dist/stk500.d.ts +101 -0
  80. package/dist/stk500.d.ts.map +1 -0
  81. package/dist/stk500.js +426 -0
  82. package/dist/stk500.js.map +1 -0
  83. package/dist/transport/IPicobootTransport.d.ts +25 -0
  84. package/dist/transport/IPicobootTransport.d.ts.map +1 -0
  85. package/dist/transport/IPicobootTransport.js +10 -0
  86. package/dist/transport/IPicobootTransport.js.map +1 -0
  87. package/dist/transport/ITransport.d.ts +33 -0
  88. package/dist/transport/ITransport.d.ts.map +1 -0
  89. package/dist/transport/ITransport.js +4 -0
  90. package/dist/transport/ITransport.js.map +1 -0
  91. package/dist/transport/NodeSerialTransport.d.ts +35 -0
  92. package/dist/transport/NodeSerialTransport.d.ts.map +1 -0
  93. package/dist/transport/NodeSerialTransport.js +102 -0
  94. package/dist/transport/NodeSerialTransport.js.map +1 -0
  95. package/dist/transport/NodeUSBTransport.d.ts +24 -0
  96. package/dist/transport/NodeUSBTransport.d.ts.map +1 -0
  97. package/dist/transport/NodeUSBTransport.js +146 -0
  98. package/dist/transport/NodeUSBTransport.js.map +1 -0
  99. package/dist/transport/WebSerialTransport.d.ts +63 -0
  100. package/dist/transport/WebSerialTransport.d.ts.map +1 -0
  101. package/dist/transport/WebSerialTransport.js +159 -0
  102. package/dist/transport/WebSerialTransport.js.map +1 -0
  103. package/package.json +79 -0
@@ -0,0 +1,359 @@
1
+ // UPDI (Unified Program and Debug Interface) programmer.
2
+ //
3
+ // Supports tinyAVR 0/1/2 series and megaAVR 0 series (ATmega4809).
4
+ // This is the first JavaScript implementation of UPDI programming.
5
+ //
6
+ // Physical requirements:
7
+ // - Serial port opened at 8E2 (8 data bits, even parity, 2 stop bits)
8
+ // - Single-wire half-duplex: TX echo must be consumed for every write
9
+ // - A BREAK condition (≥12 bit-times low) resets the UPDI state machine
10
+ //
11
+ // Programming sequence:
12
+ // 1. sendBreak() — reset UPDI
13
+ // 2. ldcs(STATUSA) — verify the link is alive
14
+ // 3. Send NVMProg KEY
15
+ // 4. Wait for NVMPROG mode in ASI_KEY_STATUS
16
+ // 5. Chip erase (NVM_CMD_CHER via NVM_CTRLA)
17
+ // 6. Write flash pages (setPtr → stPtrInc → NVM_CMD_ERWP × N)
18
+ // 7. Verify
19
+ // 8. Reset device (ASI_RESET_REQ)
20
+ //
21
+ // Reference: Microchip DS40002312 — "AVR UPDI Programming Interface"
22
+ import { UPDI_CS_STATUSA, UPDI_CS_ASI_KEY_STATUS, UPDI_CS_ASI_SYS_STATUS, UPDI_CS_ASI_RESET_REQ, UPDI_KEY_NVMPROG, UPDI_SYS_LOCKSTATUS, NVM_CTRLA, NVM_STATUS, NVM_FBUSY, NVM_CMD_CHER, NVM_CMD_ERWP, NVM_CMD_NOP, UPDI_KEY_NVM_PROG, UPDI_KEY_CHIP_ERASE_REQ, UPDI_RESET_REQ_ASSERT, UPDI_RESET_REQ_DEASSERT, SIGROW_BASE, EEPROM_BASE, FUSE_BASE, FUSE_COUNT, } from './constants.js';
23
+ import { UPDILink } from './link.js';
24
+ import { STK500ProtocolError, STK500SyncError, STK500SignatureMismatchError, STK500VerifyError, STK500InvalidHexError, } from '../../core/errors.js';
25
+ import { parseIntelHex } from '../hexParser.js';
26
+ function sleep(ms) {
27
+ return new Promise((r) => setTimeout(r, ms));
28
+ }
29
+ export class UPDI {
30
+ constructor(transport, board, opts = {}) {
31
+ this.transport = transport;
32
+ this.board = board;
33
+ this.syncAttempts = opts.retry?.syncAttempts ?? 5;
34
+ if (opts.quiet) {
35
+ this.log = () => { };
36
+ }
37
+ else if (opts.logger) {
38
+ this.log = opts.logger;
39
+ }
40
+ else {
41
+ this.log = (level, msg) => {
42
+ /* istanbul ignore next */
43
+ if (typeof console !== 'undefined') {
44
+ console.log(`[updi] [${level}] ${msg}`);
45
+ }
46
+ };
47
+ }
48
+ this.link = new UPDILink(transport, board, this.log);
49
+ }
50
+ // ── Initialization ────────────────────────────────────────────────────────
51
+ /**
52
+ * Send a BREAK condition to reset the UPDI state machine.
53
+ * Requires transport.sendBreak() — throws if not available.
54
+ */
55
+ async sendBreak() {
56
+ if (!this.transport.sendBreak) {
57
+ throw new STK500ProtocolError('UPDI requires transport.sendBreak(). ' +
58
+ 'Use WebSerialTransport or NodeSerialTransport which implements this method.');
59
+ }
60
+ this.log('debug', 'sendBreak: resetting UPDI state machine');
61
+ await this.transport.sendBreak();
62
+ await sleep(5); // short settling time after BREAK
63
+ }
64
+ /**
65
+ * Verify the UPDI link is active by reading STATUSA.
66
+ * Returns the STATUSA value on success, throws STK500SyncError on failure.
67
+ */
68
+ async sync(attempts) {
69
+ this.log('debug', `sync (max ${attempts} attempts)`);
70
+ for (let i = 1; i <= attempts; i++) {
71
+ try {
72
+ const status = await this.link.ldcs(UPDI_CS_STATUSA);
73
+ // 0x00 or any non-0xFF value indicates UPDI is responding
74
+ if (status !== 0xFF) {
75
+ this.log('debug', `sync OK on attempt ${i}, STATUSA=0x${status.toString(16)}`);
76
+ return;
77
+ }
78
+ throw new Error('STATUSA returned 0xFF — no device');
79
+ }
80
+ catch (err) {
81
+ this.log('debug', `sync attempt ${i}/${attempts}: ` +
82
+ `${err instanceof Error ? err.message : String(err)}`);
83
+ if (i < attempts)
84
+ await sleep(100);
85
+ }
86
+ }
87
+ throw new STK500SyncError(attempts);
88
+ }
89
+ // ── NVM Programming Mode ──────────────────────────────────────────────────
90
+ /**
91
+ * Send the NVMProg key and wait until the device acknowledges NVMPROG mode.
92
+ */
93
+ async enterProgMode() {
94
+ this.log('debug', 'enterProgMode: sending NVMProg key');
95
+ // Configure guard time for faster communication
96
+ await this.link.configureGuardTime();
97
+ // Broadcast NVM programming key
98
+ await this.link.sendKey(UPDI_KEY_NVM_PROG);
99
+ // Wait for the device to enter NVM programming mode
100
+ const deadline = Date.now() + this.board.timeout;
101
+ while (Date.now() < deadline) {
102
+ const keyStatus = await this.link.ldcs(UPDI_CS_ASI_KEY_STATUS);
103
+ if (keyStatus & UPDI_KEY_NVMPROG) {
104
+ this.log('info', 'NVMPROG mode active');
105
+ return;
106
+ }
107
+ await sleep(5);
108
+ }
109
+ throw new STK500ProtocolError('UPDI: failed to enter NVM programming mode (NVMPROG not set)');
110
+ }
111
+ /**
112
+ * Check if the device is locked (LOCKSTATUS bit in ASI_SYS_STATUS).
113
+ */
114
+ async isLocked() {
115
+ const status = await this.link.ldcs(UPDI_CS_ASI_SYS_STATUS);
116
+ return (status & UPDI_SYS_LOCKSTATUS) !== 0;
117
+ }
118
+ // ── Chip Erase ────────────────────────────────────────────────────────────
119
+ /**
120
+ * Erase the entire chip (flash + EEPROM + fuses reset to defaults).
121
+ * Must be in NVMPROG mode first — OR use the CHIPERASE key for locked devices.
122
+ */
123
+ async chipErase() {
124
+ this.log('info', 'chipErase');
125
+ await this.link.sts(NVM_CTRLA, NVM_CMD_CHER);
126
+ await this.waitNvmReady();
127
+ // Clear the NVM command register after erase
128
+ await this.link.sts(NVM_CTRLA, NVM_CMD_NOP);
129
+ }
130
+ /**
131
+ * Chip erase using the CHIPERASE key — works even on locked devices.
132
+ * Sends BREAK + key, then waits for erase to complete.
133
+ */
134
+ async chipEraseKey() {
135
+ this.log('info', 'chipEraseKey: using CHIPERASE key for locked device');
136
+ // Reset UPDI and send chip-erase key
137
+ await this.sendBreak();
138
+ await this.link.configureGuardTime();
139
+ await this.link.sendKey(UPDI_KEY_CHIP_ERASE_REQ);
140
+ // Toggle reset to trigger the erase
141
+ await this.link.stcs(UPDI_CS_ASI_RESET_REQ, UPDI_RESET_REQ_ASSERT);
142
+ await sleep(5);
143
+ await this.link.stcs(UPDI_CS_ASI_RESET_REQ, UPDI_RESET_REQ_DEASSERT);
144
+ // Wait for erase to complete (device re-enters UPDI idle)
145
+ const deadline = Date.now() + this.board.timeout;
146
+ while (Date.now() < deadline) {
147
+ try {
148
+ const keyStatus = await this.link.ldcs(UPDI_CS_ASI_KEY_STATUS);
149
+ if (!(keyStatus & 0x08)) { // CHIPERASE key cleared = erase done
150
+ this.log('info', 'chipEraseKey: complete');
151
+ return;
152
+ }
153
+ }
154
+ catch { /* UPDI may be briefly unresponsive during erase */ }
155
+ await sleep(20);
156
+ }
157
+ throw new STK500ProtocolError('UPDI: chip erase timeout');
158
+ }
159
+ // ── NVM Busy Poll ─────────────────────────────────────────────────────────
160
+ /** Wait until NVM_STATUS.FBUSY clears (flash write/erase completed) */
161
+ async waitNvmReady() {
162
+ const deadline = Date.now() + this.board.timeout;
163
+ while (Date.now() < deadline) {
164
+ const status = await this.link.lds(NVM_STATUS);
165
+ if (!(status & NVM_FBUSY))
166
+ return;
167
+ await sleep(1);
168
+ }
169
+ throw new STK500ProtocolError('UPDI: NVM controller busy timeout');
170
+ }
171
+ // ── Signature ─────────────────────────────────────────────────────────────
172
+ /**
173
+ * Read the 3-byte device ID from SIGROW (address 0x1100).
174
+ */
175
+ async getSignature() {
176
+ this.log('debug', 'getSignature');
177
+ const sigBase = this.board.sigrowBase ?? SIGROW_BASE;
178
+ return this.link.readMemory(sigBase, 3);
179
+ }
180
+ async verifySignature() {
181
+ const actual = await this.getSignature();
182
+ const expected = this.board.signature;
183
+ if (!actual.every((b, i) => b === expected[i])) {
184
+ throw new STK500SignatureMismatchError(expected, actual);
185
+ }
186
+ const fmt = (b) => Array.from(b).map((x) => `0x${x.toString(16).padStart(2, '0')}`).join(', ');
187
+ this.log('info', `signature verified: [${fmt(actual)}]`);
188
+ }
189
+ // ── Flash Programming ─────────────────────────────────────────────────────
190
+ /**
191
+ * Write one page of flash.
192
+ * @param byteAddr Absolute byte address in flash (e.g. 0x8000 for tinyAVR start)
193
+ * @param data Page data (length = board.pageSize)
194
+ */
195
+ async programPage(byteAddr, data) {
196
+ // Clear any previous NVM command
197
+ await this.link.sts(NVM_CTRLA, NVM_CMD_NOP);
198
+ // Set pointer and stream data into page buffer
199
+ await this.link.setPtr(byteAddr);
200
+ await this.link.stPtrInc(data);
201
+ // Execute erase + write
202
+ await this.link.sts(NVM_CTRLA, NVM_CMD_ERWP);
203
+ await this.waitNvmReady();
204
+ }
205
+ /** Read `size` bytes from flash starting at `byteAddr` */
206
+ async readFlash(byteAddr, size) {
207
+ return this.link.readMemory(byteAddr, size);
208
+ }
209
+ // ── EEPROM ────────────────────────────────────────────────────────────────
210
+ /**
211
+ * Write EEPROM bytes.
212
+ * @param offset Byte offset within EEPROM (0-based)
213
+ * @param data Data to write
214
+ */
215
+ async writeEeprom(offset, data) {
216
+ await this.link.sts(NVM_CTRLA, NVM_CMD_NOP);
217
+ await this.link.setPtr(EEPROM_BASE + offset);
218
+ await this.link.stPtrInc(data);
219
+ await this.link.sts(NVM_CTRLA, NVM_CMD_ERWP);
220
+ await this.waitNvmReady();
221
+ }
222
+ /** Read `size` EEPROM bytes starting at `offset` */
223
+ async readEeprom(offset, size) {
224
+ return this.link.readMemory(EEPROM_BASE + offset, size);
225
+ }
226
+ // ── Fuses ─────────────────────────────────────────────────────────────────
227
+ /**
228
+ * Read all fuse bytes (6 fuses for tinyAVR/megaAVR 0).
229
+ */
230
+ async readFuses() {
231
+ const data = await this.link.readMemory(FUSE_BASE, FUSE_COUNT);
232
+ return {
233
+ fuse0: data[0] ?? 0xFF,
234
+ fuse1: data[1] ?? 0xFF,
235
+ fuse2: data[2] ?? 0xFF,
236
+ // data[3] is reserved (no fuse3) — skip
237
+ fuse4: data[4] ?? 0xFF,
238
+ fuse5: data[5] ?? 0xFF,
239
+ };
240
+ }
241
+ /**
242
+ * Write a single fuse byte.
243
+ * @param fuseNum 0–5 (fuse register index)
244
+ * @param val New fuse value
245
+ */
246
+ async writeFuse(fuseNum, val) {
247
+ if (fuseNum < 0 || fuseNum > 5) {
248
+ throw new STK500ProtocolError(`UPDI: invalid fuse number ${fuseNum} (must be 0–5)`);
249
+ }
250
+ await this.link.sts(NVM_CTRLA, NVM_CMD_NOP);
251
+ await this.link.sts(FUSE_BASE + fuseNum, val);
252
+ await this.link.sts(NVM_CTRLA, 0x07); // WFU command
253
+ await this.waitNvmReady();
254
+ }
255
+ // ── Reset ─────────────────────────────────────────────────────────────────
256
+ /** Exit programming mode and reset the device to run user firmware. */
257
+ async leaveProgMode() {
258
+ this.log('debug', 'leaveProgMode: asserting reset');
259
+ await this.link.stcs(UPDI_CS_ASI_RESET_REQ, UPDI_RESET_REQ_ASSERT);
260
+ await sleep(10);
261
+ await this.link.stcs(UPDI_CS_ASI_RESET_REQ, UPDI_RESET_REQ_DEASSERT);
262
+ this.log('debug', 'device reset — user firmware running');
263
+ }
264
+ // ── Upload / Verify ────────────────────────────────────────────────────────
265
+ async upload(hexData, progressCallback) {
266
+ const { data: hex, byteCount } = parseIntelHex(hexData);
267
+ this.log('info', `upload: ${byteCount} bytes`);
268
+ // HEX size validation
269
+ if (this.board.flashSize && byteCount > this.board.flashSize) {
270
+ throw new STK500InvalidHexError(`HEX too large: ${byteCount} bytes exceeds flash size ${this.board.flashSize} bytes`);
271
+ }
272
+ const pageSize = this.board.pageSize;
273
+ const flashBase = this.board.flashBase ?? 0x8000;
274
+ let offset = 0;
275
+ while (offset < hex.length) {
276
+ const chunkSize = Math.min(pageSize, hex.length - offset);
277
+ const chunk = hex.subarray(offset, offset + chunkSize);
278
+ // Pad last page to full page size with 0xFF (unprogrammed flash value)
279
+ let page;
280
+ if (chunkSize < pageSize) {
281
+ page = new Uint8Array(pageSize).fill(0xFF);
282
+ page.set(chunk);
283
+ }
284
+ else {
285
+ page = chunk;
286
+ }
287
+ await this.programPage(flashBase + offset, page);
288
+ offset += chunkSize;
289
+ progressCallback?.((offset / hex.length) * 100);
290
+ }
291
+ this.log('info', 'upload complete');
292
+ }
293
+ async verify(hexData, progressCallback) {
294
+ const { data: hex, byteCount } = parseIntelHex(hexData);
295
+ this.log('info', `verify: checking ${byteCount} bytes`);
296
+ const pageSize = this.board.pageSize;
297
+ const flashBase = this.board.flashBase ?? 0x8000;
298
+ let offset = 0;
299
+ while (offset < hex.length) {
300
+ const size = Math.min(pageSize, hex.length - offset);
301
+ const expected = hex.subarray(offset, offset + size);
302
+ const actual = await this.readFlash(flashBase + offset, size);
303
+ for (let i = 0; i < size; i++) {
304
+ if (actual[i] !== expected[i]) {
305
+ throw new STK500VerifyError(offset + i, expected[i], actual[i]);
306
+ }
307
+ }
308
+ offset += size;
309
+ progressCallback?.((offset / hex.length) * 100);
310
+ }
311
+ this.log('info', 'verify OK');
312
+ }
313
+ // ── bootload (main entry point) ────────────────────────────────────────────
314
+ async bootload(hexData, progressCallback) {
315
+ const progress = (status, pct) => {
316
+ this.log('info', `${status} (${Math.round(pct)}%)`);
317
+ progressCallback?.(status, pct);
318
+ };
319
+ // 1 ── BREAK to reset UPDI state machine
320
+ progress('Resetting UPDI', 0);
321
+ await this.sendBreak();
322
+ // 2 ── Sync (verify link is alive)
323
+ progress('Syncing', 5);
324
+ await this.sync(this.syncAttempts);
325
+ // 3 ── Enter NVM programming mode
326
+ progress('Entering programming mode', 10);
327
+ await this.enterProgMode();
328
+ // 3b ── If device is locked, use chip-erase key to unlock
329
+ if (await this.isLocked()) {
330
+ this.log('warn', 'device is locked — performing CHIPERASE key unlock');
331
+ await this.chipEraseKey();
332
+ // Re-enter programming mode after chip erase key
333
+ await this.sendBreak();
334
+ await this.sync(this.syncAttempts);
335
+ await this.enterProgMode();
336
+ }
337
+ // 4 ── Verify signature
338
+ progress('Verifying signature', 15);
339
+ await this.verifySignature();
340
+ // 5 ── Chip erase (via NVM command, device is now unlocked)
341
+ progress('Erasing chip', 20);
342
+ await this.chipErase();
343
+ // 6 ── Upload firmware (25 → 75%)
344
+ progress('Uploading', 25);
345
+ await this.upload(hexData, (pct) => {
346
+ progress('Uploading', 25 + pct * 0.50);
347
+ });
348
+ // 7 ── Verify (75 → 95%)
349
+ progress('Verifying', 75);
350
+ await this.verify(hexData, (pct) => {
351
+ progress('Verifying', 75 + pct * 0.20);
352
+ });
353
+ // 8 ── Reset device — run new firmware
354
+ progress('Exiting programming mode', 95);
355
+ await this.leaveProgMode();
356
+ progress('Complete', 100);
357
+ }
358
+ }
359
+ //# sourceMappingURL=programmer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programmer.js","sourceRoot":"","sources":["../../../src/protocol/updi/programmer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { Board, STK500Options, BootloadProgressCallback } from './core/types.js';
2
+ import type { ISTKTransport } from './transport/ITransport.js';
3
+ export declare class STK500 {
4
+ private readonly transport;
5
+ private readonly board;
6
+ private readonly log;
7
+ private readonly syncAttempts;
8
+ private readonly retryDelayMs;
9
+ constructor(transport: ISTKTransport, board: Board, opts?: STK500Options);
10
+ /**
11
+ * Toggle DTR or RTS to force the Arduino into bootloader mode.
12
+ * Skipped automatically when board.resetMethod === 'none' or when
13
+ * the transport does not implement setSignals().
14
+ */
15
+ resetDevice(): Promise<void>;
16
+ /**
17
+ * Send GET_SYNC up to `attempts` times.
18
+ * Throws STK500SyncError if all attempts fail.
19
+ */
20
+ sync(attempts: number): Promise<Uint8Array>;
21
+ /**
22
+ * Read the device signature and verify it matches board.signature.
23
+ * Throws STK500SignatureMismatchError when wrong board type is selected.
24
+ */
25
+ verifySignature(): Promise<Uint8Array>;
26
+ /**
27
+ * Read the raw device signature without matching against a board.
28
+ * Useful for auto-detecting the board type.
29
+ */
30
+ getSignature(): Promise<Uint8Array>;
31
+ /**
32
+ * Send SET_DEVICE with full 20-parameter configuration.
33
+ * Merges board defaults with any override values passed in `options`.
34
+ * Previously sent only 2 of the required 20 parameters — now complete.
35
+ */
36
+ setOptions(options?: Partial<Record<string, number>>): Promise<void>;
37
+ enterProgrammingMode(): Promise<Uint8Array>;
38
+ exitProgrammingMode(): Promise<Uint8Array>;
39
+ /** Erase the entire flash. Must be called before programming. */
40
+ chipErase(): Promise<void>;
41
+ loadAddress(useaddr: number): Promise<Uint8Array>;
42
+ loadPage(writeBytes: Uint8Array): Promise<Uint8Array>;
43
+ /**
44
+ * Read one page from device flash.
45
+ * Returns only the data bytes (INSYNC/OK framing stripped).
46
+ */
47
+ readPage(wordAddr: number, size: number): Promise<Uint8Array>;
48
+ /**
49
+ * Issue a raw 4-byte SPI command via the STK500v1 UNIVERSAL command (0x56).
50
+ * Returns the 4th byte of the SPI response, which is the data byte.
51
+ *
52
+ * Example: await stk.universalSpi([0x50, 0x00, 0x00, 0x00]) → low fuse byte
53
+ */
54
+ universalSpi(spiCmd: [number, number, number, number]): Promise<number>;
55
+ /**
56
+ * Read all fuse bytes via SPI UNIVERSAL commands.
57
+ * Returns { low, high, ext, lock } fuse values.
58
+ */
59
+ readFuses(): Promise<{
60
+ low: number;
61
+ high: number;
62
+ ext: number;
63
+ lock: number;
64
+ }>;
65
+ /**
66
+ * Write fuse bytes via SPI UNIVERSAL commands.
67
+ * @param fuse Which fuse to write: 'low' | 'high' | 'ext' | 'lock'
68
+ * @param val New fuse value
69
+ */
70
+ writeFuse(fuse: 'low' | 'high' | 'ext' | 'lock', val: number): Promise<void>;
71
+ /**
72
+ * Write one EEPROM page.
73
+ * @param byteAddr Byte address in EEPROM (NOT word address)
74
+ * @param data Data to write (length ≤ board.pageSize)
75
+ */
76
+ writeEepromPage(byteAddr: number, data: Uint8Array): Promise<void>;
77
+ /**
78
+ * Read one EEPROM page.
79
+ * @param byteAddr Byte address in EEPROM
80
+ * @param size Number of bytes to read
81
+ */
82
+ readEepromPage(byteAddr: number, size: number): Promise<Uint8Array>;
83
+ upload(hexData: string | Uint8Array, progressCallback?: (percentage: number) => void): Promise<void>;
84
+ /**
85
+ * Read back flash and compare byte-by-byte against the HEX source.
86
+ *
87
+ * Fixed vs original: the original sent READ_PAGE but discarded the response,
88
+ * making verify() a no-op. This version actually reads and compares.
89
+ */
90
+ verify(hexData: string | Uint8Array, progressCallback?: (percentage: number) => void): Promise<void>;
91
+ /**
92
+ * Complete programming sequence:
93
+ * reset → sync → verify signature → configure device →
94
+ * enter prog mode → erase chip → upload → verify → exit prog mode
95
+ *
96
+ * @param hexData Intel HEX string or binary
97
+ * @param progressCallback Called with (status, 0–100) at each stage
98
+ */
99
+ bootload(hexData: string | Uint8Array, progressCallback?: BootloadProgressCallback): Promise<void>;
100
+ }
101
+ //# sourceMappingURL=stk500.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stk500.d.ts","sourceRoot":"","sources":["../src/stk500.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,wBAAwB,EAEzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAQ/D,qBAAa,MAAM;IAMf,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EAC7B,IAAI,GAAE,aAAkB;IAqB1B;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BlC;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BjD;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC;IAwB5C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAczC;;;;OAIG;IACG,UAAU,CAAC,OAAO,GAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCxE,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC;IAS3C,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC;IAWhD,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAY1B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQjD,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAwB3D;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoBnE;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS7E;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAUpF;;;;OAIG;IACG,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlF;;;;OAIG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxE;;;;OAIG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoBnE,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9C,OAAO,CAAC,IAAI,CAAC;IA+BhB;;;;;OAKG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9C,OAAO,CAAC,IAAI,CAAC;IA6BhB;;;;;;;OAOG;IACG,QAAQ,CACZ,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,wBAAwB,GAC1C,OAAO,CAAC,IAAI,CAAC;CAiDjB"}