import { Uploader } from './uploader'; import type SerialPort from 'serialport'; import Stk500v2 from 'stk500-v2' import { sleep, promisify } from '../util'; import { BoardConfig } from '../board'; import IntelHex from 'intel-hex'; class Stk500V2Uploader extends Uploader { constructor(boardConfig: BoardConfig) { super(boardConfig); } public async bootload(port: SerialPort, hex: Buffer) { const stk500v2 = new Stk500v2(port); const sync = promisify(stk500v2.sync).bind(stk500v2); const verifySignature = promisify(stk500v2.verifySignature).bind(stk500v2); const enterProgrammingMode = promisify(stk500v2.enterProgrammingMode).bind(stk500v2); const upload = promisify(stk500v2.upload).bind(stk500v2); const exitProgrammingMode = promisify(stk500v2.exitProgrammingMode).bind(stk500v2); // mega const signature = Buffer.from([0x1e, 0x98, 0x01]) await sync(5); await verifySignature(signature); await enterProgrammingMode({ timeout: 0xc8, stabDelay: 0x64, cmdexeDelay: 0x19, synchLoops: 0x20, byteDelay: 0x00, pollValue: 0x53, pollIndex: 0x03, }) const pageSize = 256; await upload(IntelHex.parse(hex).data, pageSize); await exitProgrammingMode(); } } export default Stk500V2Uploader;