#[derive(Debug, Clone)]
pub struct EmacConfig {
pub clock: RmiiClockConfig,
pub pins: RmiiPins,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum RmiiClockConfig {
InternalApll {
gpio: ClkGpio,
xtal: XtalFreq,
},
External {
gpio: ClkGpio,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum XtalFreq {
Mhz26,
Mhz32,
Mhz40,
}
impl XtalFreq {
pub const fn mhz(self) -> u32 {
match self {
Self::Mhz26 => 26,
Self::Mhz32 => 32,
Self::Mhz40 => 40,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ClkGpio {
Gpio0,
Gpio16,
Gpio17,
}
impl ClkGpio {
pub const fn gpio_num(self) -> u8 {
match self {
ClkGpio::Gpio0 => 0,
ClkGpio::Gpio16 => 16,
ClkGpio::Gpio17 => 17,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct RmiiPins {
pub mdc: u8,
pub mdio: u8,
}
impl Default for RmiiPins {
fn default() -> Self {
Self { mdc: 23, mdio: 18 }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn clk_gpio_num() {
assert_eq!(ClkGpio::Gpio0.gpio_num(), 0);
assert_eq!(ClkGpio::Gpio16.gpio_num(), 16);
assert_eq!(ClkGpio::Gpio17.gpio_num(), 17);
}
#[test]
fn rmii_pins_default() {
let pins = RmiiPins::default();
assert_eq!(pins.mdc, 23);
assert_eq!(pins.mdio, 18);
}
#[test]
fn rmii_clock_config_equality() {
let a = RmiiClockConfig::InternalApll {
gpio: ClkGpio::Gpio17,
xtal: XtalFreq::Mhz40,
};
let b = RmiiClockConfig::InternalApll {
gpio: ClkGpio::Gpio17,
xtal: XtalFreq::Mhz40,
};
let c = RmiiClockConfig::External {
gpio: ClkGpio::Gpio0,
};
let d = RmiiClockConfig::InternalApll {
gpio: ClkGpio::Gpio17,
xtal: XtalFreq::Mhz26,
};
assert_eq!(a, b);
assert_ne!(a, c);
assert_ne!(a, d);
}
#[test]
fn xtal_freq_mhz_values() {
assert_eq!(XtalFreq::Mhz26.mhz(), 26);
assert_eq!(XtalFreq::Mhz32.mhz(), 32);
assert_eq!(XtalFreq::Mhz40.mhz(), 40);
}
#[test]
fn emac_config_clone() {
let config = EmacConfig {
clock: RmiiClockConfig::InternalApll {
gpio: ClkGpio::Gpio17,
xtal: XtalFreq::Mhz40,
},
pins: RmiiPins::default(),
};
let cloned = config.clone();
assert_eq!(cloned.pins.mdc, 23);
}
}