zynq-rs/src/eth/phy/id.rs

29 lines
679 B
Rust
Raw Normal View History

2019-06-19 06:21:17 +08:00
use bit_field::BitField;
use super::PhyAccess;
#[derive(Clone, Debug)]
pub struct PhyIdentifier {
pub oui: u32,
pub model: u8,
pub rev: u8,
}
pub fn identify_phy<PA: PhyAccess>(pa: &mut PA, addr: u8) -> Option<PhyIdentifier> {
let id1 = pa.read_phy(addr, 2);
let id2 = pa.read_phy(addr, 3);
if id1 != 0xFFFF || id2 != 0xFFFF {
let mut oui = 0;
oui.set_bits(6..=21, id1.get_bits(0..=15).into());
oui.set_bits(0..=5, id2.get_bits(10..=15).into());
Some(PhyIdentifier {
oui,
model: id2.get_bits(4..=9) as u8,
rev: id2.get_bits(0..=3) as u8,
})
} else {
None
}
}