欢迎淘宝搜索飞灵科技,我司相关新产品陆续上线。

想学习IEEE 1588/802.1AS时钟同步技术?看完这篇文章,你就知道从哪里入手学习了。IEEE 1588/802.1AS首先它是IEEE制定的标准,虽然标准是不变的东西,而这两个标准应用于实际工程项目时,可能会碰到各种各样的芯片方案,

  • 不同芯片厂商在网络控制器上实现自家的1588硬件辅助
  • 不同的PHY芯片厂商直接在PHY上实现自家的1588硬件辅助
  • 或者直接在FPGA上实现1588

也可能碰到各种各样的PTP软件协议栈

  • 开源的有linuxptp,ptpd,AVnu的gptp等
  • 虽然协议是一样的,但软件协议栈里的servo算法,滤波算法可能又各不相同

这篇文章就告诉你该从何入手学习IEEE 1588/802.1AS时钟同步技术。操作系统以Linux,硬件设备以TSync时钟同步开发板为例。(https://flyelf-tech.gitee.io/docs/tsync/intro/

1 系统框图

我们通过一个系统框图对1588软硬件系统进行整体的认识。这个系统框图是基于Linux操作系统的,纯FPGA的1588实现就不介绍了。
在这里插入图片描述

  • 硬件层:硬件层就是带有1588硬件辅助的网络控制器,由硬件PTP时钟向网络报文提供时间戳,时间戳的捕获是在MAC这一层。图里没有画PHY,类似地,如果使用PHY的1588功能的话,那硬件层就是PHY,由PHY上的PTP时钟向网络报文提供时间戳,时间戳的捕获是在PHY这一层。
  • 内核空间:Linux内核空间主要由两部分驱动来支持1588功能。其一是PTP时钟驱动,用于对硬件PTP时钟进行操作。其二是网络驱动,确切的说是网络驱动中的1588硬件时间戳的支持,用于捕获收发报文的硬件时间戳。当然,如果硬件层使用的是PHY的1588功能的话,内核空间对应的收发网络报文硬件时间戳的支持就在PHY驱动中。
  • 用户空间:PTP软件协议栈是用户空间的应用程序,它与内核驱动以及硬件的交互,是通过内核的用户空间API的实现的。对PTP时钟的操作是通过PHC (PTP Hardware Clock) API,对报文的收发以及硬件时间戳的使用是通过socket函数和SO_TIMESTAMPING选项。

2 IEEE标准学习

如果你学习的目的只是为了理解IEEE 1588/802.1AS标准,那就专心研读标准文档吧。能实际操作一下PTP设备的同步,动手配一配时钟类型,传输协议,P2P/E2E延迟机制等,看看主从时钟确定以及同步的数据,用tcpdump或者wireshark把同步过程中的报文抓下来,研究下报文格式和时序,就会对标准有更深入的理解。

3 PTP/gPTP软件协议栈学习

拿PTP/gPTP软件协议栈的源码来学习,这当然是要建立在你已经对IEEE 1588/802.1AS标准有一定学习和理解的基础之上,不然是什么也看不懂。和学习标准的建议一样,要实际操作一下PTP设备的同步,动手配一配时钟类型,传输协议,P2P/E2E延迟机制等,看看主从时钟确定以及同步的数据,用tcpdump或者wireshark把同步过程中的报文抓下来,研究下报文格式和时序。再结合代码学习,就没有那么难啦。一些开源的PTP软件:

如果你学习的目的也是为了写一个PTP软件,那Linux 1588用户空间的API一定要学习。这里直接贴上Linux 5.4源码文档的链接。

对这两部分API,Linux里同样也有测试工具验证。

4 Linux 1588驱动的学习

学习驱动当然离不开对硬件的理解。回到之前对内核空间部分的介绍,Linux内核空间主要由两部分驱动来支持1588功能。其一是PTP时钟驱动,用于对硬件PTP时钟进行操作。其二是网络驱动,确切的说是网络驱动中的1588硬件时间戳的支持,用于捕获收发报文的硬件时间戳。

4.1 PTP时钟驱动

PTP公共驱动代码在这里,

以TSync时钟同步开发板为例,PTP设备驱动是,

4.2 网络驱动硬件时间戳的支持

显然内核中的UDP, IP层的协议代码完全没必要看,硬件时间戳的代码是直接嵌在MAC驱动中的,以TSync时钟同步开发板为例,直接看网络控制器的设备驱动,

对发送来说,发出去的skb会有一个拷贝,通过skb_tstamp_tx(skb, &shhwtstamps)函数,时间戳信息会随着skb拷贝进入socket的错误队列,提供给应用层。

对接收来说,时间戳的信息放在接收skb的skb_hwtstamps(skb)位置,应用层就可以拿到了。

5 硬件原理学习

各种芯片厂商的1588硬件各不相同,所以硬件原理的学习只能是针对具体的硬件,研究硬件的参考手册。但通常都是会实现一个硬件时钟计数器,以纳秒计数,并且可以做频率的补偿以调整计数的快慢。这个计数器用来向网络控制器收发报文提供硬件时间戳。以TSync时钟同步开发板为例,其使用IMX6ULL处理器,1588硬件功能介绍可以参考IMX6ULLRM.pdf参考手册22.6.10 IEEE 1588 functions

6 结束语

本文主要为想学习IEEE 1588/802.1AS技术的人提供学习建议,欢迎讨论。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐