diff options
-rw-r--r-- | firmware/microblaze/apps/txrx.c | 33 | ||||
-rw-r--r-- | host/include/uhd/usrp/dboard/interface.hpp | 48 | ||||
-rw-r--r-- | host/include/uhd/usrp/mboard/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/include/uhd/usrp/mboard/test.hpp | 46 | ||||
-rw-r--r-- | host/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/usrp/dboard/interface.cpp | 26 | ||||
-rw-r--r-- | host/lib/usrp/dboard/manager.cpp | 12 | ||||
-rw-r--r-- | host/lib/usrp/mboard/test.cpp | 188 | ||||
-rw-r--r-- | host/lib/usrp/mboard/usrp2/dboard_interface.cpp | 88 | ||||
-rw-r--r-- | host/lib/usrp/mboard/usrp2/dboard_interface.hpp | 16 | ||||
-rw-r--r-- | host/lib/usrp/mboard/usrp2/fw_common.h | 22 | ||||
-rw-r--r-- | host/lib/usrp/usrp.cpp | 4 | ||||
-rw-r--r-- | host/test/CMakeLists.txt | 2 | ||||
-rw-r--r-- | host/test/device_test.cpp | 44 | ||||
-rw-r--r-- | host/test/usrp_dboard_test.cpp | 60 |
15 files changed, 224 insertions, 367 deletions
diff --git a/firmware/microblaze/apps/txrx.c b/firmware/microblaze/apps/txrx.c index abea1bf0c..fde7529ac 100644 --- a/firmware/microblaze/apps/txrx.c +++ b/firmware/microblaze/apps/txrx.c @@ -157,7 +157,7 @@ void handle_udp_data_packet( } #define OTW_GPIO_BANK_TO_NUM(bank) \ - (((bank) == USRP2_GPIO_BANK_RX)? (GPIO_RX_BANK) : (GPIO_TX_BANK)) + (((bank) == USRP2_DIR_RX)? (GPIO_RX_BANK) : (GPIO_TX_BANK)) void handle_udp_ctrl_packet( struct socket_address src, struct socket_address dst, @@ -288,6 +288,37 @@ void handle_udp_ctrl_packet( } break; + /******************************************************************* + * SPI + ******************************************************************/ + case USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO:{ + uint8_t num_bytes = ctrl_data_in->data.spi_args.bytes; + + //load the data from the array of bytes + uint32_t data = 0x0; + for (size_t i = 0; i < num_bytes; i++){ + data = (data << 8) | ctrl_data_in->data.spi_args.data[i]; + } + + //transact + uint32_t result = spi_transact( + (ctrl_data_in->data.spi_args.readback == 0)? SPI_TXONLY : SPI_TXRX, + (ctrl_data_in->data.spi_args.dev == USRP2_DIR_RX)? SPI_SS_RX_DB : SPI_SS_TX_DB, + data, num_bytes*8, //length in bits + (ctrl_data_in->data.spi_args.push == USRP2_CLK_EDGE_RISE)? SPIF_PUSH_RISE : SPIF_PUSH_FALL | + (ctrl_data_in->data.spi_args.latch == USRP2_CLK_EDGE_RISE)? SPIF_LATCH_RISE : SPIF_LATCH_FALL + ); + + //load the result into the array of bytes + for (size_t i = 0; i < num_bytes; i++){ + uint8_t byte_shift = num_bytes - i - 1; + ctrl_data_out.data.spi_args.data[i] = (result >> (byte_shift*8)) & 0xff; + } + ctrl_data_out.data.spi_args.bytes = num_bytes; + ctrl_data_out.id = USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE; + } + break; + default: ctrl_data_out.id = USRP2_CTRL_ID_HUH_WHAT; diff --git a/host/include/uhd/usrp/dboard/interface.hpp b/host/include/uhd/usrp/dboard/interface.hpp index 68669b99d..e066f2061 100644 --- a/host/include/uhd/usrp/dboard/interface.hpp +++ b/host/include/uhd/usrp/dboard/interface.hpp @@ -19,6 +19,7 @@ #define INCLUDED_UHD_USRP_DBOARD_INTERFACE_HPP #include <boost/shared_ptr.hpp> +#include <vector> #include <stdint.h> namespace uhd{ namespace usrp{ namespace dboard{ @@ -32,6 +33,7 @@ namespace uhd{ namespace usrp{ namespace dboard{ class interface{ public: typedef boost::shared_ptr<interface> sptr; + typedef std::vector<uint8_t> byte_vector_t; //tells the host which device to use enum spi_dev_t{ @@ -119,7 +121,7 @@ public: * \param i2c_addr I2C bus address (7-bits) * \param buf the data to write */ - virtual void write_i2c(int i2c_addr, const std::string &buf) = 0; + virtual void write_i2c(int i2c_addr, const byte_vector_t &buf) = 0; /*! * \brief Read from I2C peripheral @@ -127,7 +129,7 @@ public: * \param len number of bytes to read * \return the data read if successful, else a zero length string. */ - virtual std::string read_i2c(int i2c_addr, size_t len) = 0; + virtual byte_vector_t read_i2c(int i2c_addr, size_t len) = 0; /*! * \brief Write data to SPI bus peripheral. @@ -136,17 +138,29 @@ public: * \param push args for writing * \param buf the data to write */ - virtual void write_spi(spi_dev_t dev, spi_push_t push, const std::string &buf) = 0; + void write_spi(spi_dev_t dev, spi_push_t push, const byte_vector_t &buf); /*! - * \brief Read data from SPI bus peripheral. + * \brief Read data to SPI bus peripheral. * * \param dev which spi device - * \param push args for reading - * \param len number of bytes to read - * \return the data read if sucessful, else a zero length string. + * \param latch args for reading + * \param num_bytes number of bytes to read + * \return the data that was read + */ + byte_vector_t read_spi(spi_dev_t dev, spi_latch_t latch, size_t num_bytes); + + /*! + * \brief Read and write data to SPI bus peripheral. + * The data read back will be the same length as the input buffer. + * + * \param dev which spi device + * \param latch args for reading + * \param push args for clock + * \param buf the data to write + * \return the data that was read */ - virtual std::string read_spi(spi_dev_t dev, spi_latch_t latch, size_t len) = 0; + byte_vector_t read_write_spi(spi_dev_t dev, spi_latch_t latch, spi_push_t push, const byte_vector_t &buf); /*! * \brief Get the rate of the rx dboard clock. @@ -160,6 +174,24 @@ public: */ virtual double get_tx_clock_rate(void) = 0; +private: + /*! + * \brief Read and write data to SPI bus peripheral. + * + * \param dev which spi device + * \param latch args for reading + * \param push args for clock + * \param buf the data to write + * \param readback false for write only + * \return the data that was read + */ + virtual byte_vector_t transact_spi( + spi_dev_t dev, + spi_latch_t latch, + spi_push_t push, + const byte_vector_t &buf, + bool readback + ) = 0; }; }}} //namespace diff --git a/host/include/uhd/usrp/mboard/CMakeLists.txt b/host/include/uhd/usrp/mboard/CMakeLists.txt index 79aab8677..2cdb55143 100644 --- a/host/include/uhd/usrp/mboard/CMakeLists.txt +++ b/host/include/uhd/usrp/mboard/CMakeLists.txt @@ -18,7 +18,6 @@ INSTALL(FILES base.hpp - test.hpp usrp2.hpp DESTINATION ${HEADER_DIR}/uhd/usrp/mboard ) diff --git a/host/include/uhd/usrp/mboard/test.hpp b/host/include/uhd/usrp/mboard/test.hpp deleted file mode 100644 index 04d0ff4c4..000000000 --- a/host/include/uhd/usrp/mboard/test.hpp +++ /dev/null @@ -1,46 +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/>. -// - -#ifndef INCLUDED_UHD_USRP_MBOARD_TEST_HPP -#define INCLUDED_UHD_USRP_MBOARD_TEST_HPP - -#include <uhd/usrp/mboard/base.hpp> -#include <uhd/device_addr.hpp> -#include <uhd/usrp/dboard/manager.hpp> -#include <uhd/dict.hpp> - -namespace uhd{ namespace usrp{ namespace mboard{ - -/*! - * A test usrp mboard object. - * Exercises access routines for the test suite. - */ -class test : public base{ -public: - test(const device_addr_t &); - ~test(void); - -private: - void get(const wax::obj &, wax::obj &); - void set(const wax::obj &, const wax::obj &); - - uhd::dict<std::string, dboard::manager::sptr> _dboard_managers; -}; - -}}} //namespace - -#endif /* INCLUDED_UHD_USRP_MBOARD_TEST_HPP */ diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index 295943a6f..f114310e6 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -31,7 +31,6 @@ ADD_LIBRARY(uhd SHARED usrp/dboard/interface.cpp usrp/dboard/manager.cpp usrp/mboard/base.cpp - usrp/mboard/test.cpp usrp/mboard/usrp2.cpp usrp/mboard/usrp2/impl_base.cpp usrp/mboard/usrp2/dboard_impl.cpp diff --git a/host/lib/usrp/dboard/interface.cpp b/host/lib/usrp/dboard/interface.cpp index 837c76d0a..b8f6724ba 100644 --- a/host/lib/usrp/dboard/interface.cpp +++ b/host/lib/usrp/dboard/interface.cpp @@ -26,3 +26,29 @@ interface::interface(void){ interface::~interface(void){ /* NOP */ } + +void interface::write_spi( + spi_dev_t dev, + spi_push_t push, + const byte_vector_t &buf +){ + transact_spi(dev, SPI_LATCH_RISE, push, buf, false); //dont readback +} + +interface::byte_vector_t interface::read_spi( + spi_dev_t dev, + spi_latch_t latch, + size_t num_bytes +){ + byte_vector_t buf(num_bytes, 0x00); //dummy data + return transact_spi(dev, latch, SPI_PUSH_RISE, buf, true); //readback +} + +interface::byte_vector_t interface::read_write_spi( + spi_dev_t dev, + spi_latch_t latch, + spi_push_t push, + const byte_vector_t &buf +){ + return transact_spi(dev, latch, push, buf, true); //readback +} diff --git a/host/lib/usrp/dboard/manager.cpp b/host/lib/usrp/dboard/manager.cpp index 4a675fd0b..3540cd1bc 100644 --- a/host/lib/usrp/dboard/manager.cpp +++ b/host/lib/usrp/dboard/manager.cpp @@ -135,6 +135,17 @@ manager::manager( register_internal_dboards(); //always call first const dboard_ctor_t rx_dboard_ctor = get_dboard_ctor(rx_dboard_id, "rx"); const dboard_ctor_t tx_dboard_ctor = get_dboard_ctor(tx_dboard_id, "tx"); + + //initialize the gpio pins before creating subdevs + dboard_interface->set_gpio_ddr(interface::GPIO_RX_BANK, 0x0000, 0xffff); //all inputs + dboard_interface->set_gpio_ddr(interface::GPIO_TX_BANK, 0x0000, 0xffff); + + dboard_interface->write_gpio(interface::GPIO_RX_BANK, 0x0000, 0xffff); //all zeros + dboard_interface->write_gpio(interface::GPIO_TX_BANK, 0x0000, 0xffff); + + dboard_interface->set_atr_reg(interface::GPIO_RX_BANK, 0x0000, 0x0000, 0x0000); //software controlled + dboard_interface->set_atr_reg(interface::GPIO_TX_BANK, 0x0000, 0x0000, 0x0000); + //make xcvr subdevs (make one subdev for both rx and tx dboards) if (rx_dboard_ctor == tx_dboard_ctor){ BOOST_FOREACH(std::string name, ctor_to_names_map[rx_dboard_ctor]){ @@ -151,6 +162,7 @@ manager::manager( ); } } + //make tx and rx subdevs (separate subdevs for rx and tx dboards) else{ //make the rx subdevs diff --git a/host/lib/usrp/mboard/test.cpp b/host/lib/usrp/mboard/test.cpp deleted file mode 100644 index 67d3c70fa..000000000 --- a/host/lib/usrp/mboard/test.cpp +++ /dev/null @@ -1,188 +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/mboard/test.hpp> -#include <uhd/props.hpp> -#include <boost/lexical_cast.hpp> -#include <boost/format.hpp> -#include <stdexcept> - -using namespace uhd; -using namespace uhd::usrp; -using namespace uhd::usrp::mboard; - -/*********************************************************************** - * dummy interface for dboards - **********************************************************************/ -class dummy_interface : public uhd::usrp::dboard::interface{ -public: - dummy_interface(void){} - ~dummy_interface(void){} - void write_aux_dac(int, int){} - int read_aux_adc(int){return 0;} - void set_atr_reg(gpio_bank_t, uint16_t, uint16_t, uint16_t){} - void set_gpio_ddr(gpio_bank_t, uint16_t, uint16_t){} - void write_gpio(gpio_bank_t, uint16_t, uint16_t){} - uint16_t read_gpio(gpio_bank_t){return 0;} - void write_i2c (int, const std::string &){} - std::string read_i2c (int, size_t){return "";} - void write_spi (spi_dev_t, spi_push_t, const std::string &){} - std::string read_spi (spi_dev_t, spi_latch_t, size_t){return "";} - double get_rx_clock_rate(void){return 0.0;} - double get_tx_clock_rate(void){return 0.0;} -}; - -/*********************************************************************** - * shell class to act as a dboard - **********************************************************************/ -class shell_dboard : public wax::obj{ -public: - enum type_t {TYPE_RX, TYPE_TX}; - shell_dboard(dboard::manager::sptr mgr, type_t type){ - _mgr = mgr; - _type = type; - } - ~shell_dboard(void){} -private: - void get(const wax::obj &key_, wax::obj &val){ - wax::obj key; std::string name; - boost::tie(key, name) = extract_named_prop(key_); - - //handle the get request conditioned on the key - switch(wax::cast<dboard_prop_t>(key)){ - case DBOARD_PROP_NAME: - val = std::string("dboard test mboard"); - return; - - case DBOARD_PROP_SUBDEV: - switch(_type){ - case TYPE_RX: - val = _mgr->get_rx_subdev(name); - return; - - case TYPE_TX: - val = _mgr->get_tx_subdev(name); - return; - } - - case DBOARD_PROP_SUBDEV_NAMES: - switch(_type){ - case TYPE_RX: - val = _mgr->get_rx_subdev_names(); - return; - - case TYPE_TX: - val = _mgr->get_tx_subdev_names(); - return; - } - - case DBOARD_PROP_CODEC: - return; - } - } - - void set(const wax::obj &, const wax::obj &){ - throw std::runtime_error("Cannot set on usrp test dboard"); - } - - type_t _type; - dboard::manager::sptr _mgr; -}; - -/*********************************************************************** - * test usrp mboard class - **********************************************************************/ -test::test(const device_addr_t &device_addr){ - //extract the number of dboards - size_t num_dboards = boost::lexical_cast<size_t>(device_addr["num_dboards"]); - //create a manager for each dboard - for (size_t i = 0; i < num_dboards; i++){ - dboard::interface::sptr ifc(new dummy_interface()); - _dboard_managers[boost::lexical_cast<std::string>(i)] = dboard::manager::sptr( - new dboard::manager(dboard::ID_BASIC_RX, dboard::ID_BASIC_TX, ifc) - ); - } -} - -test::~test(void){ - /* NOP */ -} - -void test::get(const wax::obj &key_, wax::obj &val){ - wax::obj key; std::string name; - boost::tie(key, name) = extract_named_prop(key_); - - //handle the get request conditioned on the key - switch(wax::cast<mboard_prop_t>(key)){ - case MBOARD_PROP_NAME: - val = std::string("usrp test mboard"); - return; - - case MBOARD_PROP_OTHERS: - val = prop_names_t(); //empty other props - return; - - case MBOARD_PROP_RX_DBOARD: - if (not _dboard_managers.has_key(name)) throw std::invalid_argument( - str(boost::format("Unknown rx dboard name %s") % name) - ); - //FIXME store the shell dboard within the class - //may not fix, plan to remove this test class when real usrps work - //val = wax::obj::sptr( - // new shell_dboard(_dboard_managers[name], shell_dboard::TYPE_RX) - //); - return; - - case MBOARD_PROP_RX_DBOARD_NAMES: - val = prop_names_t(_dboard_managers.get_keys()); - return; - - case MBOARD_PROP_TX_DBOARD: - if (not _dboard_managers.has_key(name)) throw std::invalid_argument( - str(boost::format("Unknown tx dboard name %s") % name) - ); - //FIXME store the shell dboard within the class - //may not fix, plan to remove this test class when real usrps work - //val = wax::obj::sptr( - // new shell_dboard(_dboard_managers[name], shell_dboard::TYPE_TX) - //); - return; - - case MBOARD_PROP_TX_DBOARD_NAMES: - val = prop_names_t(_dboard_managers.get_keys()); - return; - - case MBOARD_PROP_MTU: - case MBOARD_PROP_CLOCK_RATE: - case MBOARD_PROP_RX_DSP: - case MBOARD_PROP_RX_DSP_NAMES: - case MBOARD_PROP_TX_DSP: - case MBOARD_PROP_TX_DSP_NAMES: - case MBOARD_PROP_PPS_SOURCE: - case MBOARD_PROP_PPS_SOURCE_NAMES: - case MBOARD_PROP_PPS_POLARITY: - case MBOARD_PROP_REF_SOURCE: - case MBOARD_PROP_REF_SOURCE_NAMES: - case MBOARD_PROP_TIME_NOW: - case MBOARD_PROP_TIME_NEXT_PPS: - throw std::runtime_error("unhandled prop is usrp test mboard"); - } -} - -void test::set(const wax::obj &, const wax::obj &){ - throw std::runtime_error("Cannot set on usrp test mboard"); -} diff --git a/host/lib/usrp/mboard/usrp2/dboard_interface.cpp b/host/lib/usrp/mboard/usrp2/dboard_interface.cpp index 05d29daef..d244e0bee 100644 --- a/host/lib/usrp/mboard/usrp2/dboard_interface.cpp +++ b/host/lib/usrp/mboard/usrp2/dboard_interface.cpp @@ -52,10 +52,10 @@ double dboard_interface::get_tx_clock_rate(void){ */ static uint8_t gpio_bank_to_otw(uhd::usrp::dboard::interface::gpio_bank_t bank){ switch(bank){ - case uhd::usrp::dboard::interface::GPIO_TX_BANK: return USRP2_GPIO_BANK_TX; - case uhd::usrp::dboard::interface::GPIO_RX_BANK: return USRP2_GPIO_BANK_RX; + case uhd::usrp::dboard::interface::GPIO_TX_BANK: return USRP2_DIR_TX; + case uhd::usrp::dboard::interface::GPIO_RX_BANK: return USRP2_DIR_RX; } - throw std::runtime_error("unknown gpio bank"); + throw std::invalid_argument("unknown gpio bank type"); } void dboard_interface::set_gpio_ddr(gpio_bank_t bank, uint16_t value, uint16_t mask){ @@ -109,3 +109,85 @@ void dboard_interface::set_atr_reg(gpio_bank_t bank, uint16_t tx_value, uint16_t usrp2_ctrl_data_t in_data = _impl->ctrl_send_and_recv(out_data); ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_GOT_THE_ATR_SETTINGS_DUDE); } + +/*********************************************************************** + * 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 + * \return an over the wire representation + */ +static uint8_t spi_dev_to_otw(uhd::usrp::dboard::interface::spi_dev_t dev){ + switch(dev){ + case uhd::usrp::dboard::interface::SPI_TX_DEV: return USRP2_DIR_TX; + case uhd::usrp::dboard::interface::SPI_RX_DEV: return USRP2_DIR_RX; + } + throw std::invalid_argument("unknown spi device type"); +} + +/*! + * Static function to convert a spi latch enum + * to an over-the-wire value for the usrp2 control. + * \param latch the dboard interface spi latch enum + * \return an over the wire representation + */ +static uint8_t spi_latch_to_otw(uhd::usrp::dboard::interface::spi_latch_t latch){ + switch(latch){ + case uhd::usrp::dboard::interface::SPI_LATCH_RISE: return USRP2_CLK_EDGE_RISE; + case uhd::usrp::dboard::interface::SPI_LATCH_FALL: return USRP2_CLK_EDGE_FALL; + } + throw std::invalid_argument("unknown spi latch type"); +} + +/*! + * Static function to convert a spi push enum + * to an over-the-wire value for the usrp2 control. + * \param push the dboard interface spi push enum + * \return an over the wire representation + */ +static uint8_t spi_push_to_otw(uhd::usrp::dboard::interface::spi_push_t push){ + switch(push){ + case uhd::usrp::dboard::interface::SPI_PUSH_RISE: return USRP2_CLK_EDGE_RISE; + case uhd::usrp::dboard::interface::SPI_PUSH_FALL: return USRP2_CLK_EDGE_FALL; + } + throw std::invalid_argument("unknown spi push type"); +} + +uhd::usrp::dboard::interface::byte_vector_t dboard_interface::transact_spi( + spi_dev_t dev, + spi_latch_t latch, + spi_push_t push, + const byte_vector_t &buf, + 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.latch = spi_latch_to_otw(latch); + out_data.data.spi_args.push = spi_push_to_otw(push); + 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 + for (size_t i = 0; i < buf.size(); i++){ + out_data.data.spi_args.data[i] = buf[i]; + } + + //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; + for (size_t i = 0; i < buf.size(); i++){ + result.push_back(in_data.data.spi_args.data[i]); + } + return result; +} diff --git a/host/lib/usrp/mboard/usrp2/dboard_interface.hpp b/host/lib/usrp/mboard/usrp2/dboard_interface.hpp index 645681f43..8880eaf97 100644 --- a/host/lib/usrp/mboard/usrp2/dboard_interface.hpp +++ b/host/lib/usrp/mboard/usrp2/dboard_interface.hpp @@ -39,19 +39,23 @@ public: uint16_t read_gpio(gpio_bank_t); - void write_i2c (int, const std::string &){} + void write_i2c(int, const byte_vector_t &){} - std::string read_i2c (int, size_t){return "";} - - void write_spi (spi_dev_t, spi_push_t, const std::string &){} - - std::string read_spi (spi_dev_t, spi_latch_t, size_t){return "";} + byte_vector_t read_i2c(int, size_t){return byte_vector_t();} double get_rx_clock_rate(void); double get_tx_clock_rate(void); private: + byte_vector_t transact_spi( + spi_dev_t dev, + spi_latch_t latch, + spi_push_t push, + const byte_vector_t &buf, + bool readback + ); + impl_base *_impl; }; diff --git a/host/lib/usrp/mboard/usrp2/fw_common.h b/host/lib/usrp/mboard/usrp2/fw_common.h index 8cd15c7c3..8e5810a14 100644 --- a/host/lib/usrp/mboard/usrp2/fw_common.h +++ b/host/lib/usrp/mboard/usrp2/fw_common.h @@ -63,6 +63,9 @@ typedef enum{ USRP2_CTRL_ID_USE_THESE_ATR_SETTINGS_BRO, USRP2_CTRL_ID_GOT_THE_ATR_SETTINGS_DUDE, + USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO, + USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE, + USRP2_CTRL_ID_PEACE_OUT } usrp2_ctrl_id_t; @@ -84,9 +87,14 @@ typedef enum{ } usrp2_ref_source_t; typedef enum{ - USRP2_GPIO_BANK_RX, - USRP2_GPIO_BANK_TX -} usrp2_gpio_bank_t; + USRP2_DIR_RX, + USRP2_DIR_TX +} usrp2_dir_which_t; + +typedef enum{ + USRP2_CLK_EDGE_RISE, + USRP2_CLK_EDGE_FALL +} usrp2_clk_edge_t; typedef struct{ uint32_t id; @@ -117,6 +125,14 @@ typedef struct{ uint16_t rx_value; uint16_t mask; } atr_config; + struct { + uint8_t dev; + uint8_t latch; + uint8_t push; + uint8_t readback; + uint8_t bytes; + uint8_t data[sizeof(uint32_t)]; + } spi_args; } data; } usrp2_ctrl_data_t; diff --git a/host/lib/usrp/usrp.cpp b/host/lib/usrp/usrp.cpp index 86a40ebd8..9b1603a4a 100644 --- a/host/lib/usrp/usrp.cpp +++ b/host/lib/usrp/usrp.cpp @@ -17,7 +17,6 @@ #include <uhd/usrp/usrp.hpp> #include <uhd/usrp/mboard/usrp2.hpp> -#include <uhd/usrp/mboard/test.hpp> #include <boost/format.hpp> #include <boost/bind.hpp> #include <stdexcept> @@ -48,9 +47,6 @@ usrp::usrp(const device_addr_t &device_addr){ if (not device_addr.has_key("type")){ //TODO nothing } - else if (device_addr["type"] == "test"){ - _mboards[""] = mboard::base::sptr(new mboard::test(device_addr)); - } else if (device_addr["type"] == "udp"){ _mboards[""] = mboard::base::sptr(new mboard::usrp2(device_addr)); } diff --git a/host/test/CMakeLists.txt b/host/test/CMakeLists.txt index 0dcd1e68e..234b6f92c 100644 --- a/host/test/CMakeLists.txt +++ b/host/test/CMakeLists.txt @@ -19,9 +19,7 @@ ADD_EXECUTABLE(main_test main_test.cpp addr_test.cpp - device_test.cpp gain_handler_test.cpp - usrp_dboard_test.cpp wax_test.cpp ) diff --git a/host/test/device_test.cpp b/host/test/device_test.cpp deleted file mode 100644 index 6373ff41b..000000000 --- a/host/test/device_test.cpp +++ /dev/null @@ -1,44 +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 <boost/test/unit_test.hpp> -#include <uhd/device.hpp> - -using namespace uhd; - -BOOST_AUTO_TEST_CASE(test_device){ - device_addr_t device_addr; - device_addr["type"] = "test"; - device_addr["num_dboards"] = "2"; - device::sptr dev = device::make(device_addr); - - std::cout << "Access the device" << std::endl; - std::cout << wax::cast<std::string>((*dev)[DEVICE_PROP_NAME]) << std::endl; - - std::cout << "Access the mboard" << std::endl; - wax::obj mb0 = (*dev)[DEVICE_PROP_MBOARD]; - std::cout << wax::cast<std::string>(mb0[MBOARD_PROP_NAME]) << std::endl; - BOOST_CHECK_EQUAL( - 2, - wax::cast<prop_names_t>(mb0[MBOARD_PROP_RX_DBOARD_NAMES]).size() - ); - BOOST_CHECK_EQUAL( - 2, - wax::cast<prop_names_t>(mb0[MBOARD_PROP_TX_DBOARD_NAMES]).size() - ); - -} diff --git a/host/test/usrp_dboard_test.cpp b/host/test/usrp_dboard_test.cpp deleted file mode 100644 index f0ae7a53d..000000000 --- a/host/test/usrp_dboard_test.cpp +++ /dev/null @@ -1,60 +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 <boost/test/unit_test.hpp> -#include <uhd/usrp/dboard/manager.hpp> - -using namespace uhd::usrp::dboard; - -/*********************************************************************** - * dummy interface for dboards - **********************************************************************/ -class dummy_interface : public interface{ -public: - dummy_interface(void){} - ~dummy_interface(void){} - void write_aux_dac(int, int){} - int read_aux_adc(int){return 0;} - void set_atr_reg(gpio_bank_t, uint16_t, uint16_t, uint16_t){} - void set_gpio_ddr(gpio_bank_t, uint16_t, uint16_t){} - void write_gpio(gpio_bank_t, uint16_t, uint16_t){} - uint16_t read_gpio(gpio_bank_t){return 0;} - void write_i2c (int, const std::string &){} - std::string read_i2c (int, size_t){return "";} - void write_spi (spi_dev_t, spi_push_t, const std::string &){} - std::string read_spi (spi_dev_t, spi_latch_t, size_t){return "";} - double get_rx_clock_rate(void){return 0.0;} - double get_tx_clock_rate(void){return 0.0;} -}; - -BOOST_AUTO_TEST_CASE(test_manager){ - std::cout << "Making a dummy usrp dboard interface..." << std::endl; - interface::sptr ifc0(new dummy_interface()); - - std::cout << "Making a usrp dboard manager..." << std::endl; - manager::sptr mgr0(new manager(ID_BASIC_RX, ID_BASIC_TX, ifc0)); - - std::cout << "Testing the dboard manager..." << std::endl; - BOOST_CHECK_EQUAL(size_t(3), mgr0->get_rx_subdev_names().size()); - BOOST_CHECK_EQUAL(size_t(1), mgr0->get_tx_subdev_names().size()); - - std::cout << "Testing access (will fail later when db code filled in)..." << std::endl; - BOOST_CHECK_THROW(mgr0->get_rx_subdev(""), std::invalid_argument); - BOOST_CHECK_THROW(mgr0->get_tx_subdev("x"), std::invalid_argument); - mgr0->get_rx_subdev("a")[0]; - mgr0->get_tx_subdev("")[0]; -} |