summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-04-07 00:46:42 -0700
committerJosh Blum <josh@joshknows.com>2010-04-07 00:46:42 -0700
commitb66a74ff1f629af714e26040b410d472c08be522 (patch)
treee7a60cb4e3c3d113fd081c8df0d4405eb569f3dc /host/lib/usrp
parente6151334096167d1d26609f7233105020af91f40 (diff)
downloaduhd-b66a74ff1f629af714e26040b410d472c08be522.tar.gz
uhd-b66a74ff1f629af714e26040b410d472c08be522.tar.bz2
uhd-b66a74ff1f629af714e26040b410d472c08be522.zip
Reworked the spi part of the dboard interface.
It turns out to be more complicated. The integer type is better for holding the bits. The edges can be different, so the spi config hold 2 edge setting for mosi and miso.
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/dboard/db_rfx.cpp16
-rw-r--r--host/lib/usrp/dboard_interface.cpp53
-rw-r--r--host/lib/usrp/usrp2/dboard_interface.cpp95
-rw-r--r--host/lib/usrp/usrp2/fw_common.h7
4 files changed, 66 insertions, 105 deletions
diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp
index 57ea03da5..68fa51144 100644
--- a/host/lib/usrp/dboard/db_rfx.cpp
+++ b/host/lib/usrp/dboard/db_rfx.cpp
@@ -136,17 +136,11 @@ void rfx_xcvr::reload_adf4360_regs(void){
(adf4360_regs_t::ADDR_RCOUNTER)
;
BOOST_FOREACH(adf4360_regs_t::addr_t addr, addrs){
- boost::uint32_t reg = _adf4360_regs.get_reg(addr);
- dboard_interface::byte_vector_t spi_bytes = list_of
- ((reg >> 16) & 0xff)
- ((reg >> 8) & 0xff)
- ((reg >> 0) & 0xff)
- ;
- //this->get_interface.write_spi(
- // dboard_interface::SPI_DEV_TX,
- // dboard_interface::SPI_EDGE_FALL,
- // spi_bytes
- //);
+ this->get_interface()->write_spi(
+ dboard_interface::UNIT_TYPE_TX,
+ dboard_interface::spi_config_t::EDGE_RISE,
+ _adf4360_regs.get_reg(addr), 24
+ );
}
}
diff --git a/host/lib/usrp/dboard_interface.cpp b/host/lib/usrp/dboard_interface.cpp
deleted file mode 100644
index c40c9b398..000000000
--- a/host/lib/usrp/dboard_interface.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// 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_interface.hpp>
-
-using namespace uhd::usrp;
-
-dboard_interface::dboard_interface(void){
- /* NOP */
-}
-
-dboard_interface::~dboard_interface(void){
- /* NOP */
-}
-
-void dboard_interface::write_spi(
- spi_dev_t dev,
- spi_edge_t edge,
- const byte_vector_t &buf
-){
- transact_spi(dev, edge, buf, false); //dont readback
-}
-
-dboard_interface::byte_vector_t dboard_interface::read_spi(
- spi_dev_t dev,
- spi_edge_t edge,
- size_t num_bytes
-){
- byte_vector_t buf(num_bytes, 0x00); //dummy data
- return transact_spi(dev, edge, buf, true); //readback
-}
-
-dboard_interface::byte_vector_t dboard_interface::read_write_spi(
- spi_dev_t dev,
- spi_edge_t edge,
- const byte_vector_t &buf
-){
- return transact_spi(dev, edge, buf, true); //readback
-}
diff --git a/host/lib/usrp/usrp2/dboard_interface.cpp b/host/lib/usrp/usrp2/dboard_interface.cpp
index 6dd756420..eee7c087a 100644
--- a/host/lib/usrp/usrp2/dboard_interface.cpp
+++ b/host/lib/usrp/usrp2/dboard_interface.cpp
@@ -42,9 +42,35 @@ public:
double get_rx_clock_rate(void);
double get_tx_clock_rate(void);
+ void write_spi(
+ unit_type_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+ ){
+ transact_spi(unit, config, data, num_bits, false /*no rb*/);
+ }
+
+ boost::uint32_t read_spi(
+ unit_type_t unit,
+ const spi_config_t &config,
+ size_t num_bits
+ ){
+ return transact_spi(unit, config, 0, num_bits, true /*rb*/);
+ }
+
+ boost::uint32_t read_write_spi(
+ unit_type_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+ ){
+ return transact_spi(unit, config, data, num_bits, true /*rb*/);
+ }
+
private:
- byte_vector_t transact_spi(
- spi_dev_t, spi_edge_t, const byte_vector_t &, bool
+ boost::uint32_t transact_spi(
+ unit_type_t, const spi_config_t &, boost::uint32_t, size_t, bool
);
usrp2_impl *_impl;
@@ -136,17 +162,17 @@ void usrp2_dboard_interface::set_atr_reg(gpio_bank_t bank, atr_reg_t atr, boost:
* SPI
**********************************************************************/
/*!
- * Static function to convert a spi dev enum
- * to an over-the-wire value for the usrp2 control.
- * \param dev the dboard interface spi dev enum
+ * Static function to convert a unit type enum
+ * to an over-the-wire value for the spi device.
+ * \param unit the dboard interface unit type enum
* \return an over the wire representation
*/
-static boost::uint8_t spi_dev_to_otw(dboard_interface::spi_dev_t dev){
- switch(dev){
- case uhd::usrp::dboard_interface::SPI_DEV_TX: return SPI_SS_TX_DB;
- case uhd::usrp::dboard_interface::SPI_DEV_RX: return SPI_SS_RX_DB;
+static boost::uint8_t unit_to_otw_dev(dboard_interface::unit_type_t unit){
+ switch(unit){
+ case dboard_interface::UNIT_TYPE_TX: return SPI_SS_TX_DB;
+ case dboard_interface::UNIT_TYPE_RX: return SPI_SS_RX_DB;
}
- throw std::invalid_argument("unknown spi device type");
+ throw std::invalid_argument("unknown unit type type");
}
/*!
@@ -155,43 +181,36 @@ static boost::uint8_t spi_dev_to_otw(dboard_interface::spi_dev_t dev){
* \param edge the dboard interface spi edge enum
* \return an over the wire representation
*/
-static boost::uint8_t spi_edge_to_otw(dboard_interface::spi_edge_t edge){
+static boost::uint8_t spi_edge_to_otw(dboard_interface::spi_config_t::edge_t edge){
switch(edge){
- case uhd::usrp::dboard_interface::SPI_EDGE_RISE: return USRP2_CLK_EDGE_RISE;
- case uhd::usrp::dboard_interface::SPI_EDGE_FALL: return USRP2_CLK_EDGE_FALL;
+ case dboard_interface::spi_config_t::EDGE_RISE: return USRP2_CLK_EDGE_RISE;
+ case dboard_interface::spi_config_t::EDGE_FALL: return USRP2_CLK_EDGE_FALL;
}
throw std::invalid_argument("unknown spi edge type");
}
-dboard_interface::byte_vector_t usrp2_dboard_interface::transact_spi(
- spi_dev_t dev,
- spi_edge_t edge,
- const byte_vector_t &buf,
+boost::uint32_t usrp2_dboard_interface::transact_spi(
+ unit_type_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits,
bool readback
){
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO);
- out_data.data.spi_args.dev = spi_dev_to_otw(dev);
- out_data.data.spi_args.edge = spi_edge_to_otw(edge);
+ out_data.data.spi_args.dev = unit_to_otw_dev(unit);
+ out_data.data.spi_args.miso_edge = spi_edge_to_otw(config.miso_edge);
+ out_data.data.spi_args.mosi_edge = spi_edge_to_otw(config.mosi_edge);
out_data.data.spi_args.readback = (readback)? 1 : 0;
- out_data.data.spi_args.bytes = buf.size();
-
- //limitation of spi transaction size
- ASSERT_THROW(buf.size() <= sizeof(out_data.data.spi_args.data));
-
- //copy in the data
- std::copy(buf.begin(), buf.end(), out_data.data.spi_args.data);
+ out_data.data.spi_args.num_bits = num_bits;
+ out_data.data.spi_args.data = htonl(data);
//send and recv
usrp2_ctrl_data_t in_data = _impl->ctrl_send_and_recv(out_data);
ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE);
- ASSERT_THROW(in_data.data.spi_args.bytes == buf.size());
- //copy out the data
- byte_vector_t result(buf.size());
- std::copy(in_data.data.spi_args.data, in_data.data.spi_args.data + buf.size(), result.begin());
- return result;
+ return ntohl(out_data.data.spi_args.data);
}
/***********************************************************************
@@ -245,19 +264,19 @@ dboard_interface::byte_vector_t usrp2_dboard_interface::read_i2c(int i2c_addr, s
* \param unit the dboard interface unit type enum
* \return an over the wire representation
*/
-static boost::uint8_t spi_dev_to_otw(dboard_interface::unit_type_t unit){
+static boost::uint8_t unit_to_otw(dboard_interface::unit_type_t unit){
switch(unit){
- case uhd::usrp::dboard_interface::UNIT_TYPE_TX: return USRP2_DIR_TX;
- case uhd::usrp::dboard_interface::UNIT_TYPE_RX: return USRP2_DIR_RX;
+ case dboard_interface::UNIT_TYPE_TX: return USRP2_DIR_TX;
+ case dboard_interface::UNIT_TYPE_RX: return USRP2_DIR_RX;
}
throw std::invalid_argument("unknown unit type type");
}
-void usrp2_dboard_interface::write_aux_dac(dboard_interface::unit_type_t unit, int which, int value){
+void usrp2_dboard_interface::write_aux_dac(unit_type_t unit, int which, int value){
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_WRITE_THIS_TO_THE_AUX_DAC_BRO);
- out_data.data.aux_args.dir = spi_dev_to_otw(unit);
+ out_data.data.aux_args.dir = unit_to_otw(unit);
out_data.data.aux_args.which = which;
out_data.data.aux_args.value = htonl(value);
@@ -266,11 +285,11 @@ void usrp2_dboard_interface::write_aux_dac(dboard_interface::unit_type_t unit, i
ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_DONE_WITH_THAT_AUX_DAC_DUDE);
}
-int usrp2_dboard_interface::read_aux_adc(dboard_interface::unit_type_t unit, int which){
+int usrp2_dboard_interface::read_aux_adc(unit_type_t unit, int which){
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_READ_FROM_THIS_AUX_ADC_BRO);
- out_data.data.aux_args.dir = spi_dev_to_otw(unit);
+ out_data.data.aux_args.dir = unit_to_otw(unit);
out_data.data.aux_args.which = which;
//send and recv
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index 019f3b931..b600a2a70 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -110,10 +110,11 @@ typedef struct{
} dboard_ids;
struct {
_SINS_ uint8_t dev;
- _SINS_ uint8_t edge;
+ _SINS_ uint8_t miso_edge;
+ _SINS_ uint8_t mosi_edge;
_SINS_ uint8_t readback;
- _SINS_ uint8_t bytes;
- _SINS_ uint8_t data[sizeof(_SINS_ uint32_t)];
+ _SINS_ uint32_t data;
+ _SINS_ uint8_t num_bits;
} spi_args;
struct {
_SINS_ uint8_t addr;