From b427b2b92d4daf9176c497f972ade388df47da8f Mon Sep 17 00:00:00 2001 From: Sergio Gasquez Arcos Date: Tue, 9 Jan 2024 19:49:16 +0100 Subject: [PATCH] Initial support for P4 (#533) * feat: Initial support for P4 * feat: Update p4 bootloader to master (8c9e298) * fix: Fix clippy lints --- README.md | 2 +- cargo-espflash/README.md | 2 +- espflash/README.md | 2 +- .../bootloaders/esp32p4-bootloader.bin | Bin 0 -> 16704 bytes .../resources/stubs/stub_flasher_32p4.toml | 6 + espflash/src/flasher/stubs.rs | 6 +- espflash/src/targets/esp32p4.rs | 121 ++++++++++++++++++ espflash/src/targets/mod.rs | 17 ++- 8 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 espflash/resources/bootloaders/esp32p4-bootloader.bin create mode 100644 espflash/resources/stubs/stub_flasher_32p4.toml create mode 100644 espflash/src/targets/esp32p4.rs diff --git a/README.md b/README.md index fdd1f302..3d155f09 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Serial flasher utilities for Espressif devices, based loosely on [esptool.py](https://github.com/espressif/esptool/). -Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-S2/S3**, and **ESP8266**. +Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-P4**, **ESP32-S2/S3**, and **ESP8266**. ## [cargo-espflash](./cargo-espflash/) diff --git a/cargo-espflash/README.md b/cargo-espflash/README.md index c94d6379..12335eb0 100644 --- a/cargo-espflash/README.md +++ b/cargo-espflash/README.md @@ -7,7 +7,7 @@ Cross-compiler and Cargo extension for flashing Espressif devices. -Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-S2/S3**, and **ESP8266**. +Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-P4**, **ESP32-S2/S3**, and **ESP8266**. ## Table of Contents diff --git a/espflash/README.md b/espflash/README.md index 45a43093..21da4d52 100644 --- a/espflash/README.md +++ b/espflash/README.md @@ -8,7 +8,7 @@ A library and command-line tool for flashing Espressif devices. -Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-S2/S3**, and **ESP8266**. +Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-H2**, **ESP32-P4**,**ESP32-S2/S3**, and **ESP8266**. ## Table of Contents diff --git a/espflash/resources/bootloaders/esp32p4-bootloader.bin b/espflash/resources/bootloaders/esp32p4-bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..f33551351bc146c8d811183d846ff1b2817b6c60 GIT binary patch literal 16704 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 D$qenm literal 0 HcmV?d00001 diff --git a/espflash/resources/stubs/stub_flasher_32p4.toml b/espflash/resources/stubs/stub_flasher_32p4.toml new file mode 100644 index 00000000..2c6ec134 --- /dev/null +++ b/espflash/resources/stubs/stub_flasher_32p4.toml @@ -0,0 +1,6 @@ +entry = 1_341_195_718 +text = "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" +text_start = 1_341_194_240 +data = "DAD1T+4I8U86CfFPkgnxT2gK8U/UCvFPggrxT7YH8U8kCvFPZArxT6YJ8U9mB/FP2gnxT2YH8U/ICPFPDAnxTzoJ8U+SCfFP2gjxTyAI8U9QCPFP1gjxTywN8U86CfFP7AvxT+AM8U+yBvFPCg3xT7IG8U+yBvFPsgbxT7IG8U+yBvFPsgbxT7IG8U+yBvFPiAvxT7IG8U8IDPFP4AzxTw==" +data_start = 1_341_533_096 +bss_start = 1_341_456_384 diff --git a/espflash/src/flasher/stubs.rs b/espflash/src/flasher/stubs.rs index 6f5191de..d0fe47a9 100644 --- a/espflash/src/flasher/stubs.rs +++ b/espflash/src/flasher/stubs.rs @@ -23,9 +23,10 @@ const STUB_32: &str = include_str!("../../resources/stubs/stub_flasher_32.toml") const STUB_32C2: &str = include_str!("../../resources/stubs/stub_flasher_32c2.toml"); const STUB_32C3: &str = include_str!("../../resources/stubs/stub_flasher_32c3.toml"); const STUB_32C6: &str = include_str!("../../resources/stubs/stub_flasher_32c6.toml"); +const STUB_32H2: &str = include_str!("../../resources/stubs/stub_flasher_32h2.toml"); +const STUB_32P4: &str = include_str!("../../resources/stubs/stub_flasher_32p4.toml"); const STUB_32S2: &str = include_str!("../../resources/stubs/stub_flasher_32s2.toml"); const STUB_32S3: &str = include_str!("../../resources/stubs/stub_flasher_32s3.toml"); -const STUB_32H2: &str = include_str!("../../resources/stubs/stub_flasher_32h2.toml"); const STUB_8266: &str = include_str!("../../resources/stubs/stub_flasher_8266.toml"); impl FlashStub { @@ -36,9 +37,10 @@ impl FlashStub { Chip::Esp32c2 => STUB_32C2, Chip::Esp32c3 => STUB_32C3, Chip::Esp32c6 => STUB_32C6, + Chip::Esp32h2 => STUB_32H2, + Chip::Esp32p4 => STUB_32P4, Chip::Esp32s2 => STUB_32S2, Chip::Esp32s3 => STUB_32S3, - Chip::Esp32h2 => STUB_32H2, Chip::Esp8266 => STUB_8266, }; diff --git a/espflash/src/targets/esp32p4.rs b/espflash/src/targets/esp32p4.rs new file mode 100644 index 00000000..4af14f84 --- /dev/null +++ b/espflash/src/targets/esp32p4.rs @@ -0,0 +1,121 @@ +use std::ops::Range; + +use esp_idf_part::PartitionTable; + +use super::{Chip, Esp32Params, ReadEFuse, SpiRegisters, Target}; +use crate::{ + connection::Connection, + elf::FirmwareImage, + error::Error, + flasher::{FlashFrequency, FlashMode, FlashSize}, + image_format::{DirectBootFormat, IdfBootloaderFormat, ImageFormat, ImageFormatKind}, +}; + +const CHIP_DETECT_MAGIC_VALUES: &[u32] = &[0x0]; + +const FLASH_RANGES: &[Range] = &[ + 0x4000_0000..0x4C00_0000, // IROM + 0x4000_0000..0x4C00_0000, // DROM +]; + +const PARAMS: Esp32Params = Esp32Params::new( + 0x2000, + 0x1_0000, + 0x3f_0000, // TODO: Update + 18, + FlashFrequency::_40Mhz, + include_bytes!("../../resources/bootloaders/esp32p4-bootloader.bin"), +); + +/// ESP32-P4 Target +pub struct Esp32p4; + +impl Esp32p4 { + pub fn has_magic_value(value: u32) -> bool { + CHIP_DETECT_MAGIC_VALUES.contains(&value) + } +} + +impl ReadEFuse for Esp32p4 { + fn efuse_reg(&self) -> u32 { + 0x5012_D000 + } +} + +impl Target for Esp32p4 { + fn addr_is_flash(&self, addr: u32) -> bool { + FLASH_RANGES.iter().any(|range| range.contains(&addr)) + } + + fn chip_features(&self, _connection: &mut Connection) -> Result, Error> { + Ok(vec!["High-Performance MCU"]) + } + + fn major_chip_version(&self, _connection: &mut Connection) -> Result { + // TODO: https://github.com/espressif/esptool/blob/master/esptool/targets/esp32p4.py#L96 + Ok(0) + } + + fn minor_chip_version(&self, _connection: &mut Connection) -> Result { + // TODO: https://github.com/espressif/esptool/blob/master/esptool/targets/esp32p4.py#L92 + + Ok(0) + } + + fn crystal_freq(&self, _connection: &mut Connection) -> Result { + // The ESP32-P4's XTAL has a fixed frequency of 40MHz. + Ok(40) + } + + fn get_flash_image<'a>( + &self, + image: &'a dyn FirmwareImage<'a>, + bootloader: Option>, + partition_table: Option, + target_app_partition: Option, + image_format: Option, + _chip_revision: Option<(u32, u32)>, + flash_mode: Option, + flash_size: Option, + flash_freq: Option, + partition_table_offset: Option, + ) -> Result + 'a>, Error> { + let image_format = image_format.unwrap_or(ImageFormatKind::EspBootloader); + + match image_format { + ImageFormatKind::EspBootloader => Ok(Box::new(IdfBootloaderFormat::new( + image, + Chip::Esp32p4, + PARAMS, + partition_table, + target_app_partition, + bootloader, + flash_mode, + flash_size, + flash_freq, + partition_table_offset, + )?)), + ImageFormatKind::DirectBoot => Ok(Box::new(DirectBootFormat::new(image, 0x0)?)), + } + } + + fn spi_registers(&self) -> SpiRegisters { + SpiRegisters { + base: 0x5008_D000, + usr_offset: 0x18, + usr1_offset: 0x1c, + usr2_offset: 0x20, + w0_offset: 0x58, + mosi_length_offset: Some(0x24), + miso_length_offset: Some(0x28), + } + } + + fn supported_image_formats(&self) -> &[ImageFormatKind] { + &[ImageFormatKind::EspBootloader, ImageFormatKind::DirectBoot] + } + + fn supported_build_targets(&self) -> &[&str] { + &["riscv32imafc-esp-espidf", "riscv32imafc-unknown-none-elf"] + } +} diff --git a/espflash/src/targets/mod.rs b/espflash/src/targets/mod.rs index 5ae72f51..6816f36a 100644 --- a/espflash/src/targets/mod.rs +++ b/espflash/src/targets/mod.rs @@ -18,6 +18,7 @@ pub use self::{ esp32c3::Esp32c3, esp32c6::Esp32c6, esp32h2::Esp32h2, + esp32p4::Esp32p4, esp32s2::Esp32s2, esp32s3::Esp32s3, esp8266::Esp8266, @@ -39,6 +40,7 @@ mod esp32c2; mod esp32c3; mod esp32c6; mod esp32h2; +mod esp32p4; mod esp32s2; mod esp32s3; mod esp8266; @@ -58,12 +60,14 @@ pub enum Chip { Esp32c3, /// ESP32-C6 Esp32c6, + /// ESP32-H2 + Esp32h2, + /// ESP32-P4 + Esp32p4, /// ESP32-S2 Esp32s2, /// ESP32-S3 Esp32s3, - /// ESP32-H2 - Esp32h2, /// ESP8266 Esp8266, } @@ -78,12 +82,14 @@ impl Chip { Ok(Chip::Esp32c3) } else if Esp32c6::has_magic_value(magic) { Ok(Chip::Esp32c6) + } else if Esp32h2::has_magic_value(magic) { + Ok(Chip::Esp32h2) + } else if Esp32p4::has_magic_value(magic) { + Ok(Chip::Esp32p4) } else if Esp32s2::has_magic_value(magic) { Ok(Chip::Esp32s2) } else if Esp32s3::has_magic_value(magic) { Ok(Chip::Esp32s3) - } else if Esp32h2::has_magic_value(magic) { - Ok(Chip::Esp32h2) } else if Esp8266::has_magic_value(magic) { Ok(Chip::Esp8266) } else { @@ -97,9 +103,10 @@ impl Chip { Chip::Esp32c2 => Box::new(Esp32c2), Chip::Esp32c3 => Box::new(Esp32c3), Chip::Esp32c6 => Box::new(Esp32c6), + Chip::Esp32h2 => Box::new(Esp32h2), + Chip::Esp32p4 => Box::new(Esp32p4), Chip::Esp32s2 => Box::new(Esp32s2), Chip::Esp32s3 => Box::new(Esp32s3), - Chip::Esp32h2 => Box::new(Esp32h2), Chip::Esp8266 => Box::new(Esp8266), } }