1、
以太网 PHY
芯片
1.1 概述
由于在 RK 系列的
SOC 中内置了以太网 MAC
控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能。按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作。因此,在
linux 驱动中有通用的 PHY驱动,
RK3288 之前的芯片所配套的
SDK 中使用的都是通用驱动,当然 SoC 中的 MAC 驱动是需要实现的。所以理论上,如果不需要使用 PHY 厂家提供的自定义的寄存器配置实现一些个性化的功能,那么 PHY 的驱动就不需要修改。从 RK3288 之后的 SDK 开始,打开了各个 PHY 厂家在 Linux上提供驱动的配置,但是基本上,各家的驱动差异很小,基本上也是调用通用驱动的接口。
1.2 接口
10/100M 以太网 PHY 与 MAC 之间的接口主要有 MII 和 RMII。10/100/1000M 以太网 PHY与 MAC 之间的接口主要有 RGMII。RK 系列的各个 SoC 支持的 PHY 接口列表如下:
1.3
kernel 配置
1.3.1
rk3066
1.3.1.1 基本配置
以太网在 kernel 中的 menuconfig 配置如下所示,可以根据产品需求开关此配置,SDK 中下述配置默认打开:
device drivers --->
Networking
support --->
Ethernet (10 or 100Mbit) --->
<*> RK29 VMAC ethernet support
MAC 驱动代码位于 kernel/drivers/net/rk29_vmac.c
此外,由于各个平台对PHY进行上下电操作使用的控制管脚或PMU会有所不同,同时各款RK芯片的一些和以太网相关的通用寄存器地址也会有所不同,所以和平台相关的操作和驱动代码是分开的,一般存放于 arch/arm/mach-rkxx 文件夹中,因不同芯片而异,如 3066 的上述操作位于文件 arch/arm/mach-rk30/board-rk30-sdk-vmac.c 中。该文件中的接口最终会被驱动代码所调用,需要特别注意的就是对 PHY 的上下电的操作,有可能不同产品所选用的 PMU 与 SDK 不同,或者使用的 PMU 的 LDO 口与 SDK 不同, 所以需要根据实际情况修改这个文件。
1.3.1.2 时钟配置
根据规范,RMII 接口需要 50M 参考时钟来保证 MAC 和 PHY 之间数据传输的同步。50M 时钟,可以由 MAC 来提供,也可以由 PHY 来提供。50M 时钟必须是精确的,且必须保证尽可能小的jitter, 太大的 jitter 会导致较大的传输的错包率。SDK 默认使用 MAC,也就是 RK 芯片内部的MAC 控制器来提供时钟。一般情况下,并不需要使用 PHY 来提供参考时钟,因为这样需要额外增加一颗晶振来实现。除非由于分频的原因,MAC 无法给出符合要求的 50M 参考时钟,RK3188T上即存在这样的问题,所以需要由 PHY 来提供参考时钟。需要在 kernel 上增加如下配置,并相应修改电路,即可实现(该配置目前只在 3188 相关的 SDK 中有效)。
Device Drivers --->
Networking support ---> Ethernet (10 or 100Mbit) --->
<*> Select the vmac source clock (RK29_VMAC_EXT_CLK )
1.3.1.3 MAC 地址
通常,每个以太网设备只有唯一的 MAC 地址,所以需要有一个地方用来存储这个唯一的地址,同时在打开以太网时读取出这个地址,并写入 PHY 寄存器。SDK 提供了四种获取以太网 MAC 地址的方法:
(1) 存储在 NAND 的 IDB 中
首先要保证 kernel 中的配置 CONFIG_ETH_MAC_FROM_IDB 已打开
其次要使用烧写工具将地址写入,烧写工具在 SDK 中有提供。
(2) 存储在 EEPROM 中
首先要保证 kernel 中的配置 CONFIG_ETH_MAC_FROM_EEPROM 已打开
其次 EEPROM 的驱动见 drivers/staging/rk29/eeprom,根据不同型号请自行作相应修改
(3) 使用 wifi 的 MAC 地址
该种方法的原理是在系统启动时自动加载一次 Wi-Fi 驱动,同时将 Wi-Fi 的 MAC 地址读出并存储在/data 分区的一个文件中,以太网打开时,读取该文件中的地址。
首先要保证 kernel 中的配置 CONFIG_ETH_MAC_FROM_WIFI_MAC 已打开
其次要保证 Android 上 WLAN_mac 程序存在,且已在 init.rc 或 init.rkxx.rc 中已添加如下脚本
service wlan_mac /system/bin/wlan_mac
class main
oneshot
以太网驱动读取地址的代码存于 drivers/net/eth_mac,请根据实际需求修改此代码。
由于不同的网络设备的 MAC 地址必须是唯一的,所以请考虑使用这种方法的风险性。
(4) 使用随机地址
若上述三种方法均未采用,驱动中会在每次打开以太网时随机生成 MAC 地址
由于不同的网络设备的 MAC 地址必须是唯一的,所以请考虑使用这种方法的风险性。
更多详细内容请下载附件查看