EDGE: Add support for UmTRX.

Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
This commit is contained in:
Alexander Chemeris 2016-03-20 20:08:57 +03:00 committed by Tom Tsou
parent d17b189cbc
commit 871b87829f
1 changed files with 14 additions and 24 deletions

View File

@ -97,7 +97,7 @@ struct uhd_dev_offset {
* Notes:
* USRP1 with timestamps is not supported by UHD.
*/
static struct uhd_dev_offset uhd_offsets[NUM_USRP_TYPES * 2] = {
static struct uhd_dev_offset uhd_offsets[] = {
{ USRP1, 1, 1, 0.0, "USRP1 not supported" },
{ USRP1, 4, 1, 0.0, "USRP1 not supported"},
{ USRP2, 1, 1, 1.2184e-4, "N2XX 1 SPS" },
@ -116,15 +116,10 @@ static struct uhd_dev_offset uhd_offsets[NUM_USRP_TYPES * 2] = {
{ X3XX, 4, 1, 1.1264e-4, "X3XX 4 SPS"},
{ UMTRX, 1, 1, 9.9692e-5, "UmTRX 1 SPS" },
{ UMTRX, 4, 1, 7.3846e-5, "UmTRX 4 SPS" },
{ B200, 4, 4, B2XX_TIMING_4_4SPS, "B200/B210 EDGE mode (4 SPS TX/RX)" },
{ UMTRX, 4, 4, 5.1503e-5, "UmTRX EDGE mode (4 SPS TX/RX)" },
};
struct uhd_dev_offset edge_offset = {
.type = B200,
.tx_sps = 4,
.rx_sps = 4,
.offset = B2XX_TIMING_4_4SPS,
.desc = "B200/B210 EDGE mode (4 SPS TX/RX)",
};
#define NUM_UHD_OFFSETS (sizeof(uhd_offsets)/sizeof(uhd_offsets[0]))
/*
* Offset handling for special cases. Currently used for UmTRX dual channel
@ -135,7 +130,7 @@ static struct uhd_dev_offset special_offsets[] = {
{ UMTRX, 4, 1, 5.2103e-5, "UmTRX diversity, 4 SPS" },
};
static double get_dev_offset(enum uhd_dev_type type, int tx_sps,
static double get_dev_offset(enum uhd_dev_type type, int tx_sps, int rx_sps,
bool edge = false, bool diversity = false)
{
struct uhd_dev_offset *offset = NULL;
@ -151,6 +146,11 @@ static double get_dev_offset(enum uhd_dev_type type, int tx_sps,
return 0.0;
}
if (edge && (type != B200) && (type != B210) && (type != UMTRX)) {
LOG(ALERT) << "EDGE is supported on B200/B210 and UmTRX only";
return 0.0;
}
/* Special cases (e.g. diversity receiver) */
if (diversity) {
if (type != UMTRX) {
@ -166,22 +166,12 @@ static double get_dev_offset(enum uhd_dev_type type, int tx_sps,
default:
offset = &special_offsets[1];
}
} else if (edge) {
if ((type != B200) && (type != B210)) {
LOG(ALERT) << "EDGE support on B200/B210 only";
return 0.0;
}
if (tx_sps != 4) {
LOG(ALERT) << "Invalid device configuration";
return 0.0;
}
offset = &edge_offset;
} else {
/* Search for matching offset value */
for (int i = 0; i < NUM_USRP_TYPES * 2; i++) {
for (size_t i = 0; i < NUM_UHD_OFFSETS; i++) {
if ((type == uhd_offsets[i].type) &&
(tx_sps == uhd_offsets[i].tx_sps)) {
(tx_sps == uhd_offsets[i].tx_sps) &&
(rx_sps == uhd_offsets[i].rx_sps)) {
offset = &uhd_offsets[i];
break;
}
@ -810,7 +800,7 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels)
if (rx_sps == 4)
edge = true;
double offset = get_dev_offset(dev_type, tx_sps, edge, diversity);
double offset = get_dev_offset(dev_type, tx_sps, rx_sps, edge, diversity);
if (offset == 0.0) {
LOG(ERR) << "Unsupported configuration, no correction applied";
ts_offset = 0;