3 * Copyright 2008,2009,2010 Free Software Foundation, Inc.
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef INCLUDED_USRP2_IMPL_H
20 #define INCLUDED_USRP2_IMPL_H
22 #include <usrp2/usrp2.h>
23 #include <usrp2/data_handler.h>
24 #include <usrp2_eth_packet.h>
25 #include <gruel/thread.h>
26 #include <boost/scoped_ptr.hpp>
31 #define MAX_SUBPKT_LEN 252
38 class usrp2_tune_result;
42 //! High-level d'board info
45 double freq_min; // Hz
46 double freq_max; // Hz
47 double gain_min; // dB
48 double gain_max; // dB
49 double gain_step_size; // dB
51 db_info() : dbid(-1), freq_min(0), freq_max(0),
52 gain_min(0), gain_max(0), gain_step_size(0) {}
55 class usrp2::impl : private data_handler
57 static const size_t NRIDS = 256;
58 static const size_t NCHANS = 32;
60 eth_buffer *d_eth_buf;
61 std::string d_interface_name;
63 std::string d_addr; // FIXME: use u2_mac_addr_t instead
65 boost::thread_group d_rx_tg;
66 volatile bool d_bg_running; // TODO: multistate if needed
71 unsigned int d_num_rx_frames;
72 unsigned int d_num_rx_missing;
73 unsigned int d_num_rx_overruns;
74 unsigned int d_num_rx_bytes;
76 unsigned int d_num_enqueued;
77 gruel::mutex d_enqueued_mutex;
78 gruel::condition_variable d_bg_pending_cond;
80 // all pending_replies are stack allocated, thus no possibility of leaking these
81 pending_reply *d_pending_replies[NRIDS]; // indexed by 8-bit reply id
83 std::vector<ring_sptr> d_channel_rings; // indexed by 5-bit channel number
84 gruel::mutex d_channel_rings_mutex;
89 int d_tx_interp; // shadow tx interp
90 int d_rx_decim; // shadow rx decim
95 gruel::scoped_lock l(d_enqueued_mutex);
100 gruel::scoped_lock l(d_enqueued_mutex);
101 if (--d_num_enqueued == 0)
102 d_bg_pending_cond.notify_one();
105 static bool parse_mac_addr(const std::string &s, u2_mac_addr_t *p);
106 void init_et_hdrs(u2_eth_packet_t *p, const std::string &dst);
107 void init_etf_hdrs(u2_eth_packet_t *p, const std::string &dst,
108 int word0_flags, int chan, uint32_t timestamp);
111 void init_config_rx_v2_cmd(op_config_rx_v2_cmd *cmd);
112 void init_config_tx_v2_cmd(op_config_tx_v2_cmd *cmd);
113 bool transmit_cmd_and_wait(void *cmd, size_t len, pending_reply *p, double secs=0.0);
114 bool transmit_cmd(void *cmd, size_t len);
115 virtual data_handler::result operator()(const void *base, size_t len);
116 data_handler::result handle_control_packet(const void *base, size_t len);
117 data_handler::result handle_data_packet(const void *base, size_t len);
122 impl(const std::string &ifc, props *p, size_t rx_bufsize);
125 std::string mac_addr() const { return d_addr; } // FIXME: convert from u2_mac_addr_t
126 std::string interface_name() const { return d_interface_name; }
130 bool set_rx_antenna(int ant);
131 bool set_rx_gain(double gain);
132 double rx_gain_min() { return d_rx_db_info.gain_min; }
133 double rx_gain_max() { return d_rx_db_info.gain_max; }
134 double rx_gain_db_per_step() { return d_rx_db_info.gain_step_size; }
135 bool set_rx_lo_offset(double frequency);
136 bool set_rx_center_freq(double frequency, tune_result *result);
137 double rx_freq_min() { return d_rx_db_info.freq_min; }
138 double rx_freq_max() { return d_rx_db_info.freq_max; }
139 bool set_rx_decim(int decimation_factor);
140 int rx_decim() { return d_rx_decim; }
141 bool set_rx_scale_iq(int scale_i, int scale_q);
142 bool set_gpio_ddr(int bank, uint16_t value, uint16_t mask);
143 bool set_gpio_sels(int bank, std::string src);
144 bool enable_gpio_streaming(int bank, int enable);
145 bool write_gpio(int bank, uint16_t value, uint16_t mask);
146 bool read_gpio(int bank, uint16_t *value);
147 bool start_rx_streaming(unsigned int channel, unsigned int items_per_frame);
148 bool start_rx_streaming_at(unsigned int channel, unsigned int items_per_frame, unsigned int time);
149 bool sync_and_start_rx_streaming_at(unsigned int channel, unsigned int items_per_frame, unsigned int time);
150 bool rx_samples(unsigned int channel, rx_sample_handler *handler);
151 bool flush_rx_samples(unsigned int channel);
152 bool stop_rx_streaming(unsigned int channel);
153 unsigned int rx_overruns() const { return d_num_rx_overruns; }
154 unsigned int rx_missing() const { return d_num_rx_missing; }
158 bool set_tx_antenna(int ant);
159 bool set_tx_gain(double gain);
160 double tx_gain_min() { return d_tx_db_info.gain_min; }
161 double tx_gain_max() { return d_tx_db_info.gain_max; }
162 double tx_gain_db_per_step() { return d_tx_db_info.gain_step_size; }
163 bool set_tx_lo_offset(double frequency);
164 bool set_tx_center_freq(double frequency, tune_result *result);
165 double tx_freq_min() { return d_tx_db_info.freq_min; }
166 double tx_freq_max() { return d_tx_db_info.freq_max; }
167 bool set_tx_interp(int interpolation_factor);
168 int tx_interp() { return d_tx_interp; }
169 void default_tx_scale_iq(int interpolation_factor, int *scale_i, int *scale_q);
170 bool set_tx_scale_iq(int scale_i, int scale_q);
172 bool tx_32fc(unsigned int channel,
173 const std::complex<float> *samples,
175 const tx_metadata *metadata);
177 bool tx_16sc(unsigned int channel,
178 const std::complex<int16_t> *samples,
180 const tx_metadata *metadata);
182 bool tx_raw(unsigned int channel,
183 const uint32_t *items,
185 const tx_metadata *metadata);
189 bool config_mimo(int flags);
190 bool fpga_master_clock_freq(long *freq);
191 bool adc_rate(long *rate);
192 bool dac_rate(long *rate);
193 bool tx_daughterboard_id(int *dbid);
194 bool rx_daughterboard_id(int *dbid);
198 bool burn_mac_addr(const std::string &new_addr);
200 bool sync_every_pps(bool enable);
201 std::vector<uint32_t> peek32(uint32_t addr, uint32_t words);
202 bool poke32(uint32_t addr, const std::vector<uint32_t> &data);
204 // Receive thread, need to be public for boost::bind
210 #endif /* INCLUDED_USRP2_IMPL_H */