Adds ifc_name() to libusrp2 and gr-usrp2
[debian/gnuradio] / usrp2 / host / lib / usrp2_impl.h
index 37109c9e37cad678f16b43f1325ae37bc14f5fc7..8928751b31f16610431dbdbd0059652478ef319f 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
  *
  * 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
@@ -27,6 +27,8 @@
 #include "ring.h"
 #include <string>
 
+#define MAX_SUBPKT_LEN 252
+
 namespace usrp2 {
   
   class eth_buffer;
@@ -36,18 +38,31 @@ namespace usrp2 {
   class pending_reply;
   class ring;
 
+  //! High-level d'board info
+  struct db_info {
+    int                dbid;
+    double     freq_min;               // Hz
+    double     freq_max;               // Hz
+    double     gain_min;               // dB
+    double     gain_max;               // dB
+    double     gain_step_size;         // dB
+
+    db_info() : dbid(-1), freq_min(0), freq_max(0),
+               gain_min(0), gain_max(0), gain_step_size(0) {}
+  };
+
   class usrp2::impl : private data_handler
   {
     static const size_t NRIDS = 256;
     static const size_t NCHANS = 32;
 
     eth_buffer    *d_eth_buf;
+    std::string    d_ifc_name;
     pktfilter     *d_pf;
     std::string    d_addr;       // FIXME: use u2_mac_addr_t instead
     usrp2_thread  *d_bg_thread;
     volatile bool  d_bg_running; // TODO: multistate if needed
     
-    int            d_rx_decim;
     int            d_rx_seqno;
     int            d_tx_seqno;
     int            d_next_rid;
@@ -65,6 +80,12 @@ namespace usrp2 {
 
     std::vector<ring_sptr>   d_channel_rings; // indexed by 5-bit channel number
 
+    db_info       d_tx_db_info;
+    db_info       d_rx_db_info;
+
+    int                   d_tx_interp;         // shadow tx interp 
+    int                   d_rx_decim;          // shadow rx decim
+
     void inc_enqueued() {
       omni_mutex_lock l(d_enqueued_mutex);
       d_num_enqueued++;
@@ -87,6 +108,8 @@ namespace usrp2 {
     virtual data_handler::result operator()(const void *base, size_t len);
     data_handler::result handle_control_packet(const void *base, size_t len);
     data_handler::result handle_data_packet(const void *base, size_t len);
+    bool dboard_info();
+    bool reset_db();
 
   public:
     impl(const std::string &ifc, props *p);
@@ -95,11 +118,20 @@ namespace usrp2 {
     void bg_loop();
 
     std::string mac_addr() const { return d_addr; } // FIXME: convert from u2_mac_addr_t
-    bool burn_mac_addr(const std::string &new_addr);
+    std::string ifc_name() const { return d_ifc_name; }
+
+    // Rx
 
     bool set_rx_gain(double gain);
+    double rx_gain_min() { return d_rx_db_info.gain_min; }
+    double rx_gain_max() { return d_rx_db_info.gain_max; }
+    double rx_gain_db_per_step() { return d_rx_db_info.gain_step_size; }
+    bool set_rx_lo_offset(double frequency);
     bool set_rx_center_freq(double frequency, tune_result *result);
+    double rx_freq_min() { return d_rx_db_info.freq_min; }
+    double rx_freq_max() { return d_rx_db_info.freq_max; }
     bool set_rx_decim(int decimation_factor);
+    int rx_decim() { return d_rx_decim; }
     bool set_rx_scale_iq(int scale_i, int scale_q);
     bool start_rx_streaming(unsigned int channel, unsigned int items_per_frame);
     bool rx_samples(unsigned int channel, rx_sample_handler *handler);
@@ -107,25 +139,52 @@ namespace usrp2 {
     unsigned int rx_overruns() const { return d_num_rx_overruns; }
     unsigned int rx_missing() const { return d_num_rx_missing; }
 
+    // Tx
+
     bool set_tx_gain(double gain);
+    double tx_gain_min() { return d_tx_db_info.gain_min; }
+    double tx_gain_max() { return d_tx_db_info.gain_max; }
+    double tx_gain_db_per_step() { return d_tx_db_info.gain_step_size; }
+    bool set_tx_lo_offset(double frequency);
     bool set_tx_center_freq(double frequency, tune_result *result);
+    double tx_freq_min() { return d_tx_db_info.freq_min; }
+    double tx_freq_max() { return d_tx_db_info.freq_max; }
     bool set_tx_interp(int interpolation_factor);
+    int tx_interp() { return d_tx_interp; }
+    void default_tx_scale_iq(int interpolation_factor, int *scale_i, int *scale_q);
     bool set_tx_scale_iq(int scale_i, int scale_q);
 
-    bool tx_complex_float(unsigned int channel,
-                         const std::complex<float> *samples,
-                         size_t nsamples,
-                         const tx_metadata *metadata);
+    bool tx_32fc(unsigned int channel,
+                const std::complex<float> *samples,
+                size_t nsamples,
+                const tx_metadata *metadata);
 
-    bool tx_complex_int16(unsigned int channel,
-                         const std::complex<int16_t> *samples,
-                         size_t nsamples,
-                         const tx_metadata *metadata);
+    bool tx_16sc(unsigned int channel,
+                const std::complex<int16_t> *samples,
+                size_t nsamples,
+                const tx_metadata *metadata);
 
     bool tx_raw(unsigned int channel,
                const uint32_t *items,
                size_t nitems,
                const tx_metadata *metadata);
+
+    // misc
+
+    bool config_mimo(int flags);
+    bool fpga_master_clock_freq(long *freq);
+    bool adc_rate(long *rate);
+    bool dac_rate(long *rate);
+    bool tx_daughterboard_id(int *dbid);
+    bool rx_daughterboard_id(int *dbid);
+
+    // low level
+
+    bool burn_mac_addr(const std::string &new_addr);
+    bool sync_to_pps();
+    bool sync_every_pps(bool enable);
+    std::vector<uint32_t> peek32(uint32_t addr, uint32_t words);
+    bool poke32(uint32_t addr, const std::vector<uint32_t> &data);
   };
   
 } // namespace usrp2