use crate::{EmacConfig, Lan8720a, PhyInterface, RmiiClockMode};
pub struct Wt32Eth01;
impl Wt32Eth01 {
pub const PHY_ADDR: u8 = 1;
pub const PHY_ID: u32 = 0x0007_C0F0;
pub const PHY_ID_MASK: u32 = 0xFFFF_FFF0;
pub const MDC_GPIO: u8 = 23;
pub const MDIO_GPIO: u8 = 18;
pub const REF_CLK_GPIO: u8 = 0;
pub const CLK_EN_GPIO: u8 = 16;
pub const REF_CLK_HZ: u32 = 50_000_000;
pub const TXD0_GPIO: u8 = 19;
pub const TXD1_GPIO: u8 = 22;
pub const TX_EN_GPIO: u8 = 21;
pub const RXD0_GPIO: u8 = 25;
pub const RXD1_GPIO: u8 = 26;
pub const CRS_DV_GPIO: u8 = 27;
pub const PHY_RST_GPIO: Option<u8> = None;
pub const OSC_STARTUP_MS: u32 = 10;
pub const PHY_RESET_MS: u32 = 50;
pub const BOARD_NAME: &'static str = "WT32-ETH01";
pub const MANUFACTURER: &'static str = "Wireless-Tag";
pub const MODULE: &'static str = "WT32-S1";
#[inline]
pub const fn is_valid_phy_id(id: u32) -> bool {
(id & Self::PHY_ID_MASK) == Self::PHY_ID
}
#[must_use]
pub const fn emac_config() -> EmacConfig {
EmacConfig::rmii_esp32_default()
.with_phy_interface(PhyInterface::Rmii)
.with_rmii_clock(RmiiClockMode::ExternalInput {
gpio: Self::REF_CLK_GPIO,
})
}
#[must_use]
pub const fn emac_config_with_mac(mac: [u8; 6]) -> EmacConfig {
Self::emac_config().with_mac_address(mac)
}
#[must_use]
pub const fn lan8720a() -> Lan8720a {
Lan8720a::new(Self::PHY_ADDR)
}
#[must_use]
pub const fn description() -> &'static str {
"WT32-ETH01: ESP32 + LAN8720A Ethernet (RMII, 50MHz external clock, PHY addr 1)"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn phy_id_validation() {
assert!(Wt32Eth01::is_valid_phy_id(0x0007_C0F0));
assert!(Wt32Eth01::is_valid_phy_id(0x0007_C0F1));
assert!(Wt32Eth01::is_valid_phy_id(0x0007_C0FF));
assert!(!Wt32Eth01::is_valid_phy_id(0x0022_1556));
}
#[test]
fn pin_assignments_match_board() {
assert_eq!(Wt32Eth01::PHY_ADDR, 1);
assert_eq!(Wt32Eth01::CLK_EN_GPIO, 16);
assert_eq!(Wt32Eth01::REF_CLK_GPIO, 0);
assert_eq!(Wt32Eth01::MDC_GPIO, 23);
assert_eq!(Wt32Eth01::MDIO_GPIO, 18);
}
}