summaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-11-26 23:27:53 -0500
committerJosh Blum <josh@joshknows.com>2010-11-26 23:27:53 -0500
commit9a2e26e5004d3f740c9690ad8b0b85debcb51c7a (patch)
tree00f1027792da8c466fffd6743cca4f915ca70b40 /host/lib
parent2568efd1ead77cd6c459e8f2580466a923bb4ba7 (diff)
downloaduhd-9a2e26e5004d3f740c9690ad8b0b85debcb51c7a.tar.gz
uhd-9a2e26e5004d3f740c9690ad8b0b85debcb51c7a.tar.bz2
uhd-9a2e26e5004d3f740c9690ad8b0b85debcb51c7a.zip
uhd: added read-back calls to dboard iface gpio settings, and optional mask
Diffstat (limited to 'host/lib')
-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
7 files changed, 105 insertions, 26 deletions
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>