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,324 @@
1
+ // AVR109 / Caterina programmer.
2
+ // Used by Arduino Leonardo, Micro, SparkFun Pro Micro, Esplora, LilyPad USB.
3
+ //
4
+ // The AVR109 protocol (also called "butterfly" or "Caterina" protocol) uses
5
+ // single-byte ASCII commands — completely different from STK500v1/v2.
6
+ //
7
+ // Entry: the board must already be in bootloader mode.
8
+ // - For CDC USB boards (Leonardo/Micro): perform 1200-baud touch reset first,
9
+ // wait for re-enumeration, then open the new port and construct this class.
10
+ // - For serial-only boards: DTR/RTS toggle is sufficient.
11
+ //
12
+ // Reference: Atmel Application Note AVR109 (doc2541)
13
+ import { STK500ProtocolError, STK500TimeoutError, STK500SyncError, STK500SignatureMismatchError, STK500VerifyError, STK500InvalidHexError, } from '../../core/errors.js';
14
+ import { parseIntelHex } from '../hexParser.js';
15
+ function sleep(ms) {
16
+ return new Promise((r) => setTimeout(r, ms));
17
+ }
18
+ /** Receive exactly `count` bytes, or reject with STK500TimeoutError */
19
+ function receiveBytes(transport, count, timeoutMs) {
20
+ return new Promise((resolve, reject) => {
21
+ let settled = false;
22
+ const chunks = [];
23
+ let total = 0;
24
+ const timer = setTimeout(() => {
25
+ if (settled)
26
+ return;
27
+ settled = true;
28
+ transport.off('data', onData);
29
+ reject(new STK500TimeoutError(timeoutMs, 'AVR109 response'));
30
+ }, timeoutMs);
31
+ const finish = (err, data) => {
32
+ if (settled)
33
+ return;
34
+ settled = true;
35
+ clearTimeout(timer);
36
+ transport.off('data', onData);
37
+ if (err)
38
+ reject(err);
39
+ else
40
+ resolve(data);
41
+ };
42
+ const onData = (chunk) => {
43
+ if (settled)
44
+ return;
45
+ chunks.push(chunk.slice());
46
+ total += chunk.length;
47
+ if (total >= count) {
48
+ const buf = new Uint8Array(total);
49
+ let off = 0;
50
+ for (const c of chunks) {
51
+ buf.set(c, off);
52
+ off += c.length;
53
+ }
54
+ finish(undefined, buf.subarray(0, count));
55
+ }
56
+ };
57
+ transport.on('data', onData);
58
+ });
59
+ }
60
+ // CR (0x0D) is the acknowledge byte for most AVR109 commands
61
+ const CR = 0x0D;
62
+ export class AVR109 {
63
+ constructor(transport, board, opts = {}) {
64
+ this.transport = transport;
65
+ this.board = board;
66
+ if (opts.quiet) {
67
+ this.log = () => { };
68
+ }
69
+ else if (opts.logger) {
70
+ this.log = opts.logger;
71
+ }
72
+ else {
73
+ this.log = (level, msg) => {
74
+ /* istanbul ignore next */
75
+ if (typeof console !== 'undefined') {
76
+ console.log(`[avr109] [${level}] ${msg}`);
77
+ }
78
+ };
79
+ }
80
+ }
81
+ // ── Low-level helpers ──────────────────────────────────────────────────────
82
+ async write(bytes) {
83
+ await this.transport.write(new Uint8Array(bytes));
84
+ }
85
+ /** Send command bytes and assert the response is CR (0x0D) */
86
+ async writeCR(bytes) {
87
+ await this.write(bytes);
88
+ const resp = await receiveBytes(this.transport, 1, this.board.timeout);
89
+ if (resp[0] !== CR) {
90
+ throw new STK500ProtocolError(`AVR109: expected CR (0x0D), ` +
91
+ `got 0x${resp[0].toString(16).padStart(2, '0')}`);
92
+ }
93
+ }
94
+ // ── Identification ─────────────────────────────────────────────────────────
95
+ /**
96
+ * Read the software identifier (7 bytes, e.g. "CATERIN" for Caterina).
97
+ * Useful for probing whether the bootloader is running.
98
+ */
99
+ async getSoftwareId() {
100
+ this.log('debug', 'getSoftwareId');
101
+ await this.write([0x53]); // 'S'
102
+ const bytes = await receiveBytes(this.transport, 7, this.board.timeout);
103
+ return String.fromCharCode(...bytes);
104
+ }
105
+ /** Attempt to get the software ID, retry up to `attempts` times */
106
+ async sync(attempts) {
107
+ this.log('debug', `sync (max ${attempts} attempts)`);
108
+ for (let i = 1; i <= attempts; i++) {
109
+ try {
110
+ const id = await this.getSoftwareId();
111
+ this.log('debug', `sync OK on attempt ${i}: "${id}"`);
112
+ return;
113
+ }
114
+ catch (err) {
115
+ this.log('debug', `sync attempt ${i}/${attempts} failed: ` +
116
+ `${err instanceof Error ? err.message : String(err)}`);
117
+ if (i < attempts)
118
+ await sleep(200);
119
+ }
120
+ }
121
+ throw new STK500SyncError(attempts);
122
+ }
123
+ // ── Signature ──────────────────────────────────────────────────────────────
124
+ /**
125
+ * Read 3-byte device signature (MSB first).
126
+ * Caterina returns: [sig_byte_2, sig_byte_1, sig_byte_0]
127
+ */
128
+ async getSignature() {
129
+ this.log('debug', 'getSignature');
130
+ await this.write([0x73]); // 's'
131
+ const raw = await receiveBytes(this.transport, 3, this.board.timeout);
132
+ // AVR109 returns signature MSB first; reverse to match board.signature order
133
+ return new Uint8Array([raw[2], raw[1], raw[0]]);
134
+ }
135
+ async verifySignature() {
136
+ const actual = await this.getSignature();
137
+ const expected = this.board.signature;
138
+ if (!actual.every((b, i) => b === expected[i])) {
139
+ throw new STK500SignatureMismatchError(expected, actual);
140
+ }
141
+ const fmt = (b) => Array.from(b).map((x) => `0x${x.toString(16).padStart(2, '0')}`).join(', ');
142
+ this.log('info', `signature verified: [${fmt(actual)}]`);
143
+ }
144
+ // ── Programming mode ───────────────────────────────────────────────────────
145
+ async enterProgMode() {
146
+ this.log('debug', 'enterProgMode');
147
+ await this.writeCR([0x50]); // 'P'
148
+ }
149
+ async leaveProgMode() {
150
+ this.log('debug', 'leaveProgMode');
151
+ await this.writeCR([0x45]); // 'E'
152
+ }
153
+ // ── Erase ──────────────────────────────────────────────────────────────────
154
+ async chipErase() {
155
+ this.log('info', 'chipErase');
156
+ await this.writeCR([0x65]); // 'e'
157
+ }
158
+ // ── Address ────────────────────────────────────────────────────────────────
159
+ /**
160
+ * Set the current word address (auto-increment applies to subsequent reads/writes).
161
+ * @param wordAddr Flash word address (= byte_address / 2)
162
+ */
163
+ async setAddress(wordAddr) {
164
+ await this.writeCR([
165
+ 0x41, // 'A'
166
+ (wordAddr >> 8) & 0xFF,
167
+ wordAddr & 0xFF,
168
+ ]);
169
+ }
170
+ // ── Block write / read ─────────────────────────────────────────────────────
171
+ /**
172
+ * Write a block to flash ('F') or EEPROM ('E').
173
+ * @param memType 'F' for flash, 'E' for EEPROM
174
+ * @param data Block data (size ≤ board.pageSize)
175
+ */
176
+ async writeBlock(memType, data) {
177
+ const size = data.length;
178
+ const body = new Uint8Array(4 + size);
179
+ body[0] = 0x42; // 'B'
180
+ body[1] = (size >> 8) & 0xFF;
181
+ body[2] = size & 0xFF;
182
+ body[3] = memType === 'F' ? 0x46 : 0x45; // 'F' or 'E'
183
+ body.set(data, 4);
184
+ await this.transport.write(body);
185
+ const resp = await receiveBytes(this.transport, 1, this.board.timeout);
186
+ if (resp[0] !== CR) {
187
+ throw new STK500ProtocolError(`AVR109: block write failed — ` +
188
+ `got 0x${resp[0].toString(16).padStart(2, '0')}`);
189
+ }
190
+ }
191
+ /**
192
+ * Read a block from flash ('F') or EEPROM ('E').
193
+ * Address must be set with setAddress() first.
194
+ * @param memType 'F' for flash, 'E' for EEPROM
195
+ * @param size Number of bytes to read
196
+ */
197
+ async readBlock(memType, size) {
198
+ await this.write([
199
+ 0x67, // 'g'
200
+ (size >> 8) & 0xFF,
201
+ size & 0xFF,
202
+ memType === 'F' ? 0x46 : 0x45,
203
+ ]);
204
+ return receiveBytes(this.transport, size, this.board.timeout);
205
+ }
206
+ // ── Fuse read (Phase C) ────────────────────────────────────────────────────
207
+ /**
208
+ * Read the low fuse byte.
209
+ * Caterina command: 'F' (0x46) → 1 byte response
210
+ */
211
+ async readLowFuse() {
212
+ await this.write([0x46]); // 'F'
213
+ const resp = await receiveBytes(this.transport, 1, this.board.timeout);
214
+ return resp[0];
215
+ }
216
+ /**
217
+ * Read the high fuse byte.
218
+ * Caterina command: 'N' (0x4E) → 1 byte response
219
+ */
220
+ async readHighFuse() {
221
+ await this.write([0x4E]); // 'N'
222
+ const resp = await receiveBytes(this.transport, 1, this.board.timeout);
223
+ return resp[0];
224
+ }
225
+ /**
226
+ * Read the lock bits.
227
+ * Caterina command: 'r' (0x72) → 1 byte response
228
+ */
229
+ async readLockBits() {
230
+ await this.write([0x72]); // 'r'
231
+ const resp = await receiveBytes(this.transport, 1, this.board.timeout);
232
+ return resp[0];
233
+ }
234
+ /**
235
+ * Read available fuse bytes: low, high, and lock bits.
236
+ * Extended fuse is not accessible via AVR109.
237
+ */
238
+ async readFuses() {
239
+ const low = await this.readLowFuse();
240
+ const high = await this.readHighFuse();
241
+ const lock = await this.readLockBits();
242
+ this.log('info', `fuses: low=0x${low.toString(16)} high=0x${high.toString(16)} lock=0x${lock.toString(16)}`);
243
+ return { low, high, lock };
244
+ }
245
+ // ── Upload / Verify ────────────────────────────────────────────────────────
246
+ async upload(hexData, progressCallback) {
247
+ const { data: hex, byteCount } = parseIntelHex(hexData);
248
+ this.log('info', `upload: ${byteCount} bytes`);
249
+ // Phase G: HEX size validation
250
+ if (this.board.flashSize && byteCount > this.board.flashSize) {
251
+ throw new STK500InvalidHexError(`HEX too large: ${byteCount} bytes exceeds flash size ${this.board.flashSize} bytes`);
252
+ }
253
+ const blockSize = this.board.pageSize; // 128 for ATmega32U4
254
+ let pageaddr = 0;
255
+ while (pageaddr < hex.length) {
256
+ const wordAddr = pageaddr >> 1;
257
+ const chunkSize = Math.min(blockSize, hex.length - pageaddr);
258
+ const chunk = hex.subarray(pageaddr, pageaddr + chunkSize);
259
+ await this.setAddress(wordAddr);
260
+ await this.writeBlock('F', chunk);
261
+ pageaddr += chunkSize;
262
+ progressCallback?.((pageaddr / hex.length) * 100);
263
+ }
264
+ this.log('info', 'upload complete');
265
+ }
266
+ async verify(hexData, progressCallback) {
267
+ const { data: hex, byteCount } = parseIntelHex(hexData);
268
+ this.log('info', `verify: checking ${byteCount} bytes`);
269
+ const blockSize = this.board.pageSize;
270
+ let pageaddr = 0;
271
+ while (pageaddr < hex.length) {
272
+ const wordAddr = pageaddr >> 1;
273
+ const chunkSize = Math.min(blockSize, hex.length - pageaddr);
274
+ const expected = hex.subarray(pageaddr, pageaddr + chunkSize);
275
+ await this.setAddress(wordAddr);
276
+ const actual = await this.readBlock('F', chunkSize);
277
+ for (let i = 0; i < chunkSize; i++) {
278
+ if (actual[i] !== expected[i]) {
279
+ throw new STK500VerifyError(pageaddr + i, expected[i], actual[i]);
280
+ }
281
+ }
282
+ pageaddr += chunkSize;
283
+ progressCallback?.((pageaddr / hex.length) * 100);
284
+ }
285
+ this.log('info', 'verify OK');
286
+ }
287
+ // ── Quit ───────────────────────────────────────────────────────────────────
288
+ /**
289
+ * Exit the bootloader — device resets and runs the new firmware.
290
+ * No response is expected; device immediately resets on receiving 'Q'.
291
+ */
292
+ async quit() {
293
+ this.log('debug', 'quit');
294
+ await this.transport.write(new Uint8Array([0x51])); // 'Q'
295
+ await sleep(200); // give the device a moment to reset
296
+ }
297
+ // ── bootload (main entry point) ────────────────────────────────────────────
298
+ async bootload(hexData, progressCallback) {
299
+ const progress = (status, pct) => {
300
+ this.log('info', `${status} (${Math.round(pct)}%)`);
301
+ progressCallback?.(status, pct);
302
+ };
303
+ // Note: CDC touch reset must be done BEFORE constructing this object.
304
+ // See CDCResetHelper for browser WebSerial usage.
305
+ progress('Entering programming mode', 5);
306
+ await this.enterProgMode();
307
+ progress('Verifying signature', 10);
308
+ await this.verifySignature();
309
+ progress('Erasing chip', 20);
310
+ await this.chipErase();
311
+ progress('Uploading', 25);
312
+ await this.upload(hexData, (pct) => {
313
+ progress('Uploading', 25 + pct * 0.50);
314
+ });
315
+ progress('Verifying', 75);
316
+ await this.verify(hexData, (pct) => {
317
+ progress('Verifying', 75 + pct * 0.20);
318
+ });
319
+ progress('Exiting programming mode', 95);
320
+ await this.leaveProgMode();
321
+ progress('Complete', 100);
322
+ }
323
+ }
324
+ //# sourceMappingURL=programmer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programmer.js","sourceRoot":"","sources":["../../../src/protocol/avr109/programmer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ParseResult {
2
+ /** Binary payload ready for upload */
3
+ data: Uint8Array;
4
+ /** CS:IP value from record type 3 (null if not present) */
5
+ startSegmentAddress: number | null;
6
+ /** EIP value from record type 5 (null if not present) */
7
+ startLinearAddress: number | null;
8
+ /** Total number of data bytes parsed */
9
+ byteCount: number;
10
+ }
11
+ export declare function parseIntelHex(rawData: string | Uint8Array, addressOffset?: number): ParseResult;
12
+ //# sourceMappingURL=hexParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexParser.d.ts","sourceRoot":"","sources":["../../src/protocol/hexParser.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,2DAA2D;IAC3D,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,yDAAyD;IACzD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,aAAa,SAAI,GAChB,WAAW,CAiKb"}
@@ -0,0 +1,133 @@
1
+ // Intel HEX parser — ported from https://github.com/bminer/intel-hex.js
2
+ // Rewrites and fixes:
3
+ // 1. REMOVED premature return when bufLength >= bufferSize (was 8192 bytes —
4
+ // Arduino Uno .hex files are routinely 20-32 KB, causing silent truncation)
5
+ // 2. Buffer grows dynamically without fixed upper limit
6
+ // 3. Gap regions filled with 0xFF (unprogrammed flash default)
7
+ // 4. Throws typed STK500InvalidHexError instead of generic Error
8
+ // 5. Returns byteCount for progress calculation
9
+ import { STK500InvalidHexError } from '../core/errors.js';
10
+ const DATA = 0;
11
+ const END_OF_FILE = 1;
12
+ const EXT_SEGMENT_ADDR = 2;
13
+ const START_SEGMENT_ADDR = 3;
14
+ const EXT_LINEAR_ADDR = 4;
15
+ const START_LINEAR_ADDR = 5;
16
+ const UNPROGRAMMED = 0xff; // Default flash value for gap regions
17
+ export function parseIntelHex(rawData, addressOffset = 0) {
18
+ const data = rawData instanceof Uint8Array
19
+ ? new TextDecoder().decode(rawData)
20
+ : rawData;
21
+ // Start with 8 KB — grows as needed, no fixed ceiling
22
+ let buf = new Uint8Array(8192);
23
+ buf.fill(UNPROGRAMMED);
24
+ let bufLength = 0;
25
+ let highAddress = 0;
26
+ let startSegmentAddress = null;
27
+ let startLinearAddress = null;
28
+ let lineNum = 0;
29
+ let pos = 0;
30
+ // Minimum valid line: ':LLAAAATTCC' = 11 chars
31
+ const MIN_LINE = 11;
32
+ while (pos + MIN_LINE <= data.length) {
33
+ // Each record starts with ':'
34
+ if (data[pos++] !== ':') {
35
+ throw new STK500InvalidHexError(`Line ${lineNum + 1} does not start with a colon (:) — got '${data[pos - 1]}'`, lineNum + 1);
36
+ }
37
+ lineNum++;
38
+ // Parse fixed header fields
39
+ const dataLength = parseInt(data.slice(pos, pos + 2), 16);
40
+ pos += 2;
41
+ const lowAddress = parseInt(data.slice(pos, pos + 4), 16);
42
+ pos += 4;
43
+ const recordType = parseInt(data.slice(pos, pos + 2), 16);
44
+ pos += 2;
45
+ // Parse data field
46
+ const dataField = data.slice(pos, pos + dataLength * 2);
47
+ pos += dataLength * 2;
48
+ const checksum = parseInt(data.slice(pos, pos + 2), 16);
49
+ pos += 2;
50
+ const dataBytes = new Uint8Array(dataLength);
51
+ for (let i = 0; i < dataLength; i++) {
52
+ dataBytes[i] = parseInt(dataField.slice(i * 2, i * 2 + 2), 16);
53
+ }
54
+ // Verify checksum (two's complement of sum of all preceding bytes)
55
+ let calcCS = (dataLength + ((lowAddress >> 8) & 0xff) + (lowAddress & 0xff) + recordType) & 0xff;
56
+ for (let i = 0; i < dataLength; i++) {
57
+ calcCS = (calcCS + dataBytes[i]) & 0xff;
58
+ }
59
+ calcCS = (0x100 - calcCS) & 0xff;
60
+ if (checksum !== calcCS) {
61
+ throw new STK500InvalidHexError(`Checksum error on line ${lineNum}: ` +
62
+ `got 0x${checksum.toString(16).padStart(2, '0')}, ` +
63
+ `expected 0x${calcCS.toString(16).padStart(2, '0')}`, lineNum);
64
+ }
65
+ switch (recordType) {
66
+ case DATA: {
67
+ const absAddr = highAddress + lowAddress - addressOffset;
68
+ if (absAddr < 0) {
69
+ throw new STK500InvalidHexError(`Negative address on line ${lineNum} after applying offset ${addressOffset}`, lineNum);
70
+ }
71
+ const endAddr = absAddr + dataLength;
72
+ // Grow buffer if this record falls beyond current allocation
73
+ if (endAddr > buf.length) {
74
+ const newSize = Math.max(endAddr * 2, buf.length * 2);
75
+ const grown = new Uint8Array(newSize);
76
+ grown.fill(UNPROGRAMMED);
77
+ grown.set(buf.subarray(0, bufLength));
78
+ buf = grown;
79
+ }
80
+ // Fill any address gap with 0xFF (unprogrammed flash)
81
+ if (absAddr > bufLength) {
82
+ buf.fill(UNPROGRAMMED, bufLength, absAddr);
83
+ }
84
+ buf.set(dataBytes, absAddr);
85
+ bufLength = Math.max(bufLength, endAddr);
86
+ break;
87
+ }
88
+ case END_OF_FILE:
89
+ if (dataLength !== 0) {
90
+ throw new STK500InvalidHexError(`EOF record must have 0 data bytes, got ${dataLength} on line ${lineNum}`, lineNum);
91
+ }
92
+ return {
93
+ data: buf.subarray(0, bufLength),
94
+ startSegmentAddress,
95
+ startLinearAddress,
96
+ byteCount: bufLength,
97
+ };
98
+ case EXT_SEGMENT_ADDR:
99
+ if (dataLength !== 2 || lowAddress !== 0) {
100
+ throw new STK500InvalidHexError(`Invalid extended segment address record on line ${lineNum}`, lineNum);
101
+ }
102
+ highAddress = parseInt(dataField, 16) << 4;
103
+ break;
104
+ case START_SEGMENT_ADDR:
105
+ if (dataLength !== 4 || lowAddress !== 0) {
106
+ throw new STK500InvalidHexError(`Invalid start segment address record on line ${lineNum}`, lineNum);
107
+ }
108
+ startSegmentAddress = parseInt(dataField, 16);
109
+ break;
110
+ case EXT_LINEAR_ADDR:
111
+ if (dataLength !== 2 || lowAddress !== 0) {
112
+ throw new STK500InvalidHexError(`Invalid extended linear address record on line ${lineNum}`, lineNum);
113
+ }
114
+ highAddress = parseInt(dataField, 16) << 16;
115
+ break;
116
+ case START_LINEAR_ADDR:
117
+ if (dataLength !== 4 || lowAddress !== 0) {
118
+ throw new STK500InvalidHexError(`Invalid start linear address record on line ${lineNum}`, lineNum);
119
+ }
120
+ startLinearAddress = parseInt(dataField, 16);
121
+ break;
122
+ default:
123
+ throw new STK500InvalidHexError(`Unknown record type 0x${recordType.toString(16).padStart(2, '0')} on line ${lineNum}`, lineNum);
124
+ }
125
+ // Skip CRLF or LF line endings
126
+ if (data[pos] === '\r')
127
+ pos++;
128
+ if (data[pos] === '\n')
129
+ pos++;
130
+ }
131
+ throw new STK500InvalidHexError('Unexpected end of HEX data — missing EOF record (:00000001FF)');
132
+ }
133
+ //# sourceMappingURL=hexParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexParser.js","sourceRoot":"","sources":["../../src/protocol/hexParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /** Raspberry Pi USB Vendor ID */
2
+ export declare const PICOBOOT_VID = 11914;
3
+ /** RP2040 USBBOOT Product ID (BOOTSEL mode) */
4
+ export declare const PICOBOOT_PID_RP2040 = 3;
5
+ /** RP2350 USBBOOT Product ID (BOOTSEL mode) */
6
+ export declare const PICOBOOT_PID_RP2350 = 15;
7
+ /** PICOBOOT interface index (interface 1) */
8
+ export declare const PICOBOOT_INTERFACE = 1;
9
+ /** Magic number at offset 0 of every PICOBOOT command packet (little-endian) */
10
+ export declare const PICOBOOT_MAGIC = 1126158603;
11
+ /** Size of a PICOBOOT command packet in bytes */
12
+ export declare const PICOBOOT_CMD_SIZE = 32;
13
+ /** Size of the PICOBOOT status response in bytes */
14
+ export declare const PICOBOOT_STATUS_SIZE = 16;
15
+ export declare const PicobootCmd: {
16
+ readonly EXCLUSIVE_ACCESS: 1;
17
+ readonly REBOOT: 2;
18
+ readonly FLASH_ERASE: 3;
19
+ readonly READ: 132;
20
+ readonly WRITE: 5;
21
+ readonly EXIT_XIP: 6;
22
+ readonly ENTER_CMD_XIP: 7;
23
+ readonly EXEC: 8;
24
+ readonly VECTORIZE_FLASH: 9;
25
+ };
26
+ export declare const PicobootStatus: {
27
+ readonly OK: 0;
28
+ readonly UNKNOWN_CMD: 1;
29
+ readonly BAD_CHECKSUM: 2;
30
+ readonly NOT_PERMITTED: 3;
31
+ readonly INVALID_ADDRESS: 4;
32
+ readonly BAD_ALIGNMENT: 5;
33
+ readonly INTERLEAVED: 6;
34
+ readonly REBOOTING: 7;
35
+ readonly UNKNOWN: 8;
36
+ readonly INVALID_STATE: 9;
37
+ };
38
+ /** Minimum erase granularity — address and size must be 4KB-aligned */
39
+ export declare const FLASH_SECTOR_SIZE = 4096;
40
+ /** Flash page write size — address and size must be 256-byte-aligned */
41
+ export declare const FLASH_PAGE_SIZE = 256;
42
+ /** XIP base address in CPU address space (flash starts here for the CPU) */
43
+ export declare const RP2040_FLASH_BASE = 268435456;
44
+ /**
45
+ * PICOBOOT uses offset-0 addressing for flash.
46
+ * To write to XIP address 0x10001000, pass addr = 0x00001000.
47
+ * Use this mask to convert: picobootAddr = xipAddr & ~RP2040_FLASH_BASE
48
+ */
49
+ export declare const RP2040_FLASH_ADDR_MASK = 268435455;
50
+ export declare const UF2_MAGIC_START0 = 171066965;
51
+ export declare const UF2_MAGIC_START1 = 2656915799;
52
+ export declare const UF2_MAGIC_END = 179400496;
53
+ /** UF2 flag: familyID field is valid (must be set for RP2040/RP2350) */
54
+ export declare const UF2_FLAG_FAMILY_ID = 8192;
55
+ /** UF2 flag: block should not be flashed (skip when flashing) */
56
+ export declare const UF2_FLAG_NOT_MAIN = 1;
57
+ /** Total size of one UF2 block (bytes) */
58
+ export declare const UF2_BLOCK_SIZE = 512;
59
+ /** Usable payload bytes per UF2 block */
60
+ export declare const UF2_PAYLOAD_SIZE = 256;
61
+ export declare const UF2_FAMILY_RP2040 = 3834380118;
62
+ export declare const UF2_FAMILY_RP2350_ARM = 3834380121;
63
+ export declare const UF2_FAMILY_RP2350_RISCV = 3834380122;
64
+ export declare const UF2_FAMILY_RP2350_ARM_NS = 3834380123;
65
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/protocol/picoboot/constants.ts"],"names":[],"mappings":"AAMA,iCAAiC;AACjC,eAAO,MAAM,YAAY,QAAS,CAAC;AACnC,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,IAAS,CAAC;AAC1C,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,KAAS,CAAC;AAM1C,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAIpC,gFAAgF;AAChF,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAC;AAIX,eAAO,MAAM,cAAc;;;;;;;;;;;CAWjB,CAAC;AAIX,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,wEAAwE;AACxE,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,YAAa,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,YAAa,CAAC;AAKjD,eAAO,MAAM,gBAAgB,YAAe,CAAC;AAC7C,eAAO,MAAM,gBAAgB,aAAe,CAAC;AAC7C,eAAO,MAAM,aAAa,YAAkB,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,OAAa,CAAC;AAC7C,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,IAAc,CAAC;AAE7C,0CAA0C;AAC1C,eAAO,MAAM,cAAc,MAAU,CAAC;AACtC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,MAAQ,CAAC;AAItC,eAAO,MAAM,iBAAiB,aAAmB,CAAC;AAClD,eAAO,MAAM,qBAAqB,aAAe,CAAC;AAClD,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,wBAAwB,aAAa,CAAC"}