Skip to content
This repository has been archived by the owner on Jul 20, 2022. It is now read-only.

Remove header patching #86

Merged
merged 2 commits into from
Jan 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions js/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ function formatMacAddr(macAddr) {
async function clickConnect() {
if (espStub) {
await espStub.disconnect();
await espStub.port.close();
toggleUIConnected(false);
espStub = undefined;
return;
Expand Down
30 changes: 0 additions & 30 deletions src/const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,6 @@ export const ESP32_FLASH_SIZES = {
"64MB": 0x1a,
};

export const FLASH_MODES = {
qio: 0,
qout: 1,
dio: 2,
dout: 3,
};

export const FLASH_FREQUENCIES = {
"40m": 0,
"26m": 1,
"20m": 2,
"80m": 0xf,
};

export const DETECTED_FLASH_SIZES = {
0x12: "256KB",
0x13: "512KB",
Expand All @@ -57,28 +43,12 @@ export const DETECTED_FLASH_SIZES = {
0x1a: "64MB",
};

export const getFlashSizes = (chipFamily: ChipFamily) => {
switch (chipFamily) {
case CHIP_FAMILY_ESP32:
return ESP32_FLASH_SIZES;
case CHIP_FAMILY_ESP32S2:
return ESP32_FLASH_SIZES;
case CHIP_FAMILY_ESP8266:
return FLASH_SIZES;
case CHIP_FAMILY_ESP32C3:
return ESP32_FLASH_SIZES;
default:
return FLASH_SIZES;
}
};

export const FLASH_WRITE_SIZE = 0x400;
export const STUB_FLASH_WRITE_SIZE = 0x4000;
export const FLASH_SECTOR_SIZE = 0x1000; // Flash sector size, minimum unit of erase.
export const ESP_ROM_BAUD = 115200;
export const ESP32_BOOTLOADER_FLASH_OFFSET = 0x1000;
export const BOOTLOADER_FLASH_OFFSET = 0x0;
export const ESP_IMAGE_MAGIC = 0xe9;

export const ESP32_SPI_REG_BASE = 0x3ff42000;
export const ESP32_SPI_USR_OFFS = 0x1c;
Expand Down
96 changes: 14 additions & 82 deletions src/esp_loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,6 @@ import {
ESP_FLASH_DEFL_END,
ESP32_BOOTLOADER_FLASH_OFFSET,
BOOTLOADER_FLASH_OFFSET,
ESP_IMAGE_MAGIC,
getFlashSizes,
FLASH_FREQUENCIES,
FLASH_MODES,
getSpiFlashAddresses,
SpiFlashAddresses,
getUartDateRegAddress,
Expand Down Expand Up @@ -546,7 +542,20 @@ export class ESPLoader extends EventTarget {
offset = 0,
compress = false
) {
this.updateImageFlashParams(offset, binaryData);
if (binaryData.byteLength >= 8) {
// unpack the (potential) image header
var header = Array.from(new Uint8Array(binaryData, 0, 4));
let headerMagic = header[0];
let headerFlashMode = header[2];
let heatherFlashSizeFreq = header[3];

this.logger.debug(
`Image header, Magic=${toHex(headerMagic)}, FlashMode=${toHex(
headerFlashMode
)}, FlashSizeFreq=${toHex(heatherFlashSizeFreq)}`
);
}

let uncompressedFilesize = binaryData.byteLength;
let compressedFilesize = 0;

Expand Down Expand Up @@ -766,83 +775,6 @@ export class ESPLoader extends EventTarget {
return BOOTLOADER_FLASH_OFFSET;
}

updateImageFlashParams(offset: number, image: ArrayBuffer) {
// Modify the flash mode & size bytes if this looks like an executable bootloader image
if (image.byteLength < 8) {
return image; //# not long enough to be a bootloader image
}

// unpack the (potential) image header

var header = Array.from(new Uint8Array(image, 0, 4));
let headerMagic = header[0];
let headerFlashMode = header[2];
let heatherFlashSizeFreq = header[3];

this.logger.debug(
`Image header, Magic=${toHex(headerMagic)}, FlashMode=${toHex(
headerFlashMode
)}, FlashSizeFreq=${toHex(heatherFlashSizeFreq)}`
);

if (offset != this.getBootloaderOffset()) {
return image; // not flashing bootloader offset, so don't modify this image
}

// easy check if this is an image: does it start with a magic byte?
if (headerMagic != ESP_IMAGE_MAGIC) {
this.logger.log(
"Warning: Image file at %s doesn't look like an image file, so not changing any flash settings.",
toHex(offset, 4)
);
return image;
}

// make sure this really is an image, and not just data that
// starts with esp.ESP_IMAGE_MAGIC (mostly a problem for encrypted
// images that happen to start with a magic byte

// TODO Implement this test from esptool.py
/*
try:
test_image = esp.BOOTLOADER_IMAGE(io.BytesIO(image))
test_image.verify()
except Exception:
print("Warning: Image file at 0x%x is not a valid %s image, so not changing any flash settings." % (address, esp.CHIP_NAME))
return image
*/

this.logger.log("Image being flashed is a bootloader");

// For now we always select dio, a common value supported by many flash chips and ESP boards
let flashMode = FLASH_MODES["dio"];
// For now we always select 40m, a common value supported by many flash chips and ESP boards
let flashFreq = FLASH_FREQUENCIES["40m"];
let flashSize = getFlashSizes(this.getChipFamily())[
this.flashSize ? this.flashSize : "4MB"
]; // If size was autodetected we use it otherwise we default to 4MB
let flashParams = pack("BB", flashMode, flashSize + flashFreq);
let imageFlashParams = new Uint8Array(image, 2, 2);

if (
flashParams[0] != imageFlashParams[0] ||
flashParams[1] != imageFlashParams[1]
) {
imageFlashParams[0] = flashParams[0];
imageFlashParams[1] = flashParams[1];

this.logger.log(
`Patching Flash parameters header bytes to ${toHex(
flashParams[0],
2
)} ${toHex(flashParams[1], 2)}`
);
} else {
this.logger.log("Flash parameters header did not need patching.");
}
return image;
}

async flashId() {
let SPIFLASH_RDID = 0x9f;
let result = await this.runSpiFlashCommand(SPIFLASH_RDID, [], 24);
Expand Down