Recently the Linux kernel's PTP Hardware Clock interface was expanded to include a "write phase" mode where the clock servo in implemented in hardware. This mode hearkens back to the tradition ntp_adjtime interface, passing a measured offset into the kernel's servo. This patch adds a new configuration option and logic to support the write phase mode. Because the hardware's adjustment bandwidth may be limited, this mode is only activated when the servo reaches SERVO_LOCKED_STABLE state, in order to achieve reasonably fast locking times. Users may control the SERVO_LOCKED_STABLE state by configuring 'servo_offset_threshold' and 'servo_num_offset_values' accordingly. Example configuration file highlights: unicast_listen 1 logSyncInterval 0 logMinDelayReqInterval 0 first_step_threshold 0.001000000 step_threshold 0 clock_servo pi write_phase_mode 1 servo_offset_threshold 50 servo_num_offset_values 10 tsproc_mode raw Signed-off-by: Vincent Cheng <vincent.cheng.xh@renesas.com> Signed-off-by: Richard Cochran <richardcochran@gmail.com>
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**
 | 
						|
 * @file clockadj.h
 | 
						|
 * @brief Wraps clock_adjtime functionality.
 | 
						|
 * @note Copyright (C) 2013 Miroslav Lichvar <mlichvar@redhat.com>
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation; either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License along
 | 
						|
 * with this program; if not, write to the Free Software Foundation, Inc.,
 | 
						|
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
						|
 */
 | 
						|
#ifndef HAVE_CLOCKADJ_H
 | 
						|
#define HAVE_CLOCKADJ_H
 | 
						|
 | 
						|
#include <inttypes.h>
 | 
						|
#include <time.h>
 | 
						|
 | 
						|
/**
 | 
						|
 * Initialize state needed when adjusting or reading the clock.
 | 
						|
 * @param clkid A clock ID obtained using phc_open() or CLOCK_REALTIME.
 | 
						|
 */
 | 
						|
void clockadj_init(clockid_t clkid);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set clock's frequency offset.
 | 
						|
 * @param clkid A clock ID obtained using phc_open() or CLOCK_REALTIME.
 | 
						|
 * @param freq  The frequency offset in parts per billion (ppb).
 | 
						|
 */
 | 
						|
void clockadj_set_freq(clockid_t clkid, double freq);
 | 
						|
 | 
						|
/**
 | 
						|
 * Read clock's frequency offset.
 | 
						|
 * @param clkid A clock ID obtained using phc_open() or CLOCK_REALTIME.
 | 
						|
 * @return      The frequency offset in parts per billion (ppb).
 | 
						|
 */
 | 
						|
double clockadj_get_freq(clockid_t clkid);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set clock's phase offset.
 | 
						|
 * @param clkid  A clock ID obtained using phc_open() or CLOCK_REALTIME.
 | 
						|
 * @param offset The phase offset in nanoseconds.
 | 
						|
 */
 | 
						|
void clockadj_set_phase(clockid_t clkid, long offset);
 | 
						|
 | 
						|
/**
 | 
						|
 * Step clock's time.
 | 
						|
 * @param clkid A clock ID obtained using phc_open() or CLOCK_REALTIME.
 | 
						|
 * @param step  The time step in nanoseconds.
 | 
						|
 */
 | 
						|
void clockadj_step(clockid_t clkid, int64_t step);
 | 
						|
 | 
						|
/**
 | 
						|
 * Read maximum frequency adjustment of the target clock.
 | 
						|
 * @return The maximum frequency adjustment in parts per billion (ppb).
 | 
						|
 */
 | 
						|
int clockadj_max_freq(clockid_t clkid);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set the system clock to insert/delete leap second at midnight.
 | 
						|
 * @param leap  +1 to insert leap second, -1 to delete leap second,
 | 
						|
 *              0 to reset the leap state.
 | 
						|
 */
 | 
						|
void sysclk_set_leap(int leap);
 | 
						|
 | 
						|
/**
 | 
						|
 * Set the TAI offset of the system clock to have correct CLOCK_TAI.
 | 
						|
 * @param offset The TAI-UTC offset in seconds.
 | 
						|
 */
 | 
						|
void sysclk_set_tai_offset(int offset);
 | 
						|
 | 
						|
/**
 | 
						|
 * Read maximum frequency adjustment of the system clock (CLOCK_REALTIME).
 | 
						|
 * @return The maximum frequency adjustment in parts per billion (ppb).
 | 
						|
 */
 | 
						|
int sysclk_max_freq(void);
 | 
						|
 | 
						|
/**
 | 
						|
 * Mark the system clock as synchronized to let the kernel synchronize
 | 
						|
 * the real-time clock (RTC) to it.
 | 
						|
 */
 | 
						|
void sysclk_set_sync(void);
 | 
						|
#endif
 |