linux网络驱动(以太网)

前言

        由于最近要做一个MCU的以太网通信,学习一下以太网。由于过来实习没带MCU,只能继续做一下SOC,所以这期还是imx6ull的以太网(以下简称网络)驱动。

理论(imx6ull内置MAC外设)

         其实整个SOC网络单方通信的过程就划分为三部分:SOC---->MAC外设----->PHY芯片

        都是些什么?

        SOC其实就是我们的带操作系统的单片机(学名叫片上系统),MAC就是我们经常用的硬件IIC、SPI外设控制器,PHY就是专门用来与外部通信的芯片(这个不太了解)

        现在我们知道了,MAC作为硬件外设,一般会集成到我们的SOC芯片上,所以归根到底,就是控制MAC外设实现与PHY芯片的数据交互?        

        内部的 MAC 外设会通过 MII 或者 RMII 接口来连接外部的 PHY 芯片, MII/RMII 接口用来
传输网络数据。另外主控需要配置或读取 PHY 芯片,也就是读写 PHY 的内部寄存器,所以还
需要一个控制接口,叫做 MIDO, MDIO 很类似 IIC,也是两根线,一根数据线叫做 MDIO,一
根时钟线叫做 MDC。

        总是是这么一个过程

MII接口

        MII接口用于以太网MAC连接PHY芯片,如下图:

RMII接口

        就是 MII 接口的精简版本。 RMII 接口只需要 7 根数据线,相比 MII 直接减少了 9 根,极大的
方便了板子布线,如下图:

MDIO接口

        MDIO 全称是 Management Data Input/Output,直译过来就是管理数据输入输出接口,是一
个简单的两线串行接口,一根 MDIO 数据线,一根 MDC 时钟线。驱动程序可以通过 MDIO 和
MDC 这两根线访问 PHY 芯片的任意一个寄存器。 MDIO 接口支持多达 32 个 PHY。同一时刻
内只能对一个 PHY 进行操作,那么如何区分这 32 个 PHY 芯片呢?和 IIC 一样,使用器件地址
即可。同一 MDIO 接口下的所有 PHY 芯片,其器件地址不能冲突,必须保证唯一,具体器件
地址值要查阅相应的 PHY 数据手册。

拓展

总的硬件连线是下面这样子

PHY芯片

我们用到的PHY收发器是SR8201F

SR8201F 中断管理(此处没用到)

SR8201F 检测到媒介端的状态改变,就会写入对应中断状态的寄存器(第 0 页寄存器 14),
并且在中断管脚使能时,中断管脚会被置低表示发生一个中断事件。当 MAC 检测到中断事件
时,可以通过 MDC/MDIO 端口访问到第 0 页寄存器 14 获取相应的中断状态。
 

PHY 地址设置

SR8021F 内部寄存器

我们看寄存器,主要就是看配置寄存器和状态寄存器,如下

配置寄存器BCR,地址为0

状态寄存器BSR,地址为1

ID寄存器

SR8201F 的 PHY ID 寄存器 1 和 ID 寄存器 2,地址为 2 和 3,后面就称为寄
存器 2 和寄存器 3。这两个寄存器都是 PHY 的 ID 寄存器。 IEEE 规定寄存器 2 和寄存器 3 为
PHY 的 ID 寄存器,这两个寄存器组成一个 32 位的唯一 ID 值。

linux网络驱动框架

        Linux 内核使用 net_device 结构体表示一个具体的网络设备, net_device 是整个网络驱动的
灵魂。网络驱动的核心就是初始化 net_device 结构体中的各个成员变量,然后将初始化完成以
后的 net_device 注册到 Linux 内核中。
        net_device是一个很庞大的结构体,定义在 include/linux/netdevice.h 中,这里不在描述。

1、申请 net_device

编写网络驱动的时候首先要申请 net_device,使用 alloc_netdev 函数来申请 net_device

看到这里,感觉和前面SPI如出一辙。

待续。。。。

相关推荐

  1. 网络变压器

    2024-07-17 09:32:02       35 阅读
  2. 网络变压器型号

    2024-07-17 09:32:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 09:32:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 09:32:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 09:32:02       58 阅读
  4. Python语言-面向对象

    2024-07-17 09:32:02       69 阅读

热门阅读

  1. 通过手机控制家用电器的一个程序的设计(一)

    2024-07-17 09:32:02       25 阅读
  2. 深度学习中的正则化技术 - 稀疏表示篇

    2024-07-17 09:32:02       27 阅读
  3. CPTAC蛋白数据库在线蛋白分析(癌与癌旁)

    2024-07-17 09:32:02       24 阅读
  4. Shiro 学习总结

    2024-07-17 09:32:02       24 阅读
  5. 面试题 27. 二叉树的镜像

    2024-07-17 09:32:02       30 阅读
  6. 从三个方向来谈谈开源项目有哪些机遇与挑战

    2024-07-17 09:32:02       25 阅读
  7. 告别自动激活:掌握如何在Conda中禁用Base环境

    2024-07-17 09:32:02       29 阅读
  8. 中国电子学会青少年编程等级考试真题下载

    2024-07-17 09:32:02       24 阅读
  9. Shell

    Shell

    2024-07-17 09:32:02      24 阅读
  10. 01.Verilog基础语法

    2024-07-17 09:32:02       22 阅读
  11. 音视频开发入门教程(1)如何安装FFmpeg?共210节

    2024-07-17 09:32:02       21 阅读