diff options
author | Martin Braun <martin.braun@ettus.com> | 2018-07-24 09:33:30 -0700 |
---|---|---|
committer | Brent Stapleton <bstapleton@g.hmc.edu> | 2018-08-10 10:16:36 -0700 |
commit | 016136f548220ad7bd5c34b8e25fc740a68aeb08 (patch) | |
tree | 36fd140ac4eac776af75e59c577f8694dfeb9260 /host/lib/usrp/x300/x300_device_args.hpp | |
parent | 2129e9d20e5009f0c97b5935740d5db906956387 (diff) | |
download | uhd-016136f548220ad7bd5c34b8e25fc740a68aeb08.tar.gz uhd-016136f548220ad7bd5c34b8e25fc740a68aeb08.tar.bz2 uhd-016136f548220ad7bd5c34b8e25fc740a68aeb08.zip |
x300: Use constrained_args
x300_impl will now use a constrained_device_args_t-derived object to
parse device args.
No API or functional changes.
Diffstat (limited to 'host/lib/usrp/x300/x300_device_args.hpp')
-rw-r--r-- | host/lib/usrp/x300/x300_device_args.hpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/host/lib/usrp/x300/x300_device_args.hpp b/host/lib/usrp/x300/x300_device_args.hpp new file mode 100644 index 000000000..76edc95ab --- /dev/null +++ b/host/lib/usrp/x300/x300_device_args.hpp @@ -0,0 +1,182 @@ +// +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#ifndef INCLUDED_X300_DEV_ARGS_HPP +#define INCLUDED_X300_DEV_ARGS_HPP + +#include "x300_impl.hpp" +#include <uhdlib/usrp/constrained_device_args.hpp> + +namespace uhd { namespace usrp { namespace x300 { + +class x300_device_args_t : public constrained_device_args_t +{ +public: + x300_device_args_t(): + _master_clock_rate("master_clock_rate", DEFAULT_TICK_RATE), + _dboard_clock_rate("dboard_clock_rate", -1), + _system_ref_rate("system_ref_rate", DEFAULT_SYSREF_RATE), + _clock_source("clock_source", DEFAULT_CLOCK_SOURCE), + _time_source("time_source", DEFAULT_TIME_SOURCE), + _first_addr("addr", ""), + _second_addr("second_addr", ""), + _resource("resource", ""), + _self_cal_adc_delay("self_cal_adc_delay", false), + _ext_adc_self_test("ext_adc_self_test", false), + _ext_adc_self_test_duration("ext_adc_self_test", 30.0), + _recover_mb_eeprom("recover_mb_eeprom", false), + _ignore_cal_file("ignore_cal_file", false), + _niusrprio_rpc_port("niusrprio_rpc_port", NIUSRPRIO_DEFAULT_RPC_PORT), + _has_fw_file("fw", false), + _fw_file("fw", ""), + _blank_eeprom("blank_eeprom", false) + { + // nop + } + + double get_master_clock_rate() const { + return _master_clock_rate.get(); + } + double get_dboard_clock_rate() const { + return _dboard_clock_rate.get(); + } + double get_system_ref_rate() const { + return _system_ref_rate.get(); + } + std::string get_clock_source() const { + return _clock_source.get(); + } + std::string get_time_source() const { + return _time_source.get(); + } + std::string get_first_addr() const { + return _first_addr.get(); + } + std::string get_second_addr() const { + return _second_addr.get(); + } + bool get_self_cal_adc_delay() const { + return _self_cal_adc_delay.get(); + } + bool get_ext_adc_self_test() const { + return _ext_adc_self_test.get(); + } + double get_ext_adc_self_test_duration() const { + return _ext_adc_self_test_duration.get(); + } + bool get_recover_mb_eeprom() const { + return _recover_mb_eeprom.get(); + } + bool get_ignore_cal_file() const { + return _ignore_cal_file.get(); + } + // must be a number in the string + // default NIUSRPRIO_DEFAULT_RPC_PORT + std::string get_niusrprio_rpc_port() const { + return std::to_string(_niusrprio_rpc_port.get()); + } + std::string get_resource() const { + return _resource.get(); + } + // must be valid file, key == fw, default x300::FW_FILE_NAME + std::string get_fw_file() const { + return _fw_file.get(); + } + // true if the key is set + bool has_fw_file() const { + return _has_fw_file.get(); + } + bool get_blank_eeprom() const { + return _blank_eeprom.get(); + } + + inline virtual std::string to_string() const { + return _master_clock_rate.to_string() + ", " + + ""; + } + +private: + virtual void _parse(const device_addr_t& dev_args) { + //Extract parameters from dev_args +#define PARSE_DEFAULT(arg) parse_arg_default(dev_args, arg); + PARSE_DEFAULT(_master_clock_rate) + if (dev_args.has_key(_master_clock_rate.key())) { + _master_clock_rate.parse(dev_args[_master_clock_rate.key()]); + } + if (dev_args.has_key(_dboard_clock_rate.key())) { + _dboard_clock_rate.parse(dev_args[_dboard_clock_rate.key()]); + } else { + // Some daughterboards may require other rates, but this default + // works best for all newer daughterboards (i.e. CBX, WBX, SBX, + // UBX, and TwinRX). + if (_master_clock_rate.get() == 200e6) { + _dboard_clock_rate.set(50e6); + } else if (_master_clock_rate.get() == 184.32e6) { + _dboard_clock_rate.set(46.08e6); + } else if (_master_clock_rate.get() == 120e6) { + _dboard_clock_rate.set(40e6); + } else { + throw uhd::value_error( + "Can't infer daughterboard clock rate. Specify " + "dboard_clk_rate in the device args." + ); + } + } + PARSE_DEFAULT(_system_ref_rate) + PARSE_DEFAULT(_clock_source) + PARSE_DEFAULT(_time_source) + PARSE_DEFAULT(_first_addr) + PARSE_DEFAULT(_second_addr) + PARSE_DEFAULT(_resource) + PARSE_DEFAULT(_resource) + PARSE_DEFAULT(_self_cal_adc_delay) + if (dev_args.has_key("ext_adc_self_test")) { + _ext_adc_self_test.set(true); + try { + PARSE_DEFAULT(_ext_adc_self_test_duration); + } catch (const uhd::value_error&) { + // That's OK, because we don't have to specify the parameter. + } + } + PARSE_DEFAULT(_recover_mb_eeprom) + PARSE_DEFAULT(_ignore_cal_file) + PARSE_DEFAULT(_niusrprio_rpc_port) + if (dev_args.has_key("fw")) { + _has_fw_file.set(true); + PARSE_DEFAULT(_fw_file); + } + PARSE_DEFAULT(_blank_eeprom) + + //Sanity check params + _enforce_discrete(_master_clock_rate, TICK_RATE_OPTIONS); + _enforce_discrete(_system_ref_rate, EXTERNAL_FREQ_OPTIONS); + _enforce_discrete(_clock_source, CLOCK_SOURCE_OPTIONS); + _enforce_discrete(_time_source, TIME_SOURCE_OPTIONS); + // TODO: If _fw_file is set, make sure it's actually a file + } + + constrained_device_args_t::num_arg<double> _master_clock_rate; + constrained_device_args_t::num_arg<double> _dboard_clock_rate; + constrained_device_args_t::num_arg<double> _system_ref_rate; + constrained_device_args_t::str_arg<false> _clock_source; + constrained_device_args_t::str_arg<false> _time_source; + constrained_device_args_t::str_arg<false> _first_addr; + constrained_device_args_t::str_arg<false> _second_addr; + constrained_device_args_t::str_arg<true> _resource; + constrained_device_args_t::bool_arg _self_cal_adc_delay; + constrained_device_args_t::bool_arg _ext_adc_self_test; + constrained_device_args_t::num_arg<double> _ext_adc_self_test_duration; + constrained_device_args_t::bool_arg _recover_mb_eeprom; + constrained_device_args_t::bool_arg _ignore_cal_file; + constrained_device_args_t::num_arg<size_t> _niusrprio_rpc_port; + constrained_device_args_t::bool_arg _has_fw_file; + constrained_device_args_t::str_arg<true> _fw_file; + constrained_device_args_t::bool_arg _blank_eeprom; +}; + +}}} //namespace + +#endif //INCLUDED_X300_DEV_ARGS_HPP |