飞腾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. 如何创建Windows 10 虚拟机

    一 ,新建Windows 10 虚拟机 1.1 创建新的虚拟机 1,点击创建新的虚拟机 2,选择典型,点击下一步 3,选择稍后安装操作系统,点击下一步. 4,操作系统选择windwos,版本选着Win ...

  2. C#的重载决策

    重载是许多编程语言支持的特性.所谓重载,就是指可以定义多个名称相同但参数(个数.类型和顺序)不同的方法(函数).先来看一个例子: void Main() { char cvalue = 'a'; ma ...

  3. python实现在函数中捕获某个异常,然后将异常的具体信息写入error.txt文件中;

    在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确) 可以增加try来捕获异常 try这个关键字来捕获异常try:尝试执行的代码except:出现错误的处理 def func(): try: ...

  4. 工具—批量备案信息查询并生成fofa查询语句

    描述: 1.可以输入一个或多个公司名或域名或备案号,得到备案信息(备案公司名,备案公司网站url,备案号,域名类型,审核时间) 2.读取生成的信息并转为fofa语句,方便了指定目标的信息收集速度 工具 ...

  5. python独立脚本应用Django项目的环境

    一.需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统.主要是对密码的加密,在注册或者登录的时候,前端传递多来的密码,我会使用Django的s ...

  6. 干货分享:用ChatGPT调教批量出Midjourney咒语,出图效率Nice ,附资料。

    Prompts就是AI绘图的核心竞争力. 您是不是觉得用Midjourney生成的图不够完美? 又让ChatGPT去生成Prompt,然后效果还不理想? 其实ChatGPT你给他投喂资料后,经过调教的 ...

  7. 数据api接口就是应用集成吗?

    ​ 数据 API 接口和应用集成是两个不同的概念,但是它们之间有一定的联系.数据 API 接口是一种用于访问和传输数据的标准化接口,而应用集成则是将不同的应用程序和系统整合在一起,实现数据和业务流程的 ...

  8. 如何通过API接口获取微店的商品详情

    微店是一款电商平台,对于商家而言,了解商品详情数据是非常重要的.通过API接口获取微店的商品详情,可以让商家更加便捷地管理和分析商品数据.下面就让我们详细了解一下如何通过API获取微店的商品详情. 第 ...

  9. 深入理解Linux内核——内存管理(4)——伙伴系统(1)

    提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...

  10. HTML网页/KRPano项目一键打包EXE工具(HTML网页打包成单个windows可执行文件exe)

    HTML一键打包EXE工具使用说明 工具简介 HTML一键打包EXE工具(HTML封装EXE,桌件)能把任意HTML项目(网址)一键打包为单个EXE文件,可以脱离浏览器和服务器,直接双击即可运行.支持 ...