网络 Q&A

Q1: SigmaStar平台mac和phy是如何使用的?

一般以太网是由CPU、MAC和PHY三部分组成,MAC处于链路层,PHY处于物理层连接到RJ45水晶头。

SigmaStar平台一般会把MAC的RMII接口留出来让用户选择是否需要外接switch,如果不接switch就默认MAC和 PHY都集成在芯片内部这路以太网,接switch就把芯片pin切到rmii这路。

结构图如下:

在padmux中切到rmii mode:

//for eth0 rmii
<PAD_GPIO0 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_MDIO>,
<PAD_GPIO1 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_MDC>,
<PAD_GPIO2 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_COL>,
<PAD_GPIO3 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_RXD0>,
<PAD_GPIO4 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_RXD1>,
<PAD_GPIO5 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_TX_CLK>,
<PAD_GPIO6 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_TXD0>,
<PAD_GPIO7 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_TXD1>,
<PAD_GPIO8 PINMUX_FOR_ETH0_MODE_11 MDRV_PUSE_ETH_TX_EN>,

Q2: 通过RMII外接switch如何确认MDIO & MDC发送的数据是正常的?

目前主要在uboot和kernel下面会用到MDIO给switch发送初始化数据,具体确认方法如下:

uboot:

读写对应的api和波形图如下:

read:

void MHal_EMAC_read_phy(unsigned char phy_addr, unsigned char address,u32 *value)

write:

void MHal_EMAC_write_phy (unsigned char phy_addr, unsigned char address, u32 value)

需要注意的是在read的时候针对主控这边在TA信号后会变成下降沿采样:

write是一直上升沿采样:

Q3:uboot下如何使能RMII接口?

芯片只有一个MAC外设,在menuconfig中配置。

> Device Drivers > MStar drivers

  1. 下面简单介绍下使用RMII接外部phy芯片IP101G。

    软件实现流程如下:

    在uboot下运行estart命令初始化mac,实际上是调用MDrv_EMAC_initialize函数,代码实现在boot/drivers/mstar/emac/cmd_emac.c文件中。

    MDrv_EMAC_initialize中调用MDrv_EMAC_PhyAddrScan函数查找外部phy芯片,代码实现在boot drivers/mstar/emac/mdrv_emac.c文件中。

    MHal_EMAC_read_phy函数通过MDIO读取phy寄存器的值,查看芯片IP101G的数据手册,PHY_REG_STATUS是寄存器1。

    找到phy之后调用MDrv_EMAC_HW_init → MHal_EMAC_NegotiationPHY → MHal_EMAC_CableConnection,MHal_EMAC_NegotiationPHY函数中会配置IP101G Auto-Negotiation(自动协商),MHal_EMAC_CableConnection函数会尝试Connect IP101G。

          MHal_EMAC_write_phy函数通过MIDO写phy寄存器的值,通过查IP101G数据手册,PHY_REG_BASIC是寄存器0,PHY_REG_LINK_PARTNER是寄存器5。

  2. mac初始化完成后可通过phy_r与phy_w命令测试phy是否连接成功。

    如使用phy_r读取IP101G寄存器2的值,该寄存器是只读寄存器,值始终为0x0243。

  3. 如需连接其他型号的phy芯片或者switch芯片,按上述流程使用MHal_EMAC_write_phy与 MHal_EMAC_read_phy函数配置寄存器即可。

    如增加QCA833X系列switch芯片,我们可新建一个初始化函数qca83xx_init,用于配置该芯片的寄存器,然后将该函数放在MDrv_EMAC_initialize中。

  4. 使用MDrv_EMAC_DumpMem函数dump发送与接收的数据,测试phy通讯。

    按如下更改MDrv_EMAC_rx与MDrv_EMAC_tx函数,在uboot下设置好ipaddr与serverip后,使用ping命令测试网络。PC使用wireshark软件抓包,如果uboot下发的包与PC端抓的包一致,则通讯正常。

    对比uboot下dump数据与wireshark抓的数据。

Q4: kernel下如何使用RMII接口?

  1. 配置rmii pin脚padmux

    打开kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo-padmux.dtsi文件,按如下配置RMII

  2. 修改dts tree使能rmii

    打开kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo.dts,按如图修改切换phy-mode为rmii

  3. 增加初始化代码,配置外部phy或者switch

    添加外部phy时一般不需要改代码,如果添加switch或者需要通过mdio配置芯片寄存器,可按照如下介绍改相关代码:

    打开kernel/drivers/sstar/emac/mdrv_emac.c文件,找到MDev_EMAC_init函数,在MDev_EMAC_mii_init函数之后添加初始化代码。如新建qca833x_init,调用mdio write/read接口配置外部phy/switch寄存器。

    MDev_EMAC_mii_read(struct mii_bus *bus, int phy_addr, int phy_reg);               //MDIO读寄存器
    MDev_EMAC_mii_write(struct mii_bus *bus, int phy_addr, int phy_reg, u16 val); //MDIO写寄存器
    

  4. phy/switch通讯测试

    如果网络不通我们可以按下述方法测试phy/switch通讯。

    MDIO测试:

    kernel起来后,使用如下命令读/写phy寄存器

    echo phy_r phyAddress > /sys/devices/virtual/mstar/emac0/phyStatusWR
    echo phy_w phyAddress phyValue > /sys/devices/virtual/mstar/emac0/phyStatusWR
    

    RMII测试:

    emac驱动中提供了tx_dump/rx_dump函数,可以将rmii发送出的数据存到文件中。打开kernel/drivers/sstar/emac/mdrv_emac.c文件中的宏#define PACKET_DUMP;打开kernel/drivers/sstar/msys/ms_msys.c文件中的宏#define CONFIG_MSYS_KFILE_API,重新编译kernel

    kernel起来后,使用如下命令打开tx_dump/rx_dump功能,会在板子/tmp目录下生成tx_dump与rx_dump两个文件。

    echo 1 > /sys/devices/virtual/mstar/emac0/tx_dump
    echo 1 > /sys/devices/virtual/mstar/emac0/rx_dump
    

    设置板子的ip地址与mac地址,使用ping命令连接PC电脑,驱动代码中会将rmii发送与接收的数据保存在tx_dump与rx_dump文件中。同时PC端打开wireshark软件抓网络包,将抓到的包与tx_dump与rx_dump文件中的数据对比。

...