diff options
Diffstat (limited to 'mpm/lib/lmk04828/lmk04828_spi_iface.cpp')
| -rw-r--r-- | mpm/lib/lmk04828/lmk04828_spi_iface.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/mpm/lib/lmk04828/lmk04828_spi_iface.cpp b/mpm/lib/lmk04828/lmk04828_spi_iface.cpp new file mode 100644 index 000000000..e281467e1 --- /dev/null +++ b/mpm/lib/lmk04828/lmk04828_spi_iface.cpp @@ -0,0 +1,43 @@ +#include "lmk/lmk04828_spi_iface.hpp" +#include "uhd/exception.hpp" +#include <boost/bind.hpp> + +lmk04828_spi_iface::lmk04828_spi_iface(uhd::spi_iface::sptr iface) : _spi_iface(iface) + { + // Use default SPI Config options + config = uhd::spi_config_t(uhd::spi_config_t::EDGE_RISE); + } + +lmk04828_iface::write_fn_t lmk04828_spi_iface::get_write_fn() + { + return boost::bind(&lmk04828_spi_iface::spi_write, this, _1); + } + +lmk04828_iface::read_fn_t lmk04828_spi_iface::get_read_fn() + { + return boost::bind(&lmk04828_spi_iface::spi_read, this, _1); + } + +void lmk04828_spi_iface::spi_write(std::vector<uint32_t> writes) { + for (uint32_t write : writes) { + _spi_iface->write_spi(DEFAULT_SLAVE, config, write, LMK_SPI_NUM_BITS); + } + } + +uint8_t lmk04828_spi_iface::spi_read(uint32_t addr) { + // Format LMK SPI read transaction + // r/w[23] 0[22:21] addr[20:8] data[7:0] = 24 bits + uint32_t transaction = 0; + transaction |= LMK_SPI_READ_FLAG << LMK_SPI_READ_FLAG_OFFSET; + transaction &= LMK_SPI_RESERVED_FIELD_MASK; + transaction |= addr << LMK_SPI_READ_ADDR_OFFSET; + + uint32_t data = _spi_iface->read_spi(DEFAULT_SLAVE, config, transaction, LMK_SPI_NUM_BITS); + + if ((data & 0xFFFFFF00) != 0) { + // There's more than 8 bits of data! + throw uhd::runtime_error("LMK SPI read returned too much data"); + } + + return data & 0xFF; + } |
