Linux网络驱动实验
直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81本文仅作为个人笔记使用方便进一步记录自己的实践总结。网络驱动是 linux 里面驱动三巨头之一linux 下的网络功能非常强大嵌入式 linux 中也常常用到网络功能。前面我们已经讲过了字符设备驱动和块设备驱动本章我们就来学习一下linux 里面的网络设备驱动。嵌入式下的网络硬件接口本章节讨论的都是有线网络注意正点原子I.MX6U-ALPHA开发板V2.4版本以前的底板使用的网络PHY为LAN8720V2.4 及其以后的版本使用的网络 PHY 为 SR8201F而且网络 PHY 地址有改变大家一定要看准自己所使用的底板版本号原理基本一致本章就以 LAN8720 为例进行讲解。提起网络我们一般想到的硬件就是“网卡”“网卡”这个概念最早从电脑领域传出来顾名思义就是能上网的卡。在电脑领域的“原始社会”网卡是独立的硬件如果电脑要上网就得买个网卡插上去类似现在的显卡一样。但是大家现在观察自己的笔记本或者台式机主板会发现并没有类似显卡一样的网卡设备原因是随着技术的不断发展现在只需要一个芯片就可以实现有线网卡功能因此网卡芯片都直接放到了主板上。所以大家在接触嵌入式的时候听到“网卡”这两个字不要急着在开发板上找“卡”一样的东西。既然现在网卡已经是通过一个芯片来完成了那么是什么样的芯片呢这个就要先了解一下嵌入式中的网络硬件方案。首先嵌入式网络硬件分为两部分MAC 和 PHY大家都是通过看数据手册来判断一款 SOC 是否支持网络如果一款芯片数据手册说自己支持网络一般都是说的这款 SOC 内置 MACMAC 类似 I2C 控制器、SPI 控制器一样的外设。但是光有 MAC还不能直接驱动网络还需要另外一个芯片PHY因此对于内置 MAC 的 SOC其外部必须搭配一个 PHY 芯片。但是有些 SOC 内部没有 MAC那也就没法搭配 PHY 芯片了这些内部没有网络 MAC 的芯片如何上网呢这里就要牵扯出常见的两个嵌入式网络硬件方案了。1、SOC 内部没有网络 MAC 外设我们一般说某个 SOC 不支持网络说的就是它没有网络 MAC。那么这个芯片就不能上网了吗显然不是的既然没有内部 MAC那么可以找个外置的 MAC 芯片啊不过一般这种外置的网络芯片都是 MACPHY 一体的。比如三星 linux 开发板里面用的最多的 DM9000因为三星的芯片基本没有内部 MAC(比如 S3C2440、S5PV2104412 等)所以三星的开发板都是通过外置的 DM9000 来完成有线网络功能的DM9000 对 SOC 提供了一个 SRAM 接口SOC 会以 SRAM 的方式操作 DM9000。有些外置的网络芯片更强大内部甚至集成了硬件 TCP/IP 协议栈对外提供一个 SPI 接口比如 W5500。这个一般用于单片机领域单片机通过 SPI 接口与 W5500 进行通信由于W5500 内置了硬件 TCP/IP 协议栈因此单片机就不需要移植软件协议栈直接通过 SPI 来操作 W5500简化了单片机联网方案。这种方案的优点就是让不支持网络的 SOC 能够另辟蹊径实现网络功能但是缺点就是网络效率不高因为一般芯片内置的 MAC 会有网络加速引擎比如网络专用 DMA网络处理效率会很高。而且此类芯片网速都不快基本就是 10/100M。另外相比 PHY 芯片而言此类芯片的成本也比较高可选择比较少。SOC 与外部 MACPHY 芯片的连接如图 69.1.1.1 所示2、SOC 内部集成网络 MAC 外设我们一般说某个 SOC 支持网络说的就是他内部集成网络 MAC 外设此时我们还需要外接一个网络 PHY 芯片。此时就有朋友会有疑问PHY 芯片不能也集成进 SOC 吗笔者目前还没见过将 PHY 也集成到芯片里面的 SOC。一般常见的通用 SOC 都会集成网络 MAC 外设比如 STM32F4/F7/H7 系列、NXP 的 I.MX系列内部集成网络 MAC 的优点如下①、内部 MAC 外设会有专用的加速模块比如专用的 DMA加速网速数据的处理。②、网速快可以支持 10/100/1000M 网速。③、外接 PHY 可选择性多成本低。内部的 MAC 外设会通过 MII 或者 RMII 接口来连接外部的 PHY 芯片MII/RMII 接口用来传输网络数据。另外主控需要配置或读取 PHY 芯片也就是读写 PHY 的内部寄存器所以还需要一个控制接口叫做 MIDOMDIO 很类似 IIC也是两根线一根数据线叫做 MDIO一根时钟线叫做 MDC。SOC 内部 MAC 外设与外部 PHY 芯片的连接如图 69.1.1.2 所示大家在做项目的时候如果要用到网络功能强烈建议大家选择内部带有网络 MAC 外设的主控 SOCI.MX6ULL 就有两个 10M/100M 的网络 MAC 外设正点原子 ALPHA 开发板板载了两颗 PHY 芯片型号为 LAN8720 或 SR8201F。因此本章节只讲解 SOC 内部 MAC外置 PHY 芯片这种方案。MAC和PHY分别实现什么功能MAC和PHY在数据链路层功能、物理层实现以及接口标准等方面存在区别。以下是具体分析数据链路层功能MAC负责数据帧的生成和解析包括对帧进行界定和实现帧同步。控制数据的发送和接收确保传输的有序性和可靠性。PHY无数据链路层功能。物理层实现MAC不直接处理物理信号主要通过MII等接口与PHY通信。PHY将数字信号转换成适合在物理媒介上传输的形式如电信号或光信号。处理信号的发送与接收包括信号的放大、调制解调、时钟恢复等任务。接口标准MAC通常实现MII/GMII/RGMII等接口以与PHY层进行通信。PHY支持多种以太网标准如10BASE-T、100BASE-T、1000BASE-T和接口如RMII、GMII、RGMII等。硬件设计MAC典型全数字器件芯片面积较小。可以通过编写硬件描述语言如VHDL或Verilog实现也可以使用现成的IP核。PHY包含大量模拟硬件芯片面积较大。需要处理信号转换、编码和解码等复杂任务。总的来说MAC作为数据链路层的控制器负责数据帧的生成、解析和流控制而PHY则作为物理层的接口负责信号的转换和传输。两者通过标准化接口紧密协作共同实现以太网通信的高效和稳定。理解它们各自的功能和相互关系对于网络设备的设计和维护至关重要。总体来说MAC实现以太网链路层的功能PHY实现以太网物理层的功能。以太网网络驱动主要是实现哪部分的功能以太网网络驱动主要实现数据链路层功能、物理层功能以及接口标准化等。以下是对这些功能的具体介绍数据链路层功能帧处理以太网驱动程序负责生成和解析以太网帧包括帧界定和同步。错误检测通过CRC校验和其他机制检测数据传输中的错误。流控制管理数据的发送和接收顺序确保传输的有序性和可靠性。物理层功能信号转换将以太网控制器生成的数字信号转换为适合在物理媒介如双绞线、光纤上传输的模拟信号。编码解码对数据进行编码和解码确保数据在传输过程中保持完整性。时钟恢复从接收到的信号中提取时钟信息用于同步数据传输。接口标准化MII/GMII/RGMII等接口以太网驱动程序通常实现这些标准接口以便与不同的物理层设备通信。PHY芯片支持支持多种PHY芯片提供硬件独立性。API接口提供一组应用程序编程接口允许开发人员访问和控制以太网控制器的各种功能。配置和管理初始化配置以太网驱动程序负责初始化以太网控制器配置必要的参数。状态监控监控以太网控制器的状态包括连接状态、传输速率等。错误处理检测并处理各种错误情况如连接断开、数据传输错误等。总的来说以太网网络驱动在数据链路层和物理层之间起到了桥梁作用通过标准化接口和API提供了硬件独立性使得上层应用程序能够通过网络进行高效、可靠的通信。理解以太网驱动程序的功能对于网络设备的设计和维护至关重要。这里的“上层”指的是协议栈要注意网络设备驱动的上层并不是直接就是常规的应用层而是协议栈常规的应用层再去调用协议栈而不会直接调用驱动。DM9000和W5500DM9000和W5500是两种常见的网络芯片分别用于嵌入式系统中实现以太网Ethernet和 TCP/IP 网络通信。它们的功能和特点有所不同适用于不同的应用场景。以下是它们的详细介绍和对比1.DM9000DM9000是一款高度集成的以太网控制器芯片支持 10/100Mbps 以太网通信。它通常用于嵌入式系统中通过并行接口与主控芯片如 ARM、MIPS 等连接。特点接口并行总线接口8 位或 16 位。速度支持 10Mbps 和 100Mbps 自适应。协议支持支持 IEEE 802.3 以太网协议。驱动支持Linux 内核中已经集成了 DM9000 的驱动dm9000.c。应用场景适用于需要以太网通信的嵌入式设备如工业控制、智能家居、网络摄像头等。优点硬件设计简单易于集成。Linux 内核驱动成熟开发方便。成本较低适合低成本嵌入式系统。缺点需要外部 PHY 芯片某些型号集成 PHY。并行接口占用较多的 GPIO 引脚。典型应用嵌入式 Linux 系统中的以太网接口。需要以太网通信的工业设备。2.W5500W5500是一款硬连线 TCP/IP 嵌入式以太网控制器集成了 TCP/IP 协议栈、MAC 和 PHY。它通过 SPI 接口与主控芯片通信适合资源有限的嵌入式系统。特点接口SPI 接口4 线。速度支持 10/100Mbps 自适应。协议支持内置硬件 TCP/IP 协议栈支持 TCP、UDP、ICMP、IPv4、ARP、IGMP 等。驱动支持Linux 内核中也有 W5500 的驱动支持。应用场景适用于资源有限的嵌入式系统如物联网设备、智能传感器、小型网络设备等。优点集成 TCP/IP 协议栈减轻主控芯片的负担。SPI 接口占用引脚少适合引脚资源有限的系统。低功耗设计适合电池供电的设备。缺点灵活性较低协议栈由硬件实现无法修改。性能受限适合小数据量通信。典型应用物联网设备如智能家居传感器。小型网络设备如远程控制模块。3.DM9000 和 W5500 的对比4.如何选择选择 DM9000如果你的系统需要高性能的以太网通信且主控芯片有足够的资源实现 TCP/IP 协议栈。如果你的系统已经运行 Linux且需要成熟的以太网驱动支持。如果你的设计需要较低的硬件成本。选择 W5500如果你的系统资源有限如主控芯片性能较低或引脚较少。如果你需要快速实现 TCP/IP 通信且不希望在主控芯片上实现协议栈。如果你的应用场景是物联网设备或小型网络设备。5.开发注意事项DM9000硬件设计时注意并行接口的布线确保信号完整性。在 Linux 中确保内核配置启用了 DM9000 驱动CONFIG_DM9000。如果需要优化性能可以调整驱动中的缓冲区大小和中断处理逻辑。W5500硬件设计时注意 SPI 接口的布线确保通信稳定性。在 Linux 中确保内核配置启用了 W5500 驱动CONFIG_WIZNET_W5500。由于 W5500 的协议栈由硬件实现开发时只需关注应用层逻辑。6.总结DM9000适合需要高性能以太网通信的嵌入式系统尤其是在运行 Linux 的系统上。W5500适合资源有限的嵌入式系统尤其是需要快速实现 TCP/IP 通信的物联网设备。根据你的具体需求如硬件资源、性能要求、开发难度等可以选择合适的芯片。如果需要更高的灵活性可以选择 DM9000如果需要快速开发和低资源占用可以选择 W5500。MII/RMII 接口前面我们说了内部 MAC 通过 MII/RMII 接口来与外部的 PHY 芯片连接完成网络数据传输本节我们就来学习一下什么是 MII 和 RMII 接口。1、MII 接口MII 全称是 Media Independent Interface直译过来就是介质独立接口更确切的应该叫“介质无关接口”它是 IEEE-802.3 定义的以太网标准接口MII 接口用于以太网 MAC 连接 PHY 芯片连接示意图如图 69.1.2.1 所示MII 接口一共有 16 根信号线含义如下TX_CLK发送时钟如果网速为 100M 的话时钟频率为 25MHz10M 网速的话时钟频率为 2.5MHz此时钟由 PHY 产生并发送给 MAC。TX_EN发送使能信号。TX_ER发送错误信号高电平有效表示 TX_ER 有效期内传输的数据无效。10Mpbs 网速下 TX_ER 不起作用。TXD[3:0]发送数据信号线一共 4 根。RXD[3:0]接收数据信号线一共 4 根。RX_CLK接收时钟信号如果网速为 100M 的话时钟频率为 25MHz10M 网速的话时钟频率为 2.5MHzRX_CLK 也是由 PHY 产生的。RX_ER接收错误信号高电平有效表示 RX_ER 有效期内传输的数据无效。10Mpbs 网速下 RX_ER 不起作用。RX_DV接收数据有效作用类似 TX_EN。CRS载波侦听信号。COL冲突检测信号。MII 接口的缺点就是所需信号线太多这还没有算 MDIO 和 MDC 这两根管理接口的数据线因此 MII 接口使用已经越来越少了。2、RMII 接口RMII 全称是 Reduced Media Independent Interface翻译过来就是精简的介质独立接口也就是 MII 接口的精简版本。RMII 接口只需要 7 根数据线相比 MII 直接减少了 9 根极大的方便了板子布线RMII 接口连接 PHY 芯片的示意图如图 69.1.2.2 所示TX_EN发送使能信号。TXD[1:0]发送数据信号线一共 2 根。RXD[1:0]接收数据信号线一共 2 根。CRS_DV相当于 MII 接口中的 RX_DV 和 CRS 这两个信号的混合。REF_CLK参考时钟由外部时钟源提供 频率为 50MHz。这里与 MII 不同MII 的接收和发送时钟是独立分开的而且都是由 PHY 芯片提供的。除了 MII 和 RMII 以外还有其他接口比如 GMII、RGMII、SMII、SMII 等关于其他接口基本都是大同小异的这里就不做讲解了。正点原子 ALPAH 开发板上的两个网口都是采用 RMII 接口来连接 MAC 与外部 PHY 芯片。MII更多参考MII、RMII、GMII、RGMII接口详解及硬件设计注意事项-CSDN博客更多待补充。MDIO 接口MDIO 全称是 Management Data Input/Output直译过来就是管理数据输入输出接口是一个简单的两线串行接口一根 MDIO 数据线一根 MDC 时钟线。驱动程序可以通过 MDIO 和MDC 这两根线访问 PHY 芯片的任意一个寄存器。MDIO 接口支持多达 32 个 PHY。同一时刻内只能对一个 PHY 进行操作那么如何区分这 32 个 PHY 芯片呢和 IIC 一样使用器件地址即可。同一 MDIO 接口下的所有 PHY 芯片其器件地址不能冲突必须保证唯一具体器件地址值要查阅相应的 PHY 数据手册。因此MAC 和外部 PHY 芯片进行连接的时候主要是 MII/RMII 和 MDIO 接口另外可能还需要复位、中断等其他引脚。RJ45 接口网络设备是通过网线连接起来的插入网线的叫做 RJ45 座如图 69.1.4.1 所示RJ45 座要与 PHY 芯片连接在一起但是中间需要一个网络变压器网络变压器用于隔离以及滤波等网络变压器也是一个芯片外形一般如图 69.1.4.2 所示但是现在很多 RJ45 座子内部已经集成了网络变压器比如正点原子 ALPHA 开发板所使用的 HR911105A 就是内置网络变压器的 RJ45 座。内置网络变压器的 RJ45 座和不内置的引脚一样但是一般不内置的 RJ45 座会短一点。因此大家在画板的时候一定要考虑你所使用的 RJ45座是否内置网络变压器如果不内置的话就要自行添加网络变压器部分电路同理如果你所设计的硬件是需要内置网络变压器的 RJ45 座肯定不能随便焊接一个不内置变压器的 RJ45座否则网络工作不正常RJ45 座子上一般有两个灯一个黄色(橙色)一个绿色绿色亮的话表示网络连接正常黄色闪烁的话说明当前正在进行网络通信。这两个灯由 PHY 芯片控制PHY 芯片会有两个引脚来连接 RJ45 座上的这两个灯。内部 MAC外部 PHYRJ45 座(内置网络变压器)就组成了一个完整的嵌入式网络接口硬件如图 69.1.4.2 所示I.MX6ULL ENET 接口简介I.MX6ULL 有两个网络接口也就是两个 MAC 外设一个 MAC 连接一个 PHY 芯片形成一个完整网络接口本节我们简单了解一下 I.MX6ULL 自带的 ENET 接口。I.MX6ULL 内部自带的 ENET 外设其实就是一个网络 MAC支持 10/100M。实现了三层网络加速用于加速那些通用的网络协议比如 IP、TCP、UDP 和 ICMP 等为客户端应用程序提供加速服务。I.MX6ULL 内核集成了两个 10/100Mbit/S 的网络 MAC符合 IEEE802.3-2002 标准MAC层支持双工、半双工局域网。MAC 可编程、可以作为 NIC 卡或其他一些交换器件。根据 IETF RFC 2819 协议MAC 实现了 RMON(Remote Network Monitoring)计数功能。MAC 内核拥有硬件加速处理单元来提高网络性能硬件加速单元用于处理 TCP/IP、UDP、ICMP 等协议。通过硬件来处理帧头等信息效果要比用一大堆软件处理要好很多。ENET 外设有一个专用的 DMA此 DMA 用于在 ENET 外设和 SOC 之间传输数据并且支持可编程的增强型的缓冲描述符用以支持 IEEE 1588。I.MX6ULL 内部 ENET 外设主要特性如下1)、实现了全功能的 802.3 规范前导码/SFD 生成、帧填充、CRC 生成和检查。2)、支持零长的前导码。3)、支持 10/100M 动态配置。4)、兼容 AMD 远端节点电源管理的魔术帧中断检测。5)、可以通过如下接口无缝的连接 PHY 芯片·4bit 的 MII 接口频率为 2.5/25MHz。·4bit 的 MII-Lite 接口也就是 MII 接口取消掉 CRS 和 COL 这两根线频率也是2.5/25MHz。·2bit 的 RMII 接口频率为 50MHz。6)、MAC 地址可编程。7)、多播和单播地址过滤降低更高层的处理负担。8)、MDIO 主接口用于管理和配置 PHY 设备。……I.MX6ULL 的 ENET 外设内容比较多详细的介绍请查阅《I.MX6ULL 参考手册》的“Chapter 22 10/100-Mbps Ethernet MAC(ENET)”章节。我们在编写驱动的时候其实并不需要关注 ENET外设的具体内容因为这部分驱动是 SOC 厂商编写的我们重点关注的是更换 PHY 芯片以后哪里需要调整。PHY 芯片详解PHY 基础知识简介PHY 是 IEEE 802.3 规定的一个标准模块前面说了SOC 可以对 PHY 进行配置或者读取PHY 相关状态这个就需要 PHY 内部寄存器去实现了。PHY 芯片寄存器地址空间为 5 位地址 0~31 共 32 个寄存器IEEE 定义了 0~15 这 16 个寄存器的功能16~31 这 16 个寄存器由厂商自行实现。也就是说不管你用的哪个厂家的 PHY 芯片其中 0~15 这 16 个寄存器是一模一样的。仅靠这 16 个寄存器是完全可以驱动起 PHY 芯片的至少能保证基本的网络数据通信因此 Linux 内核有通用 PHY 驱动按道理来讲不管你使用的哪个厂家的 PHY 芯片都可以 使用 Linux 的这个通用 PHY 驱动来验证网络工作是否正常。事实上在实际开发中可能会遇到一些其他的问题导致 Linux 内核的通用 PHY 驱动工作不正常这个时候就需要驱动开发人员去调试了。但是随着现在的 PHY 芯片性能越来越强大32 个寄存器可能满足不了厂商的需求因此很多厂商采用分页技术来扩展寄存器地址空间以求定义更多的寄存器。这些多出来的寄存器可以用于实现厂商特有的一些技术因此 Linux 内核的通用 PHY 驱动就无法驱动这些特色功能了这个时候就需要 PHY 厂商提供相应的驱动源码了所以大家也会在 Linux 内核里面看 到很多具体的 PHY 芯片驱动源码。不管你的 PHY 芯片有多少特色功能按道理来讲Linux 内核的通用 PHY 驱动是绝对可以让你这 PHY 芯片实现基本的网络通信因此大家也不用担心更换 PHY 芯片以后网络驱动编写是不是会很复杂。IEEE802.3 协议英文原版已经放到了开发板光盘中路径为 4、参考资料-802.3 协议英文原版_2018年.pdf打开此文档此文档有5600页按照SECTION进行分类一共8个SECTION。选中“802.3-2018_SECTION2”找到“22.2.4 Management functions”章节此章节对 PHY 的前16 个寄存器功能进行了规定如图 69.2.1.1 所示关于这 16 个寄存器的内容协议里面也进行了详细的讲解这里就不分析了。我们后面会以ALPHA 开发板所使用的 LAN8720A/SR8201F 这两个 PHY 为例详细的分析一下 PHY 芯片的寄存器。SR8201F 详解V2.4 及以后版本的底板 PHY 芯片采用 SR8201F因此请看本小节1、SR8201F 简介SR8201F 是单芯片/单端口的 10/100Mbps 以太网 PHY 收发器。芯片支持 RMII (简化介质独立)接口SR8201F 实现了所有 10/100M 以太网物理层包括物理编码子层 (PCS)物理介质接入层(PMA)双绞线物理介质相关子层 (TP-PMD)同时芯片支持端口自动翻转Auto-MDIX。SR8201F 的主要特点如下· 支持 IEEE 802.3az-2010EEE· 兼容 100Base-TX IEEE 802.3u· 兼容 10Base-T IEEE 802.3· 支持 RMII 模式· 全/半双工工作· 支持自协商模式· 支持 Auto-MDIX· 支持中断功能· SR8201F 提供两个网络状态的 LED· 支持 25MHz 晶振或外部振荡输入· RMII 模式支持 50MHz 外部时钟输入SR8201F 功能框图如图 69.2.3.1 所示。2、SR8201F 中断管理SR8201F 检测到媒介端的状态改变就会写入对应中断状态的寄存器第 0 页寄存器 14并且在中断管脚使能时中断管脚会被置低表示发生一个中断事件。当 MAC 检测到中断事件时可以通过 MDC/MDIO 端口访问到第 0 页寄存器 14 获取相应的中断状态。正点原子的ALPHA 开发板虽然将 SR8201F 的中断引脚连接到了 I.MX6ULL 上但是并没有使用中断功能关于中断的具体用法可以参考 SR8201F 数据手册。3、PHY 地址设置MAC 层通过 MDIO/MDC 总线对 PHY 进行读写操作MDIO 最多可以控制 32 个 PHY 芯片通过不同的 PHY 芯片地址来对不同的 PHY 操作。SR8201F 通过设置 LED0/PHYAD[0]和LED1/PHYAD[1]这两个引脚来设置其 PHY 地址其地址设置如表 69.2.3.1 所示。正点原子 ALPHA 开发板 ENET1 网络的 SR8201F 上的 LED1/PHYAD1 引脚上拉LED0/PHYDAD0 引脚下来下拉因此 ENET1 上的 SR8201F 地址为 0X02。ENET2 网络上的SR8201F 的 LED1/PHYAD1 引脚下拉LED0/PHYAD0 引脚上拉因此 ENET2 上的 SR8201F地址为 1。4、SR8021F 内部寄存器SR8201F 的前 16 个寄存器满足 IEEE 的要求在这里我们只介绍几个常用的寄存器首先是BCR(Basic Control Rgsister)寄存器地址为 0BCR 寄存器各位如表 69.2.3.2 所示。我们说的配置 PHY 芯片重点就是配置 BCR 寄存器由于 SR8201F 是个 10/100M的 PHY因此表 69.2.3.3 中没有体现出 1000M 相关的配置。但是 10/100M 相关的配置是和 IEEE 的规定完全相符的大家可以选择一个其他的 10/100M 的 PHY 芯片对比看一下比如 NXP 官方 EVK开发板使用的 KSZ8081。接下来看一下 BSR(Basic Status Register)寄存器地址为 1。此寄存器为 PHY 的状态寄存器通过此寄存器可以获取到 PHY 芯片的工作状态BSR 寄存器各位如表 69.2.3.4 所示从表 69.2.3.4 可以看出和 IEEE 标准规定相比SR8201F 的 BSR 寄存器少了几个位这个没关系的不管什么 PHY 芯片只要它实现了的位和 IEEE 规定相符就行。通过读取 BSR 寄存器的值我们可以得到当前的连接速度、双工状态和连接状态等。接下来看一下 SR8201F 的 PHY ID 寄存器 1 和 ID 寄存器 2地址为 2 和 3后面就称为寄存器 2 和寄存器 3。这两个寄存器都是 PHY 的 ID 寄存器。IEEE 规定寄存器 2 和寄存器 3 为PHY 的 ID 寄存器这两个寄存器组成一个 32 位的唯一 ID 值。关于 SR8201F 的 PHY 寄存器就简单讲这几个其他的寄存器请自行查阅 SR8201F 数据手册。Linux 内核网络驱动框架直接参考Linux内核网络驱动框架-CSDN博客I.MX6ULL 网络驱动简介I.MX6ULL 网络外设设备树上一小节我们对 Linux 的网络驱动框架进行了一个简单的介绍本节我们就来简单分析一下 I.MX6ULL 的网络驱动源码。I.MX6ULL 有两个 10/100M 的网络 MAC 外设因此 I.MX6ULL网络驱动主要就是这两个网络 MAC 外设的驱动。这两个外设的驱动都是一样的我们分析其中一个就行了首先肯定是设备树 NXP 的 I.MX 系 列 SOC 网 络 绑 定 文 档 为Documentation/devicetree/bindings/net/fsl-fec.txt此绑定文档描述了 I.MX 系列 SOC 网络设备树节点的要求。①、必要属性compatible这个肯定是必须的一般是“fsl,soc-fec”比如 I.MX6ULL 的 compatible 属性就是fsl,imx6ul-fec,和fsl,imx6q-fec。regSOC 网络外设寄存器地址范围。interrupts网络中断。phy-mode网络所使用的 PHY 接口模式是 MII 还是 RMII。②、可选属性phy-reset-gpiosPHY 芯片的复位引脚。phy-reset-durationPHY 复位引脚复位持续时间单位为毫秒。只有当设置了 phy-reset-gpios 属性此属性才会有效如果不设置此属性的话 PHY 芯片复位引脚的复位持续时间默认为 1 毫秒数值不能大于 1000 毫秒大于 1000 毫秒的话就会强制设置为 1 毫秒。phy-supplyPHY 芯片的电源调节。phy-handle连接到此网络设备的 PHY 芯片句柄。fsl,num-tx-queues此属性指定发送队列的数量如果不指定的话默认为 1。fsl,num-rx-queues此属性指定接收队列的数量如果不指定的话默认为 2。内容太多暂略。具体查看正点原子手册。……至此关于 Linux 的网络驱动就讲到这里整体比较复杂但是实际使用起来确实非常简单的尤其是对这种内置 MAC外置 PHY 的网络方案而言几乎不需要我们修改驱动因为内核已经继承了通用 PHY 驱动了。补充网络设备和字符设备有什么区别网络设备与字符设备在数据流、访问方式以及文件系统等方面存在区别。以下是具体分析数据流字符设备面向字节流按顺序进行读写操作。网络设备面向报文处理的是数据包不支持随机访问。访问方式字符设备通过设备文件如/dev/ttyS0进行访问。网络设备通过套接字Socket接口进行通信没有设备文件。文件系统字符设备每个字符设备在/dev目录下有一个对应的设备文件可以通过这些文件进行操作。网络设备不在/dev目录下有设备文件表示而是通过网络接口名如eth0来标识关联一个网络设备net_device。驱动实现字符设备驱动程序通常需要实现open、release、read和write等操作方法。网络设备驱动程序主要处理数据包的发送和接收不需要了解每项事务如何映射到实际传送的数据包。总的来说字符设备的设计使其适合处理连续的数据流而网络设备则优化了数据包的传输和接收。这种设计上的差异反映了它们各自在操作系统中的独特角色和用途。字符设备更侧重于本地数据处理和用户交互而网络设备则专注于跨网络的数据传输。eth0是什么意思一文了解Linux中的网络接口命名参考eth0是什么意思一文了解Linux中的网络接口命名_技术知识_先知牛 (xianzhiniu.com)Linux网卡命名规则-CSDN博客eth0是Linux中的一种网络接口名称它表示第一个以太网接口。以太网接口是一种用于连接网络的硬件设备通常是一块网卡它可以通过网线或者光纤等方式与其他设备通信。Linux中的网络接口名称有一定的规则和含义它们可以帮助用户识别和管理不同的网络连接。Linux中的网络接口名称通常由三部分组成类型、编号和子编号。例如eth0表示第一个以太网接口wlan1表示第二个无线局域网接口eth0.1表示第一个以太网接口的第一个子接口。不同类型的网络接口有不同的前缀例如eth表示以太网接口如eth0, eth1, eth2等。 wlan表示无线局域网接口如wlan0, wlan1, wlan2等。 lo表示回环接口如lo0, lo1, lo2等。 ppp表示点对点协议接口如ppp0, ppp1, ppp2等。网络接口的名字可以用来关联一个网络设备从而引用该名称来操作对应的网络设备。网络接口的名称可以通过ifconfig命令来查看和修改。ifconfig是一种用于配置和管理网络接口的命令行工具它可以显示和修改网络接口的状态、地址、掩码、广播等信息。例如ifconfig eth0可以显示eth0接口的信息ifconfig eth0 up可以启动eth0接口ifconfig eth0 down可以关闭eth0接口。总之eth0是Linux中的一种网络接口名称它表示第一个以太网接口。Linux中的网络接口名称有一定的规则和含义它们可以帮助用户识别和管理不同的网络连接。对于 I.MX6ULL 而言网络驱动主要分两部分I.MX6ULL 网络外设驱动以及 PHY 芯片驱动网络外设驱动是 NXP 编写的PHY 芯片有通用驱动文件有些 PHY 芯片厂商还会针对自己的芯片编写对应的 PHY 驱动。注意MAC和PHY是两个外设只不过通常一个集成在芯片内部一个放在芯片外部。MAC驱动和PHY驱动是网络设备驱动程序中的两个关键部分它们分别对应OSI模型中的数据链路层和物理层。以下是对两者关系的详细分析功能定位MAC驱动主要负责数据链路层的处理包括数据的封装与解封、错误检测、媒体访问控制等。在发送数据时MAC驱动会将上层协议如IP传来的数据封装成帧并添加必要的控制信息如源MAC地址、目标MAC地址、帧类型等然后通过MIIMedia Independent Interface媒体独立接口或类似接口发送给PHY。在接收数据时MAC驱动会从PHY接收帧去除控制信息并将数据传递给上层协议处理。PHY驱动则专注于物理层的实现包括信号的调制与解调、编码与译码、时钟同步、线路状态检测等。PHY驱动通过MII或其他媒体独立接口与MAC驱动相连接收来自MAC驱动的并行数据将其转换为串行数据并发送到物理介质上如双绞线、光纤等同时PHY也会将从物理介质上接收到的串行数据转换为并行数据并通过MII接口传递给MAC驱动。硬件交互MII接口是MAC与PHY之间通信的标准接口它定义了两者之间数据传输的方式和协议。通过MII接口MAC驱动可以向PHY发送数据和控制命令同时也可以接收来自PHY的状态信息和数据。寄存器配置PHY内部包含多个寄存器用于存储其状态信息和配置参数。MAC驱动通过读写这些寄存器来配置PHY的工作模式、传输速率、双工模式等参数并监控PHY的当前状态。协同工作数据传递当需要发送数据时MAC驱动会将数据封装成帧并通过MII接口发送给PHYPHY再将并行数据转换为串行数据并发送到物理介质上。在接收数据时PHY会将从物理介质上接收到的串行数据转换为并行数据并通过MII接口传递给MAC驱动MAC驱动再去除帧头信息并将数据传递给上层协议处理。状态反馈PHY会实时更新其内部寄存器的状态信息如连接速度、双工能力、信号质量等。MAC驱动通过定期读取这些寄存器来获取PHY的当前状态并根据需要进行相应的调整或处理。综上所述MAC驱动和PHY驱动在网络设备驱动程序中各自承担着不同的角色和任务它们通过MII等媒体独立接口紧密协作共同完成数据的收发和传输控制。另一方面PHY驱动的实现也要基于MAC驱动因为MAC驱动除了实现自身的功能还要实现MII以及MDIO总线的功能以实现对PHY的控制以及与PHY之间的数据交互。于是我又有个问题MAC和PHY是两个驱动外设那么要定义几个网络设备net_device呢是一起属于一个网络设备还是各自定义一个网路设备按理来说这是一个整体应该是属于一个网络设备的如果是属于两个网络设备那么每个linux中都至少要有eth0和eth1两个网络名称可是大部分只有1个eth0。也就是说虽然驱动是两个但PHYMAC整体属于一个网络设备。