5G自协商

好的,下面是一个基于裸机 C 环境的自协商实现示例代码,支持 **最高 5G 并向下兼容**。这个代码框架假设你使用的是 IEEE 802.3 规范下的 **MDIO** 接口和常见的 **Marvell PHY**(或类似支持 5G/2.5G 的PHY)。

 

```c

#include <stdint.h>

#include <stdio.h>

#include <stdbool.h>

 

// 假设 MDIO 读写接口已经定义好

extern void mdio_write(uint8_t phy_addr, uint8_t mmd, uint8_t reg, uint16_t value);

extern uint16_t mdio_read(uint8_t phy_addr, uint8_t mmd, uint8_t reg);

extern void delay_ms(uint32_t ms);

 

//  PHY 地址

#define PHY_ADDR       0x01

 

// MDIO MMD = 7 (Auto-Negotiation), 0x13: Base Page Advertisement Register

#define MDIO_MMD_AN    7

#define MDIO_REG_AN_CTRL  0x10  // Auto-Negotiation Control

#define MDIO_REG_AN_ADV   0x13  // Auto-Negotiation Advertisement

#define MDIO_REG_AN_STATUS 0x01 // Auto-Negotiation Status

#define MDIO_REG_AN_LP_ABILITY 0x14 // Link Partner Ability

 

// 设置 PHY 的 Auto-Negotiation 并启用

void enable_autonegotiation(uint8_t phy_addr) {

    // 启动 AN

    mdio_write(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_CTRL, 0x1000);  // AN enable (bit 12)

    delay_ms(100);

}

 

// 配置本地 PHY 能力,包括 5G/2.5G 支持

void configure_nextpages(uint8_t phy_addr) {

    // 设置 Base Page 能力(支持 5G, 2.5G, 1G)

    mdio_write(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_ADV, 0x9803);  // 支持 5G (Message Page)

    mdio_write(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_ADV, 0x0401);  // 支持 2.5G

    mdio_write(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_ADV, 0x020B);  // 支持 1G

 

    // 设置 Next Page(Message Page 和 Vendor Page)

    mdio_write(phy_addr, MDIO_MMD_AN, 0x17, 0x9803);  // 5G 支持

    mdio_write(phy_addr, MDIO_MMD_AN, 0x17, 0x0401);  // 2.5G 支持

    mdio_write(phy_addr, MDIO_MMD_AN, 0x17, 0x020B);  // 1G 支持

    mdio_write(phy_addr, MDIO_MMD_AN, 0x17, 0x0000);  // 最后一页

}

 

// 等待 Auto-Negotiation 完成并检查状态

bool wait_an_complete(uint8_t phy_addr) {

    uint16_t status;

    for (int i = 0; i < 1000; i++) {

        status = mdio_read(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_STATUS);

        if (status & (1 << 5))  // bit5 = AN complete

            return true;

        delay_ms(10);

    }

    return false;

}

 

// 打印连接的对端能力(协商结果)

void print_link_partner_ability(uint8_t phy_addr) {

    uint16_t lp_page = mdio_read(phy_addr, MDIO_MMD_AN, MDIO_REG_AN_LP_ABILITY);

    printf("Link Partner Base Page: 0x%04X\n", lp_page);

}

 

// 读取 PHY 错误状态

void check_phy_error(uint8_t phy_addr) {

    uint16_t status = mdio_read(phy_addr, MDIO_MMD_AN, 0x01);  // 读取 PHY 错误状态寄存器

    if (status & 0x0001) {

        printf("PHY Error Detected!\n");

    }

}

 

int main(void) {

    uint8_t phy_addr = PHY_ADDR;

    

    // 启动 Auto-Negotiation

    enable_autonegotiation(phy_addr);

    

    // 配置 PHY 支持 5G/2.5G/1G 能力

    configure_nextpages(phy_addr);

    

    // 等待协商完成

    if (wait_an_complete(phy_addr)) {

        printf("Auto-Negotiation Completed!\n");

        print_link_partner_ability(phy_addr);

    } else {

        printf("Auto-Negotiation Failed or Timeout!\n");

    }

    

    // 检查 PHY 错误状态

    check_phy_error(phy_addr);

    

    return 0;

}

```

 

---

 

### 代码解析:

 

#### 1. **`enable_autonegotiation()`**

 

* 启动 PHY 的 **Auto-Negotiation** 功能(通过 MDIO 写寄存器)。

* `0x1000` 代表启用自动协商,具体值依据 PHY 规范。

 

#### 2. **`configure_nextpages()`**

 

* 配置 PHY 的能力(例如支持 5G、2.5G 和 1G):

 

  * `0x9803` 表示支持 5G。

  * `0x0401` 表示支持 2.5G。

  * `0x020B` 表示支持 1G。

* 设置 **Message Page** 和 **Vendor Page**。

* 每个页面都要配置 `NP` 和 `MP` 字段,最后一页设置为 `NP=0`。

 

#### 3. **`wait_an_complete()`**

 

* 等待并检查 Auto-Negotiation 是否完成,检查 `AN Status` 寄存器中的 bit 5。

 

#### 4. **`print_link_partner_ability()`**

 

* 获取并打印对端设备的协商能力。

 

#### 5. **`check_phy_error()`**

 

* 读取并检查 PHY 错误状态。

 

---

 

### 需要注意的几点:

 

1. **MDIO 接口**:该代码假设你的系统已经有一个 MDIO 接口,并且 `mdio_read()` 和 `mdio_write()` 已经实现好。这是和 PHY 进行交互的基础。

2. **PHY 芯片型号**:不同的 PHY 芯片可能有不同的寄存器配置,实际使用时需要根据你使用的 PHY 设备来调整寄存器地址和设置项。

3. **PHY 复位**:某些情况下,在启动 Auto-Negotiation 之前需要先复位 PHY。

 

---

 

### 小结:

 

这是一个简单的裸机 C 程序框架,展示了如何在 PHY 设备上启用并配置 **最高 5G 支持**的自协商功能。可以根据你的硬件平台和 PHY 型号进一步调整细节。

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

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

相关文章

sublime 4200 激活

目录 下载激活方式一&#xff1a;sublime 打开方式二&#xff1a;https://hexed.it 打开 下载 sublime官方下载 sublime_text_build_4200_x64.zip 激活 方式一&#xff1a;sublime 打开 1、复制 sublime_text.exe 为 sublime_text_activation.exe 2、直接使用 sublime_ 打开…

Ceph 和 MinIO

Ceph 和 MinIO 是两种主流的分布式存储系统&#xff0c;但它们的设计目标、架构和使用场景存在显著差异。以下是清晰的对比解析&#xff1a; &#x1f9e9; 核心定位对比 维度CephMinIO定位统一存储平台&#xff08;块/对象/文件&#xff09;纯对象存储&#xff08;S3兼容&…

cili3d笔记20 正交投影3d重建笔记1

正交视图转3d mostFrequentCluster.lines.forEach(line > {const [x1, y1, x2, y2] line;let xhat{x1,x2};let yhat{y1,y2};}); 没考虑到侧视图 const clusters clusterLines(inputlines, 5);const lines3d:[number,number,number,number,number,number][][]const { mostM…

【Docker基础】Docker容器生命周期管理:从创建到删除的完整指南

目录 1 容器生命周期概述 2 容器创建&#xff08;docker create&#xff09; 2.1 docker create命令详解 2.2 创建流程解析 2.3 创建与运行的区别 3 容器启动&#xff08;docker start&#xff09; 3.1 docker start命令详解 3.2 启动流程解析 3.3 启动与运行的区别 …

Docker、Docker composer与Docker desktop

文章目录 Docker、Docker composer与Docker desktop一、docker、docker composer、docker desktop1.1 Docker1.2 Docker Compose1.3 Docker Desktop1.4 三者之间的区别 二、docker desktop的安装和换源2.1 前期准备WSL2 2.1 Docker Desktop 安装下载 Docker Desktop安装 Docker…

H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录

引言 早在大学的时候&#xff0c;我就期望做一款属于自己的 APP&#xff0c;可惜那时不懂技术。现在有了技术&#xff0c;但却没有时间。好在 AI 的快速发展终于让我完成了这个愿望。于是&#xff0c;我用半天的时间&#xff0c;用 AI 生成了一个纯前端的 H5 程序&#xff1a;…

简述C++ nlohmann/json 库

目录 JSON概述 nlohmann/json 库的使用 创建json数组/对象 字符串解析&#xff08;parse反序列化&#xff09; 数据访问 序列化 文件读写 JSON概述 JSON(JavaScrip Object Notation)是一种轻量级、跨语言的数据交换格式。它基于 ECMAScript 子集&#xff0c;以独立于编程…

定制开发开源AI智能名片与S2B2C商城小程序的内容分发体系构建:基于“1+N“素材复用模型的创新实践

摘要&#xff1a;在数字内容爆炸式增长的当下&#xff0c;本文针对内容分发效率低下的行业痛点&#xff0c;提出基于"定制开发开源AI智能名片S2B2C商城小程序"的一体化解决方案。通过构建"1篇长文10条长视频20条短视频10个平台"的素材复用公式&#xff0c;…

c++26新功能—hive容器

一、容器的演进 科学进步的过程一般来说都是从先解决常用的、迫切的问题开始&#xff0c;然后再逐步解决一些少见不迫切的问题&#xff0c;直到最终解决到认知程度内的诸多问题。举一个网上的例子&#xff0c;以前说咱们无法生产水笔的尖头上的钢球&#xff0c;其实这对于国内…

Kafka 源码剖析:消息存储与协议实现(二)

四、协议实现机制探秘 4.1 生产者协议 4.1.1 消息发送流程 Producer 在向 Kafka 集群发送消息时&#xff0c;首先会根据分区策略选择目标分区 。常见的分区策略有轮询、按消息键的哈希值分区以及自定义分区策略 。如果生产者在发送消息时指定了分区号&#xff0c;那么消息就…

Vue.js 与 TypeScript:最佳实践

1. 引言 Vue.js 是一个渐进式、灵活的 JavaScript 框架&#xff0c;广泛用于构建用户界面和单页应用&#xff08;SPA&#xff09;。而 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型和其他高级特性。将两者结合使用&#xff0c;可以帮助开发者构建更具可维护…

webpack5 css-loader:从基础到原理

webpack 处理样式 webpack本身是不能识别样式资源的&#xff0c;需要借助Loader来帮助webpack解析样式资源&#xff0c;样式资源包括但不限于css/less/sass/scss/styl 未使用样式处理加载器前 运行webpack打包命令 bash npx webpack报错信息如图&#xff0c;提示无法识别css…

【GESP】C++三级练习 luogu-B2096 直方图

GESP C三级练习&#xff0c;一维数组练习&#xff0c;难度★★☆☆☆。 题目题解详见&#xff1a;【GESP】C三级练习 luogu-B2096 直方图 | https://www.coderli.com/gesp-3-luogu-b2096/ 【GESP】C三级练习 luogu-B2096 直方图 | OneCoderGESP C三级练习&#xff0c;一维数组…

【网站内容安全检测】之2:从网站所有URL页面中提取所有外部及内部域名信息

还没写成Go的&#xff0c;用Python吧&#xff0c;稍微慢一点 依赖内容&#xff08;安装命令pip install -r requirements.txt) requirements.txt aiohttp beautifulsoup44.12.2 tqdm4.66.1 redis5.2.1 motor3.3.1 pymongo4.6.0 chardet提取域名的程序 domain_extractor.py …

【LLaMA-Factory 实战系列】四、API 篇 - 部署推理服务与批量调用实战

【LLaMA-Factory 实战系列】四、API 篇 - 部署推理服务与批量调用实战 1. 引言2. 推理后端的选择与对比3. 部署 API 推理服务3.1 创建 API 配置文件3.2 启动 API 服务3.3 探索交互式 API 文档 4. 编写 Python 脚本进行批量调用4.1 准备工作4.2 批量调用脚本4.3 运行脚本并查看结…

C++工厂模式的作用(工厂方法、Factory Method、Factory Pattern)

文章目录 代码示例工厂的作用1. 对象创建的封装 &#x1f3ed;2. 解耦客户端和具体类 &#x1f517;3. 统一的创建入口 &#x1f6aa;4. 隐藏实现细节 &#x1f3ad; 在这个项目中的具体体现总结 代码示例 https://gitee.com/arnold_s/my-learning-test/tree/master/20250610_…

9-C#修改任务管理的名称

C#修改任务管理的名称

Fisco Bcos学习 - 搭建第一个区块链网络

文章目录 一、前言二、环境准备三、安装依赖在 macOS 上安装依赖在 Ubuntu 上安装依赖在 CentOS 上安装依赖 四、创建操作目录并下载安装脚本五、搭建单群组 4 节点联盟链六、启动 FISCO BCOS 链七、检查进程八、检查日志输出 在数字化时代&#xff0c;区块链技术正逐渐成为推动…

可视化图解算法53:表达式求值

牛客网 面试笔试 TOP 101 1. 题目 描述 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 数据范围&#xff1a;0≤∣s∣≤100&#xff0c;保证计算结果始终在整型范围内 要求&#xff1a;空间复杂度&#xff1a; O(n)&#xff0c;时间复杂度 O(n) 示例1 输入…

小白成长之路-Nginx配置(二)

文章目录 一、localtion配置1.匹配规则2.匹配优先级3.配置案例 二、rewrite1、 语法2、 可写入字段3 配置案例4 if 指令5.sutoindex6. nginx配置中的常用变量 三、配置Nginx状态统计1.下载vts模块2.编译nginx 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…