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

How to get NTP working with custom I/O Pin?

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

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

编辑:我在 Centos 上使用 ntpd

每秒一个脉冲的校准信号还需要在 1 秒 时准确读取输入引脚 以进行校准。轮询不会作为计时器执行,在高优先级工作上可能会因 OS 而不同。

同样的方法使用变化中断*这个引脚挂钩校准功能也不会授予校准方法的1 PPS执行由于中断处理延迟,比如发生更高优先级的中断时。

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

您的内核是否支持 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 instructions. However, it appears that it is only used for PPS sent over a serial line (e.g. RS-232).

中提到了它

是否安装了pps-tools

$ which ppstest
/usr/bin/ppstest

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

$ modinfo pps-gpio
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

您需要将“18”更改为您正在使用的 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