aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp1
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp1')
-rw-r--r--host/lib/usrp/usrp1/clock_ctrl.cpp9
-rw-r--r--host/lib/usrp/usrp1/codec_ctrl.cpp18
-rw-r--r--host/lib/usrp/usrp1/codec_impl.cpp2
-rw-r--r--host/lib/usrp/usrp1/dboard_iface.cpp12
-rw-r--r--host/lib/usrp/usrp1/dboard_impl.cpp2
-rw-r--r--host/lib/usrp/usrp1/dsp_impl.cpp95
-rw-r--r--host/lib/usrp/usrp1/io_impl.cpp3
-rw-r--r--host/lib/usrp/usrp1/mboard_impl.cpp22
-rw-r--r--host/lib/usrp/usrp1/usrp1_ctrl.cpp206
-rw-r--r--host/lib/usrp/usrp1/usrp1_ctrl.hpp47
-rw-r--r--host/lib/usrp/usrp1/usrp1_iface.cpp38
-rw-r--r--host/lib/usrp/usrp1/usrp1_iface.hpp39
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.cpp14
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.hpp16
14 files changed, 202 insertions, 321 deletions
diff --git a/host/lib/usrp/usrp1/clock_ctrl.cpp b/host/lib/usrp/usrp1/clock_ctrl.cpp
index 156f2b0c4..df5353b54 100644
--- a/host/lib/usrp/usrp1/clock_ctrl.cpp
+++ b/host/lib/usrp/usrp1/clock_ctrl.cpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -16,13 +16,6 @@
//
#include "clock_ctrl.hpp"
-#include "fpga_regs_standard.h"
-#include <uhd/utils/assert.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/assign/list_of.hpp>
-#include <boost/foreach.hpp>
-#include <utility>
-#include <iostream>
using namespace uhd;
diff --git a/host/lib/usrp/usrp1/codec_ctrl.cpp b/host/lib/usrp/usrp1/codec_ctrl.cpp
index f3816b377..1b4411002 100644
--- a/host/lib/usrp/usrp1/codec_ctrl.cpp
+++ b/host/lib/usrp/usrp1/codec_ctrl.cpp
@@ -20,7 +20,7 @@
#include "clock_ctrl.hpp"
#include "ad9862_regs.hpp"
#include <uhd/types/dict.hpp>
-#include <uhd/utils/assert.hpp>
+#include <uhd/exception.hpp>
#include <uhd/utils/algorithm.hpp>
#include <uhd/utils/byteswap.hpp>
#include <boost/cstdint.hpp>
@@ -162,7 +162,7 @@ static const int mtpgw = 255; //maximum tx pga gain word
void usrp1_codec_ctrl_impl::set_tx_pga_gain(double gain){
int gain_word = int(mtpgw*(gain - tx_pga_gain_range.start())/(tx_pga_gain_range.stop() - tx_pga_gain_range.start()));
- _ad9862_regs.tx_pga_gain = std::clip(gain_word, 0, mtpgw);
+ _ad9862_regs.tx_pga_gain = uhd::clip(gain_word, 0, mtpgw);
this->send_reg(16);
}
@@ -174,7 +174,7 @@ static const int mrpgw = 0x14; //maximum rx pga gain word
void usrp1_codec_ctrl_impl::set_rx_pga_gain(double gain, char which){
int gain_word = int(mrpgw*(gain - rx_pga_gain_range.start())/(rx_pga_gain_range.stop() - rx_pga_gain_range.start()));
- gain_word = std::clip(gain_word, 0, mrpgw);
+ gain_word = uhd::clip(gain_word, 0, mrpgw);
switch(which){
case 'A':
_ad9862_regs.rx_pga_a = gain_word;
@@ -264,7 +264,7 @@ void usrp1_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts)
{
//special case for aux dac d (aka sigma delta word)
if (which == AUX_DAC_D) {
- boost::uint16_t dac_word = std::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff);
+ boost::uint16_t dac_word = uhd::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff);
_ad9862_regs.sig_delt_11_4 = boost::uint8_t(dac_word >> 4);
_ad9862_regs.sig_delt_3_0 = boost::uint8_t(dac_word & 0xf);
this->send_reg(42);
@@ -273,7 +273,7 @@ void usrp1_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts)
}
//calculate the dac word for aux dac a, b, c
- boost::uint8_t dac_word = std::clip(boost::math::iround(volts*0xff/3.3), 0, 0xff);
+ boost::uint8_t dac_word = uhd::clip(boost::math::iround(volts*0xff/3.3), 0, 0xff);
//setup a lookup table for the aux dac params (reg ref, reg addr)
typedef boost::tuple<boost::uint8_t*, boost::uint8_t> dac_params_t;
@@ -303,8 +303,8 @@ void usrp1_codec_ctrl_impl::send_reg(boost::uint8_t addr)
std::cout << "codec control write reg: 0x";
std::cout << std::setw(8) << std::hex << reg << std::endl;
}
- _iface->transact_spi(_spi_slave,
- spi_config_t::EDGE_RISE, reg, 16, false);
+ _iface->write_spi(_spi_slave,
+ spi_config_t::EDGE_RISE, reg, 16);
}
void usrp1_codec_ctrl_impl::recv_reg(boost::uint8_t addr)
@@ -317,8 +317,8 @@ void usrp1_codec_ctrl_impl::recv_reg(boost::uint8_t addr)
std::cout << std::setw(8) << std::hex << reg << std::endl;
}
- boost::uint32_t ret = _iface->transact_spi(_spi_slave,
- spi_config_t::EDGE_RISE, reg, 16, true);
+ boost::uint32_t ret = _iface->read_spi(_spi_slave,
+ spi_config_t::EDGE_RISE, reg, 16);
if (codec_debug) {
std::cout.fill('0');
diff --git a/host/lib/usrp/usrp1/codec_impl.cpp b/host/lib/usrp/usrp1/codec_impl.cpp
index 14ecd2d2e..7e4032131 100644
--- a/host/lib/usrp/usrp1/codec_impl.cpp
+++ b/host/lib/usrp/usrp1/codec_impl.cpp
@@ -16,7 +16,7 @@
//
#include "usrp1_impl.hpp"
-#include <uhd/utils/assert.hpp>
+#include <uhd/exception.hpp>
#include <uhd/usrp/codec_props.hpp>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
diff --git a/host/lib/usrp/usrp1/dboard_iface.cpp b/host/lib/usrp/usrp1/dboard_iface.cpp
index eec4a52db..3f3a98b7a 100644
--- a/host/lib/usrp/usrp1/dboard_iface.cpp
+++ b/host/lib/usrp/usrp1/dboard_iface.cpp
@@ -24,7 +24,7 @@
#include "codec_ctrl.hpp"
#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/types/dict.hpp>
-#include <uhd/utils/assert.hpp>
+#include <uhd/utils/assert_has.hpp>
#include <boost/assign/list_of.hpp>
#include <iostream>
@@ -329,7 +329,7 @@ static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit,
else
break;
}
- throw std::invalid_argument("unknown unit type");
+ UHD_THROW_INVALID_CODE_PATH();
}
void usrp1_dboard_iface::write_spi(unit_t unit,
@@ -337,8 +337,8 @@ void usrp1_dboard_iface::write_spi(unit_t unit,
boost::uint32_t data,
size_t num_bits)
{
- _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
- config, data, num_bits, false);
+ _iface->write_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
+ config, data, num_bits);
}
boost::uint32_t usrp1_dboard_iface::read_write_spi(unit_t unit,
@@ -346,8 +346,8 @@ boost::uint32_t usrp1_dboard_iface::read_write_spi(unit_t unit,
boost::uint32_t data,
size_t num_bits)
{
- return _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
- config, data, num_bits, true);
+ return _iface->read_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
+ config, data, num_bits);
}
/***********************************************************************
diff --git a/host/lib/usrp/usrp1/dboard_impl.cpp b/host/lib/usrp/usrp1/dboard_impl.cpp
index 2130960fb..02906fc45 100644
--- a/host/lib/usrp/usrp1/dboard_impl.cpp
+++ b/host/lib/usrp/usrp1/dboard_impl.cpp
@@ -19,7 +19,7 @@
#include "usrp_i2c_addr.h"
#include <uhd/usrp/dsp_utils.hpp>
#include <uhd/usrp/misc_utils.hpp>
-#include <uhd/utils/assert.hpp>
+#include <uhd/exception.hpp>
#include <uhd/usrp/dboard_props.hpp>
#include <uhd/usrp/subdev_props.hpp>
#include <boost/bind.hpp>
diff --git a/host/lib/usrp/usrp1/dsp_impl.cpp b/host/lib/usrp/usrp1/dsp_impl.cpp
index 370f4831f..8152c4e34 100644
--- a/host/lib/usrp/usrp1/dsp_impl.cpp
+++ b/host/lib/usrp/usrp1/dsp_impl.cpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010 Ettus Research LLC
+// Copyright 2010-2011 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -34,23 +34,25 @@ using namespace uhd::usrp;
**********************************************************************/
void usrp1_impl::rx_dsp_init(void)
{
- _rx_dsp_proxy = wax_obj_proxy::make(
- boost::bind(&usrp1_impl::rx_dsp_get, this, _1, _2),
- boost::bind(&usrp1_impl::rx_dsp_set, this, _1, _2));
-
- rx_dsp_set(DSP_PROP_HOST_RATE, _clock_ctrl->get_master_clock_freq() / 16);
+ for (size_t i = 0; i < this->get_num_ddcs(); i++){
+ _rx_dsp_proxies[str(boost::format("DSP%d")%i)] = wax_obj_proxy::make(
+ boost::bind(&usrp1_impl::rx_dsp_get, this, _1, _2, i),
+ boost::bind(&usrp1_impl::rx_dsp_set, this, _1, _2, i)
+ );
+ rx_dsp_set(DSP_PROP_HOST_RATE, _clock_ctrl->get_master_clock_freq() / 16, i);
+ }
}
/***********************************************************************
* 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, size_t which_dsp){
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")
- % this->get_num_ddcs()
+ val = str(boost::format("usrp1 ddc%d %s")
+ % which_dsp
% (this->has_rx_halfband()? "+ hb" : "")
);
return;
@@ -60,16 +62,7 @@ void usrp1_impl::rx_dsp_get(const wax::obj &key_, wax::obj &val){
return;
case DSP_PROP_FREQ_SHIFT:
- 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;
- }
+ val = _rx_dsp_freqs[which_dsp];
return;
case DSP_PROP_CODEC_RATE:
@@ -88,7 +81,7 @@ 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, size_t which_dsp){
named_prop_t key = named_prop_t::extract(key_);
switch(key.as<dsp_prop_t>()) {
@@ -97,16 +90,17 @@ void usrp1_impl::rx_dsp_set(const wax::obj &key_, const wax::obj &val){
boost::uint32_t reg_word = dsp_type1::calc_cordic_word_and_update(
new_freq, _clock_ctrl->get_master_clock_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 + 1);
- _rx_dsp_freqs[key.name] = new_freq;
+ static const boost::uint32_t dsp_index_to_reg_val[4] = {
+ FR_RX_FREQ_0, FR_RX_FREQ_1, FR_RX_FREQ_2, FR_RX_FREQ_3
+ };
+ _iface->poke32(dsp_index_to_reg_val[which_dsp], ~reg_word + 1);
+ _rx_dsp_freqs[which_dsp] = new_freq;
return;
}
- case DSP_PROP_HOST_RATE: {
+
+ case DSP_PROP_HOST_RATE:
+ if (which_dsp != 0) return; //only for dsp[0] as this is vectorized
+ {
size_t rate = size_t(_clock_ctrl->get_master_clock_freq() / val.as<double>());
if ((rate & 0x01) || (rate < 4) || (rate > 256)) {
@@ -123,6 +117,11 @@ void usrp1_impl::rx_dsp_set(const wax::obj &key_, const wax::obj &val){
}
return;
+ case DSP_PROP_STREAM_CMD:
+ if (which_dsp != 0) return; //only for dsp[0] as this is vectorized
+ _soft_time_ctrl->issue_stream_cmd(val.as<stream_cmd_t>());
+ return;
+
default: UHD_THROW_PROP_SET_ERROR();
}
@@ -133,24 +132,25 @@ void usrp1_impl::rx_dsp_set(const wax::obj &key_, const wax::obj &val){
**********************************************************************/
void usrp1_impl::tx_dsp_init(void)
{
- _tx_dsp_proxy = wax_obj_proxy::make(
- boost::bind(&usrp1_impl::tx_dsp_get, this, _1, _2),
- boost::bind(&usrp1_impl::tx_dsp_set, this, _1, _2));
-
- //initial config and update
- tx_dsp_set(DSP_PROP_HOST_RATE, _clock_ctrl->get_master_clock_freq() * 2 / 16);
+ for (size_t i = 0; i < this->get_num_ducs(); i++){
+ _tx_dsp_proxies[str(boost::format("DSP%d")%i)] = wax_obj_proxy::make(
+ boost::bind(&usrp1_impl::tx_dsp_get, this, _1, _2, i),
+ boost::bind(&usrp1_impl::tx_dsp_set, this, _1, _2, i)
+ );
+ tx_dsp_set(DSP_PROP_HOST_RATE, _clock_ctrl->get_master_clock_freq() / 16, i);
+ }
}
/***********************************************************************
* 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, size_t which_dsp){
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")
- % this->get_num_ducs()
+ val = str(boost::format("usrp1 duc%d %s")
+ % which_dsp
% (this->has_tx_halfband()? "+ hb" : "")
);
return;
@@ -160,16 +160,7 @@ void usrp1_impl::tx_dsp_get(const wax::obj &key_, wax::obj &val){
return;
case DSP_PROP_FREQ_SHIFT:
- 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;
- }
+ val = _tx_dsp_freqs[which_dsp];
return;
case DSP_PROP_CODEC_RATE:
@@ -188,7 +179,7 @@ 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, size_t which_dsp){
named_prop_t key = named_prop_t::extract(key_);
switch(key.as<dsp_prop_t>()) {
@@ -197,15 +188,17 @@ void usrp1_impl::tx_dsp_set(const wax::obj &key_, const wax::obj &val){
double new_freq = val.as<double>();
//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;
+ std::string db_name = _tx_subdev_spec.at(which_dsp).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;
+ _tx_dsp_freqs[which_dsp] = new_freq;
return;
}
- case DSP_PROP_HOST_RATE: {
+ case DSP_PROP_HOST_RATE:
+ if (which_dsp != 0) return; //only for dsp[0] as this is vectorized
+ {
size_t rate = size_t(_clock_ctrl->get_master_clock_freq() * 2 / val.as<double>());
if ((rate & 0x01) || (rate < 8) || (rate > 512)) {
diff --git a/host/lib/usrp/usrp1/io_impl.cpp b/host/lib/usrp/usrp1/io_impl.cpp
index 8beeccf8f..b3268298e 100644
--- a/host/lib/usrp/usrp1/io_impl.cpp
+++ b/host/lib/usrp/usrp1/io_impl.cpp
@@ -18,6 +18,7 @@
#include "../../transport/vrt_packet_handler.hpp"
#include "usrp_commands.h"
#include "usrp1_impl.hpp"
+#include <uhd/utils/safe_call.hpp>
#include <uhd/utils/thread_priority.hpp>
#include <uhd/transport/bounded_buffer.hpp>
#include <boost/bind.hpp>
@@ -114,7 +115,7 @@ struct usrp1_impl::io_impl{
}
~io_impl(void){
- flush_send_buff();
+ UHD_SAFE_CALL(flush_send_buff();)
}
zero_copy_if::sptr data_transport;
diff --git a/host/lib/usrp/usrp1/mboard_impl.cpp b/host/lib/usrp/usrp1/mboard_impl.cpp
index 6d5bf466d..4e2fad6e5 100644
--- a/host/lib/usrp/usrp1/mboard_impl.cpp
+++ b/host/lib/usrp/usrp1/mboard_impl.cpp
@@ -25,7 +25,7 @@
#include <uhd/usrp/dboard_props.hpp>
#include <uhd/usrp/subdev_props.hpp>
#include <uhd/utils/warning.hpp>
-#include <uhd/utils/assert.hpp>
+#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/images.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/foreach.hpp>
@@ -161,7 +161,7 @@ static boost::uint32_t calc_tx_mux(
//sanity check, only 1 channel per slot
slot_to_chan_count[pair.db_name]++;
if (slot_to_chan_count[pair.db_name] > 1){
- throw std::runtime_error(str(boost::format(
+ throw uhd::value_error(str(boost::format(
"dboard slot %s assigned to multiple channels in subdev spec %s"
) % pair.db_name % subdev_spec.to_string()));
}
@@ -280,21 +280,19 @@ void usrp1_impl::mboard_get(const wax::obj &key_, wax::obj &val)
return;
case MBOARD_PROP_RX_DSP:
- UHD_ASSERT_THROW(key.name == "");
- val = _rx_dsp_proxy->get_link();
+ val = _rx_dsp_proxies.get(key.name)->get_link();
return;
case MBOARD_PROP_RX_DSP_NAMES:
- val = prop_names_t(1, "");
+ val = _rx_dsp_proxies.keys();
return;
case MBOARD_PROP_TX_DSP:
- UHD_ASSERT_THROW(key.name == "");
- val = _tx_dsp_proxy->get_link();
+ val = _tx_dsp_proxies.get(key.name)->get_link();
return;
case MBOARD_PROP_TX_DSP_NAMES:
- val = prop_names_t(1, "");
+ val = _tx_dsp_proxies.keys();
return;
case MBOARD_PROP_CLOCK_CONFIG:
@@ -342,14 +340,10 @@ void usrp1_impl::mboard_set(const wax::obj &key, const wax::obj &val)
//handle the get request conditioned on the key
switch(key.as<mboard_prop_t>()){
- case MBOARD_PROP_STREAM_CMD:
- _soft_time_ctrl->issue_stream_cmd(val.as<stream_cmd_t>());
- return;
-
case MBOARD_PROP_RX_SUBDEV_SPEC:
_rx_subdev_spec = val.as<subdev_spec_t>();
if (_rx_subdev_spec.size() > this->get_num_ddcs()){
- throw std::runtime_error(str(boost::format(
+ throw uhd::value_error(str(boost::format(
"USRP1 suports up to %u RX channels.\n"
"However, this RX subdev spec requires %u channels\n"
) % this->get_num_ddcs() % _rx_subdev_spec.size()));
@@ -362,7 +356,7 @@ void usrp1_impl::mboard_set(const wax::obj &key, const wax::obj &val)
case MBOARD_PROP_TX_SUBDEV_SPEC:
_tx_subdev_spec = val.as<subdev_spec_t>();
if (_tx_subdev_spec.size() > this->get_num_ducs()){
- throw std::runtime_error(str(boost::format(
+ throw uhd::value_error(str(boost::format(
"USRP1 suports up to %u TX channels.\n"
"However, this TX subdev spec requires %u channels\n"
) % this->get_num_ducs() % _tx_subdev_spec.size()));
diff --git a/host/lib/usrp/usrp1/usrp1_ctrl.cpp b/host/lib/usrp/usrp1/usrp1_ctrl.cpp
index 09f854813..3fa6cb8b7 100644
--- a/host/lib/usrp/usrp1/usrp1_ctrl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_ctrl.cpp
@@ -16,7 +16,8 @@
//
#include "usrp1_ctrl.hpp"
-#include "usrp_commands.h"
+#include "usrp_commands.h"
+#include <uhd/exception.hpp>
#include <uhd/transport/usb_control.hpp>
#include <boost/functional/hash.hpp>
#include <boost/thread/thread.hpp>
@@ -29,13 +30,6 @@
using namespace uhd;
-enum firmware_code {
- USRP_FPGA_LOAD_SUCCESS,
- USRP_FPGA_ALREADY_LOADED,
- USRP_FIRMWARE_LOAD_SUCCESS,
- USRP_FIRMWARE_ALREADY_LOADED
-};
-
#define FX2_FIRMWARE_LOAD 0xa0
static const bool load_img_msg = true;
@@ -45,15 +39,16 @@ static const bool load_img_msg = true;
**********************************************************************/
/*!
* Create a file hash
- * The hash will be used to identify the loaded firmware and fpga image
+ * The hash will be used to identify the loaded firmware and fpga image
* \param filename file used to generate hash value
* \return hash value in a size_t type
*/
static size_t generate_hash(const char *filename)
{
std::ifstream file(filename);
- if (!file)
- std::cerr << "error: cannot open input file " << filename << std::endl;
+ if (not file){
+ throw uhd::io_error(std::string("cannot open input file ") + filename);
+ }
size_t hash = 0;
@@ -62,18 +57,19 @@ static size_t generate_hash(const char *filename)
boost::hash_combine(hash, ch);
}
- if (!file.eof())
- std::cerr << "error: file error " << filename << std::endl;
+ if (not file.eof()){
+ throw uhd::io_error(std::string("file error ") + filename);
+ }
- file.close();
- return hash;
+ file.close();
+ return hash;
}
/*!
- * Verify checksum of a Intel HEX record
+ * Verify checksum of a Intel HEX record
* \param record a line from an Intel HEX file
- * \return true if record is valid, false otherwise
+ * \return true if record is valid, false otherwise
*/
static bool checksum(std::string *record)
{
@@ -123,7 +119,7 @@ bool parse_record(std::string *record, unsigned int &len,
for (i = 0; i < len; i++) {
std::istringstream(record->substr(9 + 2 * i, 2)) >> std::hex >> val;
data[i] = (unsigned char) val;
- }
+ }
return true;
}
@@ -139,20 +135,15 @@ public:
_ctrl_transport = ctrl_transport;
}
- int usrp_load_firmware(std::string filestring, bool force)
+ void usrp_load_firmware(std::string filestring, bool force)
{
const char *filename = filestring.c_str();
size_t hash = generate_hash(filename);
- size_t loaded_hash;
- if (usrp_get_firmware_hash(loaded_hash) < 0) {
- std::cerr << "firmware hash retrieval failed" << std::endl;
- return -1;
- }
+ size_t loaded_hash; usrp_get_firmware_hash(loaded_hash);
- if (!force && (hash == loaded_hash))
- return USRP_FIRMWARE_ALREADY_LOADED;
+ if (not force and (hash == loaded_hash)) return;
//FIXME: verify types
unsigned int len;
@@ -160,13 +151,11 @@ public:
unsigned int type;
unsigned char data[512];
- int ret;
std::ifstream file;
file.open(filename, std::ifstream::in);
if (!file.good()) {
- std::cerr << "cannot open firmware input file" << std::endl;
- return -1;
+ throw uhd::io_error("usrp_load_firmware: cannot open firmware input file");
}
unsigned char reset_y = 1;
@@ -174,56 +163,41 @@ public:
//hit the reset line
if (load_img_msg) std::cout << "Loading firmware image: " << filestring << "..." << std::flush;
- usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0,
- &reset_y, 1);
-
+ usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_y, 1);
+
while (!file.eof()) {
std::string record;
file >> record;
-
- //check for valid record
- if (!checksum(&record) ||
- !parse_record(&record, len, addr, type, data)) {
- std::cerr << "error: bad record" << std::endl;
- file.close();
- return -1;
+
+ //check for valid record
+ if (not checksum(&record) or not parse_record(&record, len, addr, type, data)) {
+ throw uhd::io_error("usrp_load_firmware: bad record checksum");
}
//type 0x00 is data
if (type == 0x00) {
- ret = usrp_control_write(FX2_FIRMWARE_LOAD, addr, 0,
- data, len);
- if (ret < 0) {
- std::cerr << "error: usrp_control_write failed: ";
- std::cerr << ret << std::endl;
- file.close();
- return -1;
- }
- }
- //type 0x01 is end
+ int ret = usrp_control_write(FX2_FIRMWARE_LOAD, addr, 0, data, len);
+ if (ret < 0) throw uhd::io_error("usrp_load_firmware: usrp_control_write failed");
+ }
+ //type 0x01 is end
else if (type == 0x01) {
usrp_set_firmware_hash(hash); //set hash before reset
- usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0,
- &reset_n, 1);
+ usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_n, 1);
file.close();
//wait for things to settle
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
if (load_img_msg) std::cout << " done" << std::endl;
- return USRP_FIRMWARE_LOAD_SUCCESS;
+ return;
}
//type anything else is unhandled
else {
- std::cerr << "error: unsupported record" << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_firmware: unsupported record");
}
}
- //file did not end
- std::cerr << "error: bad record" << std::endl;
- file.close();
- return -1;
+ //file did not end
+ throw uhd::io_error("usrp_load_firmware: bad record");
}
void usrp_init(void){
@@ -241,64 +215,48 @@ public:
usrp_tx_enable(true);
}
- int usrp_load_fpga(std::string filestring)
+ void usrp_load_fpga(std::string filestring)
{
const char *filename = filestring.c_str();
size_t hash = generate_hash(filename);
- size_t loaded_hash;
- if (usrp_get_fpga_hash(loaded_hash) < 0) {
- std::cerr << "fpga hash retrieval failed" << std::endl;
- return -1;
- }
+ size_t loaded_hash; usrp_get_fpga_hash(loaded_hash);
- if (hash == loaded_hash)
- return USRP_FPGA_ALREADY_LOADED;
+ if (hash == loaded_hash) return;
const int ep0_size = 64;
unsigned char buf[ep0_size];
- int ret;
if (load_img_msg) std::cout << "Loading FPGA image: " << filestring << "..." << std::flush;
std::ifstream file;
file.open(filename, std::ios::in | std::ios::binary);
if (not file.good()) {
- std::cerr << "cannot open fpga input file" << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_fpga: cannot open fpga input file");
}
if (usrp_control_write_cmd(VRQ_FPGA_LOAD, 0, FL_BEGIN) < 0) {
- std::cerr << "fpga load error" << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_fpga: fpga load error");
}
while (not file.eof()) {
file.read((char *)buf, sizeof(buf));
size_t n = file.gcount();
- ret = usrp_control_write(VRQ_FPGA_LOAD, 0, FL_XFER,
- buf, n);
+ int ret = usrp_control_write(VRQ_FPGA_LOAD, 0, FL_XFER, buf, n);
if (ret < 0 or size_t(ret) != n) {
- std::cerr << "fpga load error " << ret << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_fpga: fpga load error");
}
}
-
+
if (usrp_control_write_cmd(VRQ_FPGA_LOAD, 0, FL_END) < 0) {
- std::cerr << "fpga load error" << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_fpga: fpga load error");
}
usrp_set_fpga_hash(hash);
file.close();
if (load_img_msg) std::cout << " done" << std::endl;
- return 0;
}
- int usrp_load_eeprom(std::string filestring)
+ void usrp_load_eeprom(std::string filestring)
{
const char *filename = filestring.c_str();
const boost::uint16_t i2c_addr = 0x50;
@@ -309,100 +267,92 @@ public:
unsigned char data[256];
unsigned char sendbuf[17];
- int ret;
std::ifstream file;
file.open(filename, std::ifstream::in);
- if (!file.good()) {
- std::cerr << "cannot open EEPROM input file" << std::endl;
- return -1;
+ if (not file.good()) {
+ throw uhd::io_error("usrp_load_eeprom: cannot open EEPROM input file");
}
file.read((char *)data, 256);
len = file.gcount();
if(len == 256) {
- std::cerr << "error: image size too large" << std::endl;
- file.close();
- return -1;
+ throw uhd::io_error("usrp_load_eeprom: image size too large");
}
const int pagesize = 16;
addr = 0;
while(len > 0) {
- sendbuf[0] = addr;
- memcpy(sendbuf+1, &data[addr], len > pagesize ? pagesize : len);
- ret = usrp_i2c_write(i2c_addr, sendbuf, (len > pagesize ? pagesize : len)+1);
- if (ret < 0) {
- std::cerr << "error: usrp_i2c_write failed: ";
- std::cerr << ret << std::endl;
- file.close();
- return -1;
- }
- addr += pagesize;
- len -= pagesize;
- boost::this_thread::sleep(boost::posix_time::milliseconds(100));
+ sendbuf[0] = addr;
+ memcpy(sendbuf+1, &data[addr], len > pagesize ? pagesize : len);
+ int ret = usrp_i2c_write(i2c_addr, sendbuf, (len > pagesize ? pagesize : len)+1);
+ if (ret < 0) {
+ throw uhd::io_error("usrp_load_eeprom: usrp_i2c_write failed");
+ }
+ addr += pagesize;
+ len -= pagesize;
+ boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
file.close();
- return 0;
}
- int usrp_set_led(int led_num, bool on)
+ void usrp_set_led(int led_num, bool on)
{
- return usrp_control_write_cmd(VRQ_SET_LED, on, led_num);
+ UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_SET_LED, on, led_num) >= 0);
}
- int usrp_get_firmware_hash(size_t &hash)
+ void usrp_get_firmware_hash(size_t &hash)
{
- return usrp_control_read(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t));
+ UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
+ (unsigned char*) &hash, sizeof(size_t)) >= 0);
}
- int usrp_set_firmware_hash(size_t hash)
+ void usrp_set_firmware_hash(size_t hash)
{
- return usrp_control_write(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t));
+ UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
+ (unsigned char*) &hash, sizeof(size_t)) >= 0);
}
- int usrp_get_fpga_hash(size_t &hash)
+ void usrp_get_fpga_hash(size_t &hash)
{
- return usrp_control_read(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t));
+ UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
+ (unsigned char*) &hash, sizeof(size_t)) >= 0);
}
- int usrp_set_fpga_hash(size_t hash)
+ void usrp_set_fpga_hash(size_t hash)
{
- return usrp_control_write(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(size_t));
+ UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
+ (unsigned char*) &hash, sizeof(size_t)) >= 0);
}
- int usrp_tx_enable(bool on)
+ void usrp_tx_enable(bool on)
{
- return usrp_control_write_cmd(VRQ_FPGA_SET_TX_ENABLE, on, 0);
+ UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_TX_ENABLE, on, 0) >= 0);
}
- int usrp_rx_enable(bool on)
+ void usrp_rx_enable(bool on)
{
- return usrp_control_write_cmd(VRQ_FPGA_SET_RX_ENABLE, on, 0);
+ UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_RX_ENABLE, on, 0) >= 0);
}
- int usrp_tx_reset(bool on)
+ void usrp_tx_reset(bool on)
{
- return usrp_control_write_cmd(VRQ_FPGA_SET_TX_RESET, on, 0);
+ UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_TX_RESET, on, 0) >= 0);
}
- int usrp_rx_reset(bool on)
+ void usrp_rx_reset(bool on)
{
- return usrp_control_write_cmd(VRQ_FPGA_SET_RX_RESET, on, 0);
+ UHD_ASSERT_THROW(usrp_control_write_cmd(VRQ_FPGA_SET_RX_RESET, on, 0) >= 0);
}
@@ -417,7 +367,7 @@ public:
value, // wValue
index, // wIndex
buff, // data
- length); // wLength
+ length); // wLength
}
diff --git a/host/lib/usrp/usrp1/usrp1_ctrl.hpp b/host/lib/usrp/usrp1/usrp1_ctrl.hpp
index 8ccfacab7..ee68f8401 100644
--- a/host/lib/usrp/usrp1/usrp1_ctrl.hpp
+++ b/host/lib/usrp/usrp1/usrp1_ctrl.hpp
@@ -40,60 +40,21 @@ public:
* Load firmware in Intel HEX Format onto device
* \param filename name of firmware file
* \param force reload firmware if already loaded
- * \return 0 on success, error code otherwise
*/
- virtual int usrp_load_firmware(std::string filename,
+ virtual void usrp_load_firmware(std::string filename,
bool force = false) = 0;
/*!
* Load fpga file onto usrp
* \param filename name of fpga image
- * \return 0 on success, error code otherwise
*/
- virtual int usrp_load_fpga(std::string filename) = 0;
+ virtual void usrp_load_fpga(std::string filename) = 0;
/*!
* Load USB descriptor file in Intel HEX format into EEPROM
- * \param filename name of EEPROM image
- * \return 0 on success, error code otherwise
+ * \param filename name of EEPROM image
*/
- virtual int usrp_load_eeprom(std::string filestring) = 0;
-
- /*!
- * Set led usrp
- * \param led_num which LED to control (0 or 1)
- * \param on turn LED on or off
- * \return 0 on success, error code otherwise
- */
- virtual int usrp_set_led(int led_num, bool on) = 0;
-
- /*!
- * Get firmware hash
- * \param hash a size_t hash value
- * \return 0 on success, error code otherwise
- */
- virtual int usrp_get_firmware_hash(size_t &hash) = 0;
-
- /*!
- * Set firmware hash
- * \param hash a size_t hash value
- * \return 0 on success, error code otherwise
- */
- virtual int usrp_set_firmware_hash(size_t hash) = 0;
-
- /*!
- * Get fpga hash
- * \param hash a size_t hash value
- * \return 0 on success, error code otherwise
- */
- virtual int usrp_get_fpga_hash(size_t &hash) = 0;
-
- /*!
- * Set fpga hash
- * \param hash a size_t hash value
- * \return 0 on success, error code otherwise
- */
- virtual int usrp_set_fpga_hash(size_t hash) = 0;
+ virtual void usrp_load_eeprom(std::string filestring) = 0;
/*!
* Submit an IN transfer
diff --git a/host/lib/usrp/usrp1/usrp1_iface.cpp b/host/lib/usrp/usrp1/usrp1_iface.cpp
index 63fcd5777..0c37610ce 100644
--- a/host/lib/usrp/usrp1/usrp1_iface.cpp
+++ b/host/lib/usrp/usrp1/usrp1_iface.cpp
@@ -17,7 +17,7 @@
#include "usrp1_iface.hpp"
#include "usrp_commands.h"
-#include <uhd/utils/assert.hpp>
+#include <uhd/exception.hpp>
#include <uhd/utils/byteswap.hpp>
#include <boost/format.hpp>
#include <stdexcept>
@@ -70,8 +70,7 @@ public:
(unsigned char*) &swapped,
sizeof(boost::uint32_t));
- if (ret < 0)
- std::cerr << "USRP: failed memory write: " << ret << std::endl;
+ if (ret < 0) throw uhd::io_error("USRP1: failed control write");
}
boost::uint32_t peek32(boost::uint32_t addr)
@@ -88,11 +87,27 @@ public:
(unsigned char*) &value_out,
sizeof(boost::uint32_t));
- if (ret < 0)
- std::cerr << "USRP: failed memory read: " << ret << std::endl;
+ if (ret < 0) throw uhd::io_error("USRP1: failed control read");
return uhd::ntohx(value_out);
}
+
+ void poke16(boost::uint32_t, boost::uint16_t) {
+ throw uhd::not_implemented_error("Unhandled command poke16()");
+ }
+
+ boost::uint16_t peek16(boost::uint32_t) {
+ throw uhd::not_implemented_error("Unhandled command peek16()");
+ return 0;
+ }
+
+ void write_uart(boost::uint8_t, const std::string &) {
+ throw uhd::not_implemented_error("Unhandled command write_uart()");
+ }
+
+ std::string read_uart(boost::uint8_t) {
+ throw uhd::not_implemented_error("Unhandled command read_uart()");
+ }
/*******************************************************************
* I2C
@@ -176,10 +191,7 @@ public:
buff,
(w_len_h << 8) | (w_len_l << 0));
- if (ret < 0) {
- std::cout << "USRP: failed SPI readback transaction: "
- << std::dec << ret << std::endl;
- }
+ if (ret < 0) throw uhd::io_error("USRP1: failed SPI readback transaction");
boost::uint32_t val = (((boost::uint32_t)buff[0]) << 0) |
(((boost::uint32_t)buff[1]) << 8) |
@@ -197,10 +209,7 @@ public:
(w_index_h << 8) | (w_index_l << 0),
buff, num_bytes);
- if (ret < 0) {
- std::cout << "USRP: failed SPI transaction: "
- << std::dec << ret << std::endl;
- }
+ if (ret < 0) throw uhd::io_error("USRP1: failed SPI transaction");
return 0;
}
@@ -234,8 +243,7 @@ public:
length);
}
- if (ret < 0)
- std::cerr << "USRP: failed firmware command: " << ret << std::endl;
+ if (ret < 0) throw uhd::io_error("USRP1: failed firmware command");
}
private:
diff --git a/host/lib/usrp/usrp1/usrp1_iface.hpp b/host/lib/usrp/usrp1/usrp1_iface.hpp
index 34a2330b5..fdb7464ce 100644
--- a/host/lib/usrp/usrp1/usrp1_iface.hpp
+++ b/host/lib/usrp/usrp1/usrp1_iface.hpp
@@ -18,8 +18,7 @@
#ifndef INCLUDED_USRP1_IFACE_HPP
#define INCLUDED_USRP1_IFACE_HPP
-#include <uhd/usrp/mboard_eeprom.hpp>
-#include <uhd/types/serial.hpp>
+#include <uhd/usrp/mboard_iface.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
#include "usrp1_ctrl.hpp"
@@ -29,10 +28,13 @@
* Provides a set of functions to implementation layer.
* Including spi, peek, poke, control...
*/
-class usrp1_iface : boost::noncopyable, public uhd::i2c_iface{
+class usrp1_iface : public uhd::usrp::mboard_iface, boost::noncopyable{
public:
typedef boost::shared_ptr<usrp1_iface> sptr;
+ //motherboard eeprom map structure
+ uhd::usrp::mboard_eeprom_t mb_eeprom;
+
/*!
* Make a new usrp1 interface with the control transport.
* \param ctrl_transport the usrp controller object
@@ -41,35 +43,6 @@ public:
static sptr make(usrp_ctrl::sptr ctrl_transport);
/*!
- * Write a register (32 bits)
- * \param addr the address
- * \param data the 32bit data
- */
- virtual void poke32(boost::uint32_t addr, boost::uint32_t data) = 0;
-
- /*!
- * Read a register (32 bits)
- * \param addr the address
- * \return the 32bit data
- */
- virtual boost::uint32_t peek32(boost::uint32_t addr) = 0;
-
- /*!
- * Perform an spi transaction.
- * \param which_slave the slave device number
- * \param config spi config args
- * \param data the bits to write
- * \param num_bits how many bits in data
- * \param readback true to readback a value
- * \return spi data if readback set
- */
- virtual boost::uint32_t transact_spi(int which_slave,
- const uhd::spi_config_t &config,
- boost::uint32_t data,
- size_t num_bits,
- bool readback) = 0;
-
- /*!
* Perform a general USB firmware OUT operation
* \param request
* \param value
@@ -82,8 +55,6 @@ public:
boost::uint16_t index,
unsigned char* buff,
boost::uint16_t length) = 0;
-
- uhd::usrp::mboard_eeprom_t mb_eeprom;
};
#endif /* INCLUDED_USRP1_IFACE_HPP */
diff --git a/host/lib/usrp/usrp1/usrp1_impl.cpp b/host/lib/usrp/usrp1/usrp1_impl.cpp
index 918032037..7005c59f2 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.cpp
@@ -19,11 +19,12 @@
#include "usrp1_ctrl.hpp"
#include "fpga_regs_standard.h"
#include "usrp_spi_defs.h"
+#include <uhd/utils/safe_call.hpp>
#include <uhd/transport/usb_control.hpp>
#include <uhd/usrp/device_props.hpp>
#include <uhd/usrp/mboard_props.hpp>
#include <uhd/utils/warning.hpp>
-#include <uhd/utils/assert.hpp>
+#include <uhd/exception.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/utils/images.hpp>
#include <boost/format.hpp>
@@ -199,7 +200,16 @@ usrp1_impl::usrp1_impl(uhd::transport::usb_zero_copy::sptr data_transport,
}
usrp1_impl::~usrp1_impl(void){
- /* NOP */
+ //Safely destruct all RAII objects in a device.
+ //This prevents the mboard deconstructor from throwing,
+ //which allows the device to be safely deconstructed.
+ BOOST_FOREACH(dboard_slot_t slot, _dboard_slots){
+ UHD_SAFE_CALL(_dboard_managers[slot].reset();)
+ UHD_SAFE_CALL(_dboard_ifaces[slot].reset();)
+ UHD_SAFE_CALL(_codec_ctrls[slot].reset();)
+ }
+ UHD_SAFE_CALL(_clock_ctrl.reset();)
+ UHD_SAFE_CALL(_io_impl.reset();)
}
bool usrp1_impl::recv_async_msg(uhd::async_metadata_t &, double timeout){
diff --git a/host/lib/usrp/usrp1/usrp1_impl.hpp b/host/lib/usrp/usrp1/usrp1_impl.hpp
index 1d9f6709f..9755c466d 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.hpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.hpp
@@ -182,19 +182,19 @@ private:
//rx dsp functions and settings
void rx_dsp_init(void);
- void rx_dsp_get(const wax::obj &, wax::obj &);
- void rx_dsp_set(const wax::obj &, const wax::obj &);
- uhd::dict<std::string, double> _rx_dsp_freqs;
+ void rx_dsp_get(const wax::obj &, wax::obj &, size_t);
+ void rx_dsp_set(const wax::obj &, const wax::obj &, size_t);
+ uhd::dict<size_t, double> _rx_dsp_freqs;
size_t _rx_dsp_decim;
- wax_obj_proxy::sptr _rx_dsp_proxy;
+ uhd::dict<std::string, wax_obj_proxy::sptr> _rx_dsp_proxies;
//tx dsp functions and settings
void tx_dsp_init(void);
- void tx_dsp_get(const wax::obj &, wax::obj &);
- void tx_dsp_set(const wax::obj &, const wax::obj &);
- uhd::dict<std::string, double> _tx_dsp_freqs;
+ void tx_dsp_get(const wax::obj &, wax::obj &, size_t);
+ void tx_dsp_set(const wax::obj &, const wax::obj &, size_t);
+ uhd::dict<size_t, double> _tx_dsp_freqs;
size_t _tx_dsp_interp;
- wax_obj_proxy::sptr _tx_dsp_proxy;
+ uhd::dict<std::string, wax_obj_proxy::sptr> _tx_dsp_proxies;
//transports
uhd::transport::usb_zero_copy::sptr _data_transport;