嵌入式驱动开发详解21(网络驱动开发)

news2025/2/19 8:19:35

文章目录

  • 前言
  • 以太网框架
  • ENET 接口简介
    • MAC接口
    • MII \ RMII 接口
    • MDIO 接口
    • RJ45 接口
  • PHY芯片
  • 以太网驱动
  • 驱动挂载
  • wifi模块挂载
  • 后续

前言

linux驱动主要是字符设备驱动、块设备驱动还有网络设备驱动、字符设备驱动在本专栏前面已经详细将解了,网络设备驱动本文会做简要讲解,主要是讲解网络设备里面的以太网,PHY芯片,usb和sdio的wifi驱动挂载注意事项等,对网络内部实现仅仅只做简要介绍。

以太网框架

嵌入式网络硬件分为两部分:MAC 和 PHY,MAC 类似 I2C 控制器、SPI 控制器一样的外设,其外部必须搭配一个 PHY 芯片。

  • 内部无MAC外设
    • 找个外置的 MAC 芯片,一般这种外置的网络芯片都是 MAC+PHY 一体的。比如三星 linux 开发板里面用的最多的 DM9000,DM9000 对 SOC 提供了一个 SRAM 接口,但是此芯片需要进行手动开发网络的协议栈,类似STM32连接网络时所用的lwip。
    • 外置的网络芯片更强大,内部甚至集成了硬件 TCP/IP 协议栈,对外提供一个 SPI 接 口,比如 W5500。一般用于单片机领域,由于内置了硬件 TCP/IP 协议栈,因此不需要移植软件协议栈,直接通过 SPI 来操作 W5500。
    • 让不支持网络的 SOC 能够实现网络功能;网络效率不高,一般芯片内置的 MAC 会有网络加速引擎,比如网络专用 DMA;成本较高,可选择性少。
  • 内部有MAC外设
    在这里插入图片描述
    • 上图是内部MAC,外置PHY芯片和RJ45坐子的连接示意图,关于内部有MAC的详解在接下来的内容中进行介绍。

ENET 接口简介

MAC接口

I.MX6ULL 内核集成了两个 10/100Mbit/S 的网络 MAC,符合 IEEE802.3-2002 标准,MAC 层支持双工、半双工局域网。MAC 可编程、可以作为 NIC 卡或其他一些交换器件。根据 IETF RFC 2819 协议,MAC 实现了 RMON(Remote Network Monitoring)计数功能。MAC 内核拥有硬件加速处理单元来提高网络性能,硬件加速单元用于处理 TCP/IP、UDP、ICMP 等协议。通过 硬件来处理帧头等信息,效果要比用一大堆软件处理要好很多。ENET 外设有一个专用的 DMA, 此 DMA 用于在 ENET 外设和 SOC 之间传输数据,并且支持可编程的增强型的缓冲描述符,用以支持 IEEE 1588

MII \ RMII 接口

内部 MAC 通过 MII/RMII 接口来与外部的 PHY 芯片连接,完成网络数据传输

  • MII接口

    • MII 全称是 Media Independent Interface,直译过来就是介质独立接口,它是 IEEE-802.3 定 义的以太网标准接口
      在这里插入图片描述

    • 前面的引脚含义看名称可以看出来不做解释,RX_DV:接收数据有效,作用类似 TX_EN。 CRS:载波侦听信号。 COL:冲突检测信号。

    • 发送时钟和接收时钟如果网速为100M的话时钟频率为25MHz。

    • MII 接口的缺点就是所需信号线太多,因此引出了RMII接口

  • RMII接口

    • RMII 全称是 Reduced Media Independent Interface,翻译过来就是精简的介质独立接口,也 就是 MII 接口的精简版本。
      在这里插入图片描述
    • REF_CLK:参考时钟,由外部时钟源提供, 频率为 50MHz。这里与 MII 不同,MII 的接收和发送时钟是独立分开的,而且都是由 PHY 芯片提供的。
    • RMII 接口只需要 7 根数据线,相比 MII 直接减少了 9 根,极大的 方便了板子布线
  • 此外还有GMII、RGMII、SMII、SMII 等接口,基本都是大同小异。

MDIO 接口

MDIO 全称是 Management Data Input/Output,直译过来就是管理数据输入输出接口,是一 个简单的两线串行接口,一根 MDIO 数据线,一根 MDC 时钟线。驱动程序可以通过 MDIO 和 MDC 这两根线访问 PHY 芯片的任意一个寄存器。

  • MDIO 接口支持最多可达 32 个 PHY。同一时刻内只能对一个 PHY 进行操作,使用器件地址进行区分
  • 同一 MDIO 接口下的所有 PHY 芯片,其器件地址不能冲突,必须保证唯一

RJ45 接口

在这里插入图片描述

  • 网络设备是通过网线连接起来的,插入网线的叫做 RJ45 座,RJ45 座要与 PHY 芯片连接在一起
  • 中间需要一个网络变压器,网络变压器用于隔离以及滤波等,网络变压器也是一个芯片。
  • 很多 RJ45 座子内部已经集成了网络变压器,内置网络变压器的 RJ45 座和不内置的引脚一样,但是一般不内置的 RJ45 座会短一点。
  • RJ45 座子上一般有两个灯,一个黄色(橙色),一个绿色,绿色亮的话表示网络连接正常,这两个灯由 PHY 芯片控制,PHY 芯片会有两个引 脚来连接 RJ45 座上的这两个灯。

PHY芯片

PHY 芯片寄存器地址空间为 5 位,地 址 0~31 共 32 个寄存器,IEEE 定义了 0~15 这 16 个寄存器的功能,16~31 这 16 个寄存器由厂 商自行实现。

  • 不管你用的哪个厂家的 PHY 芯片,其中 0~15 这 16 个寄存器是一模一 样的,仅靠这 16 个寄存器是完全可以驱动起 PHY 芯片的,至少能保证基本的网络数据通信。
  • 随着现在的 PHY 芯片性能越来越强大,32 个寄存器可能满足不了厂商的需求, 因此很多厂商采用分页技术来扩展寄存器地址空间,以求定义更多的寄存器。(需要 PHY 厂商提供相应的驱动源码)
  • IEEE802.3 协议一共 8 个 SECTION,在 “802.3-2018_SECTION2” 中找到 “22.2.4 Management functions” 章节,此章节对 PHY 的前 16 个寄存器功能进行了规定。

MAC 层通过 MDIO/MDC 总线对 PHY 进行读写操作,MDIO 最多可以控制 32 个 PHY 芯 片,通过不同的 PHY 芯片地址来对不同的 PHY 操作。SR8201F 通过设置 LED0/PHYAD[0]和 LED1/PHYAD[1]这两个引脚来设置其 PHY 地址,因此SR8201F可以同时存在4个芯片连接到MAC上。

在这里插入图片描述

以太网驱动

  • 申请 net_device:编写网络驱动的时候首先要使用 alloc_netdev 函数来申请 net_device,alloc_netdev 的本质是 alloc_netdev_mqs 函数,Linux 内核内核支持的网络接 口有很多,比如光纤分布式数据接口(FDDI)、以太网设备(Ethernet)、红外数据接口(InDA)、高 性能并行接口(HPPI)、CAN 网络等。内核针对不同的网络设备在 alloc_netdev 的基础上提供了 一层封装,比如我们本章讲解的以太网,针对以太网封装的 net_device 申请函数是 alloc_etherdev,alloc_etherdev 最 终 依 靠 的 是 alloc_etherdev_mqs 函数。

    struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
    			     	 unsigned int rxqs)
    {
    	return alloc_netdev_mqs(sizeof_priv, "eth%d", NET_NAME_UNKNOWN,
    				ether_setup, txqs, rxqs);
    }
    
    • alloc_netdev_mqs 来申请 net_device,注意这里设置网卡的名字为“eth%d”,这是格式化字符串,大家进入开发板的 linux 系统以后看到的“eth0”、“ eth1”这样的网卡名字就 是从这里来的。
    • 设置了以太网的 setup 函数为 ether_setup,不同的网络设备其 setup 函数不同,比如 CAN 网络里面 setup 函数就是 can_setup。
    • ether_setup 函数会对 net_device 做初步的初始化。
  • 注销网络驱动的时候 需要释 放掉前面 已经申 请到的 net_device ,释放函 数为 free_netdev。

  • 注册 net_device:net_device 申请并初始化完成以后就需要向内核注册 net_device,要用到函数 register_netdev。

  • 注销 net_device 使用函数 unregister_netdev。

  • net_device_ops 结构体:net_device 有个非常重要的成员变量:netdev_ops,为 net_device_ops 结构体指针类型,这 就是网络设备的操作集。net_device_ops 结构体里面都是一些以“ndo_”开头的函数,这些函数就需要网络驱动编写人员 去实现,不需要全部都实现,根据实际驱动情况实现其中一部分即可。

    • ndo_open 函数,打开网络设备的时候此函数会执行,网络驱动程序需要实现此函 数,非常重要!(包含使能网络外设时钟、申请网络所使用的环形缓冲区、初始化 MAC 外设等内容)
    • ndo_stop 函数,关闭网络设备的时候此函数会执行,网络驱动程序也需要实现此函数。(包括停止 PHY、停止 NAPI 功能、停止发送功能等)
    • ndo_start_xmit 函数,当需要发送数据的时候此函数就会执行,此函数有一个参数 为 sk_buff 结构体指针,sk_buff 结构体在 Linux 的网络驱动中非常重要,sk_buff 保存了上层传递给网络驱动层的数据。
    • ……还有很多很重要的函数
  • **sk_buff 结构体 **:网络是分层的,对于应用层而言不用关心具体的底层是如何工作的,只需要按照协议将要 发送或接收的数据打包好即可。打包好以后都通过 dev_queue_xmit 函数将数据发送出去,接收数据的话使用 netif_rx 函数即可

    • dev_queue_xmit 函数
      在这里插入图片描述
    • netif_rx 函数:上层接收数据的话使用 netif_rx 函数,但是最原始的网络数据一般是通过轮询、中断或 NAPI 的方式来接收,关于接收函数主要是以下两个部分,第一个是数据处理部分主要是通过sk_buff实现的,第二个部分是数据接收主要是通过 NAPI 实现的。
      • sk_buff 这个结构体用于管理接收或发送数据包,针对 sk_buff 内核提供了一系列的操作与管理函数。
      • NAPI 的核心思想就是不全部采用中断来读取网络数据,而是采用中断来唤醒数据接收服务程 序,在接收服务程序中采用 POLL 的方法来轮询处理数据。这种方法的好处就是可以提高短数 据包的接收效率,减少中断处理的时间。Linux 内核使用结构体 napi_struct 表示 NAPI,针对 NAPI 内核提供了一系列的操作与管理函数。

驱动挂载

对于驱动的配置与源码分析,篇幅较多,这里大概说一下主要内容包含哪些,具体的还请参考正点原子的教材。

  • 设备树的配置,包含fec部分和子节点mdio部分(此子节点用于指定网络外设所使用的 MDIO 总线, 主要作为 PHY 节点的容器)
  • fec匹配表包含“fsl,imx6ul-fec”,设备树和驱动匹配上,当匹配成功以后 fec_probe 函数就会执行,该函数会实现以太网驱动所提到的所有初始化内容,。
  • MDIO 总线注册:Linux 内核专门为 MDIO 准备一个总线,叫做 MDIO 总线,采用 mii_bus 结构体表示,fec_probe 函数不仅会初始化以太网相关内容也会调用 fec_enet_mii_init 函数完成 MII 接口的初始化,其中就包括初始化 mii_bus 下的 read 和 write 这两个函数。
    在这里插入图片描述
  • PHY驱动:of_mdiobus_register 函数有两个主要的功能,一个是通过 mdiobus_register 函数向 Linux 内核注册 mdio 总线,另一个就是通过 of_mdiobus_register_phy 函数向内核注册 PHY。

wifi模块挂载

wifi模块的加载就是编译内核生成相关的驱动文件,然后配置工具进行wifi连接和测试即可

modprobe 8188eu.ko
ifconfig wlan0 up
iwlist wlan0 sacn
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
udhcpc -i wlan0

后续

网络驱动是一个比较大的方向,仅仅只做了大体的框架分析,如果后期有更深入的需求再详细分析内部实现,这里只是给大家做一个了解。

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

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

相关文章

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 王志豪,厦门大学博士生 刘诗雨,厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型(LLMs&#xff…

FFmpeg 的常用API

FFmpeg 的常用API 附录:FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能,多种多媒体封装格式&…

trap命令

信号 linux信号是由一个整数构成的异步消息,可以由某个进程发给其他的进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程 信号列表 kill -l trap -l 在使用信号名时,需要省略SIG前缀 trap trap命令用于指定…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】

1 主要内容 之前分享了很多配电网重构的程序,每个程序针对场景限定性比较大,程序初学者修改起来难度较大,本次分享一个基础程序,针对含sop的配电网重构模型,含风电和光伏,优化了33节点网络电压合理性&…

使用 Elastic AI Assistant 简化威胁情报报告

作者:来自 Tommy Bumford 了解 SRE 不断扩展的角色以及所需的新技能:成本管理和 AI。 通过 AI 驱动的报告为分析师提供支持 在不断发展的网络安全领域,威胁分析师不断被新的威胁情报 (threat intelligence - TI) 数据淹没。挑战不仅在于理解…

64.基于SpringBoot + Vue实现的前后端分离-新闻资讯系统(项目 + 论文)

项目介绍 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,文章信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件,检查临时环境变量。 word preview版本,关联打开文件出现报错。word无法创建工作文件,检查临时环境变量。 打开注册表,删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …

人工智能ACA(七)——计算机视觉基础

一、自然语言处理基本介绍 1. 自然语言处理的定义 1-1 自然语言 人类使用的在社会生活中自然形成的语言 1-2 自然语言处理 目标是让计算机能够理解、解析、生成和处理人类的自然语言 包含自然语言理解和自然语言生成两部分组成 2. 自然语言处理的发展趋势 3.自然语言处理…

(带源码)宠物主题商场系统 计算机项目 P10083

项目说明 本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目仅供学…

编程考古-传奇的开始Delphi(中)

发布会 这是 Delphi 发布的邀请: 许多曾经风靡一时的开发工具已逐渐淡出人们的视野,被历史的洪流所淹没。然而,Delphi不仅没有被遗忘,反而持续保持着其独特的魅力和广泛的用户基础。这不仅彰显了Delphi在快速变化的技术领域中的持…

山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)

1、设计目的 山景提供的SDK是蓝牙音箱demo,用户使用ADC按键或者IR遥控器,进行人机交互。然而现实很多场景,需要和单片机通信,不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示…

IntelliJ IDEA Docker集成

一、概述 Docker是一种用于在隔离和可复制环境中部署和运行可执行文件的工具。这可能很有用,例如,在与生产相同的环境中测试代码。 IntelliJ IDEA集成了Docker功能,并为创建Docker映像、运行Docker容器、管理Docker Compose应用程序、使用公…

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…

【数据库初阶】数据库基础知识

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 数据库…

【LeetCode】726、原子的数量

【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …

财经英语期末考试复习

文章目录 第一篇第二篇第三篇第四篇思路梳理作文撰写 第一篇 李宁是中国运动服装和鞋类行业的领导者,这源于其创始人,同名体操冠军李宁的愿景. Ling-Ning is the Chinese leader in athletic apparel and footwear, rooted in the vision of its founder and namesake,the cha…