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 = [ 0a ];
phy-handle = <&phy0>;
phy-mode = "rgmii-id";
phy0: phy@ {
reg = <>;
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, &regs->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);

本文转载自: https://blog.csdn.net/u012075739/article/details/52966751

Xilinx Uboot网卡驱动分析的更多相关文章

  1. 基于335X的UBOOT网口驱动分析

    基于335X的UBOOT网口驱动分析 一.软硬件平台资料 1.  开发板:创龙AM3359核心板,网口采用RMII形式 2.  UBOOT版本:U-Boot-2016.05,采用FDT和DM. 参考链 ...

  2. Linux网卡驱动移植--Dm9000网卡驱动分析

    1. Linux网络体系结构由以下5部分组成 ① 系统调用接口: 位于Linux网络子系统的顶部,为应用程序提供访问内核网络子系统的方法,主要指socket系统调用. ② 协议无关接口: 实现一组基于 ...

  3. Linux网卡驱动分析

    以太网(Ethernet)是一种计算机局域网组网技术,基于IEEE 802.3标准,它规定了包括物理层的连线.电信号和介质访问层协议. Ethernet接口的实质是MAC通过MII总线控制PHY的过程 ...

  4. 【驱动】DM9000网卡驱动分析

    Preface    内核源码版本:linux-2.6.18    网卡驱动·linux内核网络分层结构:http://infohacker.blog.51cto.com/6751239/122114 ...

  5. DM9000网卡驱动分析(转)

    s3c6410自带的DM9000网卡驱动也是基于platform设备模型. 其定义的设备资源在arch/arm/mach-s3c64xx/mach-smdk6410中.有网卡的resource res ...

  6. 【Linux高级驱动】网卡驱动分析

    两个重要的结构体简单介绍 *sk_buff 如果把网络传输看成是运送货物的话,那么sk_buff就是这个“货物”了,所有经手这个货物的人都要干点什么事儿,要么加个包装,要么印个戳儿等等.收货的时候就要 ...

  7. 【Linux高级驱动】如何分析并移植网卡驱动

    dm9000的驱动分析 m9000_init platform_driver_register(); db); db); );  ; id_val ; id_val ; /* 获取芯片型号 */ id ...

  8. uboot的GPIO驱动分析--基于全志的A10芯片【转】

    本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...

  9. linux网卡驱动移植

    这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可 ...

随机推荐

  1. HTTP/2笔记之连接建立

    前言 HTTP/2协议在TCP连接之初进行协商通信,只有协商成功,才会涉及到后续的请求-响应等具体的业务型数据交换. HTTP版本标识符 h2,基于TLS之上构建的HTTP/2,作为ALPN的标识符, ...

  2. MQTT协议笔记之mqtt.io项目TCP协议支持

    前言 MQTT定义了物联网传输协议,其标准倾向于原始TCP实现.构建于TCP的上层协议堆栈,诸如HTTP等,在空间上多了一些处理路径,稍微耗费了CPU和内存,虽看似微乎其微,但对很多处理能力不足的嵌入 ...

  3. 标准web浏览器的组件

    浏览器基本上包括如下几个组件 1.HTML.XML.CSS.JavsScript解析器 2.Layout 3.文字和图形渲染 4.图像解码 5.GPU交互 6.网络访问 7.硬件加速

  4. java EE ME SE有什么关系

    1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...

  5. HUB、SPAN、TAP比较

    在获取数据包进行网络分析时,常用的方法有三种:HUB.SPAN和TAP. 一 HUB    HUB 很“弱智”,但这种方法却是最早的数据包获取方法.HUB是半双工的以太网设备,在广播数据包时,无法同时 ...

  6. 次小生成树(poj1679)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20737   Accepted: 7281 D ...

  7. 170505、MySQL的or/in/union与索引优化

    假设订单业务表结构为: order(oid, date, uid, status, money, time, …) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照da ...

  8. 分布式锁的实现(java)

    当对接第三方接口时,往往会碰到同一时间发送了大量相同的请求,这个时候或许就是第三方发送接口的失误了.而我们需要做的就是针对这个情况来强化我们的系统.这个时候就需要用到分布式锁.让这些请求只有一个能发送 ...

  9. Oracle性能优化之oracle里表、索引、列的统计信息

    一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...

  10. Mysql数据库安装与配置

    先介绍下dql,dml,ddl,dcl: 安装: 加上这一行: 接下来把mysql设置成随系统自动启动: 开放3306端口(如果是阿里云服务器需要修改安全规则而不是如下): 或者 这里注意,有时候没有 ...