PTP简介及Linux phy ptp驱动实现

news2024/11/19 14:40:13

1、PTP简介

        PTP(precision time protocol)精确时间协议,是一种时间同步的协议,对应 IEEE 1588 标准,是基于网络数据包的一种时间同步协议,1588v2的同步精度可以达到ns级,但1588协议对硬件有依赖。

2、PTP原理  

        时间同步的核心就是不同时钟源之间的“对齐”,那么多个时钟源实体之间,要解决两个问题:

a、主从关系:两个设备或端口,谁作为基准方,谁作为跟随方。

b、对齐跟踪:如何实现从端RTC对齐主端RTC。

        1588协议针对两个问题分别给出了解决方案;实际上1588中存在两套协议,一套是控制面协议,用于确定主从关系,一套是业务面协议,用于主从之间时间对齐。

        控制面协议采用基于STP协议(生成树算法)的自动选源协议,被称为BMCA。

        具体实现是依赖Announce报文携带信息,选出根节点和设备上的根端口,从而生成树状的结构,在我们的应用场景中这不是重点。

        数据面协议采用双向打戳定时协议, 1588的理论依据需要来回路径严格对称,协议默认收发物理链路上的时延相等。下面重点介绍双向打戳的技术原理。

           图1:delay one step                     

t1:master向slave发送sync报文的时间,包含在sync报文内,slave通过解析sync报文得到。

t2:slave接收到sync报文的时间,slave的硬件解析到sync报文时记录时间戳,并传递给slave。

t3:slave向master发送delay_req报文,slave的硬件解析到报文的发送,记录发送时间戳并传递给slave

t4:master获取到slave发送过来的delay_req报文,master硬件解析到delay_req报文,记录到时间戳,并传递给master,master随后将t4放在Delay_resp中传递给slave,slave通过解析delay_resp报文获取到t4

slave获取到t1,t2,t3,t4后通过下面的公式,即可计算出与master时间之间的偏移,从而调整时间。

从上面的公式可以看出,master与slave之间的传输时延越稳定,则算出的offset越准确,时间同步也越精确。理想的时间戳如下方左图,精准地在报文在物理链路上收发的时刻打上时间戳,但是在实际中,会因为各种因素带来误差。

3、软件PTP和硬件PTP

        软件PTP是在报文发送和接收时,在协议栈使用系统时间打时间戳,由于软件处理与物理链路实际发送存在gap,且软件处理的时延不可预测,必然带来时间同步抖动的问题,精度难以保障。

        硬件PTP是在报文发送和接收时,由MAC/PHY内部的PHC时钟对报文打时间戳,精度可以达到1us以下。

        

图2:软件时间戳和硬件时间戳(图片来自网络)

4、以phy驱动说明如何支持硬件PTP

4.1 phy ptp驱动需求分析

        由上面对协议的介绍可知,Phy PTP驱动的核心是实现对1588报文识别并记录时间戳。因此驱动首先要实现的功能是时间戳相关的功能。

  1. 时间戳功能:根据Linux社区文档(linux/kernel_doc/networking/timestamping)指导,phy支持时间戳功能的核心数据结构是mii_timestamper,如下:
struct mii_timestamper {
	bool (*rxtstamp)(struct mii_timestamper *mii_ts,
			 struct sk_buff *skb, int type);

	void (*txtstamp)(struct mii_timestamper *mii_ts,
			 struct sk_buff *skb, int type);

	int  (*hwtstamp)(struct mii_timestamper *mii_ts,
			 struct ifreq *ifreq);

	void (*link_state)(struct mii_timestamper *mii_ts,
			   struct phy_device *phydev);

	int  (*ts_info)(struct mii_timestamper *mii_ts,
			struct ethtool_ts_info *ts_info);

	struct device *device;
};

rxtstamp:接收方向的报文获取时间戳

txtstamp:发送方向的报文获取时间戳

hwtstamp:phy硬件PTP配置

ts_info:上报phy硬件PTP的能力,对接ethtool。

4.2 PHC时钟功能

        在进行时钟同步时,必然少不了要获取并比对时间,phy硬件要支持打时间戳,内部有一个PHC时钟,需要使能PHC时钟,并提供时钟相关接口,根据社区文档(Documentation\driver-api\ptp.rst),驱动要实现的核心数据结构是ptp_clock_info

struct ptp_clock_info {
	struct module *owner;
	char name[16];
	s32 max_adj;
	int n_alarm;
	int n_ext_ts;
	int n_per_out;
	int n_pins;
	int pps;
	struct ptp_pin_desc *pin_config;
	int (*adjfine)(struct ptp_clock_info *ptp, long scaled_ppm);
	int (*adjfreq)(struct ptp_clock_info *ptp, s32 delta);
	int (*adjphase)(struct ptp_clock_info *ptp, s32 phase);
	int (*adjtime)(struct ptp_clock_info *ptp, s64 delta);
	int (*gettime64)(struct ptp_clock_info *ptp, struct timespec64 *ts);
	int (*gettimex64)(struct ptp_clock_info *ptp, struct timespec64 *ts,
			  struct ptp_system_timestamp *sts);
	int (*getcrosststamp)(struct ptp_clock_info *ptp,
			      struct system_device_crosststamp *cts);
	int (*settime64)(struct ptp_clock_info *p, const struct timespec64 *ts);
	int (*enable)(struct ptp_clock_info *ptp,
		      struct ptp_clock_request *request, int on);
	int (*verify)(struct ptp_clock_info *ptp, unsigned int pin,
		      enum ptp_pin_function func, unsigned int chan);
	long (*do_aux_work)(struct ptp_clock_info *ptp);
};

        在这里我们看到了很多和系统时钟类似的接口,例如adjtime,adjfreq,gettime等,在内核态注册PHC时钟后,用户态调用clock_gettime类似的接口就可以获取到相关的时间或是调整时间。

        至于这些接口的具体实现可参考Linux社区中的代码,如果大家细心去看就会发现很多厂家的驱动里面通过timecounter来维护时间,是不是和前面的内容关联上了呢。

4.3 PHC时间与系统时间的同步

        仅仅在PHC时钟之间完成同步是不够的,毕竟对内核或者用户态应用来说可便宜地获取时间的方法是获取系统时间,那么PHC时钟需要实现与系统时钟的同步。Phy PTP与gmac驱动及Linux ptp应用的对接:master设备需要同步系统时间到phy的phc时钟,slave设备需要同步phc时钟到系统时间,高精度的方法为使用pps定时校准,可参考社区文档(\Documentation\driver-api\pps.rst)

4.4 PPS时间同步

        //todo

五、发送和接收流程中的时间戳处理

发送流程中时间戳获取流程:

接收流程中时间戳获取流程:

        由RX和TX流程可知,TX方向是软件先发送1588报文,需要等待获取时间戳,RX方向是软件已收到时间戳,需等待相匹配的1588报文,时间戳与报文需一一对应,严格匹配。

        具体实现略过。事实上不同厂家的gamc/phy对协议和时间戳支持的程度不同,具体的获取时间戳的方式也不一样,所以需要具体情况具体处理。

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

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

相关文章

手把手!从头构建LLaMA3大模型(Python)

1. 前期准备 让我们先来想一想大概需要做什么。 首先是模型架构的选择。原工作用的是 GPT Neo 架构(可以看他们的 config),这个算是很老的模型了,最初是 EleutherAI 用来复现追踪 GPT-3 的工作的,现在用的也比较少了…

java入门1.4.0

前言: 在1.4.0版本中,更新了对语言三大要素的理解 红字为更新,绿字为迭代 这时我们目前拥有的知识 正片: 有了这些内容,我们就可以顺利进入到Spring Boot阶段了 Q:有人就会问,面向对象的特性…

瑞典农业科学大学《Nature Geoscience》(IF=18)!揭示北方森林碳汇对干旱的响应机制!

本文首发于“生态学者”微信公众号! 北方森林覆盖了地球陆地面积的11%,储存了全球陆地碳储量的约三分之一。因此,它们被认为是减缓气候变化政策的一个重要因素。然而,环极寒带地区是气候变化速度最快的地区。这包括更频繁和更严重…

谷粒商城实战(042集群学习-mysql集群-主从同步)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第361p-第p363的内容 集群 集群的基础形式 MySQL集群 MMM机制 这里使用了vip虚拟ip方式(如192.168.0.101,192.168.0.102&…

换位置(C++)

问题描述 体育课上,有一个班级的同学站成了一队,体育老师请最高的和最矮的两位同学调换一下位置,其余的同学不要动,请编程实现!(假设所有人的高矮都是不一样的) 输入 第一行有一个整数 &…

【html】爱心跳动动画:CSS魔法背后的故事

效果展示: 代码介绍: 爱心跳动动画:CSS魔法背后的故事 在前端开发中,CSS不仅仅是一种用于控制网页样式的工具,它也是一种表达创意和想象力的艺术手段。今天,我要为大家介绍一段使用CSS实现的爱心跳动动画…

【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统

题8 交通灯控制系统 十字路口交通灯由红、绿两色LED显示器(两位8段LED显示器)组成,LED显示器显示切换倒计时,以秒为单位,每秒更新一次;为确保安全,绿LED计数到0转红,经5秒延时&#…

深度解析:河南资信预评价乙级资质人员专业背景要求

深度解析:河南资信预评价乙级资质人员专业背景要求 河南资信预评价乙级资质对人员的专业背景有着明确的要求,这些要求旨在确保工程咨询单位具备足够的专业能力和技术水平。以下是对这些专业背景要求的深度解析: 一、咨询工程师(投…

基于IDEA的Maven(依赖介绍和引用)

如何通过一个坐标信息(依赖)去引用 ,某个"jar 包" 会在这篇博客进行学习。 目录 一、学习开始 (0)项目的结构组成和 "pom.xml" 文件内容。 (1)首先需要一个标签&#xf…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

计算机行业的现状与未来之2024

年年都说编程好,编程工资涨不了。 人家骑车送外卖,月入两万好不好。 一、计算机专业的背景与现状 在过去几十年里,计算机科学相关专业一直是高考考生的热门选择。无论是计算机科学与技术、软件工程,还是人工智能与大数据&#xff…

vue项目首页优化问题(前后端都要优化)

2.1 config/index.js 开启productionGzip 将其productionGzip 配置成true 2.2 配置Gzip的 插件配置 打开webpack.prod.config.js 配置一下这段代码 代码如下 if (config.build.productionGzip) { const CompressionWebpackPlugin require(‘compression-webpack-plugin’)…

深入探索Stable Diffusion:从原理到应用的全面解析

目录 一 Stable Diffusion的基本概念 什么是Stable Diffusion? Stable Diffusion与传统生成模型的区别 二 Stable Diffusion的理论基础 扩散过程的数学描述 马尔可夫链蒙特卡罗方法(MCMC) 三 Stable Diffusion的算法实现 基本步骤 代码实现 四 Stable Diffusion的…

jdk下载安装及电脑上同时安装多个jdk

一、jdk的下载 官方地址: Java Software | Oracle 系统环境变量配置 1、首先新建JDK1.8和17的JAVA_HOME,他们的变量名区分开,分别为JAVA17_HOME,JAVA8_HOME。分别指向他们的安装地址。 2、新建配置他们可变的地址,这个环境变量的值…

智能建筑与物联网技术:重塑未来空间的智慧交响曲

在21世纪的建筑领域,智能建筑已经成为城市发展的新地标,而物联网技术(IoT)正是驱动这一变革的核心引擎。下面大家一起窥探智能建筑与物联网技术结合的奇妙世界,探讨其广泛应用与未来发展趋势。 物联网技术&#xff1a…

保障信息安全!等保2.0的二级和三级到底有何不同?详细解析

在应用场景上,二级是地市级以上的国家机关、企业、事业单位的一般信息系统,三级是各级政府、企业、事业单位的内部重要信息系统,还有各个部委的官方网站等。 在评定标准方面,第二级和第三级则是以系统受损后对公共和国家安全的损害…

LoReFT——大语言模型的表示微调

引言 参数高效的微调或 PeFT 方法寻求通过更新少量权重来适应大型语言模型。然而,大多数现有的可解释性工作已经证明,表示编码了丰富的语义信息,这表明它可能是编辑这些表示的更好、更强大的替代方案。预先训练的大型模型通常经过微调以用于…

避免Tomcat调试信息泄露的最佳实践

大家好!我是小米,一个热爱分享技术的小伙伴。最近我们团队在进行网站安全扫描时,发现了一个敏感信息泄露的漏洞。经过一番努力,终于解决了这个问题。今天我想在这里分享我们的经历,希望能为大家提供一些参考和帮助。 问题背景 在处理请求过程中,如果服务器遇到运行时错…

《模拟联合国2.9—团队协作》

感谢上海财经大学持续的邀请,今天在阶梯教室举办的《模拟联合国2.0—团队协作》沙盘课程圆满结束。尽管场地的限制带来了一定的挑战,但得益于系统思考中“结构影响行为”的原则,我得以在不同场景中巧妙设计课程结构,极大地促进了大…

python版本的选择

python3.10.a1会出现奇怪的问题, AttributeError: module importlib.metadata has no attribute EntryPoints[end of output]但3.10.11不会 因此下载python(win版)link 选左边的