mirror of
https://github.com/EttusResearch/uhd.git
synced 2026-10-25 17:36:10 +00:00
uhd: rename identifier for usrp1 eeprom, and fix offsets, add serial support to usrp2
This commit is contained in:
parent
3ac3457184
commit
94a492dc40
@ -77,7 +77,7 @@ set(eeprom1_sources
|
||||
add_custom_target(usrp1_eeprom ALL
|
||||
DEPENDS usrp1_boot
|
||||
COMMAND objcopy -I ihex -O binary usrp1_boot.ihx usrp1_boot.bin
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${BUILD_EEPROM} -r2 usrp1_boot.bin usrp1_eeprom.bin
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${BUILD_EEPROM} -r1 usrp1_boot.bin usrp1_eeprom.bin
|
||||
)
|
||||
|
||||
add_executable(usrp1_boot ${eeprom1_sources})
|
||||
|
||||
@ -37,7 +37,7 @@ namespace uhd{ namespace usrp{
|
||||
//! Possible EEPROM maps types
|
||||
enum map_type{
|
||||
MAP_NXXX,
|
||||
MAP_BXXX
|
||||
MAP_B1XX
|
||||
};
|
||||
|
||||
//! Make a new empty mboard eeprom
|
||||
|
||||
@ -94,6 +94,9 @@ static void load_nxxx(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
mb_eeprom["name"] = bytes_to_string(iface.read_eeprom(
|
||||
NXXX_EEPROM_ADDR, USRP_NXXX_OFFSETS["name"], NAME_MAX_LEN
|
||||
));
|
||||
|
||||
//empty serial correction: use the mac address
|
||||
if (mb_eeprom["serial"].empty()) mb_eeprom["serial"] = mb_eeprom["mac-addr"];
|
||||
}
|
||||
|
||||
static void store_nxxx(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
@ -129,37 +132,38 @@ static void store_nxxx(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Implementation of BXXX load/store
|
||||
* Implementation of B1XX load/store
|
||||
**********************************************************************/
|
||||
static const boost::uint8_t BXXX_EEPROM_ADDR = 0x50;
|
||||
static const boost::uint8_t B1XX_EEPROM_ADDR = 0x50;
|
||||
static const size_t B1XXX_SERIAL_LEN = 8;
|
||||
|
||||
static const uhd::dict<std::string, boost::uint8_t> USRP_BXXX_OFFSETS = boost::assign::map_list_of
|
||||
static const uhd::dict<std::string, boost::uint8_t> USRP_B1XX_OFFSETS = boost::assign::map_list_of
|
||||
("serial", 0xf8)
|
||||
("name", 0xf8 + SERIAL_LEN)
|
||||
("name", 0xf8 - NAME_MAX_LEN)
|
||||
;
|
||||
|
||||
static void load_bxxx(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
static void load_b1xx(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
//extract the serial
|
||||
mb_eeprom["serial"] = bytes_to_string(iface.read_eeprom(
|
||||
BXXX_EEPROM_ADDR, USRP_BXXX_OFFSETS["serial"], SERIAL_LEN
|
||||
B1XX_EEPROM_ADDR, USRP_B1XX_OFFSETS["serial"], B1XXX_SERIAL_LEN
|
||||
));
|
||||
|
||||
//extract the name
|
||||
mb_eeprom["name"] = bytes_to_string(iface.read_eeprom(
|
||||
BXXX_EEPROM_ADDR, USRP_BXXX_OFFSETS["name"], NAME_MAX_LEN
|
||||
B1XX_EEPROM_ADDR, USRP_B1XX_OFFSETS["name"], NAME_MAX_LEN
|
||||
));
|
||||
}
|
||||
|
||||
static void store_bxxx(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
static void store_b1xx(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
|
||||
//store the serial
|
||||
iface.write_eeprom(
|
||||
BXXX_EEPROM_ADDR, USRP_BXXX_OFFSETS["serial"],
|
||||
string_to_bytes(mb_eeprom["serial"], SERIAL_LEN)
|
||||
B1XX_EEPROM_ADDR, USRP_B1XX_OFFSETS["serial"],
|
||||
string_to_bytes(mb_eeprom["serial"], B1XXX_SERIAL_LEN)
|
||||
);
|
||||
|
||||
//store the name
|
||||
iface.write_eeprom(
|
||||
BXXX_EEPROM_ADDR, USRP_BXXX_OFFSETS["name"],
|
||||
B1XX_EEPROM_ADDR, USRP_B1XX_OFFSETS["name"],
|
||||
string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
|
||||
);
|
||||
}
|
||||
@ -174,13 +178,13 @@ mboard_eeprom_t::mboard_eeprom_t(void){
|
||||
mboard_eeprom_t::mboard_eeprom_t(i2c_iface &iface, map_type map){
|
||||
switch(map){
|
||||
case MAP_NXXX: load_nxxx(*this, iface); break;
|
||||
case MAP_BXXX: load_bxxx(*this, iface); break;
|
||||
case MAP_B1XX: load_b1xx(*this, iface); break;
|
||||
}
|
||||
}
|
||||
|
||||
void mboard_eeprom_t::commit(i2c_iface &iface, map_type map){
|
||||
switch(map){
|
||||
case MAP_NXXX: store_nxxx(*this, iface); break;
|
||||
case MAP_BXXX: store_bxxx(*this, iface); break;
|
||||
case MAP_B1XX: store_b1xx(*this, iface); break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -379,7 +379,7 @@ void usrp1_impl::mboard_set(const wax::obj &key, const wax::obj &val)
|
||||
|
||||
case MBOARD_PROP_EEPROM_MAP:
|
||||
_iface->mb_eeprom = val.as<mboard_eeprom_t>();
|
||||
_iface->mb_eeprom.commit(*_iface, mboard_eeprom_t::MAP_BXXX);
|
||||
_iface->mb_eeprom.commit(*_iface, mboard_eeprom_t::MAP_B1XX);
|
||||
return;
|
||||
|
||||
default: UHD_THROW_PROP_SET_ERROR();
|
||||
|
||||
@ -38,7 +38,7 @@ public:
|
||||
usrp1_iface_impl(usrp_ctrl::sptr ctrl_transport)
|
||||
{
|
||||
_ctrl_transport = ctrl_transport;
|
||||
mb_eeprom = mboard_eeprom_t(*this, mboard_eeprom_t::MAP_BXXX);
|
||||
mb_eeprom = mboard_eeprom_t(*this, mboard_eeprom_t::MAP_B1XX);
|
||||
}
|
||||
|
||||
~usrp1_iface_impl(void)
|
||||
|
||||
@ -102,36 +102,37 @@ static uhd::device_addrs_t usrp2_find(const device_addr_t &hint){
|
||||
while(true){
|
||||
size_t len = udp_transport->recv(asio::buffer(usrp2_ctrl_data_in_mem), DISCOVERY_TIMEOUT_MS);
|
||||
//std::cout << len << "\n";
|
||||
if (len > offsetof(usrp2_ctrl_data_t, data)){
|
||||
//handle the received data
|
||||
switch(ntohl(ctrl_data_in->id)){
|
||||
case USRP2_CTRL_ID_WAZZUP_DUDE:
|
||||
//make a boost asio ipv4 with the raw addr in host byte order
|
||||
boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr));
|
||||
device_addr_t new_addr;
|
||||
new_addr["type"] = "usrp2";
|
||||
new_addr["addr"] = ip_addr.to_string();
|
||||
//Attempt to read the name from the EEPROM and perform filtering.
|
||||
//This operation can throw due to COMPAT mismatch. That is OK.
|
||||
//We will allow the device to be found and the COMPAT mismatch
|
||||
//will be thrown as an exception in the factory function.
|
||||
try{
|
||||
new_addr["name"] = usrp2_iface::make(udp_simple::make_connected(
|
||||
new_addr["addr"], num2str(USRP2_UDP_CTRL_PORT))
|
||||
)->mb_eeprom["name"];
|
||||
if (not hint.has_key("name") or hint["name"] == new_addr["name"]){
|
||||
usrp2_addrs.push_back(new_addr);
|
||||
}
|
||||
if (len > offsetof(usrp2_ctrl_data_t, data) and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE){
|
||||
//make a boost asio ipv4 with the raw addr in host byte order
|
||||
boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr));
|
||||
device_addr_t new_addr;
|
||||
new_addr["type"] = "usrp2";
|
||||
new_addr["addr"] = ip_addr.to_string();
|
||||
//Attempt to read the name from the EEPROM and perform filtering.
|
||||
//This operation can throw due to COMPAT mismatch. That is OK.
|
||||
//We will allow the device to be found and the COMPAT mismatch
|
||||
//will be thrown as an exception in the factory function.
|
||||
try{
|
||||
mboard_eeprom_t mb_eeprom = usrp2_iface::make(
|
||||
udp_simple::make_connected(new_addr["addr"], num2str(USRP2_UDP_CTRL_PORT))
|
||||
)->mb_eeprom;
|
||||
new_addr["name"] = mb_eeprom["name"];
|
||||
new_addr["serial"] = mb_eeprom["serial"];
|
||||
if (
|
||||
(not hint.has_key("name") or hint["name"] == new_addr["name"]) and
|
||||
(not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
|
||||
){
|
||||
usrp2_addrs.push_back(new_addr);
|
||||
}
|
||||
catch(const std::exception &e){
|
||||
uhd::warning::post(
|
||||
std::string("Ignoring discovered device\n")
|
||||
+ e.what()
|
||||
);
|
||||
}
|
||||
//dont break here, it will exit the while loop
|
||||
//just continue on to the next loop iteration
|
||||
}
|
||||
catch(const std::exception &e){
|
||||
uhd::warning::post(
|
||||
std::string("Ignoring discovered device\n")
|
||||
+ e.what()
|
||||
);
|
||||
}
|
||||
//dont break here, it will exit the while loop
|
||||
//just continue on to the next loop iteration
|
||||
}
|
||||
if (len == 0) break; //timeout
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user