Skip to content

Commit a612196

Browse files
committed
added stk500v2 protocol and mega tests
1 parent b133289 commit a612196

File tree

8 files changed

+641
-59
lines changed

8 files changed

+641
-59
lines changed

src/avr/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import { ProgramConfig } from '../index.d';
33

44
import intelHex from 'intel-hex';
55
import getCpuData from './avr-cpu-data';
6-
import STK500v1 from './stk500-v1';
6+
import STK500v1 from './stk500-v1/stk500-v1';
7+
import STK500v2 from './stk500-v2/stk500-v2';
78

89
export const upload = async (serial: SerialPort, config: ProgramConfig) => {
910
const cpuData = getCpuData(config.cpu);
10-
let uploader = null as STK500v1 | null;
11+
let uploader = null as STK500v2 | STK500v1 | null;
1112
switch (cpuData.protocol) {
1213
case 'stk500v1':
1314
uploader = new STK500v1(serial, { quiet: !config.verbose });
@@ -20,6 +21,13 @@ export const upload = async (serial: SerialPort, config: ProgramConfig) => {
2021
},
2122
);
2223
break;
24+
case 'stk500v2':
25+
uploader = new STK500v2(serial, { quiet: !config.verbose });
26+
await uploader.bootload(
27+
intelHex.parse(config.hex || '').data,
28+
cpuData,
29+
);
30+
break;
2331
default:
2432
throw new Error(`Protocol ${cpuData.protocol} not supported`);
2533
}
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// converted to typescript/modernised by mrfrase3 (GPL-3.0 license)
33

44
import { SerialPort } from 'serialport/dist/index.d';
5-
import { setDTRRTS } from '../util/serial-helpers';
5+
import { setDTRRTS } from '../../util/serial-helpers';
6+
import asyncTimeout from '../../util/asyncTimeout';
67

78
interface STK500v1Options {
89
quiet?: boolean;
@@ -64,8 +65,6 @@ const statics = {
6465
};
6566
statics.OK_RESPONSE = Buffer.from([statics.RES_STK_INSYNC, statics.RES_STK_OK]);
6667

67-
const asyncTimeout = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
68-
6968
export default class STK500v1 {
7069
opts: STK500v1Options;
7170
quiet: boolean;
@@ -291,7 +290,7 @@ export default class STK500v1 {
291290
responseData: statics.OK_RESPONSE,
292291
timeout,
293292
});
294-
};
293+
}
295294

296295
async upload(hex: Buffer, pageSize: number, timeout = 400) {
297296
this.log('upload');
@@ -302,14 +301,14 @@ export default class STK500v1 {
302301
await promise;
303302
const pageaddr = i * pageSize;
304303
const useaddr = pageaddr >> 1;
305-
const writeBytes = hex.slice(pageaddr, Math.min(pageaddr + pageSize, hex.length - 1));
304+
const writeBytes = hex.subarray(pageaddr, (hex.length > pageSize ? (pageaddr + pageSize) : hex.length - 1));
306305
await this.loadAddress(useaddr, timeout);
307306
await this.loadPage(writeBytes, timeout);
308307
this.log(`uploaded page ${i + 1} of ${pages.length}`);
309-
asyncTimeout(4);
308+
await asyncTimeout(4);
310309
}, Promise.resolve());
311310
this.log('upload complete');
312-
};
311+
}
313312

314313
exitProgrammingMode(timeout = 400): Promise<Buffer|null> {
315314
this.log('exiting programming mode');
@@ -320,7 +319,7 @@ export default class STK500v1 {
320319
responseData: statics.OK_RESPONSE,
321320
timeout,
322321
});
323-
};
322+
}
324323

325324
async verify(hex: Buffer, pageSize: number, timeout = 400) {
326325
this.log('verify');
@@ -331,14 +330,14 @@ export default class STK500v1 {
331330
await promise;
332331
const pageaddr = i * pageSize;
333332
const useaddr = pageaddr >> 1;
334-
const writeBytes = hex.slice(pageaddr, Math.min(pageaddr + pageSize, hex.length - 1));
333+
const writeBytes = hex.subarray(pageaddr, (hex.length > pageSize ? (pageaddr + pageSize) : hex.length - 1));
335334
await this.loadAddress(useaddr, timeout);
336335
await this.verifyPage(writeBytes, pageSize, timeout);
337336
this.log(`verified page ${i + 1} of ${pages.length}`);
338337
asyncTimeout(4);
339338
}, Promise.resolve());
340339
this.log('verification complete');
341-
};
340+
}
342341

343342
verifyPage(writeBytes: Buffer, pageSize: number, timeout: number) {
344343
this.log("verify page");
@@ -361,7 +360,7 @@ export default class STK500v1 {
361360
responseLength: expectedResponse.length,
362361
timeout,
363362
});
364-
};
363+
}
365364

366365
async reset() {
367366
this.log('reset');
@@ -392,5 +391,5 @@ export default class STK500v1 {
392391
await this.exitProgrammingMode(opt.timeout);
393392

394393
this.log('bootload complete');
395-
};
394+
}
396395
}

src/avr/stk500-v2/constants.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
interface ConstantsMap {
2+
[constant: string]: number
3+
}
4+
5+
export default {
6+
// STK message constants
7+
MESSAGE_START: 0x1B,
8+
TOKEN: 0x0E,
9+
10+
// STK general command constants
11+
CMD_SIGN_ON: 0x01,
12+
CMD_SET_PARAMETER: 0x02,
13+
CMD_GET_PARAMETER: 0x03,
14+
CMD_SET_DEVICE_PARAMETERS: 0x04,
15+
CMD_OSCCAL: 0x05,
16+
CMD_LOAD_ADDRESS: 0x06,
17+
CMD_FIRMWARE_UPGRADE: 0x07,
18+
19+
// STK ISP command constants
20+
CMD_ENTER_PROGMODE_ISP: 0x10,
21+
CMD_LEAVE_PROGMODE_ISP: 0x11,
22+
CMD_CHIP_ERASE_ISP: 0x12,
23+
CMD_PROGRAM_FLASH_ISP: 0x13,
24+
CMD_READ_FLASH_ISP: 0x14,
25+
CMD_PROGRAM_EEPROM_ISP: 0x15,
26+
CMD_READ_EEPROM_ISP: 0x16,
27+
CMD_PROGRAM_FUSE_ISP: 0x17,
28+
CMD_READ_FUSE_ISP: 0x18,
29+
CMD_PROGRAM_LOCK_ISP: 0x19,
30+
CMD_READ_LOCK_ISP: 0x1A,
31+
CMD_READ_SIGNATURE_ISP: 0x1B,
32+
CMD_READ_OSCCAL_ISP: 0x1C,
33+
CMD_SPI_MULTI: 0x1D,
34+
35+
// STK PP command constants
36+
CMD_ENTER_PROGMODE_PP: 0x20,
37+
CMD_LEAVE_PROGMODE_PP: 0x21,
38+
CMD_CHIP_ERASE_PP: 0x22,
39+
CMD_PROGRAM_FLASH_PP: 0x23,
40+
CMD_READ_FLASH_PP: 0x24,
41+
CMD_PROGRAM_EEPROM_PP: 0x25,
42+
CMD_READ_EEPROM_PP: 0x26,
43+
CMD_PROGRAM_FUSE_PP: 0x27,
44+
CMD_READ_FUSE_PP: 0x28,
45+
CMD_PROGRAM_LOCK_PP: 0x29,
46+
CMD_READ_LOCK_PP: 0x2A,
47+
CMD_READ_SIGNATURE_PP: 0x2B,
48+
CMD_READ_OSCCAL_PP: 0x2C,
49+
CMD_SET_CONTROL_STACK: 0x2D,
50+
51+
// STK HVSP command constants
52+
CMD_ENTER_PROGMODE_HVSP: 0x30,
53+
CMD_LEAVE_PROGMODE_HVSP: 0x31,
54+
CMD_CHIP_ERASE_HVSP: 0x32,
55+
CMD_PROGRAM_FLASH_HVSP: 0x33,
56+
CMD_READ_FLASH_HVSP: 0x34,
57+
CMD_PROGRAM_EEPROM_HVSP: 0x35,
58+
CMD_READ_EEPROM_HVSP: 0x36,
59+
CMD_PROGRAM_FUSE_HVSP: 0x37,
60+
CMD_READ_FUSE_HVSP: 0x38,
61+
CMD_PROGRAM_LOCK_HVSP: 0x39,
62+
CMD_READ_LOCK_HVSP: 0x3A,
63+
CMD_READ_SIGNATURE_HVSP: 0x3B,
64+
CMD_READ_OSCCAL_HVSP: 0x3C,
65+
66+
// STK status constants
67+
// Success
68+
STATUS_CMD_OK: 0x00,
69+
// Warnings
70+
STATUS_CMD_TOUT: 0x80,
71+
STATUS_RDY_BSY_TOUT: 0x81,
72+
STATUS_SET_PARAM_MISSING: 0x82,
73+
// Errors
74+
STATUS_CMD_FAILED: 0xC0,
75+
STATUS_CKSUM_ERROR: 0xC1,
76+
STATUS_CMD_UNKNOWN: 0xC9,
77+
78+
// STK parameter constants
79+
STATUS_BUILD_NUMBER_LOW: 0x80,
80+
STATUS_BUILD_NUMBER_HIGH: 0x81,
81+
STATUS_HW_VER: 0x90,
82+
STATUS_SW_MAJOR: 0x91,
83+
STATUS_SW_MINOR: 0x92,
84+
STATUS_VTARGET: 0x94,
85+
STATUS_VADJUST: 0x95,
86+
STATUS_OSC_PSCALE: 0x96,
87+
STATUS_OSC_CMATCH: 0x97,
88+
STATUS_SCK_DURATION: 0x98,
89+
STATUS_TOPCARD_DETECT: 0x9A,
90+
STATUS_STATUS: 0x9C,
91+
STATUS_DATA: 0x9D,
92+
STATUS_RESET_POLARITY: 0x9E,
93+
STATUS_CONTROLLER_INIT: 0x9F,
94+
95+
// STK answer constants
96+
ANSWER_CKSUM_ERROR: 0xB0,
97+
} as ConstantsMap;

0 commit comments

Comments
 (0)