Fix WBX tuning to allow DDC use in reaching 50MHz
authorJason Abele <jason@ettus.com>
Fri, 16 Apr 2010 22:00:51 +0000 (15:00 -0700)
committerJason Abele <jason@ettus.com>
Fri, 16 Apr 2010 22:00:51 +0000 (15:00 -0700)
usrp/host/lib/db_wbxng.cc
usrp2/firmware/lib/adf4350.c
usrp2/firmware/lib/db_wbxng.c

index b35a9cb35d75222df2412dacd04c47c3e9308dd6..bd836dfe331090724a18c8c9f414ec274dd66032 100644 (file)
@@ -80,7 +80,9 @@ wbxng_base::set_freq(double freq)
     actual_baseband_freq is the RF frequency that corresponds to DC in the IF.
   */
 
-  freq_t int_freq = freq_t(freq);
+  // clamp freq
+  freq_t int_freq = freq_t(std::max(freq_min(), std::min(freq, freq_max())));
+
   bool ok = d_common->_set_freq(int_freq*2);
   double freq_result = (double) d_common->_get_freq()/2.0;
   struct freq_result_t args = {ok, freq_result};
index 0725c93379533e123f0439196fe015b42b8d0b2f..dbab654ea30bdeca9bbfdb141a279776d6788810 100644 (file)
@@ -30,7 +30,7 @@
 #define MIN_VCO_FREQ U2_DOUBLE_TO_FXPT_FREQ(2.2e9)                      /* minimum vco freq */
 #define MAX_VCO_FREQ U2_DOUBLE_TO_FXPT_FREQ(4.4e9)                      /* minimum vco freq */
 #define MAX_FREQ MAX_VCO_FREQ                                           /* upper bound freq (rf div = 1) */
-#define MIN_FREQ DIV_ROUND(MIN_VCO_FREQ, MAX_RF_DIV)                    /* calculated lower bound freq */
+#define MIN_FREQ U2_DOUBLE_TO_FXPT_FREQ(68.75e6)                        /* lower bound freq (rf div = 16) */
 
 u2_fxpt_freq_t adf4350_get_max_freq(void){
        return MAX_FREQ;
@@ -170,7 +170,7 @@ bool adf4350_set_freq(u2_fxpt_freq_t freq, struct db_base *dbb){
        adf4350_load_register(2, dbb);
        adf4350_load_register(4, dbb);
        adf4350_load_register(0, dbb); /* register 0 must be last */
-       return true;
+       return adf4350_get_locked(dbb);
 }
 
 u2_fxpt_freq_t adf4350_get_freq(struct db_base *dbb){
index 115ac8a246b0cd79dbb4b2bd93c68d3c7e53bb69..954633da245b725427f9957b164ae3944cb4bf54 100644 (file)
@@ -29,6 +29,9 @@
 #include <stdio.h>
 #include <stdint.h>
 
+#define min(X,Y) ((X) < (Y) ? (X) : (Y))
+#define max(X,Y) ((X) > (Y) ? (X) : (Y))
+
 bool wbxng_init_rx(struct db_base *dbb);
 bool wbxng_init_tx(struct db_base *dbb);
 bool wbxng_set_freq(struct db_base *dbb, u2_fxpt_freq_t freq, u2_fxpt_freq_t *dc);
@@ -45,7 +48,7 @@ struct db_wbxng_rx db_wbxng_rx = {
   .base.is_tx = false,
   .base.output_enables = RX2_RX1N|RXBB_EN|ATTN_MASK|ENABLE_33|ENABLE_5|PLL_CE|PLL_PDBRF|ATTN_MASK,
   .base.used_pins = 0xFFFF,
-  .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(67.5e6),
+  .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(68.75e6),
   .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2200e6),
   .base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
   .base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(31.5),
@@ -81,7 +84,7 @@ struct db_wbxng_tx db_wbxng_tx = {
   .base.is_tx = true,
   .base.output_enables = RX_TXN|TXMOD_EN|ENABLE_33|ENABLE_5|PLL_CE|PLL_PDBRF,
   .base.used_pins = 0xFFFF,
-  .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(67.5e6),
+  .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(68.75e6),
   .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2200e6),
   .base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
   .base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(25),
@@ -149,8 +152,11 @@ wbxng_init_rx(struct db_base *dbb)
 bool
 wbxng_set_freq(struct db_base *dbb, u2_fxpt_freq_t freq, u2_fxpt_freq_t *dc)
 {
-  bool ok = adf4350_set_freq(2*freq,dbb);
-  *dc = adf4350_get_freq(dbb)/2;
+  // clamp freq
+  u2_fxpt_freq_t clamp_freq = max(dbb->freq_min, min(freq, dbb->freq_max));
+  //printf("Requested LO freq = %u", (uint32_t) ((clamp_freq >> U2_FPF_RP)/1000));
+  bool ok = adf4350_set_freq(clamp_freq<<1,dbb);
+  *dc = adf4350_get_freq(dbb)>>1;
 
   return ok;
 }