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