esp-hal/esp-hal-common/src/soc/esp32c6/efuse.rs
Kayo Phoenix c6bdf8b8c0
Unified efuse field access (#567)
* Add efuse field tables from IDF

* Add efuse fields constants generator

* Fix MAC field in efuse tables

* Add common efuse field impl

* Add efuse fields support for chips

* Add efuse changes to changelog
2023-06-05 06:15:00 -07:00

75 lines
1.9 KiB
Rust

//! Reading of eFuses
use crate::peripherals::EFUSE;
pub use crate::soc::efuse_field::*;
pub struct Efuse;
impl Efuse {
/// Reads chip's MAC address from the eFuse storage.
///
/// # Example
///
/// ```
/// let mac_address = Efuse::get_mac_address();
/// writeln!(
/// serial_tx,
/// "MAC: {:#X}:{:#X}:{:#X}:{:#X}:{:#X}:{:#X}",
/// mac_address[0],
/// mac_address[1],
/// mac_address[2],
/// mac_address[3],
/// mac_address[4],
/// mac_address[5]
/// );
/// ```
pub fn get_mac_address() -> [u8; 6] {
Self::read_field_be(MAC_FACTORY)
}
/// Get status of SPI boot encryption.
pub fn get_flash_encryption() -> bool {
(Self::read_field_le::<u8>(SPI_BOOT_CRYPT_CNT).count_ones() % 2) != 0
}
/// Get the multiplier for the timeout value of the RWDT STAGE 0 register.
pub fn get_rwdt_multiplier() -> u8 {
Self::read_field_le::<u8>(WDT_DELAY_SEL)
}
}
#[derive(Copy, Clone)]
pub(crate) enum EfuseBlock {
Block0,
Block1,
Block2,
Block3,
Block4,
Block5,
Block6,
Block7,
Block8,
Block9,
Block10,
}
impl EfuseBlock {
pub(crate) fn address(self) -> *const u32 {
use EfuseBlock::*;
let efuse = unsafe { &*EFUSE::ptr() };
match self {
Block0 => efuse.rd_wr_dis.as_ptr(),
Block1 => efuse.rd_mac_spi_sys_0.as_ptr(),
Block2 => efuse.rd_sys_part1_data0.as_ptr(),
Block3 => efuse.rd_usr_data0.as_ptr(),
Block4 => efuse.rd_key0_data0.as_ptr(),
Block5 => efuse.rd_key1_data0.as_ptr(),
Block6 => efuse.rd_key2_data0.as_ptr(),
Block7 => efuse.rd_key3_data0.as_ptr(),
Block8 => efuse.rd_key4_data0.as_ptr(),
Block9 => efuse.rd_key5_data0.as_ptr(),
Block10 => efuse.rd_sys_part2_data0.as_ptr(),
}
}
}