网络 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
-
下面简单介绍下使用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。
-
mac初始化完成后可通过phy_r与phy_w命令测试phy是否连接成功。
如使用phy_r读取IP101G寄存器2的值,该寄存器是只读寄存器,值始终为0x0243。
-
如需连接其他型号的phy芯片或者switch芯片,按上述流程使用MHal_EMAC_write_phy与 MHal_EMAC_read_phy函数配置寄存器即可。
如增加QCA833X系列switch芯片,我们可新建一个初始化函数qca83xx_init,用于配置该芯片的寄存器,然后将该函数放在MDrv_EMAC_initialize中。
-
使用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接口?
-
配置rmii pin脚padmux
打开kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo-padmux.dtsi文件,按如下配置RMII
-
修改dts tree使能rmii
打开kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo.dts,按如图修改切换phy-mode为rmii
-
增加初始化代码,配置外部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写寄存器
-
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文件中的数据对比。
...