aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/e300/e300_i2c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/e300/e300_i2c.cpp')
-rw-r--r--host/lib/usrp/e300/e300_i2c.cpp400
1 files changed, 0 insertions, 400 deletions
diff --git a/host/lib/usrp/e300/e300_i2c.cpp b/host/lib/usrp/e300/e300_i2c.cpp
deleted file mode 100644
index 24fd429b5..000000000
--- a/host/lib/usrp/e300/e300_i2c.cpp
+++ /dev/null
@@ -1,400 +0,0 @@
-//
-// Copyright 2014 Ettus Research LLC
-// Copyright 2018 Ettus Research, a National Instruments Company
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-
-#include "e300_i2c.hpp"
-#include <uhd/exception.hpp>
-#include <uhd/utils/byteswap.hpp>
-#include <uhd/transport/udp_simple.hpp>
-
-#include <cstring>
-#include <chrono>
-#include <thread>
-
-namespace uhd { namespace usrp { namespace e300 {
-
-class zc_impl : public i2c
-{
-public:
- zc_impl(uhd::transport::zero_copy_if::sptr xport) : _xport(xport)
- {
- }
-
- virtual ~zc_impl(void)
- {
- }
-
- void set_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg,
- const uint8_t value)
- {
- i2c_transaction_t transaction;
- transaction.type = WRITE | ONEBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = value;
- {
- uhd::transport::managed_send_buffer::sptr buff = _xport->get_send_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw uhd::runtime_error("i2c_zc_impl send timeout");
- std::memcpy(buff->cast<void *>(), &transaction, sizeof(transaction));
- buff->commit(sizeof(transaction));
- }
- }
-
- uint8_t get_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg)
- {
- i2c_transaction_t transaction;
- transaction.type = READ | ONEBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- {
- uhd::transport::managed_send_buffer::sptr buff = _xport->get_send_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw std::runtime_error("i2c_zc_impl send timeout");
- std::memcpy(buff->cast<void *>(), &transaction, sizeof(transaction));
- buff->commit(sizeof(transaction));
- }
- {
- uhd::transport::managed_recv_buffer::sptr buff = _xport->get_recv_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw std::runtime_error("i2c_zc_impl recv timeout");
- std::memcpy(&transaction, buff->cast<const void *>(), sizeof(transaction));
- }
- return transaction.data;
- }
-
- void set_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg,
- const uint8_t value)
- {
- i2c_transaction_t transaction;
- transaction.type = WRITE | TWOBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = value;
- {
- uhd::transport::managed_send_buffer::sptr buff = _xport->get_send_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw uhd::runtime_error("i2c_zc_impl send timeout");
- std::memcpy(buff->cast<void *>(), &transaction, sizeof(transaction));
- buff->commit(sizeof(transaction));
- }
- }
-
- uint8_t get_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg)
- {
- i2c_transaction_t transaction;
- transaction.type = READ | TWOBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- {
- uhd::transport::managed_send_buffer::sptr buff = _xport->get_send_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw std::runtime_error("i2c_zc_impl send timeout");
- std::memcpy(buff->cast<void *>(), &transaction, sizeof(transaction));
- buff->commit(sizeof(transaction));
- }
- {
- uhd::transport::managed_recv_buffer::sptr buff = _xport->get_recv_buff(10.0);
- if (not buff or buff->size() < sizeof(transaction))
- throw std::runtime_error("i2c_zc_impl recv timeout");
- std::memcpy(&transaction, buff->cast<const void *>(), sizeof(transaction));
- }
- return transaction.data;
- }
-
-
-private:
- uhd::transport::zero_copy_if::sptr _xport;
-};
-
-i2c::sptr i2c::make_zc(uhd::transport::zero_copy_if::sptr xport)
-{
- return sptr(new zc_impl(xport));
-}
-
-class simple_udp_impl : public i2c
-{
-public:
- simple_udp_impl(const std::string &ip_addr, const std::string &port)
- {
- _xport = uhd::transport::udp_simple::make_connected(ip_addr, port);
- }
-
- virtual ~simple_udp_impl(void)
- {
- }
-
- void set_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg,
- const uint8_t value)
- {
- i2c_transaction_t transaction;
- transaction.type = i2c::WRITE | ONEBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = value;
-
- _xport->send(
- boost::asio::buffer(
- &transaction,
- sizeof(transaction)));
- }
-
- uint8_t get_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg)
- {
- i2c_transaction_t transaction;
- transaction.type = i2c::READ | ONEBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = 0;
-
- _xport->send(
- boost::asio::buffer(
- &transaction,
- sizeof(transaction)));
-
- uint8_t buff[sizeof(i2c_transaction_t)] = {};
- const size_t nbytes = _xport->recv(
- boost::asio::buffer(buff), 0.100);
- if (not (nbytes == sizeof(transaction)))
- throw std::runtime_error("i2c_simple_udp_impl recv timeout");
- i2c_transaction_t *reply = reinterpret_cast<i2c_transaction_t*>(buff);
- return reply->data;
- }
-
- void set_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg,
- const uint8_t value)
- {
- i2c_transaction_t transaction;
- transaction.type = i2c::WRITE | TWOBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = value;
-
- _xport->send(
- boost::asio::buffer(
- &transaction,
- sizeof(transaction)));
- }
-
- uint8_t get_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg)
- {
- i2c_transaction_t transaction;
- transaction.type = i2c::READ | TWOBYTE;
- transaction.addr = addr;
- transaction.reg = uhd::htonx<uint16_t>(reg);
- transaction.data = 0;
-
- _xport->send(
- boost::asio::buffer(
- &transaction,
- sizeof(transaction)));
-
- uint8_t buff[sizeof(i2c_transaction_t)] = {};
- const size_t nbytes = _xport->recv(
- boost::asio::buffer(buff), 0.100);
- if (not (nbytes == sizeof(transaction)))
- throw std::runtime_error("i2c_simple_udp_impl recv timeout");
- i2c_transaction_t *reply = reinterpret_cast<i2c_transaction_t*>(buff);
- return reply->data;
- }
-
-private:
- uhd::transport::udp_simple::sptr _xport;
-};
-
-i2c::sptr i2c::make_simple_udp(
- const std::string &ip_addr,
- const std::string &port)
-{
- return sptr(new simple_udp_impl(ip_addr,port));
-}
-
-}}} // namespace
-
-#ifdef E300_NATIVE
-
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#include <boost/thread.hpp>
-#include <stdint.h>
-
-namespace uhd { namespace usrp { namespace e300 {
-
-class i2cdev_impl : public i2c
-{
-public:
- i2cdev_impl(const std::string &device)
- {
- _fd = ::open(device.c_str(), O_RDWR);
- if (_fd < 0)
- throw uhd::system_error("open failed.");
- }
-
- virtual ~i2cdev_impl(void)
- {
- close(_fd);
- }
-
- void set_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg,
- const uint8_t value)
- {
- uint8_t outbuf[2];
- i2c_rdwr_ioctl_data packets;
- i2c_msg messages[1];
-
- messages[0].addr = addr;
- messages[0].flags = 0;
- messages[0].len = sizeof(outbuf);
- messages[0].buf = outbuf;
-
- outbuf[0] = reg;
- outbuf[1] = value;
-
- packets.msgs = messages;
- packets.nmsgs = 1;
-
- if(::ioctl(_fd, I2C_RDWR, &packets) < 0) {
- throw std::runtime_error("ioctl failed");
- }
- // this is ugly
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- }
-
- uint8_t get_i2c_reg8(
- const uint8_t addr,
- const uint8_t reg)
- {
- i2c_rdwr_ioctl_data packets;
- i2c_msg messages[2];
-
- uint8_t outbuf = reg;
- messages[0].addr = addr;
- messages[0].flags = 0;
- messages[0].len = sizeof(outbuf);
- messages[0].buf = &outbuf;
-
- uint8_t inbuf;
- messages[1].addr = addr;
- messages[1].flags = I2C_M_RD;
- messages[1].len = sizeof(inbuf);
- messages[1].buf = &inbuf;
-
- packets.msgs = messages;
- packets.nmsgs = 2;
-
- if(::ioctl(_fd, I2C_RDWR, &packets) < 0) {
- throw std::runtime_error("ioctl failed.");
- }
-
- return inbuf;
- }
-
- // the daughterboard uses 16 bit addresses
- void set_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg,
- const uint8_t value)
- {
- uint8_t outbuf[3];
- i2c_rdwr_ioctl_data packets;
- i2c_msg messages[1];
-
- messages[0].addr = addr;
- messages[0].flags = 0;
- messages[0].len = sizeof(outbuf);
- messages[0].buf = outbuf;
-
- outbuf[0] = (reg >> 8) & 0xff;
- outbuf[1] = reg & 0xff;
- outbuf[2] = value;
-
- packets.msgs = messages;
- packets.nmsgs = 1;
-
- if(::ioctl(_fd, I2C_RDWR, &packets) < 0) {
- throw std::runtime_error("ioctl failed");
- }
- // this is ugly
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- }
-
-
- // the daughterboard eeprom uses 16 bit addresses
- uint8_t get_i2c_reg16(
- const uint8_t addr,
- const uint16_t reg)
- {
- i2c_rdwr_ioctl_data packets;
- i2c_msg messages[2];
-
- // always little endian
- uint8_t outbuf[2];
- outbuf[0] = (reg >> 8) & 0xff;
- outbuf[1] = reg & 0xff;
-
- messages[0].addr = addr;
- messages[0].flags = 0;
- messages[0].len = sizeof(outbuf);
- messages[0].buf = outbuf;
-
- uint8_t inbuf;
- messages[1].addr = addr;
- messages[1].flags = I2C_M_RD;
- messages[1].len = sizeof(inbuf);
- messages[1].buf = &inbuf;
-
- packets.msgs = messages;
- packets.nmsgs = 2;
-
- if(::ioctl(_fd, I2C_RDWR, &packets) < 0) {
- throw std::runtime_error("ioctl failed.");
- }
-
- return inbuf;
- }
-
-private:
- int _fd;
-};
-
-}}} // namespace
-
-using namespace uhd::usrp::e300;
-
-i2c::sptr i2c::make_i2cdev(const std::string &device)
-{
- return sptr(new i2cdev_impl(device));
-}
-#else
-using namespace uhd::usrp::e300;
-
-i2c::sptr i2c::make_i2cdev(const std::string &)
-{
- throw uhd::assertion_error("i2c::make() !E300_NATIVE");
-}
-#endif // E300_NATIVE