uhd: Set minimum UHD version requirement for E3XX

Create runtime version check for minimum supported UHD driver
when using USRP E3XX devices. The minimum version, 3.9.0, matches
supported version on current E3XX release images.

Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
This commit is contained in:
Tom Tsou 2016-05-03 19:04:15 -07:00
parent 3f4a13f049
commit 3b093bb13b
1 changed files with 31 additions and 3 deletions

View File

@ -131,6 +131,7 @@ static struct uhd_dev_offset special_offsets[] = {
{ UMTRX, 4, 1, 5.2103e-5, "UmTRX diversity, 4 SPS" },
};
/*
* Select sample rate based on device type and requested samples-per-symbol.
* The base rate is either GSM symbol rate, 270.833 kHz, or the minimum
@ -644,7 +645,7 @@ bool uhd_device::parse_dev_type()
{
std::string mboard_str, dev_str;
uhd::property_tree::sptr prop_tree;
size_t usrp1_str, usrp2_str, e100_str, e110_str, e310_str,
size_t usrp1_str, usrp2_str, e100_str, e110_str, e310_str, e3xx_str,
b100_str, b200_str, b210_str, x300_str, x310_str, umtrx_str;
prop_tree = usrp_dev->get_device()->get_tree();
@ -658,7 +659,8 @@ bool uhd_device::parse_dev_type()
b210_str = mboard_str.find("B210");
e100_str = mboard_str.find("E100");
e110_str = mboard_str.find("E110");
e310_str = mboard_str.find("E3XX");
e310_str = mboard_str.find("E310");
e3xx_str = mboard_str.find("E3XX");
x300_str = mboard_str.find("X300");
x310_str = mboard_str.find("X310");
umtrx_str = dev_str.find("UmTRX");
@ -688,7 +690,8 @@ bool uhd_device::parse_dev_type()
} else if (usrp2_str != std::string::npos) {
tx_window = TX_WINDOW_FIXED;
dev_type = USRP2;
} else if (e310_str != std::string::npos) {
} else if ((e310_str != std::string::npos) ||
(e3xx_str != std::string::npos)) {
tx_window = TX_WINDOW_FIXED;
dev_type = E3XX;
} else if (x300_str != std::string::npos) {
@ -717,6 +720,26 @@ bool uhd_device::parse_dev_type()
return true;
}
/*
* Check for UHD version > 3.9.0 for E3XX support
*/
static bool uhd_e3xx_version_chk()
{
std::string ver = uhd::get_version_string();
std::string major_str(ver.begin(), ver.begin() + 3);
std::string minor_str(ver.begin() + 4, ver.begin() + 7);
int major_val = atoi(major_str.c_str());
int minor_val = atoi(minor_str.c_str());
if (major_val < 3)
return false;
if (minor_val < 9)
return false;
return true;
}
int uhd_device::open(const std::string &args, bool extref, bool swap_channels)
{
// Find UHD devices
@ -740,6 +763,11 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels)
if (!parse_dev_type())
return -1;
if ((dev_type == E3XX) && !uhd_e3xx_version_chk()) {
LOG(ALERT) << "E3XX requires UHD 003.009.000 or greater";
return -1;
}
// Verify and set channels
if ((dev_type == B210) && (chans == 2)) {
} else if ((dev_type == UMTRX) && (chans == 2)) {