mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
80 lines
2.2 KiB
C++
80 lines
2.2 KiB
C++
//
|
|
// Copyright 2018 Ettus Research, a National Instruments Company
|
|
// Copyright 2019 Ettus Research, a National Instruments Brand
|
|
//
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
//
|
|
|
|
#include <mpm/ad9361/e31x_defaults.hpp>
|
|
#include <mpm/dboards/e31x_db_manager.hpp>
|
|
#include <mpm/spi/spi_iface.hpp>
|
|
#include <mpm/spi/spi_regs_iface.hpp>
|
|
#include <mpm/types/regs_iface.hpp>
|
|
#include <boost/make_shared.hpp>
|
|
#include <memory>
|
|
|
|
using namespace mpm::dboards;
|
|
using namespace mpm::chips;
|
|
using namespace mpm::types;
|
|
using namespace mpm::types::e31x;
|
|
|
|
namespace { /*anon*/
|
|
|
|
constexpr uint32_t AD9361_SPI_WRITE_CMD = 0x00800000;
|
|
constexpr uint32_t AD9361_SPI_READ_CMD = 0x00000000;
|
|
constexpr uint32_t AD9361_SPI_ADDR_MASK = 0x003FFF00;
|
|
constexpr uint32_t AD9361_SPI_ADDR_SHIFT = 8;
|
|
constexpr uint32_t AD9361_SPI_DATA_MASK = 0x000000FF;
|
|
constexpr uint32_t AD9361_SPI_DATA_SHIFT = 0;
|
|
constexpr uint32_t AD9361_SPI_NUM_BITS = 24;
|
|
constexpr uint32_t AD9361_SPI_SPEED_HZ = 2000000;
|
|
constexpr int AD9361_SPI_MODE = 1;
|
|
|
|
} // namespace
|
|
|
|
/*! MPM-style E310 SPI Iface for AD9361 CTRL
|
|
*
|
|
*/
|
|
class e310_ad9361_io_spi : public ad9361_io
|
|
{
|
|
public:
|
|
e310_ad9361_io_spi(regs_iface::sptr regs_iface, uint32_t slave_num)
|
|
: _regs_iface(regs_iface), _slave_num(slave_num)
|
|
{
|
|
}
|
|
|
|
~e310_ad9361_io_spi()
|
|
{ /*nop*/
|
|
}
|
|
|
|
uint8_t peek8(uint32_t reg)
|
|
{
|
|
return _regs_iface->peek8(reg);
|
|
}
|
|
|
|
void poke8(uint32_t reg, uint8_t val)
|
|
{
|
|
_regs_iface->poke8(reg, val);
|
|
}
|
|
|
|
private:
|
|
regs_iface::sptr _regs_iface;
|
|
uint32_t _slave_num;
|
|
};
|
|
|
|
e31x_db_manager::e31x_db_manager(const std::string& catalina_spidev)
|
|
{
|
|
// Make the MPM-style low level SPI Regs iface
|
|
auto spi_iface = mpm::spi::make_spi_regs_iface(
|
|
mpm::spi::spi_iface::make_spidev(
|
|
catalina_spidev, AD9361_SPI_SPEED_HZ, AD9361_SPI_MODE),
|
|
AD9361_SPI_ADDR_SHIFT,
|
|
AD9361_SPI_DATA_SHIFT,
|
|
AD9361_SPI_READ_CMD,
|
|
AD9361_SPI_WRITE_CMD);
|
|
// Make the SPI interface
|
|
auto spi_io_iface = std::make_shared<e310_ad9361_io_spi>(spi_iface, 0);
|
|
// Make the actual Catalina Ctrl object
|
|
_catalina_ctrl =
|
|
ad9361_ctrl::make_spi(std::make_shared<e31x_ad9361_client_t>(), spi_io_iface);
|
|
}
|