xilinx uboot网卡驱动分析和一些概念扫盲

1、mac控制器、网卡、phy、mdio、mii、gmii、rgmii概念扫盲
网卡在功能上包含osi模型的两个层,数据链路层和物理层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。网卡中负责数据链路的芯片叫做mac控制器,负责物理层的芯片叫做phy。所以,一个网卡由mac控制器和phy组成。
mac控制器与phy连接使用mii(medium independent interface)媒体独立接口,这个接口是ieee-802.3定义的以太网行业标准定义的接口,包括一个数据接口和一个mac和phy之间的管理接口即mdio。mii标准接口用于连接mac和phy,媒体独立表示不对mac硬件重新设计或替换的情况下,任何类型的phy设备接到当前mac控制器上都可以正常工作。
mii支持10m和100m的网络速率,由于网卡的速率不同,所以在其他速率下工作的与mii等效的接口有:aui(10m 以太网)、gmii(gigabit 以太网)和xaui(10-gigabit 以太网)。此外还有rmii、rgmii、smii、sgmii等。所有这些接口都是由mii而来。mii支持10兆和100兆的操作,一个接口由14根线组成。 rmii是简化的mii接口,在数据的收发上它比mii接口少了一倍的信号线。smii是由思科提出的一种媒体接口,它有比rmii更少的信号线数目,s表示串行的意思。因为它只用一根信号线传送发送数据,一根信号线传输接受数据,所以在时钟上为了满足100的需求,它的时钟频率很高,达到了125兆,为什么用125兆,是因为数据线里面会传送一些控制信息。gmii采用8位接口数据,工作时钟125mhz,因此传输速率可达1000mbps。同时兼容mii所规定的10/100 mbps工作方式。rgmii又是gmii接口的精简版。sgmii又是gmii的串行版。
mac控制器和phy除了数据传输的交流外,mac和phy控制信息的交流通过mdio(管理数据输入输出)接口来完成。具体mac控制器进行phy检测、mac控制器回去phy当前状态、mac控制器控制phy速率等操作就通过mdio来完成。
2. xilinx uboot网卡驱动分析
xilinx网卡模式比较灵活,可以外接phy芯片也可以用fpga做phy芯片。
以zynqmp_zcu102为例,在其dts中定义的网卡设备树为
&gem3 {
status = “okay”;
local-mac-address = [00 0a 35 00 02 90];
phy-handle = 《&phy0》;
phy-mode = “rgmii-id”;
phy0: phy@21 {
reg = 《21》;
ti,rx-internal-delay = 《0x8》;
ti,tx-internal-delay = 《0xa》;
ti,fifo-depth = 《0x1》;
};
};
uboot加载设备树种的信息创建device后,与driver匹配后执行zynq_gem_probe函数。
在uboot中管理整个网卡驱动的结构为
struct zynq_gem_priv {
struct emac_bd *tx_bd;
struct emac_bd *rx_bd;
char *rxbuffers;
u32 rxbd_current;
u32 rx_first_buf;
int phyaddr;
u32 emio;
int init;
struct zynq_gem_regs *iobase;
phy_interface_t interface;
struct phy_device *phydev;
int phy_of_handle;
struct mii_dev *bus;
};
由变量名可知,它包含了所有操作网卡需要的信息。
zynq_gem_probe(struct udevice *dev)函数中具体做的操作有:
priv-》rxbuffers = memalign(arch_dma_minalign, rx_buf * pktsize_align); 为priv分配接收buffers
priv-》tx_bd = (struct emac_bd *)bd_space; //分配tx_bd的空间
priv-》rx_bd = (struct emac_bd *)((ulong)bd_space + bd_seprn_space);//分配rx_bd的空间
priv-》bus = mdio_alloc();//分配mdio bus,主要是初始化了一个bus链表
priv-》bus-》read = zynq_gem_miiphy_read; //mdio总线读函数,用于读取phy信息
priv-》bus-》write = zynq_gem_miiphy_write;//mdio写总线函数
priv-》bus-》priv = priv;
strcpy(priv-》bus-》name, “gem”);//总线名为gem
ret = mdio_register(priv-》bus);//注册mdio,主要进行的操作是list_add_tail(&bus-》link, &mii_devs);
return zynq_phy_init(dev); //phy初始化
接下来看下 zynq_phy_init函数里干了啥。
zynq_phy_init(struct udevice *dev)
writel(zynq_gem_nwctrl_mden_mask, ®s-》nwctrl);写mac控制器寄存器,enable mdio bus
ret = phy_detection(dev);//通过mdio来检测phy,通过phyread函数检测正确的phy地址,如果没有检测到,zynq_phy_init将会退出,后面的初始化就不会有,网卡就不能使用,在调试的时候可以注意下这个过程。
priv-》phydev = phy_connect(priv-》bus, priv-》phyaddr, dev,priv-》interface);

SK海力士无锡二厂成功通电 投产在即
21亿元禾赛科技超级工厂签约上海 主要产品为机械式激光雷达等
区块链如何才能实现对数据保护的承诺
机器人在未来将可能拥有跟人一样的意识
兆易创新市值三年增长24倍 在部分细分领域国际领先
xilinx uboot网卡驱动分析和一些概念扫盲
高光谱成像技术在茶叶中的应用
关于无人机如何选择六款无人机的解析
LED透明屏的功耗怎么样?
三维扫描仪GOM,助力客户实现快速构建数字孪生数模
3G智能家居终端的应用
黄牛欲炒红色iPhone7/7Plus大赚,遭遇中国消费者“不买单”巨亏一笔!
TMS320F240型DSP的SPI口的扩展
基于等离子体的红外传感器的工作特性分析
德国提出新补贴 促进了新能源汽车的销售
消除镍镉电池记忆效应的电路
4月丘钛科技摄像头模组销量按年增约一倍 产品规格明显提升
手持吸尘器哪个牌子好,它的性价比是比较高的
英飞凌为布鲁姆能源公司的电解系统和燃料电池提供CoolSiC™功率器件
科技创新:多位代表委员为TA发声,氢能风口已至?