Gpsd pps移植

本文介绍了如何将GPSD的PPS功能移植到Linux系统,以实现与NTPD或chronyd配合的高精度时间同步。内容包括GPSD的原理、配置kernel pps.ko模块、GPSD的交叉编译和使用,以及在嵌入式设备上的运行和调试步骤。
摘要由CSDN通过智能技术生成

Gpsd pps移植

最近在研究GPSD相关信息,查阅到GPSD可以与NTPD相配合实现高精度时间同步功能,因此才涉及到此主题。

目前手头用的是Ublox F9P模块,UART输出NEMA数据,另外一个GPIO输出1PPS脉冲

首先看一张时序图

 

1. NEMA中包含有时间信息,一般是秒级别,也有部分带有毫秒

2. 1PPS即每秒输出一个脉冲,图中以高电平触发为例(没画下降沿),接收及处理1PPS脉冲的时间也在ns级别

3. 因为NEMA是通过串口发送和接收,而且一次NEMA数据量也有KB级别大小,处理时间远比1PPS时间长

4. 通过NEMA中的秒级时间和1PPS脉冲相配合,即可实现高精度时间同步(ns级:依据1PPS的响应时间)

具体时间同步实现,以Linux为例,常用组合方式为:kenel pps.ko,GPSD,chronyd或者NTPD

首先Kernel pps.ko:

当前kernel是支持pps处理的,因为我用的ublox的pps是接到gpio的,所以选择gpio方式

 

1. kernel timer client 是内核软件模拟的pps信号,用于测试

2. pps client using gpio 是以gpio作为pps信号源

pps-gpio.c源码实现也比较简单,主要通过注册gpio中断,当gpio电平变化时,记录当前系统运行时刻,然后post event到用户空间。

因为使用了外部GPIO,因此在使用该模块之前,需要在dts中指定相关的gpio引脚,compatible 为 "pps-gpio" 在文件cx1910_single_pmu.dts中

ublox_gps {

compatible = "pps-gpio";//与驱动中的进行匹配

gpios = <&gpio 109 0>;//引脚初始化,名字一定是gpios

pinctrl-names = "default";//

pinctrl-0 = <&gps_pps_pin>;//pinctrl配置的引脚

status = "okay";

};

因为源码中的驱动会进行匹配设备树的compatible

  1. static const struct of_device_id pps_gpio_dt_ids[] = {

  2.  

  3. { .compatible = "pps-gpio", },

  4.  

  5. { /* sentinel */ }

  6.  

  7. };

配置后编译启动,查阅dmesg

 

 

  1. root@imx8qxpmek:~# dmesg |grep pps

  2. [ 0.708441] pps_core: LinuxPPS API ver. 1 registered

  3. [ 0.713357] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>

  4. [ 1.737515] pps pps0: new PPS source ktimer

  5. [ 1.741727] pps pps0: ktimer PPS source registered

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值