From 0944a27eb9eebcf402d482cfef42ddc46b06083a Mon Sep 17 00:00:00 2001 From: David Lechner Date: Thu, 2 Jul 2020 21:06:26 -0500 Subject: [PATCH] increase firmware flashing packet size --- src/protocols/lwp3-bootloader.ts | 14 ++++++++++++-- src/sagas/flash-firmware.ts | 9 +++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/protocols/lwp3-bootloader.ts b/src/protocols/lwp3-bootloader.ts index 413dc613..d4907413 100644 --- a/src/protocols/lwp3-bootloader.ts +++ b/src/protocols/lwp3-bootloader.ts @@ -63,8 +63,19 @@ export enum Result { /** * The largest allowable size for the payload of the ProgramFlash command. + * + * Theoretically, this is MTU - 9. However, City hub and Control+ hub report + * MTU of 158 but don't seem to be able to handle receiving that much data. + * Anything larger than 32 causes the bootloader to lock up. */ -export const MaxProgramFlashSize = 14; +export const MaxProgramFlashSize: ReadonlyMap = new Map< + HubType, + number +>([ + [HubType.MoveHub, 14], + [HubType.CityHub, 32], + [HubType.CPlusHub, 32], +]); /** * Flash memory protection level. @@ -111,7 +122,6 @@ export function createProgramFlashRequest( payload: ArrayBuffer, ): Uint8Array { const size = payload.byteLength; - assert(size <= MaxProgramFlashSize, 'payload is bigger than MaxProgramFlashSize'); const msg = new Uint8Array(size + 6); const view = new DataView(msg.buffer); view.setUint8(0, Command.ProgramFlash); diff --git a/src/sagas/flash-firmware.ts b/src/sagas/flash-firmware.ts index b4984f87..388182ab 100644 --- a/src/sagas/flash-firmware.ts +++ b/src/sagas/flash-firmware.ts @@ -303,9 +303,14 @@ function* flashFirmware(action: FlashFirmwareFlashAction): Generator { } let count = 0; + const maxDataSize = MaxProgramFlashSize.get(info[0].hubType); + if (maxDataSize === undefined) { + // istanbul ignore next: indicates programmer error if reached + throw Error('Missing hub type in MaxProgramFlashSize'); + } - for (let offset = 0; offset < firmware.length; offset += MaxProgramFlashSize) { - const payload = firmware.slice(offset, offset + MaxProgramFlashSize); + for (let offset = 0; offset < firmware.length; offset += maxDataSize) { + const payload = firmware.slice(offset, offset + maxDataSize); const programAction = (yield put( programRequest(info[0].startAddress + offset, payload.buffer), )) as BootloaderProgramRequestAction;