esp32 work

This commit is contained in:
Robin Appelman
2020-09-04 23:16:06 +02:00
parent 29c6cb8034
commit e36d5a8a15
6 changed files with 93 additions and 16 deletions

72
Cargo.lock generated
View File

@@ -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"

View File

@@ -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"

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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.