[Top][All Lists]
[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);
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7227 - gnuradio/branches/developers/jcorgan/t127/usrpdb/src,
jcorgan <=