aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp1
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp1')
-rw-r--r--host/lib/usrp/usrp1/CMakeLists.txt1
-rw-r--r--host/lib/usrp/usrp1/mb_eeprom.cpp90
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.cpp10
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.hpp2
4 files changed, 97 insertions, 6 deletions
diff --git a/host/lib/usrp/usrp1/CMakeLists.txt b/host/lib/usrp/usrp1/CMakeLists.txt
index 6924ba3b0..e212e924a 100644
--- a/host/lib/usrp/usrp1/CMakeLists.txt
+++ b/host/lib/usrp/usrp1/CMakeLists.txt
@@ -27,6 +27,7 @@ IF(ENABLE_USRP1)
${CMAKE_CURRENT_SOURCE_DIR}/codec_ctrl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/dboard_iface.cpp
${CMAKE_CURRENT_SOURCE_DIR}/io_impl.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/mb_eeprom.cpp
${CMAKE_CURRENT_SOURCE_DIR}/soft_time_ctrl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/usrp1_iface.cpp
${CMAKE_CURRENT_SOURCE_DIR}/usrp1_impl.cpp
diff --git a/host/lib/usrp/usrp1/mb_eeprom.cpp b/host/lib/usrp/usrp1/mb_eeprom.cpp
new file mode 100644
index 000000000..ba05b6fd0
--- /dev/null
+++ b/host/lib/usrp/usrp1/mb_eeprom.cpp
@@ -0,0 +1,90 @@
+//
+// Copyright 2017 Ettus Research (National Instruments Corp.)
+//
+// SPDX-License-Identifier: GPL-3.0
+//
+
+#include "usrp1_impl.hpp"
+#include "eeprom_utils.hpp"
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhd/types/byte_vector.hpp>
+
+namespace {
+ const uint8_t USRP1_EEPROM_ADDR = 0x50;
+ const size_t USRP1_SERIAL_LEN = 8;
+
+ //use char array so we dont need to attribute packed
+ struct usrp1_eeprom_map{
+ unsigned char _r[221];
+ unsigned char mcr[4];
+ unsigned char name[NAME_MAX_LEN];
+ unsigned char serial[USRP1_SERIAL_LEN];
+ };
+}
+
+using namespace uhd;
+using uhd::usrp::mboard_eeprom_t;
+
+mboard_eeprom_t usrp1_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
+{
+ mboard_eeprom_t mb_eeprom;
+
+ //extract the serial
+ mb_eeprom["serial"] = uhd::bytes_to_string(iface->read_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, serial), USRP1_SERIAL_LEN
+ ));
+
+ //extract the name
+ mb_eeprom["name"] = uhd::bytes_to_string(iface->read_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, name), NAME_MAX_LEN
+ ));
+
+ //extract master clock rate as a 32-bit uint in Hz
+ uint32_t master_clock_rate;
+ const byte_vector_t rate_bytes = iface->read_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), sizeof(master_clock_rate)
+ );
+ std::copy(
+ rate_bytes.begin(), rate_bytes.end(), //input
+ reinterpret_cast<uint8_t *>(&master_clock_rate) //output
+ );
+ master_clock_rate = ntohl(master_clock_rate);
+ if (master_clock_rate > 1e6 and master_clock_rate < 1e9){
+ mb_eeprom["mcr"] = std::to_string(master_clock_rate);
+ }
+ else mb_eeprom["mcr"] = "";
+
+ return mb_eeprom;
+}
+
+void usrp1_impl::set_mb_eeprom(const mboard_eeprom_t &mb_eeprom)
+{
+ auto &iface = _fx2_ctrl;
+
+ //store the serial
+ if (mb_eeprom.has_key("serial")) iface->write_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, serial),
+ string_to_bytes(mb_eeprom["serial"], USRP1_SERIAL_LEN)
+ );
+
+ //store the name
+ if (mb_eeprom.has_key("name")) iface->write_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, name),
+ string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
+ );
+
+ //store the master clock rate as a 32-bit uint in Hz
+ if (mb_eeprom.has_key("mcr")){
+ uint32_t master_clock_rate = uint32_t(std::stod(mb_eeprom["mcr"]));
+ master_clock_rate = htonl(master_clock_rate);
+ const byte_vector_t rate_bytes(
+ reinterpret_cast<const uint8_t *>(&master_clock_rate),
+ reinterpret_cast<const uint8_t *>(&master_clock_rate)
+ + sizeof(master_clock_rate)
+ );
+ iface->write_eeprom(
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), rate_bytes
+ );
+ }
+}
+
diff --git a/host/lib/usrp/usrp1/usrp1_impl.cpp b/host/lib/usrp/usrp1/usrp1_impl.cpp
index 92b7f5331..17009c6a9 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.cpp
@@ -111,7 +111,8 @@ static device_addrs_t usrp1_find(const device_addr_t &hint)
catch(const uhd::exception &){continue;} //ignore claimed
fx2_ctrl::sptr fx2_ctrl = fx2_ctrl::make(control);
- const mboard_eeprom_t mb_eeprom(*fx2_ctrl, USRP1_EEPROM_MAP_KEY);
+ const mboard_eeprom_t mb_eeprom =
+ usrp1_impl::get_mb_eeprom(fx2_ctrl);
device_addr_t new_addr;
new_addr["type"] = "usrp1";
new_addr["name"] = mb_eeprom["name"];
@@ -218,7 +219,8 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
////////////////////////////////////////////////////////////////////
// setup the mboard eeprom
////////////////////////////////////////////////////////////////////
- const mboard_eeprom_t mb_eeprom(*_fx2_ctrl, USRP1_EEPROM_MAP_KEY);
+ //const mboard_eeprom_t mb_eeprom(*_fx2_ctrl, USRP1_EEPROM_MAP_KEY);
+ const mboard_eeprom_t mb_eeprom = this->get_mb_eeprom(_fx2_ctrl);
_tree->create<mboard_eeprom_t>(mb_path / "eeprom")
.set(mb_eeprom)
.add_coerced_subscriber(boost::bind(&usrp1_impl::set_mb_eeprom, this, _1));
@@ -452,10 +454,6 @@ bool usrp1_impl::has_tx_halfband(void){
/***********************************************************************
* Properties callback methods below
**********************************************************************/
-void usrp1_impl::set_mb_eeprom(const uhd::usrp::mboard_eeprom_t &mb_eeprom){
- mb_eeprom.commit(*_fx2_ctrl, USRP1_EEPROM_MAP_KEY);
-}
-
void usrp1_impl::set_db_eeprom(const std::string &db, const std::string &type, const uhd::usrp::dboard_eeprom_t &db_eeprom){
if (type == "rx") db_eeprom.store(*_fx2_ctrl, (db == "A")? (I2C_ADDR_RX_A) : (I2C_ADDR_RX_B));
if (type == "tx") db_eeprom.store(*_fx2_ctrl, (db == "A")? (I2C_ADDR_TX_A) : (I2C_ADDR_TX_B));
diff --git a/host/lib/usrp/usrp1/usrp1_impl.hpp b/host/lib/usrp/usrp1/usrp1_impl.hpp
index b45d138d1..ca192f907 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.hpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.hpp
@@ -84,6 +84,8 @@ public:
uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &args);
bool recv_async_msg(uhd::async_metadata_t &, double);
+ static uhd::usrp::mboard_eeprom_t get_mb_eeprom(uhd::i2c_iface::sptr);
+
private:
//controllers
uhd::usrp::fx2_ctrl::sptr _fx2_ctrl;