了解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.mzph.cn/web/63374.shtml

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

相关文章

Springboot家政服务管理系统

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…

DC-9笔记

靶机信息 官网:DC: 9 ~ VulnHub 只有一个flag,官网上没给其他提示 信息收集 nmap 192.168.66.2-254nmap 192.168.66.146 -A -p-开放了80端口,22端口是filtered的,被过滤? NMAP 六种端口状态解读_nmap filtered-CSDN博客 那来看看http服务吧 http(80) 页脚是空白的,插件也…

STM32-笔记3-驱动蜂鸣器

1、复制03项目,重命名为04项目 打开04项目的Drivers/BSP/led文件夹,把led文件夹更改为beep文件夹,改文件夹内部的.c和.h文件更改为beep.c和beep.h文件,如下图所示。 2、打开工程文件 出现弹窗,显示找不到xx文件&#…

PHP开发日志 ━━ 基础知识:四种不同的变量返回方式该如何调用

最近在给框架升级,其中涉及到古早的缓存系统升级,现在准备区分类型为混合、变量和普通文件,那么变量用什么形式存储到缓存才能给后续开发带来便利和通用性呢?于是就涉及到了本文的php基础知识。 好吧,又是一个无用的知…

概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution

目录 1 泊松分布的基本内容 1.1 泊松分布的关键点 1.1.1 属于离散分布 1.1.2 泊松分布的特点:每个子区间内概率相等 , λ就是平均概率 1.2 核心参数 1.3 pmf公式 1.4 期望和方差 2 例1:用EXCEL计算泊松分布的概率 3 比较λ不同值时…

Java中的垃圾收集器

文章目录 1. 理解不同类型的垃圾收集器1.1 Serial 收集器1.2 Parallel (吞吐量) 收集器1.3 CMS (Concurrent Mark-Sweep) 收集器1.4 G1 (Garbage First) 收集器1.5 ZGC 和 Shenandoah GC1.6 Epsilon GC1.7 ParNew 收集器1.8 Zing (Azul Systems) 2. 优化垃圾收集器的选择和配置…

测试工程师八股文05|功能测试、业务测试

一、基础概念 1、软件测试分类 1️⃣按照软件产生的阶段划分 单元测试:针对程序源代码进行测试【开发自测】集成测试:针对模块之间功能交互进行测试系统测试:对整个系统(功能、非功能)进行全面测试验收测试&#xff…

图(dfs与bfs)算法2

进度:15/100 原题1: 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 (力扣的图) 原题2: 给定二叉树的根节点 root ,返回所有左叶子之和。 原题3: 给…

《鸿蒙开发-答案之书》字符串占位符格式化

《鸿蒙开发-答案之书》字符串占位符格式化 先在string.json定义: {"name":"message_arrive","value":"We will arrive at %s."}使用,它有两种使用方式: 方式一: Text($r(app.string.…

Redis bitmaps 使用

应用场景: 记录id为 1 的用户,2024年12月签到情况,并统计; 记录 1号签到 zxys-redis:0>setbit 1:202412 1 1 记录 2号签到 zxys-redis:0>setbit 1:202412 2 1 记录 3号未签到 zxys-redis:0>setbit 1:202412 3 0 …

【微服务】SpringBoot 整合Redis Stack 构建本地向量数据库相似性查询

目录 一、前言 二、向量数据库介绍 2.1 什么是向量数据库 2.2 向量数据库特点 2.3 向量数据库使用场景 三、常用的向量数据库解决方案 3.1 Milvus 3.1.1 Milvus是什么 3.1.2 Milvus主要特点 3.2 Faiss 3.2.1 Faiss是什么 3.2.2 Faiss主要特点 3.3 Pinecone 3.3.1 …

【数据库】大二数据库复习范围 (快速版)帮助你快速复习数据库

第一章 1. 信息=数据+语义 2:数据库管理系统(database management system, DBMS) 3. 数据库系统(database system, DBS)由数据库、数据库用户、计算机硬件系统和计算机软件系统等几部分组成 4. 数据模型按应用层次可分为概念模型、逻辑模型和物理模型。 5.每个二维表…

FMIKit-Simulink 常见问题解决方案

将解压后的文件夹添加到 MATLAB 路径中: addpath(fullfile(pwd, FMIKit-Simulink-3.1));初始化 FMIKit: FMIKit.initialize(); 设置求解器rtwsfcnfmi.tlc、或grtfmi.tlc再CtrlB即可。 帮助文档可查看导出FUM和导入FMU。 FMIKit-Simulink-3.1\html\index…

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件,比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…

sunset: midnight

https://www.vulnhub.com/entry/sunset-midnight,517/ 主机发现端口扫描 探测存活主机,8是靶机 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-05 16:49 CST Nmap scan report for 192.168.56.1 …

【PyTorch】动态调整学习率 torch.optim.lr_scheduler.StepLR 调度器

文章目录 1. torch.optim.lr_scheduler.StepLR 官方文档详解2. 使用示例2.1 官方提供使用示例2.2 自己写代码测试方法2.2.1 get_last_lr() 方法2.2.2 state_dict() 方法2.2.3 load_state_dict() 保存和加载调度器 3. 思考3.1 为什么需要state_dict()3.2 get_lr() 与 get_last_l…

伊克罗德与九科信息共同发布RPA+AI智能机器人解决方案

12月12日,伊克罗德信息在上海举办“创见AI,迈进智能化未来——科技赋能零售电商”活动,与九科信息、亚马逊云科技共同探讨与分享,融合生成式AI技术和智能自动化(RPA,Robotic Process Automation)在电商零售…

hutool一些典型的方法使用笔记

hutool一些典型的方法使用笔记 1 克隆1.1 深克隆 2类型转换2.1其他类型转换为字符串2.2 转换为日期对象2.3 数组转集合2.4 Unicode和字符串转换2.5 数字转中文 文档地址:https://blog.csdn.net/dxjren/article/details/144468399 1 克隆 1.1 深克隆 定义一个实体类…

QT实战经验总结 连载中

QT实战经验总结 在看书系统学习后,就开始实战了,会遇到很多问题1.信号和槽的思考2.在python 或 C 代码中,对 QML 代码中控件的调用关于在一个窗口上不断打开新窗口 在看书系统学习后,就开始实战了,会遇到很多问题 pyt…

从 CephFS 到 JuiceFS:同程旅行亿级文件存储平台构建之路

随着公司业务的快速发展,同程旅行的非结构化的数据突破 10 亿,在 2022 年,同程首先完成了对象存储服务的建设。当时,分布式文件系统方面,同程使用的是 CephFS,随着数据量的持续增长,CephFS 的高…