PHC产生PPS,调用了一些PPS接口,以下为查阅分析的PPS接口资料。

一、简介

LinuxPPS提供了一个编程接口(API),用于在系统中定义多个PPS源。
PPS是指“每秒脉冲”,PPS源只是一个每秒提供高精度信号的设备,以便应用程序可以使用它来调整系统时钟时间。
PPS源可以连接到串行端口(通常连接到数据载波检测引脚)或并行端口(ACK引脚)或特殊CPU的GPIO(这是嵌入式系统中的常见情况),但在每种情况下,当新脉冲到达时,系统记录该秒脉冲的时间戳。

二、PPS接口的使用

1.注册PPS

在内核中注册PPS源,首先要定义一个pps_source_info结构体

然后在模块初始化时调用pps_register_source()

在linuxptp的应用中


ptp_clock_register()//ptp_clock.cpps_register_source(); //pps源的名字命名为ptp[index]如ptp1,可以通过cat /sys/class/pps/pps0/name查询到。

2.产生PPS事件

注册之后,可以调用pps_event()产生PPS事件,ts参数表示PPS事件的时间戳。例如可以在中断处理函数中调用pps_event,这个中断可以是外部的PPS信号触发的中断,也可以是定时器产生的中断。应用层可以读取pps事件来感知外部pps或内部pps事件。

示例代码可以查看drivers/pps/clients/pps-ktimer.c
驱动中对pps_event的调用链

dpaa2_ptp_irq_handler_thread()//ptp要产生pps信号给其他设备使用event.type = PTP_CLOCK_PPSptp_clock_event()pps_get_tsktime_get_snapshot()//获取系统时间快照pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT,NULL)//pps_event()和pps_get_ts()配合使用,pps_get_ts()用来产生          pps事件的时间,pps_event()是用来产生pps事件信号ttimespec_to_pps_ktime()pps->assert_tu = ts_real;pps->assert_sequence++;pps_kc_event(pps,ts,event); //call  hardpps() on pps eventhardpps(&ts->ts_real, &ts->ts_raw) //注意,这个地方是有条件进入的,当pps =pps_kc_hardpps_dev 且event& pps_kc_hardpps_mode时,hardpps()后面细讲wake_up_interruptible_all()唤醒中断,应用软件如果调用pps_read()会返回

3.读取pps事件

read()posix_clock_read()//这部分为驱动代码,将数据从内核态拷贝到用户态clk->opt.read()ptp_read()wait_event_interruptible()//等待条件是否满足,不满足则阻塞,满足则唤醒, (收到外部的PPS信号时,会读取寄存器时间放到事件队列中,然后唤醒此处的中断)唤醒后:取队列中的内容,拷贝到用户空间

4.hardpps()

而pps_kc_hardpps_dev和pps_kc_hardpps_mode这两个全局变量是何时被赋值的?可以追到timepps.h文件

time_pps_kcbind() //timepps.hioctl(handle,PPS_KC_BIND,&__bind_args)pps_cdev_ioctl()//pps.ccase PPS_KC_BIND:pps_kc_bind() //对pps_kc_hardpps_dev和pps_kc_hardpps_mode进行赋值

查遍linuxptp代码未发现调用调用ioctl(handle,PPS_KC_BIND,&__bind_args)的地方,所以在linuxptp的应用中不会调用hardpps()。

那么hardpps()是做啥用的?是ntp应用中调整系统时间用的。

上图来源于https://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#Q-PPS-API
PPS API描述了关于PPS的一些列接口,PPS API是一个公共的程序接口,记录在RFC2783协议中,下述链接是关于PPS API的详细描述
https://datatracker.ietf.org/doc/html/rfc2783#section-3.4.1
linux对PPS的驱动使用描述:
https://www.kernel.org/doc/html/latest//driver-api/pps.html

三、补充phc对外部pps信号的处理

GPS的PPS通过GPIO或者其他方式连接到PHC,当GPIO电平变化触发中断,中断处理函数如下

devm_request_threaded_irq()走if (status & DPRTC_EVENT_ETS1)或if (status &                      DPRTC_EVENT_ETS2)extts_clean_up()ptp_qoriq->read(reg_etts_l)//读寄存器ptp_qoriq->read(reg_etts_h)//读寄存器,组合成时间放在event中ptp_clock_event()enqueue_external_timestamp(&ptp->tsevq, event);//将event数据放在ptp->tsevq队列尾部wake_up_interruptible(&ptp->tsev_wq);//唤醒等待队列中断,应用程序在read中被唤醒,唤醒ptp_read()中断

疑问:系统是在什么时候写寄存器regs->etts_regs->tmr_etts1_l和tmr_etts1_h的呢?

linuxptp产生pps相关接口相关推荐

  1. 腾讯微博API时间线相关接口返回的微博信息中head值使用问题

    腾讯微博API时间线相关接口返回的微博信息中head值表示作者头像url,这个链接直接访问并不能使用,需要再附加一个参数指定图片的大小(100.50),比如:[head]/100.

  2. 框架:Spring之Aware相关接口

    一.Aware相关接口 对于应用程序来说,应该尽量减少对Sping Api的耦合程度,然而有些时候为了运用Spring所提供的一些功能,有必要让Bean了解Spring容器对其进行管理的细节信息,如让 ...

  3. java hook 框架_hook框架-frida简单使用模板以及frida相关接口

    一目录结构 ├── test.py #py脚本 └── test.js #js脚本 一.py脚本 test.py import frida import sys #连接设备app dev=frida. ...

  4. c语言不循环链表,无头单向不循环链表相关接口实现(C语言)

    单链表相关接口介绍List.h #define _CRT_SECURE_NO_WARNINGS #ifndef __LIST_H__ #define __LIST_H__ #include #incl ...

  5. 接口规范 12. 自动删除相关接口

    12 自动删除相关接口 12.1.查询自动删除任务 用途 查询服务器上的自动删除任务. 自动删除任务是一种运行在服务器上的服务,按照定义的规则自动删除过期的视频内容.例如,对于监控和视频直播类业务,可 ...

  6. 接口规范 11. 串流相关接口

    11 串流相关接口 11.1.查询串流任务 用途 查询服务器上的串流任务. 请求 streamingMgr/?request=get_streaming&id= id 串流任务在服务器上的唯一 ...

  7. 接口规范 10. 并发限制相关接口

    10 并发限制相关接口 10.1.查询并发限制配置 用途 查询某个应用的播出并发限制值. 如果一个应用设置了并发限制值,当访问该应用下视频流的并发数超过该值时,终端的播出请求会被禁止. 这个限制值是该 ...

  8. 接口规范 9. 推流认证相关接口

    9 推流认证相关接口 9.1.开启推流认证 用途 针对某个应用,开启推流认证. 开启推流认证后,所有向该应用下的推送直播流的请求都需要做合法性认证,只有认证通过的请求才会允许推送. 认证的方法包括to ...

  9. 接口规范 8. 播出认证相关接口

    8 播出认证相关接口 8.1.开启播出认证 用途 针对某个应用,开启播出认证. 开启播出认证后,所有播放该应用下的视频流的请求都需要做合法性认证,只有认证通过的请求才会允许播放. 认证的方法包括tok ...

最新文章

  1. JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
  2. centos6.5搭建php网站,Centos6.5下搭建web环境(Apache+mysql+php+phpMyAdmin)
  3. 服务器性能指标(一)——负载(Load)分析及问题排查
  4. 算法题存档20190204
  5. WORD如何修改自动编号的起始编号值?
  6. matlab 求向量的交集_MATLAB矩阵列向量单位化的最快代码
  7. android 显示canvas,【报Bug】部分情况下,安卓canvas不显示
  8. 显示器提示超频的解决办法
  9. 原理图编译出现Has no driving source 啥意思?
  10. cad快看_CAD三维这样材质贴图,你学会了吗 ?
  11. mysql 导出指定分隔符_mysql 导出行数据到txt文件,指定字符分割
  12. 自学python怎么找工作-我是如何在自学编程9个月后找到工作的
  13. 读书笔记-精准努力-思考时间和精力的分配
  14. SEO优化怎么做?【两步解决】
  15. oracle数据库中spool的作用,Oracle中Spool命令如何使用 Oracle中Spool命令使用方法
  16. 视频教程-软考系统集成项目管理工程师视频教程(下)-软考
  17. 在安卓开发中,使用腾讯地图实现定位与导航功能
  18. 展示软件下载v2.0
  19. matlab产生带通白噪声,理想白噪声和带限白噪声的产生与分析
  20. 数据源(Data Source

热门文章

  1. AI on Android:安卓平台上的人工智能应用实战(02.模型的再训练)
  2. SpringMVC详解
  3. android图片展示 2d,玩转Android-2D图形及卡通-图片处理
  4. PageInfo对处理过的list进行分页
  5. 【TX2】TX2刷机教程(保存以防二刷)
  6. 读取OleDbDataReader对象的方法
  7. Unity3D 定时任务
  8. 【GDOI2016模拟4.22】总结
  9. [转]文本框TextField的事件
  10. 基于机器学习的协同创新设计框架-香水瓶设计