飞腾E2000板载以太网适配

e20005.4.18macbyt8521

飞腾E2000嵌入式板卡的MAC芯片对应linux通用macb驱动,外接YT8521 PHY芯片。飞腾在5.10内核上进行过适配,现将其移植到麒麟5.4内核。

本文参考资料:

飞腾5.10内核源码

飞腾E2000以太网驱动注册和使用简介

飞腾腾珑E2000软件编程手册V0.6.pdf

YT8521S初始化配置相关ver2.1.pdf

YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf

1. 设备树移植

phy-mode为MAC芯片与PHY芯片物理层的连接方式,这涉及到真实的物理连接方式,本文所用的硬件采用rgmii模式。

注:rgmii模式下,tx clk由mac提供,rx clK由phy提供。

macb0: ethernet@3200c000 {
compatible = "cdns,phytium-gem-1.0";
reg = <0x0 0x3200c000 0x0 0x2000>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
...
<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clock-names = "pclk", "hclk", "tx_clk", "tsu_clk";
clocks = <&sysclk_250mhz>, <&sysclk_48mhz>, <&sysclk_48mhz>, <&sysclk_250mhz>;
magic-packet;
status = "okay";
phy-mode = "rgmii";
use-mii;
};

2. MACB驱动移植

飞腾5.10 macb驱动无法直接替换麒麟5.4 macb驱动,因此需要进行手动移植。

根据设备树知道硬件通过cdns,phytium-gem-1.0进行匹配,因此需要在macb_dt_ids中新增cdns,phytium-gem-1.0条目,并将phytium_gem1p0_config移植到麒麟5.4内核中。

drivers/net/ethernet/cadence/macb_main.c:

static const struct macb_config phytium_gem1p0_config = {
.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
MACB_CAPS_JUMBO |
MACB_CAPS_GEM_HAS_PTP |
MACB_CAPS_BD_RD_PREFETCH |
MACB_CAPS_SEL_CLK,
.dma_burst_length = 16,
.clk_init = phytium_clk_init,
.init = phytium_init,
.jumbo_max_len = 16360,
.sel_clk_hw = phytium_gem1p0_sel_clk,
}; static const struct of_device_id macb_dt_ids[] = {
...
{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
...
}

由于麒麟5.4 macb驱动与飞腾5.10 macb驱动有所差别,仅移植以上部分还不够。

根据phytium_gem1p0_config的定义,其中包含了.sel_clk_hw = phytium_gem1p0_sel_clk,但在麒麟5.4 macb驱动中并未定义和使用phytium_gem1p0_sel_clk函数。

查看飞腾5.10内核phytium_gem1p0_sel_clk函数实现及调用,发现当caps & MACB_CAPS_SEL_CLK成立时该函数才会被调用,并且在麒麟5.4内核中存在功能等价的替代函数phytium_gem_sel_clk,该替代函数只有caps & MACB_CAPS_SEL_CLK_HW成立时才被调用。

飞腾5.10

drivers/net/ethernet/cadence/macb_main.c:
static void macb_mac_link_up(struct phylink_config *config,
struct phy_device *phy,
unsigned int mode, phy_interface_t interface,
int speed, int duplex,
bool tx_pause, bool rx_pause)
{
... ...
if (bp->caps & MACB_CAPS_SEL_CLK)
bp->sel_clk_hw(bp, speed);
... ...
}

麒麟5.4

static void macb_handle_link_change(struct net_device *dev)
{
... ...
if (bp->caps & MACB_CAPS_SEL_CLK_HW)
phytium_gem_sel_clk(bp);
... ...
}

综上,最终驱动的移植方案是使用phytium_gem_sel_clk + MACB_CAPS_SEL_CLK_HW替代phytium_gem1p0_sel_clk + MACB_CAPS_SEL_CLK如下:

drivers/net/ethernet/cadence/macb_main.c:

static const struct macb_config phytium_gem1p0_config = {
.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
MACB_CAPS_JUMBO |
MACB_CAPS_GEM_HAS_PTP |
MACB_CAPS_BD_RD_PREFETCH |
MACB_CAPS_SEL_CLK_HW,
.dma_burst_length = 16,
.clk_init = phytium_clk_init,
.init = phytium_init,
.jumbo_max_len = 16360,
//.sel_clk_hw = phytium_gem1p0_sel_clk,
}; static const struct of_device_id macb_dt_ids[] = {
...
{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
...
}

3. 网络连通性调试

macb驱动移植成功之后,网络顺利UP,但无法ping通.

netstat -i可以看到存在RX-OK、TX-OK计数,并且计数正常累加。这里基本可以说明MAC层收发是正常的。

利用tcpdump抓包发现,虽然TX-OK正常累加,但对端陪测机无法抓到被测机所发的任何数据包,被测机能抓到陪测机发的数据包,基本确定网络只能收不能发。

3-1. MACB驱动环回测试

飞腾腾珑E2000软件编程手册V0.6.pdf中,以太网基地址如下:


mac基址

在0x00 network_control寄存器中bit1为本地环回寄存器,将该bit位置1。


0x00 network_control
devmem2  $((0x32010000+0x00)) h #读0x00寄存器的值
0x1c
devmem2 $((0x32010000+0x00)) h 0x1e #写0x00寄存器,将bit1置1.

进行ping环回抓包测试,测试通过,排除MAC层异常。

3-2. YT8521 PHY工作模式及电压确认


硬件工作模式

电压

phy的工作模式和电压与硬件强相关,可以通过读取0xa001扩展配置寄存器,确认phy工作模式与实际物理连接是否一致。


0xa001 扩展配置寄存器
root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e  0xa001 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x8140

0xa001寄存器的值为0x8140,因此phy的工作模式配置为UTP_TO_RGMII,电压为3.3v。

3-3. YT8521 PHY环回测试

在YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf中PHY环回寄存器中,0x00基本控制寄存器bit14位是环回使能位。


0x00 Basic Control Register

需要说明的是在进行环回测试时,需要将PHY Autonet_En关闭,否则网口无法UP。

./phytool write eth1/0x0/0x00 0x4140
./phytool eth1/0x0/0x00

这里phy 环回测试未通过,可以确定PHY未将数据发送出去,问题在PHY层发送方向。

3-4. YT8521 PHY tx delay调整

RGMII模式下,MAC负责提供TX时钟,PHY提供RX时钟。通过macb驱动确认1000M带宽下tx时钟频率为125MHz,确认时钟频率正常。

drivers/net/ethernet/cadence/macb_main.c:
static void macb_set_tx_clk(struct clk *clk, int speed, struct net_device *dev)
{
... ...
switch (speed) {
... ...
case SPEED_1000:
rate = 125000000;
break;
default:
return;
} rate_rounded = clk_round_rate(clk, rate);
if (rate_rounded < 0)
return; /* RGMII allows 50 ppm frequency error. Test and warn if this limit
* is not satisfied.
*/
ferr = abs(rate_rounded - rate);
ferr = DIV_ROUND_UP(ferr, rate / 100000); if (ferr > 5)
netdev_warn(dev, "unable to generate target frequency: %ld Hz\n",
rate);
if (clk_set_rate(clk, rate_rounded))
netdev_err(dev, "adjusting tx_clk failed.\n");
}

查看tx clk delay,读取0xa003寄存器,千兆带宽tx clk delay时延由bit3:0提供。


0xa003
root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e  0xa003 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x00f1

0xa003 bit3:0 默认为1,时延150ps,根据YT8521S初始化配置相关ver2.1.pdf资料,业内默认rgmii模式下tx clk delay默认为750ps。


phy delay

修改0xa003寄存器为750ps,千兆依然不通,从150ps增加到450ps时,可以ping通,但存在丢包的情况,继续增加时延到1200ps(8*150ps)时,可以ping通,ping未看到丢包,千兆带宽测试正常。

./phytool write eth1/0x0/0x1e  0xa003
./phytool write eth1/0x0/0x1f 0x00f8

附:

时钟精度(Frequency Tolerance):时钟精度一般是25℃下测量额时钟相对于标准频率的偏差,单位ppm(百万分之一),例如测得精度为±15ppm,时钟频率为25MHz,周期为1/25MHz=40ns,精度偏差为40ns×(±15/1000000)=0.6ps

时钟温漂(Frequency versus Temperature Characteristics):由于晶振材料和工艺限制,致使时钟在不同的温度下精度会有较大偏差,单位也为ppm。例如温漂为±100ppm,时钟频率为25MHz,周期为1/25MHz=40ns,精度偏差为40ns×(±100/1000000)=4ps

时钟抖动(Jitter):晶振源固有的噪声和干扰通常会带来时钟信号的周期性偏差。单位一般为ps

飞腾E2000板载以太网适配的更多相关文章

  1. stm32填坑之旅 - stm32f103c8t6点亮板载贴片蓝色LED

    转载请注明:https://www.cnblogs.com/rockyf/p/11691622.html 开篇 开篇一定要精彩,不然路人不理睬!下述是笔者作为arm小白的填坑之旅 没错,这个之前一直从 ...

  2. Cubieboard2裸机开发之(二)板载LED交替闪烁

    前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...

  3. Cubieboard2裸机开发之(一)点亮板载LED

    前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...

  4. BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍

    BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍 你进入BeagleBone世界的第一步就是将它连接以得到命令提示,然后你就可以处理文件以及执行命令了.在这里,你就可以定制你 ...

  5. 在树莓派3B、Ubuntu 18.04关闭板载Wifi、蓝牙

    树莓派没有传统的BIOS设置界面,文件/boot/firmware/config.txt就相当一个BIOS设置.这里是config.txt的详细文档:https://github.com/raspbe ...

  6. 板载 SPI-FLASH 的烧写方法

    @2018-12-15 [筹划] 通过烧录器(JTAG/SWD)即可方便的烧写板载外部 FLASH [参考] 如何更好地设计面向在板烧录的产品(一)SPI Flash篇 keil将程序装入外部FLAS ...

  7. 板载CAN的树莓派扩展板Strato Pi CAN

    板载CAN的树莓派扩展板Strato Pi CAN   Sfera Labs推出了最新的树莓派扩展组件“灵云派”,其中包括CAN总线,电气隔离的RS-485,RTC和9-65V电源. 位于意大利米兰的 ...

  8. Beaglebone Black教程项目1闪烁板载LED

    Beaglebone Black教程项目1闪烁板载LED 项目1闪烁板载LED 当设置完你的Beaglebone Black的时候,可能早就非常期待你的第一个项目了.下面就来满足大家的愿望,当然,这个 ...

  9. 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI

     Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...

  10. BeagleBone Black Industrial 进阶设置(性能优化以及延长板载eMMC存储寿命)

    前言 原创文章,转载引用务必注明链接.水平有限,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: http://www.omoikane.cn/2016/09/1 ...

随机推荐

  1. 通过Proxy和Reflect实现vue的响应式原理

    vue3通过Proxy+Reflect实现响应式,vue2通过defineProperty来实现 Proxy Proxy是什么 Proxy是ES6中增加的类,表示代理. 如果我们想要监听对象的操作过程 ...

  2. 基于weave实现docker跨主机网络通信

    前言 IP: 192.168.0.10 192.168.0.11 系统版本:centos 7 weave版本:2.8.1,下载地址:https://git.io/weave docker版本:18.0 ...

  3. Windows平台的JDK安装及IDEA配置JDK的过程

    1.下载安装包 jdk-8u201-windows-x64.exe,即jdk1.8.0_201 链接:https://pan.baidu.com/s/1WYaTlProtHkC_KyMHIUBxQ?p ...

  4. [glibc2.23源码]阅读源码&调试,找出free_hook-0x13分配失败的原因

    0x00 写在前面 发freebuf了:https://www.freebuf.com/articles/endpoint/373258.html 本次阅读源码是本人第一次,算是一个全新的开始.本次看 ...

  5. QA|20211013|SecureCRT:如图,有很多^,中文显示有问题,乱码,如何解决

    Q1:如图,有很多^,中文显示有问题,乱码,如何解决 Q2:securecrt的vi展示有问题:少很多字.有很多^M和^,光标无法移动到最右侧 A: 首先检查当前编码格式: 1 echo $LANG ...

  6. Gradle安装配置教程

    一.安装前检查 检查电脑上是否安装JDK,如果没有安装,请查看JDK安装教程:点击查看 如果电脑上已经安装JDK,按Win + R键,输入cmd,然后点击确定 输入java -version,点击回车 ...

  7. Solidity-变量和数据类型[复合类型_1]

    复合类型的数据包括:array(数组).struct(结构体)和mapping(映射),其中array和struct也称为引用类型. 复合类型 数组(array) 数组(array)是一种用于存储相同 ...

  8. 当开源项目 Issue 遇到了 DevChat

    目录 1. 概述 2. Bug 分析与复现 3. Bug 定位与修复 4. 代码测试 5. 文档更新 6. 提交 Commit 7. 总结 1. 概述 没错,又有人给 GoPool 项目提 issue ...

  9. 使用 Sealos 一键部署高可用 MinIO,开启对象存储之旅

    大家好!今天这篇文章主要向大家介绍如何通过 Sealos 一键部署高可用 MinIO 集群. MinIO 对象存储是什么? 对象是二进制数据,例如图像.音频文件.电子表格甚至二进制可执行代码.对象的大 ...

  10. Note -「Maths」Euler 筛筛积性函数

    Part. 1 Preface 这个东西是我在做 JZPTAB 的时候 LYC 给我讲的. 然后发现这是个通法,就写一写. 本文除了例题所有代码均未经过编译,仅作为参考. Part. 2 Untitl ...