1e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer/* 2e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Copyright (C) 2015 The Android Open Source Project 3e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 4e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Licensed under the Apache License, Version 2.0 (the "License"); 5e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * you may not use this file except in compliance with the License. 6e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * You may obtain a copy of the License at 7e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 8e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * http://www.apache.org/licenses/LICENSE-2.0 9e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 10e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Unless required by applicable law or agreed to in writing, software 11e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * distributed under the License is distributed on an "AS IS" BASIS, 12e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * See the License for the specific language governing permissions and 14e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * limitations under the License. 15e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer */ 16e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 17e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#include <inttypes.h> 18e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 19e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#define CLOCK_BUFFER_LENGTH 512 20e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 21e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer// Commands, original definitions in TensyUSB side code. 22e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#define CMD_RESET 'F' // Reset all vars 23e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#define CMD_SYNC_SEND 'I' // Send some digits for clock sync 24e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#define CMD_SYNC_READOUT 'R' // Read out sync times 25e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer#define CMD_SYNC_ZERO 'Z' // Initial zero 26e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 27e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 28e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerstruct clock_connection { 29e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int fd; 30e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int endpoint_in; 31e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int endpoint_out; 32e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int64_t t_base; 33e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer char buffer[CLOCK_BUFFER_LENGTH]; 34e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int minE; 35e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer int maxE; 36e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer}; 37e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 38e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 39e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer// Returns microseconds elapsed since boot 40e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerint64_t uptimeMicros(); 41e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 42e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer// Returns microseconds elapsed since last clock sync 43e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerint micros(struct clock_connection *clk); 44e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 45e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer// Runs clock synchronization logic 46e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmervoid sync_clocks(struct clock_connection *clk); 47e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 48e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer// Run the sync logic without changing clocks, used for estimating clock drift 49e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmervoid update_bounds(struct clock_connection *clk); 50e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 51