mirror of
https://github.com/esp-rs/espflash.git
synced 2026-03-23 15:50:21 +00:00
esp32 work
This commit is contained in:
72
Cargo.lock
generated
72
Cargo.lock
generated
@@ -29,6 +29,15 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
|
||||
dependencies = [
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.4.0"
|
||||
@@ -49,6 +58,18 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
|
||||
[[package]]
|
||||
name = "cpuid-bool"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"
|
||||
|
||||
[[package]]
|
||||
name = "ctor"
|
||||
version = "0.1.15"
|
||||
@@ -65,6 +86,15 @@ version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
|
||||
|
||||
[[package]]
|
||||
name = "digest"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
|
||||
dependencies = [
|
||||
"generic-array",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "espflash"
|
||||
version = "0.1.0"
|
||||
@@ -75,11 +105,22 @@ dependencies = [
|
||||
"pico-args",
|
||||
"pretty_assertions",
|
||||
"serial",
|
||||
"sha2",
|
||||
"slip-codec",
|
||||
"thiserror",
|
||||
"xmas-elf",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ioctl-rs"
|
||||
version = "0.1.6"
|
||||
@@ -101,6 +142,12 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb63bb1e282e0b6aba0addb1f0e87cb5181ea68142b2dfd21ba108f8e8088a64"
|
||||
|
||||
[[package]]
|
||||
name = "opaque-debug"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
|
||||
|
||||
[[package]]
|
||||
name = "output_vt100"
|
||||
version = "0.1.2"
|
||||
@@ -188,6 +235,19 @@ dependencies = [
|
||||
"serial-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2933378ddfeda7ea26f48c555bdad8bb446bf8a3d17832dc83e380d444cfb8c1"
|
||||
dependencies = [
|
||||
"block-buffer",
|
||||
"cfg-if",
|
||||
"cpuid-bool",
|
||||
"digest",
|
||||
"opaque-debug",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slip-codec"
|
||||
version = "0.1.2"
|
||||
@@ -234,12 +294,24 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
|
||||
@@ -21,6 +21,7 @@ thiserror = "1.0.20"
|
||||
pico-args = "0.3.4"
|
||||
main_error = "0.1.1"
|
||||
binread = "1.1.1"
|
||||
sha2 = "0.9.1"
|
||||
|
||||
[dev-dependencies]
|
||||
pretty_assertions = "0.6.1"
|
||||
@@ -3,6 +3,7 @@ use crate::elf::{update_checksum, CodeSegment, FirmwareImage, RomSegment, ESP_CH
|
||||
use crate::Error;
|
||||
use bytemuck::__core::iter::once;
|
||||
use bytemuck::{bytes_of, Pod, Zeroable};
|
||||
use sha2::{Digest, Sha256};
|
||||
use std::borrow::Cow;
|
||||
use std::io::Write;
|
||||
|
||||
@@ -67,6 +68,8 @@ impl ChipType for ESP32 {
|
||||
|
||||
let mut checksum = ESP_CHECKSUM_MAGIC;
|
||||
|
||||
let _ = image.segments().collect::<Vec<_>>();
|
||||
|
||||
let flash_segments = image.rom_segments(Chip::Esp32);
|
||||
let mut ram_segments = image.ram_segments(Chip::Esp32);
|
||||
|
||||
@@ -78,6 +81,7 @@ impl ChipType for ESP32 {
|
||||
if pad_len > 0 {
|
||||
if pad_len > SEG_HEADER_LEN {
|
||||
if let Some(ram_segment) = ram_segments.next() {
|
||||
println!("ram addr: {:#x}, len: {:#x}", segment.addr, segment.size);
|
||||
checksum = save_segment(&mut data, &ram_segment, checksum)?;
|
||||
segment_count += 1;
|
||||
continue;
|
||||
@@ -101,7 +105,6 @@ impl ChipType for ESP32 {
|
||||
}
|
||||
|
||||
for segment in ram_segments {
|
||||
println!("addr: {:#x}, len: {:#x}", segment.addr, segment.size);
|
||||
checksum = save_segment(&mut data, &segment, checksum)?;
|
||||
segment_count += 1;
|
||||
}
|
||||
@@ -114,7 +117,11 @@ impl ChipType for ESP32 {
|
||||
|
||||
// since we added some dummy segments, we need to patch the segment count
|
||||
data[1] = segment_count as u8;
|
||||
dbg!(segment_count);
|
||||
|
||||
let mut hasher = Sha256::new();
|
||||
hasher.update(&data);
|
||||
let hash = hasher.finalize();
|
||||
data.write(&hash)?;
|
||||
|
||||
Ok(RomSegment {
|
||||
addr: 0x1000,
|
||||
@@ -129,8 +136,12 @@ impl ChipType for ESP32 {
|
||||
const IROM_ALIGN: u32 = 65536;
|
||||
const SEG_HEADER_LEN: u32 = 8;
|
||||
|
||||
/// Actual alignment (in data bytes) required for a segment header: positioned so that
|
||||
/// after we write the next 8 byte header, file_offs % IROM_ALIGN == segment.addr % IROM_ALIGN
|
||||
///
|
||||
/// (this is because the segment's vaddr may not be IROM_ALIGNed, more likely is aligned
|
||||
/// IROM_ALIGN+0x18 to account for the binary file header
|
||||
fn get_segment_padding(offset: usize, segment: &CodeSegment) -> u32 {
|
||||
println!("addr: {:#x}", segment.addr);
|
||||
let align_past = (segment.addr % IROM_ALIGN) - SEG_HEADER_LEN;
|
||||
let pad_len = (IROM_ALIGN - ((offset as u32) % IROM_ALIGN)) + align_past;
|
||||
if pad_len == 0 || pad_len == IROM_ALIGN {
|
||||
@@ -183,14 +194,12 @@ fn save_segment(data: &mut Vec<u8>, segment: &CodeSegment, checksum: u8) -> Resu
|
||||
#[test]
|
||||
fn test_esp32_rom() {
|
||||
use bytemuck::from_bytes;
|
||||
|
||||
use pretty_assertions::assert_eq;
|
||||
use std::fs::read;
|
||||
|
||||
let input_bytes = read("./tests/data/esp32").unwrap();
|
||||
let expected_bin = read("./tests/data/esp32.bin").unwrap();
|
||||
|
||||
dbg!(from_bytes::<ESPCommonHeader>(&expected_bin[0..8]));
|
||||
|
||||
let image = FirmwareImage::from_data(&input_bytes).unwrap();
|
||||
|
||||
let segments = ESP32::get_flash_segments(&image)
|
||||
@@ -200,5 +209,5 @@ fn test_esp32_rom() {
|
||||
assert_eq!(1, segments.len());
|
||||
let buff = segments[0].data.as_ref();
|
||||
assert_eq!(expected_bin.len(), buff.len());
|
||||
assert_eq!(expected_bin.as_slice(), buff);
|
||||
assert_eq!(&expected_bin.as_slice(), &buff);
|
||||
}
|
||||
|
||||
@@ -88,9 +88,8 @@ impl ChipType for ESP8266 {
|
||||
|
||||
#[test]
|
||||
fn test_esp8266_rom() {
|
||||
use std::fs::read;
|
||||
|
||||
use pretty_assertions::assert_eq;
|
||||
use std::fs::read;
|
||||
|
||||
let input_bytes = read("./tests/data/esp8266").unwrap();
|
||||
let expected_bin = read("./tests/data/esp8266.bin").unwrap();
|
||||
|
||||
10
src/elf.rs
10
src/elf.rs
@@ -65,14 +65,10 @@ impl<'a> FirmwareImage<'a> {
|
||||
pub fn segments(&'a self) -> impl Iterator<Item = CodeSegment<'a>> + 'a {
|
||||
self.elf
|
||||
.program_iter()
|
||||
.filter(|section| {
|
||||
section.file_size() > 0
|
||||
&& section.get_type() == Ok(Type::Load)
|
||||
&& section.flags().is_execute()
|
||||
})
|
||||
.filter(|header| header.file_size() > 0 && header.get_type() == Ok(Type::Load))
|
||||
.flat_map(move |header| {
|
||||
let addr = header.physical_addr() as u32;
|
||||
let size = header.mem_size() as u32;
|
||||
let addr = header.virtual_addr() as u32;
|
||||
let size = header.file_size() as u32;
|
||||
let data = match header.get_data(&self.elf) {
|
||||
Ok(SegmentData::Undefined(data)) => data,
|
||||
_ => return None,
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user