From da8a6ff1ee9ac9eb14cb290a8fed9a95f5232a21 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 10 Oct 2011 17:18:14 -0700 Subject: usrp: added revision field to the dboard id class --- host/include/uhd/usrp/dboard_eeprom.hpp | 3 +++ host/lib/usrp/dboard_eeprom.cpp | 21 +++++++++++++++++++-- host/utils/usrp_burn_db_eeprom.cpp | 8 ++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/host/include/uhd/usrp/dboard_eeprom.hpp b/host/include/uhd/usrp/dboard_eeprom.hpp index f0190e233..93fc5ac7d 100644 --- a/host/include/uhd/usrp/dboard_eeprom.hpp +++ b/host/include/uhd/usrp/dboard_eeprom.hpp @@ -33,6 +33,9 @@ struct UHD_API dboard_eeprom_t{ //! The unique serial number std::string serial; + //! A hardware revision number + std::string revision; + /*! * Create an empty dboard eeprom struct. */ diff --git a/host/lib/usrp/dboard_eeprom.cpp b/host/lib/usrp/dboard_eeprom.cpp index b3cb54c1c..f2bee47a9 100644 --- a/host/lib/usrp/dboard_eeprom.cpp +++ b/host/lib/usrp/dboard_eeprom.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -68,8 +69,8 @@ static const byte_vector_t string_to_bytes(const std::string &string, size_t max #define DB_EEPROM_MAGIC_VALUE 0xDB #define DB_EEPROM_ID_LSB 0x01 #define DB_EEPROM_ID_MSB 0x02 -#define DB_EEPROM_OE_LSB 0x03 -#define DB_EEPROM_OE_MSB 0x04 +#define DB_EEPROM_REV_LSB 0x03 +#define DB_EEPROM_REV_MSB 0x04 #define DB_EEPROM_OFFSET_0_LSB 0x05 // offset correction for ADC or DAC 0 #define DB_EEPROM_OFFSET_0_MSB 0x06 #define DB_EEPROM_OFFSET_1_LSB 0x07 // offset correction for ADC or DAC 1 @@ -127,6 +128,15 @@ void dboard_eeprom_t::load(i2c_iface &iface, boost::uint8_t addr){ &bytes.at(DB_EEPROM_SERIAL+DB_EEPROM_SERIAL_LEN)) ); + //parse the revision + const boost::uint16_t rev_num = 0 + | (boost::uint16_t(bytes[DB_EEPROM_REV_LSB]) << 0) + | (boost::uint16_t(bytes[DB_EEPROM_REV_MSB]) << 8) + ; + if (rev_num != 0 and rev_num != 0xffff){ + revision = boost::lexical_cast(rev_num); + } + }catch(const uhd::assertion_error &){ id = dboard_id_t::none(); serial = ""; @@ -145,6 +155,13 @@ void dboard_eeprom_t::store(i2c_iface &iface, boost::uint8_t addr) const{ byte_vector_t ser_bytes = string_to_bytes(serial, DB_EEPROM_SERIAL_LEN); std::copy(ser_bytes.begin(), ser_bytes.end(), &bytes.at(DB_EEPROM_SERIAL)); + //load the revision bytes + if (not revision.empty()){ + const boost::uint16_t rev_num = boost::lexical_cast(revision); + bytes[DB_EEPROM_REV_LSB] = boost::uint8_t(rev_num >> 0); + bytes[DB_EEPROM_REV_MSB] = boost::uint8_t(rev_num >> 8); + } + //load the checksum bytes[DB_EEPROM_CHKSUM] = checksum(bytes); diff --git a/host/utils/usrp_burn_db_eeprom.cpp b/host/utils/usrp_burn_db_eeprom.cpp index 253b73262..b6b2dc4d6 100644 --- a/host/utils/usrp_burn_db_eeprom.cpp +++ b/host/utils/usrp_burn_db_eeprom.cpp @@ -44,6 +44,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ ("unit", po::value(&unit)->default_value(""), "which unit [RX, TX, or GDB]") ("id", po::value(), "dboard id to burn, omit for readback") ("ser", po::value(), "serial to burn, omit for readback") + ("rev", po::value(), "revision to burn, omit for readback") ; po::variables_map vm; @@ -87,6 +88,13 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ } std::cout << boost::format(" Current serial: \"%s\"") % db_eeprom.serial << std::endl; + //------------- handle the dboard revision------------------------// + if (vm.count("rev")){ + db_eeprom.revision = vm["rev"].as(); + tree->access(db_path).set(db_eeprom); + } + std::cout << boost::format(" Current revision: \"%s\"") % db_eeprom.revision << std::endl; + std::cout << " Done" << std::endl << std::endl; return 0; } -- cgit v1.2.3