Skip to content
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
19 changes: 18 additions & 1 deletion espflash/src/flasher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ pub enum FlashSize {
Flash8Mb = 0x17,
#[strum(serialize = "16MB")]
Flash16Mb = 0x18,
#[strum(serialize = "32MB")]
Flash32Mb = 0x19,
#[strum(serialize = "64MB")]
Flash64Mb = 0x1a,
FlashRetry = 0xFF, // used to hint that alternate detection should be tried
}

Expand All @@ -113,6 +117,8 @@ impl FlashSize {
0x16 => Ok(FlashSize::Flash4Mb),
0x17 => Ok(FlashSize::Flash8Mb),
0x18 => Ok(FlashSize::Flash16Mb),
0x19 => Ok(FlashSize::Flash32Mb),
0x1a => Ok(FlashSize::Flash64Mb),
0xFF => Ok(FlashSize::FlashRetry),
_ => Err(Error::UnsupportedFlash(FlashDetectError::from(value))),
}
Expand Down Expand Up @@ -266,7 +272,18 @@ impl Flasher {
let flash_id = self.spi_command(Command::FlashDetect, &[], 24)?;
let size_id = flash_id >> 16;

self.flash_size = FlashSize::from(size_id as u8)?;
self.flash_size = match FlashSize::from(size_id as u8) {
Ok(size) => size,
Err(_) => {
eprintln!(
"Warning: could not detect flash size (FlashID=0x{:02X}, SizeID=0x{:02X}), defaulting to 4MB\n",
flash_id,
size_id
);
FlashSize::Flash4Mb
}
};

Ok(self.flash_size != FlashSize::FlashRetry)
}

Expand Down
34 changes: 17 additions & 17 deletions espflash/src/image_format/esp32bootloader.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
use crate::chip::Esp32Params;
use crate::elf::{
merge_segments, update_checksum, CodeSegment, FirmwareImage, RomSegment, ESP_CHECKSUM_MAGIC,
};
use crate::error::{Error, FlashDetectError};
use crate::flasher::FlashSize;
use crate::image_format::{
EspCommonHeader, ImageFormat, SegmentHeader, ESP_MAGIC, WP_PIN_DISABLED,
};
use crate::{Chip, PartitionTable};
use bytemuck::bytes_of;
use bytemuck::{Pod, Zeroable};
use sha2::{Digest, Sha256};
use std::{borrow::Cow, io::Write, iter::once};

use bytemuck::{bytes_of, Pod, Zeroable};
use sha2::{Digest, Sha256};

use crate::{
chip::Esp32Params,
elf::{
merge_segments, update_checksum, CodeSegment, FirmwareImage, RomSegment, ESP_CHECKSUM_MAGIC,
},
error::{Error, FlashDetectError},
flasher::FlashSize,
image_format::{EspCommonHeader, ImageFormat, SegmentHeader, ESP_MAGIC, WP_PIN_DISABLED},
Chip, PartitionTable,
};

/// Image format for esp32 family chips using a 2nd stage bootloader
pub struct Esp32BootloaderFormat<'a> {
params: Esp32Params,
Expand Down Expand Up @@ -72,7 +73,8 @@ impl<'a> Esp32BootloaderFormat<'a> {
if pad_len > 0 {
if pad_len > SEG_HEADER_LEN {
if let Some(ram_segment) = ram_segments.first_mut() {
// save up to `pad_len` from the ram segment, any remaining bits in the ram segments will be saved later
// save up to `pad_len` from the ram segment, any remaining bits in the
// ram segments will be saved later
let pad_segment = ram_segment.split_off(pad_len as usize);
checksum = save_segment(&mut data, &pad_segment, checksum)?;
if ram_segment.data().is_empty() {
Expand Down Expand Up @@ -152,14 +154,12 @@ impl<'a> ImageFormat<'a> for Esp32BootloaderFormat<'a> {

fn encode_flash_size(size: FlashSize) -> Result<u8, FlashDetectError> {
match size {
FlashSize::Flash256Kb => Err(FlashDetectError::from(size as u8)),
FlashSize::Flash512Kb => Err(FlashDetectError::from(size as u8)),
FlashSize::Flash1Mb => Ok(0x00),
FlashSize::Flash2Mb => Ok(0x10),
FlashSize::Flash4Mb => Ok(0x20),
FlashSize::Flash8Mb => Ok(0x30),
FlashSize::Flash16Mb => Ok(0x40),
FlashSize::FlashRetry => Err(FlashDetectError::from(size as u8)),
_ => Err(FlashDetectError::from(size as u8)),
}
}

Expand Down
18 changes: 11 additions & 7 deletions espflash/src/image_format/esp8266.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
use crate::elf::{update_checksum, CodeSegment, FirmwareImage, RomSegment, ESP_CHECKSUM_MAGIC};
use crate::error::{Error, FlashDetectError};
use crate::flasher::FlashSize;
use crate::image_format::{EspCommonHeader, ImageFormat, SegmentHeader, ESP_MAGIC};
use crate::Chip;
use bytemuck::bytes_of;
use std::{borrow::Cow, io::Write, iter::once, mem::size_of};

use bytemuck::bytes_of;

use crate::{
elf::{update_checksum, CodeSegment, FirmwareImage, RomSegment, ESP_CHECKSUM_MAGIC},
error::{Error, FlashDetectError},
flasher::FlashSize,
image_format::{EspCommonHeader, ImageFormat, SegmentHeader, ESP_MAGIC},
Chip,
};

const IROM_MAP_START: u32 = 0x40200000;

/// Image format for flashing to esp8266 chips
Expand Down Expand Up @@ -122,6 +126,6 @@ fn encode_flash_size(size: FlashSize) -> Result<u8, FlashDetectError> {
FlashSize::Flash4Mb => Ok(0x40),
FlashSize::Flash8Mb => Ok(0x80),
FlashSize::Flash16Mb => Ok(0x90),
FlashSize::FlashRetry => Err(FlashDetectError::from(size as u8)),
_ => Err(FlashDetectError::from(size as u8)),
}
}