Как заставить NTP работать с пользовательским вводом-выводом?

У меня есть материнская плата с контактами ввода-вывода, и я написал библиотеку C с функциями для установки и запроса состояния этих контактов ввода-вывода. Допустим, имя одной из этих функций — get_pin(int pin_no), и она возвращает логическое напряжение этого вывода. Я хотел бы отправить сигнал 1 импульс в секунду (PPS) на один из моих контактов и сказать NTPD Linux выполнить калибровку на основе этого сигнала.

Можно ли указать NTPD использовать один из этих контактов ввода-вывода в качестве PPS? Если да, то каков подход к этому? Т.е. Это через файл конфигурации или требует изменения исходного кода NTPD? Мое раннее исследование, кажется, предполагает, что последнее может быть необходимо.

Редактировать: я работаю с ntpd на Centos


ntp
person DeepDeadpool    schedule 13.02.2017    source источник
comment
Какую ОС вы используете?   -  person Ortomala Lokni    schedule 24.02.2017
comment
@Ortomala Локни CentOS   -  person DeepDeadpool    schedule 24.02.2017
comment
Вы написали свой собственный драйвер или используете уже существующий?   -  person Ortomala Lokni    schedule 24.02.2017
comment
Я написал библиотечные функции для управления выводами, но без драйвера.   -  person DeepDeadpool    schedule 27.02.2017
comment
NTP вы имеете в виду чип часов реального времени? PPS для выбора периферийного устройства?   -  person Damien    schedule 02.03.2017
comment
NTP как в протоколе сетевого времени. PPS в импульсах в секунду   -  person DeepDeadpool    schedule 02.03.2017


Ответы (3)


Есть ли в вашем ядре поддержка 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. Однако похоже, что он используется только для PPS, отправляемых по последовательной линии (например, 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 <[email protected]>
author:         Ricardo Martins <[email protected]>
srcversion:     D2C22B0A465DA63746EFB59
alias:          of:N*T*Cpps-gpio*
depends:        pps_core
intree:         Y
vermagic:       4.4.0-38-generic SMP mod_unload modversions 

Вы можете указать ядру, что контакт GPIO будет использоваться в качестве сигнала PPS, добавив что-то вроде этого в строку ядра в конфигурации GRUB:

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

person David Cullen    schedule 02.03.2017
comment
Из вашего ответа я делаю вывод, что мой код не нужен и что это полностью обрабатывается через файлы ОС и conf. Для чего используется ldattach? - person DeepDeadpool; 02.03.2017
comment
Я обновил свой ответ, указав, что ldattach может не понадобиться. - person David Cullen; 02.03.2017

Калибровочный сигнал с одним импульсом в секунду также потребует считывания входного контакта ровно через 1 секунду для калибровки. Опрос не будет выполняться, так как выполнение таймера может отличаться в зависимости от ОС при работе с высоким приоритетом.

Точно так же использование прерывания при изменении* для этого вывода, подключенного с помощью функции калибровки, также не будет предоставлять 1 PPS для выполнения метода калибровки из-за задержек обработки прерывания, например, при прерывании с более высоким приоритетом. имеет место.

person SACn    schedule 02.03.2017
comment
Это не совсем тот ответ, который я ищу. Мне нужен ответ, который подскажет, как сообщить NTP, чтобы он использовал определенный контакт в качестве своего pps при использовании моих функций. Мой вопрос сводился к тому, что у меня есть функция для чтения логического напряжения этого вывода, каков подход, чтобы сообщить ntpd использовать этот вывод в качестве его pps? - person DeepDeadpool; 02.03.2017

Если я правильно понял вопрос, вы используете что-то вроде Raspberry и хотите синхронизировать свою систему с другим контроллером, получая некоторую последовательность логических единиц, которая будет означать, например, time teac для вашей платы?
Единственное, что я делаю. не понимаю, зачем вам нужен демон ntp для этого. Не лучше ли создать статическую переменную time_t, которая будет увеличиваться при каждом получении Teac?
Если вы хотите позже синхронизировать некоторые внешние устройства, а плата действует как сервер времени - просто настраивайте системную дату каждый раз, когда разница между ваша статическая переменная и значение time(0) будут больше определенного значения.

person ETech    schedule 02.03.2017