diff options
Diffstat (limited to 'host/include/uhd/usrp/dboard_interface.hpp')
-rw-r--r-- | host/include/uhd/usrp/dboard_interface.hpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/host/include/uhd/usrp/dboard_interface.hpp b/host/include/uhd/usrp/dboard_interface.hpp new file mode 100644 index 000000000..84e1f5b22 --- /dev/null +++ b/host/include/uhd/usrp/dboard_interface.hpp @@ -0,0 +1,207 @@ +// +// 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_DBOARD_INTERFACE_HPP +#define INCLUDED_UHD_USRP_DBOARD_INTERFACE_HPP + +#include <boost/shared_ptr.hpp> +#include <vector> +#include <stdint.h> + +namespace uhd{ namespace usrp{ + +/*! + * The daughter board dboard_interface to be subclassed. + * A dboard instance dboard_interfaces with the mboard though this api. + * This dboard_interface provides i2c, spi, gpio, atr, aux dac/adc access. + * Each mboard should have a specially tailored dboard dboard_interface. + */ +class dboard_interface{ +public: + typedef boost::shared_ptr<dboard_interface> sptr; + typedef std::vector<uint8_t> byte_vector_t; + + //tells the host which unit to use + enum unit_type_t{ + UNIT_TYPE_RX, + UNIT_TYPE_TX + }; + + //tells the host which device to use + enum spi_dev_t{ + SPI_TX_DEV, + SPI_RX_DEV + }; + + //args for writing spi data + enum spi_push_t{ + SPI_PUSH_RISE, + SPI_PUSH_FALL + }; + + //args for reading spi data + enum spi_latch_t{ + SPI_LATCH_RISE, + SPI_LATCH_FALL + }; + + //tell the host which gpio bank + enum gpio_bank_t{ + GPIO_TX_BANK, + GPIO_RX_BANK + }; + + //structors + dboard_interface(void); + virtual ~dboard_interface(void); + + /*! + * Write to an aux dac. + * \param unit which unit rx or tx + * \param which_dac the dac index 0, 1, 2, 3... + * \param value the value to write + */ + virtual void write_aux_dac(unit_type_t unit, int which_dac, int value) = 0; + + /*! + * Read from an aux adc. + * \param unit which unit rx or tx + * \param which_adc the adc index 0, 1, 2, 3... + * \return the value that was read + */ + virtual int read_aux_adc(unit_type_t unit, int which_adc) = 0; + + /*! + * Set daughterboard ATR register. + * The ATR register for a particular bank has 2 values: + * one value when transmitting, one when receiving. + * The mask controls which pins are controlled by ATR. + * + * \param bank GPIO_TX_BANK or GPIO_RX_BANK + * \param tx_value 16-bits, 0=FPGA output low, 1=FPGA output high + * \param rx_value 16-bits, 0=FPGA output low, 1=FPGA output high + * \param mask 16-bits, 0=software, 1=atr + */ + virtual void set_atr_reg(gpio_bank_t bank, uint16_t tx_value, uint16_t rx_value, uint16_t mask) = 0; + + /*! + * Set daughterboard GPIO data direction register. + * + * \param bank GPIO_TX_BANK or GPIO_RX_BANK + * \param value 16-bits, 0=FPGA input, 1=FPGA output + * \param mask 16-bits, 0=ignore, 1=set + */ + virtual void set_gpio_ddr(gpio_bank_t bank, uint16_t value, uint16_t mask) = 0; + + /*! + * Set daughterboard GPIO pin values. + * + * \param bank GPIO_TX_BANK or GPIO_RX_BANK + * \param value 16 bits, 0=low, 1=high + * \param mask 16 bits, 0=ignore, 1=set + */ + virtual void write_gpio(gpio_bank_t bank, uint16_t value, uint16_t mask) = 0; + + /*! + * Read daughterboard GPIO pin values + * + * \param bank GPIO_TX_BANK or GPIO_RX_BANK + * \return the value of the gpio bank + */ + virtual uint16_t read_gpio(gpio_bank_t bank) = 0; + + /*! + * \brief Write to I2C peripheral + * \param i2c_addr I2C bus address (7-bits) + * \param buf the data to write + */ + virtual void write_i2c(int i2c_addr, const byte_vector_t &buf) = 0; + + /*! + * \brief Read from I2C peripheral + * \param i2c_addr I2C bus address (7-bits) + * \param num_bytes number of bytes to read + * \return the data read if successful, else a zero length string. + */ + virtual byte_vector_t read_i2c(int i2c_addr, size_t num_bytes) = 0; + + /*! + * \brief Write data to SPI bus peripheral. + * + * \param dev which spi device + * \param push args for writing + * \param buf the data to write + */ + void write_spi(spi_dev_t dev, spi_push_t push, const byte_vector_t &buf); + + /*! + * \brief Read data to SPI bus peripheral. + * + * \param dev which spi device + * \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 + */ + 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. + * \return the clock rate + */ + virtual double get_rx_clock_rate(void) = 0; + + /*! + * \brief Get the rate of the tx dboard clock. + * \return the clock rate + */ + 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 + +#endif /* INCLUDED_UHD_USRP_DBOARD_INTERFACE_HPP */ |