STM32MP157驱动开发——Linux 网络设备驱动

news2024/9/23 21:18:43

STM32MP157驱动开发——Linux 网络设备驱动

  • 一、简介
    • STM32MP1 GMAC 接口简介
    • YT8511C 详解
  • 二、驱动开发
    • 1.网络外设的设备树
    • 2.设备驱动
  • 三、测试
    • 网速测试


参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux 网络驱动

一、简介

  网络驱动是 linux 驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能。本节就学习一下最后一种驱动大类的开发。
  随着技术的不断发展,现在只需要一个芯片就可以实现有线网卡功能。但也有一些 SoC 没有内部 MAC,那么也可以使用外置 MAC 芯片的方案。首先,嵌入式网络硬件分为两部分:MAC 和 PHY,MAC 是类似 I2C 控制器、SPI 控制器一样的外设,但是光有 MAC 还不能直接驱动网络,还需要另外一个芯片:PHY,因此对于内置 MAC 的 SoC,其外部必须搭配一个 PHY 芯片。
  也有一些 SoC 没有内部 MAC,那么就由外置 MAC 对 SoC 提供了一个 SRAM 接口,SoC 会以 SRAM 的方式操作 MAC 芯片。有些外置的网络芯片更强大,内部甚至集成了硬件 TCP/IP 协议栈,对外提供一个 SPI 接口,比如 W5500。这个一般用于单片机领域,单片机通过 SPI 接口与 W5500 进行通信,直接通过 SPI来操作 W5500,简化了单片机联网方案。这种方案的缺点是网络效率不高,因为一般芯片内置的 MAC 会有网络加速引擎,比如网络专用 DMA,网络处理效率会很高。另外相比较PHY 芯片,这类芯片的成本较高。
  常见的通用 SoC 都会集成网络 MAC 外设,比如 STM32F4/F7/H7 系列、NXP 的 I.MX系列以及 STM32MP1 系列,内部集成网络 MAC 的优点如下:

*内部 MAC 外设会有专用的加速模块,比如专用的 DMA,加速网速数据的处理

  • 网速快,可以支持 10/100/1000M 网速
  • 外接 PHY 可选择性多,成本低

内部的 MAC 外设会通过相应的接口来连接外部 PHY 芯片,根据数据传输模式不同,大致可以分为以下两类:

  • 1.MII/RMII 接口:支持 10Mbit/s 和 100Mbit/s 数据传输模式
  • 2.GMII/RGMII 接口:支持 10Mbit/s、100Mbit/s 以及 1000Mbit/s 数据传输模式。

另外主控 SoC 需要配置或读取 PHY 芯片,也就是读写 PHY 的内部寄存器,所以还需要一个控制接口,叫做 MIDO,MDIO 很类似 IIC,也是两根线,一根数据线叫做 MDIO,一根时钟线叫做 MDC。
在这里插入图片描述
在做项目时,如果需要用到网络功能,强烈建议选择内部带有网络 MAC 外设的主控 SoC,综合成本、网络传输速率、以及接口开发的效率来看,这种方式更加便捷。

有关 MII/RMII、GMII/RGMII 接口的介绍,就参考原子哥教程或是其他教程进行了解,这里就先略过。

STM32MP1 GMAC 接口简介

  STM32MP1 内核集成了一个 10M/100M/1000M 的网络 MAC,支持双工或者半双工模式下运行。MAC 可编程,有直接存储器接口的专用 DMA,介质访问控制器(MAC)和支持多种格式的 PHY 接口模块。主要特性如下:

  • ① 支持全工和半双工操作。
    ② 全双工流控制操作(IEEE 802.3X 暂停包和优先级流控制)
    ③ 报头和帧起始数据(SFD)在发送模式下自动插入、在接收中自动删除
    ④ 可逐帧控制 CRC 和 pad 自动生成
    ⑤ 可编程数据包长度,支持标准以太网数据包或高达 16KB 的巨型以太网数据包
    ⑥ 可编程数据包间隙
    ⑦ 两组 FIFO:一个具有可编程阈值功能的 4096 字节发送 FIFO 和一个具有可配置阈值功能的 4096 字节接收 FIFO

YT8511C 详解

  笔者所使用的开发板上,使用的是 YT8511C 这颗 PHY 芯片。YT8511 通过 PHYADDR[2:0] 这三个引脚来确定 PHY 芯片地址,其中 PHYADDR2~PHYADDR0 分别对应 LED_AC、RXD1 和 RXD0 这三个引脚:
在这里插入图片描述
  开发板上 YT8511 的地址为 0X00。低功率模式是由 RXD3 引脚控制。RXD3 为低电平时 YT8511C 进入低功率模式,RXD3 为高电平时 YT8511C 芯片就为正常功率模式。板子上的 RXD3 引脚直接连接了高电平,所以为正常模式。
LED_1000 引脚用来控制工作模式。LED_1000 为低电平就进入测试模式,为高电平就是正常模式。默认正常模式。

  网络工作的时候需要和 PHY 之间有一个 125MHz 的时钟,由 YT8511C 提供这个 125MHz 的时钟。但是默认情况下,YT8511C 这个 125MHz 时钟没有使能,所以需要配置寄存器。需要用到 YT8511C 的时钟控制寄存器,这是个扩展寄存器,地址为 0X0C,时钟控制寄存器的 bit2 和 bit1 用于设置时钟输入,当 bit2:1 为 11 的时候,输出 125M 时钟。
在这里插入图片描述

二、驱动开发

原理图:
在这里插入图片描述

1.网络外设的设备树

  STM32MP1 系列 SoC 网络绑定文档为 Documentation/devicetree/bindings/net/stm32-dwmac.txt,描述了 STM32MP1 系列的 SoC 网络设备树节点的要求。此外,还有一个 Documentation/devicetree/bindings/net/ethernet.txt 文档,描述了网络设备节点的一些通用属性。
  在 arch/arm/boot/dts/stm32mp152.dtsi 设备树文件中,定义了一个网络设备节点。根据其 compitable 属性值,就能找到 drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c 驱动文件。不过此驱动由 ST 官方编写,不能直接使用。在正点原子的设备树文件 stm32mp157d-atk.dtsi 中,追加了一个 ethernet0 节点:
在这里插入图片描述
phy-mode:该属性值是一个字符串,表示网络所使用的 PHY 接口模式,是 MII、RMII、GMII 还是 RGMII 等,是一个标准的属性,支持的字符串值有‘mii’、‘gmii’、‘sgmii’、‘rmii’、‘rgmii’、‘rgmii-id’、‘rgmii-rxid’、‘rgmii-txid’、‘xgmii’等等。rgmii-id’表示使用的是 RGMII 接口模式。
max-speed:PHY 支持的最高速度,比如 10、100 或 1000。
phy-handle:连接到此网络设备的 PHY 芯片句柄。
mdio:用于描述 MDIO 总线,其中的 reg 属性表示 PHY 芯片的地址。

2.设备驱动

YT8511 芯片为国产的网络芯片,在 Linux 内核没有对应的 PHY 驱动,但是厂家会提供 linux 下的 PHY 驱动。此外原厂驱动有点小问题,没有使能 YT8511 的 125M 时钟输出,导致驱动工作不正常(旧版本,新版是否修复尚未查证),所以就将原子哥提供的修改好的文件进行拷贝。将 motorcomm.c 和 motorcomm_phy.h 分别拷贝到 Linux 源码下的 drivers/net/phy 和 include/linux 目录下,然后在 drivers/net/phy/Makefile 文件中添加如下语句:

obj-$(CONFIG_MOTORCOMM_PHY) += motorcomm.o

在这里插入图片描述
此语句将驱动添加到内核进行编译,最后还要修改 Kconfig,在 drivers/net/phy/Kconfig 文件中添加如下语句:
在这里插入图片描述
这样就可以通过 menuconfig 图形化界面来使能或禁止驱动了。
在这里插入图片描述
然后就可以重新编译出内核镜像,启动开发板。

三、测试

在这里插入图片描述
开发板启动时终端会打印以上信息。由于笔者路由器限制,所以只显示是百兆以太网。

网速测试

首先使能 iperf3 命令,在 buildroot 的 menuconfig 中,选中以下选项:
在这里插入图片描述
修改后编译出根文件系统,启动开发板。
然后在 ubuntu 下安装 iperf3 工具:

sudo apt-get install iperf3

将 ubuntu 作为 iperf3 的服务器,开发板作为客户端,并进行测试。
ubuntu下执行:

iperf3 -s

开发板下执行:

iperf3 -c [server_ip]

在这里插入图片描述
就可以测试出带宽。(笔者受限于路由器的带宽速度,正常情况应该是千兆带宽。也可以通过直连ubuntu和开发板进行测试。)

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

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

相关文章

[C语言]三种方法实现n的k次方(递归/调用math库函数/实现pow函数)[含递归图解说明]

目录 1.调用math库函数中的pow函数实现n的k次方 2.创造pow函数实现n的k次方 3.递归实现n的k次方&#xff08;含图解&#xff09; 1.调用math库函数中的pow函数实现n的k次方 pow函数的功能&#xff1a;计算n的k次幂 pow格式&#xff1a;pow(n,k) #include <stdio.h>#in…

@NotEmpty、@NotBlank、@NotNull 区别和使用

这种注解通常使用场景在前端发送过来的数据&#xff0c;先进行校验处理&#xff0c;在进行逻辑判断的&#xff0c;所以在进行校验处理的时候&#xff0c;我们通常会使用这三种注解来进行判断传过来的值 1NotNull 适用于基本数据类型(Integer&#xff0c;Long&#xff0c;Doubl…

回收租赁商城系统功能拆解01讲-产品架构

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

【谷粒商城基础篇】基础环境搭建

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

关于yum源的总结

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录1 相关概念1.1 rpm与yum1.2 yum源与repo文件2 yum源的种类2.1 官方源2.…

【HTML】耗时一下午,整理出了一个精美的响应式登陆注册表单(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【OpenDDS开发指南V3.20】第八章:opendds_idl

opendds_idl是构建opendds和opendds应用程序过程中使用的代码生成器之一。 它可以用多种不同的方式定制如何从IDL文件生成源代码。 有关默认使用模式的概述,请参见第2.1.2节。 OpenDDS IDL编译器是使用位于$DDS_ROOT/bin/(PATH上)的OpenDDS_IDL可执行文件调用的。 它解析…

SpringBoot+RabbitMQ(官方案例)

在线文档项目结构 1.源码克隆&#xff1a;git clone https://github.com/spring-guides/gs-messaging-rabbitmq.git 2.包含两个项目initial和complete&#xff0c;initial可以根据文档练习完善&#xff0c;complete是完整项目 3.功能描述&#xff1a;构建应用程序&#xff0c;S…

inventor(2):设置单位,显示完整工具区/功能区,创建分割面

好久没用inventor了&#xff0c;记录一些重新学习的基本操作 文章目录1. inventor设置单位为cm2. inventor显示完整工具区/功能区3. inventor创建分割面1. inventor设置单位为cm inventor默认单位为in(英尺)&#xff0c;国内常用习惯为cm 一次点击&#xff1a;工具–选项–文档…

这篇文章会让你熟悉文件的各种操作,让你对文件的认识更加深入【c语言】

文章目录为什么使用文件什么是文件文件名文件的打开和关闭文件指针文件的顺序读写fgetcfputcfgetsfprintffscanffwritefread对比一组函数sprintfsscanf文件的随机读写fseekftellrewind文本文件和二进制文件文件读取结束的判定文件缓冲区为什么使用文件 把数据存放在磁盘文件、存…

2022 SuperMap开发者大会全议程公布,16个专场快来pick

2022年10月12日-14日&#xff0c;2022 SuperMap开发者大会(2022 SuperMap Developer Conference,简称“SDC 2022”)将在线举办。3天时间&#xff0c;16场专题论坛&#xff0c;聚焦GIS前沿技术和热点应用领域开发&#xff0c;分享50场开发实战报告&#xff0c;面向不同应用场景&…

基于小程序语法的跨端开发平台大盘点

2022年12月18日&#xff0c;微信推出了“Donut”开发平台&#xff0c;目前已经开始限时免费公测。这款跨端开发平台与Flutter、React Native、Taro等跨端框架最大的不同是&#xff1a;跨端的能力是基于小程序原生语法进行转译。这背后不得不让人联想到此次开发平台的推出&#…

P1046 [NOIP2005 普及组] 陶陶摘苹果————C++

文章目录题目[NOIP2005 普及组] 陶陶摘苹果题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路Code运行结果题目 [NOIP2005 普及组] 陶陶摘苹果 题目描述 陶陶家的院子里有一棵苹果树&#xff0c;每到秋天树上就会结出 101010 个苹果。苹果成熟的时候&…

实验十一、多级放大电路的参数设置

一、题目 利用 Multism 为图1所示电路选择电路参数&#xff0c;使之正常工作&#xff0c;并测试 QQQ 点、电压放大倍数和输入电阻。 图1多级放大电路图1\,多级放大电路图1多级放大电路 二、仿真电路 在Multism环境下搭建图1所示电路&#xff0c;选择电路参数&#xff0c;如图…

【谷粒商城基础篇】商品服务开发:基础概念、三级分类

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

再快一点?动态内容如何加速

未来已来&#xff0c;只是不均衡地分布在当下 大家好&#xff0c;我是菜农&#xff0c;欢迎来到我的频道。 近年来 Web 3 的概念在程序员的小圈子也几乎是人尽皆知了。功能再强&#xff0c;噱头再足&#xff0c;但是如果访问速度没有跟上&#xff0c;一起都是浮云。哪怕拿现在…

封装和解封装、跨层封装

封装和解封装 我们一般把数据从应用层开始到数据链路层的加工过程称为封装&#xff0c;反过程称为解封装 封装 — 将每一层最重要的数据添加到原始数据当中&#xff0c;来实现这一层的功能。 应用层 — 应用需要进行封装&#xff0c;但是&#xff0c;封装方式取决于不同的应用…

hiveSql 京东面试题-有效值问题

hiveSql 京东面试题-有效值问题需求准备数据分析实现最后需求 有入库成本表&#xff0c;一个商品每次入库就会产生一条数据&#xff0c;里面包含商品id&#xff0c;入库时间time&#xff0c;以及入库采购的成本。但由于某些某些原因&#xff0c;导致表中某些数据的成本是有丢失…

MySQL-慢sql优化思路

目录 1、开启Mysql慢查询 1.1、查看慢查询相关配置 1.2、查询慢查询sql耗时临界点 1.3、开启Mysql慢查询 2、explain查看SQL执行计划 2.1、Select_type 2.2、Type 2.3、Possible_keys 2.4、Key 2.5、Key_len 2.6、Rows 2.7、Extra 3、profile 分析执行耗时 3.1、…

gin web开发模板渲染

一、模板输出模板输出首先需要指定模板所放位置 r.LoadHTMLGlob("templates/**/*")参数中&#xff1a; **代表匹配任意名称的目录 *代表匹配任意名称的模板文件"templates/**/*" 代表可以匹配指定模板文件到 templates目录下的 hello/index.tmpl user/inde…