)
网络驱动1. 网络驱动1.1 网络驱动---MII/RMII/MDIO接口1.2 网络驱动---PHY 芯片详解寄存器1.3 网络驱动---PHY 芯片详解LAN8720A1.3.1 网络驱动---LAN8720A中断管理1.3.2 网络驱动---LAN8720APHY 地址设置1.3.3 网络驱动---LAN8720A时钟源1.3.4 网络驱动---LAN8720A内部寄存器1.4 网络驱动---PHY 芯片详解SR8201F1.4.1 网络驱动---SR8201F中断管理1.4.2 网络驱动---SR8201FPHY 地址设置1.4.3 网络驱动---SR8201F内部寄存器1.5 网络驱动---驱动框架1.5.1 网络驱动—驱动框架PHY框架2. WIFI 模块3. 4G 模组3.1 4G 模组ME36303.2 4G 模组EC201.网络驱动SOC 内置 MACMAC 类似 I2C 控制器、SPI 控制器一样的外设。但是光有 MAC 还不能直接驱动网络还需要另外一个芯片PHY因此对于内置 MAC 的 SOC其外部必须搭配一个 PHY 芯片内部集成网络 MAC 的优点如下①、内部 MAC 外设会有专用的加速模块比如专用的 DMA加速网速数据的处理②、网速快可以支持 10/100/1000M 网速③、外接 PHY 可选择性多成本低1.1网络驱动—MII/RMII/MDIO接口MII 接口一共有 16 根信号线TX_CLK发送时钟如果网速为 100M 的话时钟频率为 25MHz10M 网速的话时钟频率为 2.5MHz此时钟由 PHY 产生并发送给 MAC。TX_EN发送使能信号。TX_ER发送错误信号高电平有效表示 TX_ER 有效期内传输的数据无效。10Mpbs 网速下 TX_ER 不起作用。TXD[3:0]发送数据信号线一共 4 根。RXD[3:0]接收数据信号线一共 4 根。RX_CLK接收时钟信号如果网速为 100M 的话时钟频率为 25MHz10M 网速的话时钟频率为 2.5MHzRX_CLK 也是由 PHY 产生的。RX_ER接收错误信号高电平有效表示 RX_ER 有效期内传输的数据无效。10Mpbs 网速下 RX_ER 不起作用。RX_DV接收数据有效作用类似 TX_EN。CRS载波侦听信号。COL冲突检测信号。RMII 接口只需要 7 根数据线TX_EN发送使能信号。TXD[1:0]发送数据信号线一共 2 根。RXD[1:0]接收数据信号线一共 2 根。CRS_DV相当于 MII 接口中的 RX_DV 和 CRS 这两个信号的混合。REF_CLK参考时钟由外部时钟源提供 频率为 50MHz。这里与 MII 不同MII 的接收和发送时钟是独立分开的而且都是由 PHY 芯片提供的。MDIO 全称是 Management Data Input/Output直译过来就是管理数据输入输出接口是一个简单的两线串行接口一根 MDIO 数据线一根 MDC 时钟线。驱动程序可以通过 MDIO 和 MDC 这两根线访问 PHY 芯片的任意一个寄存器。MDIO 接口支持多达 32 个 PHY。同一时刻内只能对一个 PHY 进行操作那么如何区分这 32 个 PHY 芯片呢和 IIC 一样使用器件地址即可。同一 MDIO 接口下的所有 PHY 芯片其器件地址不能冲突必须保证唯一具体器件地址值要查阅相应的 PHY 数据手册1.2网络驱动—PHY 芯片详解寄存器SOC 可以对 PHY 进行配置或者读取 PHY 相关状态这个就需要 PHY 内部寄存器去实现了。PHY 芯片寄存器地址空间为 5 位地址 0~31 共 32 个寄存器IEEE 定义了 0~15 这 16 个寄存器的功能16~31 这 16 个寄存器由厂商自行实现。也就是说不管你用的哪个厂家的 PHY 芯片其中 0~15 这 16 个寄存器是一模一样的。仅靠这 16 个寄存器是完全可以驱动起 PHY 芯片的至少能保证基本的网络数据通信因此 Linux 内核有通用 PHY 驱动按道理来讲不管你使用的哪个厂家的 PHY 芯片都可以使用 Linux 的这个通用 PHY 驱动来验证网络工作是否正常。事实上在实际开发中可能会遇到一些其他的问题导致 Linux 内核的通用 PHY 驱动工作不正常这个时候就需要驱动开发人员去调试了。但是随着现在的 PHY 芯片性能越来越强大32 个寄存器可能满足不了厂商的需求因此很多厂商采用分页技术来扩展寄存器地址空间以求定义更多的寄存器。这些多出来的寄存器可以用于实现厂商特有的一些技术因此 Linux 内核的通用 PHY 驱动就无法驱动这些特色功能了这个时候就需要 PHY 厂商提供相应的驱动源码了所以大家也会在 Linux 内核里面看到很多具体的 PHY 芯片驱动源码。不管你的 PHY 芯片有多少特色功能按道理来讲Linux 内核的通用 PHY 驱动是绝对可以让你这 PHY 芯片实现基本的网络通信因此大家也不用担心更换 PHY 芯片以后网络驱动编写是不是会很复杂。1.3网络驱动—PHY 芯片详解LAN8720A1.3.1网络驱动—LAN8720A中断管理LAN8720A 的器件管理接口支持非 IEEE 802.3 规范的中断功能。当一个中断事件发生并且相应事件的中断位使能LAN8720A 就会在 nINT(14 脚)产生一个低电平有效的中断信号。LAN8720A 的中断系统提供两种中断模式主中断模式和复用中断模式。主中断模式是默认中断模式LAN8720A 上电或复位后就工作在主中断模式当模式控制/状态寄存器(十进制地址为 17)的 ALTINT 位为 0 时 LAN8720A 工作在主模式当 ALTINT 位为 1 时工作在复用中断模式。正点原子的 ALPHA 开发板虽然讲 LAN8720A 的中断引脚连接到了 I.MX6ULL 上但是并没有使用中断功能关于中断的具体用法可以参考 LAN8720A 数据手册的 29~30 页1.3.2网络驱动—LAN8720APHY 地址设置MAC 层通过 MDIO/MDC 总线对 PHY 进行读写操作MDIO 最多可以控制 32 个 PHY 芯片通过不同的 PHY 芯片地址来对不同的 PHY 操作。LAN8720A 通过设置 RXER/PHYAD0 引脚来设置其 PHY 地址默认情况下为 0其地址设置如表所示1.3.3网络驱动—LAN8720A时钟源nINTSEL 引脚(2 号引脚)用于设置 nINT/REFCLKO 引脚(14 号引脚)的功能。nINTSEL 配置如表所示1.3.4网络驱动—LAN8720A内部寄存器BCR(Basic Control Rgsister)寄存器地址为 0BSR(Basic Status Register)寄存器地址为 1ID 寄存器 1地址为 2ID 寄存器 2地址为 3特殊控制/状态寄存器地址为 311.4网络驱动—PHY 芯片详解SR8201F1.4.1网络驱动—SR8201F中断管理SR8201F 检测到媒介端的状态改变就会写入对应中断状态的寄存器第 0 页寄存器 14并且在中断管脚使能时中断管脚会被置低表示发生一个中断事件。当 MAC 检测到中断事件时可以通过 MDC/MDIO 端口访问到第 0 页寄存器 14 获取相应的中断状态。1.4.2网络驱动—SR8201FPHY 地址设置MAC 层通过 MDIO/MDC 总线对 PHY 进行读写操作MDIO 最多可以控制 32 个 PHY 芯片通过不同的 PHY 芯片地址来对不同的 PHY 操作。SR8201F 通过设置 LED0/PHYAD[0] 和 LED1/PHYAD[1] 这两个引脚来设置其 PHY 地址其地址设置如表所示1.4.3网络驱动—SR8201F内部寄存器BCR(Basic Control Rgsister)寄存器地址为 0BSR(Basic Status Register)寄存器地址为 1ID 寄存器 1地址为 2ID 寄存器 2地址为 31.5网络驱动—驱动框架Linux 内核使用net_device结构体表示一个具体的网络设备net_device 是整个网络驱动的灵魂。网络驱动的核心就是初始化 net_device 结构体中的各个成员变量然后将初始化完成以后的 net_device 注册到 Linux 内核中。设备数树SOC 内置网络 MAC外置 PHY 芯片这种方案我们是不需要编写什么驱动的基本可以直接使用1.5.1网络驱动—驱动框架PHY框架注册 MDIO 总线的时候也会向内核注册 PHY 设备PHY 子系统就是用于 PHY 设备相关内容的分为 PHY 设备和 PHY 驱动和 platform 总线一样PHY 子系统也是一个设备、总线和驱动模型。PHY 子系统也是遵循设备phy_device、总线MDIO、驱动phy_driver模型2. WIFI 模块3. 4G 模组3.1 4G 模组ME36303.2 4G 模组EC20