T2080 AR8031 RGMII to 1000Base-X(fiber)

        前段时间在调试FT-M6678和C6678的板卡,结果中途来了一个T2080网络配置的更改需求,就临时处理了一下,花了一点功夫,记录下来,为大家做个参考。

        这个问题完成后,就得继续开发FT-M6678了~

  1. uboot下面phy配置更改(board/freescale/tx208xrdb/eth_t208xrdb.c)

        a. 配置芯片模式配置为BX1000_RGMII_50

miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1F, 0x106);    //mode_cfg: 0010 = BX1000_RGMII_50
printf("phy write 0x1F by 0x106!\r\n");
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x0, 0x2100);
printf("phy write 0x0 by 0x2100!\r\n");
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x0, 0x140);
printf("phy write 0x0 by 0x140!\r\n");
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1F, 0x102);    //mode_cfg: 0010 = BX1000_RGMII_50
printf("phy write 0x1F by 0x102!\r\n");
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0xD, 0x3);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0xE, 0x805D);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0xD, 0x4003);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0xE, 0x100);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1D, 0x0);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1E, 0x8000);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1D, 0x5);
miiphy_write(DEFAULT_FM_MDIO_NAME, 0x6, 0x1E, 0x100);
//dummy read status
miiphy_read(DEFAULT_FM_MDIO_NAME, 0x6, 0x1, &value);

2. 更改phy.c(drivers/net/phy)

/*** genphy_update_link - update link status in @phydev* @phydev: target phy_device struct** Description: Update the value in phydev->link to reflect the*   current link value.  In order to do this, we need to read*   the status register twice, keeping the second value.*/
int genphy_update_link(struct phy_device *phydev)
{unsigned int mii_reg;/** Wait if the link is up, and autonegotiation is in progress* (ie - we're capable and it's not done)*/mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);/** If we already saw the link up, and it hasn't gone down, then* we don't need to wait for autoneg again*///modifyif (phydev->addr != 6){if (phydev->link && mii_reg & BMSR_LSTATUS)return 0;}else{if (mii_reg & BMSR_LSTATUS)    {phydev->link = 1;printf("%s Force Mode", phydev->dev->name);phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, 0x140);return 0;}}if ((mii_reg & BMSR_ANEGCAPABLE) && !(mii_reg & BMSR_ANEGCOMPLETE)) {int i = 0;printf("%s Waiting for PHY auto negotiation to complete",phydev->dev->name);while (!(mii_reg & BMSR_ANEGCOMPLETE)) {/** Timeout reached ?*/if (i > PHY_ANEG_TIMEOUT) {printf(" TIMEOUT !\n");phydev->link = 0;return 0;}if (ctrlc()) {puts("user interrupt!\n");phydev->link = 0;return -EINTR;}if ((i++ % 500) == 0)printf(".");udelay(1000);    /* 1 ms */mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);}printf(" done\n");phydev->link = 1;} else {/* Read the link a second time to clear the latched state */mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);if (mii_reg & BMSR_LSTATUS)phydev->link = 1;elsephydev->link = 0;}return 0;
}
/** Generic function which updates the speed and duplex.  If* autonegotiation is enabled, it uses the AND of the link* partner's advertised capabilities and our advertised* capabilities.  If autonegotiation is disabled, we use the* appropriate bits in the control register.** Stolen from Linux's mii.c and phy_device.c*/
int genphy_parse_link(struct phy_device *phydev)
{int mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);if (phydev->addr != 6){/* We're using autonegotiation */if (phydev->supported & SUPPORTED_Autoneg) {u32 lpa = 0;int gblpa = 0;u32 estatus = 0;/* Check for gigabit capability */if (phydev->supported & (SUPPORTED_1000baseT_Full |SUPPORTED_1000baseT_Half)) {/* We want a list of states supported by* both PHYs in the link*/gblpa = phy_read(phydev, MDIO_DEVAD_NONE, MII_STAT1000);if (gblpa < 0) {debug("Could not read MII_STAT1000. Ignoring gigabit capability\n");gblpa = 0;}gblpa &= phy_read(phydev,MDIO_DEVAD_NONE, MII_CTRL1000) << 2;}/* Set the baseline so we only have to set them* if they're different*/phydev->speed = SPEED_10;phydev->duplex = DUPLEX_HALF;/* Check the gigabit fields */if (gblpa & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) {phydev->speed = SPEED_1000;if (gblpa & PHY_1000BTSR_1000FD)phydev->duplex = DUPLEX_FULL;/* We're done! */return 0;}lpa = phy_read(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE);lpa &= phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA);if (lpa & (LPA_100FULL | LPA_100HALF)) {phydev->speed = SPEED_100;if (lpa & LPA_100FULL)phydev->duplex = DUPLEX_FULL;} else if (lpa & LPA_10FULL)phydev->duplex = DUPLEX_FULL;/** Extended status may indicate that the PHY supports* 1000BASE-T/X even though the 1000BASE-T registers* are missing. In this case we can't tell whether the* peer also supports it, so we only check extended* status if the 1000BASE-T registers are actually* missing.*/if ((mii_reg & BMSR_ESTATEN) && !(mii_reg & BMSR_ERCAP))estatus = phy_read(phydev, MDIO_DEVAD_NONE,MII_ESTATUS);if (estatus & (ESTATUS_1000_XFULL | ESTATUS_1000_XHALF |ESTATUS_1000_TFULL | ESTATUS_1000_THALF)) {phydev->speed = SPEED_1000;if (estatus & (ESTATUS_1000_XFULL | ESTATUS_1000_TFULL))phydev->duplex = DUPLEX_FULL;}} else {u32 bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);phydev->speed = SPEED_10;phydev->duplex = DUPLEX_HALF;if (bmcr & BMCR_FULLDPLX)phydev->duplex = DUPLEX_FULL;if (bmcr & BMCR_SPEED1000)phydev->speed = SPEED_1000;else if (bmcr & BMCR_SPEED100)phydev->speed = SPEED_100;}}else{u32 bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);phydev->speed = SPEED_10;phydev->duplex = DUPLEX_HALF;if (bmcr & BMCR_FULLDPLX)phydev->duplex = DUPLEX_FULL;if (bmcr & BMCR_SPEED1000)phydev->speed = SPEED_1000;else if (bmcr & BMCR_SPEED100)phydev->speed = SPEED_100;}return 0;
}

2. 在内核系统启动后,依次输入如下指令:

ifconfig fm1-mac1 192.168.1.130 up

ifconfig fm1-mac3 192.168.2.130 up

ethtool -s fm1-mac3 speed 1000 duplex full autoneg off

使用ethtool配置强制千兆全双工,自协商关闭,即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

COX回归影响因素分析的基本过程与方法

在科学研究中&#xff0c;经常遇到分类的结局&#xff0c;主要是二分类结局&#xff08;阴性/阳性&#xff1b;生存/死亡&#xff09;&#xff0c;研究者可以通过logistic回归来探讨影响结局的因素&#xff0c;但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压&#xff0c;将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

BEV系列一:BEV介绍和常用BEV算法简介

BEV系列一&#xff1a;BEV介绍和常用BEV算法简介 自动驾驶最全学习资料获取&#xff1a;链接

Linux操作系统——线程概念

1.什么是线程&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#x…

openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断

文章目录 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断242.1 SQL自诊断242.1.1 告警场景242.1.2 规格约束 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断 SQL调优是一个不断分析与尝试的过程&#xff1a;试跑Query&…

【KTips】如何为Job指定两个“parent“

欢迎来到一分钟 KT Tips! &#x1f389; 想必在日常生活中&#xff0c;大家总会遇到这样的苦恼&#xff1a;我有一个 Job &#xff0c;但是它有两个“候选parent”。这可愁坏了我们亲爱的小job&#xff1a; val pJob1: Job Job()fun createJob(pJob2: Job): Job {return Job…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

微信小程序之tabBar

1、tabBar 如果小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部有 tab 栏可以切换页面&#xff09;&#xff0c;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面。 属性类型必填默认值描述colorHexColor是tab 上的文字默认颜色…

Leetcode 3.14

Leetcode hot100 二叉树1.二叉树的层序遍历2.验证二叉搜索树3.二叉树的右视图 二叉树 1.二叉树的层序遍历 二叉树的层序遍历 二叉树的层序遍历可以用先进先出的队列来实现。 将每一层的所有node都添加到队列中&#xff0c;记录下当前队列的长度&#xff0c;即该层的元素数量&…

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

文章目录 &#x1f984; 进程替换&#x1f9a9; execl()函数&#x1f9a9; execlp()函数&#x1f9a9; execle()函数&#x1f9a9; execv()函数&#x1f9a9; execvp()函数&#x1f9a9; execvpe()函数&#x1f9a9; execve()函数 &#x1f984; 简单Shell命令行解释器的实现&a…

【漏洞复现】ChatGPT-Next-Web SSRF漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Python-sklearn-diabetes项目实战

目录 1 下载数据集和预处理 1.1 加载/下载数据集 1.2 数据可视化 1.3 数据清洗 1.4 特征工程 1.5 构建特征集和标签集 1.6 拆分训练集和测试集 2 训练模型 2.1 选择算法和确定模型 2.2 训练拟合模型 3 评估并优化模型性能 本文以糖尿病数据集diabetes为基础进行线性…

【Node.js从基础到高级运用】十一、构建RESTful API

在本篇博客中&#xff0c;我们将综合之前讨论的内容&#xff0c;深入探索如何使用Node.js构建一个RESTful API。我们将重点讨论设计合理的API端点&#xff0c;展示如何通过代码实现这些端点&#xff0c;并指导如何使用Postman测试我们的API&#xff0c;确保其按预期工作。 前提…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景&#xff1a; 今天使用docker部署了一个RabbitMQ&#xff0c;浏览器打开15672可视化页面发送消息后不显示Overview中的折线图&#xff0c;还有队列中的Messages&#xff0c;因为我要看队列中的消息数量。 解决方案&#xff1a; 进入容器内部 docker exec -it 容器id…

NumPy库中的np.exp和np.exp2

在NumPy库中&#xff0c;np.exp和np.exp2是两个用于计算指数的函数&#xff0c;但它们的基数不同&#xff1a; np.exp(x)&#xff1a;计算自然指数 ex&#xff0c;其中 e 是自然对数的底数&#xff0c;大约等于2.71828。这个函数返回e的x次幂&#xff0c;用于各种自然增长或衰…

Spring Cloud Gateway如何实现熔断

Spring Cloud Gateway熔断集成 熔断应用&#xff1a; 金融市场中的熔断机制&#xff1a;在金融交易系统中&#xff0c;熔断机制&#xff08;Circuit Breaker&#xff09;是一种市场保护措施&#xff0c;旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数&#xff08…

MySQL数据库(5)——逻辑处理

逻辑处理 在MySQL中&#xff0c;可以使用逻辑运算符和条件语句来进行逻辑处理。 1.逻辑运算符 and 与or 或not 非 这里用法与Java中的用法相同&#xff0c;只是语法发生了部分变化。 2.case——when逻辑处理 语法&#xff1a; case when 条件 then 结果1 else 结果2 end 注…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高&#xff0c;出行方式多样化&#xff0c;也以私家车为主&#xff0c;那么既然私家车的需求不断增长&#xff0c;那么基于驾校的考核管理也就不断增强&#xff0c;那么业务系统也就慢慢的随之加大。信息…

我们是否生活在一个超大型生物的大脑之中?——对多元宇宙观与生命存在形式的哲学探讨

随着科技和哲学思辨的深入&#xff0c;关于人类所处宇宙的本质及我们自身存在的真实性的讨论越发引人入胜。其中一种颇具科幻色彩的观点认为&#xff0c;我们可能生活在某个巨大生物的大脑之中&#xff0c;所有的物理规律、自然现象以及我们的感知体验&#xff0c;都可能是这个…

15. jwt认证中间件

在上一篇登录功能的实现中&#xff0c;我们使用了jwt作为鉴权组件&#xff0c;其中登录后会颁发token。前端在访问后续请求时&#xff0c;可以带上这个token。对于一些需要权限校验的请求&#xff0c;我们就需要验证这个token&#xff0c;从token中获取到用户id&#xff08;有了…