From 4df7c4bcad86764f3db6bf981b1c6179b3cabc78 Mon Sep 17 00:00:00 2001 From: Jesse Braham Date: Sat, 2 Oct 2021 09:38:02 -0700 Subject: [PATCH] If flash size cannot be detected, print a warning and default to 4MB --- espflash/src/flasher.rs | 19 ++++++++++- espflash/src/image_format/esp32bootloader.rs | 34 ++++++++++---------- espflash/src/image_format/esp8266.rs | 18 +++++++---- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/espflash/src/flasher.rs b/espflash/src/flasher.rs index 7cf7d9c0..b20eaa41 100644 --- a/espflash/src/flasher.rs +++ b/espflash/src/flasher.rs @@ -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 } @@ -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))), } @@ -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) } diff --git a/espflash/src/image_format/esp32bootloader.rs b/espflash/src/image_format/esp32bootloader.rs index 419dca99..d0596f93 100644 --- a/espflash/src/image_format/esp32bootloader.rs +++ b/espflash/src/image_format/esp32bootloader.rs @@ -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, @@ -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() { @@ -152,14 +154,12 @@ impl<'a> ImageFormat<'a> for Esp32BootloaderFormat<'a> { fn encode_flash_size(size: FlashSize) -> Result { 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)), } } diff --git a/espflash/src/image_format/esp8266.rs b/espflash/src/image_format/esp8266.rs index 74730a37..bc8ba728 100644 --- a/espflash/src/image_format/esp8266.rs +++ b/espflash/src/image_format/esp8266.rs @@ -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 @@ -122,6 +126,6 @@ fn encode_flash_size(size: FlashSize) -> Result { 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)), } }