pub use self::fields::*;
use crate::{adc::Attenuation, peripherals::EFUSE};
mod fields;
pub struct Efuse;
impl Efuse {
pub fn read_base_mac_address() -> [u8; 6] {
Self::read_field_be(MAC)
}
pub fn get_flash_encryption() -> bool {
(Self::read_field_le::<u8>(SPI_BOOT_CRYPT_CNT).count_ones() % 2) != 0
}
pub fn get_rwdt_multiplier() -> u8 {
Self::read_field_le::<u8>(WDT_DELAY_SEL)
}
pub fn get_block_version() -> (u8, u8) {
(
Self::read_field_le::<u8>(BLK_VERSION_MAJOR),
Self::read_field_le::<u8>(BLK_VERSION_MINOR),
)
}
pub fn get_rtc_calib_version() -> u8 {
let (major, _minor) = Self::get_block_version();
if major == 1 {
1
} else {
0
}
}
pub fn get_rtc_calib_init_code(_unit: u8, atten: Attenuation) -> Option<u16> {
let version = Self::get_rtc_calib_version();
if version != 1 {
return None;
}
let init_code: u16 = Self::read_field_le(match atten {
Attenuation::Attenuation0dB => ADC1_INIT_CODE_ATTEN0,
Attenuation::Attenuation2p5dB => ADC1_INIT_CODE_ATTEN1,
Attenuation::Attenuation6dB => ADC1_INIT_CODE_ATTEN2,
Attenuation::Attenuation11dB => ADC1_INIT_CODE_ATTEN3,
});
Some(init_code + 1000) }
pub fn get_rtc_calib_cal_mv(_unit: u8, atten: Attenuation) -> u16 {
match atten {
Attenuation::Attenuation0dB => 400,
Attenuation::Attenuation2p5dB => 550,
Attenuation::Attenuation6dB => 750,
Attenuation::Attenuation11dB => 1370,
}
}
pub fn get_rtc_calib_cal_code(_unit: u8, atten: Attenuation) -> Option<u16> {
let version = Self::get_rtc_calib_version();
if version != 1 {
return None;
}
let cal_code: u16 = Self::read_field_le(match atten {
Attenuation::Attenuation0dB => ADC1_CAL_VOL_ATTEN0,
Attenuation::Attenuation2p5dB => ADC1_CAL_VOL_ATTEN1,
Attenuation::Attenuation6dB => ADC1_CAL_VOL_ATTEN2,
Attenuation::Attenuation11dB => ADC1_CAL_VOL_ATTEN3,
});
let cal_code = if cal_code & (1 << 9) != 0 {
2000 - (cal_code & !(1 << 9))
} else {
2000 + cal_code
};
Some(cal_code)
}
}
#[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(),
}
}
}