如何让 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
您可能不需要 ldattach
。 LinuxPPS 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
我有一块带 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
您可能不需要 ldattach
。 LinuxPPS 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