summaryrefslogtreecommitdiff
path: root/usrp/host
diff options
context:
space:
mode:
authorgnychis2009-01-16 18:51:42 +0000
committergnychis2009-01-16 18:51:42 +0000
commitc3f5183d1383a2fb029bf2a77555499ebf0530ff (patch)
treebeb90d92d091e3fbbfb62d3d0f9e66a3762bc5ee /usrp/host
parent4b5cfa809a01a494c4f5e6b052414ed9b3d066cb (diff)
downloadgnuradio-c3f5183d1383a2fb029bf2a77555499ebf0530ff.tar.gz
gnuradio-c3f5183d1383a2fb029bf2a77555499ebf0530ff.tar.bz2
gnuradio-c3f5183d1383a2fb029bf2a77555499ebf0530ff.zip
merging 10218 to 10241 for full daughterboard support with in-band project
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10244 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'usrp/host')
-rw-r--r--usrp/host/apps-inband/test_usrp_inband_2tx.cc6
-rw-r--r--usrp/host/apps-inband/test_usrp_inband_rx.cc5
-rw-r--r--usrp/host/apps-inband/test_usrp_inband_tx.cc7
-rw-r--r--usrp/host/lib/inband/usrp_usb_interface.cc152
-rw-r--r--usrp/host/lib/inband/usrp_usb_interface.h8
5 files changed, 150 insertions, 28 deletions
diff --git a/usrp/host/apps-inband/test_usrp_inband_2tx.cc b/usrp/host/apps-inband/test_usrp_inband_2tx.cc
index caa780339..11a1a491c 100644
--- a/usrp/host/apps-inband/test_usrp_inband_2tx.cc
+++ b/usrp/host/apps-inband/test_usrp_inband_2tx.cc
@@ -127,9 +127,9 @@ test_usrp_tx::test_usrp_tx(mb_runtime *runtime, const std::string &instance_name
pmt_intern("interp-tx"),
pmt_from_long(128));
- pmt_dict_set(usrp_dict,
- pmt_intern("rf-freq"),
- pmt_from_long(10e6));
+// pmt_dict_set(usrp_dict,
+// pmt_intern("rf-freq"),
+// pmt_from_long(10e6));
define_component("server", "usrp_server", usrp_dict);
diff --git a/usrp/host/apps-inband/test_usrp_inband_rx.cc b/usrp/host/apps-inband/test_usrp_inband_rx.cc
index dcb87a7c9..4f21e4afc 100644
--- a/usrp/host/apps-inband/test_usrp_inband_rx.cc
+++ b/usrp/host/apps-inband/test_usrp_inband_rx.cc
@@ -112,6 +112,11 @@ test_usrp_rx::test_usrp_rx(mb_runtime *runtime, const std::string &instance_name
pmt_intern("decim-rx"),
pmt_from_long(64));
+// If unspecified, chooses center frequency from range
+// pmt_dict_set(usrp_dict,
+// pmt_intern("rf-freq"),
+// pmt_from_long(10e6));
+
define_component("server", "usrp_server", usrp_dict);
connect("self", "rx0", "server", "rx0");
diff --git a/usrp/host/apps-inband/test_usrp_inband_tx.cc b/usrp/host/apps-inband/test_usrp_inband_tx.cc
index 7ce38c2e4..9f294e770 100644
--- a/usrp/host/apps-inband/test_usrp_inband_tx.cc
+++ b/usrp/host/apps-inband/test_usrp_inband_tx.cc
@@ -124,9 +124,10 @@ test_usrp_tx::test_usrp_tx(mb_runtime *runtime, const std::string &instance_name
pmt_intern("interp-tx"),
pmt_from_long(64));
- pmt_dict_set(usrp_dict,
- pmt_intern("rf-freq"),
- pmt_from_long(10e6));
+// If unspecified, chooses center frequency from range
+// pmt_dict_set(usrp_dict,
+// pmt_intern("rf-freq"),
+// pmt_from_long(10e6));
define_component("server", "usrp_server", usrp_dict);
diff --git a/usrp/host/lib/inband/usrp_usb_interface.cc b/usrp/host/lib/inband/usrp_usb_interface.cc
index d82b589b4..cd77974c7 100644
--- a/usrp/host/lib/inband/usrp_usb_interface.cc
+++ b/usrp/host/lib/inband/usrp_usb_interface.cc
@@ -36,6 +36,7 @@
#include "usrp_tx.h"
#include "usrp_standard.h"
#include <stdio.h>
+#include <usrp_dbid.h>
typedef usrp_inband_usb_packet transport_pkt;
@@ -59,7 +60,7 @@ usrp_usb_interface::usrp_usb_interface(mb_runtime *rt, const std::string &instan
d_rx_reading(false),
d_interp_tx(128),
d_decim_rx(128),
- d_rf_freq(10e6),
+ d_rf_freq(-1),
d_rbf("inband_tx_rx.rbf")
{
// Dictionary for arguments to all of the components
@@ -299,17 +300,51 @@ usrp_usb_interface::handle_cmd_open(pmt_t data)
return;
}
- if(!d_utx->set_tx_freq (0,d_rf_freq) || !d_utx->set_tx_freq(1,d_rf_freq)) { // try setting center freq to 0
- if (verbose)
- std::cout << "[USRP_USB_INTERFACE] Failed to set center frequency on TX\n";
- reply_data = pmt_list2(invocation_handle, PMT_F);
- d_cs->send(s_response_usrp_open, reply_data);
- return;
+ // Perform TX daughterboard tuning
+ double target_freq;
+ unsigned int mux;
+ int tgain, rgain;
+ float input_rate;
+ bool ok;
+ usrp_tune_result r;
+
+ // Cast to usrp_basic and then detect daughterboards
+ d_ub_tx = d_utx;
+ usrp_subdev_spec tspec = pick_tx_subdevice();
+ db_base_sptr tsubdev = d_ub_tx->selected_subdev(tspec);
+
+ // Set the TX mux value
+ mux = d_utx->determine_tx_mux_value(tspec);
+ d_utx->set_mux(mux);
+
+ // Set the TX gain and determine rate
+ tgain = tsubdev->gain_max();
+ tsubdev->set_gain(tgain);
+ input_rate = d_ub_tx->converter_rate() / d_utx->interp_rate();
+
+ // Perform the actual tuning, if no frequency specified then pick
+ if(d_rf_freq==-1)
+ target_freq = tsubdev->freq_min()+((tsubdev->freq_max()-tsubdev->freq_min())/2.0);
+ else
+ target_freq = d_rf_freq;
+ ok = d_utx->tune(tsubdev->which(), tsubdev, target_freq, &r);
+ tsubdev->set_enable(true);
+
+ if(verbose) {
+ printf("TX Subdevice name is %s\n", tsubdev->name().c_str());
+ printf("TX Subdevice freq range: (%g, %g)\n",
+ tsubdev->freq_min(), tsubdev->freq_max());
+ printf("mux: %#08x\n", mux);
+ printf("target_freq: %f\n", target_freq);
+ printf("ok: %s\n", ok ? "true" : "false");
+ printf("r.baseband_freq: %f\n", r.baseband_freq);
+ printf("r.dxc_freq: %f\n", r.dxc_freq);
+ printf("r.residual_freq: %f\n", r.residual_freq);
+ printf("r.inverted: %d\n", r.inverted);
}
- if(!d_utx->set_mux(0xBA98)) {
- if (verbose)
- std::cout << "[USRP_USB_INTERFACE] Failed to set TX mux\n";
+ if(!ok) {
+ std::cerr << "[USRP_USB_INTERFACE] Failed to set center frequency on TX\n";
reply_data = pmt_list2(invocation_handle, PMT_F);
d_cs->send(s_response_usrp_open, reply_data);
return;
@@ -337,20 +372,39 @@ usrp_usb_interface::handle_cmd_open(pmt_t data)
d_cs->send(s_response_usrp_open, reply_data);
return;
}
+
+ // Cast to usrp_basic and then detect daughterboards
+ d_ub_rx = d_urx;
+ usrp_subdev_spec rspec = pick_rx_subdevice();
+ db_base_sptr rsubdev = d_ub_rx->selected_subdev(rspec);
+
+ // Set the RX mux value
+ mux = d_urx->determine_rx_mux_value(rspec);
+ d_urx->set_mux(mux);
+
+ // Set the TX gain and determine rate
+ rgain = rsubdev->gain_max();
+ rsubdev->set_gain(rgain);
+ input_rate = d_ub_rx->converter_rate() / d_urx->decim_rate();
- if(!d_urx->set_rx_freq (0, -d_rf_freq) || !d_urx->set_rx_freq(1, -d_rf_freq)) {
- if (verbose)
- std::cout << "[usrp_server] Failed to set center frequency on RX\n";
- reply_data = pmt_list2(invocation_handle, PMT_F);
- d_cs->send(s_response_usrp_open, reply_data);
- return;
+ ok = d_urx->tune(rsubdev->which(), rsubdev, target_freq, &r);
+ rsubdev->set_enable(true);
+
+ if(verbose) {
+ printf("RX Subdevice name is %s\n", rsubdev->name().c_str());
+ printf("RX Subdevice freq range: (%g, %g)\n",
+ rsubdev->freq_min(), rsubdev->freq_max());
+ printf("mux: %#08x\n", mux);
+ printf("target_freq: %f\n", target_freq);
+ printf("ok: %s\n", ok ? "true" : "false");
+ printf("r.baseband_freq: %f\n", r.baseband_freq);
+ printf("r.dxc_freq: %f\n", r.dxc_freq);
+ printf("r.residual_freq: %f\n", r.residual_freq);
+ printf("r.inverted: %d\n", r.inverted);
}
- // Two channels ... this really needs to end up being set correctly by
- // querying for what dboards are connected
- if(!d_urx->set_mux(0x32103210)) {
- if (verbose)
- std::cout << "[USRP_USB_INTERFACE] Failed to set RX mux\n";
+ if(!ok) {
+ std::cerr << "[USRP_USB_INTERFACE] Failed to set center frequency on RX\n";
reply_data = pmt_list2(invocation_handle, PMT_F);
d_cs->send(s_response_usrp_open, reply_data);
return;
@@ -486,5 +540,61 @@ usrp_usb_interface::handle_cmd_close(pmt_t data)
shutdown_all(PMT_T);
}
+usrp_subdev_spec
+usrp_usb_interface::pick_rx_subdevice()
+{
+ int dbids[] = {
+ USRP_DBID_FLEX_400_RX,
+ USRP_DBID_FLEX_900_RX,
+ USRP_DBID_FLEX_1200_RX,
+ USRP_DBID_FLEX_2400_RX,
+ USRP_DBID_TV_RX,
+ USRP_DBID_TV_RX_REV_2,
+ USRP_DBID_DBS_RX,
+ USRP_DBID_DBS_RX_REV_2_1,
+ USRP_DBID_BASIC_RX
+ };
+
+ std::vector<int> candidates(dbids, dbids+(sizeof(dbids)/sizeof(int)));
+ return pick_subdev(d_ub_rx, candidates);
+}
+
+usrp_subdev_spec
+usrp_usb_interface::pick_tx_subdevice()
+{
+ int dbids[] = {
+ USRP_DBID_FLEX_400_TX,
+ USRP_DBID_FLEX_900_TX,
+ USRP_DBID_FLEX_1200_TX,
+ USRP_DBID_FLEX_2400_TX,
+ USRP_DBID_BASIC_TX
+ };
+
+ std::vector<int> candidates(dbids, dbids+(sizeof(dbids)/sizeof(int)));
+ return pick_subdev(d_ub_tx, candidates);
+}
+
+usrp_subdev_spec
+usrp_usb_interface::pick_subdev(boost::shared_ptr<usrp_basic> d_usrp_basic, std::vector<int> candidates)
+{
+ int dbid0 = d_usrp_basic->selected_subdev(usrp_subdev_spec(0, 0))->dbid();
+ int dbid1 = d_usrp_basic->selected_subdev(usrp_subdev_spec(1, 0))->dbid();
+
+ for (int i = 0; i < candidates.size(); i++) {
+ int dbid = candidates[i];
+ if (dbid0 == dbid)
+ return usrp_subdev_spec(0, 0);
+ if (dbid1 == dbid)
+ return usrp_subdev_spec(1, 0);
+ }
+
+ if (dbid0 >= 0)
+ return usrp_subdev_spec(0, 0);
+ if (dbid1 >= 0)
+ return usrp_subdev_spec(1, 0);
+
+ throw std::runtime_error("No suitable daughterboard found!");
+}
+
REGISTER_MBLOCK_CLASS(usrp_usb_interface);
diff --git a/usrp/host/lib/inband/usrp_usb_interface.h b/usrp/host/lib/inband/usrp_usb_interface.h
index c10741516..4d7750a7d 100644
--- a/usrp/host/lib/inband/usrp_usb_interface.h
+++ b/usrp/host/lib/inband/usrp_usb_interface.h
@@ -34,6 +34,9 @@ class usrp_usb_interface : public mb_mblock
usrp_standard_tx_sptr d_utx;
usrp_standard_rx_sptr d_urx;
+
+ boost::shared_ptr<usrp_basic> d_ub_tx;
+ boost::shared_ptr<usrp_basic> d_ub_rx;
mb_port_sptr d_cs;
mb_port_sptr d_rx_cs;
@@ -49,7 +52,7 @@ class usrp_usb_interface : public mb_mblock
long d_interp_tx;
long d_decim_rx;
- long d_rf_freq;
+ double d_rf_freq;
std::string d_rbf;
@@ -58,6 +61,9 @@ class usrp_usb_interface : public mb_mblock
~usrp_usb_interface();
void initial_transition();
void handle_message(mb_message_sptr msg);
+ usrp_subdev_spec pick_rx_subdevice();
+ usrp_subdev_spec pick_tx_subdevice();
+ usrp_subdev_spec pick_subdev(boost::shared_ptr<usrp_basic> d_usrp_basic, std::vector<int> candidates);
private:
void handle_cmd_open(pmt_t data);