3 个不稳定版本
0.2.0 | 2020年12月27日 |
---|---|
0.1.1 | 2020年12月22日 |
0.1.0 | 2020年12月22日 |
#531 在 硬件支持
75KB
1.5K SLoC
ksz8863
KSZ8863 (MLL/FLL/RLL) 以太网交换机驱动程序。
此驱动程序分为两个主要模块
miim
用于MII管理接口 (MIIM)。smi
用于串行管理接口 (SMI)。
虽然这两个术语通常指代相同的协议,但在KSZ8863文档中,它们的用法指的是两个不同的协议和寄存器集。请参阅数据表以获取详细信息。
这些模块包含每个文档化寄存器的类型和模块,以及它们各自字段的类型化访问。通过 Miim
和 Smi
类型分别提供对这些寄存器的高层读写/修改访问。
请注意,目前不支持SPI和I2C接口,尽管欢迎提交相关PR。
使用方法
在此crate的基础是 miim::{Read, Write}
和 smi::{Read, Write}
特性。第一步是为您的相应MIIM和SMI接口实现这些特性。有关如何实现的详细信息,请参阅数据表的第 3.3.10
和 3.3.11
部分。
实现这些特性可以通过 Smi
和 Miim
接口类型包装器获得高级访问权限。这些类型提供了简化的方法来读取、写入和修改寄存器及其各个字段。为这些类型提供的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
提供了Deserialize
和Serialize
实现。ufmt
提供了uDebug
实现。
所有这些功能都是 可选的,默认情况下是禁用的。
依赖关系
~1MB
~28K SLoC