commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7227 - gnuradio/branches/developers/jcorgan/t127/usrp


From: jcorgan
Subject: [Commit-gnuradio] r7227 - gnuradio/branches/developers/jcorgan/t127/usrpdb/src
Date: Tue, 18 Dec 2007 12:02:27 -0700 (MST)

Author: jcorgan
Date: 2007-12-18 12:02:27 -0700 (Tue, 18 Dec 2007)
New Revision: 7227

Modified:
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/Makefile.am
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_rx.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_tx.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_dbsrx.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lfrx.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lftx.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_usrpdb.py
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_basic_rx.cc
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.cc
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.h
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.h
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.i
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.cc
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.h
   gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.i
Log:
Work in progress with dbsrx, implemented set_freq.

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/Makefile.am
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/Makefile.am    
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/Makefile.am    
2007-12-18 19:02:27 UTC (rev 7227)
@@ -60,6 +60,8 @@
 
 lib_LTLIBRARIES = libusrpdb.la
 
+libusrpdb_la_CPPFLAGS = -Werror
+
 libusrpdb_la_SOURCES =                 \
        usrpdb_base.cc                  \
        usrpdb_basic_rx.cc              \
@@ -75,6 +77,8 @@
 _usrpdb_la_SOURCES =                   \
        usrpdb.cc
 
+_usrpdb_la_CPPFLAGS = -fno-strict-aliasing
+
 _usrpdb_la_LIBADD =                    \
        $(PYTHON_LDFLAGS)               \
        libusrpdb.la                    \

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_rx.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_rx.py 
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_rx.py 
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_basic_rx(gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
        self.db = usrpdb.basic_rx(self.hwa)
 
     def tearDown(self):

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_tx.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_tx.py 
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_basic_tx.py 
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_basic_tx(gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
        self.db = usrpdb.basic_tx(self.hwa)
 
     def tearDown(self):

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_dbsrx.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_dbsrx.py    
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_dbsrx.py    
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_dbsrx(gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
        self.db = usrpdb.dbsrx(self.hwa)
 
     def tearDown(self):

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lfrx.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lfrx.py     
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lfrx.py     
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_lfrx(gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
        self.db = usrpdb.lfrx(self.hwa)
 
     def tearDown(self):

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lftx.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lftx.py     
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_lftx.py     
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_lftx(gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
        self.db = usrpdb.lftx(self.hwa)
 
     def tearDown(self):

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_usrpdb.py
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_usrpdb.py   
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/qa_usrpdb.py   
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,7 +26,7 @@
 class qa_usrpdb (gr_unittest.TestCase):
 
     def setUp(self):
-       self.hwa = usrpdb.hwa_qa()
+       self.hwa = usrpdb.hwa_qa(0)
 
     def tearDown(self):
        self.hwa = None

Modified: 
gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_basic_rx.cc
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_basic_rx.cc     
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_basic_rx.cc     
2007-12-18 19:02:27 UTC (rev 7227)
@@ -36,7 +36,7 @@
 usrpdb_basic_rx::usrpdb_basic_rx(usrpdb_hwa_sptr hwa)
   : usrpdb_base(hwa)
 {
-    d_hwa->bypass_adc_buffers(true);
+  d_hwa->bypass_adc_buffers(true);
 }
 
 std::vector<float>

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.cc
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.cc        
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.cc        
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,6 +26,9 @@
 
 #include <usrpdb_dbsrx.h>
 #include <stdexcept>
+#include <iostream>
+#include <iomanip>
+#include <cmath>
 
 // i2c bus id, side A, side B
 static char s_i2c_addr[2] = { 0x67, 0x65 };
@@ -95,8 +98,16 @@
 
   switch(regno) {
     case 0:
-      write_reg(0, d_div2<<7 + d_n>>8);
+      write_reg(0, (d_div2<<7) + (d_n>>8));
       break;
+
+    case 1:
+      write_reg(1, (d_n & 0xff));
+      break;
+
+    case 2:
+      write_reg(2, d_osc + (d_cp<<3) + (d_r_int<<5));
+      break;
       
     case 4:
       write_reg(4, d_m + (d_dl<<5) + (d_ade<<6) + (d_adl<<7));
@@ -104,6 +115,12 @@
   }
 }
 
+std::vector<unsigned char>
+usrpdb_dbsrx::read_status()
+{
+  return d_hwa->read_i2c(d_addr, 2);
+}
+
 void
 usrpdb_dbsrx::set_div2(int div2)
 {
@@ -120,6 +137,40 @@
   send_reg(4);
 }
 
+void
+usrpdb_dbsrx::set_r(int r)
+{
+  assert(r >= 0 && r < 128);
+  d_r = r;
+  d_r_int = (int)round(log10(r)/log10(2.0))-1;
+  send_reg(2);
+}
+
+void
+usrpdb_dbsrx::set_n(int n)
+{
+  assert(n > 256 && n < 32768);
+  d_n = n;
+  send_reg(0);
+  send_reg(1);
+}
+
+void
+usrpdb_dbsrx::set_osc(int osc)
+{
+  assert(osc >= 0 && osc < 8);
+  d_osc = osc;
+  send_reg(2);
+}
+
+void
+usrpdb_dbsrx::set_cp(int cp)
+{
+  assert(cp >= 0 && cp < 4);
+  d_cp = cp;
+  send_reg(2);
+}
+
 float
 usrpdb_dbsrx::set_freq(float target_freq)
 {
@@ -138,7 +189,91 @@
   }
 
   set_ade(1);
-  // resume with rmin=
+
+  // Calculate best 'r' and 'n' register values
+  // output = n*refclk_freq/r
+  // the higher r is, the worse the phase noise
+  int rmin=(int)std::max(2.0, d_hwa->refclk_frequency()/2e6);
+  int rmax=(int)std::min(128.0, d_hwa->refclk_frequency()/500e3);
+  int r=2, n=0, best_r=2, best_n=0;
+  float delta, best_delta = 10e6;
+
+  while (r < rmax) {
+    n = (int)round(target_freq/(d_hwa->refclk_frequency()/r));
+
+    if (r < rmin || n < 256) {
+      r *= 2;
+      continue;
+    }
+
+    delta = fabs(n*d_hwa->refclk_frequency()/r-target_freq);
+    if (delta < 75e3) {
+      best_r = r;
+      best_n = n;
+      break;
+    }
+    if (delta < best_delta*0.9) {
+      best_r = r;
+      best_n = n;
+      best_delta = delta;
+    }
+
+    r *= 2;
+  }
+
+  set_r(best_r);
+  set_n(best_n);
+
+  // Select VCO.  Initially based on desired center frequency,
+  // but check tuning voltage and adjust as necessary. See Maxim 2118
+  // double secret application note for details.
+  int vco;
+  if (vco_freq < 2433e6)
+    vco = 0;
+  else if (vco_freq < 2711e6)
+    vco = 1;
+  else if (vco_freq < 3025e6)
+    vco = 2;
+  else if (vco_freq < 3341e6)
+    vco = 3;
+  else if (vco_freq < 3727e6)
+    vco = 4;
+  else if (vco_freq < 4143e6)
+    vco = 5;
+  else if (vco_freq < 4493e6)
+    vco = 6;
+  else
+    vco = 7;
+
+  set_osc(vco);
+  int adc_val = 0;
+  while(adc_val == 0 || adc_val == 7) { // Tuning voltage is pegged
+    adc_val = read_status()[0]>>2;
+    if (adc_val == 0) {
+      if (vco <= 0)
+       throw std::runtime_error("unable to set frequency");
+      else
+       vco -= 1;
+    }
+    else if (adc_val ==7) {
+      if (vco >= 7)
+       throw std::runtime_error("unable to set frequency");
+      else
+       vco += 1;
+    }
+
+    set_osc(vco);
+  }
+
+  // Set charge pump current
+  if (adc_val == 1 || adc_val == 2)
+    set_cp(1);
+  else if (adc_val == 3 || adc_val == 4)
+    set_cp(2);
+  else
+    set_cp(3);
+
+  return d_n*d_hwa->refclk_frequency()/d_r;
 }
 
 std::vector<float>

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.h
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.h 
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_dbsrx.h 
2007-12-18 19:02:27 UTC (rev 7227)
@@ -34,7 +34,12 @@
   void send_reg(unsigned char regno);
   void set_div2(int div2);
   void set_ade(int ade);
-  
+  void set_r(int r);
+  void set_n(int n);
+  void set_osc(int osc);
+  void set_cp(int cp);
+  std::vector<unsigned char> read_status();
+
   char d_addr;
   int d_n;
   int d_div2;

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.h
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.h   
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.h   
2007-12-18 19:02:27 UTC (rev 7227)
@@ -33,6 +33,7 @@
   virtual ~usrpdb_hwa() = 0;
 
   virtual unsigned int side() = 0;
+  virtual float fpga_master_clock_frequency() = 0;
   virtual float dac_pga_gain() = 0;
   virtual float dac_pga_min() = 0;
   virtual float dac_pga_max() = 0;
@@ -47,7 +48,9 @@
   virtual void write_oe(unsigned short mask, unsigned short val) = 0;
   virtual void set_refclk_divisor(int divisor) = 0;
   virtual void enable_refclk(bool enable) = 0;
+  virtual float refclk_frequency() = 0;
   virtual void write_i2c(char addr, std::vector<unsigned char> seq) = 0;
+  virtual std::vector<unsigned char> read_i2c(char addr, int len) = 0;
 };
 
 typedef boost::shared_ptr<usrpdb_hwa> usrpdb_hwa_sptr;

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.i
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.i   
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa.i   
2007-12-18 19:02:27 UTC (rev 7227)
@@ -35,6 +35,7 @@
   virtual ~usrpdb_hwa() = 0;
 
   virtual unsigned int side() = 0;
+  virtual float fpga_master_clock_frequency() = 0;
   virtual float dac_pga_gain() = 0;
   virtual float dac_pga_min() = 0;
   virtual float dac_pga_max() = 0;
@@ -45,9 +46,11 @@
   virtual float adc_pga_max() = 0;
   virtual float adc_pga_db_per_step() = 0;
   virtual void set_adc_pga(float gain) = 0;
-  virtual void bypass_adc_buffers(bool bypass);
-  virtual void write_oe(unsigned short mask, unsigned short value);
-  virtual void set_refclk_divisor(int divisor);
-  virtual void enable_refclk(bool enable);
-  virtual void write_i2c(char addr, std::vector<unsigned char> seq);
+  virtual void bypass_adc_buffers(bool bypass) = 0;
+  virtual void write_oe(unsigned short mask, unsigned short value) = 0;
+  virtual void set_refclk_divisor(int divisor) = 0;
+  virtual void enable_refclk(bool enable) = 0;
+  virtual float refclk_frequency() = 0;
+  virtual void write_i2c(char addr, std::vector<unsigned char> seq) = 0;
+  virtual std::vector<unsigned char> read_i2c(char addr, int len) = 0;
 };

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.cc
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.cc       
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.cc       
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,21 +26,22 @@
 
 #include <usrpdb_hwa_qa.h>
 #include <iostream>
+#include <iomanip>
 
 #define USRPDB_HWA_QA_DEBUG 1
 
 usrpdb_hwa_sptr 
-usrpdb_make_qa_hwa()
+usrpdb_make_qa_hwa(int side)
 {
-  return usrpdb_hwa_sptr(new usrpdb_hwa_qa());
+  return usrpdb_hwa_sptr(new usrpdb_hwa_qa(side));
 }
 
-usrpdb_hwa_qa::usrpdb_hwa_qa()
-  : d_side(0),
+usrpdb_hwa_qa::usrpdb_hwa_qa(int side)
+  : d_side(side),
     d_adc_pga_gain(0.0),
     d_dac_pga_gain(0.0),
     d_output_enable(0x0000),
-    d_refclk_divisor(0),
+    d_refclk_divisor(1),
     d_refclk_enabled(false)
 {
 }
@@ -49,6 +50,15 @@
 {
 }
 
+#if USRPDB_HWA_QA_DEBUG
+inline std::ostream &operator <<(std::ostream &os, std::vector<unsigned char> 
&seq)
+{
+  for (unsigned int i = 0; i < seq.size(); i++)
+    os << std::setbase(16) << std::setw(2) << std::setfill('0') << 
((int)seq[i]) << " ";
+  return os;
+}
+#endif
+
 unsigned int
 usrpdb_hwa_qa::side()
 {
@@ -56,6 +66,13 @@
 }
 
 float
+usrpdb_hwa_qa::fpga_master_clock_frequency()
+{
+  // mimic USRP1
+  return 64e6;
+}
+
+float
 usrpdb_hwa_qa::dac_pga_gain()
 {
   return d_dac_pga_gain;
@@ -159,9 +176,33 @@
   d_refclk_enabled = enable;
 }
 
+float
+usrpdb_hwa_qa::refclk_frequency()
+{
+  return fpga_master_clock_frequency()/d_refclk_divisor;
+}
+
 void
 usrpdb_hwa_qa::write_i2c(char addr, std::vector<unsigned char> seq)
 {
   if (USRPDB_HWA_QA_DEBUG)
-    std::cout << "usrpdb_hwa_qa: writing to I2C addr: " << (int)addr << 
std::endl;
+    std::cout << "usrpdb_hwa_qa: writing to I2C addr " << std::setbase(16) 
+              << std::setw(2) << std::setfill('0') << (int)addr 
+              << ": " << seq << std::endl;
 }
+
+std::vector<unsigned char>
+usrpdb_hwa_qa::read_i2c(char addr, int len)
+{
+  std::vector<unsigned char> result(len);
+
+  // Fake DBSRX
+  if (addr == 0x65 || addr == 0x67) {
+    int adc_val = 1;
+    unsigned char iq_dac = 0;
+    result[0] = adc_val << 2;
+    result[1] = iq_dac;
+  }
+
+  return result;
+}

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.h
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.h        
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.h        
2007-12-18 19:02:27 UTC (rev 7227)
@@ -26,13 +26,13 @@
 #include <usrpdb_hwa.h>
 #include <boost/shared_ptr.hpp>
 
-usrpdb_hwa_sptr usrpdb_make_qa_hwa();
+usrpdb_hwa_sptr usrpdb_make_qa_hwa(int side);
 
 class usrpdb_hwa_qa : public usrpdb_hwa
 {
-  usrpdb_hwa_qa();
+  usrpdb_hwa_qa(int side);
 
-  friend usrpdb_hwa_sptr usrpdb_make_qa_hwa();
+  friend usrpdb_hwa_sptr usrpdb_make_qa_hwa(int side);
 
   // Mimic dummy hardware
   unsigned int d_side;
@@ -47,6 +47,7 @@
   ~usrpdb_hwa_qa();
 
   unsigned int side();
+  virtual float fpga_master_clock_frequency();
   float dac_pga_gain();
   float dac_pga_min();
   float dac_pga_max();
@@ -61,7 +62,9 @@
   void write_oe(unsigned short mask, unsigned short val);
   void set_refclk_divisor(int divisor);
   void enable_refclk(bool enable);
+  virtual float refclk_frequency();
   void write_i2c(char addr, std::vector<unsigned char> seq);
+  std::vector<unsigned char> read_i2c(char addr, int len);
 };
 
 #endif /* INCLUDED_USRPDB_HWA_QA_H */

Modified: gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.i
===================================================================
--- gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.i        
2007-12-18 18:01:57 UTC (rev 7226)
+++ gnuradio/branches/developers/jcorgan/t127/usrpdb/src/usrpdb_hwa_qa.i        
2007-12-18 19:02:27 UTC (rev 7227)
@@ -27,16 +27,17 @@
 %rename(hwa_qa) usrpdb_make_qa_hwa;
 %ignore hwa_qa;
 
-usrpdb_hwa_sptr usrpdb_make_qa_hwa();
+usrpdb_hwa_sptr usrpdb_make_qa_hwa(int side);
 
 class usrpdb_hwa_qa : public usrpdb_hwa
 {
-  usrpdb_hwa_qa();
+  usrpdb_hwa_qa(int side);
 
 public:
   ~usrpdb_hwa_qa();
 
   unsigned int side();
+  virtual float fpga_master_clock_frequency();
   float dac_pga_gain();
   float dac_pga_min();
   float dac_pga_max();
@@ -51,5 +52,7 @@
   void write_oe(int mask, int val);
   void set_refclk_divisor(int divisor);
   void enable_refclk(bool enable);
+  virtual float refclk_frequency();
   void write_i2c(char addr, std::vector<unsigned char> seq);
+  std::vector<unsigned char> read_i2c(char addr, int len);
 };





reply via email to

[Prev in Thread] Current Thread [Next in Thread]