summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2012-01-30 22:23:38 -0800
committerJosh Blum <josh@joshknows.com>2012-01-31 14:56:31 -0800
commitd46c176af34b728fd43b3dd46485b38623a7335e (patch)
tree4c93a5dc27c6c5213c858f6c4312d1195a44e32d /host/lib/usrp
parent781cafa8717f00b883a4543b4a9150060691eee3 (diff)
downloaduhd-d46c176af34b728fd43b3dd46485b38623a7335e.tar.gz
uhd-d46c176af34b728fd43b3dd46485b38623a7335e.tar.bz2
uhd-d46c176af34b728fd43b3dd46485b38623a7335e.zip
dsp rework: tx trailer, scaling work (peak)
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/b100/io_impl.cpp1
-rw-r--r--host/lib/usrp/cores/rx_dsp_core_200.cpp17
-rw-r--r--host/lib/usrp/cores/tx_dsp_core_200.cpp25
-rw-r--r--host/lib/usrp/e100/io_impl.cpp1
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp1
5 files changed, 32 insertions, 13 deletions
diff --git a/host/lib/usrp/b100/io_impl.cpp b/host/lib/usrp/b100/io_impl.cpp
index 6e9e017aa..9474268ef 100644
--- a/host/lib/usrp/b100/io_impl.cpp
+++ b/host/lib/usrp/b100/io_impl.cpp
@@ -263,6 +263,7 @@ tx_streamer::sptr b100_impl::get_tx_stream(const uhd::stream_args_t &args_){
//calculate packet size
static const size_t hdr_size = 0
+ vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- sizeof(vrt::if_packet_info_t().cid) //no class id ever used
;
static const size_t bpp = 2048 - hdr_size;
diff --git a/host/lib/usrp/cores/rx_dsp_core_200.cpp b/host/lib/usrp/cores/rx_dsp_core_200.cpp
index b2bf934bc..7b35daa42 100644
--- a/host/lib/usrp/cores/rx_dsp_core_200.cpp
+++ b/host/lib/usrp/cores/rx_dsp_core_200.cpp
@@ -63,8 +63,7 @@ public:
{
//init to something so update method has reasonable defaults
_scaling_adjustment = 1.0;
- _extra_scaling = 1.0;
- _fxpt_scalar_correction = 1.0;
+ _dsp_extra_scaling = 1.0;
//This is a hack/fix for the lingering packet problem.
//The caller should also flush the recv transports
@@ -187,14 +186,14 @@ public:
}
void update_scalar(void){
- const double target_scalar = (1 << 16)*_scaling_adjustment/_extra_scaling;
+ const double target_scalar = (1 << 16)*_scaling_adjustment/_dsp_extra_scaling;
const boost::int32_t actual_scalar = boost::math::iround(target_scalar);
_fxpt_scalar_correction = target_scalar/actual_scalar; //should be small
_iface->poke32(REG_DSP_RX_SCALE_IQ, actual_scalar);
}
double get_scaling_adjustment(void){
- return _fxpt_scalar_correction*_extra_scaling/32767.;
+ return _fxpt_scalar_correction*_host_extra_scaling/32767.;
}
double set_freq(const double freq_){
@@ -230,11 +229,15 @@ public:
unsigned format_word = 0;
if (stream_args.otw_format == "sc16"){
format_word = 0;
- _extra_scaling = 1.0;
+ _dsp_extra_scaling = 1.0;
+ _host_extra_scaling = 1.0;
}
else if (stream_args.otw_format == "sc8"){
format_word = (1 << 0);
- _extra_scaling = stream_args.args.cast<double>("scalar", 1.0);
+ double peak = stream_args.args.cast<double>("peak", 1.0);
+ peak = std::max(peak, 1.0/256);
+ _host_extra_scaling = peak*256;
+ _dsp_extra_scaling = peak*256;
}
else throw uhd::value_error("USRP RX cannot handle requested wire format: " + stream_args.otw_format);
@@ -248,7 +251,7 @@ private:
const size_t _dsp_base, _ctrl_base;
double _tick_rate, _link_rate;
bool _continuous_streaming;
- double _scaling_adjustment, _extra_scaling, _fxpt_scalar_correction;
+ double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling, _fxpt_scalar_correction;
const boost::uint32_t _sid;
};
diff --git a/host/lib/usrp/cores/tx_dsp_core_200.cpp b/host/lib/usrp/cores/tx_dsp_core_200.cpp
index 2c5b86bfc..15358e184 100644
--- a/host/lib/usrp/cores/tx_dsp_core_200.cpp
+++ b/host/lib/usrp/cores/tx_dsp_core_200.cpp
@@ -18,6 +18,7 @@
#include "tx_dsp_core_200.hpp"
#include <uhd/types/dict.hpp>
#include <uhd/exception.hpp>
+#include <uhd/utils/msg.hpp>
#include <uhd/utils/algorithm.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
@@ -35,6 +36,7 @@
#define REG_TX_CTRL_POLICY _ctrl_base + 12
#define REG_TX_CTRL_CYCLES_PER_UP _ctrl_base + 16
#define REG_TX_CTRL_PACKETS_PER_UP _ctrl_base + 20
+#define REG_TX_CTRL_FORMAT _ctrl_base + 24
#define FLAG_TX_CTRL_POLICY_WAIT (0x1 << 0)
#define FLAG_TX_CTRL_POLICY_NEXT_PACKET (0x1 << 1)
@@ -60,8 +62,7 @@ public:
{
//init to something so update method has reasonable defaults
_scaling_adjustment = 1.0;
- _extra_scaling = 1.0;
- _fxpt_scalar_correction = 1.0;
+ _dsp_extra_scaling = 1.0;
//init the tx control registers
this->clear();
@@ -134,14 +135,14 @@ public:
}
void update_scalar(void){
- const double target_scalar = (1 << 17)*_scaling_adjustment/_extra_scaling;
+ const double target_scalar = (1 << 17)*_scaling_adjustment/_dsp_extra_scaling;
const boost::int32_t actual_scalar = boost::math::iround(target_scalar);
_fxpt_scalar_correction = target_scalar/actual_scalar; //should be small
_iface->poke32(REG_DSP_TX_SCALE_IQ, actual_scalar);
}
double get_scaling_adjustment(void){
- return _fxpt_scalar_correction*_extra_scaling*32767.;
+ return _fxpt_scalar_correction*_host_extra_scaling*32767.;
}
double set_freq(const double freq_){
@@ -175,13 +176,25 @@ public:
void setup(const uhd::stream_args_t &stream_args){
if (not stream_args.args.has_key("noclear")) this->clear();
+ unsigned format_word = 0;
if (stream_args.otw_format == "sc16"){
- _extra_scaling = 1.0;
+ format_word = 0;
+ _dsp_extra_scaling = 1.0;
+ _host_extra_scaling = 1.0;
+ }
+ else if (stream_args.otw_format == "sc8"){
+ format_word = (1 << 0);
+ double peak = stream_args.args.cast<double>("peak", 1.0);
+ peak = std::max(peak, 1.0/256);
+ _host_extra_scaling = 1.0/peak/256;
+ _dsp_extra_scaling = 1.0/peak;
}
else throw uhd::value_error("USRP TX cannot handle requested wire format: " + stream_args.otw_format);
this->update_scalar();
+ _iface->poke32(REG_TX_CTRL_FORMAT, format_word);
+
if (stream_args.args.has_key("underflow_policy")){
this->set_underflow_policy(stream_args.args["underflow_policy"]);
}
@@ -191,7 +204,7 @@ private:
wb_iface::sptr _iface;
const size_t _dsp_base, _ctrl_base;
double _tick_rate, _link_rate;
- double _scaling_adjustment, _extra_scaling, _fxpt_scalar_correction;
+ double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling, _fxpt_scalar_correction;
const boost::uint32_t _sid;
};
diff --git a/host/lib/usrp/e100/io_impl.cpp b/host/lib/usrp/e100/io_impl.cpp
index 89a4ed00b..53f783a3f 100644
--- a/host/lib/usrp/e100/io_impl.cpp
+++ b/host/lib/usrp/e100/io_impl.cpp
@@ -339,6 +339,7 @@ tx_streamer::sptr e100_impl::get_tx_stream(const uhd::stream_args_t &args_){
//calculate packet size
static const size_t hdr_size = 0
+ vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- sizeof(vrt::if_packet_info_t().cid) //no class id ever used
;
static const size_t bpp = _data_transport->get_send_frame_size() - hdr_size;
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 58a5df2a5..6dcec6f1f 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -450,6 +450,7 @@ tx_streamer::sptr usrp2_impl::get_tx_stream(const uhd::stream_args_t &args_){
//calculate packet size
static const size_t hdr_size = 0
+ vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
+ vrt_send_header_offset_words32*sizeof(boost::uint32_t)
- sizeof(vrt::if_packet_info_t().cid) //no class id ever used
;