From 9d0750df6c90099eabd6d4108f51ebbee85ded21 Mon Sep 17 00:00:00 2001 From: Julian Arnold Date: Tue, 16 Dec 2014 13:32:40 -0800 Subject: ad9361: rssi readout --- host/lib/usrp/common/ad9361_ctrl.cpp | 11 ++++++++++- host/lib/usrp/common/ad9361_ctrl.hpp | 6 +++++- .../usrp/common/ad9361_driver/ad9361_device.cpp | 22 ++++++++++++++++++++++ host/lib/usrp/common/ad9361_driver/ad9361_device.h | 3 +++ 4 files changed, 40 insertions(+), 2 deletions(-) (limited to 'host/lib') diff --git a/host/lib/usrp/common/ad9361_ctrl.cpp b/host/lib/usrp/common/ad9361_ctrl.cpp index c84fcee39..f94536ed9 100644 --- a/host/lib/usrp/common/ad9361_ctrl.cpp +++ b/host/lib/usrp/common/ad9361_ctrl.cpp @@ -148,7 +148,7 @@ public: return _device.tune(direction, value); } - //! turn on/off Catalina's data port loopback + //! turn on/off data port loopback void data_port_loopback(const bool on) { boost::lock_guard lock(_mutex); @@ -156,6 +156,15 @@ public: _device.data_port_loopback(on); } + //! read internal RSSI sensor + sensor_value_t get_rssi(const std::string &which) + { + boost::lock_guard lock(_mutex); + + ad9361_device_t::chain_t chain =_get_chain_from_antenna(which); + return sensor_value_t("RSSI", _device.get_rssi(chain), "dB"); + } + private: static ad9361_device_t::direction_t _get_direction_from_antenna(const std::string& antenna) { diff --git a/host/lib/usrp/common/ad9361_ctrl.hpp b/host/lib/usrp/common/ad9361_ctrl.hpp index 93d697349..16e1d23eb 100644 --- a/host/lib/usrp/common/ad9361_ctrl.hpp +++ b/host/lib/usrp/common/ad9361_ctrl.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -94,8 +95,11 @@ public: //! tune the given frontend, return the exact value virtual double tune(const std::string &which, const double value) = 0; - //! turn on/off Catalina's data port loopback + //! turn on/off data port loopback virtual void data_port_loopback(const bool on) = 0; + + //! read internal RSSI sensor + virtual sensor_value_t get_rssi(const std::string &which) = 0; }; }} diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp index d56cedec9..b5e116a70 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp @@ -1911,4 +1911,26 @@ void ad9361_device_t::data_port_loopback(const bool loopback_enabled) _io_iface->poke8(0x3F5, (loopback_enabled ? 0x01 : 0x00)); } +/* Read back the internal RSSI measurement data. The result is in dB + * but not in absolute units. If absolute units are required + * a bench calibration should be done. + * -0.25dB / bit 9bit resolution.*/ +double ad9361_device_t::get_rssi(chain_t chain) +{ + boost::uint32_t reg_rssi = 0; + boost::uint8_t lsb_bit_pos = 0; + if (chain == CHAIN_1) { + reg_rssi = 0x1A7; + lsb_bit_pos = 0; + }else { + reg_rssi = 0x1A9; + lsb_bit_pos = 1; + } + boost::uint8_t msbs = _io_iface->peek8(reg_rssi); + boost::uint8_t lsb = ((_io_iface->peek8(0x1AB)) >> lsb_bit_pos) & 0x01; + boost::uint16_t val = ((msbs << 1) | lsb); + double rssi = (-0.25f * ((double)val)); //-0.25dB/lsb (See Gain Control Users Guide p. 25) + return rssi; +} + }} diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.h b/host/lib/usrp/common/ad9361_driver/ad9361_device.h index 41af2eeea..8c163572c 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.h +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.h @@ -63,6 +63,9 @@ public: /* Turn on/off AD9361's TX port --> RX port loopback. */ void data_port_loopback(const bool loopback_enabled); + /* Read back the internal RSSI measurement data. */ + double get_rssi(chain_t chain); + //Constants static const double AD9361_MAX_GAIN; static const double AD9361_MAX_CLOCK_RATE; -- cgit v1.2.3 From 6a98b4e67c6af0e3a17135a41c3c7bfdf62f4892 Mon Sep 17 00:00:00 2001 From: Julian Arnold Date: Tue, 16 Dec 2014 13:30:54 -0800 Subject: b200: rssi sensor --- host/lib/usrp/b200/b200_impl.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'host/lib') diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp index 01c0f5cbf..aa309e7eb 100644 --- a/host/lib/usrp/b200/b200_impl.cpp +++ b/host/lib/usrp/b200/b200_impl.cpp @@ -655,7 +655,7 @@ void b200_impl::setup_radio(const size_t dspno) _tree->create(rf_fe_path / "freq" / "range") .publish(boost::bind(&ad9361_ctrl::get_rf_freq_range)); - //setup antenna stuff + //setup RX related stuff if (key[0] == 'R') { static const std::vector ants = boost::assign::list_of("TX/RX")("RX2"); @@ -663,6 +663,8 @@ void b200_impl::setup_radio(const size_t dspno) _tree->create(rf_fe_path / "antenna" / "value") .subscribe(boost::bind(&b200_impl::update_antenna_sel, this, dspno, _1)) .set("RX2"); + _tree->create(rf_fe_path / "sensors" / "rssi") + .publish(boost::bind(&ad9361_ctrl::get_rssi, _codec_ctrl, key)); } if (key[0] == 'T') { -- cgit v1.2.3 From 23729861a2020359b9c920347bd2d7c43d96ebf8 Mon Sep 17 00:00:00 2001 From: Julian Arnold Date: Tue, 16 Dec 2014 12:08:56 -0800 Subject: e300: rssi sensor network support --- host/lib/usrp/e300/e300_impl.cpp | 5 +++-- host/lib/usrp/e300/e300_network.cpp | 3 +++ host/lib/usrp/e300/e300_remote_codec_ctrl.cpp | 14 ++++++++++++++ host/lib/usrp/e300/e300_remote_codec_ctrl.hpp | 2 ++ 4 files changed, 22 insertions(+), 2 deletions(-) (limited to 'host/lib') diff --git a/host/lib/usrp/e300/e300_impl.cpp b/host/lib/usrp/e300/e300_impl.cpp index e42ac390e..59788fbea 100644 --- a/host/lib/usrp/e300/e300_impl.cpp +++ b/host/lib/usrp/e300/e300_impl.cpp @@ -1097,14 +1097,15 @@ void e300_impl::_setup_radio(const size_t dspno) _tree->create(rf_fe_path / "freq" / "range") .publish(boost::bind(&ad9361_ctrl::get_rf_freq_range)); - //setup antenna stuff + //setup RX related stuff if (key[0] == 'R') { static const std::vector ants = boost::assign::list_of("TX/RX")("RX2"); _tree->create >(rf_fe_path / "antenna" / "options").set(ants); _tree->create(rf_fe_path / "antenna" / "value") .subscribe(boost::bind(&e300_impl::_update_antenna_sel, this, dspno, _1)) .set("RX2"); - + _tree->create(rf_fe_path / "sensors" / "rssi") + .publish(boost::bind(&ad9361_ctrl::get_rssi, _codec_ctrl, key)); } if (key[0] == 'T') { static const std::vector ants(1, "TX/RX"); diff --git a/host/lib/usrp/e300/e300_network.cpp b/host/lib/usrp/e300/e300_network.cpp index 883ff0c4f..6d36d8681 100644 --- a/host/lib/usrp/e300/e300_network.cpp +++ b/host/lib/usrp/e300/e300_network.cpp @@ -224,6 +224,9 @@ static void e300_codec_ctrl_tunnel( _codec_ctrl->data_port_loopback( uhd::ntohx(in->bits) & 1); break; + case codec_xact_t::ACTION_GET_RSSI: + out->rssi = _codec_ctrl->get_rssi(which_str).to_real(); + break; default: UHD_MSG(status) << "Got unknown request?!" << std::endl; //Zero out actions to fail this request on client diff --git a/host/lib/usrp/e300/e300_remote_codec_ctrl.cpp b/host/lib/usrp/e300/e300_remote_codec_ctrl.cpp index bcc8ee4cf..ed8131e2f 100644 --- a/host/lib/usrp/e300/e300_remote_codec_ctrl.cpp +++ b/host/lib/usrp/e300/e300_remote_codec_ctrl.cpp @@ -106,6 +106,20 @@ public: _transact(); } + sensor_value_t get_rssi(const std::string &which) + { + _clear(); + _args.action = uhd::htonx(transaction_t::ACTION_GET_RSSI); + if (which == "RX1") _args.which = uhd::htonx(transaction_t::CHAIN_RX1); + else if (which == "RX2") _args.which = uhd::htonx(transaction_t::CHAIN_RX2); + else throw std::runtime_error("e300_remote_codec_ctrl_impl incorrect chain string."); + _args.bits = uhd::htonx(0); + + _transact(); + + return sensor_value_t("RSSI", _retval.rssi, "dB"); + } + private: void _transact() { { diff --git a/host/lib/usrp/e300/e300_remote_codec_ctrl.hpp b/host/lib/usrp/e300/e300_remote_codec_ctrl.hpp index 015ad8323..cbc4b52d2 100644 --- a/host/lib/usrp/e300/e300_remote_codec_ctrl.hpp +++ b/host/lib/usrp/e300/e300_remote_codec_ctrl.hpp @@ -33,6 +33,7 @@ public: double rate; double gain; double freq; + double rssi; boost::uint64_t bits; }; @@ -42,6 +43,7 @@ public: static const boost::uint32_t ACTION_SET_ACTIVE_CHANS = 12; static const boost::uint32_t ACTION_TUNE = 13; static const boost::uint32_t ACTION_SET_LOOPBACK = 14; + static const boost::uint32_t ACTION_GET_RSSI = 15; //Values for "which" static const boost::uint32_t CHAIN_NONE = 0; -- cgit v1.2.3