aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/lib/lmk04828/lmk04828_spi_iface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mpm/lib/lmk04828/lmk04828_spi_iface.cpp')
-rw-r--r--mpm/lib/lmk04828/lmk04828_spi_iface.cpp43
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;
+ }