了解ARM的千兆以太网——RK3588

1. 简介

        本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。

2. 基础知识介绍

        在嵌入式ARM中实现以太网的解决方案通常有以下两种,通常在性能较低的单片机领域其SOC内部是不具备MAC控制器,但又有需求可以使用方案1这种架构,但在高性能的ARM处理器,例如RK3588这种SOC其内部已集成MAC控制器,可以直接选用方案2。

1. SOC 与外部 MAC+PHY 芯片

2. SOC 内部 MAC 外设与外部 PHY 芯片

        本文重点解方案2,那么在开始之前,先了解PHY芯片与MAC控制器之间的的接口协议RGMII。

先了解RGMII的前身 GMII(Gigabit Media Independant Interface)千兆MII接口。GMII采用8位接口数据,工作时钟125MHz,因此传输速率可达1000Mbps。同时兼容MII所规定的10/100Mbps工作方式。GMII接口数据结构符合IEEE以太网标准,该接口定义见IEEE 802.3-2000。信号定义如下。
        RGMII(Reduced Gigabit Media Independant Interface)是精简GMII接口,相对于GMII相比,RGMII具有如下特征:

        

  • 发送/接收数据线由8条改为4条
  • TX_ER和TX_EN复用,通过TX_CTL传送
  • RX_ER与RX_DV复用,通过RX_CTL传送
  • 1 Gbit/s速率下,时钟频率为125MHz
  • 100 Mbit/s速率下,时钟频率为25MHz
  • 10 Mbit/s速率下,时钟频率为2.5MHz
到了这里如果屏幕前的你产生了疑问,那证明你是真的用心了。有留意的朋友会发现,那数据线减少一半,但是时钟最高还是125MHz,为啥仍然能达到1Gbit/s的数据传输速率,这个很好解决,那就是进行时钟双边沿采样。

        

        这里我们还需要了解一个接口:MDIO 全称是 Management Data Input/Output ,直译过来就是管理数据输入输出接口,是一 个简单的两线串行接口,一根 MDIO 数据线,一根 MDC 时钟线。驱动程序可以通过 MDIO 和 MDC 这两根线访问 PHY 芯片的任意一个寄存器。
        MDIO 接口支持多达 32 PHY 。同一时刻 内只能对一个 PHY 进行操作,那么如何区分这 32 PHY 芯片呢?和 IIC 一样,使用器件地址即可,PHY 芯片寄存器地址空间为 5 位。同一 MDIO 接口下的所有 PHY 芯片,其器件地址不能冲突,必须保证唯一,具体器件 地址值要查阅相应的 PHY 数据手册。
        其实上述框架还并不完整,PHY芯片产生的差分信号是不能直接接入到网线的,还需要通过RJ45接口转换成标准的物理接口。RJ45 座要与 PHY 芯片连接在一起,但是中间需要一个网络变压器,网络变压器用于隔离以及滤波等,网络变压器也是一个芯片, 但是现在很多 RJ45 座子内部已经集成了网络变压器。
        完整的嵌入式网络接口硬件如下图所示:

2. 硬件原理图

        有了前面的基础知识铺垫,我们从原理图的硬件连接进一步了解其硬件框架。以RK3588的原理图为例进行讲解:

PHY: YT8521SH-CA

3. 设备树硬件描述

        前面从硬件的角度分析了其框架,那同样我们也可以在设备树硬件描述上也能体现出上述框架。

        MAC控制器设备节点:rk3588.dtsi

        下面部分通常需要驱动开发人员补充,原因是涉及一些自定义的PHY复位引脚,这些都是自定义的。

        先看一下引脚复用:rk3588-vccio3-pinctrl.dtsi

        从上述设备树节点先分析也是符和前面分析的框架的,对应以太网框架我们先分析到这里。

4. 工作定位

        到了这里肯能很多朋友会产生疑问,那实际开发过程中我们驱动开发工作人员需要做哪些工作?这里就需要我们清楚我们的定位了,一个千兆网卡在驱动上我们可以划分为两大核心部分:MAC控制器驱动+PHY驱动。

        通常MAC控制器驱动由原厂BSP工程师提供,不需要我们手搓。我们需要重点关注的是PHY驱动,当然由于业内早已建立了标准,内核源码已提供了一套通用的PHY驱动,这套PHY驱动至少能让网卡工作起来,不同的PHY厂商也会兼容这套标准。通常不同的厂商还会基于这套通用的驱动自定义属于他们自己的一套驱动实现更加完善的功能。

5. PHY驱动分析

        分析PHY驱动之前先补充一个知识点就是,MDIO 接口支持多达 32 个 PHY,它们是通过地址来区分的,通过不同的 PHY 芯片地址来对不同的 PHY 操作,YT8521SH通过设置PHYAD0引脚来设置其PHY地址。

下拉则地址为0x00000:

上拉则地址为0x00001:

        有了上述的PHY地址了解之后,我们再回头看看设备树节点是如何体现PHY地址的,在前面设备树MAC控制器节点里面有“phy-handle属性指定了phy,而phy节点的定义则挂载在了MDIO总线下。rgmii_phy0: phy@0节点名称的@后面的数值就是 PHY 地址。

        由于网络驱动框架比较复杂,如果这里贴代码展开讲解,估计很多朋友就绷不住了,因此我们同样是采样框架学习法,了解驱动框架,重点了解我们作为驱动开发者通常需要做哪些工作即可。

        本文我们不展开讲解MAC控制器驱动,这里直接抛出答案:MAC控制器驱动无非就是解析设备树节点,初始化MAC控制器、通过"phy-handle"属性解析PHY节点相关信息,做一系列的RGMII接口初始化,最终注册MDIO总线,注册PHY设备。

        讲解PHY驱动之前,先了解PHY子系统。PHY 子系统就是用于 PHY 设备相关内容的,分为 PHY 设备和 PHY 驱动,和 platform 总线一样,PHY 子系统也是一个设备、总线和驱动模型,这里的总线对应的就是MDIO总线。

        PHY 设备:

        Linux 内核使用 phy_device 结构体来表示 PHY 设备,结构体定义 在 include/linux/phy.h

        PHY 设备的注册过程一般是先调用 get_phy_device 函数获取 PHY 设备,在通过函数phy_device_register 注册phy_device。

        这里需要注意一点的是,PHY设备与PHY驱动匹配并不是通过compatible属性或name属性进行匹配的,而是通过PHY ID。   

        PHY 驱动:

        PHY 驱动使用结构体 phy_driver 表示,结构体也定义在 include/linux/phy.h 文件中

 

        可以看出,phy_driver 重点是大量的函数,编写 PHY 驱动的主要工作就是实现这些函数, 但是不一定全部实现。PHY 驱动的注册使用 phy_driver_register 函数。

        phy_driver 里面有两个 成员变量 phy_id phy_id_mask,表示此驱动所匹配的 PHY 芯片 ID 以及 ID 掩码,PHY 驱动编写人员需要给这两个成员变量赋值。phy_device 也有一个 phy_id 成员变量,表示此 PHY 芯 片的 IDphy_device 里面的 phy_id 是在注册 PHY 设备的时候调用 get_phy_id 函数直接读取 PHY 芯片内部 ID 寄存器得到的!很明显 PHY 驱动和 PHY 设备中的 ID 要一样,这样才能匹配 起来。如果 PHY 设备和 PHY 驱动匹配,那么就使用指定的 PHY 驱动,如果不匹配的话就使用Linux 内核自带的通用 PHY 驱动。

        MDIO 总线:
        PHY 子系统也是遵循设备、总线、驱动模型的,设备和驱动就是 phy_device 和 phy_driver。总线就是 MDIO 总线,因为 PHY 芯片是通过 MIDO 接口来管理的, MDIO 总线最主要的工作就是匹配 PHY 设备和 PHY 驱动。MDIO 总线数据结构在文件 drivers/net/phy/mdio_bus.c 中有如下定义。

 

        重点是总线的匹配函数为 mdio_bus_match,主要完成device和driver的匹配工作。
        通用 PHY 驱动:

        通用的PHY驱动 drivers/net/phy/phy_device.c

 

        phy_init 是整个 PHY 子系统的入口函数,调用 phy_driver_register 函数向内核直接注册一个通用 PHY 驱动:genphy_driver,也就是通用 PHY 驱动,也就是说 Linux 系统启动以后默认就已经存在了通用 PHY 驱动。

        PHY 厂商驱动:

        YT8521SH PHY驱动: drivers/net/phy/motorcomm.c

        此驱动里面的成员函数有一些是 PHY厂商自己编写的,有一些是直接用的通用 PHY 驱动的, 比如genphy_config_aneg
总结: 通常驱动人员需要操作的就是PHY驱动。关于MAC控制器是如何回调到PHY驱动的接口函数过程其实我们并不关心,我们更多的关注是如何在PHY驱动配置我们需要的网络功能。

        说实话,网口驱动知识内容非常多,讲到这里个人都差点忘了我们写这篇文章的最终目的,两个目的:

1. 如果要配置PHY芯片的某个功能,直接在PHY驱动操作就可以了。

2.需要学会如何在设备树里面补充完善PHY驱动相关的内容。

        第一点上面基本讲解完了,下面重点讲解第二点,回到最开始设备树节点描述。先提出问题?首先我们是如何知道补充以下内容?

        以RK3588为例:

参考官方手册,除此之外还可以参考官板对网卡的配置。

Rockchip_Developer_Guide_Linux_GMAC_CN.pdf

Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机森林算法原理

随机森林算法原理 算法流程随机森林的生成随机森林的预测 算法总结随机森林的优点随机森林的缺点 算法流程 随机森林的生成 输入训练数据 D,样本个数为 m ,待学习的决策树数量为 T。 对于 t 1,2,…,T,从 D 中有放回地采样 m 次&#xff0c…

asp.net repeater嵌套

OnItemCreated方式 <%-- 一级Repeater绑定班级信息 --%><asp:Repeater ID"rptClassInfo" runat"server" OnItemCreated"rptClassInfo_ItemCreated"><ItemTemplate><div class"classInfo"><h3><%# Ev…

35. Three.js案例-创建带阴影的球体与平面

35. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中用于渲染场景的主要类之一&#xff0c;它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters : Object) 参数类型描述parametersObject可选…

TouchGFX移植(2)STM32CubeMX配置

硬件平台&#xff1a;STM32F429IGT6 屏&#xff1a;7寸RGB&#xff0c; 1024 X 600分辨率 1&#xff09;选择芯片 2&#xff09;SYS配置 3&#xff09;RCC配置 4&#xff09;FMC配置&#xff08;驱动板载SDRAM&#xff09; 这里的配置需要结合硬件原理图的接线&#xff1a;…

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…

30.攻防世界unserialize3

进入场景 解读一下 这个类 xctf 中有一个公共属性 $flag &#xff0c;其值为 111 &#xff0c;并且定义了一个 __wakeup 魔术方法&#xff0c;当对象被反序列化时会自动调用该方法&#xff0c;该方法会输出 bad requests 并终止程序的执行。 ?code提示了参数 <?php clas…

串口UART

1.并行和串行通信 2.常见的串行通信 3.同步和异步通信。同步通信需要时钟信号&#xff0c;异步通信不需要时钟信号。 4.双工通信 5.串口UART常见的几种协议 6.ARM单片机硬件结构 GD32F303单片机串口连接方式。 7.串口寄存器 8.底层如何调用上层的函数&#xff0c;注册回调…

html基础-认识html

1.什么是html html是浏览器可以识别的的标记语言&#xff0c;我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…

Elasticsearch问题总结

Fielddata access on the_id field is disallowed, you can re-enable it by updating the dynamic cluster setting: indices.id_field_data.enabledElasticsearch默认禁用_id字段进行排序&#xff0c;这是因为_id字段通常不需要进行聚合或排序操作&#xff0c;启用字段数据可…

程序的基本结构

图3.1 顺序结构 顺序结构 程序自上而下逐行执行&#xff0c;一条语句执行完之后继续执行下一条语句&#xff0c;一直到程序末尾 图3.2 分支结构 上图的程序执行流程为: 当判断条件为真时&#xff0c;执行语句1&#…

Fiddler勾选https后google浏览器网页访问不可用

一、说明 最近电脑重新安装系统后&#xff0c;之前的所有工具都需要重新安装和配置&#xff0c;有个项目需要抓包https包查看一下请求的内容&#xff0c;通过Fiddler工具&#xff0c;但是开启后&#xff0c;发现https的无法抓取&#xff0c;同时google浏览器也不无法访问互联网…

4.9 TCP 拥塞控制算法

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 TCP 拥塞控制算法1.1 慢开始&#xff08;Slow Start&#xff09;1.2 拥塞避免&#xff08;Congestion Avoidance&#xff09;1.3 快重传&#xff08;Fast Retransmit&#x…

【优选算法篇】模拟算法的艺术:在不确定性中找到解法(上篇)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

pytest入门九:feature

fixture是pytest特有的功能&#xff0c;用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识&#xff0c;定义在函数前面。在你编写测试函数的时候&#xff0c;你可以将此函数名称做为传入参数&#xff0c;pytest将会以依赖注入方式&#xff0c;将该函数…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

如何在 Linux 服务器上部署 Pydio Cells 教程

简介 Pydio Cells 是一个开源的文档共享和协作平台&#xff0c;专为你的组织设计。它允许你在组织内部分享文档和文件&#xff0c;并让你完全掌控文档共享环境。 在本教程中&#xff0c;我们将向你展示如何在 Alma Linux 9 服务器上安装 Pydio Cells。你将使用 MariaDB 数据库…

RabbitMQ消息队列的笔记

Rabbit与Java相结合 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在配置文件中编写关于rabbitmq的配置 rabbitmq:host: 192.168.190.132 /…

点阵 LED 显示设计实验-微机原理与接口技术课程设计

1.实验要求 编写程序&#xff0c;控制点阵向上卷动显示‚西安唐都科教仪器公司&#xff01;‛。 实验系统中的 1616 LED 点阵由四块 88 LED 点阵组成&#xff0c;如图 4.58 所示&#xff0c;88点阵内部结构图如图 4.59 所示。由图 4.59 可知&#xff0c;当行为‚0‛&#xff0c…

【教程】让Jupyter支持打开CSV和Excel(xlsx)文件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 支持CSV JupyterLab本身支持直接打开CSV文件&#xff0c;因此只需要在JupyterLab的文件浏览器中找到CSV文件并双击它&#xff0c;就可以在JupyterLab的…

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…