PHY 接口适配
软件架构
Ameba 以太网模块集成了轻量级 TCP/IP 协议栈(LwIP)和 MAC 驱动,其架构和 OSI、TCP/IP 模型的对应关系如下图所示:
以太网软件架构
SDK 已实现 L2 层的 MAC 驱动和 RMII 接口操作,并提供 L1 层的 RTL8201F 驱动。
适配步骤
若用户适配其他 PHY 芯片,需要实现 eth_phy_ops 接口表,并定义相应的设备实例。
实现 PHY 操作函数表
用户需要根据目标 PHY 芯片的数据手册 (Datasheet),实现 struct eth_phy_ops 中定义的关键函数。
备注
PHY 标准寄存器的定义,可参考
ameba_phy.h文件。PHY 芯片私有的寄存器定义,可直接定义在自定义的
ameba_phy_custom.c文件中,并将其添加到 CMakeLists.txt。
以 RTL8201F 芯片为例,必要接口如下:
OPS 成员 |
对应实现函数 |
功能说明 |
必要性说明 |
|---|---|---|---|
|
|
初始化与 ID 校验 读取 PHY ID 寄存器并与 |
防止驱动匹配错误的硬件;确保 PHY 芯片已上电且 MDIO 通信正常。 |
|
|
软复位 写入 BMCR 复位位,并延时等待硬件稳定。 |
确保 PHY 处于已知的初始状态,清除之前的错误配置或状态。 |
|
|
参考时钟配置 切换 Page 7 设置 RMII 时钟方向(输入/输出)。 |
RMII 接口的 MAC 与 PHY 必须共用 50MHz 参考时钟,方向配置错误会导致物理链路无法建立。 |
|
|
链路参数配置 配置自协商(Auto-Neg)通告能力,或强制设置速率与双工模式。 |
决定 PHY 如何与对端交换机/路由器建立连接。未实现此接口会导致无法设置 10M/100M 或双工模式。 |
定义 MDIO 总线接口与 PHY 实例
定义 MDIO 总线读写接口,并创建 eth_phy_dev 实例。在此处指定 PHY 的物理地址(Address)。
// 1. 定义 MDIO 总线操作接口
// 通常直接使用 SDK 提供的底层读写函数
const struct eth_mdio_ops eth_mdio_bus_default = {
.mdio_read = Ethernet_ReadPhyReg,
.mdio_write = Ethernet_WritePhyReg,
};
// 2. 定义 PHY 设备实例
struct eth_phy_dev eth_phy_dev_custom = {
.bus = ð_mdio_bus_default, // 绑定总线接口
.addr = 0x01, // 【重要】PHY 地址,需与硬件原理图一致
.ops = &custom_phy_ops, // 绑定上文实现的 PHY 操作表
};
注册并初始化
调用 Ethernet_StructInit() 填写句柄的默认配置并绑定自定义 PHY。以下只是配置片段,不是完整的硬件初始化:
void User_Ethernet_Config(ETH_InitTypeDef *eth_handle)
{
Ethernet_StructInit(eth_handle, ð_phy_dev_custom);
// 在此之后填写描述符、缓冲区及应用配置
}
句柄、PHY 实例和 MDIO 操作表在驱动使用期间必须保持有效。