#[derive(Debug, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Error {
InvalidIndex,
InvalidPermissions,
}
pub const OTP_DATA_BASE: *const u32 = 0x4013_0000 as *const u32;
pub const OTP_DATA_RAW_BASE: *const u32 = 0x4013_4000 as *const u32;
pub const NUM_PAGES: usize = 64;
pub const NUM_ROWS_PER_PAGE: usize = 64;
pub const NUM_ROWS: usize = NUM_PAGES * NUM_ROWS_PER_PAGE;
pub fn read_ecc_word(row: usize) -> Result<u16, Error> {
if row >= NUM_ROWS {
return Err(Error::InvalidIndex);
}
let _ = read_raw_word(row)?;
let offset = row >> 1;
let value = unsafe { OTP_DATA_BASE.add(offset).read() };
if (row & 1) == 0 {
Ok(value as u16)
} else {
Ok((value >> 16) as u16)
}
}
pub fn read_raw_word(row: usize) -> Result<u32, Error> {
if row >= NUM_ROWS {
return Err(Error::InvalidIndex);
}
let value = unsafe { OTP_DATA_RAW_BASE.add(row).read() };
if value == 0xFFFF_FFFF {
Err(Error::InvalidPermissions)
} else {
Ok(value)
}
}