//
// 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 .
//
#ifndef INCLUDED_USRP_UHD_USRP_DBOARD_INTERFACE_HPP
#define INCLUDED_USRP_UHD_USRP_DBOARD_INTERFACE_HPP
#include
#include
namespace usrp_uhd{ namespace usrp{ namespace dboard{
/*!
* The daughter board interface to be subclassed.
* A dboard instance interfaces with the mboard though this api.
* This interface provides i2c, spi, gpio, atr, aux dac/adc access.
* Each mboard should have a specially tailored dboard interface.
*/
class interface{
public:
typedef boost::shared_ptr sptr;
//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
interface(void);
virtual ~interface(void);
/*!
* Write to an aux dac.
* \param which_dac the dac index 0, 1, 2, 3...
* \param value the value to write
*/
virtual void write_aux_dac(int which_dac, int value) = 0;
/*!
* Read from an aux adc.
* \param which_adc the adc index 0, 1, 2, 3...
* \return the value that was read
*/
virtual int read_aux_adc(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 input, 1=FPGA output
* \param rx_value 16-bits, 0=FPGA input, 1=FPGA output
* \param mask 16-bits, 0=ignore, 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 std::string &buf) = 0;
/*!
* \brief Read from I2C peripheral
* \param i2c_addr I2C bus address (7-bits)
* \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;
/*!
* \brief Write data to SPI bus peripheral.
*
* \param dev which spi device
* \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;
/*!
* \brief Read data from 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.
*/
virtual std::string read_spi(spi_dev_t dev, spi_latch_t latch, size_t len) = 0;
/*!
* \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;
};
}}} //namespace
#endif /* INCLUDED_USRP_UHD_USRP_DBOARD_INTERFACE_HPP */