了解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 比较λ不同值时…

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

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

图(dfs与bfs)算法2

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

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 …

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

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

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

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

固定资产分类,提升资产盘活效益

固定资产是企业长期使用的重要资源,涵盖范围广、种类多,不同的资产需要针对性管理。通过科学的分类与高效的盘活策略,不仅可以优化资源配置,还能提升企业资产的利用效率和经济效益。以下将详细解析固定资产的分类方式和盘活效益的…

【字符串匹配算法——BF算法】

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 BF算法介绍及过程演示代码实现过程下节预告KMP算法利用next数组存储子串中j回退的位置(…

Linux 文件系统目录结构及其简要介绍

Hello! 亲爱的小伙伴们,大家好呀(Smile~)!我是 H u a z z i Huazzi Huazzi,欢迎观看本篇博客,接下来让我们一起来学习一下Linux 文件系统目录结构吧!祝你有所收获! 本篇博客的目录&a…

小米准备入局Nas?Nas究竟是啥?能干啥?

一开头就来了个三连问:小米准备入局Nas?Nas究竟是啥?Nas能干啥? 好像这段时间Nas这个词频频出现,但很多小伙伴都不知道这个是什么设备。首先咱们来解决一下名词Nas是什么意思。 什么是Nas? 为了尽可能解释…

基于Socket实现客户端和服务端的Tcp通信(C#)

0.前言 使用C#和Unity实现复刻Liar’s bar中的功能 软件开发大作业 本系列文章用于记录与分享开发过程中使用到的知识点,以及常见错误 本文主要描述有关网络编程的内容 目录 0.前言1.使用Socket搭建Server1.1Server端的Socket连接1.2 Server端接收Client的信息1.3…

游戏AI实现-寻路算法(A*)

A*(A-star)是一种图遍历和寻路算法,由于其完整性、最优性和最佳效率,它被用于计算机科学的许多领域。给定一个加权图、一个源节点和一个目标节点,该算法将找到从源到目标的最短路径(相对于给定的权重&#…

汽车供应链 “剧变”开始,“智能感知潜在龙头”诞生

智能汽车产业链“剧变”已经开启,智能感知软硬件能力的权重正在不断被放大。 比如满足高阶泊车的第二代AK2超声波传感器、满足人机共驾场景需求的电子外后视镜(CMS)、iTOF 3D成像视觉感知(用于舱内监控)等新产品&…

Latex中表格添加底部文本注释并调整对齐

如何实现从第一个表到第三个表的转换, 其中主要涉及到两点: (1)底部脚注与表格自动对齐并缩进换行 (2)表格自适应页面宽度 底部脚注的对齐与换行缩进需要用到 \usepackage{threeparttable} \usepackage{…

html基础-认识html

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