我有一个带I / O引脚的主板,我编写了一个C库,其中包含设置和查询这些I / O引脚状态的功能。假设其中一个函数的名称是get_pin(int pin_no)
,它返回该引脚的逻辑电压。我想向我的一个引脚发送1脉冲/秒(PPS)信号,并告诉Linux的NTPD根据此信号进行校准。
是否有可能告诉NTPD使用其中一个I / O引脚作为其PPS?如果是这样,这样做的方法是什么? IE浏览器。是通过配置文件还是需要修改NTPD的源代码?我早期的研究似乎表明后者可能是必要的。
编辑:我正在使用Centos上的ntpd
答案 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
您可能不需要ldattach
。 LinuxPPS 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
答案 1 :(得分:0)
每秒一个脉冲校准信号还需要精确读取输入引脚 1秒进行校准。轮询不会起作用,因为高优先级工作的操作系统可能会使计时器执行不同。
使用更改中断* 的同样方法,这个与校准功能相连的引脚也不会因为中断处理延迟而导致1 PPS执行校准方法发生更高优先级的中断。
答案 2 :(得分:0)
如果我正确地理解了问题,那么你正在使用像Raspberry这样的东西,并希望通过接收一些逻辑1的序列来同步你的系统,这些逻辑1意味着,例如,你的电路板的时间表?
我唯一不理解的是为什么你需要ntp守护进程。创建一个静态time_t
变量是不是更好,它会在每个杯子收据上递增?
如果您希望稍后同步某些外部设备并且该板充当时间服务器 - 只要在静态变量和time(0)
值之间的差异大于定义值时调整系统日期。