aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp1/dsp_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp1/dsp_impl.cpp')
-rw-r--r--host/lib/usrp/usrp1/dsp_impl.cpp77
1 files changed, 48 insertions, 29 deletions
diff --git a/host/lib/usrp/usrp1/dsp_impl.cpp b/host/lib/usrp/usrp1/dsp_impl.cpp
index ba05fa6ed..573bce21f 100644
--- a/host/lib/usrp/usrp1/dsp_impl.cpp
+++ b/host/lib/usrp/usrp1/dsp_impl.cpp
@@ -21,6 +21,8 @@
#include <uhd/usrp/dsp_props.hpp>
#include <boost/bind.hpp>
#include <boost/format.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/assign/list_of.hpp>
#include <iostream>
#include <cmath>
@@ -42,8 +44,9 @@ void usrp1_impl::rx_dsp_init(void)
/***********************************************************************
* RX DDC Get
**********************************************************************/
-void usrp1_impl::rx_dsp_get(const wax::obj &key, wax::obj &val)
-{
+void usrp1_impl::rx_dsp_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
switch(key.as<dsp_prop_t>()){
case DSP_PROP_NAME:
val = str(boost::format("usrp1 ddc %uX %s")
@@ -57,7 +60,16 @@ void usrp1_impl::rx_dsp_get(const wax::obj &key, wax::obj &val)
return;
case DSP_PROP_FREQ_SHIFT:
- val = _rx_dsp_freq;
+ val = _rx_dsp_freqs[key.name];
+ return;
+
+ case DSP_PROP_FREQ_SHIFT_NAMES:{
+ prop_names_t names;
+ for(size_t i = 0; i < this->get_num_ddcs(); i++){
+ names.push_back(boost::lexical_cast<std::string>(i));
+ }
+ val = names;
+ }
return;
case DSP_PROP_CODEC_RATE:
@@ -76,25 +88,22 @@ void usrp1_impl::rx_dsp_get(const wax::obj &key, wax::obj &val)
/***********************************************************************
* RX DDC Set
**********************************************************************/
-void usrp1_impl::rx_dsp_set(const wax::obj &key, const wax::obj &val)
-{
+void usrp1_impl::rx_dsp_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
switch(key.as<dsp_prop_t>()) {
case DSP_PROP_FREQ_SHIFT: {
double new_freq = val.as<double>();
boost::uint32_t reg_word = dsp_type1::calc_cordic_word_and_update(
new_freq, _clock_ctrl->get_master_clock_freq());
- //TODO TODO TODO TODO TODO TODO TODO TODO TODO
- //
- // Handle multiple receive channels / DDC's
- //
- //TODO TODO TODO TODO TODO TODO TODO TODO TODO
- _iface->poke32(FR_RX_FREQ_0, reg_word);
- _iface->poke32(FR_RX_FREQ_1, reg_word);
- _iface->poke32(FR_RX_FREQ_2, reg_word);
- _iface->poke32(FR_RX_FREQ_3, reg_word);
-
- _rx_dsp_freq = new_freq;
+ static const uhd::dict<std::string, boost::uint32_t>
+ freq_name_to_reg_val = boost::assign::map_list_of
+ ("0", FR_RX_FREQ_0) ("1", FR_RX_FREQ_1)
+ ("2", FR_RX_FREQ_2) ("3", FR_RX_FREQ_3)
+ ;
+ _iface->poke32(freq_name_to_reg_val[key.name], reg_word);
+ _rx_dsp_freqs[key.name] = new_freq;
return;
}
case DSP_PROP_HOST_RATE: {
@@ -136,8 +145,9 @@ void usrp1_impl::tx_dsp_init(void)
/***********************************************************************
* TX DUC Get
**********************************************************************/
-void usrp1_impl::tx_dsp_get(const wax::obj &key, wax::obj &val)
-{
+void usrp1_impl::tx_dsp_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
switch(key.as<dsp_prop_t>()) {
case DSP_PROP_NAME:
val = str(boost::format("usrp1 duc %uX %s")
@@ -151,7 +161,16 @@ void usrp1_impl::tx_dsp_get(const wax::obj &key, wax::obj &val)
return;
case DSP_PROP_FREQ_SHIFT:
- val = _tx_dsp_freq;
+ val = _tx_dsp_freqs[key.name];
+ return;
+
+ case DSP_PROP_FREQ_SHIFT_NAMES:{
+ prop_names_t names;
+ for(size_t i = 0; i < this->get_num_ducs(); i++){
+ names.push_back(boost::lexical_cast<std::string>(i));
+ }
+ val = names;
+ }
return;
case DSP_PROP_CODEC_RATE:
@@ -170,20 +189,20 @@ void usrp1_impl::tx_dsp_get(const wax::obj &key, wax::obj &val)
/***********************************************************************
* TX DUC Set
**********************************************************************/
-void usrp1_impl::tx_dsp_set(const wax::obj &key, const wax::obj &val)
-{
+void usrp1_impl::tx_dsp_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
switch(key.as<dsp_prop_t>()) {
- //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
- //
- // Set both codec frequencies until we have duality properties
- //
- //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
case DSP_PROP_FREQ_SHIFT: {
double new_freq = val.as<double>();
- _codec_ctrls[DBOARD_SLOT_A]->set_duc_freq(new_freq);
- _codec_ctrls[DBOARD_SLOT_B]->set_duc_freq(new_freq);
- _tx_dsp_freq = new_freq;
+
+ //map the freq shift key to a subdev spec to a particular codec chip
+ std::string db_name = _tx_subdev_spec.at(boost::lexical_cast<size_t>(key.name)).db_name;
+ if (db_name == "A") _codec_ctrls[DBOARD_SLOT_A]->set_duc_freq(new_freq);
+ if (db_name == "B") _codec_ctrls[DBOARD_SLOT_B]->set_duc_freq(new_freq);
+
+ _tx_dsp_freqs[key.name] = new_freq;
return;
}