PHY 接口适配

软件架构

Ameba 以太网模块集成了轻量级 TCP/IP 协议栈(LwIP)和 MAC 驱动,其架构和 OSI、TCP/IP 模型的对应关系如下图所示:

以太网软件栈:应用层、TCP/UDP、IP/ARP、LwIP 网络接口适配、SDK 以太网接入、MAC 驱动和 PHY 驱动

以太网软件架构

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 芯片为例,必要接口如下:

PHY 驱动必要接口

OPS 成员

对应实现函数

功能说明

必要性说明

.init

phy_rtl8201_init

初始化与 ID 校验

读取 PHY ID 寄存器并与 RTL8201_PHY_ID_MATCH 比较。

防止驱动匹配错误的硬件;确保 PHY 芯片已上电且 MDIO 通信正常。

.reset

phy_rtl8201_reset

软复位

写入 BMCR 复位位,并延时等待硬件稳定。

确保 PHY 处于已知的初始状态,清除之前的错误配置或状态。

.cfg_refclock

phy_rtl8201_cfg_refclock

参考时钟配置

切换 Page 7 设置 RMII 时钟方向(输入/输出)。

RMII 接口的 MAC 与 PHY 必须共用 50MHz 参考时钟,方向配置错误会导致物理链路无法建立。

.cfg_link

phy_rtl8201_cfg_link

链路参数配置

配置自协商(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  = &eth_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, &eth_phy_dev_custom);

    // 在此之后填写描述符、缓冲区及应用配置
}

句柄、PHY 实例和 MDIO 操作表在驱动使用期间必须保持有效。