Skip to content

Commit 6419e34

Browse files
authored
Add support for flashing the ESP32-C6 (#317)
* Add support for flashing the ESP32-C6 * Update READMEs
1 parent 8d3d0ae commit 6419e34

File tree

8 files changed

+138
-3
lines changed

8 files changed

+138
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
Serial flasher utilities for Espressif devices, based loosely on [esptool.py](https://github.com/espressif/esptool/).
88

9-
Supports the **ESP32**, **ESP32-C2/C3**, **ESP32-S2/S3**, and **ESP8266**.
9+
Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-S2/S3**, and **ESP8266**.
1010

1111
## [cargo-espflash](./cargo-espflash/)
1212

cargo-espflash/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
Cross-compiler and Cargo extension for flashing Espressif devices over serial.
88

9-
Supports the **ESP32**, **ESP32-C2/C3**, **ESP32-S2/S3**, and **ESP8266**.
9+
Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-S2/S3**, and **ESP8266**.
1010

1111
## Installation
1212

espflash/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
A library and command-line tool for flashing Espressif devices over serial.
99

10-
Supports the **ESP32**, **ESP32-C2/C3**, **ESP32-S2/S3**, and **ESP8266**.
10+
Supports the **ESP32**, **ESP32-C2/C3/C6**, **ESP32-S2/S3**, and **ESP8266**.
1111

1212
## Installation
1313

16 KB
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
entry = 1_082_131_920
2+
text = "ARG3BwBgSsgDqYcAJspOxlLEBs4izLcEAGD9WTcKhEDATBN09A8N4PJAYkQjqCQBsknSREJJIkoFYYKAiECDJwoAE3X1D4KXfRTjGTT/yb83NwBgfEudi/X/NycAYHxLnYv1/4KAQREGxt03tzcAYCOmBwI3BwAImMOYQ33/yFeyQBNF9f8FiUEBgoBBEQbG2T993TcHAEC3NwBgmMM3NwBgHEP9/7JAQQGCgEERIsQ3BIVAkwfECZxLBsYmwqHPXTcxyRMExAkYSL1HgURj1ucABES9iJO0FABNP5U/HEQ3BwABE5bHAGN/5gC3BoAAmeC3BgABNzcAYFDDFMO3NgBgmEJ9/0FHkeAFRxRIupccxJmOFMiyQCJEkkRBAYKAEwcADJxBYxvlAIHnhUecwSGoI6AFAPlXPoWCgAVHY4fnAIlGY43XAP1X/beTFwUBEwewDcGH4xHl/olHyb+TB8ANYxb1AJjBkwcADPG3kwbQDf1X4xLV/JjBkwewDW2/twWFQEERk4VFCQbGUT9jSQUGtweFQJOHxwCDpgcIA9dHCBN19Q9CB0GDEwYXAEIGQYIjkscINpcjAKcAA9dHCJFnk4cHBEIHQYNjHvcCN4eEQBMHxwChZ7qXA6YHCLfGhEC3B4VAk4fHAJOGxgRjH+YAI6bHCCOg1wgjkgcIIaD5V+MG9fyyQEEBgoAjptcII6DnCN23AREizDcEhUCTB8QJJsrERwbOSshOxhMExAlj85UAroS5wAMpRACqiSaZE1nJABxIY1XwABxEY1/5Ahk9fd1IQCaGzoWXAID/54Ag7xN19Q8BxZMHQAxcyFxAppdcwFxEs4SXQETE8kBiRNJEQkmySQVhgoANNWW/AREGziLMdTs3BM4/bAATBUT/lwCA/+eAQO6FRxXlskeT9wcgPsbhOzc3AGAcR7cGQAATBUT/1Y8cx7JFlwCA/+eA4OuzN6AA8kBiRD6FBWGCgEERtweFQAVHBsYjjucIk4fHCRPXxQCYxwVnfRfMw8jH+Y06laqVsYGMyyOqBwBBNxnBEwVQDLJAQQGCgEERBsYTBwAMYxDlAhMFsA2XAID/54DA0hMFwA2yQEEBFwOA/2cAw9ETB7AN4xjl/pcAgP/ngMDQEwXQDcW3QREixCbCBsYqhLMEtQBjF5QAskAiRJJEQQGCgANFBAAFBEU37bd1cUrBfXMFaSLFJsPO3tLc1toGx310GpGTBwkHipcTBIT6PpSqiSKFroSXAID/54AgOpMHCQcFaoqXs4pHQbngBWeTBwcHfXSTBYT6ipcTBIT5PpSTBwcHipe+lSKFlwCA/+eAYDcihcFFhT8BRQVjGpG6QCpEmkQKSfZZZlrWWklhgoAmiWNzmgAFaUqG1oVOhZcAgP/ngODTE3X1DwHtSobWhSKFlwCA/+eAoDLKmbOEJEFptxMFMAZVvxMFAAwXA4D/ZwCDwXFxfXNWy1rJXsdixQbXItUm00rRTs9SzWbDasHu3qqKGpETBQACLouyizaMAsKXAID/54CgLIVnY+d3E4VkfXSThwQHipcTBIT6PpQihZcAgP/ngGArfXqThwQHipeTDDr5vpyThwQHEw2K+YqXAUk+nYVnk4cHB4qXs4RHAYOtRPlj9G0LY3G5A0WgpTfOhSaFQTWFN06GpoUihZcAgP/ngMAmzppOmWN2aQOzB7lBY/KHA7MHK0HeiWPzdwG+iU6GpoVWhZcAgP/ngCDEE3X1D03dhWeThwcHipezhEcBI6wE+IFJjU2jiQT4ZoWXAID/54Cgsn35A8U0+eqF6T5jTwUA4+I9/4Vnk4cHB4qXM4c3AVKXIwqn+IUJ8bf5V+MU9fwRR+OG6fQFZ5MHBwd9dJMFhPqKlxMEhPk+lJMHBweKl76VIoWXAID/54BAHFU1IoXBRXU7cT0TBQAClwCA/+eA4BkFYxqRulAqVJpUCln6SWpK2kpKS7pLKkyaTApN9l1NYYKAt1dBSRlxk4f3hAFFPs6G3qLcptrK2M7W0tTW0trQ3s7izObK6sjuxpcAgP/ngMCstweEQDc3hUCThwcAEweHumPg5xQlNZFFaAiBMwU1t4eEQJOHxwAhZz6XIyD3CLcFgEC3B4BAAUaThwcYk4UFADcKhEAVRSMg+gCXAID/54AgDzcHAGBcRxMFAAI3C4VAk+cXEFzHlwCA/+eA4A23FwlgiF+BRbcKhUBxiWEVEzUVAJcAgP/ngKC1wWf9FxMHABCFZkFmtwUAAQFFkwnLCY1rNwyEQJcAgP/ngKCrk4rKABMKCgDOm5MMzACDp8oI9d+DpMoIhUcjpgoIIwLxAoPHFAAJRyMT4QKjAvECAtRNR2OL5wZRR2OJ5wYpR2Oe5wCDxzQAA8ckAKIH2Y8RR2OV5wCcRJxDPtQNO6FFSBCpMQPHNACDxyQAkWYiB12Pk4cGAWP+5wITBbANlwCA/+eAwJITBcANlwCA/+eAAJITBeAOlwCA/+eAQJHFOb23I6AHAJEHbb3JRyMT8QJ1t4PHFAA1RmOPxyxjYfYQGUZjjsc2Y2L2CA1GY4XHGGNs9gQJRmOAxygBSRME8A8TdfQPaTYTdfkPUTZNMeMQBPKDxxQAPUdji+dEY233NhFHY4TnVBlHY4XnVg1H45Dn8IPFNACDxyQAE4WEAaIF3Y3BFZE05bWRRmOI1ySVRuOV1/rBRwVFYxX3EJxE2EgjJPoAIyLqAHWipUZjgNcmY+/2Ap1GY4zXKKFG45/X9pMHQAJjE/ceAtQdRAFFlwCA/+eAwIMBRd08ETkJOaFFSBB9FCU2ffABSQFEkb+pRmON1yStRuOS1/ThR2Ma9x7cTJhM1EiQSMxEiESXAID/54BgkCqJMzWgACqEFbfRRmOA1w5j7fYExUZjhtcIY+r2Ar1GY4jXFsFG45DX8AVEYx73DJxIEWdja/cmwETMSIhEM4SHAjU8I6wJACOki7DxoMlGY4vXFs1G45jX7MFHBURjFfcKzESIRGU8RaiTBiANY4jXEmPg9gKTBgANY4nXCJMGEA3jktfqoUdjC/cIBUUqhKWokwYwDWOE10STBkAN45TX6INHywljjwcYnERBFwOkSQFjhOcAEwQADIFHkwbwDmPM5w4Dx1QAg8dEAAFJIgddj4PHZADCB12Pg8d0AOIH2Y/jhfbkEwQQDIm1BUQJ73AQgUUBRZfwf//ngEB2CeXRRWgQ1ToBRAFJDbUFRG3/l/B//+eAIHszNKAA9bcDrYQAwESzZ40AE5dHASXz/Tgx/UFpIp19Gf19MwWNQBnoAUWxtzGBl/B//+eAwHkd/W6U5bezdyUB9fdBaTMFjUBjbokAfXkzBY1AedgxgZfwf//ngEB3GflKlPW3QYGX8H//54CAduMTBfAzBCRB+behR+MB9+QBSRMEAAxBu8FHzb/BRwVE4xH39pxIY+/2DsxIiETpMI23M4b0AANGhgGFB7GO9b2DR8sJrc+Dp8kA7eMjDgsIA6RJAT23AUkFRR21kUcFReMU9+qIRIFFl/B//+eAwHipt5N39wDJ/xNdRwAThIQAAUn9XeN1qd1IRJfwf//ngOBcHERYQBRAfY9jh7cBkEKTx/f/8Y9dj5jCBQlBBNm/kUepv4MlSgBBF5HlAc8BSRMEYAzNsYMnigBj5ecGk3c3AJ3/AyiKAAFGgUczBfhAs4b1AGPp5wDjAwbWIyLaACMkqgCpuzOG9AAQTpEHkMIFRum/oUcFReMQ9+ADJIoAGcATBIAMIyQKACMiCgAzNYAA3bMBSRMEIAy1uQFJEwSADJW5AUkTBJAMtbFJR2OJ5xxjYvcERUfjlue4g8c0AAPHJAAThIQBogfZj5ONB/8FSYOnyQBjhQ0AmcNjRCARY1cJGBMHcAwjqukA45wHtJMHkAxZohMHIA1ji+cMEwdADeOR57QDxDQAg8ckACIEXYyX8H//54AgWQOpyQBBFGNzJAEiieMPCbADpEkASpQxgIOnCQFjVvAAg6eJAGNQ9Arv8M/Kdd0DpUkASoaThYQBl/B//+eAoFQJxZMHQAwjqvkAg6dJAMqXI6L5AIOnyQAziSdBI6YpAZfwf//ngOBSybQJZRMFBXEDqcQAgESX8H//54CAQ7cHAGDYS7cGAAHBFpNXRwESB3WPvYvZj7OHJwMBRbPVhwKX8H//54CgRBMFgD6X8H//54AgQJ281EiQSMxEiETv8I//pbTv8G/Fgb+3NoVAA6eGureHhECTh8cAmY8+1oOni7A3PYVAbtATDc0Jk4SGugVIY/P9AA1IQsY6xO/w78EiRzJINwWFQKKFfBCTBswAEBATBUULl/B//+eAAEWCVwMnjbCMQLON/UAdjz6UslcjJO2wKom+lYzAkwfMAJ2NAcWhZ+Oa9eZmhe/wr9MjoJQBnbXjHwnm44kHnJMHgAwjqvkA2bKcROORB5wBRZfwf//ngEA3CWUTBQVxl/B//+eAIDOX8H//54CgN3m6wETjDQSYAUWX8H//54DANBMFgD6X8H//54DAMAKUvbr2UGZU1lRGWbZZJlqWWgZb9ktmTNZMRk22TQlhgoAAAA=="
3+
text_start = 1_082_130_432
4+
data = "DACEQA=="
5+
data_start = 1_082_469_288

espflash/src/flasher/stubs.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub struct FlashStub {
2222
const STUB_32: &str = include_str!("../../resources/stubs/stub_flasher_32.toml");
2323
const STUB_32C2: &str = include_str!("../../resources/stubs/stub_flasher_32c2.toml");
2424
const STUB_32C3: &str = include_str!("../../resources/stubs/stub_flasher_32c3.toml");
25+
const STUB_32C6: &str = include_str!("../../resources/stubs/stub_flasher_32c6.toml");
2526
const STUB_32S2: &str = include_str!("../../resources/stubs/stub_flasher_32s2.toml");
2627
const STUB_32S3: &str = include_str!("../../resources/stubs/stub_flasher_32s3.toml");
2728
const STUB_8266: &str = include_str!("../../resources/stubs/stub_flasher_8266.toml");
@@ -33,6 +34,7 @@ impl FlashStub {
3334
Chip::Esp32 => STUB_32,
3435
Chip::Esp32c2 => STUB_32C2,
3536
Chip::Esp32c3 => STUB_32C3,
37+
Chip::Esp32c6 => STUB_32C6,
3638
Chip::Esp32s2 => STUB_32S2,
3739
Chip::Esp32s3 => STUB_32S3,
3840
Chip::Esp8266 => STUB_8266,

espflash/src/targets/esp32c6.rs

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
use std::ops::Range;
2+
3+
use esp_idf_part::PartitionTable;
4+
5+
use super::{Chip, Esp32Params, ReadEFuse, SpiRegisters, Target};
6+
use crate::{
7+
connection::Connection,
8+
elf::FirmwareImage,
9+
error::Error,
10+
flasher::{FlashFrequency, FlashMode, FlashSize},
11+
image_format::{DirectBootFormat, IdfBootloaderFormat, ImageFormat, ImageFormatKind},
12+
};
13+
14+
const CHIP_DETECT_MAGIC_VALUES: &[u32] = &[0x2CE0_806F];
15+
16+
const FLASH_RANGES: &[Range<u32>] = &[
17+
0x4200_0000..0x4280_0000, // IROM
18+
0x4280_0000..0x4300_0000, // DROM
19+
];
20+
21+
const PARAMS: Esp32Params = Esp32Params::new(
22+
0x0,
23+
0x1_0000,
24+
0x3f_0000,
25+
13,
26+
include_bytes!("../../resources/bootloaders/esp32c6-bootloader.bin"),
27+
);
28+
29+
/// ESP32-C6 Target
30+
pub struct Esp32c6;
31+
32+
impl Esp32c6 {
33+
pub fn has_magic_value(value: u32) -> bool {
34+
CHIP_DETECT_MAGIC_VALUES.contains(&value)
35+
}
36+
}
37+
38+
impl ReadEFuse for Esp32c6 {
39+
fn efuse_reg(&self) -> u32 {
40+
0x600B_0800
41+
}
42+
}
43+
44+
impl Target for Esp32c6 {
45+
fn addr_is_flash(&self, addr: u32) -> bool {
46+
FLASH_RANGES.iter().any(|range| range.contains(&addr))
47+
}
48+
49+
fn chip_features(&self, _connection: &mut Connection) -> Result<Vec<&str>, Error> {
50+
Ok(vec!["WiFi 6", "BT 5"])
51+
}
52+
53+
fn major_chip_version(&self, connection: &mut Connection) -> Result<u32, Error> {
54+
Ok((self.read_efuse(connection, 22)? >> 24) & 0x3)
55+
}
56+
57+
fn minor_chip_version(&self, connection: &mut Connection) -> Result<u32, Error> {
58+
let hi = (self.read_efuse(connection, 22)? >> 23) & 0x1;
59+
let lo = (self.read_efuse(connection, 20)? >> 18) & 0x7;
60+
61+
Ok((hi << 3) + lo)
62+
}
63+
64+
fn crystal_freq(&self, _connection: &mut Connection) -> Result<u32, Error> {
65+
// The ESP32-C6's XTAL has a fixed frequency of 40MHz.
66+
Ok(40)
67+
}
68+
69+
fn get_flash_image<'a>(
70+
&self,
71+
image: &'a dyn FirmwareImage<'a>,
72+
bootloader: Option<Vec<u8>>,
73+
partition_table: Option<PartitionTable>,
74+
image_format: Option<ImageFormatKind>,
75+
_chip_revision: Option<(u32, u32)>,
76+
flash_mode: Option<FlashMode>,
77+
flash_size: Option<FlashSize>,
78+
flash_freq: Option<FlashFrequency>,
79+
) -> Result<Box<dyn ImageFormat<'a> + 'a>, Error> {
80+
let image_format = image_format.unwrap_or(ImageFormatKind::EspBootloader);
81+
82+
match image_format {
83+
ImageFormatKind::EspBootloader => Ok(Box::new(IdfBootloaderFormat::new(
84+
image,
85+
Chip::Esp32c6,
86+
PARAMS,
87+
partition_table,
88+
bootloader,
89+
flash_mode,
90+
flash_size,
91+
flash_freq,
92+
)?)),
93+
ImageFormatKind::DirectBoot => Ok(Box::new(DirectBootFormat::new(image, 0x0)?)),
94+
}
95+
}
96+
97+
fn spi_registers(&self) -> SpiRegisters {
98+
SpiRegisters {
99+
base: 0x6000_3000,
100+
usr_offset: 0x18,
101+
usr1_offset: 0x1c,
102+
usr2_offset: 0x20,
103+
w0_offset: 0x58,
104+
mosi_length_offset: Some(0x24),
105+
miso_length_offset: Some(0x28),
106+
}
107+
}
108+
109+
fn supported_image_formats(&self) -> &[ImageFormatKind] {
110+
&[ImageFormatKind::EspBootloader, ImageFormatKind::DirectBoot]
111+
}
112+
113+
fn supported_build_targets(&self) -> &[&str] {
114+
&[
115+
"riscv32imac-unknown-none-elf",
116+
"riscv32imc-esp-espidf",
117+
"riscv32imc-unknown-none-elf",
118+
]
119+
}
120+
}

espflash/src/targets/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub use self::{
1616
esp32::Esp32,
1717
esp32c2::Esp32c2,
1818
esp32c3::Esp32c3,
19+
esp32c6::Esp32c6,
1920
esp32s2::Esp32s2,
2021
esp32s3::Esp32s3,
2122
esp8266::Esp8266,
@@ -32,6 +33,7 @@ use crate::{
3233
mod esp32;
3334
mod esp32c2;
3435
mod esp32c3;
36+
mod esp32c6;
3537
mod esp32s2;
3638
mod esp32s3;
3739
mod esp8266;
@@ -47,6 +49,8 @@ pub enum Chip {
4749
Esp32c2,
4850
/// ESP32-C3, ESP8685
4951
Esp32c3,
52+
/// ESP32-C6
53+
Esp32c6,
5054
/// ESP32-S2
5155
Esp32s2,
5256
/// ESP32-S3
@@ -65,6 +69,7 @@ impl FromStr for Chip {
6569
"esp32" => Ok(Esp32),
6670
"esp32c2" => Ok(Esp32c2),
6771
"esp32c3" => Ok(Esp32c3),
72+
"esp32c6" => Ok(Esp32c6),
6873
"esp32s2" => Ok(Esp32s2),
6974
"esp32s3" => Ok(Esp32s3),
7075
"esp8266" => Ok(Esp8266),
@@ -81,6 +86,8 @@ impl Chip {
8186
Ok(Chip::Esp32c2)
8287
} else if Esp32c3::has_magic_value(magic) {
8388
Ok(Chip::Esp32c3)
89+
} else if Esp32c6::has_magic_value(magic) {
90+
Ok(Chip::Esp32c6)
8491
} else if Esp32s2::has_magic_value(magic) {
8592
Ok(Chip::Esp32s2)
8693
} else if Esp32s3::has_magic_value(magic) {
@@ -97,6 +104,7 @@ impl Chip {
97104
Chip::Esp32 => Box::new(Esp32),
98105
Chip::Esp32c2 => Box::new(Esp32c2),
99106
Chip::Esp32c3 => Box::new(Esp32c3),
107+
Chip::Esp32c6 => Box::new(Esp32c6),
100108
Chip::Esp32s2 => Box::new(Esp32s2),
101109
Chip::Esp32s3 => Box::new(Esp32s3),
102110
Chip::Esp8266 => Box::new(Esp8266),

0 commit comments

Comments
 (0)