aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorAshish Chaudhari <ashish@ettus.com>2016-01-06 10:03:29 -0800
committerAshish Chaudhari <ashish@ettus.com>2016-01-06 10:03:29 -0800
commit04a4d6348bff100305bb7481d652c7170b8ff62c (patch)
tree1ad2dae096d3fd3682dab8c029e4aef0b70ecd81 /host
parent81bbb57c06feaa05406ba86abc237a2e80841226 (diff)
downloaduhd-04a4d6348bff100305bb7481d652c7170b8ff62c.tar.gz
uhd-04a4d6348bff100305bb7481d652c7170b8ff62c.tar.bz2
uhd-04a4d6348bff100305bb7481d652c7170b8ff62c.zip
n230: Fixed GPSDO detection logic
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/n230/n230_clk_pps_ctrl.cpp8
-rw-r--r--host/lib/usrp/n230/n230_clk_pps_ctrl.hpp2
-rw-r--r--host/lib/usrp/n230/n230_fpga_defs.h13
-rw-r--r--host/lib/usrp/n230/n230_impl.cpp5
-rw-r--r--host/lib/usrp/n230/n230_resource_manager.cpp21
-rw-r--r--host/lib/usrp/n230/n230_resource_manager.hpp6
6 files changed, 29 insertions, 26 deletions
diff --git a/host/lib/usrp/n230/n230_clk_pps_ctrl.cpp b/host/lib/usrp/n230/n230_clk_pps_ctrl.cpp
index a36fa133d..9d704b702 100644
--- a/host/lib/usrp/n230/n230_clk_pps_ctrl.cpp
+++ b/host/lib/usrp/n230/n230_clk_pps_ctrl.cpp
@@ -36,7 +36,7 @@ public:
n230_ref_pll_ctrl::sptr ref_pll_ctrl,
fpga::core_misc_reg_t& core_misc_reg,
fpga::core_pps_sel_reg_t& core_pps_sel,
- fpga::core_radio_status_reg_t& core_status_reg,
+ fpga::core_status_reg_t& core_status_reg,
const std::vector<time_core_3000::sptr>& time_cores
): _codec_ctrl(codec_ctrl),
_ref_pll_ctrl(ref_pll_ctrl),
@@ -98,7 +98,7 @@ public:
{
bool locked = false;
if (_clock_source == "external" || _clock_source == "gpsdo") {
- locked = (_core_status_reg.read(fpga::core_radio_status_reg_t::REF_LOCKED) == 1);
+ locked = (_core_status_reg.read(fpga::core_status_reg_t::REF_LOCKED) == 1);
} else {
//If the source is internal, the charge pump on the ADF4001 is tristated which
//means that the 40MHz VCTXXO is free running i.e. always "locked"
@@ -132,7 +132,7 @@ private:
n230_ref_pll_ctrl::sptr _ref_pll_ctrl;
fpga::core_misc_reg_t& _core_misc_reg;
fpga::core_pps_sel_reg_t& _core_pps_sel_reg;
- fpga::core_radio_status_reg_t& _core_status_reg;
+ fpga::core_status_reg_t& _core_status_reg;
std::vector<time_core_3000::sptr> _time_cores;
double _tick_rate;
std::string _clock_source;
@@ -149,7 +149,7 @@ n230_clk_pps_ctrl::sptr n230_clk_pps_ctrl::make(
n230_ref_pll_ctrl::sptr ref_pll_ctrl,
fpga::core_misc_reg_t& core_misc_reg,
fpga::core_pps_sel_reg_t& core_pps_sel_reg,
- fpga::core_radio_status_reg_t& core_status_reg,
+ fpga::core_status_reg_t& core_status_reg,
const std::vector<time_core_3000::sptr>& time_cores)
{
return sptr(new n230_clk_pps_ctrl_impl(
diff --git a/host/lib/usrp/n230/n230_clk_pps_ctrl.hpp b/host/lib/usrp/n230/n230_clk_pps_ctrl.hpp
index e97a163fa..3e0a21e04 100644
--- a/host/lib/usrp/n230/n230_clk_pps_ctrl.hpp
+++ b/host/lib/usrp/n230/n230_clk_pps_ctrl.hpp
@@ -39,7 +39,7 @@ public:
n230_ref_pll_ctrl::sptr ref_pll_ctrl,
fpga::core_misc_reg_t& core_misc_reg,
fpga::core_pps_sel_reg_t& core_pps_sel_reg,
- fpga::core_radio_status_reg_t& core_status_reg,
+ fpga::core_status_reg_t& core_status_reg,
const std::vector<time_core_3000::sptr>& time_cores);
virtual ~n230_clk_pps_ctrl() {}
diff --git a/host/lib/usrp/n230/n230_fpga_defs.h b/host/lib/usrp/n230/n230_fpga_defs.h
index 7e1b008ce..3aa96643f 100644
--- a/host/lib/usrp/n230/n230_fpga_defs.h
+++ b/host/lib/usrp/n230/n230_fpga_defs.h
@@ -137,10 +137,10 @@ static const double CODEC_DEFAULT_CLK_RATE = 40e6;
static const double N230_LINK_RATE_BPS = 1e9/8;
/*******************************************************************
- * GPSDO status
+ * GPSDO
*******************************************************************/
-static const uint32_t GPSDO_ST_NONE = 0x83;
-
+static const uint32_t GPSDO_UART_BAUDRATE = 115200;
+static const uint32_t GPSDO_ST_ABSENT = 0x83;
/*******************************************************************
* Register Objects
*******************************************************************/
@@ -192,11 +192,12 @@ public:
}
};
-class core_radio_status_reg_t : public soft_reg64_ro_t {
+class core_status_reg_t : public soft_reg64_ro_t {
public:
- UHD_DEFINE_SOFT_REG_FIELD(REF_LOCKED, /*width*/ 1, /*shift*/ 0); //[0]
+ UHD_DEFINE_SOFT_REG_FIELD(REF_LOCKED, /*width*/ 1, /*shift*/ 0); //[0]
+ UHD_DEFINE_SOFT_REG_FIELD(GPSDO_STATUS, /*width*/ 8, /*shift*/ 32); //[32:39]
- core_radio_status_reg_t():
+ core_status_reg_t():
soft_reg64_ro_t(fpga::rb_addr(fpga::RB_CORE_STATUS))
{ }
};
diff --git a/host/lib/usrp/n230/n230_impl.cpp b/host/lib/usrp/n230/n230_impl.cpp
index 873a9a89f..b3cc4ab59 100644
--- a/host/lib/usrp/n230/n230_impl.cpp
+++ b/host/lib/usrp/n230/n230_impl.cpp
@@ -396,9 +396,8 @@ void n230_impl::_initialize_property_tree(const fs_path& mb_path)
//------------------------------------------------------------------
// GPSDO sensors
//------------------------------------------------------------------
- uhd::gps_ctrl::sptr gps_ctrl = _resource_mgr->get_gps_ctrl();
- if (gps_ctrl and gps_ctrl->gps_detected())
- {
+ if (_resource_mgr->is_gpsdo_present()) {
+ uhd::gps_ctrl::sptr gps_ctrl = _resource_mgr->get_gps_ctrl();
BOOST_FOREACH(const std::string &name, gps_ctrl->get_sensors())
{
_tree->create<sensor_value_t>(mb_path / "sensors" / name)
diff --git a/host/lib/usrp/n230/n230_resource_manager.cpp b/host/lib/usrp/n230/n230_resource_manager.cpp
index fa55d0cd8..2a47c1615 100644
--- a/host/lib/usrp/n230/n230_resource_manager.cpp
+++ b/host/lib/usrp/n230/n230_resource_manager.cpp
@@ -192,23 +192,22 @@ n230_resource_manager::n230_resource_manager(
_ms1_gpio->set_atr_mode(gpio_atr::MODE_GPIO,gpio_atr::gpio_atr_3000::MASK_SET_ALL);
//Create GPSDO interface
- const sid_t gps_uart_sid = _generate_sid(GPS_UART, _get_conn(PRI_ETH).type);
- transport::zero_copy_if::sptr gps_uart_xport =
- _create_transport(_get_conn(PRI_ETH), gps_uart_sid, device_addr_t(), dummy_out_params);
- _gps_uart = n230_uart::make(gps_uart_xport, uhd::htonx(gps_uart_sid.get()));
- _gps_uart->set_baud_divider(fpga::BUS_CLK_RATE/115200);
- _gps_uart->write_uart("\n"); //cause the baud and response to be setup
- boost::this_thread::sleep(boost::posix_time::seconds(1)); //allow for a little propagation
- if ((_core_ctrl->peek32(fpga::RB_CORE_STATUS) & 0xff) != fpga::GPSDO_ST_NONE)
- {
+ if (_core_status_reg.read(fpga::core_status_reg_t::GPSDO_STATUS) != fpga::GPSDO_ST_ABSENT) {
UHD_MSG(status) << "Detecting GPSDO.... " << std::flush;
try {
+ const sid_t gps_uart_sid = _generate_sid(GPS_UART, _get_conn(PRI_ETH).type);
+ transport::zero_copy_if::sptr gps_uart_xport =
+ _create_transport(_get_conn(PRI_ETH), gps_uart_sid, device_addr_t(), dummy_out_params);
+ _gps_uart = n230_uart::make(gps_uart_xport, uhd::htonx(gps_uart_sid.get()));
+ _gps_uart->set_baud_divider(fpga::BUS_CLK_RATE/fpga::GPSDO_UART_BAUDRATE);
+ _gps_uart->write_uart("\n"); //cause the baud and response to be setup
+ boost::this_thread::sleep(boost::posix_time::seconds(1)); //allow for a little propagation
_gps_ctrl = gps_ctrl::make(_gps_uart);
} catch(std::exception &e) {
UHD_MSG(error) << "An error occurred making GPSDO control: " << e.what() << std::endl;
}
- if (not (_gps_ctrl and _gps_ctrl->gps_detected())) {
- _core_ctrl->poke32(fpga::sr_addr(fpga::SR_CORE_GPSDO_ST), fpga::GPSDO_ST_NONE);
+ if (not is_gpsdo_present()) {
+ _core_ctrl->poke32(fpga::sr_addr(fpga::SR_CORE_GPSDO_ST), fpga::GPSDO_ST_ABSENT);
}
}
diff --git a/host/lib/usrp/n230/n230_resource_manager.hpp b/host/lib/usrp/n230/n230_resource_manager.hpp
index 0c01e765a..c98140141 100644
--- a/host/lib/usrp/n230/n230_resource_manager.hpp
+++ b/host/lib/usrp/n230/n230_resource_manager.hpp
@@ -181,6 +181,10 @@ public: //Methods
}
//GPSDO control
+ inline bool is_gpsdo_present() {
+ return _gps_ctrl.get() and _gps_ctrl->gps_detected();
+ }
+
inline uhd::gps_ctrl::sptr get_gps_ctrl(void) {
return _gps_ctrl;
}
@@ -283,7 +287,7 @@ private:
fpga::core_radio_ctrl_reg_t _core_radio_ctrl_reg;
fpga::core_misc_reg_t _core_misc_reg;
fpga::core_pps_sel_reg_t _core_pps_sel_reg;
- fpga::core_radio_status_reg_t _core_status_reg;
+ fpga::core_status_reg_t _core_status_reg;
//Radio peripherals
radio_resource_t _radios[fpga::NUM_RADIOS];