aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/b100/clock_ctrl.hpp
blob: 387892bf7230114bd449b32869e5d9502ee534e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// Copyright 2011 Ettus Research LLC
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
//

#ifndef INCLUDED_B100_CLOCK_CTRL_HPP
#define INCLUDED_B100_CLOCK_CTRL_HPP

#include <uhd/types/serial.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
#include <vector>

/*!
 * The usrp-e clock control:
 * - Setup system clocks.
 * - Disable/enable clock lines.
 */
class b100_clock_ctrl : boost::noncopyable{
public:
    typedef boost::shared_ptr<b100_clock_ctrl> sptr;

    /*!
     * Make a new clock control object.
     * \param iface the controller iface object
     * \param master_clock_rate the master FPGA/sample clock rate
     * \return the clock control object
     */
    static sptr make(uhd::i2c_iface::sptr iface, double master_clock_rate);

    /*!
     * Set the rate of the fpga clock line.
     * Throws if rate is not valid.
     * \param rate the new rate in Hz
     */
    virtual void set_fpga_clock_rate(double rate) = 0;

    /*!
     * Get the rate of the fpga clock line.
     * \return the fpga clock rate in Hz
     */
    virtual double get_fpga_clock_rate(void) = 0;

    /*!
     * Get the possible rates of the rx dboard clock.
     * \return a vector of clock rates in Hz
     */
    virtual std::vector<double> get_rx_dboard_clock_rates(void) = 0;

    /*!
     * Get the possible rates of the tx dboard clock.
     * \return a vector of clock rates in Hz
     */
    virtual std::vector<double> get_tx_dboard_clock_rates(void) = 0;

    /*!
     * Set the rx dboard clock rate to a possible rate.
     * \param rate the new clock rate in Hz
     * \throw exception when rate cannot be achieved
     */
    virtual void set_rx_dboard_clock_rate(double rate) = 0;

    /*!
     * Set the tx dboard clock rate to a possible rate.
     * \param rate the new clock rate in Hz
     * \throw exception when rate cannot be achieved
     */
    virtual void set_tx_dboard_clock_rate(double rate) = 0;

    /*!
     * Get the current rx dboard clock rate.
     * \return the clock rate in Hz
     */
    virtual double get_rx_clock_rate(void) = 0;

    /*!
     * Get the current tx dboard clock rate.
     * \return the clock rate in Hz
     */
    virtual double get_tx_clock_rate(void) = 0;
    
    /*!
     * Enable/disable the FPGA clock.
     * \param enb true to enable
     */
    
    virtual void enable_fpga_clock(bool enb) = 0;

    /*!
     * Enable/disable the rx dboard clock.
     * \param enb true to enable
     */
    virtual void enable_rx_dboard_clock(bool enb) = 0;

    /*!
     * Enable/disable the tx dboard clock.
     * \param enb true to enable
     */
    virtual void enable_tx_dboard_clock(bool enb) = 0;
    
    /*!
     * Use the internal TCXO reference
     */
    virtual void use_internal_ref(void) = 0;
    
    /*!
     * Use the external SMA reference
     */
    virtual void use_external_ref(void) = 0;
    
    /*!
     * Use external if available, internal otherwise
     */
    virtual void use_auto_ref(void) = 0;

    //! Is the reference locked?
    virtual bool get_locked(void) = 0;

};

#endif /* INCLUDED_B100_CLOCK_CTRL_HPP */