了解ARM的千兆以太网——RK3588
1. 简介
本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。
2. 基础知识介绍
在嵌入式ARM中实现以太网的解决方案通常有以下两种,通常在性能较低的单片机领域其SOC内部是不具备MAC控制器,但又有需求可以使用方案1这种架构,但在高性能的ARM处理器,例如RK3588这种SOC其内部已集成MAC控制器,可以直接选用方案2。
本文重点解方案2,那么在开始之前,先了解PHY芯片与MAC控制器之间的的接口协议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



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 芯 片的 ID,phy_device 里面的 phy_id 是在注册 PHY 设备的时候调用 get_phy_id 函数直接读取 PHY 芯片内部 ID 寄存器得到的!很明显 PHY 驱动和 PHY 设备中的 ID 要一样,这样才能匹配 起来。如果 PHY 设备和 PHY 驱动匹配,那么就使用指定的 PHY 驱动,如果不匹配的话就使用Linux 内核自带的通用 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
说实话,网口驱动知识内容非常多,讲到这里个人都差点忘了我们写这篇文章的最终目的,两个目的:
1. 如果要配置PHY芯片的某个功能,直接在PHY驱动操作就可以了。
2.需要学会如何在设备树里面补充完善PHY驱动相关的内容。
第一点上面基本讲解完了,下面重点讲解第二点,回到最开始设备树节点描述。先提出问题?首先我们是如何知道补充以下内容?
以RK3588为例:
参考官方手册,除此之外还可以参考官板对网卡的配置。
Rockchip_Developer_Guide_Linux_GMAC_CN.pdf
Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf
相关文章:

了解ARM的千兆以太网——RK3588
1. 简介 本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...

JavaFX使用jfoenix的UI控件
jfoenix还是一个不错的样式,推荐使用,而且也可以支持scene builder中的拖拖拽拽 需要注意的是过高的javafx版本可能会使得某些样式或控件无法使用 比如alert控件,亲测javaFX 19版本可以正常使用 1.在pom.xml中引入依赖 GitHub地址https://gi…...
Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
Hello! 认真好学的小伙伴们,大家好呀(Respect~)!我是 H u a z z i Huazzi Huazzi,欢迎观看本篇博客,接下来让我们一起来学习 Ubuntu命令大全 吧!祝你有所收获! 文章目录 前言&#x…...
单片机:实现教学上下课的自动打玲(附带源码)
单片机实现教学上下课的自动打铃 在学校或其他教育机构中,定时的打铃系统被广泛应用,用于提醒学生和老师上下课的时间。一个简单的自动打铃系统可以通过单片机实现,结合蜂鸣器和定时器控制,可以在设定的时间点自动打铃࿰…...

进程通信方式---共享映射区(无血缘关系用的)
5.共享映射区(无血缘关系用的) 文章目录 5.共享映射区(无血缘关系用的)1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理:共享映射区是将文件…...

深度学习实战智能交通计数
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…...

【MySQL】MySQL表的操作
【MySQL】MySQL表的操作 🥕个人主页:开敲🍉 🔥所属专栏:MySQL🍋 🌼文章目录🌼 1. 创建表 2. 查看表结构 3. 修改表 4. 删除表 1. 创建表 create table table_name(表名称)( fiel…...

Redis篇-12--数据结构篇4--Hash内存模型(数组,链表,压缩列表zipList,哈希表,短结构)
Redis的Hash数据结构用于存储键值对(key-value形式)的集合(类似java中HashMap或对象)。为了在保证高效性能的同时节省内存,Redis对Hash的底层实现进行了多种优化。特别是通过使用压缩列表(ziplistÿ…...

二、windows环境下vscode使用wsl教程
本篇文件介绍了在windows系统使用vscode如何连接使用wsl,方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode,按快捷键CtrlShiftX打开插件市场,搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…...

Qwen2-VL微调体验
1.配置环境 2.数据集准备 3.模型下载 4.注册SwanLab 5.微调 6.训练过程可视化 1.配置环境 本博客使用的是2B模型,所以仅用了单卡3090,若大一点的模型,自行根据实际情况准备显卡 安装Python>3.8 安装Qwen2-VL必要的库 pip install…...
论文的模拟环境和实验环境
模拟环境和实验环境 在撰写SCI计算机领域论文时,模拟环境和实验环境是两个重要的概念,它们之间存在显著的差异。 模拟环境主要是利用计算机、数学方法等手段对实际系统进行描述和分析的过程。在计算机科学中,模拟环境可以用于模拟各种算法、系统或网络的行为,以便在不需要…...
MySQL EXPLAIN 详解:一眼看懂查询计划
在日常的数据库开发中,我们经常需要分析 SQL 查询性能,而 EXPLAIN 是 MySQL 提供的利器,可以帮我们快速理解查询计划,优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义,并结合实际案例分享优化思路。 一、什么是…...
自动呼入机器人如何与人工客服进行无缝切换?
自动呼入机器人如何与人工客服进行无缝切换? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 自动呼入机器人与人工客服的无缝切换详解 自动呼入机器人与人工客服之间的无缝切换是确保客户体验连续…...
二分类模型的性能评价指标
1. 混淆矩阵 (Confusion Matrix) 预测正类预测负类实际正类 (P)True Positive (TP)False Negative (FN)实际负类 (N)False Positive (FP)True Negative (TN) True Positive (TP): 模型正确预测为正类的样本数。True Negative (TN): 模型正确预测为负类的样本数。False Positi…...

鸿蒙操作系统简介
华为鸿蒙系统(HUAWEI HarmonyOS),是华为公司于2019年8月9日在东莞举行的华为开发者大会(HDC.2019)上正式发布的面向全场景的分布式操作系统,可以创造一个超级虚拟终端互联的世界,将人、设备、场…...
单片机:实现蜂鸣器数码管的显示(附带源码)
单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管…...

C语言期末复习笔记(上)
目录 一、为什么要学习C语言 1.C语言适合做什么 2.开发C程序的步骤 3.常用术语 二、C语言数据结构 1.常量与变量 (1)常量 编辑 (2)变量 2.数据类型 编辑 (1)数据类型的分类 (2&a…...

HarmonyOS 实时监听与获取 Wi-Fi 信息
文章目录 摘要项目功能概述代码模块详细说明创建 Wi-Fi 状态保存对象Wi-Fi 状态监听模块获取当前 Wi-Fi 信息整合主模块 运行效果展示性能分析总结 摘要 本文展示了如何使用 HarmonyOS 框架开发一个 Demo,用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息…...

Unity超优质动态天气插件(含一年四季各种天气变化,可用于单机局域网VR)
效果展示:https://www.bilibili.com/video/BV1CkkcYHENf/?spm_id_from333.1387.homepage.video_card.click 在你的项目中设置enviro真的很容易!导入包裹并按照以下步骤操作开始的步骤! 1. 拖拽“EnviroSky”预制件(“environme…...

1 JVM JDK JRE之间的区别以及使用字节码的好处
JDK jdk是编译java源文件成class文件的,我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹,如下图所示: 遵循着编译原理,把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...