From d511a57bff0259964ce29b6f93b3c42eef2e0372 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 24 Feb 2020 10:23:36 -0700 Subject: [PATCH] Add firmware struct to tool --- tool/src/firmware.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++ tool/src/lib.rs | 3 +++ 2 files changed, 51 insertions(+) create mode 100644 tool/src/firmware.rs diff --git a/tool/src/firmware.rs b/tool/src/firmware.rs new file mode 100644 index 0000000..7b91b14 --- /dev/null +++ b/tool/src/firmware.rs @@ -0,0 +1,48 @@ +pub struct Firmware<'a> { + pub board: &'a [u8], + pub version: &'a [u8], + pub data: &'a [u8], +} + +fn firmware_str<'a>(data: &'a [u8], key: &[u8]) -> Option<&'a [u8]> { + let mut data_i = 0; + + //First, locate the key + let mut key_i = 0; + while data_i < data.len() && key_i < key.len() { + if data[data_i] == key[key_i] { + key_i += 1; + } else { + key_i = 0; + } + data_i += 1; + } + + // Return None if key not found + if key_i < key.len() { + return None; + } + + // Locate end of data + let start = data_i; + while data_i < data.len() { + if data[data_i] == 0 { + break; + } + data_i += 1; + } + + Some(&data[start..data_i]) +} + +impl<'a> Firmware<'a> { + pub fn new(data: &'a [u8]) -> Option { + let board = firmware_str(data, b"76EC_BOARD=")?; + let version = firmware_str(data, b"76EC_VERSION=")?; + Some(Self { + data, + board, + version, + }) + } +} diff --git a/tool/src/lib.rs b/tool/src/lib.rs index b0d5a2d..da6dcd5 100644 --- a/tool/src/lib.rs +++ b/tool/src/lib.rs @@ -6,6 +6,9 @@ mod ec; pub use self::error::Error; mod error; +pub use self::firmware::Firmware; +mod firmware; + pub use self::pmc::Pmc; mod pmc;