前言
由于最近要做一个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如出一辙。
待续。。。。