diff options
| -rw-r--r-- | firmware/microblaze/apps/txrx.c | 25 | ||||
| -rw-r--r-- | host/include/uhd/usrp/dboard_interface.hpp | 100 | ||||
| -rw-r--r-- | host/lib/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_rfx.cpp | 16 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_interface.cpp | 53 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dboard_interface.cpp | 95 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/fw_common.h | 7 | 
7 files changed, 128 insertions, 169 deletions
| diff --git a/firmware/microblaze/apps/txrx.c b/firmware/microblaze/apps/txrx.c index 69a04d771..561f3148f 100644 --- a/firmware/microblaze/apps/txrx.c +++ b/firmware/microblaze/apps/txrx.c @@ -253,29 +253,18 @@ void handle_udp_ctrl_packet(       * 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, -                data, num_bytes*8, //length in bits -                (ctrl_data_in->data.spi_args.edge == USRP2_CLK_EDGE_RISE)? SPIF_PUSH_RISE : SPIF_PUSH_FALL | -                (ctrl_data_in->data.spi_args.edge == USRP2_CLK_EDGE_RISE)? SPIF_LATCH_RISE : SPIF_LATCH_FALL +                ctrl_data_in->data.spi_args.dev,      //which device +                ctrl_data_in->data.spi_args.data,     //32 bit data +                ctrl_data_in->data.spi_args.num_bits, //length in bits +                (ctrl_data_in->data.spi_args.mosi_edge == USRP2_CLK_EDGE_RISE)? SPIF_PUSH_FALL : SPIF_PUSH_RISE | +                (ctrl_data_in->data.spi_args.miso_edge == 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; +            //load output +            ctrl_data_out.data.spi_args.data = result;              ctrl_data_out.id = USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE;          }          break; diff --git a/host/include/uhd/usrp/dboard_interface.hpp b/host/include/uhd/usrp/dboard_interface.hpp index b3bab131d..dab5a2281 100644 --- a/host/include/uhd/usrp/dboard_interface.hpp +++ b/host/include/uhd/usrp/dboard_interface.hpp @@ -42,16 +42,31 @@ public:          UNIT_TYPE_TX = 't'      }; -    //tells the host which device to use -    enum spi_dev_t{ -        SPI_DEV_RX = 'r', -        SPI_DEV_TX = 't' -    }; - -    //args for spi format -    enum spi_edge_t{ -        SPI_EDGE_RISE = 'r', -        SPI_EDGE_FALL = 'f' +    //spi configuration struct +    struct UHD_API spi_config_t{ +        /*! +         * The edge type specifies when data is valid +         * relative to the edge of the serial clock. +         */ +        enum edge_t{ +            EDGE_RISE = 'r', +            EDGE_FALL = 'f' +        }; + +        //! on what edge is the mosi data valid? +        edge_t mosi_edge; + +        //! on what edge is the miso data valid? +        edge_t miso_edge; + +        /*! +         * Create a new spi config. +         * \param edge the default edge for mosi and miso +         */ +        spi_config_t(edge_t edge = EDGE_RISE){ +            mosi_edge = edge; +            miso_edge = edge; +        }      };      //tell the host which gpio bank @@ -68,10 +83,6 @@ public:          ATR_REG_FULL_DUPLEX = 'f'      }; -    //structors -    dboard_interface(void); -    virtual ~dboard_interface(void); -      /*!       * Write to an aux dac.       * \param unit which unit rx or tx @@ -131,61 +142,60 @@ public:      /*!       * \brief Write data to SPI bus peripheral.       * -     * \param dev which spi device -     * \param edge args for format -     * \param buf the data to write +     * \param unit which unit, rx or tx +     * \param config configuration settings +     * \param data the bits to write LSB first +     * \param num_bits the number of bits in data       */ -    void write_spi(spi_dev_t dev, spi_edge_t edge, const byte_vector_t &buf); +    virtual void write_spi( +        unit_type_t unit, +        const spi_config_t &config, +        boost::uint32_t data, +        size_t num_bits +    ) = 0;      /*!       * \brief Read data to SPI bus peripheral.       * -     * \param dev which spi device -     * \param edge args for format -     * \param num_bytes number of bytes to read +     * \param unit which unit, rx or tx +     * \param config configuration settings +     * \param num_bits the number of bits       * \return the data that was read       */ -    byte_vector_t read_spi(spi_dev_t dev, spi_edge_t edge, size_t num_bytes); +    virtual boost::uint32_t read_spi( +        unit_type_t unit, +        const spi_config_t &config, +        size_t num_bits +    ) = 0;      /*!       * \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 edge args for format -     * \param buf the data to write +     * \param unit which unit, rx or tx +     * \param config configuration settings +     * \param data the bits to write LSB first +     * \param num_bits the number of bits in data       * \return the data that was read       */ -    byte_vector_t read_write_spi(spi_dev_t dev, spi_edge_t edge, const byte_vector_t &buf); +    virtual boost::uint32_t read_write_spi( +        unit_type_t unit, +        const spi_config_t &config, +        boost::uint32_t data, +        size_t num_bits +    ) = 0;      /*!       * \brief Get the rate of the rx dboard clock. -     * \return the clock rate +     * \return the clock rate in Hz       */      virtual double get_rx_clock_rate(void) = 0;      /*!       * \brief Get the rate of the tx dboard clock. -     * \return the clock rate +     * \return the clock rate in Hz       */      virtual double get_tx_clock_rate(void) = 0; - -private: -    /*! -     * \brief Read and write data to SPI bus peripheral. -     * -     * \param dev which spi device -     * \param edge args for format -     * \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_edge_t edge, -        const byte_vector_t &buf, -        bool readback -    ) = 0;  };  }} //namespace diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index a4bf46f1a..f21a4a491 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -30,7 +30,6 @@ SET(libuhd_sources      usrp/dboard/db_basic_and_lf.cpp      usrp/dboard/db_rfx.cpp      usrp/dboard_base.cpp -    usrp/dboard_interface.cpp      usrp/simple_usrp.cpp      usrp/dboard_manager.cpp      usrp/tune_helper.cpp 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; | 
