]> git.gag.com Git - debian/gnuradio/commitdiff
Merged r10383:10390 from jcorgan/u2-wip into trunk.
authorjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Wed, 4 Feb 2009 23:06:02 +0000 (23:06 +0000)
committerjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Wed, 4 Feb 2009 23:06:02 +0000 (23:06 +0000)
* Implements daughterboard independent LO offset tuning

* Removes RFX specific LO offset code

* Adds 'set_lo_offset' to libusrp2 and Python API

* Adds --lo-offset to usrp2_fft.py and usrp2_rx_cfile.py

* Ensures daughterboards are reset to default values at
  startup.

Trunk passes distcheck.

git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10392 221aa14e-8319-0410-a670-987f0aec2ac5

22 files changed:
gr-usrp2/src/usrp2.i
gr-usrp2/src/usrp2_sink_base.cc
gr-usrp2/src/usrp2_sink_base.h
gr-usrp2/src/usrp2_source_base.cc
gr-usrp2/src/usrp2_source_base.h
gr-utils/src/python/usrp2_rx_cfile.py
gr-utils/src/python/usrp2_siggen.py
usrp2/firmware/apps/app_common_v2.c
usrp2/firmware/include/usrp2_eth_packet.h
usrp2/firmware/lib/db.h
usrp2/firmware/lib/db_base.h
usrp2/firmware/lib/db_basic.c
usrp2/firmware/lib/db_dbsrx.c [changed mode: 0755->0644]
usrp2/firmware/lib/db_init.c
usrp2/firmware/lib/db_rfx.c
usrp2/firmware/lib/db_tvrx.c
usrp2/firmware/lib/db_xcvr2450.c
usrp2/host/include/usrp2/usrp2.h
usrp2/host/lib/control.h
usrp2/host/lib/usrp2.cc
usrp2/host/lib/usrp2_impl.cc
usrp2/host/lib/usrp2_impl.h

index c979750a825fff8929caa0dd615452ad33332514..c9a4af590d97d4f0696b0d71da53f9e5dd12ed56 100644 (file)
@@ -67,6 +67,7 @@ public:
 
   bool set_gain(double gain);
   %rename(_real_set_center_freq) set_center_freq;
 
   bool set_gain(double gain);
   %rename(_real_set_center_freq) set_center_freq;
+  bool set_lo_offset(double frequency);
   bool set_center_freq(double frequency, usrp2::tune_result *r);
   bool set_decim(int decimation_factor);
   bool set_scale_iq(int scale_i, int scale_q);
   bool set_center_freq(double frequency, usrp2::tune_result *r);
   bool set_decim(int decimation_factor);
   bool set_scale_iq(int scale_i, int scale_q);
@@ -132,6 +133,7 @@ public:
 
   bool set_gain(double gain);
   %rename(_real_set_center_freq) set_center_freq;
 
   bool set_gain(double gain);
   %rename(_real_set_center_freq) set_center_freq;
+  bool set_lo_offset(double frequency);
   bool set_center_freq(double frequency, usrp2::tune_result *r);
   bool set_interp(int interp_factor);
   bool set_scale_iq(int scale_i, int scale_q);
   bool set_center_freq(double frequency, usrp2::tune_result *r);
   bool set_interp(int interp_factor);
   bool set_scale_iq(int scale_i, int scale_q);
index 579aaaa4c58e6613f5d087158fe81801040a0306..8118407c575fb886f1172370a57a973a26d3d327 100644 (file)
@@ -52,6 +52,12 @@ usrp2_sink_base::set_gain(double gain)
   return d_u2->set_tx_gain(gain);
 }
 
   return d_u2->set_tx_gain(gain);
 }
 
+bool
+usrp2_sink_base::set_lo_offset(double frequency)
+{
+  return d_u2->set_tx_lo_offset(frequency);
+}
+
 bool
 usrp2_sink_base::set_center_freq(double frequency, usrp2::tune_result *tr)
 {
 bool
 usrp2_sink_base::set_center_freq(double frequency, usrp2::tune_result *tr)
 {
index fad965623a6d81fb7f7d264e8171cb38fc19c676..37905f4e858656e6e54f7e349ac38cdf0c467705 100644 (file)
@@ -45,6 +45,11 @@ public:
    */
   bool set_gain(double gain);
 
    */
   bool set_gain(double gain);
 
+  /*!
+   * \brief Set transmitter LO offset frequency
+   */
+  bool set_lo_offset(double frequency);
+
   /*!
    * \brief Set transmitter center frequency
    */
   /*!
    * \brief Set transmitter center frequency
    */
index 1ed4d55d7e9956d83bd29d38d5d67956c8c792d3..8bcac5d697c8e8bbd06b31c75b17ec099e551713 100644 (file)
@@ -52,6 +52,12 @@ usrp2_source_base::set_gain(double gain)
   return d_u2->set_rx_gain(gain);
 }
 
   return d_u2->set_rx_gain(gain);
 }
 
+bool
+usrp2_source_base::set_lo_offset(double frequency)
+{
+  return d_u2->set_rx_lo_offset(frequency);
+}
+
 bool
 usrp2_source_base::set_center_freq(double frequency, usrp2::tune_result *tr)
 {
 bool
 usrp2_source_base::set_center_freq(double frequency, usrp2::tune_result *tr)
 {
index 998a022dadc034a786b60f5fcdec0c157737ce8c..f98d329fde7836c874417fb996a2969c57016384 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- c++ -*- */
 /*
- * Copyright 2008 Free Software Foundation, Inc.
+ * Copyright 2008,2009 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
  * 
  * This file is part of GNU Radio
  * 
@@ -45,6 +45,11 @@ public:
    */
   bool set_gain(double gain);
 
    */
   bool set_gain(double gain);
 
+  /*!
+   * \brief Set receive LO offset frequency
+   */
+  bool set_lo_offset(double frequency);
+
   /*!
    * \brief Set receiver center frequency
    */
   /*!
    * \brief Set receiver center frequency
    */
index f8f1de69b5c694f89bddeb28e730cbe191d8408a..1f23eee4e2705b0e84d590c1f76d6eeef392f330 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #
 #!/usr/bin/env python
 #
-# Copyright 2004,2005,2007,2008 Free Software Foundation, Inc.
+# Copyright 2004,2005,2007,2008,2009 Free Software Foundation, Inc.
 # 
 # This file is part of GNU Radio
 # 
 # 
 # This file is part of GNU Radio
 # 
@@ -58,6 +58,9 @@ class rx_cfile_block(gr.top_block):
         self._u.set_gain(options.gain)
 
         # Set receive frequency
         self._u.set_gain(options.gain)
 
         # Set receive frequency
+        if options.lo_offset is not None:
+            self._u.set_lo_offset(options.lo_offset)
+
         tr = self._u.set_center_freq(options.freq)
         if tr == None:
             sys.stderr.write('Failed to set center frequency\n')
         tr = self._u.set_center_freq(options.freq)
         if tr == None:
             sys.stderr.write('Failed to set center frequency\n')
@@ -115,6 +118,9 @@ def get_options():
                       help="number of samples to collect [default=+inf]")
     parser.add_option("-v", "--verbose", action="store_true", default=False,
                       help="verbose output")
                       help="number of samples to collect [default=+inf]")
     parser.add_option("-v", "--verbose", action="store_true", default=False,
                       help="verbose output")
+    parser.add_option("", "--lo-offset", type="eng_float", default=None,
+                      help="set daughterboard LO offset to OFFSET [default=hw default]")
+
     (options, args) = parser.parse_args ()
     if len(args) != 1:
         parser.print_help()
     (options, args) = parser.parse_args ()
     if len(args) != 1:
         parser.print_help()
index 9929112ef5833caeaaf22d1e8f9cab6d1f0e9404..9cea2eff1e1d90c0e21f2f866f664d565277e180 100755 (executable)
@@ -44,6 +44,10 @@ class siggen_top_block(gr.top_block):
         self._u.set_gain(options.gain)
 
         # Tune the USRP2 FPGA and daughterboard to the requested center frequency
         self._u.set_gain(options.gain)
 
         # Tune the USRP2 FPGA and daughterboard to the requested center frequency
+        # and LO offset
+        if options.lo_offset is not None:
+            self._u.set_lo_offset(options.lo_offset)
+
         tr = self._u.set_center_freq(options.tx_freq)
         if tr == None:
             sys.stderr.write('Failed to set center frequency\n')
         tr = self._u.set_center_freq(options.tx_freq)
         if tr == None:
             sys.stderr.write('Failed to set center frequency\n')
@@ -143,6 +147,8 @@ def get_options():
                       help="set waveform amplitude to AMPLITUDE (0-1.0) [default=%default]", metavar="AMPL")
     parser.add_option("--offset", type="eng_float", default=0,
                       help="set waveform offset to OFFSET [default=%default]")
                       help="set waveform amplitude to AMPLITUDE (0-1.0) [default=%default]", metavar="AMPL")
     parser.add_option("--offset", type="eng_float", default=0,
                       help="set waveform offset to OFFSET [default=%default]")
+    parser.add_option("--lo-offset", type="eng_float", default=None,
+                      help="set daughterboard LO offset to OFFSET [default=hw default]")
     parser.add_option("--sine", dest="type", action="store_const", const=gr.GR_SIN_WAVE,
                       help="generate a complex sinusoid [default]", default=gr.GR_SIN_WAVE)
     parser.add_option("--const", dest="type", action="store_const", const=gr.GR_CONST_WAVE, 
     parser.add_option("--sine", dest="type", action="store_const", const=gr.GR_SIN_WAVE,
                       help="generate a complex sinusoid [default]", default=gr.GR_SIN_WAVE)
     parser.add_option("--const", dest="type", action="store_const", const=gr.GR_CONST_WAVE, 
index 9f5fd94f1764b3688efd260c6d21a5e2388f30a7..c277d12f024fc493618c51086e165d04ed62719c 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- c++ -*- */
 /*
- * Copyright 2007,2008 Free Software Foundation, Inc.
+ * Copyright 2007,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
  *
  * 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
@@ -369,6 +369,16 @@ poke_cmd(const op_poke_t *p)
   return true;
 }
 
   return true;
 }
 
+static bool
+set_lo_offset_cmd(const op_freq_t *p)
+{
+  u2_fxpt_freq_t f = u2_fxpt_freq_from_hilo(p->freq_hi, p->freq_lo);
+  if (p->opcode == OP_SET_TX_LO_OFFSET)
+    return db_set_lo_offset(tx_dboard, f);
+  else
+    return db_set_lo_offset(rx_dboard, f);
+}
+
 static size_t
 generic_reply(const op_generic_t *p,
              void *reply_payload, size_t reply_payload_space,
 static size_t
 generic_reply(const op_generic_t *p,
              void *reply_payload, size_t reply_payload_space,
@@ -377,12 +387,12 @@ generic_reply(const op_generic_t *p,
   op_generic_t *r = (op_generic_t *) reply_payload;
   if (reply_payload_space < sizeof(*r))                
     return 0;                                  // no room
   op_generic_t *r = (op_generic_t *) reply_payload;
   if (reply_payload_space < sizeof(*r))                
     return 0;                                  // no room
-
+  
   r->opcode = p->opcode | OP_REPLY_BIT;
   r->len = sizeof(*r);
   r->rid = p->rid;
   r->ok = ok;
   r->opcode = p->opcode | OP_REPLY_BIT;
   r->len = sizeof(*r);
   r->rid = p->rid;
   r->ok = ok;
-
+  
   return r->len;
 }
 
   return r->len;
 }
 
@@ -392,12 +402,12 @@ add_eop(void *reply_payload, size_t reply_payload_space)
   op_generic_t *r = (op_generic_t *) reply_payload;
   if (reply_payload_space < sizeof(*r))                
     return 0;                                  // no room
   op_generic_t *r = (op_generic_t *) reply_payload;
   if (reply_payload_space < sizeof(*r))                
     return 0;                                  // no room
-
+  
   r->opcode = OP_EOP;
   r->len = sizeof(*r);
   r->rid = 0;
   r->ok =  0;
   r->opcode = OP_EOP;
   r->len = sizeof(*r);
   r->rid = 0;
   r->ok =  0;
-
+  
   return r->len;
 }
 
   return r->len;
 }
 
@@ -407,15 +417,15 @@ handle_control_chan_frame(u2_eth_packet_t *pkt, size_t len)
   unsigned char reply[sizeof(u2_eth_packet_t) + 4 * sizeof(u2_subpkt_t)] _AL4;
   unsigned char *reply_payload = &reply[sizeof(u2_eth_packet_t)];
   int reply_payload_space = sizeof(reply) - sizeof(u2_eth_packet_t);
   unsigned char reply[sizeof(u2_eth_packet_t) + 4 * sizeof(u2_subpkt_t)] _AL4;
   unsigned char *reply_payload = &reply[sizeof(u2_eth_packet_t)];
   int reply_payload_space = sizeof(reply) - sizeof(u2_eth_packet_t);
-
+  
   // initialize reply
   memset(reply, 0, sizeof(reply));
   set_reply_hdr((u2_eth_packet_t *) reply, pkt);
   // initialize reply
   memset(reply, 0, sizeof(reply));
   set_reply_hdr((u2_eth_packet_t *) reply, pkt);
-
+  
   // point to beginning of payload (subpackets)
   unsigned char *payload = ((unsigned char *) pkt) + sizeof(u2_eth_packet_t);
   int payload_len = len - sizeof(u2_eth_packet_t);
   // point to beginning of payload (subpackets)
   unsigned char *payload = ((unsigned char *) pkt) + sizeof(u2_eth_packet_t);
   int payload_len = len - sizeof(u2_eth_packet_t);
-
+  
   size_t subpktlen = 0;
 
   while (payload_len >= sizeof(op_generic_t)){
   size_t subpktlen = 0;
 
   while (payload_len >= sizeof(op_generic_t)){
@@ -484,6 +494,17 @@ handle_control_chan_frame(u2_eth_packet_t *pkt, size_t len)
                                poke_cmd((op_poke_t *)payload));
       break;
 
                                poke_cmd((op_poke_t *)payload));
       break;
 
+    case OP_SET_TX_LO_OFFSET:
+    case OP_SET_RX_LO_OFFSET:
+      subpktlen = generic_reply(gp, reply_payload, reply_payload_space,
+                               set_lo_offset_cmd((op_freq_t *)payload));
+      break;
+
+    case OP_RESET_DB:
+      db_init();
+      subpktlen = generic_reply(gp, reply_payload, reply_payload_space, true);
+      break;
+
     default:
       printf("app_common_v2: unhandled opcode = %d\n", gp->opcode);
       break;
     default:
       printf("app_common_v2: unhandled opcode = %d\n", gp->opcode);
       break;
index e212fab833eb6724f9720c5328fff8bd4324c50d..77de02dbba731177786f7fa9f2c746cf09a783c7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- c++ -*- */
 /*
- * Copyright 2007,2008 Free Software Foundation, Inc.
+ * Copyright 2007,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
  *
  * 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
@@ -189,6 +189,12 @@ typedef struct {
 #define OP_PEEK_REPLY                (OP_PEEK | OP_REPLY_BIT)
 #define OP_POKE                      12
 #define OP_POKE_REPLY                (OP_POKE | OP_REPLY_BIT)
 #define OP_PEEK_REPLY                (OP_PEEK | OP_REPLY_BIT)
 #define OP_POKE                      12
 #define OP_POKE_REPLY                (OP_POKE | OP_REPLY_BIT)
+#define OP_SET_TX_LO_OFFSET          13
+#define OP_SET_TX_LO_OFFSET_REPLY    (OP_SET_TX_LO_OFFSET | OP_REPLY_BIT)
+#define OP_SET_RX_LO_OFFSET          14
+#define OP_SET_RX_LO_OFFSET_REPLY    (OP_SET_RX_LO_OFFSET | OP_REPLY_BIT)
+#define OP_RESET_DB                  15
+#define OP_RESET_DB_REPLY            (OP_RESET_DB | OP_REPLY_BIT)
 
 /*
  * All subpackets are a multiple of 4 bytes long.
 
 /*
  * All subpackets are a multiple of 4 bytes long.
@@ -402,6 +408,19 @@ typedef struct {
   // Words follow here
 } _AL4 op_poke_t;
 
   // Words follow here
 } _AL4 op_poke_t;
 
+/* 
+ * Common structure for commands with a single frequency param 
+ * (e.g., set_*_lo_offset, set_*_bw)
+ */
+typedef struct {
+  uint8_t       opcode;
+  uint8_t      len;
+  uint8_t      rid;
+  uint8_t      mbz;
+  uint32_t     freq_hi;        //< high 32-bits of 64-bit fxpt_freq (Q44.20)
+  uint32_t     freq_lo;        //< low  32-bits of 64-bit fxpt_freq (Q44.20)
+} _AL4 op_freq_t;
+
 /*
  * ================================================================
  *             union of all of subpacket types
 /*
  * ================================================================
  *             union of all of subpacket types
@@ -421,6 +440,7 @@ typedef union {
   op_config_mimo_t             op_config_mimo;
   op_peek_t                     op_peek;
   op_poke_t                     op_poke;
   op_config_mimo_t             op_config_mimo;
   op_peek_t                     op_peek;
   op_poke_t                     op_poke;
+  op_freq_t                     op_freq;
 
 } u2_subpkt_t;
 
 
 } u2_subpkt_t;
 
index 5828fb00d7d67e0597ee921d644f55f96723b0dd..cec960267d2f072354199fc113249c27a3efd029 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -59,6 +59,16 @@ struct tune_result
 void 
 db_init(void);
 
 void 
 db_init(void);
 
+/*!
+ * \brief Set daughterboard LO offset frequency.
+ *
+ * \param[in] db is the daughterboard instance
+ * \param[in] offset is the amount to add to tuning requests
+ * \param[out] success or failure
+ */
+bool
+db_set_lo_offset(struct db_base *db, u2_fxpt_freq_t offset);
+
 /*!
  * \brief Two stage tuning.  Given target_freq, tune LO and DDC/DUC
  *
 /*!
  * \brief Two stage tuning.  Given target_freq, tune LO and DDC/DUC
  *
index 9b5ce051f044a00eaf5e80ca93fa3e1a84788d8a..2ccfbf50985f1c61828edce431d7e3d7c1ae0a42 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -43,7 +43,8 @@ struct db_base {
   u2_fxpt_gain_t       gain_max;       //< max gain that can be set (dB)
   u2_fxpt_gain_t       gain_step_size; //< (dB)
 
   u2_fxpt_gain_t       gain_max;       //< max gain that can be set (dB)
   u2_fxpt_gain_t       gain_step_size; //< (dB)
 
-  // u2_fxpt_freq_t    lo_offset;
+  u2_fxpt_freq_t       default_lo_offset;  //< offset to add to tune frequency, reset value
+  u2_fxpt_freq_t        current_lo_offset;  //< current value of lo_offset
 
   /*
    * Auto T/R control values
 
   /*
    * Auto T/R control values
index 0f1ad6504447e2bf415d7ae37a2dacba7511c4df..2bd4ebfbe492d6cf6eceb6750d8929936d3060fe 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -42,7 +42,7 @@ struct db_basic db_basic_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
@@ -68,7 +68,7 @@ struct db_basic db_basic_rx = {
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
@@ -94,7 +94,7 @@ struct db_basic db_lf_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
@@ -120,7 +120,7 @@ struct db_basic db_lf_rx = {
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
   .base.atr_mask =     0,
   .base.atr_txval =    0,
   .base.atr_rxval =    0,
old mode 100755 (executable)
new mode 100644 (file)
index 31b0272..6e261cc
@@ -80,7 +80,7 @@ struct db_dbsrx db_dbsrx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = db_dbsrx_init,
   .base.set_freq = db_dbsrx_set_freq,
   .base.set_gain = db_dbsrx_set_gain,
   .base.init = db_dbsrx_init,
   .base.set_freq = db_dbsrx_set_freq,
   .base.set_gain = db_dbsrx_set_gain,
index 121bfbd9f0a37a18cbed29c432fb1a17bee157f2..0aef75e57e2560f5820efea24f97b6e98f6bb1e7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -270,6 +270,7 @@ db_init(void)
   //m = determine_tx_mux_value(tx_dboard);
   //dsp_tx_regs->tx_mux = m;
   //printf("tx_mux = 0x%x\n", m);
   //m = determine_tx_mux_value(tx_dboard);
   //dsp_tx_regs->tx_mux = m;
   //printf("tx_mux = 0x%x\n", m);
+  tx_dboard->current_lo_offset = tx_dboard->default_lo_offset;
 
   rx_dboard = lookup_dboard(I2C_ADDR_RX_A, &db_basic_rx, "Rx");
   //printf("db_init: rx dbid = 0x%x\n", rx_dboard->dbid);
 
   rx_dboard = lookup_dboard(I2C_ADDR_RX_A, &db_basic_rx, "Rx");
   //printf("db_init: rx dbid = 0x%x\n", rx_dboard->dbid);
@@ -278,6 +279,7 @@ db_init(void)
   m = determine_rx_mux_value(rx_dboard);
   dsp_rx_regs->rx_mux = m;
   //printf("rx_mux = 0x%x\n", m);
   m = determine_rx_mux_value(rx_dboard);
   dsp_rx_regs->rx_mux = m;
   //printf("rx_mux = 0x%x\n", m);
+  rx_dboard->current_lo_offset = rx_dboard->default_lo_offset;
 }
 
 /*!
 }
 
 /*!
@@ -330,6 +332,12 @@ calc_dxc_freq(u2_fxpt_freq_t target_freq, u2_fxpt_freq_t baseband_freq,
   }
 }
 
   }
 }
 
+bool
+db_set_lo_offset(struct db_base *db, u2_fxpt_freq_t offset)
+{
+  db->current_lo_offset = offset;
+  return true;
+}
 
 bool
 db_tune(struct db_base *db, u2_fxpt_freq_t target_freq, struct tune_result *result)
 
 bool
 db_tune(struct db_base *db, u2_fxpt_freq_t target_freq, struct tune_result *result)
@@ -339,8 +347,8 @@ db_tune(struct db_base *db, u2_fxpt_freq_t target_freq, struct tune_result *resu
   u2_fxpt_freq_t dxc_freq;
   u2_fxpt_freq_t actual_dxc_freq;
 
   u2_fxpt_freq_t dxc_freq;
   u2_fxpt_freq_t actual_dxc_freq;
 
-  // Ask the d'board to tune as closely as it can to target_freq
-  bool ok = db->set_freq(db, target_freq, &result->baseband_freq);
+  // Ask the d'board to tune as closely as it can to target_freq+lo_offset
+  bool ok = db->set_freq(db, target_freq+db->current_lo_offset, &result->baseband_freq);
 
   // Calculate the DDC setting that will downconvert the baseband from the
   // daughterboard to our target frequency.
 
   // Calculate the DDC setting that will downconvert the baseband from the
   // daughterboard to our target frequency.
index 0d5c89a813d3791c02013166d4917d9ce73e466d..3efb9f66435888079c396196dd9becbde12ac272 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * 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
  *
  * 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
@@ -73,7 +73,6 @@ struct db_rfx_common {
   unsigned char CP2;
   int freq_mult;
   int spi_mask;  
   unsigned char CP2;
   int freq_mult;
   int spi_mask;  
-  u2_fxpt_freq_t freq_offset;
 };
 
 struct db_rfx_dummy {
 };
 
 struct db_rfx_dummy {
@@ -149,7 +148,7 @@ struct db_rfx_400_rx db_rfx_400_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
@@ -163,8 +162,7 @@ struct db_rfx_400_rx db_rfx_400_rx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(0)
+  .common.freq_mult = 2
 };
 
 
 };
 
 
@@ -181,7 +179,7 @@ struct db_rfx_400_tx db_rfx_400_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6),
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
@@ -195,8 +193,7 @@ struct db_rfx_400_tx db_rfx_400_tx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6)
+  .common.freq_mult = 2
 };
 
 struct db_rfx_900_rx db_rfx_900_rx = {
 };
 
 struct db_rfx_900_rx db_rfx_900_rx = {
@@ -212,7 +209,7 @@ struct db_rfx_900_rx db_rfx_900_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
@@ -226,8 +223,7 @@ struct db_rfx_900_rx db_rfx_900_rx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(0)
+  .common.freq_mult = 2
 };
 
 
 };
 
 
@@ -244,7 +240,7 @@ struct db_rfx_900_tx db_rfx_900_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6),
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
@@ -258,8 +254,7 @@ struct db_rfx_900_tx db_rfx_900_tx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6)
+  .common.freq_mult = 2
 };
 
 struct db_rfx_1200_rx db_rfx_1200_rx = {
 };
 
 struct db_rfx_1200_rx db_rfx_1200_rx = {
@@ -275,7 +270,7 @@ struct db_rfx_1200_rx db_rfx_1200_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
@@ -289,8 +284,7 @@ struct db_rfx_1200_rx db_rfx_1200_rx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(0)
+  .common.freq_mult = 2
 };
 
 
 };
 
 
@@ -307,7 +301,7 @@ struct db_rfx_1200_tx db_rfx_1200_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6),
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
@@ -321,8 +315,7 @@ struct db_rfx_1200_tx db_rfx_1200_tx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
-  .common.freq_mult = 2,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6)
+  .common.freq_mult = 2
 };
 
 struct db_rfx_1800_rx db_rfx_1800_rx = {
 };
 
 struct db_rfx_1800_rx db_rfx_1800_rx = {
@@ -338,7 +331,7 @@ struct db_rfx_1800_rx db_rfx_1800_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
@@ -352,8 +345,7 @@ struct db_rfx_1800_rx db_rfx_1800_rx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
-  .common.freq_mult = 1,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(0)
+  .common.freq_mult = 1
 };
 
 
 };
 
 
@@ -370,7 +362,7 @@ struct db_rfx_1800_tx db_rfx_1800_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6),
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
@@ -384,8 +376,7 @@ struct db_rfx_1800_tx db_rfx_1800_tx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
-  .common.freq_mult = 1,  
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6)
+  .common.freq_mult = 1  
 };
 
 
 };
 
 
@@ -402,7 +393,7 @@ struct db_rfx_2400_rx db_rfx_2400_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
   .base.init = rfx_init_rx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_rx,
@@ -416,8 +407,7 @@ struct db_rfx_2400_rx db_rfx_2400_rx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_RX_DB,
-  .common.freq_mult = 1,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(0)
+  .common.freq_mult = 1
 };
 
 
 };
 
 
@@ -434,7 +424,7 @@ struct db_rfx_2400_tx db_rfx_2400_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6),
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
   .base.init = rfx_init_tx,
   .base.set_freq = rfx_set_freq,
   .base.set_gain = rfx_set_gain_tx,
@@ -448,8 +438,7 @@ struct db_rfx_2400_tx db_rfx_2400_tx = {
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
   .common.CP1 = 7,
   .common.CP2 = 7,
   .common.spi_mask = SPI_SS_TX_DB,
-  .common.freq_mult = 1,
-  .common.freq_offset = U2_DOUBLE_TO_FXPT_FREQ(12.5e6)
+  .common.freq_mult = 1
 };
 
 
 };
 
 
@@ -488,7 +477,7 @@ rfx_set_freq(struct db_base *dbb, u2_fxpt_freq_t freq, u2_fxpt_freq_t *dc)
 
   *dc = 0;
   struct db_rfx_dummy *db = (struct db_rfx_dummy *) dbb;
 
   *dc = 0;
   struct db_rfx_dummy *db = (struct db_rfx_dummy *) dbb;
-  u2_fxpt_freq_t desired_n = (U2_DOUBLE_TO_FXPT_FREQ(1.0)*db->common.freq_mult*(freq+db->common.freq_offset))/phdet_freq;
+  u2_fxpt_freq_t desired_n = (U2_DOUBLE_TO_FXPT_FREQ(1.0)*db->common.freq_mult*freq)/phdet_freq;
   int N_DIV = u2_fxpt_freq_round_to_int(desired_n);
   int B = N_DIV/PRESCALER;
   int A = N_DIV - PRESCALER*B;
   int N_DIV = u2_fxpt_freq_round_to_int(desired_n);
   int B = N_DIV/PRESCALER;
   int A = N_DIV - PRESCALER*B;
index 9e600bf885e83b7e870af546d7c0b2ef21f3b066..435fe7dad3e57e8ba52e9e76d480c571c51685d7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -88,7 +88,7 @@ struct db_tvrx1 db_tvrx1 = {
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
@@ -115,7 +115,7 @@ struct db_tvrx2 db_tvrx2 = {
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = true,
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = true,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
@@ -142,7 +142,7 @@ struct db_tvrx3 db_tvrx3 = {
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = true,
   .base.is_quadrature = false,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = true,
-  //.base.lo_offset = U2_DOUBLE_TO_FXPT_FREQ(4e6),
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
   .base.init = tvrx_init,
   .base.set_freq = tvrx_set_freq,
   .base.set_gain = tvrx_set_gain,
index 6c165bc961333972622ee657bf3cc761199380d2..8132d69a70d38247d0f0a44b2ea2ee5b59d93382 100644 (file)
@@ -147,6 +147,7 @@ struct db_xcvr2450_rx db_xcvr2450_rx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = false,
   .base.spectrum_inverted = false,
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = xcvr2450_init,
   .base.set_freq = xcvr2450_set_freq,
   .base.set_gain = xcvr2450_set_gain_rx,
   .base.init = xcvr2450_init,
   .base.set_freq = xcvr2450_set_freq,
   .base.set_gain = xcvr2450_set_gain_rx,
@@ -169,6 +170,7 @@ struct db_xcvr2450_tx db_xcvr2450_tx = {
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
   .base.is_quadrature = true,
   .base.i_and_q_swapped = true,
   .base.spectrum_inverted = false,
+  .base.default_lo_offset = U2_DOUBLE_TO_FXPT_FREQ(0),
   .base.init = xcvr2450_init,
   .base.set_freq = xcvr2450_set_freq,
   .base.set_gain = xcvr2450_set_gain_tx,
   .base.init = xcvr2450_init,
   .base.set_freq = xcvr2450_set_freq,
   .base.set_gain = xcvr2450_set_gain_tx,
index 39da63aa5d8bc6da455772f33f768fbf7fe987e7..2186ce90b3b58c35f23d016cbeb107903c0d2805 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -115,6 +115,11 @@ namespace usrp2 {
     //! return Rx gain db_per_step
     double rx_gain_db_per_step();
 
     //! return Rx gain db_per_step
     double rx_gain_db_per_step();
 
+    /*!
+     * \brief Set receive daughterboard LO offset frequency
+     */
+    bool set_rx_lo_offset(double frequency);
+
     /*!
      * Set receiver center frequency
      */
     /*!
      * Set receiver center frequency
      */
@@ -200,6 +205,11 @@ namespace usrp2 {
     //! return Tx gain db_per_step
     double tx_gain_db_per_step();
 
     //! return Tx gain db_per_step
     double tx_gain_db_per_step();
 
+    /*
+     * \brief Set transmit daughterboard LO offset frequency
+     */
+    bool set_tx_lo_offset(double frequency);
+
     /*!
      * Set transmitter center frequency
      */
     /*!
      * Set transmitter center frequency
      */
index 2c042f0cf78e9946d9243255598992bfd5a07b75..33f73fa943604f11f7f3d147d8c585ba740005b1 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -93,6 +93,12 @@ namespace usrp2 {
     // eop must be dynamically written here
   };
 
     // eop must be dynamically written here
   };
 
+  struct op_freq_cmd {
+    u2_eth_packet_t h;
+    op_freq_t       op;
+    op_generic_t    eop;
+  };
+
   /*!
    * Control mechanism to allow API calls to block waiting for reply packets
    */    
   /*!
    * Control mechanism to allow API calls to block waiting for reply packets
    */    
index 90a31b220515f635b7fabc7be27017cb5dd2aea1..6a54c6da68e6fc8f7aae12be6f9f50919082f743 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -186,6 +186,12 @@ namespace usrp2 {
     return d_impl->rx_gain_db_per_step();
   }
 
     return d_impl->rx_gain_db_per_step();
   }
 
+  bool
+  usrp2::set_rx_lo_offset(double frequency)
+  {
+    return d_impl->set_rx_lo_offset(frequency);
+  }
+
   bool
   usrp2::set_rx_center_freq(double frequency, tune_result *result)
   {
   bool
   usrp2::set_rx_center_freq(double frequency, tune_result *result)
   {
@@ -278,6 +284,12 @@ namespace usrp2 {
     return d_impl->tx_gain_db_per_step();
   }
 
     return d_impl->tx_gain_db_per_step();
   }
 
+  bool
+  usrp2::set_tx_lo_offset(double frequency)
+  {
+    return d_impl->set_tx_lo_offset(frequency);
+  }
+
   bool
   usrp2::set_tx_center_freq(double frequency, tune_result *result)
   {
   bool
   usrp2::set_tx_center_freq(double frequency, tune_result *result)
   {
index 2aa43013833d85337d8b070ffd3e6e358b38b86d..4b4de024f9a20a4b2dee8701d4a26c83bf8b56f7 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -73,6 +73,10 @@ namespace usrp2 {
     case OP_SYNC_TO_PPS: return "OP_SYNC_TO_PPS";
     case OP_PEEK: return "OP_PEEK";
     case OP_PEEK_REPLY: return "OP_PEEK_REPLY";
     case OP_SYNC_TO_PPS: return "OP_SYNC_TO_PPS";
     case OP_PEEK: return "OP_PEEK";
     case OP_PEEK_REPLY: return "OP_PEEK_REPLY";
+    case OP_SET_TX_LO_OFFSET: return "OP_SET_TX_LO_OFFSET";
+    case OP_SET_TX_LO_OFFSET_REPLY: return "OP_SET_TX_LO_OFFSET_REPLY";
+    case OP_SET_RX_LO_OFFSET: return "OP_SET_RX_LO_OFFSET";
+    case OP_SET_RX_LO_OFFSET_REPLY: return "OP_SET_RX_LO_OFFSET_REPLY";
 
     default:
       char buf[64];
 
     default:
       char buf[64];
@@ -169,6 +173,10 @@ namespace usrp2 {
       fprintf(stderr, "  gain_db_per_step = %g\n", rx_gain_db_per_step());
     }
 
       fprintf(stderr, "  gain_db_per_step = %g\n", rx_gain_db_per_step());
     }
 
+    // Ensure any custom values in hardware are cleared
+    if (!reset_db())
+      std::cerr << "usrp2::ctor reset_db failed\n";
+
     // default gains to mid point
     if (!set_tx_gain((tx_gain_min() + tx_gain_max()) / 2))
       std::cerr << "usrp2::ctor set_tx_gain failed\n";
     // default gains to mid point
     if (!set_tx_gain((tx_gain_min() + tx_gain_max()) / 2))
       std::cerr << "usrp2::ctor set_tx_gain failed\n";
@@ -471,6 +479,33 @@ namespace usrp2 {
     return success;
   }
   
     return success;
   }
   
+  bool
+  usrp2::impl::set_rx_lo_offset(double frequency)
+  {
+    op_freq_cmd cmd;
+    op_generic_t reply;
+
+    memset(&cmd, 0, sizeof(cmd));
+    init_etf_hdrs(&cmd.h, d_addr, 0, CONTROL_CHAN, -1);
+    cmd.op.opcode = OP_SET_RX_LO_OFFSET;
+    cmd.op.len = sizeof(cmd.op);
+    cmd.op.rid = d_next_rid++;
+
+    u2_fxpt_freq_t fxpt = u2_double_to_fxpt_freq(frequency);
+    cmd.op.freq_hi = htonl(u2_fxpt_freq_hi(fxpt));
+    cmd.op.freq_lo = htonl(u2_fxpt_freq_lo(fxpt));
+
+    cmd.eop.opcode = OP_EOP;
+    cmd.eop.len = sizeof(cmd.eop);
+    
+    pending_reply p(cmd.op.rid, &reply, sizeof(reply));
+    if (!transmit_cmd(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT))
+      return false;
+
+    bool success = (ntohx(reply.ok) == 1);
+    return success;
+  }
+
   bool
   usrp2::impl::set_rx_center_freq(double frequency, tune_result *result)
   {
   bool
   usrp2::impl::set_rx_center_freq(double frequency, tune_result *result)
   {
@@ -710,6 +745,33 @@ namespace usrp2 {
     return success;
   }
   
     return success;
   }
   
+  bool
+  usrp2::impl::set_tx_lo_offset(double frequency)
+  {
+    op_freq_cmd cmd;
+    op_generic_t reply;
+
+    memset(&cmd, 0, sizeof(cmd));
+    init_etf_hdrs(&cmd.h, d_addr, 0, CONTROL_CHAN, -1);
+    cmd.op.opcode = OP_SET_TX_LO_OFFSET;
+    cmd.op.len = sizeof(cmd.op);
+    cmd.op.rid = d_next_rid++;
+
+    u2_fxpt_freq_t fxpt = u2_double_to_fxpt_freq(frequency);
+    cmd.op.freq_hi = htonl(u2_fxpt_freq_hi(fxpt));
+    cmd.op.freq_lo = htonl(u2_fxpt_freq_lo(fxpt));
+
+    cmd.eop.opcode = OP_EOP;
+    cmd.eop.len = sizeof(cmd.eop);
+    
+    pending_reply p(cmd.op.rid, &reply, sizeof(reply));
+    if (!transmit_cmd(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT))
+      return false;
+
+    bool success = (ntohx(reply.ok) == 1);
+    return success;
+  }
+
   bool
   usrp2::impl::set_tx_center_freq(double frequency, tune_result *result)
   {
   bool
   usrp2::impl::set_tx_center_freq(double frequency, tune_result *result)
   {
@@ -1152,7 +1214,7 @@ namespace usrp2 {
 
     // Copy data from vector into packet space
     uint32_t *dest = (uint32_t *)((uint8_t *)cmd+plen);
 
     // Copy data from vector into packet space
     uint32_t *dest = (uint32_t *)((uint8_t *)cmd+plen);
-    for (unsigned int i = 0; i < words; i++) {
+    for (int i = 0; i < words; i++) {
       //fprintf(stderr, "%03i@%p\n", i, dest);
       *dest++ = htonl(data[i]);
     }
       //fprintf(stderr, "%03i@%p\n", i, dest);
       *dest++ = htonl(data[i]);
     }
@@ -1174,4 +1236,26 @@ namespace usrp2 {
     return ok;
   }
 
     return ok;
   }
 
+  bool
+  usrp2::impl::reset_db()
+  {
+    op_generic_cmd cmd;
+    op_generic_t reply;
+
+    memset(&cmd, 0, sizeof(cmd));
+    init_etf_hdrs(&cmd.h, d_addr, 0, CONTROL_CHAN, -1);
+    cmd.op.opcode = OP_RESET_DB;
+    cmd.op.len = sizeof(cmd.op);
+    cmd.op.rid = d_next_rid++;
+    cmd.eop.opcode = OP_EOP;
+    cmd.eop.len = sizeof(cmd.eop);
+    
+    pending_reply p(cmd.op.rid, &reply, sizeof(reply));
+    if (!transmit_cmd(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT))
+      return false;
+
+    bool success = (ntohx(reply.ok) == 1);
+    return success;
+  }
+
 } // namespace usrp2
 } // namespace usrp2
index b332d65d26fdf381ca0dd464f863ca9ed76b9d9d..dfd054c03ac3208b753cbe8fd4ff8129973426ca 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
 /* -*- 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
  *
  * 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
@@ -108,6 +108,7 @@ namespace usrp2 {
     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();
     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);
 
   public:
     impl(const std::string &ifc, props *p);
@@ -123,6 +124,7 @@ namespace usrp2 {
     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; }
     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_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; }
@@ -141,6 +143,7 @@ namespace usrp2 {
     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; }
     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_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; }