一、前言
最近在调试 Defensor 项目的 AUTO-PHY,发现在 Hi3566V100 这个平台的 PHY 调试有点特别,在这里给大家分享 Hi3566V100 平台上 PHY 的调试过程,使用的 SDK 版本是 Hi3562V100_MobileCam_SDK_V2.0.0.2。
二、硬件平台环境
2.1 原理图
我们用的 AUTO-PHY 型号是 NXP 的 TJA1101,连接方式如下面的 Defensor 方案框图,通信接口为 MDIO,数据接口为 RMII:
图 2.1 Defensor 框图
对接 TJA1101 的原理图如下图所示,使用的是 25M 外部晶振,3.3V 独立电源供电:
图 2.2 TJA1101 对接原理图
2.2 晶振波形
测量晶振的波形如下:
图2.3 晶振波形
从图中可以看出晶振的频率是 25M 左右,振幅是 1.8V 左右 ,都符合预期结果,可以确认晶振输出的波形正常无误,接下来进行软件驱动的配置。
三、TJA1101 驱动移植
3.1 在 Kernel 配置 .config
打开 CONFIG_HISI_FEMAC 和 CONFIG_ETHERNET 的定义:
图 3.1 配置 .config
把 TJA1101 的驱动放到 ./driver/net/phy/ 目录下,在 Makefile 中添加 TJA1101 驱动的编译,然后在 Kconfig 中添加 CONFIG_TJA1101_PHY 定义,
重新编译即可在 Kernel 的 menuconfig 中找到 CONFIG_TJA1101_PHY 这个定义,打开该定义即可安装驱动:
图 3.2 安装驱动
3.2 修改设备地址
一开始说过,Hi3566 这个平台调 PHY 有点特别,就是因为识别设备的时候就要先把设备的地址写对,不然是无法识别到 PHY 设备的,因为 Hi3566 平台的 MDIO 总线只会根据你输入的地址发一次读设备寄存器的命令,而 Kernel 的 MDIO 总线驱动是会在 0-31 这 32 个地址里面循环读寄存器。
因此我们马上就需要修改 PHY 的地址,我们硬件上把 PHYAD2 和 PHYAD1 设为了 01,根据 TJA1101 的规格书,其他地址位都默认为 0,所以 PHY 的地址可以确定为 2。然后在 dts 文件中修改 PHY 的 reg 为2 即可。
图 3.3 设置 PHY 地址
3.3 查看 MDIO 信号
接下来测量一下 MDIO 发出的信号正不正确,在这之前,我们需要先了解 MDIO 的通信协议,如下图:
图 3.4 MDIO 读数据时序图
图 3.5 MDIO 写数据时序图
MDIO 的时序可以拆分为以下几部分:
- Preamble+Start:32bits的前导码以及2bit的开始位。
- OP :2bits 的操作码,10 表示读,01 表示写。
- PHYAD:5bits 的 PHY 地址,一般 PHY 地址从 0 开始顺序编号。
- REGAD:5bits 的寄存器地址,即要读或写的寄存器。
- Turn Around:2bits 的 TA,在读命令中,MDIO 在此时由 MAC 驱动改为 PHY 驱动,并等待一个时钟周期准备发送数据。在写命令中,不需要 MDIO 方向发生变化,则只是等待两个时钟周期准备写入数据。
- Data:16bits 数据,在读命令中,PHY 芯片将读到的对应 PHYAD 的 REGAD 寄存器的数据写到 Data 中,在写命令中,MAC 将要写入对应 PHYAD 的 REGAD 寄存器的值写入 Data 中。
- Idle:空闲状态,此时 MDIO 无源驱动,处高阻状态,但一般用上拉电阻使其处在高电平,上拉电阻一般为 1.5K。
了解了 MDIO 的时序后,再来测量 MDIO 初始化时的波形,首先来看看如果我们不将设备地址改为 2 会得到怎样的波形:
图 3.6 读设备地址1 的波形图
由波形结合 MDIO 通信协议可以看出,SOC 端首先发送了一个读地址为 1 的设备的第二个寄存器的命令,然后就一直在等待数据回传,没有再去扫描其他地址的设备,这就是为什么一定要把设备地址先设置正确的原因。接下来把设备地址设为 2 后再来看看波形是怎样的:
图 3.7 MDIO 波形
由波形结合 MDIO 通信协议可以看出,SOC 端首先发送了一个读地址为 2 的设备的第二个寄存器的命令,隔了 2bits 的 TA 后,也看到有数据返回了,TJA1101 的设备 ID 存放在寄存器 2 和 3 里,所以经验证该命令是准确无误的,后面还会紧接着发送一个读寄存器 3 的命令。
四、结果验证
MDIO 波形已经发送无误,接下来测试一下能否在系统中检测到 PHY 设备:
图 4.1 检测 PHY 设备
可以看出,TJA1101 已经挂载到 MDIO 总线上,设备 ID 也成功读取出来,接下来把两块 Defensor 的网口接起来,把其中一块板设置为 Master,一块设置为 Slave,并配置好两块板的 IP 地址,尝试互 ping:
图 4.2 互相 ping 通
从图中可以看出,其中一块 Defensor 成功 ping 通了另一块,TJA1101 的调试顺利完成。
五、附件
如有需要 TJA1101 驱动的朋友可以到以下链接自取:https://pan.baidu.com/s/1QL05Vzct4RVMDS6R0Ff5UA
提取码:mawg
参考资料:
【1】《外围设备驱动操作指南.doc》
【2】《ds444001 - Preliminary data sheet TJA1101 (0.1).pdf》