aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/usrp/dboard_iface.hpp76
-rw-r--r--host/lib/usrp/CMakeLists.txt1
-rw-r--r--host/lib/usrp/dboard/db_basic_and_lf.cpp2
-rw-r--r--host/lib/usrp/dboard_iface.cpp78
-rw-r--r--host/lib/usrp/dboard_manager.cpp2
-rw-r--r--host/lib/usrp/usrp1/dboard_iface.cpp16
-rw-r--r--host/lib/usrp/usrp2/dboard_iface.cpp16
-rw-r--r--host/lib/usrp/usrp_e100/dboard_iface.cpp16
8 files changed, 172 insertions, 35 deletions
diff --git a/host/include/uhd/usrp/dboard_iface.hpp b/host/include/uhd/usrp/dboard_iface.hpp
index c430ecd3f..b04756c47 100644
--- a/host/include/uhd/usrp/dboard_iface.hpp
+++ b/host/include/uhd/usrp/dboard_iface.hpp
@@ -19,6 +19,7 @@
#define INCLUDED_UHD_USRP_DBOARD_IFACE_HPP
#include <uhd/config.hpp>
+#include <uhd/utils/pimpl.hpp>
#include <uhd/types/serial.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/cstdint.hpp>
@@ -114,38 +115,83 @@ public:
/*!
* Set a daughterboard output pin control source.
- * By default, the outputs are all GPIO controlled.
*
* \param unit which unit rx or tx
* \param value 16-bits, 0=GPIO controlled, 1=ATR controlled
+ * \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_pin_ctrl(unit_t unit, boost::uint16_t value) = 0;
+ virtual void set_pin_ctrl(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask = 0xffff
+ );
+
+ /*!
+ * Read back the pin control setting.
+ *
+ * \param unit which unit rx or tx
+ * \return the 16-bit settings value
+ */
+ virtual boost::uint16_t get_pin_ctrl(unit_t unit);
/*!
* Set a daughterboard ATR register.
*
* \param unit which unit rx or tx
- * \param reg which ATR register to set
+ * \param reg which ATR register
* \param value 16-bits, 0=ATR output low, 1=ATR output high
+ * \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_atr_reg(unit_t unit, atr_reg_t reg, boost::uint16_t value) = 0;
+ virtual void set_atr_reg(
+ unit_t unit, atr_reg_t reg, boost::uint16_t value, boost::uint16_t mask = 0xffff
+ );
/*!
- * Set daughterboard GPIO data direction register.
- * By default, the GPIO pins are all inputs.
+ * Read back an ATR register setting.
+ *
+ * \param unit which unit rx or tx
+ * \param reg which ATR register
+ * \return the 16-bit settings value
+ */
+ virtual boost::uint16_t get_atr_reg(unit_t unit, atr_reg_t reg);
+
+ /*!
+ * Set daughterboard GPIO data direction setting.
*
* \param unit which unit rx or tx
* \param value 16-bits, 0=GPIO input, 1=GPIO output
+ * \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void set_gpio_ddr(unit_t unit, boost::uint16_t value) = 0;
+ virtual void set_gpio_ddr(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask = 0xffff
+ );
/*!
- * Read daughterboard GPIO pin values.
+ * Read back the GPIO data direction setting.
+ *
+ * \param unit which unit rx or tx
+ * \return the 16-bit settings value
+ */
+ virtual boost::uint16_t get_gpio_ddr(unit_t unit);
+
+ /*!
+ * Set daughterboard GPIO pin output setting.
*
* \param unit which unit rx or tx
* \param value 16-bits, 0=GPIO output low, 1=GPIO output high
+ * \param mask 16-bits, 0=do not change, 1=change value
*/
- virtual void write_gpio(unit_t unit, boost::uint16_t value) = 0;
+ virtual void set_gpio_out(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask = 0xffff
+ );
+
+ /*!
+ * Read back the GPIO pin output setting.
+ *
+ * \param unit which unit rx or tx
+ * \return the 16-bit settings value
+ */
+ virtual boost::uint16_t get_gpio_out(unit_t unit);
+
+ UHD_DEPRECATED void write_gpio(unit_t unit, boost::uint16_t value){set_gpio_out(unit, value);}
/*!
* Setup the GPIO debug mux.
@@ -251,6 +297,18 @@ public:
* \return the codec rate in Hz
*/
virtual double get_codec_rate(unit_t unit) = 0;
+
+private:
+ UHD_PIMPL_DECL(impl) _impl;
+
+ virtual void _set_pin_ctrl(unit_t unit, boost::uint16_t value) = 0;
+ virtual void _set_atr_reg(unit_t unit, atr_reg_t reg, boost::uint16_t value) = 0;
+ virtual void _set_gpio_ddr(unit_t unit, boost::uint16_t value) = 0;
+ virtual void _set_gpio_out(unit_t unit, boost::uint16_t value) = 0;
+
+protected:
+ dboard_iface(void);
+
};
}} //namespace
diff --git a/host/lib/usrp/CMakeLists.txt b/host/lib/usrp/CMakeLists.txt
index 073b3c80b..bd26d29a1 100644
--- a/host/lib/usrp/CMakeLists.txt
+++ b/host/lib/usrp/CMakeLists.txt
@@ -21,6 +21,7 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_SOURCE_DIR}/lib/usrp/dboard_base.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/dboard_eeprom.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/dboard_id.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/dboard_iface.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/dboard_manager.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/dsp_utils.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/mboard_eeprom.cpp
diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp
index 73f894374..f771595b6 100644
--- a/host/lib/usrp/dboard/db_basic_and_lf.cpp
+++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp
@@ -110,7 +110,7 @@ basic_rx::basic_rx(ctor_args_t args, double max_freq) : rx_dboard_base(args){
//set GPIOs to output 0x0000 to decrease noise pickup
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0000);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0xFFFF);
- this->get_iface()->write_gpio(dboard_iface::UNIT_RX, 0x0000);
+ this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, 0x0000);
}
basic_rx::~basic_rx(void){
diff --git a/host/lib/usrp/dboard_iface.cpp b/host/lib/usrp/dboard_iface.cpp
new file mode 100644
index 000000000..5cc5ea470
--- /dev/null
+++ b/host/lib/usrp/dboard_iface.cpp
@@ -0,0 +1,78 @@
+//
+// Copyright 2010 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
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include <uhd/usrp/dboard_iface.hpp>
+#include <uhd/types/dict.hpp>
+
+using namespace uhd::usrp;
+
+struct dboard_iface::impl{
+ uhd::dict<unit_t, boost::uint16_t> pin_ctrl_shadow;
+ uhd::dict<unit_t, uhd::dict<atr_reg_t, boost::uint16_t> > atr_reg_shadow;
+ uhd::dict<unit_t, boost::uint16_t> gpio_ddr_shadow;
+ uhd::dict<unit_t, boost::uint16_t> gpio_out_shadow;
+};
+
+dboard_iface::dboard_iface(void){
+ _impl = UHD_PIMPL_MAKE(impl, ());
+}
+
+template <typename T>
+static T shadow_it(T &shadow, const T &value, const T &mask){
+ shadow = (shadow & ~mask) | (value & mask);
+ return shadow;
+}
+
+void dboard_iface::set_pin_ctrl(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask
+){
+ _set_pin_ctrl(unit, shadow_it(_impl->pin_ctrl_shadow[unit], value, mask));
+}
+
+boost::uint16_t dboard_iface::get_pin_ctrl(unit_t unit){
+ return _impl->pin_ctrl_shadow[unit];
+}
+
+void dboard_iface::set_atr_reg(
+ unit_t unit, atr_reg_t reg, boost::uint16_t value, boost::uint16_t mask
+){
+ _set_atr_reg(unit, reg, shadow_it(_impl->atr_reg_shadow[unit][reg], value, mask));
+}
+
+boost::uint16_t dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg){
+ return _impl->atr_reg_shadow[unit][reg];
+}
+
+void dboard_iface::set_gpio_ddr(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask
+){
+ _set_gpio_ddr(unit, shadow_it(_impl->gpio_ddr_shadow[unit], value, mask));
+}
+
+boost::uint16_t dboard_iface::get_gpio_ddr(unit_t unit){
+ return _impl->gpio_ddr_shadow[unit];
+}
+
+void dboard_iface::set_gpio_out(
+ unit_t unit, boost::uint16_t value, boost::uint16_t mask
+){
+ _set_gpio_out(unit, shadow_it(_impl->gpio_out_shadow[unit], value, mask));
+}
+
+boost::uint16_t dboard_iface::get_gpio_out(unit_t unit){
+ return _impl->gpio_out_shadow[unit];
+}
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index 5a98bb8eb..72bfd89e8 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -327,7 +327,7 @@ void dboard_manager_impl::set_nice_dboard_if(void){
//set nice settings on each unit
BOOST_FOREACH(dboard_iface::unit_t unit, units){
_iface->set_gpio_ddr(unit, 0x0000); //all inputs
- _iface->write_gpio(unit, 0x0000); //all low
+ _iface->set_gpio_out(unit, 0x0000); //all low
_iface->set_pin_ctrl(unit, 0x0000); //all gpio
_iface->set_clock_enabled(unit, false); //clock off
}
diff --git a/host/lib/usrp/usrp1/dboard_iface.cpp b/host/lib/usrp/usrp1/dboard_iface.cpp
index 1ac15a46a..70ce3da76 100644
--- a/host/lib/usrp/usrp1/dboard_iface.cpp
+++ b/host/lib/usrp/usrp1/dboard_iface.cpp
@@ -75,10 +75,10 @@ public:
void write_aux_dac(unit_t, aux_dac_t, float);
float read_aux_adc(unit_t, aux_adc_t);
- void set_pin_ctrl(unit_t, boost::uint16_t);
- void set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
- void set_gpio_ddr(unit_t, boost::uint16_t);
- void write_gpio(unit_t, boost::uint16_t);
+ void _set_pin_ctrl(unit_t, boost::uint16_t);
+ void _set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
+ void _set_gpio_ddr(unit_t, boost::uint16_t);
+ void _set_gpio_out(unit_t, boost::uint16_t);
void set_gpio_debug(unit_t, int);
boost::uint16_t read_gpio(unit_t);
@@ -184,7 +184,7 @@ double usrp1_dboard_iface::get_codec_rate(unit_t){
/***********************************************************************
* GPIO
**********************************************************************/
-void usrp1_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value)
+void usrp1_dboard_iface::_set_pin_ctrl(unit_t unit, boost::uint16_t value)
{
switch(unit) {
case UNIT_RX:
@@ -202,7 +202,7 @@ void usrp1_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value)
}
}
-void usrp1_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value)
+void usrp1_dboard_iface::_set_gpio_ddr(unit_t unit, boost::uint16_t value)
{
switch(unit) {
case UNIT_RX:
@@ -220,7 +220,7 @@ void usrp1_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value)
}
}
-void usrp1_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value)
+void usrp1_dboard_iface::_set_gpio_out(unit_t unit, boost::uint16_t value)
{
switch(unit) {
case UNIT_RX:
@@ -263,7 +263,7 @@ boost::uint16_t usrp1_dboard_iface::read_gpio(unit_t unit)
UHD_ASSERT_THROW(false);
}
-void usrp1_dboard_iface::set_atr_reg(unit_t unit,
+void usrp1_dboard_iface::_set_atr_reg(unit_t unit,
atr_reg_t atr, boost::uint16_t value)
{
// Ignore unsupported states
diff --git a/host/lib/usrp/usrp2/dboard_iface.cpp b/host/lib/usrp/usrp2/dboard_iface.cpp
index ab5f62355..54c1c735c 100644
--- a/host/lib/usrp/usrp2/dboard_iface.cpp
+++ b/host/lib/usrp/usrp2/dboard_iface.cpp
@@ -47,10 +47,10 @@ public:
void write_aux_dac(unit_t, aux_dac_t, float);
float read_aux_adc(unit_t, aux_adc_t);
- void set_pin_ctrl(unit_t, boost::uint16_t);
- void set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
- void set_gpio_ddr(unit_t, boost::uint16_t);
- void write_gpio(unit_t, boost::uint16_t);
+ void _set_pin_ctrl(unit_t, boost::uint16_t);
+ void _set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
+ void _set_gpio_ddr(unit_t, boost::uint16_t);
+ void _set_gpio_out(unit_t, boost::uint16_t);
void set_gpio_debug(unit_t, int);
boost::uint16_t read_gpio(unit_t);
@@ -170,7 +170,7 @@ static const uhd::dict<dboard_iface::unit_t, int> unit_to_shift = map_list_of
(dboard_iface::UNIT_TX, 16)
;
-void usrp2_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value){
+void usrp2_dboard_iface::_set_pin_ctrl(unit_t unit, boost::uint16_t value){
//calculate the new selection mux setting
boost::uint32_t new_sels = 0x0;
for(size_t i = 0; i < 16; i++){
@@ -185,14 +185,14 @@ void usrp2_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value){
}
}
-void usrp2_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value){
+void usrp2_dboard_iface::_set_gpio_ddr(unit_t unit, boost::uint16_t value){
_ddr_shadow = \
(_ddr_shadow & ~(0xffff << unit_to_shift[unit])) |
(boost::uint32_t(value) << unit_to_shift[unit]);
_iface->poke32(_iface->regs.gpio_ddr, _ddr_shadow);
}
-void usrp2_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value){
+void usrp2_dboard_iface::_set_gpio_out(unit_t unit, boost::uint16_t value){
_gpio_shadow = \
(_gpio_shadow & ~(0xffff << unit_to_shift[unit])) |
(boost::uint32_t(value) << unit_to_shift[unit]);
@@ -203,7 +203,7 @@ boost::uint16_t usrp2_dboard_iface::read_gpio(unit_t unit){
return boost::uint16_t(_iface->peek32(_iface->regs.gpio_io) >> unit_to_shift[unit]);
}
-void usrp2_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){
+void usrp2_dboard_iface::_set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){
//define mapping of unit to atr regs to register address
static const uhd::dict<
unit_t, uhd::dict<atr_reg_t, boost::uint32_t>
diff --git a/host/lib/usrp/usrp_e100/dboard_iface.cpp b/host/lib/usrp/usrp_e100/dboard_iface.cpp
index aa96171d6..a5032f86f 100644
--- a/host/lib/usrp/usrp_e100/dboard_iface.cpp
+++ b/host/lib/usrp/usrp_e100/dboard_iface.cpp
@@ -63,10 +63,10 @@ public:
void write_aux_dac(unit_t, aux_dac_t, float);
float read_aux_adc(unit_t, aux_adc_t);
- void set_pin_ctrl(unit_t, boost::uint16_t);
- void set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
- void set_gpio_ddr(unit_t, boost::uint16_t);
- void write_gpio(unit_t, boost::uint16_t);
+ void _set_pin_ctrl(unit_t, boost::uint16_t);
+ void _set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
+ void _set_gpio_ddr(unit_t, boost::uint16_t);
+ void _set_gpio_out(unit_t, boost::uint16_t);
void set_gpio_debug(unit_t, int);
boost::uint16_t read_gpio(unit_t);
@@ -148,7 +148,7 @@ double usrp_e100_dboard_iface::get_codec_rate(unit_t){
/***********************************************************************
* GPIO
**********************************************************************/
-void usrp_e100_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value){
+void usrp_e100_dboard_iface::_set_pin_ctrl(unit_t unit, boost::uint16_t value){
UHD_ASSERT_THROW(GPIO_SEL_ATR == 1); //make this assumption
switch(unit){
case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_SEL, value); return;
@@ -156,14 +156,14 @@ void usrp_e100_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value){
}
}
-void usrp_e100_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value){
+void usrp_e100_dboard_iface::_set_gpio_ddr(unit_t unit, boost::uint16_t value){
switch(unit){
case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_DDR, value); return;
case UNIT_TX: _iface->poke16(UE_REG_GPIO_TX_DDR, value); return;
}
}
-void usrp_e100_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value){
+void usrp_e100_dboard_iface::_set_gpio_out(unit_t unit, boost::uint16_t value){
switch(unit){
case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_IO, value); return;
case UNIT_TX: _iface->poke16(UE_REG_GPIO_TX_IO, value); return;
@@ -178,7 +178,7 @@ boost::uint16_t usrp_e100_dboard_iface::read_gpio(unit_t unit){
}
}
-void usrp_e100_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){
+void usrp_e100_dboard_iface::_set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){
//define mapping of unit to atr regs to register address
static const uhd::dict<
unit_t, uhd::dict<atr_reg_t, boost::uint32_t>