diff options
author | Martin Braun <martin.braun@ettus.com> | 2019-11-14 13:12:20 -0800 |
---|---|---|
committer | Brent Stapleton <brent.stapleton@ettus.com> | 2020-01-23 11:37:51 -0800 |
commit | 0cf54ce07335f60642a14df7e6107422a5aeb9a0 (patch) | |
tree | ae49a1f983fbeab9aa9f652204940d741b98e030 /host/lib | |
parent | 09af39604c91bbb725a366e41bab4654274870c2 (diff) | |
download | uhd-0cf54ce07335f60642a14df7e6107422a5aeb9a0.tar.gz uhd-0cf54ce07335f60642a14df7e6107422a5aeb9a0.tar.bz2 uhd-0cf54ce07335f60642a14df7e6107422a5aeb9a0.zip |
mpm/mpmd: Expose APIs to drive GPIO sources
The N310 has a feature that allows the front panel GPIOs to be driven by
various sources: The PS, or any of the radio channels. The MPM-based
APIs did not expose any way to change that.
Changes:
- Add MPM APIs to PeripheralManagerBase and n3xx classes
- Improve comments and explanations
- Add host-side hooks into these new APIs in mpmd_mb_controller
- Implement these APIs for N3xx
The N3xx devices will have the option to set the GPIO source to "PS", or
to one of "RF0", "RF1", "RF2", "RF3" (if there are four channels; the
N300 and N320 can only go up to RF1).
Note: The N310 radio does not have separate FP-GPIO banks for channels
0 and 1, which needs to be fixed in a separate commit.
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp | 8 | ||||
-rw-r--r-- | host/lib/usrp/mpmd/mpmd_mb_controller.cpp | 40 |
2 files changed, 48 insertions, 0 deletions
diff --git a/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp b/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp index 0c64ecbad..8111d05b8 100644 --- a/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp +++ b/host/lib/include/uhdlib/usrp/common/mpmd_mb_controller.hpp @@ -82,6 +82,10 @@ public: uhd::sensor_value_t get_sensor(const std::string& name); std::vector<std::string> get_sensor_names(); uhd::usrp::mboard_eeprom_t get_eeprom(); + std::vector<std::string> get_gpio_banks() const; + std::vector<std::string> get_gpio_srcs(const std::string& bank) const; + std::vector<std::string> get_gpio_src(const std::string& bank); + void set_gpio_src(const std::string& bank, const std::vector<std::string>& src); private: /************************************************************************** @@ -94,6 +98,10 @@ private: //! List of MB sensor names std::unordered_set<std::string> _sensor_names; + + //! Cache of available GPIO sources + std::vector<std::string> _gpio_banks; + std::unordered_map<std::string, std::vector<std::string>> _gpio_srcs; }; }} // namespace uhd::rfnoc diff --git a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp index 13e57b273..9aa61a5a8 100644 --- a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp +++ b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp @@ -23,10 +23,18 @@ mpmd_mb_controller::mpmd_mb_controller( register_timekeeper(tk_idx, std::make_shared<mpmd_timekeeper>(tk_idx, _rpc)); } + // Enumerate sensors auto sensor_list = _rpc->request_with_token<std::vector<std::string>>("get_mb_sensors"); UHD_LOG_DEBUG("MPMD", "Found " << sensor_list.size() << " motherboard sensors."); _sensor_names.insert(sensor_list.cbegin(), sensor_list.cend()); + + // Enumerate GPIO banks that are under mb_controller control + _gpio_banks = _rpc->request_with_token<std::vector<std::string>>("get_gpio_banks"); + for (const auto& bank : _gpio_banks) { + _gpio_srcs.insert({bank, + _rpc->request_with_token<std::vector<std::string>>("get_gpio_srcs", bank)}); + } } /****************************************************************************** @@ -174,3 +182,35 @@ uhd::usrp::mboard_eeprom_t mpmd_mb_controller::get_eeprom() return mb_eeprom_dict; } +std::vector<std::string> mpmd_mb_controller::get_gpio_banks() const +{ + return _gpio_banks; +} + +std::vector<std::string> mpmd_mb_controller::get_gpio_srcs(const std::string& bank) const +{ + if (!_gpio_srcs.count(bank)) { + UHD_LOG_ERROR("MPMD", "Invalid GPIO bank: `" << bank << "'"); + throw uhd::key_error(std::string("Invalid GPIO bank: ") + bank); + } + return _gpio_srcs.at(bank); +} + +std::vector<std::string> mpmd_mb_controller::get_gpio_src(const std::string& bank) +{ + if (!_gpio_srcs.count(bank)) { + UHD_LOG_ERROR("MPMD", "Invalid GPIO bank: `" << bank << "'"); + throw uhd::key_error(std::string("Invalid GPIO bank: ") + bank); + } + return _rpc->request_with_token<std::vector<std::string>>("get_gpio_srcs", bank); +} + +void mpmd_mb_controller::set_gpio_src( + const std::string& bank, const std::vector<std::string>& src) +{ + if (!_gpio_srcs.count(bank)) { + UHD_LOG_ERROR("MPMD", "Invalid GPIO bank: `" << bank << "'"); + throw uhd::key_error(std::string("Invalid GPIO bank: ") + bank); + } + _rpc->notify_with_token("set_gpio_src", bank, src); +} |