const OFS1_H: u32 = 0xFFFF0000;
const OFS1_L: u32 = 0x00008EC3;
pub struct Ofs1(#[allow(unused)] u32);
trait Lvdas {
const OFS1: u32;
}
pub enum LvdasOn {}
impl Lvdas for LvdasOn {
const OFS1: u32 = 0 << 2;
}
pub enum LvdasOff {}
impl Lvdas for LvdasOff {
const OFS1: u32 = 1 << 2;
}
trait Vdsel {
const OFS1: u32;
}
pub enum Vdsel384 {}
impl Vdsel for Vdsel384 {
const OFS1: u32 = 0b000 << 3;
}
pub enum Vdsel282 {}
impl Vdsel for Vdsel282 {
const OFS1: u32 = 0b001 << 3;
}
pub enum Vdsel251 {}
impl Vdsel for Vdsel251 {
const OFS1: u32 = 0b010 << 3;
}
pub enum Vdsel190 {}
impl Vdsel for Vdsel190 {
const OFS1: u32 = 0b011 << 3;
}
pub enum Vdsel170 {}
impl Vdsel for Vdsel170 {
const OFS1: u32 = 0b100 << 3;
}
trait HocoEnable {
const OFS1: u32;
}
pub enum HocoOn {}
impl HocoEnable for HocoOn {
const OFS1: u32 = 0 << 8;
}
pub enum HocoOff {}
impl HocoEnable for HocoOff {
const OFS1: u32 = 1 << 8;
}
trait HocoFrequency {
const OFS1: u32;
}
pub enum Hoco24Mhz {}
impl HocoFrequency for Hoco24Mhz {
const OFS1: u32 = 0b000 << 12;
}
pub enum Hoco32Mhz {}
impl HocoFrequency for Hoco32Mhz {
const OFS1: u32 = 0b010 << 12;
}
pub enum Hoco48Mhz {}
impl HocoFrequency for Hoco48Mhz {
const OFS1: u32 = 0b100 << 12;
}
pub enum Hoco64Mhz {}
impl HocoFrequency for Hoco64Mhz {
const OFS1: u32 = 0b101 << 12;
}
impl Ofs1 {
#[allow(private_bounds)]
pub const fn new<LVDAS: Lvdas, VDSEL: Vdsel, HOCOEN: HocoEnable, HOCOFR: HocoFrequency>() -> Self
{
Self(OFS1_H | OFS1_L | LVDAS::OFS1 | VDSEL::OFS1 | HOCOEN::OFS1 | HOCOFR::OFS1)
}
pub const fn default() -> Self {
cfg_select! {
feature = "hoco_32mhz" => Self::new::<LvdasOff, Vdsel190, HocoOn, Hoco32Mhz>(),
feature = "hoco_48mhz" => Self::new::<LvdasOff, Vdsel190, HocoOn, Hoco48Mhz>(),
feature = "hoco_64mhz" => Self::new::<LvdasOff, Vdsel190, HocoOn, Hoco64Mhz>(),
}
}
}