Skip to content

Commit 8db1a27

Browse files
jaguilardlech
authored andcommitted
firmware: Don't add checksums when not needed.
This fixes an issue where the EV3 firmware had checksums appended to it that made its size not align to the sector size, causing flashing to fail.
1 parent 4516cc8 commit 8db1a27

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/firmware/sagas.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -351,32 +351,20 @@ function* loadFirmware(
351351
'Expected metadata to be v2.x',
352352
);
353353

354-
const firmware = new Uint8Array(firmwareBase.length + 4);
355-
const firmwareView = new DataView(firmware.buffer);
356-
357-
firmware.set(firmwareBase);
358-
359-
// empty string means use default name (don't write over firmware)
360-
if (hubName) {
361-
firmware.set(encodeHubName(hubName, metadata), metadata['hub-name-offset']);
362-
}
363-
364-
const checksum = (function () {
354+
const [checksumFunc, checksumExtraLength] = (() => {
365355
switch (metadata['checksum-type']) {
366356
case 'sum':
367-
return sumComplement32(
368-
firmwareIterator(firmwareView, metadata['checksum-size']),
369-
);
357+
return [sumComplement32, 4];
370358
case 'crc32':
371-
return crc32(firmwareIterator(firmwareView, metadata['checksum-size']));
359+
return [crc32, 4];
372360
case 'none':
373-
return null;
361+
return [null, 0];
374362
default:
375-
return undefined;
363+
return [undefined, 0];
376364
}
377365
})();
378366

379-
if (checksum === undefined) {
367+
if (checksumFunc === undefined) {
380368
// FIXME: we should return error/throw instead
381369
yield* put(
382370
didFailToFinish(
@@ -391,8 +379,22 @@ function* loadFirmware(
391379
throw new Error('unreachable');
392380
}
393381

394-
if (checksum !== null) {
395-
firmwareView.setUint32(firmwareBase.length, checksum, true);
382+
const firmware = new Uint8Array(firmwareBase.length + checksumExtraLength);
383+
const firmwareView = new DataView(firmware.buffer);
384+
385+
firmware.set(firmwareBase);
386+
387+
// empty string means use default name (don't write over firmware)
388+
if (hubName) {
389+
firmware.set(encodeHubName(hubName, metadata), metadata['hub-name-offset']);
390+
}
391+
392+
if (checksumFunc !== null) {
393+
firmwareView.setUint32(
394+
firmwareBase.length,
395+
checksumFunc(firmwareIterator(firmwareView, metadata['checksum-size'])),
396+
true,
397+
);
396398
}
397399

398400
return { firmware, deviceId: metadata['device-id'] };

0 commit comments

Comments
 (0)