如何让NTP使用自定义I / O引脚?

时间:2017-02-13 23:27:11

标签: ntp

我有一个带I / O引脚的主板,我编写了一个C库,其中包含设置和查询这些I / O引脚状态的功能。假设其中一个函数的名称是get_pin(int pin_no),它返回该引脚的逻辑电压。我想向我的一个引脚发送1脉冲/秒(PPS)信号,并告诉Linux的NTPD根据此信号进行校准。

是否有可能告诉NTPD使用其中一个I / O引脚作为其PPS?如果是这样,这样做的方法是什么? IE浏览器。是通过配置文件还是需要修改NTPD的源代码?我早期的研究似乎表明后者可能是必要的。

编辑:我正在使用Centos上的ntpd

3 个答案:

答案 0 :(得分:1)

你的内核是否支持PPS?

$ grep PPS /boot/config-$(uname -r)
# PPS support
CONFIG_PPS=m
# CONFIG_PPS_DEBUG is not set
# PPS clients support
# CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_PPS_CLIENT_PARPORT=m
CONFIG_PPS_CLIENT_GPIO=m
# PPS generators support

是否安装了ldattach

$ which ldattach
/usr/sbin/ldattach

您可能不需要ldattachLinuxPPS installation说明中提到了这一点。但是,它似乎仅用于通过串行线发送的PPS(例如RS-232)。

是否安装了pps-tools

$ which ppstest
/usr/bin/ppstest

是否安装了pps-gpio.ko模块?

$ modinfo pps-giop
filename:       /lib/modules/4.4.0-38-generic/kernel/drivers/pps/clients/pps-gpio.ko
version:        1.0.0
license:        GPL
description:    Use GPIO pin as PPS source
author:         James Nuss <jamesnuss@nanometrics.ca>
author:         Ricardo Martins <rasm@fe.up.pt>
srcversion:     D2C22B0A465DA63746EFB59
alias:          of:N*T*Cpps-gpio*
depends:        pps_core
intree:         Y
vermagic:       4.4.0-38-generic SMP mod_unload modversions 

通过在GRUB配置中向内核行添加类似内容,可以告诉内核将GPIO引脚用作PPS信号:

dtoverlay=pps-gpio,gpiopin=18

您需要更改&#34; 18&#34;到你正在使用的GPIO引脚。

您需要在ntp.conf

中添加几行这样的内容
server 127.127.22.1            # ATOM(PPS)
fudge 127.127.22.1 flag3 1     # enable PPS API

参考文献:

http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm

http://linuxpps.org/wiki/index.php/Main_Page

http://rdlazaro.info/compu-Raspberry_Pi-RPi-stratum0.html

http://doc.ntp.org/4.1.1/refclock.htm

http://doc.ntp.org/4.1.1/driver22.htm

答案 1 :(得分:0)

每秒一个脉冲校准信号还需要精确读取输入引脚 1秒进行校准。轮询不会起作用,因为高优先级工作的操作系统可能会使计时器执行不同。

使用更改中断* 的同样方法,这个与校准功能相连的引脚也不会因为中断处理延迟而导致1 PPS执行校准方法发生更高优先级的中断。

答案 2 :(得分:0)

如果我正确地理解了问题,那么你正在使用像Raspberry这样的东西,并希望通过接收一些逻辑1的序列来同步你的系统,这些逻辑1意味着,例如,你的电路板的时间表? 我唯一不理解的是为什么你需要ntp守护进程。创建一个静态time_t变量是不是更好,它会在每个杯子收据上递增? 如果您希望稍后同步某些外部设备并且该板充当时间服务器 - 只要在静态变量和time(0)值之间的差异大于定义值时调整系统日期。