linux内核驱动:ptp内核phc框架

news2024/11/26 2:45:14

目录

    • 一、介绍
    • 二、PHC驱动文件
    • 三、主要数据结构
    • 四、初始化和调用流程
    • 五、总结

一、介绍

本文基于linux内核5.10.xxx总结ptp1588精确时间协议实现过程中,内核部分的8A34002实现的phc(PTP hardware clock)驱动支持;

ptp的系统框架

在这里插入图片描述
.红圈部分为本笔记总结的phc驱动的部分;
.紫圈为用户层的ptp协议栈,如开源的ptp4l;
.蓝圈为集成在用户层ptp协议栈中时钟伺服控制部分,会根据ptp主时钟和本地时间的差值采用pid算法,调用linux的中的通用接口去控制phc驱动进行本地时间和频率的调整,进而和主时钟进行同步;
.红圈中的phc主要作用为通过用户空间的时钟伺服逻辑控制phc驱动进行微调时间递增的频率,实现phc功能的芯片如瑞萨的8A34002;
.MAC部分内置支持TSU时间标签单元寄存器时,时间信息可以在ptp数据包接收和发送的时机从TSU中获取或者调整TSU的时间;
.图中phc和mac中都有TSU时间标签单元,但是mac中的时间标签和通过网络传输过来的数据在驱动上更好集成时间精度更高,图中的方案是phc部分产生时钟频率,mac中的TSU以外部的时钟频率进行时间计时;

二、PHC驱动文件

1、ptp_chardev.c

实现结构struct posix_clock_operations *ops中的部分函数如下标注接口;

struct posix_clock_operations
{
struct module *owner;
int (*clock_adjtime)(struct posix_clock *pc, struct __kernel_timex *tx);
int (*clock_gettime)(struct posix_clock *pc, struct timespec64 *ts);
int (*clock_getres) (struct posix_clock *pc, struct timespec64 *ts);
int (*clock_settime)(struct posix_clock *pc,
const struct timespec64 ts);
/

* Optional character device methods:
*/
long (*ioctl) (struct posix_clock *pc,unsigned int cmd, unsigned long arg);
int (*open) (struct posix_clock *pc, fmode_t f_mode);
__poll_t (*poll) (struct posix_clock *pc,struct file *file, poll_table *wait);
int (*release) (struct posix_clock *pc);
ssize_t (*read) (struct posix_clock *pc,uint flags, char __user *buf, size_t cnt);
}

2、ptp_clock.c

ptp子系统的创建函数;
struct ptp_clock 的注册函数。创建/dev/ptp0、/dev/ptp1等设备节点;
static struct posix_clock_operations ptp_clock_ops 变量的定义;

实现static struct posix_clock_operations ptp_clock_ops 中的部分函数:
struct posix_clock_operations结构
{
struct module owner;
int (*clock_adjtime)(struct posix_clock *pc, struct __kernel_timex *tx);
int (*clock_gettime)(struct posix_clock *pc, struct timespec64 *ts);
int (*clock_getres) (struct posix_clock *pc, struct timespec64 *ts);
int (*clock_settime)(struct posix_clock *pc,const struct timespec64 *ts);
/

* Optional character device methods:
*/
long (*ioctl) (struct posix_clock *pc,unsigned int cmd, unsigned long arg);
int (*open) (struct posix_clock *pc, fmode_t f_mode);
__poll_t (*poll) (struct posix_clock *pc,struct file *file, poll_table *wait);
int (*release) (struct posix_clock *pc);
ssize_t (*read) (struct posix_clock *pc,uint flags, char __user *buf, size_t cnt);
}

3、ptp_sysfs.c

ptp设备的属性组定义;

定义如下属性:
static struct attribute *ptp_attrs[] = {
&dev_attr_clock_name.attr,
&dev_attr_max_adjustment.attr,
&dev_attr_n_alarms.attr,
&dev_attr_n_external_timestamps.attr,
&dev_attr_n_periodic_outputs.attr,
&dev_attr_n_programmable_pins.attr,
&dev_attr_pps_available.attr,
&dev_attr_extts_enable.attr,
&dev_attr_fifo.attr,
&dev_attr_period.attr,
&dev_attr_pps_enable.attr,
NULL
};

4、posix-timers.c

封装了关于获取时间、设置时间、调节频率的对应用户空间的系统调用函数,以 SYSCALL_DEFINE4 宏进行了注册,详见文件中定义;
定义了一个以时钟ID为数组下标的struct k_clock * const posix_clocks[] 数组;

5、posix-clock.c

字符设备节点/dev/ptp0、/dev/ptp1等的标准字符驱动函数实现;

static const struct file_operations posix_clock_file_operations = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.read = posix_clock_read,
.poll = posix_clock_poll,
.unlocked_ioctl = posix_clock_ioctl,
.open = posix_clock_open,
.release = posix_clock_release,
#ifdef CONFIG_COMPAT
.compat_ioctl = posix_clock_compat_ioctl,
#endif
};

注册动态时钟:
const struct k_clock clock_posix_dynamic = {
.clock_getres = pc_clock_getres,
.clock_set = pc_clock_settime,
.clock_get_timespec = pc_clock_gettime,
.clock_adj = pc_clock_adjtime,
};

6、ptp_clockmatrix.c

8A34002芯片实现phc驱动的驱动文件;
具体实现struct ptp_clock_info 中的底层钩子函数;

三、主要数据结构

1、struct ptp_clock

定义于ptp_private.h;
是对phc设备的整体封装表示,包括设备信息的描述和操作集;

2、struct posix_clock

定义于posix-clock.h ;
可以理解成是struct ptp_clock的抽象父类,struct ptp_clock为具体实现,应用调用时逐渐从抽象结构 struct ptp_clock 向具体实现 struct ptp_clock 调用;

3、struct posix_clock_operations ops;

定义于posix-clock.h ;
struct posix_clock 中的操作函数集成员;

4、struct ptp_clock_info

定义于ptp_clock_kernel.h;
struct ptp_cloc中操作集成员info的表示;
驱动需要具体实现的是此结构

5、关系
在这里插入图片描述

四、初始化和调用流程

在这里插入图片描述

五、总结

1、实现phc驱动方案或者芯片可以有多种选择,支持程序控制调节时钟频率且能达到调节精度要求即可;
2、ptp本地时间的TSU时间标签也可能在网络的phy芯片中,实际应用中需要实现网络底层驱动和tsu时间标签驱动接口的结合;

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

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

相关文章

RK3568 初识

RK3565是福州本土集成电路设计企业的产品,售价在200RMB左右,润和DAYU200完成基于RK3568的鸿蒙适配,官方售价高达2000RMB 瑞芯微电子有限公司(Rockchips Electronics CO., Ltd): 规模:2000人市值&#xff…

CSS实现前端布局更巧妙的方案!在 flex 布局中通过使用 margin 实现水平垂直居中以及其他常见的前端布局

在前端开发中,实现水平垂直居中一直是个热门话题。随着 CSS Flexbox 布局的普及,开发者们开始更多地使用 justify-content 和 align-items 这两个属性来解决这个问题。 然而,还有一种更加简洁、灵活的方式——使用 margin: auto; 来实现居中以…

【北京迅为】《STM32MP157开发板使用手册》- 第二十三章 Cortex-M4 开发环境搭建

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会

🔔香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会 🕙时间:2024年9月24日(星期二)14:30 🏠地点:香港中文大学(深圳)图书馆培训室…

【时序分析】作业汇编

一、基础知识 时间序列分析就是对一个时间序列进行建模,扣除各种趋势项(线性趋势、余弦趋势、有色噪声ARIMA),得到一个白噪声序列;换言之,我们要提取其中的有用信息(非白噪声序列)&…

Linux 之 RPM [Red - Hat Package Manager]【包管理】

命令符 -i(install):安装软件包。--test:测试安装,并不实际安装,只是检查依赖关系等是否满足安装条件。--nodeps:忽略依赖关系进行安装。不过这种方式可能导致软件因缺少依赖而无法正常运行&am…

【论文阅读】Face2Diffusion for Fast and Editable Face Personalization

code:mapooon/Face2Diffusion: [CVPR 2024] Face2Diffusion for Fast and Editable Face Personalization https://arxiv.org/abs/2403.05094 (github.com) 论文 介绍 面部个性化旨在将从图像中获取的特定面部插入到预先训练的文本到图像扩散模型中。然而&#…

linux服务器日常运维开机关机关服务命令

Linux开机关机命令 Linux服务器开机和关机命令 在Linux系统中,开机和关机通常涉及到几个命令: 开机: reboot - 重新启动正在运行的系统。 shutdown -r now - 立即重启系统。 关机: poweroff - 关闭系统并关闭电源。 shutdo…

消防摩托车的技术参数_鼎跃安全

一、技术概述 动力系统:消防摩托车搭载单缸、四冲程、水冷发动机,功率达 19kW,为车辆在野外复杂地形行驶提供强劲动力。确保能快速穿越山地、林间等区域,及时抵达火灾现场展开救援。 车体技术:采用高品质材料打造&am…

EA橘子平台Origin离线安装包获取

在EA官网下载的橘子平台安装包安装时我们发现是在线安装,一般的网络环境根本无法完成安装,一直卡在那里,我们可以借助加速器、特殊网络、或者直接获取离线安装包的方法安装,下面是如何获取离线安装包的方法。 打开EA官网&#xf…

基于微信小程序的宿舍报修系统的设计与实现

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宿…

PPT技巧:如何在幻灯片中生成目录?

PPT文件如何制作目录,如何点击目录标题立即跳转到相应幻灯片?今天小奥超人和大家一起来学习一下。 现在幻灯片里制作好目录页,制作好目录之后,选中一个目录,点击插入 – 链接 在插入链接界面中,选择【本文…

xLSTM模型学习笔记

笔记来源:bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制,其实就是一种时序上的注意力机制,相当于把不同时间进行"掺和",是对时序信息的一种选择性控制…

苍穹外卖——day1

前后端联调 前端先传给nginx再传给后端服务器 反向代理 我们可以看到前端和后端的访问地址不一样,那么怎么实现进行访问的呢? 我们是通过一种反向代理技术来实现的 利用nginx反向代理来实现前后端联调 下面是如何在我们的idea项目中使用nginx反向代理…

HCIA--实验十四:二层链路聚合

一、实验内容 1.需求/要求 用两台S5700交换机做链路聚合。 二、实验过程 1.拓扑图: 2.步骤: 1.配置交换机SW1 int Eth-Trunk 1 创建链路聚合组 mode lacp-static 配置LACP模式 trunkport GigabitEthernet 0/0/10把接口0/0/10加入聚合组 trunkpo…

如何快速提升指定关键词排名到Google首页?

如果你是一个新网站,那么就没有任何捷径,老老实实一步步优化正路,当然,你的资源特别多的情况下,也并非不可能,但这点很多人都很难满足,所以要想快速把指定关键词的排名推到Google首页&#xff0…

LCS—最长公共子序列

最长公共子序列问题就是求出两个字符串的LCS长度,是一道非常经典的面试题目,因为它的解法是典型的二维动态规划。 比如输入 str1 "babcde", str2 "acbe",算法应该输出3,因为 str1 和 str2 的最长公共子序列…

如何构建大数据治理平台,助力企业数据决策

建设背景 (1)什么是数据资产 资产由企业及组织拥有和控制,能够提供增值服务、带来经济利益的重要资源。 资产不但需要管理, 更需要运营。 (2)数据资产运营中的问题 数据资产运营中存在的问题主要包括以下…

【游戏杂谈】关于靠谱及不靠谱的游戏立项方式探讨

其他好内容推荐: 游戏二次创意算抄袭? - 游戏干饭之家 格斗游戏:一个伟大而古老的游戏类型 - 游戏干饭之家 游戏行业研究生和有两三年工作本科生谁更香? - 游戏干饭之家 立项一直是大部分公司和个人的难点,关于靠谱…

【MySQL】了解并操作MySQL的缓存配置与信息

目录 一、查看缓存配置 二、查看缓存信息 查询MySQL的缓存相关信息,一般我们用两个命令: show variables like %query_cache%; show status like %qcache%; 一、查看缓存配置 查看缓存配置的相关的系统变量变量,返回给我们服务器缓存的配置…