#ethernet #switch #phy #miim #smi

ksz8863

KSZ8863 以太网交换机驱动程序

3 个不稳定版本

0.2.0 2020年12月27日
0.1.1 2020年12月22日
0.1.0 2020年12月22日

#531硬件支持

MIT/Apache

75KB
1.5K SLoC

ksz8863 Actions状态 Crates.io Crates.io docs.rs

KSZ8863 (MLL/FLL/RLL) 以太网交换机驱动程序。

此驱动程序分为两个主要模块

  • miim 用于MII管理接口 (MIIM)。
  • smi 用于串行管理接口 (SMI)。

虽然这两个术语通常指代相同的协议,但在KSZ8863文档中,它们的用法指的是两个不同的协议和寄存器集。请参阅数据表以获取详细信息。

这些模块包含每个文档化寄存器的类型和模块,以及它们各自字段的类型化访问。通过 MiimSmi 类型分别提供对这些寄存器的高层读写/修改访问。

请注意,目前不支持SPI和I2C接口,尽管欢迎提交相关PR。

使用方法

在此crate的基础是 miim::{Read, Write}smi::{Read, Write} 特性。第一步是为您的相应MIIM和SMI接口实现这些特性。有关如何实现的详细信息,请参阅数据表的第 3.3.103.3.11 部分。

实现这些特性可以通过 SmiMiim 接口类型包装器获得高级访问权限。这些类型提供了简化的方法来读取、写入和修改寄存器及其各个字段。为这些类型提供的API受到了 svd2rust 包的启发。

以下是一个使用 Miim 的示例。

use ksz8863::{miim, Miim};

fn main() {
    // ... Setup our device and `miim_iface`...

    // Wrap the type that impls the Read/Write traits with `Miim`.
    // Note: We could also wrap `&mut miim_iface` here if we only local scope access is needed.
    let mut miim = Miim(miim_iface);

    // Specify which phy we want to communicate with via its PHY address.
    let mut phy = miim.phy(0);

    // Read the value of the "Basic Control Register".
    assert_eq!(phy.bcr().read().unwrap(), miim::Bcr::default());

    // Modify the "Force 100BT" field of the "Basic Control Register" in place.
    let mut bcr = phy.bcr();
    assert!(bcr.read().unwrap().read().force_fd().bit_is_clear());
    bcr.modify(|w| w.force_fd().set_bit()).unwrap();
    let reg = bcr.read().unwrap();
    assert!(reg != miim::Bcr::default());
    assert!(reg.read().force_fd().bit_is_set());
}

Smi API 类似,但我们不需要指定PHY。

use ksz8863::{smi, Smi};

fn main() {
    // ... Setup our device and `smi_iface`...

    let mut smi = Smi(smi_iface);
    assert_eq!(smi.gc1().read().unwrap(), smi::Gc1::default());
    smi.gc1().modify(|w| w.tx_flow_control().clear_bit()).unwrap();
    assert!(smi.gc1().read().unwrap() != smi::Gc1::default());
}

附加功能

每个模块中的 Address 类型代表寄存器所在的唯一索引。

每个模块的 State 类型是寄存器状态的动态表示,适用于在集合中存储多个寄存器的状态。

每个模块的 Map 类型是一个保证包含所有寄存器状态的集合。这在远程监控寄存器状态、减少I/O以及在您无法访问MIIM/SMI接口的情况下模拟MIIM/SMI接口时非常有用。

功能

  • hash-32 提供了来自 hash32 包的 Hash 实现。
  • serde 提供了 DeserializeSerialize 实现。
  • ufmt 提供了 uDebug 实现。

所有这些功能都是 可选的,默认情况下是禁用的。

依赖关系

~1MB
~28K SLoC