use super::types::{Capacity, FlashType, JedecId};
#[derive(Debug, Clone)]
pub struct ChipSpec {
pub name: String,
pub manufacturer: String,
pub jedec_id: JedecId,
pub flash_type: FlashType,
pub capacity: Capacity,
pub layout: ChipLayout,
pub capabilities: ChipCapabilities,
pub otp: Option<OtpLayout>,
}
#[derive(Debug, Clone, Copy)]
pub struct ChipLayout {
pub page_size: u32,
pub block_size: u32,
pub oob_size: Option<u32>,
pub is_dataflash: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct OtpLayout {
pub region_count: u32,
pub region_size: u32,
pub enter_opcode: u8,
pub exit_opcode: u8,
}
impl ChipLayout {
pub fn pages_per_block(&self) -> u32 {
self.block_size / self.page_size
}
pub fn total_pages(&self, capacity: Capacity) -> u32 {
capacity.as_bytes() / self.page_size
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct ChipCapabilities {
pub supports_ecc_control: bool,
pub supports_4byte_addr: bool,
pub supports_quad_spi: bool,
pub supports_dual_spi: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BlockStatus {
Bad,
Reserved,
Unknown,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::domain::types::Capacity;
#[test]
fn test_chip_layout_calculations() {
let layout = ChipLayout {
page_size: 2048,
block_size: 128 * 1024, oob_size: Some(64),
is_dataflash: false,
};
assert_eq!(layout.pages_per_block(), 64);
let capacity = Capacity::megabytes(128);
assert_eq!(layout.total_pages(capacity), 65536);
}
}