use crate::{command::WriteCommand, instr::Instr};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct NvmLoadControl {
vs_en: SourceVoltageLoad,
id_en: IdLoad,
nrdtime: NvmLoadControlByTimer,
nrdslp: NvmLoadControlBySleepOut,
}
impl NvmLoadControl {
pub const DEFAULT: Self = Self {
vs_en: SourceVoltageLoad::Enable,
id_en: IdLoad::Enable,
nrdtime: NvmLoadControlByTimer::NotTrigger,
nrdslp: NvmLoadControlBySleepOut::NotTrigger,
};
#[must_use]
pub const fn with_source_voltage_load(mut self, v: SourceVoltageLoad) -> Self {
self.vs_en = v;
self
}
#[must_use]
pub const fn with_id_load(mut self, v: IdLoad) -> Self {
self.id_en = v;
self
}
#[must_use]
pub const fn with_control_by_timer(mut self, v: NvmLoadControlByTimer) -> Self {
self.nrdtime = v;
self
}
#[must_use]
pub const fn with_control_by_sleep_out(mut self, v: NvmLoadControlBySleepOut) -> Self {
self.nrdslp = v;
self
}
const fn bytes(&self) -> [u8; 2] {
[
0x17 & !(0b11 << 1) | (self.vs_en as u8) << 2 | (self.id_en as u8) << 1,
(self.nrdtime as u8) << 2 | (self.nrdslp as u8) << 1,
]
}
}
impl Default for NvmLoadControl {
fn default() -> Self {
Self::DEFAULT
}
}
impl WriteCommand for NvmLoadControl {
const OPCODE: Instr = Instr::NVMLOADCTRL;
type Params = [u8; 2];
fn params(&self) -> Self::Params {
self.bytes()
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SourceVoltageLoad {
Disable = 0,
Enable = 1,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum IdLoad {
Disable = 0,
Enable = 1,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NvmLoadControlByTimer {
NotTrigger = 0,
Trigger = 1,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NvmLoadControlBySleepOut {
NotTrigger = 0,
Trigger = 1,
}
const _: () = assert!(matches!(NvmLoadControl::DEFAULT.bytes(), [0x17, 0x00]));
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct NvmWrRdControl {
prog: ProgramMode,
rd: ReadMode,
}
impl NvmWrRdControl {
pub const DEFAULT: Self = Self {
prog: ProgramMode::Disable,
rd: ReadMode::Disable,
};
#[cfg(feature = "nvm-program")]
#[must_use]
pub const fn with_program_mode(mut self, v: ProgramMode) -> Self {
self.prog = v;
self
}
#[must_use]
pub const fn with_read_mode(mut self, v: ReadMode) -> Self {
self.rd = v;
self
}
const fn bytes(&self) -> [u8; 4] {
[
0x5A,
0x69,
0xEE,
(self.prog as u8) << 2 | (self.rd as u8) << 1,
]
}
}
impl Default for NvmWrRdControl {
fn default() -> Self {
Self::DEFAULT
}
}
impl WriteCommand for NvmWrRdControl {
const OPCODE: Instr = Instr::NVMCTRL1;
type Params = [u8; 4];
fn params(&self) -> Self::Params {
self.bytes()
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ProgramMode {
Disable = 0,
Enable = 1,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ReadMode {
Disable = 0,
Enable = 1,
}
const _: () = assert!(matches!(
NvmWrRdControl::DEFAULT.bytes(),
[0x5A, 0x69, 0xEE, 0x00]
));
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct NvmReadEnable;
impl NvmReadEnable {
const fn bytes(&self) -> [u8; 2] {
[0x4A, 0xA5]
}
}
impl WriteCommand for NvmReadEnable {
const OPCODE: Instr = Instr::NVMRDEN;
type Params = [u8; 2];
fn params(&self) -> Self::Params {
self.bytes()
}
}
const _: () = assert!(matches!(NvmReadEnable.bytes(), [0x4A, 0xA5]));
#[cfg(feature = "nvm-program")]
mod program;
#[cfg(feature = "nvm-program")]
pub use program::*;