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,130 @@
1
+ // UPDI (Unified Program and Debug Interface) protocol constants.
2
+ // Covers tinyAVR 0/1/2 series, megaAVR 0 series (ATmega4809).
3
+ // Reference: AVR® DA/DB Device Series Datasheet (Microchip Technology)
4
+ // Atmel ATtiny1614/16/17 datasheet — UPDI chapter
5
+ // ── Physical layer ───────────────────────────────────────────────────────────
6
+ /** UPDI synchronisation byte — sent before every instruction */
7
+ export const UPDI_SYNC = 0x55;
8
+ /** ACK byte returned by device for write operations */
9
+ export const UPDI_ACK = 0x40;
10
+ // ── Instruction opcodes (bits 7:5) ────────────────────────────────────────────
11
+ /** LDS — Load from Data Space (followed by address + returns data) */
12
+ export const UPDI_LDS = 0x00;
13
+ /** STS — Store to Data Space (followed by address + data) */
14
+ export const UPDI_STS = 0x40;
15
+ /** LD — Load indirect (uses pointer register) */
16
+ export const UPDI_LD = 0x20;
17
+ /** ST — Store indirect (uses pointer register) */
18
+ export const UPDI_ST = 0x60;
19
+ /** LDCS — Load from Control/Status Space */
20
+ export const UPDI_LDCS = 0x80;
21
+ /** STCS — Store to Control/Status Space */
22
+ export const UPDI_STCS = 0xC0;
23
+ /** REPEAT — Repeat the next instruction N+1 times */
24
+ export const UPDI_REPEAT = 0xA0;
25
+ /** KEY — Key broadcast (8 or 16 bytes) */
26
+ export const UPDI_KEY = 0xE0;
27
+ // ── Address/data size operands ────────────────────────────────────────────────
28
+ /** Address operand: 1-byte address */
29
+ export const UPDI_ADDRESS_8 = 0;
30
+ /** Address operand: 2-byte address (default for all AVR NVM access) */
31
+ export const UPDI_ADDRESS_16 = 1;
32
+ /** Address operand: 3-byte address (AVR DA/DB extended addressing) */
33
+ export const UPDI_ADDRESS_24 = 2;
34
+ /** Data operand: 1-byte data */
35
+ export const UPDI_DATA_8 = 0;
36
+ /** Data operand: 2-byte data */
37
+ export const UPDI_DATA_16 = 1;
38
+ // ── Pointer modes (bits 4:2 for LD/ST instructions) ──────────────────────────
39
+ /** Pointer mode: access *(ptr) */
40
+ export const UPDI_PTR = 0;
41
+ /** Pointer mode: access *(ptr++) — post-increment */
42
+ export const UPDI_PTR_INC = 1;
43
+ /** Pointer mode: access *(--ptr) — pre-decrement */
44
+ export const UPDI_PTR_DEC = 2;
45
+ // ── Key sizes (bits 1:0 of KEY instruction) ──────────────────────────────────
46
+ /** 8-byte (64-bit) key */
47
+ export const UPDI_KEY_SIZE_64 = 0;
48
+ /** 16-byte (128-bit) key */
49
+ export const UPDI_KEY_SIZE_128 = 1;
50
+ // ── Control/Status register addresses ────────────────────────────────────────
51
+ export const UPDI_CS_STATUSA = 0x00;
52
+ export const UPDI_CS_STATUSB = 0x01;
53
+ export const UPDI_CS_CTRLA = 0x02;
54
+ export const UPDI_CS_CTRLB = 0x03;
55
+ /** ASI_KEY_STATUS — shows which key is currently active */
56
+ export const UPDI_CS_ASI_KEY_STATUS = 0x07;
57
+ /** ASI_RESET_REQ — write 0x59 to assert reset, 0x00 to deassert */
58
+ export const UPDI_CS_ASI_RESET_REQ = 0x08;
59
+ export const UPDI_CS_ASI_CTRL_A = 0x09;
60
+ export const UPDI_CS_ASI_SYS_CTRLA = 0x0A;
61
+ /** ASI_SYS_STATUS — NVMPROG / LOCKSTATUS / UROWPROG bits */
62
+ export const UPDI_CS_ASI_SYS_STATUS = 0x0B;
63
+ // ── CTRLA bits ───────────────────────────────────────────────────────────────
64
+ /** Guard-time insertion delay (IBDLY) */
65
+ export const UPDI_CTRLA_IBDLY = 0x80;
66
+ /** Guard-time value: 2-cycle inter-byte delay (minimises wait between bytes) */
67
+ export const UPDI_CTRLA_GT_2 = 0x06;
68
+ // ── ASI_KEY_STATUS bits ───────────────────────────────────────────────────────
69
+ export const UPDI_KEY_CHIPERASE = 0x08;
70
+ export const UPDI_KEY_NVMPROG = 0x10;
71
+ export const UPDI_KEY_UROWWRITE = 0x20;
72
+ // ── ASI_SYS_STATUS bits ───────────────────────────────────────────────────────
73
+ export const UPDI_SYS_RSTSYS = 0x20;
74
+ export const UPDI_SYS_INSLEEP = 0x10;
75
+ export const UPDI_SYS_NVMPROG = 0x08;
76
+ export const UPDI_SYS_UROWPROG = 0x04;
77
+ export const UPDI_SYS_LOCKSTATUS = 0x01;
78
+ // ── Reset request byte ────────────────────────────────────────────────────────
79
+ export const UPDI_RESET_REQ_ASSERT = 0x59;
80
+ export const UPDI_RESET_REQ_DEASSERT = 0x00;
81
+ // ── NVM Controller (NVMv0 — tinyAVR 0/1/2, megaAVR 0) ───────────────────────
82
+ export const NVM_BASE = 0x1000;
83
+ export const NVM_CTRLA = 0x1000;
84
+ export const NVM_CTRLB = 0x1001;
85
+ export const NVM_STATUS = 0x1002;
86
+ export const NVM_INTCTRL = 0x1003;
87
+ export const NVM_INTFLAGS = 0x1004;
88
+ export const NVM_DATA = 0x1006;
89
+ export const NVM_ADDR = 0x1008; // 16-bit address register
90
+ // ── NVM status bits ───────────────────────────────────────────────────────────
91
+ /** Flash busy — poll until cleared after write/erase */
92
+ export const NVM_FBUSY = 0x01;
93
+ /** EEPROM busy */
94
+ export const NVM_EEBUSY = 0x02;
95
+ /** Write error */
96
+ export const NVM_WRERR = 0x04;
97
+ // ── NVM commands (write to NVM_CTRLA) ────────────────────────────────────────
98
+ export const NVM_CMD_NOP = 0x00; // No operation (clear previous command)
99
+ export const NVM_CMD_WP = 0x01; // Write page (from buffer)
100
+ export const NVM_CMD_ER = 0x02; // Erase page
101
+ export const NVM_CMD_ERWP = 0x03; // Erase and write page (most common for flash)
102
+ export const NVM_CMD_PBC = 0x04; // Page buffer clear
103
+ export const NVM_CMD_CHER = 0x05; // Chip erase (clears flash + EEPROM + fuses to reset values)
104
+ export const NVM_CMD_EEER = 0x06; // EEPROM only erase
105
+ export const NVM_CMD_WFU = 0x07; // Write fuse
106
+ // ── SIGROW (signature row) ────────────────────────────────────────────────────
107
+ /** Default SIGROW base address — contains 3-byte device ID at offset 0 */
108
+ export const SIGROW_BASE = 0x1100;
109
+ /** EEPROM base address (tinyAVR 0/1/2 and megaAVR 0) */
110
+ export const EEPROM_BASE = 0x1400;
111
+ /** Fuse register base (tinyAVR 0/1/2) */
112
+ export const FUSE_BASE = 0x1280;
113
+ /** Number of fuse registers */
114
+ export const FUSE_COUNT = 6;
115
+ // ── Authentication keys (8 bytes, LSB-first as sent on the wire) ─────────────
116
+ /**
117
+ * NVMProg key — grants access to NVM controller for flash/EEPROM/fuse writes.
118
+ * ASCII: "NVMProg " reversed to [0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E]
119
+ */
120
+ export const UPDI_KEY_NVM_PROG = new Uint8Array([
121
+ 0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E,
122
+ ]);
123
+ /**
124
+ * ChipErase key — grants a single chip erase operation even on a locked device.
125
+ * ASCII: "NVMErase" reversed
126
+ */
127
+ export const UPDI_KEY_CHIP_ERASE_REQ = new Uint8Array([
128
+ 0x65, 0x73, 0x61, 0x72, 0x45, 0x4D, 0x56, 0x4E,
129
+ ]);
130
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/protocol/updi/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { ISTKTransport } from '../../transport/ITransport.js';
2
+ import type { Board, Logger } from '../../core/types.js';
3
+ export declare class UPDILink {
4
+ private readonly transport;
5
+ private readonly board;
6
+ private readonly log;
7
+ constructor(transport: ISTKTransport, board: Board, log: Logger);
8
+ /**
9
+ * Write bytes and discard the echo (TX loopback).
10
+ * After this returns the transport's receive buffer contains only device
11
+ * responses, not echo bytes.
12
+ */
13
+ send(bytes: number[]): Promise<void>;
14
+ /**
15
+ * Receive exactly `count` bytes from the transport.
16
+ * Accumulates chunks until the total reaches `count`, then resolves.
17
+ * Rejects with STK500TimeoutError if the deadline expires.
18
+ */
19
+ receiveExact(count: number): Promise<Uint8Array>;
20
+ /**
21
+ * Read one byte from a UPDI Control/Status register.
22
+ * LDCS sequence: SYNC + (0x80 | addr) → echo 2 bytes → read 1 byte
23
+ */
24
+ ldcs(addr: number): Promise<number>;
25
+ /**
26
+ * Write one byte to a UPDI Control/Status register.
27
+ * STCS sequence: SYNC + (0xC0 | addr) + val → echo 3 bytes → read 1 ACK
28
+ */
29
+ stcs(addr: number, val: number): Promise<void>;
30
+ /**
31
+ * Read one byte from a 16-bit data-space address.
32
+ * LDS sequence: SYNC + 0x04 + addrL + addrH → echo 4 bytes → read 1 byte
33
+ */
34
+ lds(addr: number): Promise<number>;
35
+ /**
36
+ * Write one byte to a 16-bit data-space address.
37
+ * STS sequence:
38
+ * → SYNC + 0x44 + addrL + addrH → echo 4 bytes → read 1 ACK
39
+ * → val → echo 1 byte → read 1 ACK
40
+ */
41
+ sts(addr: number, val: number): Promise<void>;
42
+ /**
43
+ * Load a 16-bit address into the UPDI pointer register.
44
+ * ST(ptr, 16-bit) sequence: SYNC + 0x61 + addrL + addrH → echo 4 bytes → read 1 ACK
45
+ */
46
+ setPtr(addr: number): Promise<void>;
47
+ /**
48
+ * Write a block of bytes to memory using ST ptr++ (with optional REPEAT).
49
+ *
50
+ * For count > 1, a REPEAT instruction is sent first so the device auto-advances
51
+ * the pointer. Each byte requires: send byte → discard echo → read ACK.
52
+ */
53
+ stPtrInc(data: Uint8Array): Promise<void>;
54
+ /**
55
+ * Read a block of bytes using LD ptr++ (with optional REPEAT).
56
+ *
57
+ * For count > 1, a REPEAT is sent first. The device streams back `count`
58
+ * data bytes directly — no echoes for reads.
59
+ */
60
+ ldPtrInc(count: number): Promise<Uint8Array>;
61
+ /**
62
+ * Broadcast an 8-byte key to unlock NVM or chip-erase operations.
63
+ * KEY sequence: SYNC + 0xE0 + 8 key bytes → echo 10 bytes → no ACK
64
+ */
65
+ sendKey(key: Uint8Array): Promise<void>;
66
+ /**
67
+ * Configure guard time to minimum (2 cycles) for faster communication.
68
+ * Called once after establishing the link.
69
+ */
70
+ configureGuardTime(): Promise<void>;
71
+ /**
72
+ * Read a contiguous memory region.
73
+ * Internally uses setPtr + ldPtrInc.
74
+ */
75
+ readMemory(addr: number, size: number): Promise<Uint8Array>;
76
+ /**
77
+ * Write a contiguous memory region.
78
+ * Internally uses setPtr + stPtrInc.
79
+ */
80
+ writeMemory(addr: number, data: Uint8Array): Promise<void>;
81
+ }
82
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/protocol/updi/link.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAazD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM;IAK9B;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoChD;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOzC;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxC;;;;;OAKG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzC;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB/C;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBlD;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKjE;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjE"}
@@ -0,0 +1,241 @@
1
+ // UPDI Link Layer — low-level byte I/O over a half-duplex single-wire interface.
2
+ //
3
+ // UPDI uses a single GPIO for both TX and RX (the UPDI pin). When bytes are
4
+ // transmitted, the same bytes are physically looped back to the RX line
5
+ // (half-duplex UART echo). The link layer must:
6
+ //
7
+ // 1. Write bytes to the transport.
8
+ // 2. Read and discard the same N bytes (the TX echo).
9
+ // 3. Then read the actual device response.
10
+ //
11
+ // All public methods handle echo cancellation internally — callers see a clean
12
+ // request/response interface.
13
+ //
14
+ // Reference: Microchip AVR® UPDI Programming Interface Application Note (DS40002312)
15
+ import { UPDI_SYNC, UPDI_ACK, UPDI_LDCS, UPDI_STCS, UPDI_LDS, UPDI_STS, UPDI_LD, UPDI_ST, UPDI_REPEAT, UPDI_KEY, UPDI_ADDRESS_16, UPDI_DATA_8, UPDI_DATA_16, UPDI_PTR, UPDI_PTR_INC, UPDI_KEY_SIZE_64, UPDI_CTRLA_GT_2, UPDI_CS_CTRLA, } from './constants.js';
16
+ import { STK500TimeoutError, STK500ProtocolError } from '../../core/errors.js';
17
+ // Pre-computed instruction byte constants
18
+ const INSTR_LDCS_BASE = UPDI_LDCS; // 0x80
19
+ const INSTR_STCS_BASE = UPDI_STCS; // 0xC0
20
+ const INSTR_LDS_16_8 = UPDI_LDS | (UPDI_ADDRESS_16 << 2) | UPDI_DATA_8; // 0x04
21
+ const INSTR_STS_16_8 = UPDI_STS | (UPDI_ADDRESS_16 << 2) | UPDI_DATA_8; // 0x44
22
+ const INSTR_ST_PTR_16 = UPDI_ST | (UPDI_PTR << 2) | UPDI_DATA_16; // 0x61 (set pointer)
23
+ const INSTR_ST_PTR_INC = UPDI_ST | (UPDI_PTR_INC << 2) | UPDI_DATA_8; // 0x64
24
+ const INSTR_LD_PTR_INC = UPDI_LD | (UPDI_PTR_INC << 2) | UPDI_DATA_8; // 0x24
25
+ const INSTR_REPEAT_8 = UPDI_REPEAT | UPDI_DATA_8; // 0xA0
26
+ const INSTR_KEY_64 = UPDI_KEY | UPDI_KEY_SIZE_64; // 0xE0
27
+ export class UPDILink {
28
+ constructor(transport, board, log) {
29
+ this.transport = transport;
30
+ this.board = board;
31
+ this.log = log;
32
+ }
33
+ // ── Private primitives ────────────────────────────────────────────────────
34
+ /**
35
+ * Write bytes and discard the echo (TX loopback).
36
+ * After this returns the transport's receive buffer contains only device
37
+ * responses, not echo bytes.
38
+ */
39
+ async send(bytes) {
40
+ const data = new Uint8Array(bytes);
41
+ await this.transport.write(data);
42
+ // Discard echo bytes
43
+ await this.receiveExact(data.length);
44
+ }
45
+ /**
46
+ * Receive exactly `count` bytes from the transport.
47
+ * Accumulates chunks until the total reaches `count`, then resolves.
48
+ * Rejects with STK500TimeoutError if the deadline expires.
49
+ */
50
+ receiveExact(count) {
51
+ if (count === 0)
52
+ return Promise.resolve(new Uint8Array(0));
53
+ return new Promise((resolve, reject) => {
54
+ let settled = false;
55
+ const chunks = [];
56
+ let received = 0;
57
+ const timer = setTimeout(() => {
58
+ if (settled)
59
+ return;
60
+ settled = true;
61
+ this.transport.off('data', onData);
62
+ reject(new STK500TimeoutError(this.board.timeout, `UPDI: waiting for ${count} bytes`));
63
+ }, this.board.timeout);
64
+ const onData = (chunk) => {
65
+ if (settled)
66
+ return;
67
+ chunks.push(chunk.slice());
68
+ received += chunk.length;
69
+ if (received >= count) {
70
+ settled = true;
71
+ clearTimeout(timer);
72
+ this.transport.off('data', onData);
73
+ const buf = new Uint8Array(received);
74
+ let off = 0;
75
+ for (const c of chunks) {
76
+ buf.set(c, off);
77
+ off += c.length;
78
+ }
79
+ resolve(buf.subarray(0, count));
80
+ }
81
+ };
82
+ this.transport.on('data', onData);
83
+ });
84
+ }
85
+ // ── CS register access (LDCS / STCS) ─────────────────────────────────────
86
+ /**
87
+ * Read one byte from a UPDI Control/Status register.
88
+ * LDCS sequence: SYNC + (0x80 | addr) → echo 2 bytes → read 1 byte
89
+ */
90
+ async ldcs(addr) {
91
+ await this.send([UPDI_SYNC, INSTR_LDCS_BASE | (addr & 0x0F)]);
92
+ const resp = await this.receiveExact(1);
93
+ this.log('debug', `LDCS[0x${addr.toString(16)}] = 0x${resp[0].toString(16).padStart(2, '0')}`);
94
+ return resp[0];
95
+ }
96
+ /**
97
+ * Write one byte to a UPDI Control/Status register.
98
+ * STCS sequence: SYNC + (0xC0 | addr) + val → echo 3 bytes → read 1 ACK
99
+ */
100
+ async stcs(addr, val) {
101
+ await this.send([UPDI_SYNC, INSTR_STCS_BASE | (addr & 0x0F), val]);
102
+ const ack = await this.receiveExact(1);
103
+ if (ack[0] !== UPDI_ACK) {
104
+ throw new STK500ProtocolError(`UPDI STCS[0x${addr.toString(16)}]: expected ACK 0x40, ` +
105
+ `got 0x${ack[0].toString(16).padStart(2, '0')}`);
106
+ }
107
+ this.log('debug', `STCS[0x${addr.toString(16)}] = 0x${val.toString(16).padStart(2, '0')}`);
108
+ }
109
+ // ── Data-space access (LDS / STS — 16-bit address, 8-bit data) ───────────
110
+ /**
111
+ * Read one byte from a 16-bit data-space address.
112
+ * LDS sequence: SYNC + 0x04 + addrL + addrH → echo 4 bytes → read 1 byte
113
+ */
114
+ async lds(addr) {
115
+ await this.send([UPDI_SYNC, INSTR_LDS_16_8, addr & 0xFF, (addr >> 8) & 0xFF]);
116
+ const resp = await this.receiveExact(1);
117
+ this.log('debug', `LDS[0x${addr.toString(16).padStart(4, '0')}] = 0x${resp[0].toString(16).padStart(2, '0')}`);
118
+ return resp[0];
119
+ }
120
+ /**
121
+ * Write one byte to a 16-bit data-space address.
122
+ * STS sequence:
123
+ * → SYNC + 0x44 + addrL + addrH → echo 4 bytes → read 1 ACK
124
+ * → val → echo 1 byte → read 1 ACK
125
+ */
126
+ async sts(addr, val) {
127
+ // Phase 1: send address
128
+ await this.send([UPDI_SYNC, INSTR_STS_16_8, addr & 0xFF, (addr >> 8) & 0xFF]);
129
+ const ack1 = await this.receiveExact(1);
130
+ if (ack1[0] !== UPDI_ACK) {
131
+ throw new STK500ProtocolError(`UPDI STS[0x${addr.toString(16)}] addr ACK: ` +
132
+ `got 0x${ack1[0].toString(16).padStart(2, '0')}`);
133
+ }
134
+ // Phase 2: send data (also echoed!)
135
+ await this.send([val]);
136
+ const ack2 = await this.receiveExact(1);
137
+ if (ack2[0] !== UPDI_ACK) {
138
+ throw new STK500ProtocolError(`UPDI STS[0x${addr.toString(16)}] data ACK: ` +
139
+ `got 0x${ack2[0].toString(16).padStart(2, '0')}`);
140
+ }
141
+ this.log('debug', `STS[0x${addr.toString(16).padStart(4, '0')}] = 0x${val.toString(16).padStart(2, '0')}`);
142
+ }
143
+ // ── Pointer register operations ───────────────────────────────────────────
144
+ /**
145
+ * Load a 16-bit address into the UPDI pointer register.
146
+ * ST(ptr, 16-bit) sequence: SYNC + 0x61 + addrL + addrH → echo 4 bytes → read 1 ACK
147
+ */
148
+ async setPtr(addr) {
149
+ await this.send([UPDI_SYNC, INSTR_ST_PTR_16, addr & 0xFF, (addr >> 8) & 0xFF]);
150
+ const ack = await this.receiveExact(1);
151
+ if (ack[0] !== UPDI_ACK) {
152
+ throw new STK500ProtocolError(`UPDI SET_PTR(0x${addr.toString(16)}): no ACK ` +
153
+ `(got 0x${ack[0].toString(16).padStart(2, '0')})`);
154
+ }
155
+ this.log('debug', `SET_PTR(0x${addr.toString(16).padStart(4, '0')})`);
156
+ }
157
+ /**
158
+ * Write a block of bytes to memory using ST ptr++ (with optional REPEAT).
159
+ *
160
+ * For count > 1, a REPEAT instruction is sent first so the device auto-advances
161
+ * the pointer. Each byte requires: send byte → discard echo → read ACK.
162
+ */
163
+ async stPtrInc(data) {
164
+ if (data.length === 0)
165
+ return;
166
+ // Send REPEAT if more than one byte
167
+ if (data.length > 1) {
168
+ await this.send([UPDI_SYNC, INSTR_REPEAT_8, data.length - 1]);
169
+ }
170
+ // Send ST_PTR_INC instruction
171
+ await this.send([UPDI_SYNC, INSTR_ST_PTR_INC]);
172
+ // Send each data byte — each triggers echo + ACK
173
+ for (let i = 0; i < data.length; i++) {
174
+ await this.send([data[i]]);
175
+ const ack = await this.receiveExact(1);
176
+ if (ack[0] !== UPDI_ACK) {
177
+ throw new STK500ProtocolError(`UPDI ST_PTR_INC byte[${i}]: no ACK ` +
178
+ `(got 0x${ack[0].toString(16).padStart(2, '0')})`);
179
+ }
180
+ }
181
+ this.log('debug', `ST_PTR_INC(${data.length} bytes)`);
182
+ }
183
+ /**
184
+ * Read a block of bytes using LD ptr++ (with optional REPEAT).
185
+ *
186
+ * For count > 1, a REPEAT is sent first. The device streams back `count`
187
+ * data bytes directly — no echoes for reads.
188
+ */
189
+ async ldPtrInc(count) {
190
+ if (count === 0)
191
+ return new Uint8Array(0);
192
+ // Send REPEAT if more than one byte
193
+ if (count > 1) {
194
+ await this.send([UPDI_SYNC, INSTR_REPEAT_8, count - 1]);
195
+ }
196
+ // Send LD_PTR_INC instruction
197
+ await this.send([UPDI_SYNC, INSTR_LD_PTR_INC]);
198
+ // Device streams back `count` bytes (no echo for device→host direction)
199
+ const result = await this.receiveExact(count);
200
+ this.log('debug', `LD_PTR_INC(${count} bytes)`);
201
+ return result;
202
+ }
203
+ // ── KEY instruction ───────────────────────────────────────────────────────
204
+ /**
205
+ * Broadcast an 8-byte key to unlock NVM or chip-erase operations.
206
+ * KEY sequence: SYNC + 0xE0 + 8 key bytes → echo 10 bytes → no ACK
207
+ */
208
+ async sendKey(key) {
209
+ if (key.length !== 8) {
210
+ throw new STK500ProtocolError(`UPDI KEY: expected 8-byte key, got ${key.length}`);
211
+ }
212
+ await this.send([UPDI_SYNC, INSTR_KEY_64, ...key]);
213
+ // No ACK for KEY — device just latches the key state
214
+ this.log('debug', `KEY sent (${Array.from(key).map(b => b.toString(16).padStart(2, '0')).join(' ')})`);
215
+ }
216
+ // ── Convenience ───────────────────────────────────────────────────────────
217
+ /**
218
+ * Configure guard time to minimum (2 cycles) for faster communication.
219
+ * Called once after establishing the link.
220
+ */
221
+ async configureGuardTime() {
222
+ await this.stcs(UPDI_CS_CTRLA, UPDI_CTRLA_GT_2);
223
+ }
224
+ /**
225
+ * Read a contiguous memory region.
226
+ * Internally uses setPtr + ldPtrInc.
227
+ */
228
+ async readMemory(addr, size) {
229
+ await this.setPtr(addr);
230
+ return this.ldPtrInc(size);
231
+ }
232
+ /**
233
+ * Write a contiguous memory region.
234
+ * Internally uses setPtr + stPtrInc.
235
+ */
236
+ async writeMemory(addr, data) {
237
+ await this.setPtr(addr);
238
+ await this.stPtrInc(data);
239
+ }
240
+ }
241
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/protocol/updi/link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { Board, STK500Options, BootloadProgressCallback } from '../../core/types.js';
2
+ import type { ISTKTransport } from '../../transport/ITransport.js';
3
+ /**
4
+ * Fuse register dump for tinyAVR 0/1/2 and megaAVR 0 series.
5
+ * Note: fuse3 does not exist on these devices. Indices match NVM fuse layout.
6
+ */
7
+ export interface UPDIFuses {
8
+ fuse0: number;
9
+ fuse1: number;
10
+ fuse2: number;
11
+ /** fuse3 does not exist — index 3 is reserved and returns 0xFF */
12
+ fuse4: number;
13
+ fuse5: number;
14
+ }
15
+ export declare class UPDI {
16
+ private readonly transport;
17
+ private readonly board;
18
+ private readonly link;
19
+ private readonly log;
20
+ private readonly syncAttempts;
21
+ constructor(transport: ISTKTransport, board: Board, opts?: STK500Options);
22
+ /**
23
+ * Send a BREAK condition to reset the UPDI state machine.
24
+ * Requires transport.sendBreak() — throws if not available.
25
+ */
26
+ sendBreak(): Promise<void>;
27
+ /**
28
+ * Verify the UPDI link is active by reading STATUSA.
29
+ * Returns the STATUSA value on success, throws STK500SyncError on failure.
30
+ */
31
+ sync(attempts: number): Promise<void>;
32
+ /**
33
+ * Send the NVMProg key and wait until the device acknowledges NVMPROG mode.
34
+ */
35
+ enterProgMode(): Promise<void>;
36
+ /**
37
+ * Check if the device is locked (LOCKSTATUS bit in ASI_SYS_STATUS).
38
+ */
39
+ isLocked(): Promise<boolean>;
40
+ /**
41
+ * Erase the entire chip (flash + EEPROM + fuses reset to defaults).
42
+ * Must be in NVMPROG mode first — OR use the CHIPERASE key for locked devices.
43
+ */
44
+ chipErase(): Promise<void>;
45
+ /**
46
+ * Chip erase using the CHIPERASE key — works even on locked devices.
47
+ * Sends BREAK + key, then waits for erase to complete.
48
+ */
49
+ chipEraseKey(): Promise<void>;
50
+ /** Wait until NVM_STATUS.FBUSY clears (flash write/erase completed) */
51
+ waitNvmReady(): Promise<void>;
52
+ /**
53
+ * Read the 3-byte device ID from SIGROW (address 0x1100).
54
+ */
55
+ getSignature(): Promise<Uint8Array>;
56
+ verifySignature(): Promise<void>;
57
+ /**
58
+ * Write one page of flash.
59
+ * @param byteAddr Absolute byte address in flash (e.g. 0x8000 for tinyAVR start)
60
+ * @param data Page data (length = board.pageSize)
61
+ */
62
+ programPage(byteAddr: number, data: Uint8Array): Promise<void>;
63
+ /** Read `size` bytes from flash starting at `byteAddr` */
64
+ readFlash(byteAddr: number, size: number): Promise<Uint8Array>;
65
+ /**
66
+ * Write EEPROM bytes.
67
+ * @param offset Byte offset within EEPROM (0-based)
68
+ * @param data Data to write
69
+ */
70
+ writeEeprom(offset: number, data: Uint8Array): Promise<void>;
71
+ /** Read `size` EEPROM bytes starting at `offset` */
72
+ readEeprom(offset: number, size: number): Promise<Uint8Array>;
73
+ /**
74
+ * Read all fuse bytes (6 fuses for tinyAVR/megaAVR 0).
75
+ */
76
+ readFuses(): Promise<UPDIFuses>;
77
+ /**
78
+ * Write a single fuse byte.
79
+ * @param fuseNum 0–5 (fuse register index)
80
+ * @param val New fuse value
81
+ */
82
+ writeFuse(fuseNum: number, val: number): Promise<void>;
83
+ /** Exit programming mode and reset the device to run user firmware. */
84
+ leaveProgMode(): Promise<void>;
85
+ upload(hexData: string | Uint8Array, progressCallback?: (pct: number) => void): Promise<void>;
86
+ verify(hexData: string | Uint8Array, progressCallback?: (pct: number) => void): Promise<void>;
87
+ bootload(hexData: string | Uint8Array, progressCallback?: BootloadProgressCallback): Promise<void>;
88
+ }
89
+ //# sourceMappingURL=programmer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programmer.d.ts","sourceRoot":"","sources":["../../../src/protocol/updi/programmer.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,wBAAwB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOnE;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,IAAI;IAMb,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EAC7B,IAAI,GAAE,aAAkB;IAsB1B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBpC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAOlC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BnC,uEAAuE;IACjE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAMnC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAetC;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAapE,0DAA0D;IACpD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMpE;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,oDAAoD;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMnE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAYrC;;;;OAIG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,uEAAuE;IACjE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC;IAmCV,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC;IA2BV,QAAQ,CACZ,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,gBAAgB,CAAC,EAAE,wBAAwB,GAC1C,OAAO,CAAC,IAAI,CAAC;CAsDjB"}