summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/lib/usrp/mboard_eeprom.cpp114
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp2
2 files changed, 80 insertions, 36 deletions
diff --git a/host/lib/usrp/mboard_eeprom.cpp b/host/lib/usrp/mboard_eeprom.cpp
index 35fba547a..467b4289d 100644
--- a/host/lib/usrp/mboard_eeprom.cpp
+++ b/host/lib/usrp/mboard_eeprom.cpp
@@ -65,17 +65,32 @@ static const byte_vector_t string_to_bytes(const std::string &string, size_t max
return bytes;
}
+//! convert a string to a byte vector to write to eeprom
+static byte_vector_t string_to_uint16_bytes(const std::string &num_str){
+ const boost::uint16_t num = boost::lexical_cast<boost::uint16_t>(num_str);
+ const byte_vector_t lsb_msb = boost::assign::list_of
+ (boost::uint8_t(num >> 0))(boost::uint8_t(num >> 8));
+ return lsb_msb;
+}
+
+//! convert a byte vector read from eeprom to a string
+static std::string uint16_bytes_to_string(const byte_vector_t &bytes){
+ const boost::uint16_t num = (boost::uint16_t(bytes.at(0)) << 0) | (boost::uint16_t(bytes.at(1)) << 8);
+ return (num == 0 or num == 0xffff)? "" : boost::lexical_cast<std::string>(num);
+}
+
/***********************************************************************
* Implementation of N100 load/store
**********************************************************************/
static const boost::uint8_t N100_EEPROM_ADDR = 0x50;
static const uhd::dict<std::string, boost::uint8_t> USRP_N100_OFFSETS = boost::assign::map_list_of
- ("rev-lsb-msb", 0x00)
+ ("hardware", 0x00)
("mac-addr", 0x02)
("ip-addr", 0x0C)
//leave space here for other addresses (perhaps)
- ("prod-lsb-msb", 0x14)
+ ("revision", 0x12)
+ ("product", 0x14)
("gpsdo", 0x17)
("serial", 0x18)
("name", 0x18 + SERIAL_LEN)
@@ -88,15 +103,20 @@ enum n200_gpsdo_type{
};
static void load_n100(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
+ //extract the hardware number
+ mb_eeprom["hardware"] = uint16_bytes_to_string(
+ iface.read_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["hardware"], 2)
+ );
+
//extract the revision number
- byte_vector_t rev_lsb_msb = iface.read_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["rev-lsb-msb"], 2);
- boost::uint16_t rev = (boost::uint16_t(rev_lsb_msb.at(0)) << 0) | (boost::uint16_t(rev_lsb_msb.at(1)) << 8);
- mb_eeprom["rev"] = boost::lexical_cast<std::string>(rev);
+ mb_eeprom["revision"] = uint16_bytes_to_string(
+ iface.read_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["revision"], 2)
+ );
//extract the product code
- byte_vector_t prod_lsb_msb = iface.read_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["prod-lsb-msb"], 2);
- boost::uint16_t prod = (boost::uint16_t(prod_lsb_msb.at(0)) << 0) | (boost::uint16_t(prod_lsb_msb.at(1)) << 8);
- mb_eeprom["product"] = (prod == 0 or prod == 0xffff)? "" : boost::lexical_cast<std::string>(prod);
+ mb_eeprom["product"] = uint16_bytes_to_string(
+ iface.read_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["product"], 2)
+ );
//extract the addresses
mb_eeprom["mac-addr"] = mac_addr_t::from_bytes(iface.read_eeprom(
@@ -137,24 +157,22 @@ static void load_n100(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
static void store_n100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
//parse the revision number
- if (mb_eeprom.has_key("rev")){
- boost::uint16_t rev = boost::lexical_cast<boost::uint16_t>(mb_eeprom["rev"]);
- byte_vector_t rev_lsb_msb = boost::assign::list_of
- (boost::uint8_t(rev >> 0))
- (boost::uint8_t(rev >> 8))
- ;
- iface.write_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["rev-lsb-msb"], rev_lsb_msb);
- }
+ if (mb_eeprom.has_key("hardware")) iface.write_eeprom(
+ N100_EEPROM_ADDR, USRP_N100_OFFSETS["hardware"],
+ string_to_uint16_bytes(mb_eeprom["hardware"])
+ );
+
+ //parse the revision number
+ if (mb_eeprom.has_key("revision")) iface.write_eeprom(
+ N100_EEPROM_ADDR, USRP_N100_OFFSETS["revision"],
+ string_to_uint16_bytes(mb_eeprom["revision"])
+ );
//parse the product code
- if (mb_eeprom.has_key("product")){
- boost::uint16_t prod = boost::lexical_cast<boost::uint16_t>(mb_eeprom["product"]);
- byte_vector_t prod_lsb_msb = boost::assign::list_of
- (boost::uint8_t(prod >> 0))
- (boost::uint8_t(prod >> 8))
- ;
- iface.write_eeprom(N100_EEPROM_ADDR, USRP_N100_OFFSETS["prod-lsb-msb"], prod_lsb_msb);
- }
+ if (mb_eeprom.has_key("product")) iface.write_eeprom(
+ N100_EEPROM_ADDR, USRP_N100_OFFSETS["product"],
+ string_to_uint16_bytes(mb_eeprom["product"])
+ );
//store the addresses
if (mb_eeprom.has_key("mac-addr")) iface.write_eeprom(
@@ -195,27 +213,41 @@ static void store_n100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
static const boost::uint8_t B000_EEPROM_ADDR = 0x50;
static const size_t B000_SERIAL_LEN = 8;
-static const uhd::dict<std::string, boost::uint8_t> USRP_B000_OFFSETS = boost::assign::map_list_of
- ("serial", 0xf8)
- ("name", 0xf8 - NAME_MAX_LEN)
- ("mcr", 0xf8 - NAME_MAX_LEN - sizeof(boost::uint32_t))
-;
+//use char array so we dont need to attribute packed
+struct b000_eeprom_map{
+ unsigned char _r[217];
+ unsigned char revision[2];
+ unsigned char product[2];
+ unsigned char mcr[4];
+ unsigned char name[NAME_MAX_LEN];
+ unsigned char serial[B000_SERIAL_LEN];
+};
static void load_b000(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
+ //extract the revision number
+ mb_eeprom["revision"] = uint16_bytes_to_string(
+ iface.read_eeprom(B000_EEPROM_ADDR, offsetof(b000_eeprom_map, revision), 2)
+ );
+
+ //extract the product code
+ mb_eeprom["product"] = uint16_bytes_to_string(
+ iface.read_eeprom(B000_EEPROM_ADDR, offsetof(b000_eeprom_map, product), 2)
+ );
+
//extract the serial
mb_eeprom["serial"] = bytes_to_string(iface.read_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["serial"], B000_SERIAL_LEN
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, serial), B000_SERIAL_LEN
));
//extract the name
mb_eeprom["name"] = bytes_to_string(iface.read_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["name"], NAME_MAX_LEN
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, name), NAME_MAX_LEN
));
//extract master clock rate as a 32-bit uint in Hz
boost::uint32_t master_clock_rate;
const byte_vector_t rate_bytes = iface.read_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["mcr"], sizeof(master_clock_rate)
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, mcr), sizeof(master_clock_rate)
);
std::copy(
rate_bytes.begin(), rate_bytes.end(), //input
@@ -229,15 +261,27 @@ static void load_b000(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
}
static void store_b000(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
+ //parse the revision number
+ if (mb_eeprom.has_key("revision")) iface.write_eeprom(
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, revision),
+ string_to_uint16_bytes(mb_eeprom["revision"])
+ );
+
+ //parse the product code
+ if (mb_eeprom.has_key("product")) iface.write_eeprom(
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, product),
+ string_to_uint16_bytes(mb_eeprom["product"])
+ );
+
//store the serial
if (mb_eeprom.has_key("serial")) iface.write_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["serial"],
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, serial),
string_to_bytes(mb_eeprom["serial"], B000_SERIAL_LEN)
);
//store the name
if (mb_eeprom.has_key("name")) iface.write_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["name"],
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, name),
string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
);
@@ -250,7 +294,7 @@ static void store_b000(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
reinterpret_cast<const boost::uint8_t *>(&master_clock_rate) + sizeof(master_clock_rate)
);
iface.write_eeprom(
- B000_EEPROM_ADDR, USRP_B000_OFFSETS["mcr"], rate_bytes
+ B000_EEPROM_ADDR, offsetof(b000_eeprom_map, mcr), rate_bytes
);
}
}
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index 5e9759ba5..3c9e0ae0c 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -291,7 +291,7 @@ public:
}
rev_type get_rev(void){
- switch (boost::lexical_cast<boost::uint16_t>(mb_eeprom["rev"])){
+ switch (boost::lexical_cast<boost::uint16_t>(mb_eeprom["hardware"])){
case 0x0300:
case 0x0301: return USRP2_REV3;
case 0x0400: return USRP2_REV4;