diff options
-rw-r--r-- | host/lib/usrp2/usrp2_impl.cpp | 73 | ||||
-rw-r--r-- | host/lib/usrp2/usrp2_impl.hpp | 6 |
2 files changed, 59 insertions, 20 deletions
diff --git a/host/lib/usrp2/usrp2_impl.cpp b/host/lib/usrp2/usrp2_impl.cpp index 53e0c51ac..3e39b7d23 100644 --- a/host/lib/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp2/usrp2_impl.cpp @@ -230,8 +230,8 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ //////////////////////////////////////////////////////////////// // create codec control objects //////////////////////////////////////////////////////////////// - property_tree::path_type rx_codec_path = mb_path / "rx_codecs/0"; - property_tree::path_type tx_codec_path = mb_path / "tx_codecs/0"; + property_tree::path_type rx_codec_path = mb_path / "rx_codecs/A"; + property_tree::path_type tx_codec_path = mb_path / "tx_codecs/A"; _mboard_stuff[mb].codec = usrp2_codec_ctrl::make(_mboard_stuff[mb].iface); switch(_mboard_stuff[mb].iface->get_rev()){ case usrp2_iface::USRP_N200: @@ -239,15 +239,13 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ case usrp2_iface::USRP_N200_R4: case usrp2_iface::USRP_N210_R4:{ _tree->create(rx_codec_path / "name", property<std::string>("ads62p44")); - _tree->create(rx_codec_path / "gains/0/name", property<std::string>("digital")); - _tree->create(rx_codec_path / "gains/0/range", property<meta_range_t>(meta_range_t(0, 6.0, 0.5))); + _tree->create(rx_codec_path / "gains/digital/range", property<meta_range_t>(meta_range_t(0, 6.0, 0.5))); property<double> dig_gain_prop, fine_gain_prop; dig_gain_prop.subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_gain, _mboard_stuff[mb].codec, _1)); - _tree->create(rx_codec_path / "gains/0/value", dig_gain_prop); - _tree->create(rx_codec_path / "gains/1/name", property<std::string>("digital-fine")); - _tree->create(rx_codec_path / "gains/1/range", property<meta_range_t>(meta_range_t(0, 0.5, 0.05))); + _tree->create(rx_codec_path / "gains/digital/value", dig_gain_prop); + _tree->create(rx_codec_path / "gains/fine/range", property<meta_range_t>(meta_range_t(0, 0.5, 0.05))); fine_gain_prop.subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_fine_gain, _mboard_stuff[mb].codec, _1)); - _tree->create(rx_codec_path / "gains/0/value", fine_gain_prop); + _tree->create(rx_codec_path / "gains/fine/value", fine_gain_prop); }break; case usrp2_iface::USRP2_REV3: @@ -264,13 +262,42 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ //////////////////////////////////////////////////////////////// // create gpsdo control objects //////////////////////////////////////////////////////////////// - //TODO - //TODO register sensors + if (_mboard_stuff[mb].iface->mb_eeprom["gpsdo"] == "internal"){ + _mboard_stuff[mb].gps = gps_ctrl::make( + _mboard_stuff[mb].iface->get_gps_write_fn(), + _mboard_stuff[mb].iface->get_gps_read_fn() + ); + BOOST_FOREACH(const std::string &name, _mboard_stuff[mb].gps->get_sensors()){ + property<sensor_value_t> sensor_prop; + sensor_prop.publish(boost::bind(&gps_ctrl::get_sensor, _mboard_stuff[mb].gps, name)); + _tree->create(mb_path / "sensors" / name, sensor_prop); + } + } + + //////////////////////////////////////////////////////////////// + // and do the misc mboard sensors + //////////////////////////////////////////////////////////////// + property<sensor_value_t> mimo_lock_sensor_prop; + mimo_lock_sensor_prop.publish(boost::bind(&usrp2_impl::get_mimo_locked, this, mb)); + _tree->create(mb_path / "sensors/mimo_locked", mimo_lock_sensor_prop); + property<sensor_value_t> ref_lock_sensor_prop; + ref_lock_sensor_prop.publish(boost::bind(&usrp2_impl::get_ref_locked, this, mb)); + _tree->create(mb_path / "sensors/ref_locked", ref_lock_sensor_prop); + - //TODO other sensors + + + + //TODO //initialize VITA time to GPS time //TODO clock source, time source + + + + + + //////////////////////////////////////////////////////////////// // create frontend control objects //////////////////////////////////////////////////////////////// @@ -353,15 +380,15 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ //create the properties and register subscribers property<dboard_eeprom_t> rx_db_eeprom_prop(rx_db_eeprom), tx_db_eeprom_prop(tx_db_eeprom), gdb_eeprom_prop(gdb_eeprom); rx_db_eeprom_prop.subscribe(boost::bind(&usrp2_impl::set_db_eeprom, this, mb, "rx", _1)); - _tree->create(mb_path / "dboards/0/rx_eeprom", rx_db_eeprom_prop); + _tree->create(mb_path / "dboards/A/rx_eeprom", rx_db_eeprom_prop); tx_db_eeprom_prop.subscribe(boost::bind(&usrp2_impl::set_db_eeprom, this, mb, "tx", _1)); - _tree->create(mb_path / "dboards/0/tx_eeprom", tx_db_eeprom_prop); + _tree->create(mb_path / "dboards/A/tx_eeprom", tx_db_eeprom_prop); gdb_eeprom_prop.subscribe(boost::bind(&usrp2_impl::set_db_eeprom, this, mb, "gdb", _1)); - _tree->create(mb_path / "dboards/0/gdb_eeprom", gdb_eeprom_prop); + _tree->create(mb_path / "dboards/A/gdb_eeprom", gdb_eeprom_prop); //create a new dboard interface and manager _mboard_stuff[mb].dboard_iface = make_usrp2_dboard_iface(_mboard_stuff[mb].iface, _mboard_stuff[mb].clock); - _tree->create(mb_path / "dboards/0/iface", property<dboard_iface::sptr>(_mboard_stuff[mb].dboard_iface)); + _tree->create(mb_path / "dboards/A/iface", property<dboard_iface::sptr>(_mboard_stuff[mb].dboard_iface)); _mboard_stuff[mb].dboard_manager = dboard_manager::make( rx_db_eeprom.id, ((gdb_eeprom.id == dboard_id_t::none())? tx_db_eeprom : gdb_eeprom).id, @@ -369,19 +396,17 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ ); BOOST_FOREACH(const std::string &name, _mboard_stuff[mb].dboard_manager->get_rx_subdev_names()){ dboard_manager::populate_prop_tree_from_subdev( - _tree, mb_path / "rx_rf_frontends" / name, + _tree, mb_path / "dboards/A/rx_frontends" / name, _mboard_stuff[mb].dboard_manager->get_rx_subdev(name) ); } BOOST_FOREACH(const std::string &name, _mboard_stuff[mb].dboard_manager->get_tx_subdev_names()){ dboard_manager::populate_prop_tree_from_subdev( - _tree, mb_path / "tx_rf_frontends" / name, + _tree, mb_path / "dboards/A/tx_frontends" / name, _mboard_stuff[mb].dboard_manager->get_tx_subdev(name) ); } - } - } usrp2_impl::~usrp2_impl(void){UHD_SAFE_CALL( @@ -399,3 +424,13 @@ void usrp2_impl::set_db_eeprom(const size_t which_mb, const std::string &type, c if (type == "tx") db_eeprom.store(*_mboard_stuff[which_mb].iface, USRP2_I2C_ADDR_TX_DB); if (type == "gdb") db_eeprom.store(*_mboard_stuff[which_mb].iface, USRP2_I2C_ADDR_TX_DB ^ 5); } + +sensor_value_t usrp2_impl::get_mimo_locked(const size_t which_mb){ + const bool lock = (_mboard_stuff[which_mb].iface->peek32(U2_REG_IRQ_RB) & (1<<10)) != 0; + return sensor_value_t("MIMO", lock, "locked", "unlocked"); +} + +sensor_value_t usrp2_impl::get_ref_locked(const size_t which_mb){ + const bool lock = (_mboard_stuff[which_mb].iface->peek32(U2_REG_IRQ_RB) & (1<<11)) != 0; + return sensor_value_t("Ref", lock, "locked", "unlocked"); +} diff --git a/host/lib/usrp2/usrp2_impl.hpp b/host/lib/usrp2/usrp2_impl.hpp index fe82af40a..47fc10d8d 100644 --- a/host/lib/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp2/usrp2_impl.hpp @@ -66,7 +66,7 @@ uhd::usrp::dboard_iface::sptr make_usrp2_dboard_iface( */ class usrp2_impl{ public: - usrp2_impl(const uhd::device_addr_t &_device_addr); + usrp2_impl(const uhd::device_addr_t &); ~usrp2_impl(void); uhd::property_tree::sptr _tree; private: @@ -74,6 +74,7 @@ private: usrp2_iface::sptr iface; usrp2_clock_ctrl::sptr clock; usrp2_codec_ctrl::sptr codec; + gps_ctrl::sptr gps; rx_frontend_core_200::sptr rx_fe; tx_frontend_core_200::sptr tx_fe; std::vector<rx_dsp_core_200::sptr> rx_dsps; @@ -89,6 +90,9 @@ private: void set_mb_eeprom(const size_t which_mb, const uhd::usrp::mboard_eeprom_t &mb_eeprom); void set_db_eeprom(const size_t which_mb, const std::string &type, const uhd::usrp::dboard_eeprom_t &db_eeprom); + uhd::sensor_value_t get_mimo_locked(const size_t which_mb); + uhd::sensor_value_t get_ref_locked(const size_t which_mb); + }; #endif /* INCLUDED_USRP2_IMPL_HPP */ |