aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/b100/b100_impl.cpp546
-rw-r--r--host/lib/usrp/b100/b100_impl.hpp98
-rw-r--r--host/lib/usrp/b100/b100_regs.hpp49
-rw-r--r--host/lib/usrp/b100/clock_ctrl.cpp6
-rw-r--r--host/lib/usrp/b100/clock_ctrl.hpp14
-rw-r--r--host/lib/usrp/b100/codec_ctrl.cpp279
-rw-r--r--host/lib/usrp/b100/codec_ctrl.hpp11
-rw-r--r--host/lib/usrp/b100/dboard_iface.cpp233
-rw-r--r--host/lib/usrp/b100/fifo_ctrl_excelsior.cpp224
-rw-r--r--host/lib/usrp/b100/fifo_ctrl_excelsior.hpp16
-rw-r--r--host/lib/usrp/b100/io_impl.cpp210
-rw-r--r--host/lib/usrp/b100/mb_eeprom.cpp103
-rw-r--r--host/lib/usrp/b100/usb_zero_copy_wrapper.cpp170
-rw-r--r--host/lib/usrp/b200/b200_cores.cpp29
-rw-r--r--host/lib/usrp/b200/b200_cores.hpp26
-rw-r--r--host/lib/usrp/b200/b200_iface.cpp527
-rw-r--r--host/lib/usrp/b200/b200_iface.hpp103
-rw-r--r--host/lib/usrp/b200/b200_image_loader.cpp132
-rw-r--r--host/lib/usrp/b200/b200_impl.cpp1110
-rw-r--r--host/lib/usrp/b200/b200_impl.hpp183
-rw-r--r--host/lib/usrp/b200/b200_io_impl.cpp20
-rw-r--r--host/lib/usrp/b200/b200_mb_eeprom.cpp56
-rw-r--r--host/lib/usrp/b200/b200_regs.hpp136
-rw-r--r--host/lib/usrp/b200/b200_uart.cpp63
-rw-r--r--host/lib/usrp/b200/b200_uart.hpp2
-rw-r--r--host/lib/usrp/common/ad9361_ctrl.cpp2
-rw-r--r--host/lib/usrp/common/ad9361_driver/ad9361_device.cpp1428
-rw-r--r--host/lib/usrp/common/ad936x_manager.cpp2
-rw-r--r--host/lib/usrp/common/adf4001_ctrl.cpp157
-rw-r--r--host/lib/usrp/common/adf435x.cpp4
-rw-r--r--host/lib/usrp/common/apply_corrections.cpp139
-rw-r--r--host/lib/usrp/common/fx2_ctrl.cpp241
-rw-r--r--host/lib/usrp/common/io_service_args.cpp13
-rw-r--r--host/lib/usrp/common/io_service_mgr.cpp25
-rw-r--r--host/lib/usrp/common/lmx2592.cpp391
-rw-r--r--host/lib/usrp/common/recv_packet_demuxer.cpp88
-rw-r--r--host/lib/usrp/common/validate_subdev_spec.cpp82
-rw-r--r--host/lib/usrp/cores/dsp_core_utils.cpp25
-rw-r--r--host/lib/usrp/cores/gpio_core_200.cpp205
-rw-r--r--host/lib/usrp/cores/i2c_core_100_wb32.cpp117
-rw-r--r--host/lib/usrp/cores/i2c_core_200.cpp124
-rw-r--r--host/lib/usrp/cores/radio_ctrl_core_3000.cpp278
-rw-r--r--host/lib/usrp/cores/rx_dsp_core_200.cpp297
-rw-r--r--host/lib/usrp/cores/rx_dsp_core_3000.cpp6
-rw-r--r--host/lib/usrp/cores/rx_frontend_core_200.cpp89
-rw-r--r--host/lib/usrp/cores/rx_frontend_core_3000.cpp11
-rw-r--r--host/lib/usrp/cores/rx_vita_core_3000.cpp111
-rw-r--r--host/lib/usrp/cores/spi_core_3000.cpp2
-rw-r--r--host/lib/usrp/cores/time64_core_200.cpp112
-rw-r--r--host/lib/usrp/cores/time_core_3000.cpp62
-rw-r--r--host/lib/usrp/cores/tx_dsp_core_200.cpp213
-rw-r--r--host/lib/usrp/cores/tx_dsp_core_3000.cpp6
-rw-r--r--host/lib/usrp/cores/tx_frontend_core_200.cpp91
-rw-r--r--host/lib/usrp/cores/tx_vita_core_3000.cpp102
-rw-r--r--host/lib/usrp/cores/user_settings_core_200.cpp23
-rw-r--r--host/lib/usrp/cores/user_settings_core_3000.cpp49
-rw-r--r--host/lib/usrp/dboard/db_basic_and_lf.cpp229
-rw-r--r--host/lib/usrp/dboard/db_cbx.cpp59
-rw-r--r--host/lib/usrp/dboard/db_dbsrx.cpp533
-rw-r--r--host/lib/usrp/dboard/db_dbsrx2.cpp311
-rw-r--r--host/lib/usrp/dboard/db_rfx.cpp464
-rw-r--r--host/lib/usrp/dboard/db_sbx_common.cpp357
-rw-r--r--host/lib/usrp/dboard/db_sbx_common.hpp175
-rw-r--r--host/lib/usrp/dboard/db_sbx_version3.cpp54
-rw-r--r--host/lib/usrp/dboard/db_sbx_version4.cpp54
-rw-r--r--host/lib/usrp/dboard/db_tvrx.cpp443
-rw-r--r--host/lib/usrp/dboard/db_tvrx2.cpp1185
-rw-r--r--host/lib/usrp/dboard/db_twinrx.cpp391
-rw-r--r--host/lib/usrp/dboard/db_ubx.cpp848
-rw-r--r--host/lib/usrp/dboard/db_unknown.cpp143
-rw-r--r--host/lib/usrp/dboard/db_wbx_common.cpp107
-rw-r--r--host/lib/usrp/dboard/db_wbx_common.hpp133
-rw-r--r--host/lib/usrp/dboard/db_wbx_simple.cpp145
-rw-r--r--host/lib/usrp/dboard/db_wbx_version2.cpp232
-rw-r--r--host/lib/usrp/dboard/db_wbx_version3.cpp268
-rw-r--r--host/lib/usrp/dboard/db_wbx_version4.cpp282
-rw-r--r--host/lib/usrp/dboard/db_xcvr2450.cpp754
-rw-r--r--host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp227
-rw-r--r--host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.hpp50
-rw-r--r--host/lib/usrp/dboard/e3xx/e31x_regs.hpp21
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.cpp6
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.hpp5
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_bands.cpp38
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.cpp39
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.hpp34
-rw-r--r--host/lib/usrp/dboard/e3xx/e3xx_radio_control_init.cpp19
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp2
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp5
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_constants.hpp2
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp2
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp8
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp56
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control.hpp16
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control_cpld.cpp11
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control_gain.cpp22
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control_init.cpp52
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_bands.cpp101
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_constants.hpp51
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.cpp411
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.hpp217
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_control.cpp94
-rw-r--r--host/lib/usrp/dboard/rhodium/rhodium_radio_control.hpp81
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp617
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp39
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_experts.cpp368
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_experts.hpp633
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_gain_tables.cpp17
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_gain_tables.hpp63
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ids.hpp8
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_io.hpp532
-rw-r--r--host/lib/usrp/dboard_base.cpp77
-rw-r--r--host/lib/usrp/dboard_ctor_args.hpp30
-rw-r--r--host/lib/usrp/dboard_eeprom.cpp107
-rw-r--r--host/lib/usrp/dboard_eeprom_c.cpp122
-rw-r--r--host/lib/usrp/dboard_id.cpp45
-rw-r--r--host/lib/usrp/dboard_iface.cpp14
-rw-r--r--host/lib/usrp/dboard_iface_python.hpp77
-rw-r--r--host/lib/usrp/dboard_manager.cpp505
-rw-r--r--host/lib/usrp/fe_connection.cpp50
-rw-r--r--host/lib/usrp/fe_connection_python.hpp14
-rw-r--r--host/lib/usrp/gps_ctrl.cpp574
-rw-r--r--host/lib/usrp/mboard_eeprom_c.cpp58
-rw-r--r--host/lib/usrp/mpmd/mpmd_find.cpp5
-rw-r--r--host/lib/usrp/mpmd/mpmd_impl.cpp1
-rw-r--r--host/lib/usrp/mpmd/mpmd_impl.hpp6
-rw-r--r--host/lib/usrp/mpmd/mpmd_link_if_ctrl_liberio.hpp15
-rw-r--r--host/lib/usrp/mpmd/mpmd_mb_controller.cpp12
-rw-r--r--host/lib/usrp/mpmd/mpmd_mb_iface.cpp4
-rw-r--r--host/lib/usrp/mpmd/mpmd_mboard_impl.cpp5
-rw-r--r--host/lib/usrp/multi_usrp.cpp1913
-rw-r--r--host/lib/usrp/multi_usrp_python.hpp6
-rw-r--r--host/lib/usrp/subdev_spec.cpp67
-rw-r--r--host/lib/usrp/subdev_spec_c.cpp152
-rw-r--r--host/lib/usrp/subdev_spec_python.hpp14
-rw-r--r--host/lib/usrp/usrp1/codec_ctrl.cpp387
-rw-r--r--host/lib/usrp/usrp1/codec_ctrl.hpp14
-rw-r--r--host/lib/usrp/usrp1/dboard_iface.cpp439
-rw-r--r--host/lib/usrp/usrp1/io_impl.cpp675
-rw-r--r--host/lib/usrp/usrp1/mb_eeprom.cpp93
-rw-r--r--host/lib/usrp/usrp1/soft_time_ctrl.cpp182
-rw-r--r--host/lib/usrp/usrp1/soft_time_ctrl.hpp27
-rw-r--r--host/lib/usrp/usrp1/usrp1_calc_mux.hpp133
-rw-r--r--host/lib/usrp/usrp1/usrp1_iface.cpp141
-rw-r--r--host/lib/usrp/usrp1/usrp1_iface.hpp29
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.cpp439
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.hpp142
-rw-r--r--host/lib/usrp/usrp2/clock_ctrl.cpp474
-rw-r--r--host/lib/usrp/usrp2/clock_ctrl.hpp8
-rw-r--r--host/lib/usrp/usrp2/codec_ctrl.cpp308
-rw-r--r--host/lib/usrp/usrp2/codec_ctrl.hpp6
-rw-r--r--host/lib/usrp/usrp2/dboard_iface.cpp317
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp497
-rw-r--r--host/lib/usrp/usrp2/mb_eeprom.cpp251
-rw-r--r--host/lib/usrp/usrp2/n200_image_loader.cpp529
-rw-r--r--host/lib/usrp/usrp2/usrp2_clk_regs.hpp138
-rw-r--r--host/lib/usrp/usrp2/usrp2_fifo_ctrl.cpp181
-rw-r--r--host/lib/usrp/usrp2/usrp2_fifo_ctrl.hpp8
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp479
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.hpp22
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp1099
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp114
-rw-r--r--host/lib/usrp/usrp2/usrp2_regs.hpp88
-rw-r--r--host/lib/usrp/usrp_c.cpp1559
-rw-r--r--host/lib/usrp/x300/x300_defaults.hpp23
-rw-r--r--host/lib/usrp/x300/x300_device_args.hpp4
-rw-r--r--host/lib/usrp/x300/x300_image_loader.cpp5
-rw-r--r--host/lib/usrp/x300/x300_impl.cpp10
-rw-r--r--host/lib/usrp/x300/x300_mb_controller.hpp18
-rw-r--r--host/lib/usrp/x300/x300_mb_eeprom_iface.hpp2
-rw-r--r--host/lib/usrp/x300/x300_pcie_mgr.cpp18
-rw-r--r--host/lib/usrp/x300/x300_prop_tree.cpp18
-rw-r--r--host/lib/usrp/x300/x300_radio_control.cpp23
-rw-r--r--host/lib/usrp/x300/x300_regs.hpp30
173 files changed, 17286 insertions, 15372 deletions
diff --git a/host/lib/usrp/b100/b100_impl.cpp b/host/lib/usrp/b100/b100_impl.cpp
index 3cd166507..9f0c3bdd2 100644
--- a/host/lib/usrp/b100/b100_impl.cpp
+++ b/host/lib/usrp/b100/b100_impl.cpp
@@ -26,28 +26,31 @@ using namespace uhd::usrp;
using namespace uhd::transport;
namespace {
- constexpr uint16_t B100_VENDOR_ID = 0x2500;
- constexpr uint16_t B100_PRODUCT_ID = 0x0002;
- constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
-}
+constexpr uint16_t B100_VENDOR_ID = 0x2500;
+constexpr uint16_t B100_PRODUCT_ID = 0x0002;
+constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
+} // namespace
/***********************************************************************
* Discovery
**********************************************************************/
-static device_addrs_t b100_find(const device_addr_t &hint)
+static device_addrs_t b100_find(const device_addr_t& hint)
{
device_addrs_t b100_addrs;
- //return an empty list of addresses when type is set to non-b100
- if (hint.has_key("type") and hint["type"] != "b100") return b100_addrs;
+ // return an empty list of addresses when type is set to non-b100
+ if (hint.has_key("type") and hint["type"] != "b100")
+ return b100_addrs;
- //Return an empty list of addresses when an address or resource is specified,
- //since an address and resource is intended for a different, non-USB, device.
- if (hint.has_key("addr") || hint.has_key("resource")) return b100_addrs;
+ // Return an empty list of addresses when an address or resource is specified,
+ // since an address and resource is intended for a different, non-USB, device.
+ if (hint.has_key("addr") || hint.has_key("resource"))
+ return b100_addrs;
uint16_t vid, pid;
- if(hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type") && hint["type"] == "b100") {
+ if (hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type")
+ && hint["type"] == "b100") {
vid = uhd::cast::hexstr_cast<uint16_t>(hint.get("vid"));
pid = uhd::cast::hexstr_cast<uint16_t>(hint.get("pid"));
} else {
@@ -61,60 +64,60 @@ static device_addrs_t b100_find(const device_addr_t &hint)
// so that re-enumeration after fw load can occur successfully.
// This requirement is a courtesy of libusb1.0 on windows.
- //find the usrps and load firmware
+ // find the usrps and load firmware
size_t found = 0;
- for(usb_device_handle::sptr handle: usb_device_handle::get_device_list(vid, pid)) {
- //extract the firmware path for the b100
+ for (usb_device_handle::sptr handle : usb_device_handle::get_device_list(vid, pid)) {
+ // extract the firmware path for the b100
std::string b100_fw_image;
- try{
+ try {
b100_fw_image = find_image_path(hint.get("fw", B100_FW_FILE_NAME));
- }
- catch(...){
- UHD_LOGGER_WARNING("B100") << boost::format("Could not locate B100 firmware. %s\n") % print_utility_error("uhd_images_downloader.py");
+ } catch (...) {
+ UHD_LOGGER_WARNING("B100")
+ << boost::format("Could not locate B100 firmware. %s\n")
+ % print_utility_error("uhd_images_downloader.py");
return b100_addrs;
}
- UHD_LOGGER_DEBUG("B100") << "the firmware image: " << b100_fw_image ;
+ UHD_LOGGER_DEBUG("B100") << "the firmware image: " << b100_fw_image;
usb_control::sptr control;
- try{control = usb_control::make(handle, 0);}
- catch(const uhd::exception &){continue;} //ignore claimed
+ try {
+ control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue;
+ } // ignore claimed
fx2_ctrl::make(control)->usrp_load_firmware(b100_fw_image);
found++;
}
- //get descriptors again with serial number, but using the initialized VID/PID now since we have firmware
+ // get descriptors again with serial number, but using the initialized VID/PID now
+ // since we have firmware
vid = B100_VENDOR_ID;
pid = B100_PRODUCT_ID;
- const auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
+ const auto timeout_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
- //search for the device until found or timeout
- while (std::chrono::steady_clock::now() < timeout_time
- and b100_addrs.empty()
- and found != 0) {
+ // search for the device until found or timeout
+ while (std::chrono::steady_clock::now() < timeout_time and b100_addrs.empty()
+ and found != 0) {
for (auto handle : usb_device_handle::get_device_list(vid, pid)) {
usb_control::sptr control;
try {
control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue; // ignore claimed
}
- catch (const uhd::exception &) {
- continue; //ignore claimed
- }
- fx2_ctrl::sptr fx2_ctrl = fx2_ctrl::make(control);
- const mboard_eeprom_t mb_eeprom =
- b100_impl::get_mb_eeprom(fx2_ctrl);
+ fx2_ctrl::sptr fx2_ctrl = fx2_ctrl::make(control);
+ const mboard_eeprom_t mb_eeprom = b100_impl::get_mb_eeprom(fx2_ctrl);
device_addr_t new_addr;
- new_addr["type"] = "b100";
- new_addr["name"] = mb_eeprom["name"];
+ new_addr["type"] = "b100";
+ new_addr["name"] = mb_eeprom["name"];
new_addr["serial"] = handle->get_serial();
- //this is a found b100 when the hint serial and name match or blank
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
- ) {
+ // this is a found b100 when the hint serial and name match or blank
+ if ((not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial")
+ or hint["serial"] == new_addr["serial"])) {
b100_addrs.push_back(new_addr);
}
}
@@ -126,81 +129,85 @@ static device_addrs_t b100_find(const device_addr_t &hint)
/***********************************************************************
* Make
**********************************************************************/
-static device::sptr b100_make(const device_addr_t &device_addr){
+static device::sptr b100_make(const device_addr_t& device_addr)
+{
return device::sptr(new b100_impl(device_addr));
}
-UHD_STATIC_BLOCK(register_b100_device){
+UHD_STATIC_BLOCK(register_b100_device)
+{
device::register_device(&b100_find, &b100_make, device::USRP);
}
/***********************************************************************
* Structors
**********************************************************************/
-b100_impl::b100_impl(const device_addr_t &device_addr){
+b100_impl::b100_impl(const device_addr_t& device_addr)
+{
size_t initialization_count = 0;
- b100_impl_constructor_begin:
+b100_impl_constructor_begin:
initialization_count++;
- _type = device::USRP;
- _tree = property_tree::make();
+ _type = device::USRP;
+ _tree = property_tree::make();
_ignore_cal_file = device_addr.has_key("ignore-cal-file");
- //extract the FPGA path for the B100
+ // extract the FPGA path for the B100
std::string b100_fpga_image = find_image_path(
- device_addr.has_key("fpga")? device_addr["fpga"] : B100_FPGA_FILE_NAME
- );
+ device_addr.has_key("fpga") ? device_addr["fpga"] : B100_FPGA_FILE_NAME);
- //try to match the given device address with something on the USB bus
+ // try to match the given device address with something on the USB bus
std::vector<usb_device_handle::sptr> device_list =
usb_device_handle::get_device_list(B100_VENDOR_ID, B100_PRODUCT_ID);
- //locate the matching handle in the device list
+ // locate the matching handle in the device list
usb_device_handle::sptr handle;
- for(usb_device_handle::sptr dev_handle: device_list) {
- if (dev_handle->get_serial() == device_addr["serial"]){
+ for (usb_device_handle::sptr dev_handle : device_list) {
+ if (dev_handle->get_serial() == device_addr["serial"]) {
handle = dev_handle;
break;
}
}
- UHD_ASSERT_THROW(handle.get() != NULL); //better be found
+ UHD_ASSERT_THROW(handle.get() != NULL); // better be found
- //create control objects
+ // create control objects
usb_control::sptr fx2_transport = usb_control::make(handle, 0);
- _fx2_ctrl = fx2_ctrl::make(fx2_transport);
- this->check_fw_compat(); //check after making fx2
+ _fx2_ctrl = fx2_ctrl::make(fx2_transport);
+ this->check_fw_compat(); // check after making fx2
//-- setup clock after making fx2 and before loading fpga --//
- _clock_ctrl = b100_clock_ctrl::make(_fx2_ctrl, device_addr.cast<double>("master_clock_rate", B100_DEFAULT_TICK_RATE));
+ _clock_ctrl = b100_clock_ctrl::make(
+ _fx2_ctrl, device_addr.cast<double>("master_clock_rate", B100_DEFAULT_TICK_RATE));
- //load FPGA image, slave xfers are disabled while loading
+ // load FPGA image, slave xfers are disabled while loading
this->enable_gpif(false);
_fx2_ctrl->usrp_load_fpga(b100_fpga_image);
- _fx2_ctrl->usrp_fpga_reset(false); //active low reset
+ _fx2_ctrl->usrp_fpga_reset(false); // active low reset
_fx2_ctrl->usrp_fpga_reset(true);
- //create the control transport
+ // create the control transport
device_addr_t ctrl_xport_args;
ctrl_xport_args["recv_frame_size"] = "512";
ctrl_xport_args["num_recv_frames"] = "16";
ctrl_xport_args["send_frame_size"] = "512";
ctrl_xport_args["num_send_frames"] = "16";
- //try to open ctrl transport
- //this could fail with libusb_submit_transfer under some conditions
- try{
- _ctrl_transport = usb_zero_copy::make(
- handle,
- 4, 8, //interface, endpoint
- 3, 4, //interface, endpoint
- ctrl_xport_args
- );
+ // try to open ctrl transport
+ // this could fail with libusb_submit_transfer under some conditions
+ try {
+ _ctrl_transport = usb_zero_copy::make(handle,
+ 4,
+ 8, // interface, endpoint
+ 3,
+ 4, // interface, endpoint
+ ctrl_xport_args);
}
- //try reset once in the case of failure
- catch(const uhd::exception &ex){
- if (initialization_count > 1) throw;
- UHD_LOGGER_WARNING("B100") <<
- "The control endpoint was left in a bad state.\n"
- "Attempting endpoint re-enumeration...\n" << ex.what() ;
+ // try reset once in the case of failure
+ catch (const uhd::exception& ex) {
+ if (initialization_count > 1)
+ throw;
+ UHD_LOGGER_WARNING("B100") << "The control endpoint was left in a bad state.\n"
+ "Attempting endpoint re-enumeration...\n"
+ << ex.what();
_fifo_ctrl.reset();
_ctrl_transport.reset();
_fx2_ctrl->usrp_fx2_reset();
@@ -214,27 +221,27 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
fifo_ctrl_excelsior_config fifo_ctrl_config;
fifo_ctrl_config.async_sid_base = B100_TX_ASYNC_SID;
fifo_ctrl_config.num_async_chan = 1;
- fifo_ctrl_config.ctrl_sid_base = B100_CTRL_MSG_SID;
- fifo_ctrl_config.spi_base = TOREG(SR_SPI);
- fifo_ctrl_config.spi_rb = REG_RB_SPI;
+ fifo_ctrl_config.ctrl_sid_base = B100_CTRL_MSG_SID;
+ fifo_ctrl_config.spi_base = TOREG(SR_SPI);
+ fifo_ctrl_config.spi_rb = REG_RB_SPI;
_fifo_ctrl = fifo_ctrl_excelsior::make(_ctrl_transport, fifo_ctrl_config);
- //perform a test peek operation
- try{
+ // perform a test peek operation
+ try {
_fifo_ctrl->peek32(0);
}
- //try reset once in the case of failure
- catch(const uhd::exception &){
- if (initialization_count > 1) throw;
- UHD_LOGGER_WARNING("B100") <<
- "The control endpoint was left in a bad state.\n"
- "Attempting endpoint re-enumeration...\n" ;
+ // try reset once in the case of failure
+ catch (const uhd::exception&) {
+ if (initialization_count > 1)
+ throw;
+ UHD_LOGGER_WARNING("B100") << "The control endpoint was left in a bad state.\n"
+ "Attempting endpoint re-enumeration...\n";
_fifo_ctrl.reset();
_ctrl_transport.reset();
_fx2_ctrl->usrp_fx2_reset();
goto b100_impl_constructor_begin;
}
- this->check_fpga_compat(); //check after reset and making control
+ this->check_fpga_compat(); // check after reset and making control
////////////////////////////////////////////////////////////////////
// Initialize peripherals after reset
@@ -253,19 +260,19 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
data_xport_args["send_frame_size"] = device_addr.get("send_frame_size", "16384");
data_xport_args["num_send_frames"] = device_addr.get("num_send_frames", "16");
- //let packet padder know the LUT size in number of words32
- const size_t rx_lut_size = size_t(data_xport_args.cast<double>("recv_frame_size", 0.0));
- _fifo_ctrl->poke32(TOREG(SR_PADDER+0), rx_lut_size/sizeof(uint32_t));
+ // let packet padder know the LUT size in number of words32
+ const size_t rx_lut_size =
+ size_t(data_xport_args.cast<double>("recv_frame_size", 0.0));
+ _fifo_ctrl->poke32(TOREG(SR_PADDER + 0), rx_lut_size / sizeof(uint32_t));
- _data_transport = usb_zero_copy_make_wrapper(
- usb_zero_copy::make(
- handle, // identifier
- 2, 6, // IN interface, endpoint
- 1, 2, // OUT interface, endpoint
- data_xport_args // param hints
- ),
- B100_MAX_PKT_BYTE_LIMIT
- );
+ _data_transport = usb_zero_copy_make_wrapper(usb_zero_copy::make(handle, // identifier
+ 2,
+ 6, // IN interface, endpoint
+ 1,
+ 2, // OUT interface, endpoint
+ data_xport_args // param hints
+ ),
+ B100_MAX_PKT_BYTE_LIMIT);
////////////////////////////////////////////////////////////////////
// Initialize the properties tree
@@ -275,7 +282,8 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
_tree->create<std::string>(mb_path / "name").set("B100");
_tree->create<std::string>(mb_path / "codename").set("B-Hundo");
_tree->create<std::string>(mb_path / "load_eeprom")
- .add_coerced_subscriber(std::bind(&fx2_ctrl::usrp_load_eeprom, _fx2_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&fx2_ctrl::usrp_load_eeprom, _fx2_ctrl, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// setup the mboard eeprom
@@ -283,7 +291,8 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
const mboard_eeprom_t mb_eeprom = this->get_mb_eeprom(_fx2_ctrl);
_tree->create<mboard_eeprom_t>(mb_path / "eeprom")
.set(mb_eeprom)
- .add_coerced_subscriber(std::bind(&b100_impl::set_mb_eeprom, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::set_mb_eeprom, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create clock control objects
@@ -291,28 +300,35 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
//^^^ clock created up top, just reg props here... ^^^
_tree->create<double>(mb_path / "tick_rate")
.set_publisher(std::bind(&b100_clock_ctrl::get_fpga_clock_rate, _clock_ctrl))
- .add_coerced_subscriber(std::bind(&fifo_ctrl_excelsior::set_tick_rate, _fifo_ctrl, std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b100_impl::update_tick_rate, this, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &fifo_ctrl_excelsior::set_tick_rate, _fifo_ctrl, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::update_tick_rate, this, std::placeholders::_1));
- //add_coerced_subscriber the command time while we are at it
+ // add_coerced_subscriber the command time while we are at it
_tree->create<time_spec_t>(mb_path / "time/cmd")
- .add_coerced_subscriber(std::bind(&fifo_ctrl_excelsior::set_time, _fifo_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&fifo_ctrl_excelsior::set_time, _fifo_ctrl, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create codec control objects
////////////////////////////////////////////////////////////////////
- _codec_ctrl = b100_codec_ctrl::make(_fifo_ctrl);
+ _codec_ctrl = b100_codec_ctrl::make(_fifo_ctrl);
const fs_path rx_codec_path = mb_path / "rx_codecs/A";
const fs_path tx_codec_path = mb_path / "tx_codecs/A";
_tree->create<std::string>(rx_codec_path / "name").set("ad9522");
- _tree->create<meta_range_t>(rx_codec_path / "gains/pga/range").set(b100_codec_ctrl::rx_pga_gain_range);
+ _tree->create<meta_range_t>(rx_codec_path / "gains/pga/range")
+ .set(b100_codec_ctrl::rx_pga_gain_range);
_tree->create<double>(rx_codec_path / "gains/pga/value")
- .set_coercer(std::bind(&b100_impl::update_rx_codec_gain, this, std::placeholders::_1))
+ .set_coercer(
+ std::bind(&b100_impl::update_rx_codec_gain, this, std::placeholders::_1))
.set(0.0);
_tree->create<std::string>(tx_codec_path / "name").set("ad9522");
- _tree->create<meta_range_t>(tx_codec_path / "gains/pga/range").set(b100_codec_ctrl::tx_pga_gain_range);
+ _tree->create<meta_range_t>(tx_codec_path / "gains/pga/range")
+ .set(b100_codec_ctrl::tx_pga_gain_range);
_tree->create<double>(tx_codec_path / "gains/pga/value")
- .add_coerced_subscriber(std::bind(&b100_codec_ctrl::set_tx_pga_gain, _codec_ctrl, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(
+ &b100_codec_ctrl::set_tx_pga_gain, _codec_ctrl, std::placeholders::_1))
.set_publisher(std::bind(&b100_codec_ctrl::get_tx_pga_gain, _codec_ctrl))
.set(0.0);
@@ -329,78 +345,91 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
_tx_fe = tx_frontend_core_200::make(_fifo_ctrl, TOREG(SR_TX_FE));
_tree->create<subdev_spec_t>(mb_path / "rx_subdev_spec")
- .add_coerced_subscriber(std::bind(&b100_impl::update_rx_subdev_spec, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::update_rx_subdev_spec, this, std::placeholders::_1));
_tree->create<subdev_spec_t>(mb_path / "tx_subdev_spec")
- .add_coerced_subscriber(std::bind(&b100_impl::update_tx_subdev_spec, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::update_tx_subdev_spec, this, std::placeholders::_1));
const fs_path rx_fe_path = mb_path / "rx_frontends" / "A";
const fs_path tx_fe_path = mb_path / "tx_frontends" / "A";
- _tree->create<std::complex<double> >(rx_fe_path / "dc_offset" / "value")
- .set_coercer(std::bind(&rx_frontend_core_200::set_dc_offset, _rx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(rx_fe_path / "dc_offset" / "value")
+ .set_coercer(std::bind(
+ &rx_frontend_core_200::set_dc_offset, _rx_fe, std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
_tree->create<bool>(rx_fe_path / "dc_offset" / "enable")
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_dc_offset_auto, _rx_fe, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_200::set_dc_offset_auto, _rx_fe, std::placeholders::_1))
.set(true);
- _tree->create<std::complex<double> >(rx_fe_path / "iq_balance" / "value")
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_iq_balance, _rx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(rx_fe_path / "iq_balance" / "value")
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_200::set_iq_balance, _rx_fe, std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
- _tree->create<std::complex<double> >(tx_fe_path / "dc_offset" / "value")
- .set_coercer(std::bind(&tx_frontend_core_200::set_dc_offset, _tx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(tx_fe_path / "dc_offset" / "value")
+ .set_coercer(std::bind(
+ &tx_frontend_core_200::set_dc_offset, _tx_fe, std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
- _tree->create<std::complex<double> >(tx_fe_path / "iq_balance" / "value")
- .add_coerced_subscriber(std::bind(&tx_frontend_core_200::set_iq_balance, _tx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(tx_fe_path / "iq_balance" / "value")
+ .add_coerced_subscriber(std::bind(
+ &tx_frontend_core_200::set_iq_balance, _tx_fe, std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
////////////////////////////////////////////////////////////////////
// create rx dsp control objects
////////////////////////////////////////////////////////////////////
const size_t num_rx_dsps = _fifo_ctrl->peek32(REG_RB_NUM_RX_DSP);
- for (size_t dspno = 0; dspno < num_rx_dsps; dspno++)
- {
- const size_t sr_off = dspno*32;
- _rx_dsps.push_back(rx_dsp_core_200::make(
- _fifo_ctrl,
- TOREG(SR_RX_DSP0+sr_off),
- TOREG(SR_RX_CTRL0+sr_off),
- B100_RX_SID_BASE + dspno
- ));
+ for (size_t dspno = 0; dspno < num_rx_dsps; dspno++) {
+ const size_t sr_off = dspno * 32;
+ _rx_dsps.push_back(rx_dsp_core_200::make(_fifo_ctrl,
+ TOREG(SR_RX_DSP0 + sr_off),
+ TOREG(SR_RX_CTRL0 + sr_off),
+ B100_RX_SID_BASE + dspno));
_rx_dsps[dspno]->set_link_rate(B100_LINK_RATE_BPS);
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], std::placeholders::_1));
fs_path rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno);
_tree->create<meta_range_t>(rx_dsp_path / "rate/range")
.set_publisher(std::bind(&rx_dsp_core_200::get_host_rates, _rx_dsps[dspno]));
_tree->create<double>(rx_dsp_path / "rate/value")
- .set(1e6) //some default
- .set_coercer(std::bind(&rx_dsp_core_200::set_host_rate, _rx_dsps[dspno], std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b100_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1));
+ .set(1e6) // some default
+ .set_coercer(std::bind(
+ &rx_dsp_core_200::set_host_rate, _rx_dsps[dspno], std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(
+ &b100_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1));
_tree->create<double>(rx_dsp_path / "freq/value")
- .set_coercer(std::bind(&rx_dsp_core_200::set_freq, _rx_dsps[dspno], std::placeholders::_1));
+ .set_coercer(std::bind(
+ &rx_dsp_core_200::set_freq, _rx_dsps[dspno], std::placeholders::_1));
_tree->create<meta_range_t>(rx_dsp_path / "freq/range")
.set_publisher(std::bind(&rx_dsp_core_200::get_freq_range, _rx_dsps[dspno]));
_tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd")
- .add_coerced_subscriber(std::bind(&rx_dsp_core_200::issue_stream_command, _rx_dsps[dspno], std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&rx_dsp_core_200::issue_stream_command,
+ _rx_dsps[dspno],
+ std::placeholders::_1));
}
////////////////////////////////////////////////////////////////////
// create tx dsp control objects
////////////////////////////////////////////////////////////////////
_tx_dsp = tx_dsp_core_200::make(
- _fifo_ctrl, TOREG(SR_TX_DSP), TOREG(SR_TX_CTRL), B100_TX_ASYNC_SID
- );
+ _fifo_ctrl, TOREG(SR_TX_DSP), TOREG(SR_TX_CTRL), B100_TX_ASYNC_SID);
_tx_dsp->set_link_rate(B100_LINK_RATE_BPS);
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsp, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsp, std::placeholders::_1));
_tree->create<meta_range_t>(mb_path / "tx_dsps/0/rate/range")
.set_publisher(std::bind(&tx_dsp_core_200::get_host_rates, _tx_dsp));
_tree->create<double>(mb_path / "tx_dsps/0/rate/value")
- .set(1e6) //some default
- .set_coercer(std::bind(&tx_dsp_core_200::set_host_rate, _tx_dsp, std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b100_impl::update_tx_samp_rate, this, 0, std::placeholders::_1));
+ .set(1e6) // some default
+ .set_coercer(
+ std::bind(&tx_dsp_core_200::set_host_rate, _tx_dsp, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::update_tx_samp_rate, this, 0, std::placeholders::_1));
_tree->create<double>(mb_path / "tx_dsps/0/freq/value")
- .set_coercer(std::bind(&tx_dsp_core_200::set_freq, _tx_dsp, std::placeholders::_1));
+ .set_coercer(
+ std::bind(&tx_dsp_core_200::set_freq, _tx_dsp, std::placeholders::_1));
_tree->create<meta_range_t>(mb_path / "tx_dsps/0/freq/range")
.set_publisher(std::bind(&tx_dsp_core_200::get_freq_range, _tx_dsp));
@@ -412,202 +441,241 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
time64_rb_bases.rb_lo_now = REG_RB_TIME_NOW_LO;
time64_rb_bases.rb_hi_pps = REG_RB_TIME_PPS_HI;
time64_rb_bases.rb_lo_pps = REG_RB_TIME_PPS_LO;
- _time64 = time64_core_200::make(
- _fifo_ctrl, TOREG(SR_TIME64), time64_rb_bases
- );
+ _time64 = time64_core_200::make(_fifo_ctrl, TOREG(SR_TIME64), time64_rb_bases);
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&time64_core_200::set_tick_rate, _time64, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&time64_core_200::set_tick_rate, _time64, std::placeholders::_1));
_tree->create<time_spec_t>(mb_path / "time/now")
.set_publisher(std::bind(&time64_core_200::get_time_now, _time64))
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_now, _time64, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&time64_core_200::set_time_now, _time64, std::placeholders::_1));
_tree->create<time_spec_t>(mb_path / "time/pps")
.set_publisher(std::bind(&time64_core_200::get_time_last_pps, _time64))
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_next_pps, _time64, std::placeholders::_1));
- //setup time source props
+ .add_coerced_subscriber(std::bind(
+ &time64_core_200::set_time_next_pps, _time64, std::placeholders::_1));
+ // setup time source props
_tree->create<std::string>(mb_path / "time_source/value")
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_source, _time64, std::placeholders::_1));
- _tree->create<std::vector<std::string> >(mb_path / "time_source/options")
+ .add_coerced_subscriber(
+ std::bind(&time64_core_200::set_time_source, _time64, std::placeholders::_1));
+ _tree->create<std::vector<std::string>>(mb_path / "time_source/options")
.set_publisher(std::bind(&time64_core_200::get_time_sources, _time64));
- //setup reference source props
+ // setup reference source props
_tree->create<std::string>(mb_path / "clock_source/value")
- .add_coerced_subscriber(std::bind(&b100_impl::update_clock_source, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::update_clock_source, this, std::placeholders::_1));
static const std::vector<std::string> clock_sources = {
- "internal", "external", "auto"
- };
- _tree->create<std::vector<std::string> >(mb_path / "clock_source/options").set(clock_sources);
+ "internal", "external", "auto"};
+ _tree->create<std::vector<std::string>>(mb_path / "clock_source/options")
+ .set(clock_sources);
////////////////////////////////////////////////////////////////////
// create user-defined control objects
////////////////////////////////////////////////////////////////////
_user = user_settings_core_200::make(_fifo_ctrl, TOREG(SR_USER_REGS));
_tree->create<user_settings_core_200::user_reg_t>(mb_path / "user/regs")
- .add_coerced_subscriber(std::bind(&user_settings_core_200::set_reg, _user, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&user_settings_core_200::set_reg, _user, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create dboard control objects
////////////////////////////////////////////////////////////////////
- //read the dboard eeprom to extract the dboard ids
+ // read the dboard eeprom to extract the dboard ids
dboard_eeprom_t rx_db_eeprom, tx_db_eeprom, gdb_eeprom;
rx_db_eeprom.load(*_fpga_i2c_ctrl, I2C_ADDR_RX_A);
tx_db_eeprom.load(*_fpga_i2c_ctrl, I2C_ADDR_TX_A);
gdb_eeprom.load(*_fpga_i2c_ctrl, I2C_ADDR_TX_A ^ 5);
- //disable rx dc offset if LFRX
- if (rx_db_eeprom.id == 0x000f) _tree->access<bool>(rx_fe_path / "dc_offset" / "enable").set(false);
+ // disable rx dc offset if LFRX
+ if (rx_db_eeprom.id == 0x000f)
+ _tree->access<bool>(rx_fe_path / "dc_offset" / "enable").set(false);
- //create the properties and register subscribers
+ // create the properties and register subscribers
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/rx_eeprom")
.set(rx_db_eeprom)
- .add_coerced_subscriber(std::bind(&b100_impl::set_db_eeprom, this, "rx", std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::set_db_eeprom, this, "rx", std::placeholders::_1));
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/tx_eeprom")
.set(tx_db_eeprom)
- .add_coerced_subscriber(std::bind(&b100_impl::set_db_eeprom, this, "tx", std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::set_db_eeprom, this, "tx", std::placeholders::_1));
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/gdb_eeprom")
.set(gdb_eeprom)
- .add_coerced_subscriber(std::bind(&b100_impl::set_db_eeprom, this, "gdb", std::placeholders::_1));
-
- //create a new dboard interface and manager
- _dboard_manager = dboard_manager::make(
- rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
- make_b100_dboard_iface(_fifo_ctrl, _fpga_i2c_ctrl, _fifo_ctrl/*spi*/, _clock_ctrl, _codec_ctrl),
- _tree->subtree(mb_path / "dboards/A")
- );
-
- //bind frontend corrections to the dboard freq props
+ .add_coerced_subscriber(
+ std::bind(&b100_impl::set_db_eeprom, this, "gdb", std::placeholders::_1));
+
+ // create a new dboard interface and manager
+ _dboard_manager = dboard_manager::make(rx_db_eeprom.id,
+ tx_db_eeprom.id,
+ gdb_eeprom.id,
+ make_b100_dboard_iface(
+ _fifo_ctrl, _fpga_i2c_ctrl, _fifo_ctrl /*spi*/, _clock_ctrl, _codec_ctrl),
+ _tree->subtree(mb_path / "dboards/A"));
+
+ // bind frontend corrections to the dboard freq props
const fs_path db_tx_fe_path = mb_path / "dboards" / "A" / "tx_frontends";
- for(const std::string &name: _tree->list(db_tx_fe_path)){
+ for (const std::string& name : _tree->list(db_tx_fe_path)) {
_tree->access<double>(db_tx_fe_path / name / "freq" / "value")
- .add_coerced_subscriber(std::bind(&b100_impl::set_tx_fe_corrections, this, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &b100_impl::set_tx_fe_corrections, this, std::placeholders::_1));
}
const fs_path db_rx_fe_path = mb_path / "dboards" / "A" / "rx_frontends";
- for(const std::string &name: _tree->list(db_rx_fe_path)){
+ for (const std::string& name : _tree->list(db_rx_fe_path)) {
_tree->access<double>(db_rx_fe_path / name / "freq" / "value")
- .add_coerced_subscriber(std::bind(&b100_impl::set_rx_fe_corrections, this, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &b100_impl::set_rx_fe_corrections, this, std::placeholders::_1));
}
- //initialize io handling
+ // initialize io handling
_recv_demuxer.reset(new recv_packet_demuxer_3000(_data_transport));
- //allocate streamer weak ptrs containers
+ // allocate streamer weak ptrs containers
_rx_streamers.resize(_rx_dsps.size());
- _tx_streamers.resize(1/*known to be 1 dsp*/);
+ _tx_streamers.resize(1 /*known to be 1 dsp*/);
////////////////////////////////////////////////////////////////////
// do some post-init tasks
////////////////////////////////////////////////////////////////////
this->update_rates();
- _tree->access<double>(mb_path / "tick_rate") //now add_coerced_subscriber the clock rate setter
- .add_coerced_subscriber(std::bind(&b100_clock_ctrl::set_fpga_clock_rate, _clock_ctrl, std::placeholders::_1));
+ _tree
+ ->access<double>(
+ mb_path / "tick_rate") // now add_coerced_subscriber the clock rate setter
+ .add_coerced_subscriber(std::bind(
+ &b100_clock_ctrl::set_fpga_clock_rate, _clock_ctrl, std::placeholders::_1));
- //reset cordic rates and their properties to zero
- for(const std::string &name: _tree->list(mb_path / "rx_dsps")){
+ // reset cordic rates and their properties to zero
+ for (const std::string& name : _tree->list(mb_path / "rx_dsps")) {
_tree->access<double>(mb_path / "rx_dsps" / name / "freq" / "value").set(0.0);
}
- for(const std::string &name: _tree->list(mb_path / "tx_dsps")){
+ for (const std::string& name : _tree->list(mb_path / "tx_dsps")) {
_tree->access<double>(mb_path / "tx_dsps" / name / "freq" / "value").set(0.0);
}
- _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/rx_frontends").at(0)));
- _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/tx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec")
+ .set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/rx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec")
+ .set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/tx_frontends").at(0)));
_tree->access<std::string>(mb_path / "clock_source/value").set("internal");
_tree->access<std::string>(mb_path / "time_source/value").set("none");
_tree->create<double>(mb_path / "link_max_rate").set(B100_MAX_RATE_USB2);
}
-b100_impl::~b100_impl(void){
- //NOP
+b100_impl::~b100_impl(void)
+{
+ // NOP
}
-void b100_impl::check_fw_compat(void){
- unsigned char data[4]; //useless data buffer
- const uint16_t fw_compat_num = _fx2_ctrl->usrp_control_read(
- VRQ_FW_COMPAT, 0, 0, data, sizeof(data)
- );
- if (fw_compat_num != B100_FW_COMPAT_NUM){
- throw uhd::runtime_error(str(boost::format(
- "Expected firmware compatibility number %d, but got %d:\n"
- "The firmware build is not compatible with the host code build.\n"
- "%s"
- ) % int(B100_FW_COMPAT_NUM) % fw_compat_num % print_utility_error("uhd_images_downloader.py")));
+void b100_impl::check_fw_compat(void)
+{
+ unsigned char data[4]; // useless data buffer
+ const uint16_t fw_compat_num =
+ _fx2_ctrl->usrp_control_read(VRQ_FW_COMPAT, 0, 0, data, sizeof(data));
+ if (fw_compat_num != B100_FW_COMPAT_NUM) {
+ throw uhd::runtime_error(
+ str(boost::format(
+ "Expected firmware compatibility number %d, but got %d:\n"
+ "The firmware build is not compatible with the host code build.\n"
+ "%s")
+ % int(B100_FW_COMPAT_NUM) % fw_compat_num
+ % print_utility_error("uhd_images_downloader.py")));
}
- _tree->create<std::string>("/mboards/0/fw_version").set(str(boost::format("%u.0") % fw_compat_num));
+ _tree->create<std::string>("/mboards/0/fw_version")
+ .set(str(boost::format("%u.0") % fw_compat_num));
}
-void b100_impl::check_fpga_compat(void){
+void b100_impl::check_fpga_compat(void)
+{
const uint32_t fpga_compat_num = _fifo_ctrl->peek32(REG_RB_COMPAT);
uint16_t fpga_major = fpga_compat_num >> 16, fpga_minor = fpga_compat_num & 0xffff;
- if (fpga_major == 0){ //old version scheme
+ if (fpga_major == 0) { // old version scheme
fpga_major = fpga_minor;
fpga_minor = 0;
}
- if (fpga_major != B100_FPGA_COMPAT_NUM){
- throw uhd::runtime_error(str(boost::format(
- "Expected FPGA compatibility number %d, but got %d:\n"
- "The FPGA build is not compatible with the host code build."
- "%s"
- ) % int(B100_FPGA_COMPAT_NUM) % fpga_major % print_utility_error("uhd_images_downloader.py")));
+ if (fpga_major != B100_FPGA_COMPAT_NUM) {
+ throw uhd::runtime_error(
+ str(boost::format("Expected FPGA compatibility number %d, but got %d:\n"
+ "The FPGA build is not compatible with the host code build."
+ "%s")
+ % int(B100_FPGA_COMPAT_NUM) % fpga_major
+ % print_utility_error("uhd_images_downloader.py")));
}
- _tree->create<std::string>("/mboards/0/fpga_version").set(str(boost::format("%u.%u") % fpga_major % fpga_minor));
+ _tree->create<std::string>("/mboards/0/fpga_version")
+ .set(str(boost::format("%u.%u") % fpga_major % fpga_minor));
}
-double b100_impl::update_rx_codec_gain(const double gain){
- //set gain on both I and Q, readback on one
- //TODO in the future, gains should have individual control
+double b100_impl::update_rx_codec_gain(const double gain)
+{
+ // set gain on both I and Q, readback on one
+ // TODO in the future, gains should have individual control
_codec_ctrl->set_rx_pga_gain(gain, 'A');
_codec_ctrl->set_rx_pga_gain(gain, 'B');
return _codec_ctrl->get_rx_pga_gain('A');
}
-void b100_impl::set_db_eeprom(const std::string &type, const uhd::usrp::dboard_eeprom_t &db_eeprom){
- if (type == "rx") db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_RX_A);
- if (type == "tx") db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_TX_A);
- if (type == "gdb") db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_TX_A ^ 5);
+void b100_impl::set_db_eeprom(
+ const std::string& type, const uhd::usrp::dboard_eeprom_t& db_eeprom)
+{
+ if (type == "rx")
+ db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_RX_A);
+ if (type == "tx")
+ db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_TX_A);
+ if (type == "gdb")
+ db_eeprom.store(*_fpga_i2c_ctrl, I2C_ADDR_TX_A ^ 5);
}
-void b100_impl::update_clock_source(const std::string &source){
-
- if (source == "pps_sync"){
+void b100_impl::update_clock_source(const std::string& source)
+{
+ if (source == "pps_sync") {
_clock_ctrl->use_external_ref();
- _fifo_ctrl->poke32(TOREG(SR_MISC+2), 1);
+ _fifo_ctrl->poke32(TOREG(SR_MISC + 2), 1);
return;
}
- if (source == "_pps_sync_"){
+ if (source == "_pps_sync_") {
_clock_ctrl->use_external_ref();
- _fifo_ctrl->poke32(TOREG(SR_MISC+2), 3);
+ _fifo_ctrl->poke32(TOREG(SR_MISC + 2), 3);
return;
}
- _fifo_ctrl->poke32(TOREG(SR_MISC+2), 0);
+ _fifo_ctrl->poke32(TOREG(SR_MISC + 2), 0);
- if (source == "auto") _clock_ctrl->use_auto_ref();
- else if (source == "internal") _clock_ctrl->use_internal_ref();
- else if (source == "external") _clock_ctrl->use_external_ref();
- else throw uhd::runtime_error("unhandled clock configuration reference source: " + source);
+ if (source == "auto")
+ _clock_ctrl->use_auto_ref();
+ else if (source == "internal")
+ _clock_ctrl->use_internal_ref();
+ else if (source == "external")
+ _clock_ctrl->use_external_ref();
+ else
+ throw uhd::runtime_error(
+ "unhandled clock configuration reference source: " + source);
}
////////////////// some GPIF preparation related stuff /////////////////
-void b100_impl::enable_gpif(const bool en) {
+void b100_impl::enable_gpif(const bool en)
+{
_fx2_ctrl->usrp_control_write(VRQ_ENABLE_GPIF, en ? 1 : 0, 0, 0, 0);
}
-void b100_impl::clear_fpga_fifo(void) {
+void b100_impl::clear_fpga_fifo(void)
+{
_fx2_ctrl->usrp_control_write(VRQ_CLEAR_FPGA_FIFO, 0, 0, 0, 0);
}
-sensor_value_t b100_impl::get_ref_locked(void){
+sensor_value_t b100_impl::get_ref_locked(void)
+{
const bool lock = _clock_ctrl->get_locked();
return sensor_value_t("Ref", lock, "locked", "unlocked");
}
-void b100_impl::set_rx_fe_corrections(const double lo_freq){
- if(not _ignore_cal_file){
+void b100_impl::set_rx_fe_corrections(const double lo_freq)
+{
+ if (not _ignore_cal_file) {
apply_rx_fe_corrections(this->get_tree()->subtree("/mboards/0"), "A", lo_freq);
}
}
-void b100_impl::set_tx_fe_corrections(const double lo_freq){
- if(not _ignore_cal_file){
+void b100_impl::set_tx_fe_corrections(const double lo_freq)
+{
+ if (not _ignore_cal_file) {
apply_tx_fe_corrections(this->get_tree()->subtree("/mboards/0"), "A", lo_freq);
}
}
diff --git a/host/lib/usrp/b100/b100_impl.hpp b/host/lib/usrp/b100/b100_impl.hpp
index bb72cd63e..0b46c4815 100644
--- a/host/lib/usrp/b100/b100_impl.hpp
+++ b/host/lib/usrp/b100/b100_impl.hpp
@@ -13,55 +13,53 @@
#include "fifo_ctrl_excelsior.hpp"
#include <uhd/device.hpp>
#include <uhd/property_tree.hpp>
+#include <uhd/transport/usb_zero_copy.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/types/stream_cmd.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
-#include <uhd/usrp/subdev_spec.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
#include <uhd/usrp/dboard_manager.hpp>
-#include <uhd/transport/usb_zero_copy.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
#include <uhdlib/usrp/common/fx2_ctrl.hpp>
#include <uhdlib/usrp/common/recv_packet_demuxer_3000.hpp>
#include <uhdlib/usrp/cores/i2c_core_200.hpp>
-#include <uhdlib/usrp/cores/rx_frontend_core_200.hpp>
-#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
#include <uhdlib/usrp/cores/rx_dsp_core_200.hpp>
-#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
+#include <uhdlib/usrp/cores/rx_frontend_core_200.hpp>
#include <uhdlib/usrp/cores/time64_core_200.hpp>
+#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
+#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
#include <uhdlib/usrp/cores/user_settings_core_200.hpp>
#include <memory>
-static const double B100_LINK_RATE_BPS = 256e6/5; //pratical link rate (< 480 Mbps)
-static const std::string B100_FW_FILE_NAME = "usrp_b100_fw.ihx";
-static const std::string B100_FPGA_FILE_NAME = "usrp_b100_fpga.bin";
-static const uint16_t B100_FW_COMPAT_NUM = 4;
-static const uint16_t B100_FPGA_COMPAT_NUM = 11;
-static const uint32_t B100_RX_SID_BASE = 30;
-static const uint32_t B100_TX_ASYNC_SID = 10;
-static const uint32_t B100_CTRL_MSG_SID = 20;
-static const double B100_DEFAULT_TICK_RATE = 64e6;
-static const size_t B100_MAX_PKT_BYTE_LIMIT = 2048;
-static const size_t B100_MAX_RATE_USB2 = 32000000; // bytes/s
-
-#define I2C_ADDR_TX_A (I2C_DEV_EEPROM | 0x4)
-#define I2C_ADDR_RX_A (I2C_DEV_EEPROM | 0x5)
-#define I2C_ADDR_TX_B (I2C_DEV_EEPROM | 0x6)
-#define I2C_ADDR_RX_B (I2C_DEV_EEPROM | 0x7)
-#define I2C_DEV_EEPROM 0x50
-
-#define VRQ_FW_COMPAT 0x83
-#define VRQ_ENABLE_GPIF 0x0d
+static const double B100_LINK_RATE_BPS = 256e6 / 5; // pratical link rate (< 480 Mbps)
+static const std::string B100_FW_FILE_NAME = "usrp_b100_fw.ihx";
+static const std::string B100_FPGA_FILE_NAME = "usrp_b100_fpga.bin";
+static const uint16_t B100_FW_COMPAT_NUM = 4;
+static const uint16_t B100_FPGA_COMPAT_NUM = 11;
+static const uint32_t B100_RX_SID_BASE = 30;
+static const uint32_t B100_TX_ASYNC_SID = 10;
+static const uint32_t B100_CTRL_MSG_SID = 20;
+static const double B100_DEFAULT_TICK_RATE = 64e6;
+static const size_t B100_MAX_PKT_BYTE_LIMIT = 2048;
+static const size_t B100_MAX_RATE_USB2 = 32000000; // bytes/s
+
+#define I2C_ADDR_TX_A (I2C_DEV_EEPROM | 0x4)
+#define I2C_ADDR_RX_A (I2C_DEV_EEPROM | 0x5)
+#define I2C_ADDR_TX_B (I2C_DEV_EEPROM | 0x6)
+#define I2C_ADDR_RX_B (I2C_DEV_EEPROM | 0x7)
+#define I2C_DEV_EEPROM 0x50
+
+#define VRQ_FW_COMPAT 0x83
+#define VRQ_ENABLE_GPIF 0x0d
#define VRQ_CLEAR_FPGA_FIFO 0x0e
//! Make a b100 dboard interface
-uhd::usrp::dboard_iface::sptr make_b100_dboard_iface(
- uhd::timed_wb_iface::sptr wb_iface,
+uhd::usrp::dboard_iface::sptr make_b100_dboard_iface(uhd::timed_wb_iface::sptr wb_iface,
uhd::i2c_iface::sptr i2c_iface,
uhd::spi_iface::sptr spi_iface,
b100_clock_ctrl::sptr clock,
- b100_codec_ctrl::sptr codec
-);
+ b100_codec_ctrl::sptr codec);
/*!
* Make a wrapper around a zero copy implementation.
@@ -78,25 +76,25 @@ uhd::usrp::dboard_iface::sptr make_b100_dboard_iface(
* \return a new zero copy wrapper object
*/
uhd::transport::zero_copy_if::sptr usb_zero_copy_make_wrapper(
- uhd::transport::zero_copy_if::sptr usb_zc, size_t usb_frame_boundary = 512
-);
+ uhd::transport::zero_copy_if::sptr usb_zc, size_t usb_frame_boundary = 512);
//! Implementation guts
-class b100_impl : public uhd::device {
+class b100_impl : public uhd::device
+{
public:
- //structors
- b100_impl(const uhd::device_addr_t &);
+ // structors
+ b100_impl(const uhd::device_addr_t&);
~b100_impl(void);
- //the io interface
- uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t &args);
- uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &args);
- bool recv_async_msg(uhd::async_metadata_t &, double);
+ // the io interface
+ uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t& args);
+ uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t& args);
+ bool recv_async_msg(uhd::async_metadata_t&, double);
static uhd::usrp::mboard_eeprom_t get_mb_eeprom(uhd::i2c_iface::sptr);
private:
- //controllers
+ // controllers
fifo_ctrl_excelsior::sptr _fifo_ctrl;
i2c_core_200::sptr _fpga_i2c_ctrl;
rx_frontend_core_200::sptr _rx_fe;
@@ -109,30 +107,30 @@ private:
b100_codec_ctrl::sptr _codec_ctrl;
uhd::usrp::fx2_ctrl::sptr _fx2_ctrl;
- //transports
+ // transports
uhd::transport::zero_copy_if::sptr _ctrl_transport;
uhd::transport::zero_copy_if::sptr _data_transport;
std::shared_ptr<uhd::usrp::recv_packet_demuxer_3000> _recv_demuxer;
- //dboard stuff
+ // dboard stuff
uhd::usrp::dboard_manager::sptr _dboard_manager;
bool _ignore_cal_file;
- std::vector<std::weak_ptr<uhd::rx_streamer> > _rx_streamers;
- std::vector<std::weak_ptr<uhd::tx_streamer> > _tx_streamers;
+ std::vector<std::weak_ptr<uhd::rx_streamer>> _rx_streamers;
+ std::vector<std::weak_ptr<uhd::tx_streamer>> _tx_streamers;
void check_fw_compat(void);
void check_fpga_compat(void);
- double update_rx_codec_gain(const double); //sets A and B at once
- void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t &);
- void set_db_eeprom(const std::string &, const uhd::usrp::dboard_eeprom_t &);
+ double update_rx_codec_gain(const double); // sets A and B at once
+ void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t&);
+ void set_db_eeprom(const std::string&, const uhd::usrp::dboard_eeprom_t&);
void update_tick_rate(const double rate);
void update_rx_samp_rate(const size_t, const double rate);
void update_tx_samp_rate(const size_t, const double rate);
void update_rates(void);
- void update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &);
- void update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &);
- void update_clock_source(const std::string &);
+ void update_rx_subdev_spec(const uhd::usrp::subdev_spec_t&);
+ void update_tx_subdev_spec(const uhd::usrp::subdev_spec_t&);
+ void update_clock_source(const std::string&);
void enable_gpif(const bool);
void clear_fpga_fifo(void);
uhd::sensor_value_t get_ref_locked(void);
diff --git a/host/lib/usrp/b100/b100_regs.hpp b/host/lib/usrp/b100/b100_regs.hpp
index 8cb231488..541a14849 100644
--- a/host/lib/usrp/b100/b100_regs.hpp
+++ b/host/lib/usrp/b100/b100_regs.hpp
@@ -14,40 +14,39 @@
#define localparam static const int
-localparam SR_MISC = 0; // 5
-localparam SR_USER_REGS = 5; // 2
-localparam SR_PADDER = 10; // 2
+localparam SR_MISC = 0; // 5
+localparam SR_USER_REGS = 5; // 2
+localparam SR_PADDER = 10; // 2
-localparam SR_TX_CTRL = 32; // 6
-localparam SR_TX_DSP = 40; // 5
-localparam SR_TX_FE = 48; // 5
+localparam SR_TX_CTRL = 32; // 6
+localparam SR_TX_DSP = 40; // 5
+localparam SR_TX_FE = 48; // 5
-localparam SR_RX_CTRL0 = 96; // 9
-localparam SR_RX_DSP0 = 106; // 7
-localparam SR_RX_FE = 114; // 5
+localparam SR_RX_CTRL0 = 96; // 9
+localparam SR_RX_DSP0 = 106; // 7
+localparam SR_RX_FE = 114; // 5
-localparam SR_RX_CTRL1 = 128; // 9
-localparam SR_RX_DSP1 = 138; // 7
+localparam SR_RX_CTRL1 = 128; // 9
+localparam SR_RX_DSP1 = 138; // 7
-localparam SR_TIME64 = 192; // 6
-localparam SR_SPI = 208; // 3
-localparam SR_I2C = 216; // 1
-localparam SR_GPIO = 224; // 5
+localparam SR_TIME64 = 192; // 6
+localparam SR_SPI = 208; // 3
+localparam SR_I2C = 216; // 1
+localparam SR_GPIO = 224; // 5
#define REG_RB_TIME_NOW_HI TOREG(10)
#define REG_RB_TIME_NOW_LO TOREG(11)
#define REG_RB_TIME_PPS_HI TOREG(14)
#define REG_RB_TIME_PPS_LO TOREG(15)
-#define REG_RB_SPI TOREG(0)
-#define REG_RB_COMPAT TOREG(1)
-#define REG_RB_GPIO TOREG(3)
-#define REG_RB_I2C TOREG(2)
-#define REG_RB_NUM_RX_DSP TOREG(6)
+#define REG_RB_SPI TOREG(0)
+#define REG_RB_COMPAT TOREG(1)
+#define REG_RB_GPIO TOREG(3)
+#define REG_RB_I2C TOREG(2)
+#define REG_RB_NUM_RX_DSP TOREG(6)
-//spi slave constants
-#define B100_SPI_SS_AD9862 (1 << 2)
-#define B100_SPI_SS_TX_DB (1 << 1)
-#define B100_SPI_SS_RX_DB (1 << 0)
+// spi slave constants
+#define B100_SPI_SS_AD9862 (1 << 2)
+#define B100_SPI_SS_TX_DB (1 << 1)
+#define B100_SPI_SS_RX_DB (1 << 0)
#endif /*INCLUDED_B100_REGS_HPP*/
-
diff --git a/host/lib/usrp/b100/clock_ctrl.cpp b/host/lib/usrp/b100/clock_ctrl.cpp
index 676ebd981..12ef2052f 100644
--- a/host/lib/usrp/b100/clock_ctrl.cpp
+++ b/host/lib/usrp/b100/clock_ctrl.cpp
@@ -87,7 +87,8 @@ struct clock_settings_type
};
//! gives the greatest divisor of num between 1 and max inclusive
-template <typename T> static inline T greatest_divisor(T num, T max)
+template <typename T>
+static inline T greatest_divisor(T num, T max)
{
for (T i = max; i > 1; i--) {
if (num % i == 0) {
@@ -98,7 +99,8 @@ template <typename T> static inline T greatest_divisor(T num, T max)
}
//! gives the least divisor of num between min and num exclusive
-template <typename T> static inline T least_divisor(T num, T min)
+template <typename T>
+static inline T least_divisor(T num, T min)
{
for (T i = min; i < num; i++) {
if (num % i == 0) {
diff --git a/host/lib/usrp/b100/clock_ctrl.hpp b/host/lib/usrp/b100/clock_ctrl.hpp
index b208e8a0c..318d1b248 100644
--- a/host/lib/usrp/b100/clock_ctrl.hpp
+++ b/host/lib/usrp/b100/clock_ctrl.hpp
@@ -17,7 +17,8 @@
* The B100 clock control:
* - Disable/enable clock lines.
*/
-class b100_clock_ctrl : uhd::noncopyable{
+class b100_clock_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<b100_clock_ctrl> sptr;
@@ -81,12 +82,12 @@ public:
* \return the clock rate in Hz
*/
virtual double get_tx_clock_rate(void) = 0;
-
+
/*!
* Enable/disable the FPGA clock.
* \param enb true to enable
*/
-
+
virtual void enable_fpga_clock(bool enb) = 0;
/*!
@@ -100,17 +101,17 @@ public:
* \param enb true to enable
*/
virtual void enable_tx_dboard_clock(bool enb) = 0;
-
+
/*!
* Use the internal TCXO reference
*/
virtual void use_internal_ref(void) = 0;
-
+
/*!
* Use the external SMA reference
*/
virtual void use_external_ref(void) = 0;
-
+
/*!
* Use external if available, internal otherwise
*/
@@ -118,7 +119,6 @@ public:
//! Is the reference locked?
virtual bool get_locked(void) = 0;
-
};
#endif /* INCLUDED_B100_CLOCK_CTRL_HPP */
diff --git a/host/lib/usrp/b100/codec_ctrl.cpp b/host/lib/usrp/b100/codec_ctrl.cpp
index 10cfa686a..f6e2d8b93 100644
--- a/host/lib/usrp/b100/codec_ctrl.cpp
+++ b/host/lib/usrp/b100/codec_ctrl.cpp
@@ -7,15 +7,15 @@
#include "codec_ctrl.hpp"
#include "ad9862_regs.hpp"
-#include <uhd/types/dict.hpp>
+#include "b100_regs.hpp" //spi slave constants
#include <uhd/exception.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/utils/algorithm.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
#include <stdint.h>
-#include <boost/math/special_functions/round.hpp>
-#include "b100_regs.hpp" //spi slave constants
#include <boost/assign/list_of.hpp>
+#include <boost/math/special_functions/round.hpp>
#include <tuple>
using namespace uhd;
@@ -23,24 +23,26 @@ using namespace uhd;
const gain_range_t b100_codec_ctrl::tx_pga_gain_range(-20, 0, double(0.1));
const gain_range_t b100_codec_ctrl::rx_pga_gain_range(0, 20, 1);
-b100_codec_ctrl::~b100_codec_ctrl(void){
+b100_codec_ctrl::~b100_codec_ctrl(void)
+{
/* NOP */
}
/***********************************************************************
* Codec Control Implementation
**********************************************************************/
-class b100_codec_ctrl_impl : public b100_codec_ctrl{
+class b100_codec_ctrl_impl : public b100_codec_ctrl
+{
public:
- //structors
+ // structors
b100_codec_ctrl_impl(spi_iface::sptr iface);
~b100_codec_ctrl_impl(void);
- //aux adc and dac control
+ // aux adc and dac control
double read_aux_adc(aux_adc_t which);
void write_aux_dac(aux_dac_t which, double volts);
- //pga gain control
+ // pga gain control
void set_tx_pga_gain(double);
double get_tx_pga_gain(void);
void set_rx_pga_gain(double, char);
@@ -56,157 +58,178 @@ private:
/***********************************************************************
* Codec Control Structors
**********************************************************************/
-b100_codec_ctrl_impl::b100_codec_ctrl_impl(spi_iface::sptr iface){
+b100_codec_ctrl_impl::b100_codec_ctrl_impl(spi_iface::sptr iface)
+{
_iface = iface;
- //soft reset
+ // soft reset
_ad9862_regs.soft_reset = 1;
this->send_reg(0);
- //initialize the codec register settings
+ // initialize the codec register settings
_ad9862_regs.sdio_bidir = ad9862_regs_t::SDIO_BIDIR_SDIO_SDO;
- _ad9862_regs.lsb_first = ad9862_regs_t::LSB_FIRST_MSB;
+ _ad9862_regs.lsb_first = ad9862_regs_t::LSB_FIRST_MSB;
_ad9862_regs.soft_reset = 0;
- //setup rx side of codec
+ // setup rx side of codec
_ad9862_regs.byp_buffer_a = 1;
_ad9862_regs.byp_buffer_b = 1;
- _ad9862_regs.buffer_a_pd = 1;
- _ad9862_regs.buffer_b_pd = 1;
- _ad9862_regs.mux_out = ad9862_regs_t::MUX_OUT_RX_MUX_MODE; //B100 uses interleaved RX->FPGA
- _ad9862_regs.rx_pga_a = 0;//0x1f; //TODO bring under api control
- _ad9862_regs.rx_pga_b = 0;//0x1f; //TODO bring under api control
+ _ad9862_regs.buffer_a_pd = 1;
+ _ad9862_regs.buffer_b_pd = 1;
+ _ad9862_regs.mux_out =
+ ad9862_regs_t::MUX_OUT_RX_MUX_MODE; // B100 uses interleaved RX->FPGA
+ _ad9862_regs.rx_pga_a = 0; // 0x1f; //TODO bring under api control
+ _ad9862_regs.rx_pga_b = 0; // 0x1f; //TODO bring under api control
_ad9862_regs.rx_twos_comp = 1;
- _ad9862_regs.rx_hilbert = ad9862_regs_t::RX_HILBERT_DIS;
+ _ad9862_regs.rx_hilbert = ad9862_regs_t::RX_HILBERT_DIS;
- //setup tx side of codec
+ // setup tx side of codec
_ad9862_regs.two_data_paths = ad9862_regs_t::TWO_DATA_PATHS_BOTH;
- _ad9862_regs.interleaved = ad9862_regs_t::INTERLEAVED_INTERLEAVED;
- _ad9862_regs.tx_retime = ad9862_regs_t::TX_RETIME_CLKOUT2;
- _ad9862_regs.tx_pga_gain = 199; //TODO bring under api control
- _ad9862_regs.tx_hilbert = ad9862_regs_t::TX_HILBERT_DIS;
- _ad9862_regs.interp = ad9862_regs_t::INTERP_2;
- _ad9862_regs.tx_twos_comp = 1;
- _ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_BYPASS;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
+ _ad9862_regs.interleaved = ad9862_regs_t::INTERLEAVED_INTERLEAVED;
+ _ad9862_regs.tx_retime = ad9862_regs_t::TX_RETIME_CLKOUT2;
+ _ad9862_regs.tx_pga_gain = 199; // TODO bring under api control
+ _ad9862_regs.tx_hilbert = ad9862_regs_t::TX_HILBERT_DIS;
+ _ad9862_regs.interp = ad9862_regs_t::INTERP_2;
+ _ad9862_regs.tx_twos_comp = 1;
+ _ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_BYPASS;
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
_ad9862_regs.dac_a_coarse_gain = 0x3;
_ad9862_regs.dac_b_coarse_gain = 0x3;
- _ad9862_regs.edges = ad9862_regs_t::EDGES_NORMAL;
+ _ad9862_regs.edges = ad9862_regs_t::EDGES_NORMAL;
- //setup the dll
+ // setup the dll
_ad9862_regs.input_clk_ctrl = ad9862_regs_t::INPUT_CLK_CTRL_EXTERNAL;
- _ad9862_regs.dll_mult = ad9862_regs_t::DLL_MULT_2;
- _ad9862_regs.dll_mode = ad9862_regs_t::DLL_MODE_FAST;
+ _ad9862_regs.dll_mult = ad9862_regs_t::DLL_MULT_2;
+ _ad9862_regs.dll_mode = ad9862_regs_t::DLL_MODE_FAST;
- //write the register settings to the codec
- for (uint8_t addr = 0; addr <= 25; addr++){
+ // write the register settings to the codec
+ for (uint8_t addr = 0; addr <= 25; addr++) {
this->send_reg(addr);
}
- //always start conversions for aux ADC
+ // always start conversions for aux ADC
_ad9862_regs.start_a = 1;
_ad9862_regs.start_b = 1;
- //aux adc clock
+ // aux adc clock
_ad9862_regs.clk_4 = ad9862_regs_t::CLK_4_1_4;
this->send_reg(34);
}
-b100_codec_ctrl_impl::~b100_codec_ctrl_impl(void){
+b100_codec_ctrl_impl::~b100_codec_ctrl_impl(void)
+{
UHD_SAFE_CALL(
- //set aux dacs to zero
- this->write_aux_dac(AUX_DAC_A, 0);
- this->write_aux_dac(AUX_DAC_B, 0);
+ // set aux dacs to zero
+ this->write_aux_dac(AUX_DAC_A, 0); this->write_aux_dac(AUX_DAC_B, 0);
this->write_aux_dac(AUX_DAC_C, 0);
this->write_aux_dac(AUX_DAC_D, 0);
- //power down
+ // power down
_ad9862_regs.all_rx_pd = 1;
this->send_reg(1);
_ad9862_regs.tx_digital_pd = 1;
- _ad9862_regs.tx_analog_pd = ad9862_regs_t::TX_ANALOG_PD_BOTH;
- this->send_reg(8);
- )
+ _ad9862_regs.tx_analog_pd = ad9862_regs_t::TX_ANALOG_PD_BOTH;
+ this->send_reg(8);)
}
/***********************************************************************
* Codec Control Gain Control Methods
**********************************************************************/
-static const int mtpgw = 255; //maximum tx pga gain word
+static const int mtpgw = 255; // maximum tx pga gain word
-void b100_codec_ctrl_impl::set_tx_pga_gain(double gain){
- int gain_word = int(mtpgw*(gain - tx_pga_gain_range.start())/(tx_pga_gain_range.stop() - tx_pga_gain_range.start()));
+void b100_codec_ctrl_impl::set_tx_pga_gain(double gain)
+{
+ int gain_word = int(mtpgw * (gain - tx_pga_gain_range.start())
+ / (tx_pga_gain_range.stop() - tx_pga_gain_range.start()));
_ad9862_regs.tx_pga_gain = uhd::clip(gain_word, 0, mtpgw);
this->send_reg(16);
}
-double b100_codec_ctrl_impl::get_tx_pga_gain(void){
- return (_ad9862_regs.tx_pga_gain*(tx_pga_gain_range.stop() - tx_pga_gain_range.start())/mtpgw) + tx_pga_gain_range.start();
+double b100_codec_ctrl_impl::get_tx_pga_gain(void)
+{
+ return (_ad9862_regs.tx_pga_gain
+ * (tx_pga_gain_range.stop() - tx_pga_gain_range.start()) / mtpgw)
+ + tx_pga_gain_range.start();
}
-static const int mrpgw = 0x14; //maximum rx pga gain word
-
-void b100_codec_ctrl_impl::set_rx_pga_gain(double gain, char which){
- int gain_word = int(mrpgw*(gain - rx_pga_gain_range.start())/(rx_pga_gain_range.stop() - rx_pga_gain_range.start()));
- gain_word = uhd::clip(gain_word, 0, mrpgw);
- switch(which){
- case 'A':
- _ad9862_regs.rx_pga_a = gain_word;
- this->send_reg(2);
- return;
- case 'B':
- _ad9862_regs.rx_pga_b = gain_word;
- this->send_reg(3);
- return;
- default: UHD_THROW_INVALID_CODE_PATH();
+static const int mrpgw = 0x14; // maximum rx pga gain word
+
+void b100_codec_ctrl_impl::set_rx_pga_gain(double gain, char which)
+{
+ int gain_word = int(mrpgw * (gain - rx_pga_gain_range.start())
+ / (rx_pga_gain_range.stop() - rx_pga_gain_range.start()));
+ gain_word = uhd::clip(gain_word, 0, mrpgw);
+ switch (which) {
+ case 'A':
+ _ad9862_regs.rx_pga_a = gain_word;
+ this->send_reg(2);
+ return;
+ case 'B':
+ _ad9862_regs.rx_pga_b = gain_word;
+ this->send_reg(3);
+ return;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-double b100_codec_ctrl_impl::get_rx_pga_gain(char which){
+double b100_codec_ctrl_impl::get_rx_pga_gain(char which)
+{
int gain_word;
- switch(which){
- case 'A': gain_word = _ad9862_regs.rx_pga_a; break;
- case 'B': gain_word = _ad9862_regs.rx_pga_b; break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ switch (which) {
+ case 'A':
+ gain_word = _ad9862_regs.rx_pga_a;
+ break;
+ case 'B':
+ gain_word = _ad9862_regs.rx_pga_b;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
- return (gain_word*(rx_pga_gain_range.stop() - rx_pga_gain_range.start())/mrpgw) + rx_pga_gain_range.start();
+ return (gain_word * (rx_pga_gain_range.stop() - rx_pga_gain_range.start()) / mrpgw)
+ + rx_pga_gain_range.start();
}
/***********************************************************************
* Codec Control AUX ADC Methods
**********************************************************************/
-static double aux_adc_to_volts(uint8_t high, uint8_t low){
- return double((uint16_t(high) << 2) | low)*3.3/0x3ff;
+static double aux_adc_to_volts(uint8_t high, uint8_t low)
+{
+ return double((uint16_t(high) << 2) | low) * 3.3 / 0x3ff;
}
-double b100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){
- switch(which){
-
- case AUX_ADC_A1:
- _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC1;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(28); //read the value (2 bytes, 2 reads)
- this->recv_reg(29);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_a1_9_2, _ad9862_regs.aux_adc_a1_1_0);
- case AUX_ADC_A2:
- _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC2;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(26); //read the value (2 bytes, 2 reads)
- this->recv_reg(27);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_a2_9_2, _ad9862_regs.aux_adc_a2_1_0);
-
- case AUX_ADC_B1:
- _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC1;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(32); //read the value (2 bytes, 2 reads)
- this->recv_reg(33);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_b1_9_2, _ad9862_regs.aux_adc_b1_1_0);
- case AUX_ADC_B2:
- _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC2;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(30); //read the value (2 bytes, 2 reads)
- this->recv_reg(31);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_b2_9_2, _ad9862_regs.aux_adc_b2_1_0);
+double b100_codec_ctrl_impl::read_aux_adc(aux_adc_t which)
+{
+ switch (which) {
+ case AUX_ADC_A1:
+ _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC1;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(28); // read the value (2 bytes, 2 reads)
+ this->recv_reg(29);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_a1_9_2, _ad9862_regs.aux_adc_a1_1_0);
+ case AUX_ADC_A2:
+ _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC2;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(26); // read the value (2 bytes, 2 reads)
+ this->recv_reg(27);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_a2_9_2, _ad9862_regs.aux_adc_a2_1_0);
+
+ case AUX_ADC_B1:
+ _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC1;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(32); // read the value (2 bytes, 2 reads)
+ this->recv_reg(33);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_b1_9_2, _ad9862_regs.aux_adc_b1_1_0);
+ case AUX_ADC_B2:
+ _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC2;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(30); // read the value (2 bytes, 2 reads)
+ this->recv_reg(31);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_b2_9_2, _ad9862_regs.aux_adc_b2_1_0);
}
UHD_THROW_INVALID_CODE_PATH();
}
@@ -214,64 +237,64 @@ double b100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){
/***********************************************************************
* Codec Control AUX DAC Methods
**********************************************************************/
-void b100_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts){
- //special case for aux dac d (aka sigma delta word)
- if (which == AUX_DAC_D){
- uint16_t dac_word = uhd::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff);
+void b100_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts)
+{
+ // special case for aux dac d (aka sigma delta word)
+ if (which == AUX_DAC_D) {
+ uint16_t dac_word = uhd::clip(boost::math::iround(volts * 0xfff / 3.3), 0, 0xfff);
_ad9862_regs.sig_delt_11_4 = uint8_t(dac_word >> 4);
- _ad9862_regs.sig_delt_3_0 = uint8_t(dac_word & 0xf);
+ _ad9862_regs.sig_delt_3_0 = uint8_t(dac_word & 0xf);
this->send_reg(42);
this->send_reg(43);
return;
}
- //calculate the dac word for aux dac a, b, c
- uint8_t dac_word = uhd::clip(boost::math::iround(volts*0xff/3.3), 0, 0xff);
+ // calculate the dac word for aux dac a, b, c
+ uint8_t dac_word = uhd::clip(boost::math::iround(volts * 0xff / 3.3), 0, 0xff);
- //setup a lookup table for the aux dac params (reg ref, reg addr)
+ // setup a lookup table for the aux dac params (reg ref, reg addr)
typedef std::tuple<uint8_t*, uint8_t> dac_params_t;
- uhd::dict<aux_dac_t, dac_params_t> aux_dac_to_params = boost::assign::map_list_of
- (AUX_DAC_A, dac_params_t(&_ad9862_regs.aux_dac_a, 36))
- (AUX_DAC_B, dac_params_t(&_ad9862_regs.aux_dac_b, 37))
- (AUX_DAC_C, dac_params_t(&_ad9862_regs.aux_dac_c, 38))
- ;
+ uhd::dict<aux_dac_t, dac_params_t> aux_dac_to_params =
+ boost::assign::map_list_of(AUX_DAC_A, dac_params_t(&_ad9862_regs.aux_dac_a, 36))(
+ AUX_DAC_B, dac_params_t(&_ad9862_regs.aux_dac_b, 37))(
+ AUX_DAC_C, dac_params_t(&_ad9862_regs.aux_dac_c, 38));
- //set the aux dac register
+ // set the aux dac register
UHD_ASSERT_THROW(aux_dac_to_params.has_key(which));
uint8_t *reg_ref, reg_addr;
std::tie(reg_ref, reg_addr) = aux_dac_to_params[which];
- *reg_ref = dac_word;
+ *reg_ref = dac_word;
this->send_reg(reg_addr);
}
/***********************************************************************
* Codec Control SPI Methods
**********************************************************************/
-void b100_codec_ctrl_impl::send_reg(uint8_t addr){
+void b100_codec_ctrl_impl::send_reg(uint8_t addr)
+{
uint32_t reg = _ad9862_regs.get_write_reg(addr);
- UHD_LOGGER_TRACE("B100") << "codec control write reg: " << std::hex << reg ;
+ UHD_LOGGER_TRACE("B100") << "codec control write reg: " << std::hex << reg;
_iface->transact_spi(
- B100_SPI_SS_AD9862,
- spi_config_t::EDGE_RISE,
- reg, 16, false /*no rb*/
+ B100_SPI_SS_AD9862, spi_config_t::EDGE_RISE, reg, 16, false /*no rb*/
);
}
-void b100_codec_ctrl_impl::recv_reg(uint8_t addr){
+void b100_codec_ctrl_impl::recv_reg(uint8_t addr)
+{
uint32_t reg = _ad9862_regs.get_read_reg(addr);
- UHD_LOGGER_TRACE("B100") << "codec control read reg: " << std::hex << reg ;
+ UHD_LOGGER_TRACE("B100") << "codec control read reg: " << std::hex << reg;
uint32_t ret = _iface->transact_spi(
- B100_SPI_SS_AD9862,
- spi_config_t::EDGE_RISE,
- reg, 16, true /*rb*/
+ B100_SPI_SS_AD9862, spi_config_t::EDGE_RISE, reg, 16, true /*rb*/
);
- UHD_LOGGER_TRACE("B100") << "codec control read ret: " << std::hex << uint16_t(ret & 0xFF) ;
- _ad9862_regs.set_reg(addr, uint8_t(ret&0xff));
+ UHD_LOGGER_TRACE("B100") << "codec control read ret: " << std::hex
+ << uint16_t(ret & 0xFF);
+ _ad9862_regs.set_reg(addr, uint8_t(ret & 0xff));
}
/***********************************************************************
* Codec Control Make
**********************************************************************/
-b100_codec_ctrl::sptr b100_codec_ctrl::make(spi_iface::sptr iface){
+b100_codec_ctrl::sptr b100_codec_ctrl::make(spi_iface::sptr iface)
+{
return sptr(new b100_codec_ctrl_impl(iface));
}
diff --git a/host/lib/usrp/b100/codec_ctrl.hpp b/host/lib/usrp/b100/codec_ctrl.hpp
index 5f77d00f9..36714fc60 100644
--- a/host/lib/usrp/b100/codec_ctrl.hpp
+++ b/host/lib/usrp/b100/codec_ctrl.hpp
@@ -8,8 +8,8 @@
#ifndef INCLUDED_B100_CODEC_CTRL_HPP
#define INCLUDED_B100_CODEC_CTRL_HPP
-#include <uhd/types/serial.hpp>
#include <uhd/types/ranges.hpp>
+#include <uhd/types/serial.hpp>
#include <uhd/utils/noncopyable.hpp>
#include <memory>
@@ -18,7 +18,8 @@
* - Init/power down codec.
* - Read aux adc, write aux dac.
*/
-class b100_codec_ctrl : uhd::noncopyable{
+class b100_codec_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<b100_codec_ctrl> sptr;
@@ -35,7 +36,7 @@ public:
static sptr make(uhd::spi_iface::sptr iface);
//! aux adc identifier constants
- enum aux_adc_t{
+ enum aux_adc_t {
AUX_ADC_A2 = 0xA2,
AUX_ADC_A1 = 0xA1,
AUX_ADC_B2 = 0xB2,
@@ -52,11 +53,11 @@ public:
virtual double read_aux_adc(aux_adc_t which) = 0;
//! aux dac identifier constants
- enum aux_dac_t{
+ enum aux_dac_t {
AUX_DAC_A = 0xA,
AUX_DAC_B = 0xB,
AUX_DAC_C = 0xC,
- AUX_DAC_D = 0xD //really the sigma delta output
+ AUX_DAC_D = 0xD // really the sigma delta output
};
/*!
diff --git a/host/lib/usrp/b100/dboard_iface.cpp b/host/lib/usrp/b100/dboard_iface.cpp
index 2ea467fe4..627e7a876 100644
--- a/host/lib/usrp/b100/dboard_iface.cpp
+++ b/host/lib/usrp/b100/dboard_iface.cpp
@@ -8,10 +8,10 @@
#include "b100_regs.hpp"
#include "clock_ctrl.hpp"
#include "codec_ctrl.hpp"
+#include <uhd/exception.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_iface.hpp>
-#include <uhd/types/dict.hpp>
-#include <uhd/exception.hpp>
#include <uhdlib/usrp/cores/gpio_core_200.hpp>
#include <boost/assign/list_of.hpp>
@@ -19,36 +19,37 @@ using namespace uhd;
using namespace uhd::usrp;
using namespace boost::assign;
-class b100_dboard_iface : public dboard_iface{
+class b100_dboard_iface : public dboard_iface
+{
public:
-
- b100_dboard_iface(
- timed_wb_iface::sptr wb_iface,
+ b100_dboard_iface(timed_wb_iface::sptr wb_iface,
i2c_iface::sptr i2c_iface,
spi_iface::sptr spi_iface,
b100_clock_ctrl::sptr clock,
- b100_codec_ctrl::sptr codec
- ){
- _wb_iface = wb_iface;
+ b100_codec_ctrl::sptr codec)
+ {
+ _wb_iface = wb_iface;
_i2c_iface = i2c_iface;
_spi_iface = spi_iface;
- _clock = clock;
- _codec = codec;
- _gpio = gpio_core_200::make(_wb_iface, TOREG(SR_GPIO), REG_RB_GPIO);
+ _clock = clock;
+ _codec = codec;
+ _gpio = gpio_core_200::make(_wb_iface, TOREG(SR_GPIO), REG_RB_GPIO);
- //init the clock rate shadows
+ // init the clock rate shadows
this->set_clock_rate(UNIT_RX, _clock->get_fpga_clock_rate());
this->set_clock_rate(UNIT_TX, _clock->get_fpga_clock_rate());
}
- ~b100_dboard_iface(void){
+ ~b100_dboard_iface(void)
+ {
/* NOP */
}
- special_props_t get_special_props(void){
+ special_props_t get_special_props(void)
+ {
special_props_t props;
props.soft_clock_divider = false;
- props.mangle_i2c_addrs = false;
+ props.mangle_i2c_addrs = false;
return props;
}
@@ -57,7 +58,8 @@ public:
void set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_pin_ctrl(unit_t unit);
- void set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
+ void set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_atr_reg(unit_t unit, atr_reg_t reg);
void set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_gpio_ddr(unit_t unit);
@@ -68,29 +70,22 @@ public:
void set_command_time(const uhd::time_spec_t& t);
uhd::time_spec_t get_command_time(void);
- void write_i2c(uint16_t, const byte_vector_t &);
+ void write_i2c(uint16_t, const byte_vector_t&);
byte_vector_t read_i2c(uint16_t, size_t);
void write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
uint32_t read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
void set_clock_rate(unit_t, double);
std::vector<double> get_clock_rates(unit_t);
double get_clock_rate(unit_t);
void set_clock_enabled(unit_t, bool);
double get_codec_rate(unit_t);
- void set_fe_connection(unit_t unit, const std::string&, const fe_connection_t& fe_conn);
+ void set_fe_connection(
+ unit_t unit, const std::string&, const fe_connection_t& fe_conn);
private:
timed_wb_iface::sptr _wb_iface;
@@ -104,91 +99,123 @@ private:
/***********************************************************************
* Make Function
**********************************************************************/
-dboard_iface::sptr make_b100_dboard_iface(
- timed_wb_iface::sptr wb_iface,
+dboard_iface::sptr make_b100_dboard_iface(timed_wb_iface::sptr wb_iface,
i2c_iface::sptr i2c_iface,
spi_iface::sptr spi_iface,
b100_clock_ctrl::sptr clock,
- b100_codec_ctrl::sptr codec
-){
- return dboard_iface::sptr(new b100_dboard_iface(wb_iface, i2c_iface, spi_iface, clock, codec));
+ b100_codec_ctrl::sptr codec)
+{
+ return dboard_iface::sptr(
+ new b100_dboard_iface(wb_iface, i2c_iface, spi_iface, clock, codec));
}
/***********************************************************************
* Clock Rates
**********************************************************************/
-void b100_dboard_iface::set_clock_rate(unit_t unit, double rate){
- switch(unit){
- case UNIT_RX: return _clock->set_rx_dboard_clock_rate(rate);
- case UNIT_TX: return _clock->set_tx_dboard_clock_rate(rate);
- case UNIT_BOTH: set_clock_rate(UNIT_RX, rate); set_clock_rate(UNIT_TX, rate); return;
+void b100_dboard_iface::set_clock_rate(unit_t unit, double rate)
+{
+ switch (unit) {
+ case UNIT_RX:
+ return _clock->set_rx_dboard_clock_rate(rate);
+ case UNIT_TX:
+ return _clock->set_tx_dboard_clock_rate(rate);
+ case UNIT_BOTH:
+ set_clock_rate(UNIT_RX, rate);
+ set_clock_rate(UNIT_TX, rate);
+ return;
}
}
-std::vector<double> b100_dboard_iface::get_clock_rates(unit_t unit){
- switch(unit){
- case UNIT_RX: return _clock->get_rx_dboard_clock_rates();
- case UNIT_TX: return _clock->get_tx_dboard_clock_rates();
- default: UHD_THROW_INVALID_CODE_PATH();
+std::vector<double> b100_dboard_iface::get_clock_rates(unit_t unit)
+{
+ switch (unit) {
+ case UNIT_RX:
+ return _clock->get_rx_dboard_clock_rates();
+ case UNIT_TX:
+ return _clock->get_tx_dboard_clock_rates();
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-double b100_dboard_iface::get_clock_rate(unit_t unit){
- switch(unit){
- case UNIT_RX: return _clock->get_rx_clock_rate();
- case UNIT_TX: return _clock->get_tx_clock_rate();
- default: UHD_THROW_INVALID_CODE_PATH();
+double b100_dboard_iface::get_clock_rate(unit_t unit)
+{
+ switch (unit) {
+ case UNIT_RX:
+ return _clock->get_rx_clock_rate();
+ case UNIT_TX:
+ return _clock->get_tx_clock_rate();
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-void b100_dboard_iface::set_clock_enabled(unit_t unit, bool enb){
- switch(unit){
- case UNIT_RX: return _clock->enable_rx_dboard_clock(enb);
- case UNIT_TX: return _clock->enable_tx_dboard_clock(enb);
- case UNIT_BOTH: set_clock_enabled(UNIT_RX, enb); set_clock_enabled(UNIT_TX, enb); return;
+void b100_dboard_iface::set_clock_enabled(unit_t unit, bool enb)
+{
+ switch (unit) {
+ case UNIT_RX:
+ return _clock->enable_rx_dboard_clock(enb);
+ case UNIT_TX:
+ return _clock->enable_tx_dboard_clock(enb);
+ case UNIT_BOTH:
+ set_clock_enabled(UNIT_RX, enb);
+ set_clock_enabled(UNIT_TX, enb);
+ return;
}
}
-double b100_dboard_iface::get_codec_rate(unit_t){
+double b100_dboard_iface::get_codec_rate(unit_t)
+{
return _clock->get_fpga_clock_rate();
}
/***********************************************************************
* GPIO
**********************************************************************/
-void b100_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask){
+void b100_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_pin_ctrl(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t b100_dboard_iface::get_pin_ctrl(unit_t unit){
+uint32_t b100_dboard_iface::get_pin_ctrl(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_pin_ctrl(unit));
}
-void b100_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask){
- _gpio->set_atr_reg(unit, reg, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
+void b100_dboard_iface::set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask)
+{
+ _gpio->set_atr_reg(
+ unit, reg, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t b100_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg){
+uint32_t b100_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg)
+{
return static_cast<uint32_t>(_gpio->get_atr_reg(unit, reg));
}
-void b100_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask){
+void b100_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_gpio_ddr(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t b100_dboard_iface::get_gpio_ddr(unit_t unit){
+uint32_t b100_dboard_iface::get_gpio_ddr(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_gpio_ddr(unit));
}
-void b100_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask){
+void b100_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_gpio_out(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t b100_dboard_iface::get_gpio_out(unit_t unit){
+uint32_t b100_dboard_iface::get_gpio_out(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_gpio_out(unit));
}
-uint32_t b100_dboard_iface::read_gpio(unit_t unit){
+uint32_t b100_dboard_iface::read_gpio(unit_t unit)
+{
return _gpio->read_gpio(unit);
}
@@ -200,70 +227,64 @@ uint32_t b100_dboard_iface::read_gpio(unit_t unit){
* \param unit the dboard interface unit type enum
* \return the slave device number
*/
-static uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit){
- switch(unit){
- case dboard_iface::UNIT_TX: return B100_SPI_SS_TX_DB;
- case dboard_iface::UNIT_RX: return B100_SPI_SS_RX_DB;
- default: UHD_THROW_INVALID_CODE_PATH();
+static uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit)
+{
+ switch (unit) {
+ case dboard_iface::UNIT_TX:
+ return B100_SPI_SS_TX_DB;
+ case dboard_iface::UNIT_RX:
+ return B100_SPI_SS_RX_DB;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
void b100_dboard_iface::write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
_spi_iface->write_spi(unit_to_otw_spi_dev(unit), config, data, num_bits);
}
uint32_t b100_dboard_iface::read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
return _spi_iface->read_spi(unit_to_otw_spi_dev(unit), config, data, num_bits);
}
/***********************************************************************
* I2C
**********************************************************************/
-void b100_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t &bytes){
+void b100_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t& bytes)
+{
return _i2c_iface->write_i2c(addr, bytes);
}
-byte_vector_t b100_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes){
+byte_vector_t b100_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes)
+{
return _i2c_iface->read_i2c(addr, num_bytes);
}
/***********************************************************************
* Aux DAX/ADC
**********************************************************************/
-void b100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which, double value){
- //same aux dacs for each unit
- static const uhd::dict<aux_dac_t, b100_codec_ctrl::aux_dac_t> which_to_aux_dac = map_list_of
- (AUX_DAC_A, b100_codec_ctrl::AUX_DAC_A)
- (AUX_DAC_B, b100_codec_ctrl::AUX_DAC_B)
- (AUX_DAC_C, b100_codec_ctrl::AUX_DAC_C)
- (AUX_DAC_D, b100_codec_ctrl::AUX_DAC_D)
- ;
+void b100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which, double value)
+{
+ // same aux dacs for each unit
+ static const uhd::dict<aux_dac_t, b100_codec_ctrl::aux_dac_t> which_to_aux_dac =
+ map_list_of(AUX_DAC_A, b100_codec_ctrl::AUX_DAC_A)(
+ AUX_DAC_B, b100_codec_ctrl::AUX_DAC_B)(AUX_DAC_C, b100_codec_ctrl::AUX_DAC_C)(
+ AUX_DAC_D, b100_codec_ctrl::AUX_DAC_D);
_codec->write_aux_dac(which_to_aux_dac[which], value);
}
-double b100_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which){
- static const uhd::dict<
- unit_t, uhd::dict<aux_adc_t, b100_codec_ctrl::aux_adc_t>
- > unit_to_which_to_aux_adc = map_list_of
- (UNIT_RX, map_list_of
- (AUX_ADC_A, b100_codec_ctrl::AUX_ADC_A1)
- (AUX_ADC_B, b100_codec_ctrl::AUX_ADC_B1)
- )
- (UNIT_TX, map_list_of
- (AUX_ADC_A, b100_codec_ctrl::AUX_ADC_A2)
- (AUX_ADC_B, b100_codec_ctrl::AUX_ADC_B2)
- )
- ;
+double b100_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which)
+{
+ static const uhd::dict<unit_t, uhd::dict<aux_adc_t, b100_codec_ctrl::aux_adc_t>>
+ unit_to_which_to_aux_adc = map_list_of(UNIT_RX,
+ map_list_of(AUX_ADC_A, b100_codec_ctrl::AUX_ADC_A1)(
+ AUX_ADC_B, b100_codec_ctrl::AUX_ADC_B1))(UNIT_TX,
+ map_list_of(AUX_ADC_A, b100_codec_ctrl::AUX_ADC_A2)(
+ AUX_ADC_B, b100_codec_ctrl::AUX_ADC_B2));
return _codec->read_aux_adc(unit_to_which_to_aux_adc[unit][which]);
}
@@ -277,7 +298,9 @@ uhd::time_spec_t b100_dboard_iface::get_command_time(void)
return _wb_iface->get_time();
}
-void b100_dboard_iface::set_fe_connection(unit_t, const std::string&, const fe_connection_t&)
+void b100_dboard_iface::set_fe_connection(
+ unit_t, const std::string&, const fe_connection_t&)
{
- throw uhd::not_implemented_error("fe connection configuration support not implemented");
+ throw uhd::not_implemented_error(
+ "fe connection configuration support not implemented");
}
diff --git a/host/lib/usrp/b100/fifo_ctrl_excelsior.cpp b/host/lib/usrp/b100/fifo_ctrl_excelsior.cpp
index 6eed5c813..4a21770b8 100644
--- a/host/lib/usrp/b100/fifo_ctrl_excelsior.cpp
+++ b/host/lib/usrp/b100/fifo_ctrl_excelsior.cpp
@@ -6,25 +6,25 @@
//
#include "fifo_ctrl_excelsior.hpp"
-#include <uhdlib/usrp/common/async_packet_handler.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/log.hpp>
+#include <uhd/transport/bounded_buffer.hpp>
+#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/tasks.hpp>
+#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
+#include <uhd/utils/tasks.hpp>
#include <uhd/utils/thread.hpp>
-#include <uhd/transport/vrt_if_packet.hpp>
-#include <uhd/transport/bounded_buffer.hpp>
+#include <uhdlib/usrp/common/async_packet_handler.hpp>
#include <mutex>
using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-static const size_t POKE32_CMD = (1 << 8);
-static const size_t PEEK32_CMD = 0;
+static const size_t POKE32_CMD = (1 << 8);
+static const size_t PEEK32_CMD = 0;
static const double ACK_TIMEOUT = 0.5;
-static const double MASSIVE_TIMEOUT = 10.0; //for when we wait on a timed command
+static const double MASSIVE_TIMEOUT = 10.0; // for when we wait on a timed command
static const uint32_t MAX_SEQS_OUT = 15;
#define SPI_DIV _config.spi_base + 0
@@ -32,81 +32,94 @@ static const uint32_t MAX_SEQS_OUT = 15;
#define SPI_DATA _config.spi_base + 8
#define SPI_DIVIDER 4
-struct ctrl_result_t{
+struct ctrl_result_t
+{
uint32_t msg[2];
};
-class fifo_ctrl_excelsior_impl : public fifo_ctrl_excelsior{
+class fifo_ctrl_excelsior_impl : public fifo_ctrl_excelsior
+{
public:
-
- fifo_ctrl_excelsior_impl(zero_copy_if::sptr xport, const fifo_ctrl_excelsior_config &config):
- _xport(xport),
- _config(config),
- _seq_out(0),
- _seq_ack(0),
- _timeout(ACK_TIMEOUT),
- _async_fifo(1000),
- _ctrl_fifo(MAX_SEQS_OUT+1)
+ fifo_ctrl_excelsior_impl(
+ zero_copy_if::sptr xport, const fifo_ctrl_excelsior_config& config)
+ : _xport(xport)
+ , _config(config)
+ , _seq_out(0)
+ , _seq_ack(0)
+ , _timeout(ACK_TIMEOUT)
+ , _async_fifo(1000)
+ , _ctrl_fifo(MAX_SEQS_OUT + 1)
{
- while (_xport->get_recv_buff(0.0)){} //flush
+ while (_xport->get_recv_buff(0.0)) {
+ } // flush
this->set_time(uhd::time_spec_t(0.0));
- this->set_tick_rate(1.0); //something possible but bogus
- _msg_task = task::make([this](){ this->handle_msg(); });
+ this->set_tick_rate(1.0); // something possible but bogus
+ _msg_task = task::make([this]() { this->handle_msg(); });
this->init_spi();
}
- ~fifo_ctrl_excelsior_impl(void){
- _timeout = ACK_TIMEOUT; //reset timeout to something small
+ ~fifo_ctrl_excelsior_impl(void)
+ {
+ _timeout = ACK_TIMEOUT; // reset timeout to something small
UHD_SAFE_CALL(
- this->peek32(0); //dummy peek with the purpose of ack'ing all packets
+ this->peek32(0); // dummy peek with the purpose of ack'ing all packets
)
}
- bool pop_async_msg(async_metadata_t &async_metadata, double timeout){
+ bool pop_async_msg(async_metadata_t& async_metadata, double timeout)
+ {
return _async_fifo.pop_with_timed_wait(async_metadata, timeout);
}
- void handle_msg(void){
+ void handle_msg(void)
+ {
managed_recv_buffer::sptr buff = _xport->get_recv_buff();
- if (not buff) return;
- const uint32_t *pkt = buff->cast<const uint32_t *>();
+ if (not buff)
+ return;
+ const uint32_t* pkt = buff->cast<const uint32_t*>();
vrt::if_packet_info_t packet_info;
- packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
- try{
+ packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
+ try {
vrt::if_hdr_unpack_le(pkt, packet_info);
- }
- catch(const std::exception &ex){
+ } catch (const std::exception& ex) {
UHD_LOGGER_ERROR("UHD") << "FIFO ctrl bad VITA packet: " << ex.what();
}
- if (packet_info.has_sid and packet_info.sid == _config.ctrl_sid_base){
+ if (packet_info.has_sid and packet_info.sid == _config.ctrl_sid_base) {
ctrl_result_t res = ctrl_result_t();
- res.msg[0] = uhd::wtohx(pkt[packet_info.num_header_words32+0]);
- res.msg[1] = uhd::wtohx(pkt[packet_info.num_header_words32+1]);
+ res.msg[0] = uhd::wtohx(pkt[packet_info.num_header_words32 + 0]);
+ res.msg[1] = uhd::wtohx(pkt[packet_info.num_header_words32 + 1]);
_ctrl_fifo.push_with_haste(res);
- }
- else if (packet_info.has_sid and packet_info.sid >= _config.async_sid_base and packet_info.sid <= _config.async_sid_base + _config.num_async_chan){
+ } else if (packet_info.has_sid and packet_info.sid >= _config.async_sid_base
+ and packet_info.sid
+ <= _config.async_sid_base + _config.num_async_chan) {
async_metadata_t metadata;
- load_metadata_from_buff(uhd::wtohx<uint32_t>, metadata, packet_info, pkt, _tick_rate, packet_info.sid - _config.async_sid_base);
+ load_metadata_from_buff(uhd::wtohx<uint32_t>,
+ metadata,
+ packet_info,
+ pkt,
+ _tick_rate,
+ packet_info.sid - _config.async_sid_base);
_async_fifo.push_with_pop_on_full(metadata);
standard_async_msg_prints(metadata);
- }
- else{
- UHD_LOGGER_ERROR("UHD") << "FIFO ctrl got unknown SID: " << packet_info.sid ;
+ } else {
+ UHD_LOGGER_ERROR("UHD") << "FIFO ctrl got unknown SID: " << packet_info.sid;
}
}
/*******************************************************************
* Peek and poke 32 bit implementation
******************************************************************/
- void poke32(const wb_addr_type addr, const uint32_t data){
+ void poke32(const wb_addr_type addr, const uint32_t data)
+ {
std::lock_guard<std::mutex> lock(_mutex);
this->send_pkt(addr, data, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
}
- uint32_t peek32(const wb_addr_type addr){
+ uint32_t peek32(const wb_addr_type addr)
+ {
std::lock_guard<std::mutex> lock(_mutex);
this->send_pkt(addr, 0, PEEK32_CMD);
@@ -117,58 +130,62 @@ public:
/*******************************************************************
* Peek and poke 16 bit not implemented
******************************************************************/
- void poke16(const wb_addr_type, const uint16_t){
+ void poke16(const wb_addr_type, const uint16_t)
+ {
throw uhd::not_implemented_error("poke16 not implemented in fifo ctrl module");
}
- uint16_t peek16(const wb_addr_type){
+ uint16_t peek16(const wb_addr_type)
+ {
throw uhd::not_implemented_error("peek16 not implemented in fifo ctrl module");
}
/*******************************************************************
* FIFO controlled SPI implementation
******************************************************************/
- void init_spi(void){
+ void init_spi(void)
+ {
std::lock_guard<std::mutex> lock(_mutex);
this->send_pkt(SPI_DIV, SPI_DIVIDER, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
_ctrl_word_cache = 0; // force update first time around
}
- uint32_t transact_spi(
- int which_slave,
- const spi_config_t &config,
+ uint32_t transact_spi(int which_slave,
+ const spi_config_t& config,
uint32_t data,
size_t num_bits,
- bool readback
- ){
+ bool readback)
+ {
std::lock_guard<std::mutex> lock(_mutex);
- //load control word
+ // load control word
uint32_t ctrl_word = 0;
ctrl_word |= ((which_slave & 0xffffff) << 0);
ctrl_word |= ((num_bits & 0x3ff) << 24);
- if (config.mosi_edge == spi_config_t::EDGE_FALL) ctrl_word |= (1 << 31);
- if (config.miso_edge == spi_config_t::EDGE_RISE) ctrl_word |= (1 << 30);
+ if (config.mosi_edge == spi_config_t::EDGE_FALL)
+ ctrl_word |= (1 << 31);
+ if (config.miso_edge == spi_config_t::EDGE_RISE)
+ ctrl_word |= (1 << 30);
- //load data word (must be in upper bits)
+ // load data word (must be in upper bits)
const uint32_t data_out = data << (32 - num_bits);
- //conditionally send control word
- if (_ctrl_word_cache != ctrl_word){
+ // conditionally send control word
+ if (_ctrl_word_cache != ctrl_word) {
this->send_pkt(SPI_CTRL, ctrl_word, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
_ctrl_word_cache = ctrl_word;
}
- //send data word
+ // send data word
this->send_pkt(SPI_DATA, data_out, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
- //conditional readback
- if (readback){
+ // conditional readback
+ if (readback) {
this->send_pkt(_config.spi_rb, 0, PEEK32_CMD);
return this->wait_for_ack(_seq_out);
}
@@ -179,11 +196,13 @@ public:
/*******************************************************************
* Update methods for time
******************************************************************/
- void set_time(const uhd::time_spec_t &time){
+ void set_time(const uhd::time_spec_t& time)
+ {
std::lock_guard<std::mutex> lock(_mutex);
- _time = time;
+ _time = time;
_use_time = _time != uhd::time_spec_t(0.0);
- if (_use_time) _timeout = MASSIVE_TIMEOUT; //permanently sets larger timeout
+ if (_use_time)
+ _timeout = MASSIVE_TIMEOUT; // permanently sets larger timeout
}
uhd::time_spec_t get_time(void)
@@ -192,65 +211,69 @@ public:
return _time;
}
- void set_tick_rate(const double rate){
+ void set_tick_rate(const double rate)
+ {
std::lock_guard<std::mutex> lock(_mutex);
_tick_rate = rate;
}
private:
-
/*******************************************************************
* Primary control and interaction private methods
******************************************************************/
- UHD_INLINE void send_pkt(wb_addr_type addr, uint32_t data, int cmd){
+ UHD_INLINE void send_pkt(wb_addr_type addr, uint32_t data, int cmd)
+ {
managed_send_buffer::sptr buff = _xport->get_send_buff();
- if (not buff){
+ if (not buff) {
throw uhd::runtime_error("fifo ctrl timed out getting a send buffer");
}
- uint32_t *pkt = buff->cast<uint32_t *>();
+ uint32_t* pkt = buff->cast<uint32_t*>();
- //load packet info
+ // load packet info
vrt::if_packet_info_t packet_info;
- packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
+ packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
packet_info.num_payload_words32 = 2;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
+ packet_info.num_payload_bytes =
+ packet_info.num_payload_words32 * sizeof(uint32_t);
packet_info.packet_count = ++_seq_out;
- packet_info.tsf = _time.to_ticks(_tick_rate);
- packet_info.sob = false;
- packet_info.eob = false;
- packet_info.has_sid = false;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = _use_time;
- packet_info.has_tlr = false;
-
- //load header
+ packet_info.tsf = _time.to_ticks(_tick_rate);
+ packet_info.sob = false;
+ packet_info.eob = false;
+ packet_info.has_sid = false;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = _use_time;
+ packet_info.has_tlr = false;
+
+ // load header
vrt::if_hdr_pack_le(pkt, packet_info);
- //load payload
- const uint32_t ctrl_word = (addr/4 & 0xff) | cmd | (_seq_out << 16);
- pkt[packet_info.num_header_words32+0] = uhd::htowx(ctrl_word);
- pkt[packet_info.num_header_words32+1] = uhd::htowx(data);
+ // load payload
+ const uint32_t ctrl_word = (addr / 4 & 0xff) | cmd | (_seq_out << 16);
+ pkt[packet_info.num_header_words32 + 0] = uhd::htowx(ctrl_word);
+ pkt[packet_info.num_header_words32 + 1] = uhd::htowx(data);
- //send the buffer over the interface
- buff->commit(sizeof(uint32_t)*(packet_info.num_packet_words32));
+ // send the buffer over the interface
+ buff->commit(sizeof(uint32_t) * (packet_info.num_packet_words32));
}
- UHD_INLINE bool wraparound_lt16(const int16_t i0, const int16_t i1){
- if (((i0 ^ i1) & 0x8000) == 0) //same sign bits
+ UHD_INLINE bool wraparound_lt16(const int16_t i0, const int16_t i1)
+ {
+ if (((i0 ^ i1) & 0x8000) == 0) // same sign bits
return uint16_t(i0) < uint16_t(i1);
return int16_t(i1 - i0) > 0;
}
- UHD_INLINE uint32_t wait_for_ack(const uint16_t seq_to_ack){
-
- while (wraparound_lt16(_seq_ack, seq_to_ack)){
+ UHD_INLINE uint32_t wait_for_ack(const uint16_t seq_to_ack)
+ {
+ while (wraparound_lt16(_seq_ack, seq_to_ack)) {
ctrl_result_t res = ctrl_result_t();
- if (not _ctrl_fifo.pop_with_timed_wait(res, _timeout)){
+ if (not _ctrl_fifo.pop_with_timed_wait(res, _timeout)) {
throw uhd::runtime_error("fifo ctrl timed out looking for acks");
}
_seq_ack = res.msg[0] >> 16;
- if (_seq_ack == seq_to_ack) return res.msg[1];
+ if (_seq_ack == seq_to_ack)
+ return res.msg[1];
}
return 0;
@@ -272,7 +295,8 @@ private:
};
-fifo_ctrl_excelsior::sptr fifo_ctrl_excelsior::make(zero_copy_if::sptr xport, const fifo_ctrl_excelsior_config &config)
+fifo_ctrl_excelsior::sptr fifo_ctrl_excelsior::make(
+ zero_copy_if::sptr xport, const fifo_ctrl_excelsior_config& config)
{
return sptr(new fifo_ctrl_excelsior_impl(xport, config));
}
diff --git a/host/lib/usrp/b100/fifo_ctrl_excelsior.hpp b/host/lib/usrp/b100/fifo_ctrl_excelsior.hpp
index 27da0026c..69b2dd4fc 100644
--- a/host/lib/usrp/b100/fifo_ctrl_excelsior.hpp
+++ b/host/lib/usrp/b100/fifo_ctrl_excelsior.hpp
@@ -8,13 +8,13 @@
#ifndef INCLUDED_B200_CTRL_HPP
#define INCLUDED_B200_CTRL_HPP
-#include <uhd/types/time_spec.hpp>
+#include <uhd/transport/zero_copy.hpp>
#include <uhd/types/metadata.hpp>
#include <uhd/types/serial.hpp>
-#include <uhd/transport/zero_copy.hpp>
-#include <memory>
-#include <boost/utility.hpp>
+#include <uhd/types/time_spec.hpp>
#include <uhd/types/wb_iface.hpp>
+#include <boost/utility.hpp>
+#include <memory>
#include <string>
@@ -36,16 +36,14 @@ public:
typedef std::shared_ptr<fifo_ctrl_excelsior> sptr;
//! Make a new control object
- static sptr make(
- uhd::transport::zero_copy_if::sptr xport,
- const fifo_ctrl_excelsior_config &config
- );
+ static sptr make(uhd::transport::zero_copy_if::sptr xport,
+ const fifo_ctrl_excelsior_config& config);
//! Set the tick rate (converting time into ticks)
virtual void set_tick_rate(const double rate) = 0;
//! Pop an async message from the queue or timeout
- virtual bool pop_async_msg(uhd::async_metadata_t &async_metadata, double timeout) = 0;
+ virtual bool pop_async_msg(uhd::async_metadata_t& async_metadata, double timeout) = 0;
};
#endif /* INCLUDED_B200_CTRL_HPP */
diff --git a/host/lib/usrp/b100/io_impl.cpp b/host/lib/usrp/b100/io_impl.cpp
index c50327271..8aad480e7 100644
--- a/host/lib/usrp/b100/io_impl.cpp
+++ b/host/lib/usrp/b100/io_impl.cpp
@@ -19,146 +19,169 @@ using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-void b100_impl::update_rates(void){
+void b100_impl::update_rates(void)
+{
const fs_path mb_path = "/mboards/0";
_tree->access<double>(mb_path / "tick_rate").update();
- //and now that the tick rate is set, init the host rates to something
- for(const std::string &name: _tree->list(mb_path / "rx_dsps")){
+ // and now that the tick rate is set, init the host rates to something
+ for (const std::string& name : _tree->list(mb_path / "rx_dsps")) {
_tree->access<double>(mb_path / "rx_dsps" / name / "rate" / "value").update();
}
- for(const std::string &name: _tree->list(mb_path / "tx_dsps")){
+ for (const std::string& name : _tree->list(mb_path / "tx_dsps")) {
_tree->access<double>(mb_path / "tx_dsps" / name / "rate" / "value").update();
}
}
-void b100_impl::update_tick_rate(const double rate){
-
- //update the tick rate on all existing streamers -> thread safe
- for (size_t i = 0; i < _rx_streamers.size(); i++){
+void b100_impl::update_tick_rate(const double rate)
+{
+ // update the tick rate on all existing streamers -> thread safe
+ for (size_t i = 0; i < _rx_streamers.size(); i++) {
std::shared_ptr<sph::recv_packet_streamer> my_streamer =
std::dynamic_pointer_cast<sph::recv_packet_streamer>(_rx_streamers[i].lock());
- if (my_streamer.get() == NULL) continue;
+ if (my_streamer.get() == NULL)
+ continue;
my_streamer->set_tick_rate(rate);
}
- for (size_t i = 0; i < _tx_streamers.size(); i++){
+ for (size_t i = 0; i < _tx_streamers.size(); i++) {
std::shared_ptr<sph::send_packet_streamer> my_streamer =
std::dynamic_pointer_cast<sph::send_packet_streamer>(_tx_streamers[i].lock());
- if (my_streamer.get() == NULL) continue;
+ if (my_streamer.get() == NULL)
+ continue;
my_streamer->set_tick_rate(rate);
}
}
-void b100_impl::update_rx_samp_rate(const size_t dspno, const double rate){
+void b100_impl::update_rx_samp_rate(const size_t dspno, const double rate)
+{
std::shared_ptr<sph::recv_packet_streamer> my_streamer =
std::dynamic_pointer_cast<sph::recv_packet_streamer>(_rx_streamers[dspno].lock());
- if (my_streamer.get() == NULL) return;
+ if (my_streamer.get() == NULL)
+ return;
my_streamer->set_samp_rate(rate);
const double adj = _rx_dsps[dspno]->get_scaling_adjustment();
my_streamer->set_scale_factor(adj);
}
-void b100_impl::update_tx_samp_rate(const size_t dspno, const double rate){
+void b100_impl::update_tx_samp_rate(const size_t dspno, const double rate)
+{
std::shared_ptr<sph::send_packet_streamer> my_streamer =
std::dynamic_pointer_cast<sph::send_packet_streamer>(_tx_streamers[dspno].lock());
- if (my_streamer.get() == NULL) return;
+ if (my_streamer.get() == NULL)
+ return;
my_streamer->set_samp_rate(rate);
const double adj = _tx_dsp->get_scaling_adjustment();
my_streamer->set_scale_factor(adj);
}
-void b100_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
+void b100_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t& spec)
+{
fs_path root = "/mboards/0/dboards";
- //sanity checking
+ // sanity checking
validate_subdev_spec(_tree, spec, "rx");
- //setup mux for this spec
+ // setup mux for this spec
bool fe_swapped = false;
- for (size_t i = 0; i < spec.size(); i++){
- const std::string conn = _tree->access<std::string>(root / spec[i].db_name / "rx_frontends" / spec[i].sd_name / "connection").get();
- if (i == 0 and (conn == "QI" or conn == "Q")) fe_swapped = true;
+ for (size_t i = 0; i < spec.size(); i++) {
+ const std::string conn =
+ _tree
+ ->access<std::string>(root / spec[i].db_name / "rx_frontends"
+ / spec[i].sd_name / "connection")
+ .get();
+ if (i == 0 and (conn == "QI" or conn == "Q"))
+ fe_swapped = true;
_rx_dsps[i]->set_mux(conn, fe_swapped);
}
_rx_fe->set_mux(fe_swapped);
}
-void b100_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
+void b100_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t& spec)
+{
fs_path root = "/mboards/0/dboards";
- //sanity checking
+ // sanity checking
validate_subdev_spec(_tree, spec, "tx");
- //set the mux for this spec
- const std::string conn = _tree->access<std::string>(root / spec[0].db_name / "tx_frontends" / spec[0].sd_name / "connection").get();
+ // set the mux for this spec
+ const std::string conn =
+ _tree
+ ->access<std::string>(
+ root / spec[0].db_name / "tx_frontends" / spec[0].sd_name / "connection")
+ .get();
_tx_fe->set_mux(conn);
}
/***********************************************************************
* Async Data
**********************************************************************/
-bool b100_impl::recv_async_msg(
- async_metadata_t &async_metadata, double timeout
-){
+bool b100_impl::recv_async_msg(async_metadata_t& async_metadata, double timeout)
+{
return _fifo_ctrl->pop_async_msg(async_metadata, timeout);
}
/***********************************************************************
* Receive streamer
**********************************************************************/
-rx_streamer::sptr b100_impl::get_rx_stream(const uhd::stream_args_t &args_){
+rx_streamer::sptr b100_impl::get_rx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels = args.channels.empty()? std::vector<size_t>(1, 0) : args.channels;
-
- //calculate packet size
- static const size_t hdr_size = 0
- + vrt::max_if_hdr_words32*sizeof(uint32_t)
- + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
- - sizeof(vrt::if_packet_info_t().tsi) //no int time ever used
- ;
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels = args.channels.empty() ? std::vector<size_t>(1, 0) : args.channels;
+
+ // calculate packet size
+ static const size_t hdr_size =
+ 0 + vrt::max_if_hdr_words32 * sizeof(uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) // forced to have trailer
+ - sizeof(vrt::if_packet_info_t().cid) // no class id ever used
+ - sizeof(vrt::if_packet_info_t().tsi) // no int time ever used
+ ;
const size_t bpp = _data_transport->get_recv_frame_size() - hdr_size;
const size_t bpi = convert::get_bytes_per_item(args.otw_format);
- const size_t spp = unsigned(args.args.cast<double>("spp", bpp/bpi));
+ const size_t spp = unsigned(args.args.cast<double>("spp", bpp / bpi));
- //make the new streamer given the samples per packet
- std::shared_ptr<sph::recv_packet_streamer> my_streamer = std::make_shared<sph::recv_packet_streamer>(spp);
+ // make the new streamer given the samples per packet
+ std::shared_ptr<sph::recv_packet_streamer> my_streamer =
+ std::make_shared<sph::recv_packet_streamer>(spp);
- //init some streamer stuff
+ // init some streamer stuff
my_streamer->resize(args.channels.size());
my_streamer->set_vrt_unpacker(&vrt::if_hdr_unpack_le);
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.otw_format + "_item32_le";
- id.num_inputs = 1;
+ id.input_format = args.otw_format + "_item32_le";
+ id.num_inputs = 1;
id.output_format = args.cpu_format;
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
- //bind callbacks for the handler
- for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++){
+ // bind callbacks for the handler
+ for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++) {
const size_t dsp = args.channels[chan_i];
- _rx_dsps[dsp]->set_nsamps_per_packet(spp); //seems to be a good place to set this
+ _rx_dsps[dsp]->set_nsamps_per_packet(spp); // seems to be a good place to set this
_rx_dsps[dsp]->setup(args);
_recv_demuxer->realloc_sid(B100_RX_SID_BASE + dsp);
- my_streamer->set_xport_chan_get_buff(chan_i, std::bind(
- &recv_packet_demuxer_3000::get_recv_buff, _recv_demuxer, B100_RX_SID_BASE + dsp, std::placeholders::_1
- ), true /*flush*/);
- my_streamer->set_overflow_handler(chan_i, std::bind(
- &rx_dsp_core_200::handle_overflow, _rx_dsps[dsp]
- ));
- my_streamer->set_issue_stream_cmd(chan_i, std::bind(
- &rx_dsp_core_200::issue_stream_command, _rx_dsps[dsp], std::placeholders::_1));
- _rx_streamers[dsp] = my_streamer; //store weak pointer
+ my_streamer->set_xport_chan_get_buff(chan_i,
+ std::bind(&recv_packet_demuxer_3000::get_recv_buff,
+ _recv_demuxer,
+ B100_RX_SID_BASE + dsp,
+ std::placeholders::_1),
+ true /*flush*/);
+ my_streamer->set_overflow_handler(
+ chan_i, std::bind(&rx_dsp_core_200::handle_overflow, _rx_dsps[dsp]));
+ my_streamer->set_issue_stream_cmd(chan_i,
+ std::bind(&rx_dsp_core_200::issue_stream_command,
+ _rx_dsps[dsp],
+ std::placeholders::_1));
+ _rx_streamers[dsp] = my_streamer; // store weak pointer
}
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
@@ -167,52 +190,57 @@ rx_streamer::sptr b100_impl::get_rx_stream(const uhd::stream_args_t &args_){
/***********************************************************************
* Transmit streamer
**********************************************************************/
-tx_streamer::sptr b100_impl::get_tx_stream(const uhd::stream_args_t &args_){
+tx_streamer::sptr b100_impl::get_tx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels = args.channels.empty()? std::vector<size_t>(1, 0) : args.channels;
-
- //calculate packet size
- static const size_t hdr_size = 0
- + vrt::max_if_hdr_words32*sizeof(uint32_t)
- + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- - sizeof(vrt::if_packet_info_t().sid) //no stream id ever used
- - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
- - sizeof(vrt::if_packet_info_t().tsi) //no int time ever used
- ;
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels = args.channels.empty() ? std::vector<size_t>(1, 0) : args.channels;
+
+ // calculate packet size
+ static const size_t hdr_size =
+ 0 + vrt::max_if_hdr_words32 * sizeof(uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) // forced to have trailer
+ - sizeof(vrt::if_packet_info_t().sid) // no stream id ever used
+ - sizeof(vrt::if_packet_info_t().cid) // no class id ever used
+ - sizeof(vrt::if_packet_info_t().tsi) // no int time ever used
+ ;
static const size_t bpp = _data_transport->get_send_frame_size() - hdr_size;
- const size_t spp = bpp/convert::get_bytes_per_item(args.otw_format);
+ const size_t spp = bpp / convert::get_bytes_per_item(args.otw_format);
- //make the new streamer given the samples per packet
- std::shared_ptr<sph::send_packet_streamer> my_streamer = std::make_shared<sph::send_packet_streamer>(spp);
+ // make the new streamer given the samples per packet
+ std::shared_ptr<sph::send_packet_streamer> my_streamer =
+ std::make_shared<sph::send_packet_streamer>(spp);
- //init some streamer stuff
+ // init some streamer stuff
my_streamer->resize(args.channels.size());
my_streamer->set_vrt_packer(&vrt::if_hdr_pack_le);
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.cpu_format;
- id.num_inputs = 1;
+ id.input_format = args.cpu_format;
+ id.num_inputs = 1;
id.output_format = args.otw_format + "_item32_le";
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
- //bind callbacks for the handler
- for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++){
+ // bind callbacks for the handler
+ for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++) {
const size_t dsp = args.channels[chan_i];
- UHD_ASSERT_THROW(dsp == 0); //always 0
+ UHD_ASSERT_THROW(dsp == 0); // always 0
_tx_dsp->setup(args);
- my_streamer->set_xport_chan_get_buff(chan_i, std::bind(
- &zero_copy_if::get_send_buff, _data_transport, std::placeholders::_1
- ));
- my_streamer->set_async_receiver(std::bind(&fifo_ctrl_excelsior::pop_async_msg, _fifo_ctrl, std::placeholders::_1, std::placeholders::_2));
- _tx_streamers[dsp] = my_streamer; //store weak pointer
+ my_streamer->set_xport_chan_get_buff(chan_i,
+ std::bind(
+ &zero_copy_if::get_send_buff, _data_transport, std::placeholders::_1));
+ my_streamer->set_async_receiver(std::bind(&fifo_ctrl_excelsior::pop_async_msg,
+ _fifo_ctrl,
+ std::placeholders::_1,
+ std::placeholders::_2));
+ _tx_streamers[dsp] = my_streamer; // store weak pointer
}
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
diff --git a/host/lib/usrp/b100/mb_eeprom.cpp b/host/lib/usrp/b100/mb_eeprom.cpp
index 3e46d7d1f..2be09891f 100644
--- a/host/lib/usrp/b100/mb_eeprom.cpp
+++ b/host/lib/usrp/b100/mb_eeprom.cpp
@@ -5,21 +5,22 @@
//
#include "b100_impl.hpp"
-#include <uhdlib/utils/eeprom_utils.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhdlib/utils/eeprom_utils.hpp>
namespace {
- const uint8_t B100_EEPROM_ADDR = 0x50;
+const uint8_t B100_EEPROM_ADDR = 0x50;
- //use char array so we dont need to attribute packed
- struct b100_eeprom_map{
- unsigned char _r[220];
- unsigned char revision[2];
- unsigned char product[2];
- unsigned char name[NAME_MAX_LEN];
- unsigned char serial[SERIAL_LEN];
- };
-}
+// use char array so we dont need to attribute packed
+struct b100_eeprom_map
+{
+ unsigned char _r[220];
+ unsigned char revision[2];
+ unsigned char product[2];
+ unsigned char name[NAME_MAX_LEN];
+ unsigned char serial[SERIAL_LEN];
+};
+} // namespace
using namespace uhd;
using uhd::usrp::mboard_eeprom_t;
@@ -28,64 +29,50 @@ mboard_eeprom_t b100_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
{
mboard_eeprom_t mb_eeprom;
- //extract the revision number
+ // extract the revision number
mb_eeprom["revision"] = uint16_bytes_to_string(
- iface->read_eeprom(
- B100_EEPROM_ADDR,
- offsetof(b100_eeprom_map, revision),
- 2
- )
- );
+ iface->read_eeprom(B100_EEPROM_ADDR, offsetof(b100_eeprom_map, revision), 2));
- //extract the product code
+ // extract the product code
mb_eeprom["product"] = uint16_bytes_to_string(
- iface->read_eeprom(
- B100_EEPROM_ADDR,
- offsetof(b100_eeprom_map, product),
- 2
- )
- );
+ iface->read_eeprom(B100_EEPROM_ADDR, offsetof(b100_eeprom_map, product), 2));
- //extract the serial
+ // extract the serial
mb_eeprom["serial"] = bytes_to_string(iface->read_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, serial), SERIAL_LEN
- ));
+ B100_EEPROM_ADDR, offsetof(b100_eeprom_map, serial), SERIAL_LEN));
- //extract the name
+ // extract the name
mb_eeprom["name"] = bytes_to_string(iface->read_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, name), NAME_MAX_LEN
- ));
+ B100_EEPROM_ADDR, offsetof(b100_eeprom_map, name), NAME_MAX_LEN));
return mb_eeprom;
}
-void b100_impl::set_mb_eeprom(
- const uhd::usrp::mboard_eeprom_t &mb_eeprom
-) {
- auto &iface = _fx2_ctrl;
-
- //parse the revision number
- if (mb_eeprom.has_key("revision")) iface->write_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, revision),
- string_to_uint16_bytes(mb_eeprom["revision"])
- );
-
- //parse the product code
- if (mb_eeprom.has_key("product")) iface->write_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, product),
- string_to_uint16_bytes(mb_eeprom["product"])
- );
+void b100_impl::set_mb_eeprom(const uhd::usrp::mboard_eeprom_t& mb_eeprom)
+{
+ auto& iface = _fx2_ctrl;
- //store the serial
- if (mb_eeprom.has_key("serial")) iface->write_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, serial),
- string_to_bytes(mb_eeprom["serial"], SERIAL_LEN)
- );
+ // parse the revision number
+ if (mb_eeprom.has_key("revision"))
+ iface->write_eeprom(B100_EEPROM_ADDR,
+ offsetof(b100_eeprom_map, revision),
+ string_to_uint16_bytes(mb_eeprom["revision"]));
- //store the name
- if (mb_eeprom.has_key("name")) iface->write_eeprom(
- B100_EEPROM_ADDR, offsetof(b100_eeprom_map, name),
- string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
- );
+ // parse the product code
+ if (mb_eeprom.has_key("product"))
+ iface->write_eeprom(B100_EEPROM_ADDR,
+ offsetof(b100_eeprom_map, product),
+ string_to_uint16_bytes(mb_eeprom["product"]));
+
+ // store the serial
+ if (mb_eeprom.has_key("serial"))
+ iface->write_eeprom(B100_EEPROM_ADDR,
+ offsetof(b100_eeprom_map, serial),
+ string_to_bytes(mb_eeprom["serial"], SERIAL_LEN));
+
+ // store the name
+ if (mb_eeprom.has_key("name"))
+ iface->write_eeprom(B100_EEPROM_ADDR,
+ offsetof(b100_eeprom_map, name),
+ string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN));
}
-
diff --git a/host/lib/usrp/b100/usb_zero_copy_wrapper.cpp b/host/lib/usrp/b100/usb_zero_copy_wrapper.cpp
index 8059c2a0d..908841462 100644
--- a/host/lib/usrp/b100/usb_zero_copy_wrapper.cpp
+++ b/host/lib/usrp/b100/usb_zero_copy_wrapper.cpp
@@ -21,42 +21,52 @@
using namespace uhd;
using namespace uhd::transport;
-static const boost::posix_time::time_duration AUTOFLUSH_TIMEOUT(boost::posix_time::milliseconds(1));
+static const boost::posix_time::time_duration AUTOFLUSH_TIMEOUT(
+ boost::posix_time::milliseconds(1));
/***********************************************************************
* USB zero copy wrapper - managed receive buffer
**********************************************************************/
-class usb_zero_copy_wrapper_mrb : public managed_recv_buffer{
+class usb_zero_copy_wrapper_mrb : public managed_recv_buffer
+{
public:
- usb_zero_copy_wrapper_mrb(void){/*NOP*/}
+ usb_zero_copy_wrapper_mrb(void)
+ { /*NOP*/
+ }
- void release(void){
- _mrb.reset(); //decrement ref count, other MRB's may hold a ref
+ void release(void)
+ {
+ _mrb.reset(); // decrement ref count, other MRB's may hold a ref
_claimer.release();
}
- UHD_INLINE sptr get_new(
- managed_recv_buffer::sptr &mrb, size_t &offset_bytes,
- const double timeout, size_t &index
- ){
- if (not mrb or not _claimer.claim_with_wait(timeout)) return sptr();
+ UHD_INLINE sptr get_new(managed_recv_buffer::sptr& mrb,
+ size_t& offset_bytes,
+ const double timeout,
+ size_t& index)
+ {
+ if (not mrb or not _claimer.claim_with_wait(timeout))
+ return sptr();
- index++; //advances the caller's buffer
+ index++; // advances the caller's buffer
- //hold a copy of the buffer shared pointer
+ // hold a copy of the buffer shared pointer
UHD_ASSERT_THROW(not _mrb);
_mrb = mrb;
- //extract this packet's memory address and length in bytes
- char *mem = mrb->cast<char *>() + offset_bytes;
- const uint32_t *mem32 = reinterpret_cast<const uint32_t *>(mem);
- const size_t words32 = (uhd::wtohx(mem32[0]) & 0xffff); //length in words32 (from VRT header)
- const size_t len = words32*sizeof(uint32_t); //length in bytes
+ // extract this packet's memory address and length in bytes
+ char* mem = mrb->cast<char*>() + offset_bytes;
+ const uint32_t* mem32 = reinterpret_cast<const uint32_t*>(mem);
+ const size_t words32 =
+ (uhd::wtohx(mem32[0]) & 0xffff); // length in words32 (from VRT header)
+ const size_t len = words32 * sizeof(uint32_t); // length in bytes
- //check if this receive buffer has been exhausted
+ // check if this receive buffer has been exhausted
offset_bytes += len;
- if (offset_bytes >= mrb->size()) mrb.reset(); //drop caller's ref
- else if (uhd::wtohx(mem32[words32]) == 0) mrb.reset();
+ if (offset_bytes >= mrb->size())
+ mrb.reset(); // drop caller's ref
+ else if (uhd::wtohx(mem32[words32]) == 0)
+ mrb.reset();
return make(this, mem, len);
}
@@ -69,10 +79,12 @@ private:
/***********************************************************************
* USB zero copy wrapper - managed send buffer
**********************************************************************/
-class usb_zero_copy_wrapper_msb : public managed_send_buffer{
+class usb_zero_copy_wrapper_msb : public managed_send_buffer
+{
public:
- usb_zero_copy_wrapper_msb(const zero_copy_if::sptr internal, const size_t fragmentation_size):
- _internal(internal), _fragmentation_size(fragmentation_size)
+ usb_zero_copy_wrapper_msb(
+ const zero_copy_if::sptr internal, const size_t fragmentation_size)
+ : _internal(internal), _fragmentation_size(fragmentation_size)
{
_ok_to_auto_flush = false;
_task = uhd::task::make(std::bind(&usb_zero_copy_wrapper_msb::auto_flush, this));
@@ -80,40 +92,46 @@ public:
~usb_zero_copy_wrapper_msb(void)
{
- //ensure the task has exited before anything auto deconstructs
+ // ensure the task has exited before anything auto deconstructs
_task.reset();
}
- void release(void){
+ void release(void)
+ {
boost::mutex::scoped_lock lock(_mutex);
_ok_to_auto_flush = true;
- //get a reference to the VITA header before incrementing
- const uint32_t vita_header = reinterpret_cast<const uint32_t *>(_mem_buffer_tip)[0];
+ // get a reference to the VITA header before incrementing
+ const uint32_t vita_header =
+ reinterpret_cast<const uint32_t*>(_mem_buffer_tip)[0];
_bytes_in_buffer += size();
_mem_buffer_tip += size();
- //extract VITA end of packet flag, we must force flush under eof conditions
- const bool eop = (uhd::wtohx(vita_header) & (0x1 << 24)) != 0;
- const bool full = _bytes_in_buffer >= (_last_send_buff->size() - _fragmentation_size);
- if (eop or full){
+ // extract VITA end of packet flag, we must force flush under eof conditions
+ const bool eop = (uhd::wtohx(vita_header) & (0x1 << 24)) != 0;
+ const bool full = _bytes_in_buffer
+ >= (_last_send_buff->size() - _fragmentation_size);
+ if (eop or full) {
_last_send_buff->commit(_bytes_in_buffer);
_last_send_buff.reset();
- //notify the auto-flusher to restart its timed_wait
- lock.unlock(); _cond.notify_one();
+ // notify the auto-flusher to restart its timed_wait
+ lock.unlock();
+ _cond.notify_one();
}
}
- UHD_INLINE sptr get_new(const double timeout){
+ UHD_INLINE sptr get_new(const double timeout)
+ {
boost::mutex::scoped_lock lock(_mutex);
_ok_to_auto_flush = false;
- if (not _last_send_buff){
+ if (not _last_send_buff) {
_last_send_buff = _internal->get_send_buff(timeout);
- if (not _last_send_buff) return sptr();
- _mem_buffer_tip = _last_send_buff->cast<char *>();
+ if (not _last_send_buff)
+ return sptr();
+ _mem_buffer_tip = _last_send_buff->cast<char*>();
_bytes_in_buffer = 0;
}
@@ -125,9 +143,9 @@ private:
const size_t _fragmentation_size;
managed_send_buffer::sptr _last_send_buff;
size_t _bytes_in_buffer;
- char *_mem_buffer_tip;
+ char* _mem_buffer_tip;
- //private variables for auto flusher
+ // private variables for auto flusher
boost::mutex _mutex;
boost::condition_variable _cond;
uhd::task::sptr _task;
@@ -141,8 +159,7 @@ private:
{
boost::mutex::scoped_lock lock(_mutex);
const bool timeout = not _cond.timed_wait(lock, AUTOFLUSH_TIMEOUT);
- if (timeout and _ok_to_auto_flush and _last_send_buff and _bytes_in_buffer != 0)
- {
+ if (timeout and _ok_to_auto_flush and _last_send_buff and _bytes_in_buffer != 0) {
_last_send_buff->commit(_bytes_in_buffer);
_last_send_buff.reset();
}
@@ -152,69 +169,78 @@ private:
/***********************************************************************
* USB zero copy wrapper implementation
**********************************************************************/
-class usb_zero_copy_wrapper : public usb_zero_copy{
+class usb_zero_copy_wrapper : public usb_zero_copy
+{
public:
- usb_zero_copy_wrapper(zero_copy_if::sptr usb_zc, const size_t frame_boundary):
- _internal_zc(usb_zc),
- _frame_boundary(frame_boundary),
- _last_recv_offset(0),
- _next_recv_buff_index(0)
+ usb_zero_copy_wrapper(zero_copy_if::sptr usb_zc, const size_t frame_boundary)
+ : _internal_zc(usb_zc)
+ , _frame_boundary(frame_boundary)
+ , _last_recv_offset(0)
+ , _next_recv_buff_index(0)
{
- for (size_t i = 0; i < this->get_num_recv_frames(); i++){
+ for (size_t i = 0; i < this->get_num_recv_frames(); i++) {
_mrb_pool.push_back(std::make_shared<usb_zero_copy_wrapper_mrb>());
}
- _the_only_msb = std::make_shared<usb_zero_copy_wrapper_msb>(usb_zc, frame_boundary);
+ _the_only_msb =
+ std::make_shared<usb_zero_copy_wrapper_msb>(usb_zc, frame_boundary);
}
- managed_recv_buffer::sptr get_recv_buff(double timeout){
- //lazy flush mechanism - negative timeout
- if (timeout < 0.0)
- {
+ managed_recv_buffer::sptr get_recv_buff(double timeout)
+ {
+ // lazy flush mechanism - negative timeout
+ if (timeout < 0.0) {
_last_recv_buff.reset();
- while (_internal_zc->get_recv_buff()){}
+ while (_internal_zc->get_recv_buff()) {
+ }
return managed_recv_buffer::sptr();
}
- //attempt to get a managed recv buffer
- if (not _last_recv_buff){
- _last_recv_buff = _internal_zc->get_recv_buff(timeout);
- _last_recv_offset = 0; //reset offset into buffer
+ // attempt to get a managed recv buffer
+ if (not _last_recv_buff) {
+ _last_recv_buff = _internal_zc->get_recv_buff(timeout);
+ _last_recv_offset = 0; // reset offset into buffer
}
- //get the buffer to be returned to the user
- if (_next_recv_buff_index == _mrb_pool.size()) _next_recv_buff_index = 0;
+ // get the buffer to be returned to the user
+ if (_next_recv_buff_index == _mrb_pool.size())
+ _next_recv_buff_index = 0;
return _mrb_pool[_next_recv_buff_index]->get_new(
- _last_recv_buff, _last_recv_offset, timeout, _next_recv_buff_index
- );
+ _last_recv_buff, _last_recv_offset, timeout, _next_recv_buff_index);
}
- size_t get_num_recv_frames(void) const{
- return (_internal_zc->get_num_recv_frames()*_internal_zc->get_recv_frame_size())/this->get_recv_frame_size();
+ size_t get_num_recv_frames(void) const
+ {
+ return (_internal_zc->get_num_recv_frames() * _internal_zc->get_recv_frame_size())
+ / this->get_recv_frame_size();
}
- size_t get_recv_frame_size(void) const{
+ size_t get_recv_frame_size(void) const
+ {
return std::min(_frame_boundary, _internal_zc->get_recv_frame_size());
}
- managed_send_buffer::sptr get_send_buff(double timeout){
+ managed_send_buffer::sptr get_send_buff(double timeout)
+ {
return _the_only_msb->get_new(timeout);
}
- size_t get_num_send_frames(void) const{
+ size_t get_num_send_frames(void) const
+ {
return _internal_zc->get_num_send_frames();
}
- size_t get_send_frame_size(void) const{
+ size_t get_send_frame_size(void) const
+ {
return std::min(_frame_boundary, _internal_zc->get_send_frame_size());
}
private:
zero_copy_if::sptr _internal_zc;
size_t _frame_boundary;
- std::vector<std::shared_ptr<usb_zero_copy_wrapper_mrb> > _mrb_pool;
+ std::vector<std::shared_ptr<usb_zero_copy_wrapper_mrb>> _mrb_pool;
std::shared_ptr<usb_zero_copy_wrapper_msb> _the_only_msb;
- //state for last recv buffer to create multiple managed buffers
+ // state for last recv buffer to create multiple managed buffers
managed_recv_buffer::sptr _last_recv_buff;
size_t _last_recv_offset;
size_t _next_recv_buff_index;
@@ -224,7 +250,7 @@ private:
* USB zero copy wrapper factory function
**********************************************************************/
zero_copy_if::sptr usb_zero_copy_make_wrapper(
- zero_copy_if::sptr usb_zc, size_t usb_frame_boundary
-){
+ zero_copy_if::sptr usb_zc, size_t usb_frame_boundary)
+{
return zero_copy_if::sptr(new usb_zero_copy_wrapper(usb_zc, usb_frame_boundary));
}
diff --git a/host/lib/usrp/b200/b200_cores.cpp b/host/lib/usrp/b200/b200_cores.cpp
index 688af2535..3c55d3995 100644
--- a/host/lib/usrp/b200/b200_cores.cpp
+++ b/host/lib/usrp/b200/b200_cores.cpp
@@ -6,23 +6,20 @@
//
#include "b200_cores.hpp"
-#include "b200_regs.hpp"
#include "b200_impl.hpp"
+#include "b200_regs.hpp"
#include <mutex>
-b200_local_spi_core::b200_local_spi_core(
- uhd::wb_iface::sptr iface,
- perif_t default_perif) :
- _spi_core(spi_core_3000::make(iface, TOREG(SR_CORE_SPI), RB32_CORE_SPI)),
- _current_perif(default_perif),
- _last_perif(default_perif)
+b200_local_spi_core::b200_local_spi_core(uhd::wb_iface::sptr iface, perif_t default_perif)
+ : _spi_core(spi_core_3000::make(iface, TOREG(SR_CORE_SPI), RB32_CORE_SPI))
+ , _current_perif(default_perif)
+ , _last_perif(default_perif)
{
change_perif(default_perif);
}
-uint32_t b200_local_spi_core::transact_spi(
- int which_slave,
- const uhd::spi_config_t &config,
+uint32_t b200_local_spi_core::transact_spi(int which_slave,
+ const uhd::spi_config_t& config,
uint32_t data,
size_t num_bits,
bool readback)
@@ -34,15 +31,15 @@ uint32_t b200_local_spi_core::transact_spi(
void b200_local_spi_core::change_perif(perif_t perif)
{
std::lock_guard<std::mutex> lock(_mutex);
- _last_perif = _current_perif;
+ _last_perif = _current_perif;
_current_perif = perif;
switch (_current_perif) {
case CODEC:
- _spi_core->set_divider(B200_BUS_CLOCK_RATE/AD9361_SPI_RATE);
+ _spi_core->set_divider(B200_BUS_CLOCK_RATE / AD9361_SPI_RATE);
break;
case PLL:
- _spi_core->set_divider(B200_BUS_CLOCK_RATE/ADF4001_SPI_RATE);
+ _spi_core->set_divider(B200_BUS_CLOCK_RATE / ADF4001_SPI_RATE);
break;
}
}
@@ -52,9 +49,8 @@ void b200_local_spi_core::restore_perif()
change_perif(_last_perif);
}
-b200_ref_pll_ctrl::b200_ref_pll_ctrl(b200_local_spi_core::sptr spi) :
- uhd::usrp::adf4001_ctrl(spi, ADF4001_SLAVENO),
- _spi(spi)
+b200_ref_pll_ctrl::b200_ref_pll_ctrl(b200_local_spi_core::sptr spi)
+ : uhd::usrp::adf4001_ctrl(spi, ADF4001_SLAVENO), _spi(spi)
{
}
@@ -71,4 +67,3 @@ b200_local_spi_core::sptr b200_local_spi_core::make(
{
return sptr(new b200_local_spi_core(iface, default_perif));
}
-
diff --git a/host/lib/usrp/b200/b200_cores.hpp b/host/lib/usrp/b200/b200_cores.hpp
index 324938a73..7054fd068 100644
--- a/host/lib/usrp/b200/b200_cores.hpp
+++ b/host/lib/usrp/b200/b200_cores.hpp
@@ -10,25 +10,22 @@
#define INCLUDED_B200_CORES_HPP
#include <uhd/utils/noncopyable.hpp>
-#include <uhdlib/usrp/cores/spi_core_3000.hpp>
#include <uhdlib/usrp/common/adf4001_ctrl.hpp>
+#include <uhdlib/usrp/cores/spi_core_3000.hpp>
#include <memory>
#include <mutex>
-class b200_local_spi_core : uhd::noncopyable, public uhd::spi_iface {
-
+class b200_local_spi_core : uhd::noncopyable, public uhd::spi_iface
+{
public:
typedef std::shared_ptr<b200_local_spi_core> sptr;
- enum perif_t {
- CODEC, PLL
- };
+ enum perif_t { CODEC, PLL };
b200_local_spi_core(uhd::wb_iface::sptr iface, perif_t default_perif);
- virtual uint32_t transact_spi(
- int which_slave,
- const uhd::spi_config_t &config,
+ virtual uint32_t transact_spi(int which_slave,
+ const uhd::spi_config_t& config,
uint32_t data,
size_t num_bits,
bool readback);
@@ -39,13 +36,14 @@ public:
static sptr make(uhd::wb_iface::sptr iface, perif_t default_perif = CODEC);
private:
- spi_core_3000::sptr _spi_core;
- perif_t _current_perif;
- perif_t _last_perif;
- std::mutex _mutex;
+ spi_core_3000::sptr _spi_core;
+ perif_t _current_perif;
+ perif_t _last_perif;
+ std::mutex _mutex;
};
-class b200_ref_pll_ctrl : public uhd::usrp::adf4001_ctrl {
+class b200_ref_pll_ctrl : public uhd::usrp::adf4001_ctrl
+{
public:
typedef std::shared_ptr<b200_ref_pll_ctrl> sptr;
diff --git a/host/lib/usrp/b200/b200_iface.cpp b/host/lib/usrp/b200/b200_iface.cpp
index c2bd9bace..2efc9efb5 100644
--- a/host/lib/usrp/b200/b200_iface.cpp
+++ b/host/lib/usrp/b200/b200_iface.cpp
@@ -27,8 +27,7 @@
//! libusb_error_name is only in newer API
#ifndef HAVE_LIBUSB_ERROR_NAME
- #define libusb_error_name(code) \
- str(boost::format("LIBUSB_ERROR_CODE %d") % code)
+# define libusb_error_name(code) str(boost::format("LIBUSB_ERROR_CODE %d") % code)
#endif
using namespace uhd;
@@ -41,34 +40,32 @@ const static uint8_t FX3_FIRMWARE_LOAD = 0xA0;
// 32 KB - 256 bytes for EEPROM storage
constexpr size_t BOOTLOADER_MAX_SIZE = 32512;
-const static uint8_t VRT_VENDOR_OUT = (LIBUSB_REQUEST_TYPE_VENDOR
- | LIBUSB_ENDPOINT_OUT);
-const static uint8_t VRT_VENDOR_IN = (LIBUSB_REQUEST_TYPE_VENDOR
- | LIBUSB_ENDPOINT_IN);
-const static uint8_t B200_VREQ_FPGA_START = 0x02;
-const static uint8_t B200_VREQ_FPGA_DATA = 0x12;
-const static uint8_t B200_VREQ_GET_COMPAT = 0x15;
+const static uint8_t VRT_VENDOR_OUT = (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT);
+const static uint8_t VRT_VENDOR_IN = (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN);
+const static uint8_t B200_VREQ_FPGA_START = 0x02;
+const static uint8_t B200_VREQ_FPGA_DATA = 0x12;
+const static uint8_t B200_VREQ_GET_COMPAT = 0x15;
const static uint8_t B200_VREQ_SET_FPGA_HASH = 0x1C;
const static uint8_t B200_VREQ_GET_FPGA_HASH = 0x1D;
-const static uint8_t B200_VREQ_SET_FW_HASH = 0x1E;
-const static uint8_t B200_VREQ_GET_FW_HASH = 0x1F;
-const static uint8_t B200_VREQ_LOOP = 0x22;
-const static uint8_t B200_VREQ_FPGA_CONFIG = 0x55;
-//const static uint8_t B200_VREQ_FPGA_RESET = 0x62;
-const static uint8_t B200_VREQ_GPIF_RESET = 0x72;
-const static uint8_t B200_VREQ_GET_USB = 0x80;
-const static uint8_t B200_VREQ_GET_STATUS = 0x83;
-const static uint8_t B200_VREQ_FX3_RESET = 0x99;
+const static uint8_t B200_VREQ_SET_FW_HASH = 0x1E;
+const static uint8_t B200_VREQ_GET_FW_HASH = 0x1F;
+const static uint8_t B200_VREQ_LOOP = 0x22;
+const static uint8_t B200_VREQ_FPGA_CONFIG = 0x55;
+// const static uint8_t B200_VREQ_FPGA_RESET = 0x62;
+const static uint8_t B200_VREQ_GPIF_RESET = 0x72;
+const static uint8_t B200_VREQ_GET_USB = 0x80;
+const static uint8_t B200_VREQ_GET_STATUS = 0x83;
+const static uint8_t B200_VREQ_FX3_RESET = 0x99;
const static uint8_t B200_VREQ_EEPROM_WRITE = 0xBA;
-const static uint8_t B200_VREQ_EEPROM_READ = 0xBB;
+const static uint8_t B200_VREQ_EEPROM_READ = 0xBB;
-const static uint8_t FX3_STATE_UNDEFINED = 0x00;
-const static uint8_t FX3_STATE_FPGA_READY = 0x01;
+const static uint8_t FX3_STATE_UNDEFINED = 0x00;
+const static uint8_t FX3_STATE_FPGA_READY = 0x01;
const static uint8_t FX3_STATE_CONFIGURING_FPGA = 0x02;
-const static uint8_t FX3_STATE_BUSY = 0x03;
-const static uint8_t FX3_STATE_RUNNING = 0x04;
-const static uint8_t FX3_STATE_UNCONFIGURED = 0x05;
-const static uint8_t FX3_STATE_ERROR = 0x06;
+const static uint8_t FX3_STATE_BUSY = 0x03;
+const static uint8_t FX3_STATE_RUNNING = 0x04;
+const static uint8_t FX3_STATE_UNCONFIGURED = 0x05;
+const static uint8_t FX3_STATE_ERROR = 0x06;
const static int VREQ_MAX_SIZE_USB2 = 64;
const static int VREQ_MAX_SIZE_USB3 = 512;
@@ -87,13 +84,13 @@ typedef uint32_t hash_type;
* \param filename file used to generate hash value
* \return hash value in a uint32_t type
*/
-static hash_type generate_hash(const char *filename)
+static hash_type generate_hash(const char* filename)
{
if (filename == NULL)
return hash_type(0);
std::ifstream file(filename);
- if (not file){
+ if (not file) {
throw uhd::io_error(std::string("cannot open input file ") + filename);
}
@@ -103,16 +100,16 @@ static hash_type generate_hash(const char *filename)
long long count = 0;
while (file.get(ch)) {
count++;
- //hash algorithm derived from boost hash_combine
- //http://www.boost.org/doc/libs/1_35_0/doc/html/boost/hash_combine_id241013.html
- hash ^= ch + 0x9e3779b9 + (hash<<6) + (hash>>2);
+ // hash algorithm derived from boost hash_combine
+ // http://www.boost.org/doc/libs/1_35_0/doc/html/boost/hash_combine_id241013.html
+ hash ^= ch + 0x9e3779b9 + (hash << 6) + (hash >> 2);
}
- if (count == 0){
+ if (count == 0) {
throw uhd::io_error(std::string("empty input file ") + filename);
}
- if (not file.eof()){
+ if (not file.eof()) {
throw uhd::io_error(std::string("file error ") + filename);
}
@@ -124,45 +121,47 @@ static hash_type generate_hash(const char *filename)
/***********************************************************************
* The implementation class
**********************************************************************/
-class b200_iface_impl : public b200_iface{
+class b200_iface_impl : public b200_iface
+{
public:
-
- b200_iface_impl(usb_control::sptr usb_ctrl):
- _usb_ctrl(usb_ctrl) {
- //NOP
+ b200_iface_impl(usb_control::sptr usb_ctrl) : _usb_ctrl(usb_ctrl)
+ {
+ // NOP
}
int fx3_control_write(uint8_t request,
- uint16_t value,
- uint16_t index,
- unsigned char *buff,
- uint16_t length,
- uint32_t timeout = 0) {
- return _usb_ctrl->submit(VRT_VENDOR_OUT, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length, // wLength
- timeout); // timeout
+ uint16_t value,
+ uint16_t index,
+ unsigned char* buff,
+ uint16_t length,
+ uint32_t timeout = 0)
+ {
+ return _usb_ctrl->submit(VRT_VENDOR_OUT, // bmReqeustType
+ request, // bRequest
+ value, // wValue
+ index, // wIndex
+ buff, // data
+ length, // wLength
+ timeout); // timeout
}
int fx3_control_read(uint8_t request,
- uint16_t value,
- uint16_t index,
- unsigned char *buff,
- uint16_t length,
- uint32_t timeout = 0) {
- return _usb_ctrl->submit(VRT_VENDOR_IN, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length, // wLength
- timeout); // timeout
+ uint16_t value,
+ uint16_t index,
+ unsigned char* buff,
+ uint16_t length,
+ uint32_t timeout = 0)
+ {
+ return _usb_ctrl->submit(VRT_VENDOR_IN, // bmReqeustType
+ request, // bRequest
+ value, // wValue
+ index, // wIndex
+ buff, // data
+ length, // wLength
+ timeout); // timeout
}
- void write_i2c(UHD_UNUSED(uint16_t addr), UHD_UNUSED(const byte_vector_t &bytes))
+ void write_i2c(UHD_UNUSED(uint16_t addr), UHD_UNUSED(const byte_vector_t& bytes))
{
throw uhd::not_implemented_error("b200 write i2c");
}
@@ -173,33 +172,43 @@ public:
throw uhd::not_implemented_error("b200 read i2c");
}
- void write_eeprom(uint16_t addr, uint16_t offset,
- const byte_vector_t &bytes) {
+ void write_eeprom(uint16_t addr, uint16_t offset, const byte_vector_t& bytes)
+ {
int ret = fx3_control_write(B200_VREQ_EEPROM_WRITE,
- 0, offset | (uint16_t(addr) << 8),
- (unsigned char *) &bytes[0],
- bytes.size());
+ 0,
+ offset | (uint16_t(addr) << 8),
+ (unsigned char*)&bytes[0],
+ bytes.size());
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to write EEPROM (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to write EEPROM (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if ((size_t)ret != bytes.size())
- throw uhd::io_error((boost::format("Short write on write EEPROM (expecting: %d, returned: %d)") % bytes.size() % ret).str());
+ throw uhd::io_error((
+ boost::format("Short write on write EEPROM (expecting: %d, returned: %d)")
+ % bytes.size() % ret)
+ .str());
}
- byte_vector_t read_eeprom(
- uint16_t addr,
- uint16_t offset,
- size_t num_bytes) {
+ byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes)
+ {
byte_vector_t recv_bytes(num_bytes);
int bytes_read = fx3_control_read(B200_VREQ_EEPROM_READ,
- 0, offset | (uint16_t(addr) << 8),
- (unsigned char*) &recv_bytes[0],
- num_bytes);
+ 0,
+ offset | (uint16_t(addr) << 8),
+ (unsigned char*)&recv_bytes[0],
+ num_bytes);
if (bytes_read < 0)
- throw uhd::io_error((boost::format("Failed to read EEPROM (%d: %s)") % bytes_read % libusb_error_name(bytes_read)).str());
+ throw uhd::io_error((boost::format("Failed to read EEPROM (%d: %s)")
+ % bytes_read % libusb_error_name(bytes_read))
+ .str());
else if ((size_t)bytes_read != num_bytes)
- throw uhd::io_error((boost::format("Short read on read EEPROM (expecting: %d, returned: %d)") % num_bytes % bytes_read).str());
+ throw uhd::io_error(
+ (boost::format("Short read on read EEPROM (expecting: %d, returned: %d)")
+ % num_bytes % bytes_read)
+ .str());
return recv_bytes;
}
@@ -207,25 +216,27 @@ public:
void load_firmware(const std::string filestring, UHD_UNUSED(bool force) = false)
{
if (load_img_msg) {
- UHD_LOGGER_INFO("B200") << "Loading firmware image: "
- << filestring << "...";
+ UHD_LOGGER_INFO("B200") << "Loading firmware image: " << filestring << "...";
}
ihex_reader file_reader(filestring);
try {
- file_reader.read(
- std::bind(
- &b200_iface_impl::fx3_control_write, this,
- FX3_FIRMWARE_LOAD, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, 0
- )
- );
- } catch (const uhd::io_error &e) {
- throw uhd::io_error(str(boost::format("Could not load firmware: \n%s") % e.what()));
+ file_reader.read(std::bind(&b200_iface_impl::fx3_control_write,
+ this,
+ FX3_FIRMWARE_LOAD,
+ std::placeholders::_1,
+ std::placeholders::_2,
+ std::placeholders::_3,
+ std::placeholders::_4,
+ 0));
+ } catch (const uhd::io_error& e) {
+ throw uhd::io_error(
+ str(boost::format("Could not load firmware: \n%s") % e.what()));
}
- //TODO
- //usrp_set_firmware_hash(hash); //set hash before reset
+ // TODO
+ // usrp_set_firmware_hash(hash); //set hash before reset
/* Success! Let the system settle. */
// TODO: Replace this with a polling loop in the FX3, or find out
@@ -233,33 +244,47 @@ public:
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
- void reset_fx3(void) {
+ void reset_fx3(void)
+ {
unsigned char data[4];
memset(data, 0x00, sizeof(data));
const int bytes_to_send = sizeof(data);
int ret = fx3_control_write(B200_VREQ_FX3_RESET, 0x00, 0x00, data, bytes_to_send);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to reset FX3 (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to reset FX3 (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_send)
- throw uhd::io_error((boost::format("Short write on reset FX3 (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
+ throw uhd::io_error(
+ (boost::format("Short write on reset FX3 (expecting: %d, returned: %d)")
+ % bytes_to_send % ret)
+ .str());
}
- void reset_gpif(void) {
+ void reset_gpif(void)
+ {
unsigned char data[4];
memset(data, 0x00, sizeof(data));
const int bytes_to_send = sizeof(data);
- int ret = fx3_control_write(B200_VREQ_GPIF_RESET, 0x00, 0x00, data, bytes_to_send);
+ int ret =
+ fx3_control_write(B200_VREQ_GPIF_RESET, 0x00, 0x00, data, bytes_to_send);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to reset GPIF (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to reset GPIF (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_send)
- throw uhd::io_error((boost::format("Short write on reset GPIF (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
+ throw uhd::io_error(
+ (boost::format("Short write on reset GPIF (expecting: %d, returned: %d)")
+ % bytes_to_send % ret)
+ .str());
}
- void set_fpga_reset_pin(const bool reset) {
+ void set_fpga_reset_pin(const bool reset)
+ {
unsigned char data[4];
- memset(data, (reset)? 0xFF : 0x00, sizeof(data));
+ memset(data, (reset) ? 0xFF : 0x00, sizeof(data));
UHD_THROW_INVALID_CODE_PATH();
@@ -268,113 +293,178 @@ public:
/*
const int bytes_to_send = sizeof(data);
- int ret = fx3_control_write(B200_VREQ_FPGA_RESET, 0x00, 0x00, data, bytes_to_send);
- if (ret < 0)
- throw uhd::io_error((boost::format("Failed to reset FPGA (%d: %s)") % ret % libusb_error_name(ret)).str());
- else if (ret != bytes_to_send)
- throw uhd::io_error((boost::format("Short write on reset FPGA (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
+ int ret = fx3_control_write(B200_VREQ_FPGA_RESET, 0x00, 0x00, data,
+ bytes_to_send); if (ret < 0) throw uhd::io_error((boost::format("Failed to reset
+ FPGA (%d: %s)") % ret % libusb_error_name(ret)).str()); else if (ret !=
+ bytes_to_send) throw uhd::io_error((boost::format("Short write on reset FPGA
+ (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
*/
}
- uint8_t get_usb_speed(void) {
-
+ uint8_t get_usb_speed(void)
+ {
unsigned char rx_data[1];
memset(rx_data, 0x00, sizeof(rx_data));
const int bytes_to_recv = sizeof(rx_data);
int ret = fx3_control_read(B200_VREQ_GET_USB, 0x00, 0x00, rx_data, bytes_to_recv);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to get USB speed (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to get USB speed (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_recv)
- throw uhd::io_error((boost::format("Short read on get USB speed (expecting: %d, returned: %d)") % bytes_to_recv % ret).str());
+ throw uhd::io_error((
+ boost::format("Short read on get USB speed (expecting: %d, returned: %d)")
+ % bytes_to_recv % ret)
+ .str());
return boost::lexical_cast<uint8_t>(rx_data[0]);
}
- uint8_t get_fx3_status(void) {
-
+ uint8_t get_fx3_status(void)
+ {
unsigned char rx_data[1];
memset(rx_data, 0x00, sizeof(rx_data));
const int bytes_to_recv = sizeof(rx_data);
- int ret = fx3_control_read(B200_VREQ_GET_STATUS, 0x00, 0x00, rx_data, bytes_to_recv);
+ int ret =
+ fx3_control_read(B200_VREQ_GET_STATUS, 0x00, 0x00, rx_data, bytes_to_recv);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to get FX3 status (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to get FX3 status (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_recv)
- throw uhd::io_error((boost::format("Short read on get FX3 status (expecting: %d, returned: %d)") % bytes_to_recv % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short read on get FX3 status (expecting: %d, returned: %d)")
+ % bytes_to_recv % ret)
+ .str());
return boost::lexical_cast<uint8_t>(rx_data[0]);
}
- uint16_t get_compat_num(void) {
-
+ uint16_t get_compat_num(void)
+ {
unsigned char rx_data[2];
memset(rx_data, 0x00, sizeof(rx_data));
const int bytes_to_recv = sizeof(rx_data);
- int ret = fx3_control_read(B200_VREQ_GET_COMPAT , 0x00, 0x00, rx_data, bytes_to_recv);
+ int ret =
+ fx3_control_read(B200_VREQ_GET_COMPAT, 0x00, 0x00, rx_data, bytes_to_recv);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to get compat num (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to get compat num (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_recv)
- throw uhd::io_error((boost::format("Short read on get compat num (expecting: %d, returned: %d)") % bytes_to_recv % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short read on get compat num (expecting: %d, returned: %d)")
+ % bytes_to_recv % ret)
+ .str());
return (((uint16_t)rx_data[0]) << 8) | rx_data[1];
}
- void usrp_get_firmware_hash(hash_type &hash) {
+ void usrp_get_firmware_hash(hash_type& hash)
+ {
const int bytes_to_recv = 4;
if (sizeof(hash_type) != bytes_to_recv)
- throw uhd::type_error((boost::format("hash_type is %d bytes but transfer length is %d bytes") % sizeof(hash_type) % bytes_to_recv).str());
+ throw uhd::type_error(
+ (boost::format("hash_type is %d bytes but transfer length is %d bytes")
+ % sizeof(hash_type) % bytes_to_recv)
+ .str());
- int ret = fx3_control_read(B200_VREQ_GET_FW_HASH, 0x00, 0x00, (unsigned char*) &hash, bytes_to_recv, 500);
+ int ret = fx3_control_read(
+ B200_VREQ_GET_FW_HASH, 0x00, 0x00, (unsigned char*)&hash, bytes_to_recv, 500);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to get firmware hash (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to get firmware hash (%d: %s)")
+ % ret % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_recv)
- throw uhd::io_error((boost::format("Short read on get firmware hash (expecting: %d, returned: %d)") % bytes_to_recv % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short read on get firmware hash (expecting: %d, returned: %d)")
+ % bytes_to_recv % ret)
+ .str());
}
- void usrp_set_firmware_hash(hash_type hash) {
+ void usrp_set_firmware_hash(hash_type hash)
+ {
const int bytes_to_send = 4;
if (sizeof(hash_type) != bytes_to_send)
- throw uhd::type_error((boost::format("hash_type is %d bytes but transfer length is %d bytes") % sizeof(hash_type) % bytes_to_send).str());
+ throw uhd::type_error(
+ (boost::format("hash_type is %d bytes but transfer length is %d bytes")
+ % sizeof(hash_type) % bytes_to_send)
+ .str());
- int ret = fx3_control_write(B200_VREQ_SET_FW_HASH, 0x00, 0x00, (unsigned char*) &hash, bytes_to_send);
+ int ret = fx3_control_write(
+ B200_VREQ_SET_FW_HASH, 0x00, 0x00, (unsigned char*)&hash, bytes_to_send);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to set firmware hash (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to set firmware hash (%d: %s)")
+ % ret % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_send)
- throw uhd::io_error((boost::format("Short write on set firmware hash (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short write on set firmware hash (expecting: %d, returned: %d)")
+ % bytes_to_send % ret)
+ .str());
}
- void usrp_get_fpga_hash(hash_type &hash) {
+ void usrp_get_fpga_hash(hash_type& hash)
+ {
const int bytes_to_recv = 4;
if (sizeof(hash_type) != bytes_to_recv)
- throw uhd::type_error((boost::format("hash_type is %d bytes but transfer length is %d bytes") % sizeof(hash_type) % bytes_to_recv).str());
+ throw uhd::type_error(
+ (boost::format("hash_type is %d bytes but transfer length is %d bytes")
+ % sizeof(hash_type) % bytes_to_recv)
+ .str());
- int ret = fx3_control_read(B200_VREQ_GET_FPGA_HASH, 0x00, 0x00, (unsigned char*) &hash, bytes_to_recv, 500);
+ int ret = fx3_control_read(B200_VREQ_GET_FPGA_HASH,
+ 0x00,
+ 0x00,
+ (unsigned char*)&hash,
+ bytes_to_recv,
+ 500);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to get FPGA hash (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to get FPGA hash (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_recv)
- throw uhd::io_error((boost::format("Short read on get FPGA hash (expecting: %d, returned: %d)") % bytes_to_recv % ret).str());
+ throw uhd::io_error((
+ boost::format("Short read on get FPGA hash (expecting: %d, returned: %d)")
+ % bytes_to_recv % ret)
+ .str());
}
- void usrp_set_fpga_hash(hash_type hash) {
+ void usrp_set_fpga_hash(hash_type hash)
+ {
const int bytes_to_send = 4;
if (sizeof(hash_type) != bytes_to_send)
- throw uhd::type_error((boost::format("hash_type is %d bytes but transfer length is %d bytes") % sizeof(hash_type) % bytes_to_send).str());
+ throw uhd::type_error(
+ (boost::format("hash_type is %d bytes but transfer length is %d bytes")
+ % sizeof(hash_type) % bytes_to_send)
+ .str());
- int ret = fx3_control_write(B200_VREQ_SET_FPGA_HASH, 0x00, 0x00, (unsigned char*) &hash, bytes_to_send);
+ int ret = fx3_control_write(
+ B200_VREQ_SET_FPGA_HASH, 0x00, 0x00, (unsigned char*)&hash, bytes_to_send);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to set FPGA hash (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to set FPGA hash (%d: %s)") % ret
+ % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_send)
- throw uhd::io_error((boost::format("Short write on set FPGA hash (expecting: %d, returned: %d)") % bytes_to_send % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short write on set FPGA hash (expecting: %d, returned: %d)")
+ % bytes_to_send % ret)
+ .str());
}
- // Establish default largest possible control request transfer size based on operating
+ // Establish default largest possible control request transfer size based on operating
// USB speed
int _get_transfer_size()
{
- switch (get_usb_speed())
- {
+ switch (get_usb_speed()) {
case 2:
return VREQ_DEFAULT_SIZE;
case 3:
@@ -385,25 +475,27 @@ public:
}
}
- size_t _get_file_size(const char * filename)
+ size_t _get_file_size(const char* filename)
{
boost::filesystem::path path(filename);
auto filesize = boost::filesystem::file_size(path);
return static_cast<size_t>(filesize);
}
- uint32_t load_fpga(const std::string filestring, bool force) {
-
+ uint32_t load_fpga(const std::string filestring, bool force)
+ {
uint8_t fx3_state = 0;
uint32_t wait_count;
- int ret = 0;
+ int ret = 0;
int bytes_to_xfer = 0;
- const char *filename = filestring.c_str();
+ const char* filename = filestring.c_str();
hash_type hash = generate_hash(filename);
- hash_type loaded_hash; usrp_get_fpga_hash(loaded_hash);
- if (hash == loaded_hash and !force) return 0;
+ hash_type loaded_hash;
+ usrp_get_fpga_hash(loaded_hash);
+ if (hash == loaded_hash and !force)
+ return 0;
const int transfer_size = _get_transfer_size();
@@ -411,12 +503,21 @@ public:
unsigned char out_buff[VREQ_MAX_SIZE];
- // Request loopback read, which will indicate the firmware's current control request buffer size
+ // Request loopback read, which will indicate the firmware's current control
+ // request buffer size
int nread = fx3_control_read(B200_VREQ_LOOP, 0, 0, out_buff, transfer_size, 1000);
if (nread < 0)
- throw uhd::io_error((boost::format("load_fpga: unable to complete firmware loopback request (%d: %s)") % nread % libusb_error_name(nread)).str());
+ throw uhd::io_error(
+ (boost::format(
+ "load_fpga: unable to complete firmware loopback request (%d: %s)")
+ % nread % libusb_error_name(nread))
+ .str());
else if (nread != transfer_size)
- throw uhd::io_error((boost::format("load_fpga: short read on firmware loopback request (expecting: %d, returned: %d)") % transfer_size % nread).str());
+ throw uhd::io_error(
+ (boost::format("load_fpga: short read on firmware loopback request "
+ "(expecting: %d, returned: %d)")
+ % transfer_size % nread)
+ .str());
const size_t file_size = _get_file_size(filename);
@@ -427,84 +528,107 @@ public:
throw uhd::io_error("load_fpga: cannot open FPGA input file.");
}
- // Zero the hash, in case we abort programming another image and revert to the previously programmed image
+ // Zero the hash, in case we abort programming another image and revert to the
+ // previously programmed image
usrp_set_fpga_hash(0);
memset(out_buff, 0x00, sizeof(out_buff));
bytes_to_xfer = 1;
- ret = fx3_control_write(B200_VREQ_FPGA_CONFIG, 0, 0, out_buff, bytes_to_xfer, 1000);
+ ret =
+ fx3_control_write(B200_VREQ_FPGA_CONFIG, 0, 0, out_buff, bytes_to_xfer, 1000);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to start FPGA config (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to start FPGA config (%d: %s)")
+ % ret % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_xfer)
- throw uhd::io_error((boost::format("Short write on start FPGA config (expecting: %d, returned: %d)") % bytes_to_xfer % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short write on start FPGA config (expecting: %d, returned: %d)")
+ % bytes_to_xfer % ret)
+ .str());
wait_count = 0;
do {
fx3_state = get_fx3_status();
- if((wait_count >= 500) || (fx3_state == FX3_STATE_ERROR) || (fx3_state == FX3_STATE_UNDEFINED)) {
+ if ((wait_count >= 500) || (fx3_state == FX3_STATE_ERROR)
+ || (fx3_state == FX3_STATE_UNDEFINED)) {
return fx3_state;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
wait_count++;
- } while(fx3_state != FX3_STATE_FPGA_READY);
+ } while (fx3_state != FX3_STATE_FPGA_READY);
if (load_img_msg) {
- UHD_LOGGER_INFO("B200") << "Loading FPGA image: "
- << filestring << "...";
+ UHD_LOGGER_INFO("B200") << "Loading FPGA image: " << filestring << "...";
}
bytes_to_xfer = 1;
- ret = fx3_control_write(B200_VREQ_FPGA_START, 0, 0, out_buff, bytes_to_xfer, 1000);
+ ret =
+ fx3_control_write(B200_VREQ_FPGA_START, 0, 0, out_buff, bytes_to_xfer, 1000);
if (ret < 0)
- throw uhd::io_error((boost::format("Failed to start FPGA bitstream (%d: %s)") % ret % libusb_error_name(ret)).str());
+ throw uhd::io_error((boost::format("Failed to start FPGA bitstream (%d: %s)")
+ % ret % libusb_error_name(ret))
+ .str());
else if (ret != bytes_to_xfer)
- throw uhd::io_error((boost::format("Short write on start FPGA bitstream (expecting: %d, returned: %d)") % bytes_to_xfer % ret).str());
+ throw uhd::io_error(
+ (boost::format(
+ "Short write on start FPGA bitstream (expecting: %d, returned: %d)")
+ % bytes_to_xfer % ret)
+ .str());
wait_count = 0;
do {
fx3_state = get_fx3_status();
- if((wait_count >= 1000) || (fx3_state == FX3_STATE_ERROR) || (fx3_state == FX3_STATE_UNDEFINED)) {
+ if ((wait_count >= 1000) || (fx3_state == FX3_STATE_ERROR)
+ || (fx3_state == FX3_STATE_UNDEFINED)) {
return fx3_state;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
wait_count++;
- } while(fx3_state != FX3_STATE_CONFIGURING_FPGA);
+ } while (fx3_state != FX3_STATE_CONFIGURING_FPGA);
size_t bytes_sent = 0;
while (!file.eof()) {
- file.read((char *) out_buff, transfer_size);
+ file.read((char*)out_buff, transfer_size);
const std::streamsize n = file.gcount();
- if(n == 0)
+ if (n == 0)
continue;
uint16_t transfer_count = uint16_t(n);
/* Send the data to the device. */
- int nwritten = fx3_control_write(B200_VREQ_FPGA_DATA, 0, 0, out_buff, transfer_count, 5000);
+ int nwritten = fx3_control_write(
+ B200_VREQ_FPGA_DATA, 0, 0, out_buff, transfer_count, 5000);
if (nwritten < 0)
- throw uhd::io_error((boost::format("load_fpga: cannot write bitstream to FX3 (%d: %s)") % nwritten % libusb_error_name(nwritten)).str());
+ throw uhd::io_error(
+ (boost::format("load_fpga: cannot write bitstream to FX3 (%d: %s)")
+ % nwritten % libusb_error_name(nwritten))
+ .str());
else if (nwritten != transfer_count)
- throw uhd::io_error((boost::format("load_fpga: short write while transferring bitstream to FX3 (expecting: %d, returned: %d)") % transfer_count % nwritten).str());
+ throw uhd::io_error(
+ (boost::format("load_fpga: short write while transferring bitstream "
+ "to FX3 (expecting: %d, returned: %d)")
+ % transfer_count % nwritten)
+ .str());
const size_t LOG_GRANULARITY = 10; // %. Keep this an integer divisor of 100.
- if (load_img_msg)
- {
- if (bytes_sent == 0) UHD_LOGGER_DEBUG("B200") << "FPGA load: 0%" << std::flush;
+ if (load_img_msg) {
+ if (bytes_sent == 0)
+ UHD_LOGGER_DEBUG("B200") << "FPGA load: 0%" << std::flush;
const size_t percent_before =
- size_t((bytes_sent*100)/file_size) -
- (size_t((bytes_sent*100)/file_size) % LOG_GRANULARITY);
+ size_t((bytes_sent * 100) / file_size)
+ - (size_t((bytes_sent * 100) / file_size) % LOG_GRANULARITY);
bytes_sent += transfer_count;
const size_t percent_after =
- size_t((bytes_sent*100)/file_size) -
- (size_t((bytes_sent*100)/file_size) % LOG_GRANULARITY);
- if (percent_before != percent_after)
- {
+ size_t((bytes_sent * 100) / file_size)
+ - (size_t((bytes_sent * 100) / file_size) % LOG_GRANULARITY);
+ if (percent_before != percent_after) {
UHD_LOGGER_DEBUG("B200")
<< "FPGA load: " << std::setw(3) << percent_after << "%";
}
@@ -517,14 +641,15 @@ public:
do {
fx3_state = get_fx3_status();
- if((wait_count >= 500) || (fx3_state == FX3_STATE_ERROR) || (fx3_state == FX3_STATE_UNDEFINED)) {
+ if ((wait_count >= 500) || (fx3_state == FX3_STATE_ERROR)
+ || (fx3_state == FX3_STATE_UNDEFINED)) {
return fx3_state;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
wait_count++;
- } while(fx3_state != FX3_STATE_RUNNING);
+ } while (fx3_state != FX3_STATE_RUNNING);
usrp_set_fpga_hash(hash);
@@ -598,8 +723,12 @@ public:
uint16_t transfer_count = uint16_t(n);
// Send the data to the device
- int nwritten = fx3_control_write(
- B200_VREQ_EEPROM_WRITE, 0, bytes_sent, out_buff.data(), transfer_count, 5000);
+ int nwritten = fx3_control_write(B200_VREQ_EEPROM_WRITE,
+ 0,
+ bytes_sent,
+ out_buff.data(),
+ transfer_count,
+ 5000);
if (nwritten < 0) {
throw uhd::io_error(
(boost::format(
@@ -627,7 +756,8 @@ public:
size_t((bytes_sent * 100) / file_size)
- (size_t((bytes_sent * 100) / file_size) % LOG_GRANULARITY);
if (percent_before != percent_after) {
- UHD_LOGGER_DEBUG("B200") << "Bootloader load: " << std::setw(3) << percent_after << "%";
+ UHD_LOGGER_DEBUG("B200")
+ << "Bootloader load: " << std::setw(3) << percent_after << "%";
}
}
@@ -654,22 +784,21 @@ private:
std::string b200_iface::fx3_state_string(uint8_t state)
{
- switch (state)
- {
- case FX3_STATE_FPGA_READY:
- return std::string("Ready");
- case FX3_STATE_CONFIGURING_FPGA:
- return std::string("Configuring FPGA");
- case FX3_STATE_BUSY:
- return std::string("Busy");
- case FX3_STATE_RUNNING:
- return std::string("Running");
- case FX3_STATE_UNCONFIGURED:
- return std::string("Unconfigured");
- case FX3_STATE_ERROR:
- return std::string("Error");
- default:
- break;
+ switch (state) {
+ case FX3_STATE_FPGA_READY:
+ return std::string("Ready");
+ case FX3_STATE_CONFIGURING_FPGA:
+ return std::string("Configuring FPGA");
+ case FX3_STATE_BUSY:
+ return std::string("Busy");
+ case FX3_STATE_RUNNING:
+ return std::string("Running");
+ case FX3_STATE_UNCONFIGURED:
+ return std::string("Unconfigured");
+ case FX3_STATE_ERROR:
+ return std::string("Error");
+ default:
+ break;
}
return std::string("Unknown");
}
diff --git a/host/lib/usrp/b200/b200_iface.hpp b/host/lib/usrp/b200/b200_iface.hpp
index a3059bacf..7d7e169d4 100644
--- a/host/lib/usrp/b200/b200_iface.hpp
+++ b/host/lib/usrp/b200/b200_iface.hpp
@@ -9,75 +9,54 @@
#define INCLUDED_B200_IFACE_HPP
#include <uhd/transport/usb_control.hpp>
-#include <uhd/types/serial.hpp> //i2c iface
#include <uhd/types/dict.hpp>
+#include <uhd/types/serial.hpp> //i2c iface
+#include <uhd/utils/noncopyable.hpp>
#include <uhdlib/usrp/common/ad9361_ctrl.hpp>
+#include <stdint.h>
#include <boost/assign/list_of.hpp>
#include <memory>
-#include <uhd/utils/noncopyable.hpp>
-#include <stdint.h>
-enum b200_product_t {
- B200,
- B210,
- B200MINI,
- B205MINI
-};
+enum b200_product_t { B200, B210, B200MINI, B205MINI };
// These are actual USB PIDs (not Ettus Product IDs)
-const static uint16_t B200_VENDOR_ID = 0x2500;
-const static uint16_t B200_VENDOR_NI_ID = 0x3923;
-const static uint16_t B200_PRODUCT_ID = 0x0020;
-const static uint16_t B200MINI_PRODUCT_ID = 0x0021;
-const static uint16_t B205MINI_PRODUCT_ID = 0x0022;
-const static uint16_t B200_PRODUCT_NI_ID = 0x7813;
-const static uint16_t B210_PRODUCT_NI_ID = 0x7814;
-const static uint16_t FX3_VID = 0x04b4;
-const static uint16_t FX3_DEFAULT_PID = 0x00f3;
-const static uint16_t FX3_REENUM_PID = 0x00f0;
+const static uint16_t B200_VENDOR_ID = 0x2500;
+const static uint16_t B200_VENDOR_NI_ID = 0x3923;
+const static uint16_t B200_PRODUCT_ID = 0x0020;
+const static uint16_t B200MINI_PRODUCT_ID = 0x0021;
+const static uint16_t B205MINI_PRODUCT_ID = 0x0022;
+const static uint16_t B200_PRODUCT_NI_ID = 0x7813;
+const static uint16_t B210_PRODUCT_NI_ID = 0x7814;
+const static uint16_t FX3_VID = 0x04b4;
+const static uint16_t FX3_DEFAULT_PID = 0x00f3;
+const static uint16_t FX3_REENUM_PID = 0x00f0;
//! Map the USB PID to the product (only for PIDs that map to a single product)
-static const uhd::dict<uint16_t, b200_product_t> B2XX_PID_TO_PRODUCT = boost::assign::map_list_of
- (B200_PRODUCT_NI_ID, B200)
- (B210_PRODUCT_NI_ID, B210)
- (B200MINI_PRODUCT_ID, B200MINI)
- (B205MINI_PRODUCT_ID, B205MINI)
-;
+static const uhd::dict<uint16_t, b200_product_t> B2XX_PID_TO_PRODUCT =
+ boost::assign::map_list_of(B200_PRODUCT_NI_ID, B200)(B210_PRODUCT_NI_ID, B210)(
+ B200MINI_PRODUCT_ID, B200MINI)(B205MINI_PRODUCT_ID, B205MINI);
-static const std::string B200_FW_FILE_NAME = "usrp_b200_fw.hex";
-static const std::string B200_BL_FILE_NAME = "usrp_b200_bl.img";
+static const std::string B200_FW_FILE_NAME = "usrp_b200_fw.hex";
+static const std::string B200_BL_FILE_NAME = "usrp_b200_bl.img";
//! Map the EEPROM product ID codes to the product
-static const uhd::dict<uint16_t, b200_product_t> B2XX_PRODUCT_ID = boost::assign::map_list_of
- (0x0001, B200)
- (0x7737, B200)
- (B200_PRODUCT_NI_ID, B200)
- (0x0002, B210)
- (0x7738, B210)
- (B210_PRODUCT_NI_ID, B210)
- (0x0003, B200MINI)
- (0x7739, B200MINI)
- (0x0004, B205MINI)
- (0x773a, B205MINI)
-;
-
-
-static const uhd::dict<b200_product_t, std::string> B2XX_STR_NAMES = boost::assign::map_list_of
- (B200, "B200")
- (B210, "B210")
- (B200MINI, "B200mini")
- (B205MINI, "B205mini")
-;
-
-static const uhd::dict<b200_product_t, std::string> B2XX_FPGA_FILE_NAME = boost::assign::map_list_of
- (B200, "usrp_b200_fpga.bin")
- (B210, "usrp_b210_fpga.bin")
- (B200MINI, "usrp_b200mini_fpga.bin")
- (B205MINI, "usrp_b205mini_fpga.bin")
-;
-
-
-class UHD_API b200_iface: uhd::noncopyable, public virtual uhd::i2c_iface {
+static const uhd::dict<uint16_t, b200_product_t> B2XX_PRODUCT_ID =
+ boost::assign::map_list_of(0x0001, B200)(0x7737, B200)(B200_PRODUCT_NI_ID, B200)(
+ 0x0002, B210)(0x7738, B210)(B210_PRODUCT_NI_ID, B210)(0x0003, B200MINI)(
+ 0x7739, B200MINI)(0x0004, B205MINI)(0x773a, B205MINI);
+
+
+static const uhd::dict<b200_product_t, std::string> B2XX_STR_NAMES =
+ boost::assign::map_list_of(B200, "B200")(B210, "B210")(B200MINI, "B200mini")(
+ B205MINI, "B205mini");
+
+static const uhd::dict<b200_product_t, std::string> B2XX_FPGA_FILE_NAME =
+ boost::assign::map_list_of(B200, "usrp_b200_fpga.bin")(B210, "usrp_b210_fpga.bin")(
+ B200MINI, "usrp_b200mini_fpga.bin")(B205MINI, "usrp_b205mini_fpga.bin");
+
+
+class UHD_API b200_iface : uhd::noncopyable, public virtual uhd::i2c_iface
+{
public:
typedef std::shared_ptr<b200_iface> sptr;
@@ -98,7 +77,7 @@ public:
virtual uint16_t get_compat_num(void) = 0;
//! load a firmware image
- virtual void load_firmware(const std::string filestring, bool force=false) = 0;
+ virtual void load_firmware(const std::string filestring, bool force = false) = 0;
//! reset the FX3
virtual void reset_fx3(void) = 0;
@@ -110,14 +89,16 @@ public:
virtual void set_fpga_reset_pin(const bool reset) = 0;
//! load an FPGA image
- virtual uint32_t load_fpga(const std::string filestring, bool force=false) = 0;
+ virtual uint32_t load_fpga(const std::string filestring, bool force = false) = 0;
//! load a bootloader image onto device EEPROM
virtual uint32_t load_bootloader(const std::string filestring) = 0;
- virtual void write_eeprom(uint16_t addr, uint16_t offset, const uhd::byte_vector_t &bytes) = 0;
+ virtual void write_eeprom(
+ uint16_t addr, uint16_t offset, const uhd::byte_vector_t& bytes) = 0;
- virtual uhd::byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes) = 0;
+ virtual uhd::byte_vector_t read_eeprom(
+ uint16_t addr, uint16_t offset, size_t num_bytes) = 0;
static std::string fx3_state_string(uint8_t state);
};
diff --git a/host/lib/usrp/b200/b200_image_loader.cpp b/host/lib/usrp/b200/b200_image_loader.cpp
index cf61ecb88..25bf7ce2f 100644
--- a/host/lib/usrp/b200/b200_image_loader.cpp
+++ b/host/lib/usrp/b200/b200_image_loader.cpp
@@ -5,77 +5,80 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <boost/assign.hpp>
-#include <boost/lexical_cast.hpp>
-
+#include "b200_iface.hpp"
+#include "b200_impl.hpp"
#include <uhd/exception.hpp>
#include <uhd/image_loader.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/utils/paths.hpp>
#include <uhd/utils/static.hpp>
-
-#include "b200_iface.hpp"
-#include "b200_impl.hpp"
+#include <boost/assign.hpp>
+#include <boost/lexical_cast.hpp>
using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-namespace uhd{
-
-static b200_iface::sptr get_b200_iface(const image_loader::image_loader_args_t& image_loader_args,
- mboard_eeprom_t &mb_eeprom, usb_device_handle::sptr& handle,
- bool user_specified){
+namespace uhd {
- std::vector<usb_device_handle::sptr> dev_handles = get_b200_device_handles(image_loader_args.args);
+static b200_iface::sptr get_b200_iface(
+ const image_loader::image_loader_args_t& image_loader_args,
+ mboard_eeprom_t& mb_eeprom,
+ usb_device_handle::sptr& handle,
+ bool user_specified)
+{
+ std::vector<usb_device_handle::sptr> dev_handles =
+ get_b200_device_handles(image_loader_args.args);
std::vector<usb_device_handle::sptr> applicable_dev_handles;
b200_iface::sptr iface;
mboard_eeprom_t eeprom; // Internal use
- if(dev_handles.size() > 0){
- for(usb_device_handle::sptr dev_handle: dev_handles){
- if(dev_handle->firmware_loaded()){
- iface = b200_iface::make(usb_control::make(dev_handle, 0));
+ if (dev_handles.size() > 0) {
+ for (usb_device_handle::sptr dev_handle : dev_handles) {
+ if (dev_handle->firmware_loaded()) {
+ iface = b200_iface::make(usb_control::make(dev_handle, 0));
eeprom = b200_impl::get_mb_eeprom(iface);
- if(user_specified){
- if(image_loader_args.args.has_key("serial") and
- eeprom.get("serial") != image_loader_args.args.get("serial")){
- continue;
+ if (user_specified) {
+ if (image_loader_args.args.has_key("serial")
+ and eeprom.get("serial")
+ != image_loader_args.args.get("serial")) {
+ continue;
}
- if(image_loader_args.args.has_key("name") and
- eeprom.get("name") != image_loader_args.args.get("name")){
- continue;
+ if (image_loader_args.args.has_key("name")
+ and eeprom.get("name") != image_loader_args.args.get("name")) {
+ continue;
}
applicable_dev_handles.push_back(dev_handle);
- }
- else applicable_dev_handles.push_back(dev_handle);
+ } else
+ applicable_dev_handles.push_back(dev_handle);
}
}
// At this point, we should have a single B2XX
- if(applicable_dev_handles.size() == 1){
+ if (applicable_dev_handles.size() == 1) {
mb_eeprom = eeprom;
- handle = applicable_dev_handles[0];
+ handle = applicable_dev_handles[0];
return iface;
- }
- else if(applicable_dev_handles.size() > 1){
- std::string err_msg = "Could not resolve given args to a single B2XX device.\n"
- "Applicable devices:\n";
+ } else if (applicable_dev_handles.size() > 1) {
+ std::string err_msg =
+ "Could not resolve given args to a single B2XX device.\n"
+ "Applicable devices:\n";
- for (usb_device_handle::sptr dev_handle: applicable_dev_handles) {
+ for (usb_device_handle::sptr dev_handle : applicable_dev_handles) {
eeprom = b200_impl::get_mb_eeprom(
- b200_iface::make(usb_control::make(dev_handle, 0))
- );
- err_msg += str(boost::format(" * %s (serial=%s)\n")
- % B2XX_STR_NAMES.get(get_b200_product(dev_handle, mb_eeprom), "B2XX")
- % mb_eeprom.get("serial"));
+ b200_iface::make(usb_control::make(dev_handle, 0)));
+ err_msg += str(
+ boost::format(" * %s (serial=%s)\n")
+ % B2XX_STR_NAMES.get(get_b200_product(dev_handle, mb_eeprom), "B2XX")
+ % mb_eeprom.get("serial"));
}
- err_msg += "\nSpecify one of these devices with the given args to load an image onto it.";
+ err_msg += "\nSpecify one of these devices with the given args to load an "
+ "image onto it.";
throw uhd::runtime_error(err_msg);
- }
+ }
}
// No applicable devices found, return empty sptr so we can exit
@@ -84,45 +87,48 @@ static b200_iface::sptr get_b200_iface(const image_loader::image_loader_args_t&
return iface;
}
-static bool b200_image_loader(const image_loader::image_loader_args_t &image_loader_args){
- if(!image_loader_args.load_fpga)
+static bool b200_image_loader(const image_loader::image_loader_args_t& image_loader_args)
+{
+ if (!image_loader_args.load_fpga)
return false;
- bool user_specified = (image_loader_args.args.has_key("serial") or
- image_loader_args.args.has_key("name"));
+ bool user_specified = (image_loader_args.args.has_key("serial")
+ or image_loader_args.args.has_key("name"));
// See if a B2x0 with the given args is found
mboard_eeprom_t mb_eeprom;
usb_device_handle::sptr handle;
- b200_iface::sptr iface = get_b200_iface(image_loader_args, mb_eeprom, handle, user_specified);
- if(!iface) return false; // No initialized B2x0 found
+ b200_iface::sptr iface =
+ get_b200_iface(image_loader_args, mb_eeprom, handle, user_specified);
+ if (!iface)
+ return false; // No initialized B2x0 found
std::string fpga_path;
- if(image_loader_args.fpga_path == ""){
+ if (image_loader_args.fpga_path == "") {
/*
* Normally, we can auto-generate the FPGA filename from what's in the EEPROM,
* but if the applicable value is not in the EEPROM, the user must give a specific
* filename for us to use.
*/
std::string product = mb_eeprom.get("product");
- if(not B2XX_PRODUCT_ID.has_key(boost::lexical_cast<uint16_t>(product))){
- if(user_specified){
+ if (not B2XX_PRODUCT_ID.has_key(boost::lexical_cast<uint16_t>(product))) {
+ if (user_specified) {
// The user specified a bad device but expects us to know what it is
- throw uhd::runtime_error("Could not determine model. You must manually specify an FPGA image filename.");
- }
- else{
+ throw uhd::runtime_error("Could not determine model. You must manually "
+ "specify an FPGA image filename.");
+ } else {
return false;
}
+ } else {
+ fpga_path = find_image_path(
+ B2XX_FPGA_FILE_NAME.get(get_b200_product(handle, mb_eeprom)));
}
- else{
- fpga_path = find_image_path(B2XX_FPGA_FILE_NAME.get(get_b200_product(handle, mb_eeprom)));
- }
- }
- else fpga_path = image_loader_args.fpga_path;
+ } else
+ fpga_path = image_loader_args.fpga_path;
std::cout << boost::format("Unit: USRP %s (%s)")
- % B2XX_STR_NAMES.get(get_b200_product(handle, mb_eeprom), "B2XX")
- % mb_eeprom.get("serial")
+ % B2XX_STR_NAMES.get(get_b200_product(handle, mb_eeprom), "B2XX")
+ % mb_eeprom.get("serial")
<< std::endl;
iface->load_fpga(fpga_path, true);
@@ -130,10 +136,12 @@ static bool b200_image_loader(const image_loader::image_loader_args_t &image_loa
return true;
}
-UHD_STATIC_BLOCK(register_b200_image_loader){
- std::string recovery_instructions = "This device is likely in an unusable state. Power-cycle the\n"
- "device, and the firmware/FPGA will be reloaded the next time\n"
- "UHD uses the device.";
+UHD_STATIC_BLOCK(register_b200_image_loader)
+{
+ std::string recovery_instructions =
+ "This device is likely in an unusable state. Power-cycle the\n"
+ "device, and the firmware/FPGA will be reloaded the next time\n"
+ "UHD uses the device.";
image_loader::register_image_loader("b200", b200_image_loader, recovery_instructions);
}
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp
index bf95d8e6b..1da682349 100644
--- a/host/lib/usrp/b200/b200_impl.cpp
+++ b/host/lib/usrp/b200/b200_impl.cpp
@@ -34,60 +34,78 @@ using namespace uhd::usrp::gpio_atr;
using namespace uhd::transport;
namespace {
- constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
+constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
}
// B200 + B210:
-class b200_ad9361_client_t : public ad9361_params {
+class b200_ad9361_client_t : public ad9361_params
+{
public:
~b200_ad9361_client_t() {}
- double get_band_edge(frequency_band_t band) {
+ double get_band_edge(frequency_band_t band)
+ {
switch (band) {
- case AD9361_RX_BAND0: return 2.2e9; // Port C
- case AD9361_RX_BAND1: return 4.0e9; // Port B
- case AD9361_TX_BAND0: return 2.5e9; // Port B
- default: return 0;
+ case AD9361_RX_BAND0:
+ return 2.2e9; // Port C
+ case AD9361_RX_BAND1:
+ return 4.0e9; // Port B
+ case AD9361_TX_BAND0:
+ return 2.5e9; // Port B
+ default:
+ return 0;
}
}
- clocking_mode_t get_clocking_mode() {
+ clocking_mode_t get_clocking_mode()
+ {
return clocking_mode_t::AD9361_XTAL_N_CLK_PATH;
}
- digital_interface_mode_t get_digital_interface_mode() {
+ digital_interface_mode_t get_digital_interface_mode()
+ {
return AD9361_DDR_FDD_LVCMOS;
}
- digital_interface_delays_t get_digital_interface_timing() {
+ digital_interface_delays_t get_digital_interface_timing()
+ {
digital_interface_delays_t delays;
- delays.rx_clk_delay = 0;
+ delays.rx_clk_delay = 0;
delays.rx_data_delay = 0xF;
- delays.tx_clk_delay = 0;
+ delays.tx_clk_delay = 0;
delays.tx_data_delay = 0xF;
return delays;
}
};
// B205
-class b2xxmini_ad9361_client_t : public ad9361_params {
+class b2xxmini_ad9361_client_t : public ad9361_params
+{
public:
~b2xxmini_ad9361_client_t() {}
- double get_band_edge(frequency_band_t band) {
+ double get_band_edge(frequency_band_t band)
+ {
switch (band) {
- case AD9361_RX_BAND0: return 0; // Set these all to
- case AD9361_RX_BAND1: return 0; // zero, so RF port A
- case AD9361_TX_BAND0: return 0; // is used all the time
- default: return 0; // On both Rx and Tx
+ case AD9361_RX_BAND0:
+ return 0; // Set these all to
+ case AD9361_RX_BAND1:
+ return 0; // zero, so RF port A
+ case AD9361_TX_BAND0:
+ return 0; // is used all the time
+ default:
+ return 0; // On both Rx and Tx
}
}
- clocking_mode_t get_clocking_mode() {
+ clocking_mode_t get_clocking_mode()
+ {
return clocking_mode_t::AD9361_XTAL_N_CLK_PATH;
}
- digital_interface_mode_t get_digital_interface_mode() {
+ digital_interface_mode_t get_digital_interface_mode()
+ {
return AD9361_DDR_FDD_LVCMOS;
}
- digital_interface_delays_t get_digital_interface_timing() {
+ digital_interface_delays_t get_digital_interface_timing()
+ {
digital_interface_delays_t delays;
- delays.rx_clk_delay = 0;
+ delays.rx_clk_delay = 0;
delays.rx_data_delay = 0xF;
- delays.tx_clk_delay = 0;
+ delays.tx_clk_delay = 0;
delays.tx_data_delay = 0xF;
return delays;
}
@@ -96,16 +114,14 @@ public:
/***********************************************************************
* Helpers
**********************************************************************/
-std::string check_option_valid(
- const std::string &name,
- const std::vector<std::string> &valid_options,
- const std::string &option
-) {
- if (std::find(valid_options.begin(), valid_options.end(), option) == valid_options.end()) {
- throw uhd::runtime_error(str(
- boost::format("Invalid option chosen for: %s")
- % name
- ));
+std::string check_option_valid(const std::string& name,
+ const std::vector<std::string>& valid_options,
+ const std::string& option)
+{
+ if (std::find(valid_options.begin(), valid_options.end(), option)
+ == valid_options.end()) {
+ throw uhd::runtime_error(
+ str(boost::format("Invalid option chosen for: %s") % name));
}
return option;
@@ -117,7 +133,8 @@ std::string check_option_valid(
//! Look up the type of B-Series device we're currently running.
// Throws a uhd::runtime_error if the USB PID and the product ID stored
// in the MB EEPROM are invalid,
-b200_product_t get_b200_product(const usb_device_handle::sptr& handle, const mboard_eeprom_t &mb_eeprom)
+b200_product_t get_b200_product(
+ const usb_device_handle::sptr& handle, const mboard_eeprom_t& mb_eeprom)
{
// Try USB PID first
uint16_t product_id = handle->get_product_id();
@@ -130,40 +147,42 @@ b200_product_t get_b200_product(const usb_device_handle::sptr& handle, const mbo
}
product_id = boost::lexical_cast<uint16_t>(mb_eeprom["product"]);
if (not B2XX_PRODUCT_ID.has_key(product_id)) {
- throw uhd::runtime_error(str(
- boost::format("B200 unknown product code: 0x%04x")
- % product_id
- ));
+ throw uhd::runtime_error(
+ str(boost::format("B200 unknown product code: 0x%04x") % product_id));
}
return B2XX_PRODUCT_ID[product_id];
}
-std::vector<usb_device_handle::sptr> get_b200_device_handles(const device_addr_t &hint)
+std::vector<usb_device_handle::sptr> get_b200_device_handles(const device_addr_t& hint)
{
std::vector<usb_device_handle::vid_pid_pair_t> vid_pid_pair_list;
- if(hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type") && hint["type"] == "b200") {
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(uhd::cast::hexstr_cast<uint16_t>(hint.get("vid")),
- uhd::cast::hexstr_cast<uint16_t>(hint.get("pid"))));
+ if (hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type")
+ && hint["type"] == "b200") {
+ vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(
+ uhd::cast::hexstr_cast<uint16_t>(hint.get("vid")),
+ uhd::cast::hexstr_cast<uint16_t>(hint.get("pid"))));
} else {
vid_pid_pair_list = b200_vid_pid_pairs;
}
- //find the usrps and load firmware
+ // find the usrps and load firmware
return usb_device_handle::get_device_list(vid_pid_pair_list);
}
-static device_addrs_t b200_find(const device_addr_t &hint)
+static device_addrs_t b200_find(const device_addr_t& hint)
{
device_addrs_t b200_addrs;
- //return an empty list of addresses when type is set to non-b200
- if (hint.has_key("type") and hint["type"] != "b200") return b200_addrs;
+ // return an empty list of addresses when type is set to non-b200
+ if (hint.has_key("type") and hint["type"] != "b200")
+ return b200_addrs;
- //Return an empty list of addresses when an address or resource is specified,
- //since an address and resource is intended for a different, non-USB, device.
- for(device_addr_t hint_i: separate_device_addr(hint)) {
- if (hint_i.has_key("addr") || hint_i.has_key("resource")) return b200_addrs;
+ // Return an empty list of addresses when an address or resource is specified,
+ // since an address and resource is intended for a different, non-USB, device.
+ for (device_addr_t hint_i : separate_device_addr(hint)) {
+ if (hint_i.has_key("addr") || hint_i.has_key("resource"))
+ return b200_addrs;
}
// Important note:
@@ -172,64 +191,66 @@ static device_addrs_t b200_find(const device_addr_t &hint)
// so that re-enumeration after fw load can occur successfully.
// This requirement is a courtesy of libusb1.0 on windows.
size_t found = 0;
- for(usb_device_handle::sptr handle: get_b200_device_handles(hint)) {
- //extract the firmware path for the b200
+ for (usb_device_handle::sptr handle : get_b200_device_handles(hint)) {
+ // extract the firmware path for the b200
std::string b200_fw_image;
- try{
+ try {
b200_fw_image = hint.get("fw", B200_FW_FILE_NAME);
- b200_fw_image = uhd::find_image_path(b200_fw_image, STR(UHD_IMAGES_DIR)); // FIXME
- }
- catch(uhd::exception &e){
+ b200_fw_image =
+ uhd::find_image_path(b200_fw_image, STR(UHD_IMAGES_DIR)); // FIXME
+ } catch (uhd::exception& e) {
UHD_LOGGER_WARNING("B200") << e.what();
return b200_addrs;
}
- UHD_LOGGER_DEBUG("B200") << "the firmware image: " << b200_fw_image ;
+ UHD_LOGGER_DEBUG("B200") << "the firmware image: " << b200_fw_image;
usb_control::sptr control;
- try{control = usb_control::make(handle, 0);}
- catch(const uhd::exception &){continue;} //ignore claimed
+ try {
+ control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue;
+ } // ignore claimed
- //check if fw was already loaded
- if (!(handle->firmware_loaded()))
- {
+ // check if fw was already loaded
+ if (!(handle->firmware_loaded())) {
b200_iface::make(control)->load_firmware(b200_fw_image);
}
found++;
}
- const auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
- //search for the device until found or timeout
- while (std::chrono::steady_clock::now() < timeout_time
- and b200_addrs.empty()
- and found != 0) {
- for(usb_device_handle::sptr handle: get_b200_device_handles(hint)) {
+ const auto timeout_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
+ // search for the device until found or timeout
+ while (std::chrono::steady_clock::now() < timeout_time and b200_addrs.empty()
+ and found != 0) {
+ for (usb_device_handle::sptr handle : get_b200_device_handles(hint)) {
usb_control::sptr control;
- try{control = usb_control::make(handle, 0);}
- catch(const uhd::exception &){continue;} //ignore claimed
+ try {
+ control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue;
+ } // ignore claimed
- b200_iface::sptr iface = b200_iface::make(control);
+ b200_iface::sptr iface = b200_iface::make(control);
const mboard_eeprom_t mb_eeprom = b200_impl::get_mb_eeprom(iface);
device_addr_t new_addr;
- new_addr["type"] = "b200";
- new_addr["name"] = mb_eeprom["name"];
+ new_addr["type"] = "b200";
+ new_addr["name"] = mb_eeprom["name"];
new_addr["serial"] = handle->get_serial();
try {
// Turn the 16-Bit product ID into a string representation
new_addr["product"] = B2XX_STR_NAMES[get_b200_product(handle, mb_eeprom)];
- } catch (const uhd::runtime_error &) {
+ } catch (const uhd::runtime_error&) {
// No problem if this fails -- this is just device discovery, after all.
new_addr["product"] = "B2??";
}
- //this is a found b200 when the hint serial and name match or blank
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
- ){
+ // this is a found b200 when the hint serial and name match or blank
+ if ((not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial")
+ or hint["serial"] == new_addr["serial"])) {
b200_addrs.push_back(new_addr);
}
}
@@ -241,7 +262,7 @@ static device_addrs_t b200_find(const device_addr_t &hint)
/***********************************************************************
* Make
**********************************************************************/
-static device::sptr b200_make(const device_addr_t &device_addr)
+static device::sptr b200_make(const device_addr_t& device_addr)
{
uhd::transport::usb_device_handle::sptr handle;
@@ -250,14 +271,14 @@ static device::sptr b200_make(const device_addr_t &device_addr)
// a third time is pointless.
try {
return device::sptr(new b200_impl(device_addr, handle));
- }
- catch (const uhd::usb_error &) {
- UHD_LOGGER_INFO("B200") << "Detected bad USB state; resetting." ;
+ } catch (const uhd::usb_error&) {
+ UHD_LOGGER_INFO("B200") << "Detected bad USB state; resetting.";
libusb::device_handle::sptr dev_handle(libusb::device_handle::get_cached_handle(
- std::static_pointer_cast<libusb::special_handle>(handle)->get_device()
- ));
- dev_handle->clear_endpoints(B200_USB_CTRL_RECV_ENDPOINT, B200_USB_CTRL_SEND_ENDPOINT);
- dev_handle->clear_endpoints(B200_USB_DATA_RECV_ENDPOINT, B200_USB_DATA_SEND_ENDPOINT);
+ std::static_pointer_cast<libusb::special_handle>(handle)->get_device()));
+ dev_handle->clear_endpoints(
+ B200_USB_CTRL_RECV_ENDPOINT, B200_USB_CTRL_SEND_ENDPOINT);
+ dev_handle->clear_endpoints(
+ B200_USB_DATA_RECV_ENDPOINT, B200_USB_DATA_SEND_ENDPOINT);
dev_handle->reset_device();
}
@@ -272,84 +293,96 @@ UHD_STATIC_BLOCK(register_b200_device)
/***********************************************************************
* Structors
**********************************************************************/
-b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::sptr &handle) :
- _product(B200), // Some safe value
- _revision(0),
- _enable_user_regs(device_addr.has_key("enable_user_regs")),
- _time_source(UNKNOWN),
- _tick_rate(0.0) // Forces a clock initialization at startup
+b200_impl::b200_impl(
+ const uhd::device_addr_t& device_addr, usb_device_handle::sptr& handle)
+ : _product(B200)
+ , // Some safe value
+ _revision(0)
+ , _enable_user_regs(device_addr.has_key("enable_user_regs"))
+ , _time_source(UNKNOWN)
+ , _tick_rate(0.0) // Forces a clock initialization at startup
{
- _tree = property_tree::make();
- _type = device::USRP;
+ _tree = property_tree::make();
+ _type = device::USRP;
const fs_path mb_path = "/mboards/0";
- //try to match the given device address with something on the USB bus
- uint16_t vid = B200_VENDOR_ID;
- uint16_t pid = B200_PRODUCT_ID;
+ // try to match the given device address with something on the USB bus
+ uint16_t vid = B200_VENDOR_ID;
+ uint16_t pid = B200_PRODUCT_ID;
bool specified_vid = false;
bool specified_pid = false;
- if (device_addr.has_key("vid"))
- {
- vid = uhd::cast::hexstr_cast<uint16_t>(device_addr.get("vid"));
+ if (device_addr.has_key("vid")) {
+ vid = uhd::cast::hexstr_cast<uint16_t>(device_addr.get("vid"));
specified_vid = true;
}
- if (device_addr.has_key("pid"))
- {
- pid = uhd::cast::hexstr_cast<uint16_t>(device_addr.get("pid"));
+ if (device_addr.has_key("pid")) {
+ pid = uhd::cast::hexstr_cast<uint16_t>(device_addr.get("pid"));
specified_pid = true;
}
- std::vector<usb_device_handle::vid_pid_pair_t> vid_pid_pair_list;//search list for devices.
+ std::vector<usb_device_handle::vid_pid_pair_t>
+ vid_pid_pair_list; // search list for devices.
// Search only for specified VID and PID if both specified
- if (specified_vid && specified_pid)
- {
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid,pid));
+ if (specified_vid && specified_pid) {
+ vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, pid));
}
// Search for all supported PIDs limited to specified VID if only VID specified
- else if (specified_vid)
- {
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, B200_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, B200MINI_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, B205MINI_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, B200_PRODUCT_NI_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(vid, B210_PRODUCT_NI_ID));
+ else if (specified_vid) {
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(vid, B200_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(vid, B200MINI_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(vid, B205MINI_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(vid, B200_PRODUCT_NI_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(vid, B210_PRODUCT_NI_ID));
}
// Search for all supported VIDs limited to specified PID if only PID specified
- else if (specified_pid)
- {
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID,pid));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID,pid));
+ else if (specified_pid) {
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, pid));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, pid));
}
// Search for all supported devices if neither VID nor PID specified
- else
- {
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200MINI_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B205MINI_PRODUCT_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B200_PRODUCT_NI_ID));
- vid_pid_pair_list.push_back(usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID));
+ else {
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200MINI_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B205MINI_PRODUCT_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B200_PRODUCT_NI_ID));
+ vid_pid_pair_list.push_back(
+ usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID));
}
- std::vector<usb_device_handle::sptr> device_list = usb_device_handle::get_device_list(vid_pid_pair_list);
+ std::vector<usb_device_handle::sptr> device_list =
+ usb_device_handle::get_device_list(vid_pid_pair_list);
- //locate the matching handle in the device list
- for(usb_device_handle::sptr dev_handle: device_list) {
+ // locate the matching handle in the device list
+ for (usb_device_handle::sptr dev_handle : device_list) {
try {
- if (dev_handle->get_serial() == device_addr["serial"]){
+ if (dev_handle->get_serial() == device_addr["serial"]) {
handle = dev_handle;
break;
}
- } catch (const uhd::exception&) { continue; }
+ } catch (const uhd::exception&) {
+ continue;
+ }
}
- UHD_ASSERT_THROW(handle.get() != NULL); //better be found
+ UHD_ASSERT_THROW(handle.get() != NULL); // better be found
- //create control objects
+ // create control objects
usb_control::sptr control = usb_control::make(handle, 0);
- _iface = b200_iface::make(control);
- this->check_fw_compat(); //check after making
+ _iface = b200_iface::make(control);
+ this->check_fw_compat(); // check after making
////////////////////////////////////////////////////////////////////
// setup the mboard eeprom
@@ -357,7 +390,8 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
const mboard_eeprom_t mb_eeprom = get_mb_eeprom(_iface);
_tree->create<mboard_eeprom_t>(mb_path / "eeprom")
.set(mb_eeprom)
- .add_coerced_subscriber(std::bind(&b200_impl::set_mb_eeprom, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::set_mb_eeprom, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// Identify the device type
@@ -366,10 +400,10 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
std::string product_name;
try {
// This will throw if the product ID is invalid:
- _product = get_b200_product(handle, mb_eeprom);
+ _product = get_b200_product(handle, mb_eeprom);
default_file_name = B2XX_FPGA_FILE_NAME.get(_product);
product_name = B2XX_STR_NAMES.get(_product);
- } catch (const uhd::runtime_error &e) {
+ } catch (const uhd::runtime_error& e) {
// The only reason we may let this pass is if the user specified
// the FPGA file name:
if (not device_addr.has_key("fpga")) {
@@ -382,9 +416,9 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
_revision = boost::lexical_cast<size_t>(mb_eeprom["revision"]);
}
- UHD_LOGGER_INFO("B200") << "Detected Device: " << B2XX_STR_NAMES[_product] ;
+ UHD_LOGGER_INFO("B200") << "Detected Device: " << B2XX_STR_NAMES[_product];
- _gpsdo_capable = (not (_product == B200MINI or _product == B205MINI));
+ _gpsdo_capable = (not(_product == B200MINI or _product == B205MINI));
////////////////////////////////////////////////////////////////////
// Set up frontend mapping
@@ -399,27 +433,27 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
// does not have an FE2, so we don't swap FEs.
// Swapped setup:
- _fe1 = 1;
- _fe2 = 0;
+ _fe1 = 1;
+ _fe2 = 0;
_gpio_state.swap_atr = 1;
// Unswapped setup:
- if (_product == B200MINI or _product == B205MINI or (_product == B200 and _revision >= 5)) {
- _fe1 = 0; //map radio0 to FE1
- _fe2 = 1; //map radio1 to FE2
+ if (_product == B200MINI or _product == B205MINI
+ or (_product == B200 and _revision >= 5)) {
+ _fe1 = 0; // map radio0 to FE1
+ _fe2 = 1; // map radio1 to FE2
_gpio_state.swap_atr = 0; // ATRs for radio0 are mapped to FE1
}
////////////////////////////////////////////////////////////////////
// Load the FPGA image, then reset GPIF
////////////////////////////////////////////////////////////////////
- //extract the FPGA path for the B200
+ // extract the FPGA path for the B200
std::string b200_fpga_image = find_image_path(
- device_addr.has_key("fpga")? device_addr["fpga"] : default_file_name
- );
+ device_addr.has_key("fpga") ? device_addr["fpga"] : default_file_name);
uint32_t status = _iface->load_fpga(b200_fpga_image);
- if(status != 0) {
+ if (status != 0) {
throw uhd::runtime_error(str(boost::format("fx3 is in state %1%") % status));
}
@@ -429,7 +463,7 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
// Create control transport
////////////////////////////////////////////////////////////////////
uint8_t usb_speed = _iface->get_usb_speed();
- UHD_LOGGER_INFO("B200") << "Operating over USB " << (int) usb_speed << "." ;
+ UHD_LOGGER_INFO("B200") << "Operating over USB " << (int)usb_speed << ".";
const std::string min_frame_size = (usb_speed == 3) ? "1024" : "512";
device_addr_t ctrl_xport_args;
@@ -439,32 +473,38 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
ctrl_xport_args["num_send_frames"] = "16";
// This may throw a uhd::usb_error, which will be caught by b200_make().
- _ctrl_transport = usb_zero_copy::make(
- handle,
- B200_USB_CTRL_RECV_INTERFACE, B200_USB_CTRL_RECV_ENDPOINT, //interface, endpoint
- B200_USB_CTRL_SEND_INTERFACE, B200_USB_CTRL_SEND_ENDPOINT, //interface, endpoint
- ctrl_xport_args
- );
- while (_ctrl_transport->get_recv_buff(0.0)){} //flush ctrl xport
- _tree->create<double>(mb_path / "link_max_rate").set((usb_speed == 3) ? B200_MAX_RATE_USB3 : B200_MAX_RATE_USB2);
+ _ctrl_transport = usb_zero_copy::make(handle,
+ B200_USB_CTRL_RECV_INTERFACE,
+ B200_USB_CTRL_RECV_ENDPOINT, // interface, endpoint
+ B200_USB_CTRL_SEND_INTERFACE,
+ B200_USB_CTRL_SEND_ENDPOINT, // interface, endpoint
+ ctrl_xport_args);
+ while (_ctrl_transport->get_recv_buff(0.0)) {
+ } // flush ctrl xport
+ _tree->create<double>(mb_path / "link_max_rate")
+ .set((usb_speed == 3) ? B200_MAX_RATE_USB3 : B200_MAX_RATE_USB2);
////////////////////////////////////////////////////////////////////
// Async task structure
////////////////////////////////////////////////////////////////////
_async_task_data.reset(new AsyncTaskData());
- _async_task_data->async_md.reset(new async_md_type(1000/*messages deep*/));
- if (_gpsdo_capable)
- {
- _async_task_data->gpsdo_uart = b200_uart::make(_ctrl_transport, B200_TX_GPS_UART_SID);
+ _async_task_data->async_md.reset(new async_md_type(1000 /*messages deep*/));
+ if (_gpsdo_capable) {
+ _async_task_data->gpsdo_uart =
+ b200_uart::make(_ctrl_transport, B200_TX_GPS_UART_SID);
}
- _async_task = uhd::msg_task::make(std::bind(&b200_impl::handle_async_task, this, _ctrl_transport, _async_task_data));
+ _async_task = uhd::msg_task::make(std::bind(
+ &b200_impl::handle_async_task, this, _ctrl_transport, _async_task_data));
////////////////////////////////////////////////////////////////////
// Local control endpoint
////////////////////////////////////////////////////////////////////
- _local_ctrl = radio_ctrl_core_3000::make(false/*lilE*/, _ctrl_transport, zero_copy_if::sptr()/*null*/, B200_LOCAL_CTRL_SID);
+ _local_ctrl = radio_ctrl_core_3000::make(false /*lilE*/,
+ _ctrl_transport,
+ zero_copy_if::sptr() /*null*/,
+ B200_LOCAL_CTRL_SID);
_local_ctrl->hold_task(_async_task);
- _async_task_data->local_ctrl = _local_ctrl; //weak
+ _async_task_data->local_ctrl = _local_ctrl; // weak
this->check_fpga_compat();
/* Initialize the GPIOs, set the default bandsels to the lower range. Note
@@ -475,30 +515,21 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
////////////////////////////////////////////////////////////////////
// Create the GPSDO control
////////////////////////////////////////////////////////////////////
- if (_gpsdo_capable)
- {
-
- if ((_local_ctrl->peek32(RB32_CORE_STATUS) & 0xff) != B200_GPSDO_ST_NONE)
- {
+ if (_gpsdo_capable) {
+ if ((_local_ctrl->peek32(RB32_CORE_STATUS) & 0xff) != B200_GPSDO_ST_NONE) {
UHD_LOGGER_INFO("B200") << "Detecting internal GPSDO.... " << std::flush;
- try
- {
+ try {
_gps = gps_ctrl::make(_async_task_data->gpsdo_uart);
+ } catch (std::exception& e) {
+ UHD_LOGGER_ERROR("B200")
+ << "An error occurred making GPSDO control: " << e.what();
}
- catch(std::exception &e)
- {
- UHD_LOGGER_ERROR("B200") << "An error occurred making GPSDO control: " << e.what();
- }
- if (_gps and _gps->gps_detected())
- {
- for(const std::string &name: _gps->get_sensors())
- {
+ if (_gps and _gps->gps_detected()) {
+ for (const std::string& name : _gps->get_sensors()) {
_tree->create<sensor_value_t>(mb_path / "sensors" / name)
.set_publisher(std::bind(&gps_ctrl::get_sensor, _gps, name));
}
- }
- else
- {
+ } else {
_local_ctrl->poke32(TOREG(SR_CORE_GPSDO_ST), B200_GPSDO_ST_NONE);
}
}
@@ -509,7 +540,8 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
////////////////////////////////////////////////////////////////////
_tree->create<std::string>("/name").set("B-Series Device");
_tree->create<std::string>(mb_path / "name").set(product_name);
- _tree->create<std::string>(mb_path / "codename").set((_product == B200MINI or _product == B205MINI) ? "Pixie" : "Sasquatch");
+ _tree->create<std::string>(mb_path / "codename")
+ .set((_product == B200MINI or _product == B205MINI) ? "Pixie" : "Sasquatch");
////////////////////////////////////////////////////////////////////
// Create data transport
@@ -519,22 +551,18 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
////////////////////////////////////////////////////////////////////
device_addr_t data_xport_args;
const int max_transfer = usb_speed == 3 ? 1024 : 512;
- int recv_frame_size = device_addr.cast<int>(
- "recv_frame_size",
- B200_USB_DATA_DEFAULT_FRAME_SIZE
- );
+ int recv_frame_size =
+ device_addr.cast<int>("recv_frame_size", B200_USB_DATA_DEFAULT_FRAME_SIZE);
// Check that recv_frame_size limits.
if (recv_frame_size < B200_USB_DATA_MIN_RECV_FRAME_SIZE) {
- UHD_LOGGER_WARNING("B200")
- << "Requested recv_frame_size of " << recv_frame_size
- << " is too small. It will be set to "
- << B200_USB_DATA_MIN_RECV_FRAME_SIZE << ".";
+ UHD_LOGGER_WARNING("B200") << "Requested recv_frame_size of " << recv_frame_size
+ << " is too small. It will be set to "
+ << B200_USB_DATA_MIN_RECV_FRAME_SIZE << ".";
recv_frame_size = B200_USB_DATA_MIN_RECV_FRAME_SIZE;
} else if (recv_frame_size > B200_USB_DATA_MAX_RECV_FRAME_SIZE) {
- UHD_LOGGER_WARNING("B200")
- << "Requested recv_frame_size of " << recv_frame_size
- << " is too large. It will be set to "
- << B200_USB_DATA_MAX_RECV_FRAME_SIZE << ".";
+ UHD_LOGGER_WARNING("B200") << "Requested recv_frame_size of " << recv_frame_size
+ << " is too large. It will be set to "
+ << B200_USB_DATA_MAX_RECV_FRAME_SIZE << ".";
recv_frame_size = B200_USB_DATA_MAX_RECV_FRAME_SIZE;
} else if (recv_frame_size % max_transfer == 0 or recv_frame_size % 8 != 0) {
// The Cypress FX3 does not properly handle recv_frame_sizes that are
@@ -553,37 +581,39 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
UHD_LOGGER_WARNING("B200")
<< "The recv_frame_size must be a multiple of 8 bytes and not a multiple of "
<< max_transfer << " bytes. Requested recv_frame_size of "
- << device_addr["recv_frame_size"]
- << " coerced to " << recv_frame_size << ".";
+ << device_addr["recv_frame_size"] << " coerced to " << recv_frame_size << ".";
}
data_xport_args["recv_frame_size"] = std::to_string(recv_frame_size);
data_xport_args["num_recv_frames"] = device_addr.get("num_recv_frames", "16");
- data_xport_args["send_frame_size"] = device_addr.get("send_frame_size", std::to_string(B200_USB_DATA_DEFAULT_FRAME_SIZE));
+ data_xport_args["send_frame_size"] = device_addr.get(
+ "send_frame_size", std::to_string(B200_USB_DATA_DEFAULT_FRAME_SIZE));
data_xport_args["num_send_frames"] = device_addr.get("num_send_frames", "16");
// This may throw a uhd::usb_error, which will be caught by b200_make().
- _data_transport = usb_zero_copy::make(
- handle, // identifier
- B200_USB_DATA_RECV_INTERFACE, B200_USB_DATA_RECV_ENDPOINT, //interface, endpoint
- B200_USB_DATA_SEND_INTERFACE, B200_USB_DATA_SEND_ENDPOINT, //interface, endpoint
- data_xport_args // param hints
+ _data_transport = usb_zero_copy::make(handle, // identifier
+ B200_USB_DATA_RECV_INTERFACE,
+ B200_USB_DATA_RECV_ENDPOINT, // interface, endpoint
+ B200_USB_DATA_SEND_INTERFACE,
+ B200_USB_DATA_SEND_ENDPOINT, // interface, endpoint
+ data_xport_args // param hints
);
- while (_data_transport->get_recv_buff(0.0)){} //flush ctrl xport
+ while (_data_transport->get_recv_buff(0.0)) {
+ } // flush ctrl xport
_demux = recv_packet_demuxer_3000::make(_data_transport);
////////////////////////////////////////////////////////////////////
// create time and clock control objects
////////////////////////////////////////////////////////////////////
_spi_iface = b200_local_spi_core::make(_local_ctrl);
- if (not (_product == B200MINI or _product == B205MINI)) {
+ if (not(_product == B200MINI or _product == B205MINI)) {
_adf4001_iface = std::make_shared<b200_ref_pll_ctrl>(_spi_iface);
}
////////////////////////////////////////////////////////////////////
// Init codec - turns on clocks
////////////////////////////////////////////////////////////////////
- UHD_LOGGER_INFO("B200") << "Initialize CODEC control..." ;
+ UHD_LOGGER_INFO("B200") << "Initialize CODEC control...";
reset_codec();
ad9361_params::sptr client_settings;
if (_product == B200MINI or _product == B205MINI) {
@@ -598,13 +628,15 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
////////////////////////////////////////////////////////////////////
{
const fs_path codec_path = mb_path / ("rx_codecs") / "A";
- _tree->create<std::string>(codec_path / "name").set(product_name+" RX dual ADC");
- _tree->create<int>(codec_path / "gains"); //empty cuz gains are in frontend
+ _tree->create<std::string>(codec_path / "name")
+ .set(product_name + " RX dual ADC");
+ _tree->create<int>(codec_path / "gains"); // empty cuz gains are in frontend
}
{
const fs_path codec_path = mb_path / ("tx_codecs") / "A";
- _tree->create<std::string>(codec_path / "name").set(product_name+" TX dual DAC");
- _tree->create<int>(codec_path / "gains"); //empty cuz gains are in frontend
+ _tree->create<std::string>(codec_path / "name")
+ .set(product_name + " TX dual DAC");
+ _tree->create<int>(codec_path / "gains"); // empty cuz gains are in frontend
}
////////////////////////////////////////////////////////////////////
@@ -613,12 +645,11 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
_tree->create<double>(mb_path / "tick_rate")
.set_coercer(std::bind(&b200_impl::set_tick_rate, this, std::placeholders::_1))
.set_publisher(std::bind(&b200_impl::get_tick_rate, this))
- .add_coerced_subscriber(std::bind(&b200_impl::update_tick_rate, this, std::placeholders::_1));
- _tree->create<meta_range_t>(mb_path / "tick_rate/range")
- .set_publisher([this](){
- return this->_codec_ctrl->get_clock_rate_range();
- })
- ;
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_tick_rate, this, std::placeholders::_1));
+ _tree->create<meta_range_t>(mb_path / "tick_rate/range").set_publisher([this]() {
+ return this->_codec_ctrl->get_clock_rate_range();
+ });
_tree->create<time_spec_t>(mb_path / "time" / "cmd");
_tree->create<bool>(mb_path / "auto_tick_rate").set(false);
@@ -631,22 +662,27 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
////////////////////////////////////////////////////////////////////
// create frontend mapping
////////////////////////////////////////////////////////////////////
- std::vector<size_t> default_map(2, 0); default_map[1] = 1; // Set this to A->0 B->1 even if there's only A
- _tree->create<std::vector<size_t> >(mb_path / "rx_chan_dsp_mapping").set(default_map);
- _tree->create<std::vector<size_t> >(mb_path / "tx_chan_dsp_mapping").set(default_map);
+ std::vector<size_t> default_map(2, 0);
+ default_map[1] = 1; // Set this to A->0 B->1 even if there's only A
+ _tree->create<std::vector<size_t>>(mb_path / "rx_chan_dsp_mapping").set(default_map);
+ _tree->create<std::vector<size_t>>(mb_path / "tx_chan_dsp_mapping").set(default_map);
_tree->create<subdev_spec_t>(mb_path / "rx_subdev_spec")
- .set_coercer(std::bind(&b200_impl::coerce_subdev_spec, this, std::placeholders::_1))
+ .set_coercer(
+ std::bind(&b200_impl::coerce_subdev_spec, this, std::placeholders::_1))
.set(subdev_spec_t())
- .add_coerced_subscriber(std::bind(&b200_impl::update_subdev_spec, this, "rx", std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_subdev_spec, this, "rx", std::placeholders::_1));
_tree->create<subdev_spec_t>(mb_path / "tx_subdev_spec")
- .set_coercer(std::bind(&b200_impl::coerce_subdev_spec, this, std::placeholders::_1))
+ .set_coercer(
+ std::bind(&b200_impl::coerce_subdev_spec, this, std::placeholders::_1))
.set(subdev_spec_t())
- .add_coerced_subscriber(std::bind(&b200_impl::update_subdev_spec, this, "tx", std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_subdev_spec, this, "tx", std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// setup radio control
////////////////////////////////////////////////////////////////////
- UHD_LOGGER_INFO("B200") << "Initialize Radio control..." ;
+ UHD_LOGGER_INFO("B200") << "Initialize Radio control...";
const size_t num_radio_chains = ((_local_ctrl->peek32(RB32_CORE_STATUS) >> 8) & 0xff);
UHD_ASSERT_THROW(num_radio_chains > 0);
UHD_ASSERT_THROW(num_radio_chains <= 2);
@@ -656,141 +692,162 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s
for (size_t i = 0; i < _radio_perifs.size(); i++)
this->setup_radio(i);
- //now test each radio module's connection to the codec interface
- for (radio_perifs_t &perif : _radio_perifs) {
+ // now test each radio module's connection to the codec interface
+ for (radio_perifs_t& perif : _radio_perifs) {
_codec_mgr->loopback_self_test(
- [&perif](const uint32_t value){
+ [&perif](const uint32_t value) {
perif.ctrl->poke32(TOREG(SR_CODEC_IDLE), value);
},
- [&perif](){
- return perif.ctrl->peek64(RB64_CODEC_READBACK);
- }
- );
+ [&perif]() { return perif.ctrl->peek64(RB64_CODEC_READBACK); });
}
- //register time now and pps onto available radio cores
+ // register time now and pps onto available radio cores
_tree->create<time_spec_t>(mb_path / "time" / "now")
.set_publisher(std::bind(&time_core_3000::get_time_now, _radio_perifs[0].time64))
- .add_coerced_subscriber(std::bind(&b200_impl::set_time, this, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::set_time, this, std::placeholders::_1))
.set(0.0);
- //re-sync the times when the tick rate changes
+ // re-sync the times when the tick rate changes
_tree->access<double>(mb_path / "tick_rate")
.add_coerced_subscriber(std::bind(&b200_impl::sync_times, this));
_tree->create<time_spec_t>(mb_path / "time" / "pps")
- .set_publisher(std::bind(&time_core_3000::get_time_last_pps, _radio_perifs[0].time64));
- for(radio_perifs_t &perif: _radio_perifs)
- {
+ .set_publisher(
+ std::bind(&time_core_3000::get_time_last_pps, _radio_perifs[0].time64));
+ for (radio_perifs_t& perif : _radio_perifs) {
_tree->access<time_spec_t>(mb_path / "time" / "pps")
- .add_coerced_subscriber(std::bind(&time_core_3000::set_time_next_pps, perif.time64, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &time_core_3000::set_time_next_pps, perif.time64, std::placeholders::_1));
}
- //setup time source props
+ // setup time source props
const std::vector<std::string> time_sources =
- (_gpsdo_capable) ?
- std::vector<std::string>{"none", "internal", "external", "gpsdo"} :
- std::vector<std::string>{"none", "internal", "external"};
- _tree->create<std::vector<std::string> >(mb_path / "time_source" / "options")
+ (_gpsdo_capable)
+ ? std::vector<std::string>{"none", "internal", "external", "gpsdo"}
+ : std::vector<std::string>{"none", "internal", "external"};
+ _tree->create<std::vector<std::string>>(mb_path / "time_source" / "options")
.set(time_sources);
_tree->create<std::string>(mb_path / "time_source" / "value")
- .set_coercer(std::bind(&check_option_valid, "time source", time_sources, std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b200_impl::update_time_source, this, std::placeholders::_1));
- //setup reference source props
+ .set_coercer(std::bind(
+ &check_option_valid, "time source", time_sources, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_time_source, this, std::placeholders::_1));
+ // setup reference source props
const std::vector<std::string> clock_sources =
- (_gpsdo_capable) ?
- std::vector<std::string>{"internal", "external", "gpsdo"} :
- std::vector<std::string>{"internal", "external"};
- _tree->create<std::vector<std::string> >(mb_path / "clock_source" / "options")
+ (_gpsdo_capable) ? std::vector<std::string>{"internal", "external", "gpsdo"}
+ : std::vector<std::string>{"internal", "external"};
+ _tree->create<std::vector<std::string>>(mb_path / "clock_source" / "options")
.set(clock_sources);
_tree->create<std::string>(mb_path / "clock_source" / "value")
- .set_coercer(std::bind(&check_option_valid, "clock source", clock_sources, std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b200_impl::update_clock_source, this, std::placeholders::_1));
+ .set_coercer(std::bind(
+ &check_option_valid, "clock source", clock_sources, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_clock_source, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// front panel gpio
////////////////////////////////////////////////////////////////////
- _radio_perifs[0].fp_gpio = gpio_atr_3000::make(_radio_perifs[0].ctrl, TOREG(SR_FP_GPIO), RB32_FP_GPIO);
- for(const gpio_attr_map_t::value_type attr: gpio_attr_map)
- { switch (attr.first){
- case usrp::gpio_atr::GPIO_SRC:
- _tree->create<std::vector<std::string>>(mb_path / "gpio" / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this](const std::vector<std::string>&){
- throw uhd::runtime_error("This device does not support setting the GPIO_SRC attribute.");
- });
- break;
- case usrp::gpio_atr::GPIO_CTRL:
- case usrp::gpio_atr::GPIO_DDR:
- _tree->create<std::vector<std::string>>(mb_path / "gpio" / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _radio_perifs[0].fp_gpio->set_gpio_attr(attr.first, val);
- });
- break;
- case usrp::gpio_atr::GPIO_READBACK:
- _tree->create<uint32_t>(mb_path / "gpio" / "FP0" / "READBACK")
- .set_publisher(std::bind(&gpio_atr_3000::read_gpio, _radio_perifs[0].fp_gpio));
- break;
- default:
- _tree->create<uint32_t>(mb_path / "gpio" / "FP0" / attr.second)
+ _radio_perifs[0].fp_gpio =
+ gpio_atr_3000::make(_radio_perifs[0].ctrl, TOREG(SR_FP_GPIO), RB32_FP_GPIO);
+ for (const gpio_attr_map_t::value_type attr : gpio_attr_map) {
+ switch (attr.first) {
+ case usrp::gpio_atr::GPIO_SRC:
+ _tree
+ ->create<std::vector<std::string>>(
+ mb_path / "gpio" / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber([this](const std::vector<std::string>&) {
+ throw uhd::runtime_error("This device does not support setting "
+ "the GPIO_SRC attribute.");
+ });
+ break;
+ case usrp::gpio_atr::GPIO_CTRL:
+ case usrp::gpio_atr::GPIO_DDR:
+ _tree
+ ->create<std::vector<std::string>>(
+ mb_path / "gpio" / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber([this, attr](
+ const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _radio_perifs[0].fp_gpio->set_gpio_attr(attr.first, val);
+ });
+ break;
+ case usrp::gpio_atr::GPIO_READBACK:
+ _tree->create<uint32_t>(mb_path / "gpio" / "FP0" / "READBACK")
+ .set_publisher(
+ std::bind(&gpio_atr_3000::read_gpio, _radio_perifs[0].fp_gpio));
+ break;
+ default:
+ _tree->create<uint32_t>(mb_path / "gpio" / "FP0" / attr.second)
.set(0)
- .add_coerced_subscriber(std::bind(&gpio_atr_3000::set_gpio_attr, _radio_perifs[0].fp_gpio, attr.first, std::placeholders::_1));
- }
+ .add_coerced_subscriber(std::bind(&gpio_atr_3000::set_gpio_attr,
+ _radio_perifs[0].fp_gpio,
+ attr.first,
+ std::placeholders::_1));
+ }
}
////////////////////////////////////////////////////////////////////
// dboard eeproms but not really
////////////////////////////////////////////////////////////////////
dboard_eeprom_t db_eeprom;
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "rx_eeprom").set(db_eeprom);
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "tx_eeprom").set(db_eeprom);
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "gdb_eeprom").set(db_eeprom);
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "rx_eeprom")
+ .set(db_eeprom);
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "tx_eeprom")
+ .set(db_eeprom);
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / "A" / "gdb_eeprom")
+ .set(db_eeprom);
////////////////////////////////////////////////////////////////////
// do some post-init tasks
////////////////////////////////////////////////////////////////////
// Init the clock rate and the auto mcr appropriately
if (not device_addr.has_key("master_clock_rate")) {
- UHD_LOGGER_INFO("B200") << "Setting master clock rate selection to 'automatic'." ;
+ UHD_LOGGER_INFO("B200") << "Setting master clock rate selection to 'automatic'.";
}
// We can automatically choose a master clock rate, but not if the user specifies one
- const double default_tick_rate = device_addr.cast<double>("master_clock_rate", ad936x_manager::DEFAULT_TICK_RATE);
+ const double default_tick_rate =
+ device_addr.cast<double>("master_clock_rate", ad936x_manager::DEFAULT_TICK_RATE);
_tree->access<double>(mb_path / "tick_rate").set(default_tick_rate);
- _tree->access<bool>(mb_path / "auto_tick_rate").set(not device_addr.has_key("master_clock_rate"));
+ _tree->access<bool>(mb_path / "auto_tick_rate")
+ .set(not device_addr.has_key("master_clock_rate"));
- //subdev spec contains full width of selections
+ // subdev spec contains full width of selections
subdev_spec_t rx_spec, tx_spec;
- for(const std::string &fe: _tree->list(mb_path / "dboards" / "A" / "rx_frontends"))
- {
+ for (const std::string& fe :
+ _tree->list(mb_path / "dboards" / "A" / "rx_frontends")) {
rx_spec.push_back(subdev_spec_pair_t("A", fe));
}
- for(const std::string &fe: _tree->list(mb_path / "dboards" / "A" / "tx_frontends"))
- {
+ for (const std::string& fe :
+ _tree->list(mb_path / "dboards" / "A" / "tx_frontends")) {
tx_spec.push_back(subdev_spec_pair_t("A", fe));
}
_tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(rx_spec);
_tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(tx_spec);
- //init to internal clock and time source
+ // init to internal clock and time source
_tree->access<std::string>(mb_path / "clock_source/value").set("internal");
_tree->access<std::string>(mb_path / "time_source/value").set("internal");
// Set the DSP chains to some safe value
for (size_t i = 0; i < _radio_perifs.size(); i++) {
- _radio_perifs[i].ddc->set_host_rate(default_tick_rate / ad936x_manager::DEFAULT_DECIM);
- _radio_perifs[i].duc->set_host_rate(default_tick_rate / ad936x_manager::DEFAULT_INTERP);
+ _radio_perifs[i].ddc->set_host_rate(
+ default_tick_rate / ad936x_manager::DEFAULT_DECIM);
+ _radio_perifs[i].duc->set_host_rate(
+ default_tick_rate / ad936x_manager::DEFAULT_INTERP);
}
}
b200_impl::~b200_impl(void)
{
- UHD_SAFE_CALL
- (
- _async_task.reset();
- )
+ UHD_SAFE_CALL(_async_task.reset();)
}
/***********************************************************************
@@ -798,7 +855,7 @@ b200_impl::~b200_impl(void)
**********************************************************************/
void b200_impl::setup_radio(const size_t dspno)
{
- radio_perifs_t &perif = _radio_perifs[dspno];
+ radio_perifs_t& perif = _radio_perifs[dspno];
const fs_path mb_path = "/mboards/0";
////////////////////////////////////////////////////////////////////
@@ -810,16 +867,15 @@ void b200_impl::setup_radio(const size_t dspno)
// radio control
////////////////////////////////////////////////////////////////////
perif.ctrl = radio_ctrl_core_3000::make(
- false/*lilE*/,
- _ctrl_transport,
- zero_copy_if::sptr()/*null*/,
- sid);
+ false /*lilE*/, _ctrl_transport, zero_copy_if::sptr() /*null*/, sid);
perif.ctrl->hold_task(_async_task);
- _async_task_data->radio_ctrl[dspno] = perif.ctrl; //weak
+ _async_task_data->radio_ctrl[dspno] = perif.ctrl; // weak
_tree->access<time_spec_t>(mb_path / "time" / "cmd")
- .add_coerced_subscriber(std::bind(&radio_ctrl_core_3000::set_time, perif.ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &radio_ctrl_core_3000::set_time, perif.ctrl, std::placeholders::_1));
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&radio_ctrl_core_3000::set_tick_rate, perif.ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &radio_ctrl_core_3000::set_tick_rate, perif.ctrl, std::placeholders::_1));
this->register_loopback_self_test(perif.ctrl);
////////////////////////////////////////////////////////////////////
@@ -830,19 +886,17 @@ void b200_impl::setup_radio(const size_t dspno)
// create rx dsp control objects
perif.framer = rx_vita_core_3000::make(perif.ctrl, TOREG(SR_RX_CTRL));
perif.ddc = rx_dsp_core_3000::make(perif.ctrl, TOREG(SR_RX_DSP), true /*is_b200?*/);
- perif.ddc->set_link_rate(10e9/8); //whatever
+ perif.ddc->set_link_rate(10e9 / 8); // whatever
perif.ddc->set_mux(usrp::fe_connection_t(dspno == 1 ? "IbQb" : "IQ"));
perif.ddc->set_freq(rx_dsp_core_3000::DEFAULT_CORDIC_FREQ);
perif.deframer = tx_vita_core_3000::make_no_radio_buff(perif.ctrl, TOREG(SR_TX_CTRL));
- perif.duc = tx_dsp_core_3000::make(perif.ctrl, TOREG(SR_TX_DSP));
- perif.duc->set_link_rate(10e9/8); //whatever
+ perif.duc = tx_dsp_core_3000::make(perif.ctrl, TOREG(SR_TX_DSP));
+ perif.duc->set_link_rate(10e9 / 8); // whatever
perif.duc->set_freq(tx_dsp_core_3000::DEFAULT_CORDIC_FREQ);
if (_enable_user_regs) {
UHD_LOG_DEBUG("B200", "Enabling user settings registers");
- perif.user_settings = user_settings_core_3000::make(perif.ctrl,
- TOREG(SR_USER_SR_BASE),
- TOREG(SR_USER_RB_ADDR)
- );
+ perif.user_settings = user_settings_core_3000::make(
+ perif.ctrl, TOREG(SR_USER_SR_BASE), TOREG(SR_USER_RB_ADDR));
if (!perif.user_settings) {
const std::string error_msg = "Failed to create user settings bus!";
UHD_LOG_ERROR("B200", error_msg);
@@ -865,21 +919,30 @@ void b200_impl::setup_radio(const size_t dspno)
perif.ddc->populate_subtree(_tree->subtree(rx_dsp_path));
_tree->create<bool>(rx_dsp_path / "rate" / "set").set(false);
_tree->access<double>(rx_dsp_path / "rate" / "value")
- .set_coercer(std::bind(&b200_impl::coerce_rx_samp_rate, this, perif.ddc, dspno, std::placeholders::_1))
- .add_coerced_subscriber([this, rx_dsp_path](const double){
+ .set_coercer(std::bind(&b200_impl::coerce_rx_samp_rate,
+ this,
+ perif.ddc,
+ dspno,
+ std::placeholders::_1))
+ .add_coerced_subscriber([this, rx_dsp_path](const double) {
if (this->_tree) {
- this->_tree->access<bool>(rx_dsp_path / "rate" / "set")
- .set(true);
+ this->_tree->access<bool>(rx_dsp_path / "rate" / "set").set(true);
}
})
- .add_coerced_subscriber(std::bind(&b200_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1))
- ;
+ .add_coerced_subscriber(std::bind(
+ &b200_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1));
_tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd")
- .add_coerced_subscriber(std::bind(&rx_vita_core_3000::issue_stream_command, perif.framer, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&rx_vita_core_3000::issue_stream_command,
+ perif.framer,
+ std::placeholders::_1));
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&rx_vita_core_3000::set_tick_rate, perif.framer, std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&b200_impl::update_rx_dsp_tick_rate, this, std::placeholders::_1, perif.ddc, rx_dsp_path))
- ;
+ .add_coerced_subscriber(std::bind(
+ &rx_vita_core_3000::set_tick_rate, perif.framer, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(&b200_impl::update_rx_dsp_tick_rate,
+ this,
+ std::placeholders::_1,
+ perif.ddc,
+ rx_dsp_path));
////////////////////////////////////////////////////////////////////
// create tx dsp control objects
@@ -888,54 +951,58 @@ void b200_impl::setup_radio(const size_t dspno)
perif.duc->populate_subtree(_tree->subtree(tx_dsp_path));
_tree->create<bool>(tx_dsp_path / "rate" / "set").set(false);
_tree->access<double>(tx_dsp_path / "rate" / "value")
- .set_coercer(std::bind(&b200_impl::coerce_tx_samp_rate, this, perif.duc, dspno, std::placeholders::_1))
- .add_coerced_subscriber([this, tx_dsp_path](const double){
+ .set_coercer(std::bind(&b200_impl::coerce_tx_samp_rate,
+ this,
+ perif.duc,
+ dspno,
+ std::placeholders::_1))
+ .add_coerced_subscriber([this, tx_dsp_path](const double) {
if (this->_tree) {
- this->_tree->access<bool>(tx_dsp_path / "rate" / "set")
- .set(true);
+ this->_tree->access<bool>(tx_dsp_path / "rate" / "set").set(true);
}
})
- .add_coerced_subscriber(std::bind(&b200_impl::update_tx_samp_rate, this, dspno, std::placeholders::_1))
- ;
+ .add_coerced_subscriber(std::bind(
+ &b200_impl::update_tx_samp_rate, this, dspno, std::placeholders::_1));
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&b200_impl::update_tx_dsp_tick_rate, this, std::placeholders::_1, perif.duc, tx_dsp_path))
- ;
+ .add_coerced_subscriber(std::bind(&b200_impl::update_tx_dsp_tick_rate,
+ this,
+ std::placeholders::_1,
+ perif.duc,
+ tx_dsp_path));
////////////////////////////////////////////////////////////////////
// create RF frontend interfacing
////////////////////////////////////////////////////////////////////
for (direction_t dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
- const std::string x = (dir == RX_DIRECTION) ? "rx" : "tx";
- const std::string key = std::string(((dir == RX_DIRECTION) ? "RX" : "TX")) + std::string(((dspno == _fe1) ? "1" : "2"));
- const fs_path rf_fe_path
- = mb_path / "dboards" / "A" / (x + "_frontends") / (dspno ? "B" : "A");
+ const std::string x = (dir == RX_DIRECTION) ? "rx" : "tx";
+ const std::string key = std::string(((dir == RX_DIRECTION) ? "RX" : "TX"))
+ + std::string(((dspno == _fe1) ? "1" : "2"));
+ const fs_path rf_fe_path =
+ mb_path / "dboards" / "A" / (x + "_frontends") / (dspno ? "B" : "A");
// This will connect all the AD936x-specific items
- _codec_mgr->populate_frontend_subtree(
- _tree->subtree(rf_fe_path), key, dir
- );
+ _codec_mgr->populate_frontend_subtree(_tree->subtree(rf_fe_path), key, dir);
// Now connect all the b200_impl-specific items
_tree->create<sensor_value_t>(rf_fe_path / "sensors" / "lo_locked")
- .set_publisher(std::bind(&b200_impl::get_fe_pll_locked, this, dir == TX_DIRECTION))
- ;
+ .set_publisher(
+ std::bind(&b200_impl::get_fe_pll_locked, this, dir == TX_DIRECTION));
_tree->access<double>(rf_fe_path / "freq" / "value")
- .add_coerced_subscriber(std::bind(&b200_impl::update_bandsel, this, key, std::placeholders::_1))
- ;
- if (dir == RX_DIRECTION)
- {
+ .add_coerced_subscriber(
+ std::bind(&b200_impl::update_bandsel, this, key, std::placeholders::_1));
+ if (dir == RX_DIRECTION) {
static const std::vector<std::string> ants{"TX/RX", "RX2"};
- _tree->create<std::vector<std::string> >(rf_fe_path / "antenna" / "options").set(ants);
+ _tree->create<std::vector<std::string>>(rf_fe_path / "antenna" / "options")
+ .set(ants);
_tree->create<std::string>(rf_fe_path / "antenna" / "value")
- .add_coerced_subscriber(std::bind(&b200_impl::update_antenna_sel, this, dspno, std::placeholders::_1))
- .set("RX2")
- ;
+ .add_coerced_subscriber(std::bind(
+ &b200_impl::update_antenna_sel, this, dspno, std::placeholders::_1))
+ .set("RX2");
- }
- else if (dir == TX_DIRECTION)
- {
+ } else if (dir == TX_DIRECTION) {
static const std::vector<std::string> ants(1, "TX/RX");
- _tree->create<std::vector<std::string> >(rf_fe_path / "antenna" / "options").set(ants);
+ _tree->create<std::vector<std::string>>(rf_fe_path / "antenna" / "options")
+ .set(ants);
_tree->create<std::string>(rf_fe_path / "antenna" / "value").set("TX/RX");
}
@@ -955,75 +1022,71 @@ void b200_impl::register_loopback_self_test(wb_iface::sptr iface)
bool test_fail = false;
UHD_LOGGER_INFO("B200") << "Performing register loopback test... ";
size_t hash = size_t(time(NULL));
- for (size_t i = 0; i < 100; i++)
- {
+ for (size_t i = 0; i < 100; i++) {
boost::hash_combine(hash, i);
iface->poke32(TOREG(SR_TEST), uint32_t(hash));
test_fail = iface->peek32(RB32_TEST) != uint32_t(hash);
- if (test_fail) break; //exit loop on any failure
+ if (test_fail)
+ break; // exit loop on any failure
}
- UHD_LOGGER_INFO("B200") << "Register loopback test " << ((test_fail)? "failed" : "passed") ;
+ UHD_LOGGER_INFO("B200") << "Register loopback test "
+ << ((test_fail) ? "failed" : "passed");
}
/***********************************************************************
* Sample and tick rate comprehension below
**********************************************************************/
-void b200_impl::enforce_tick_rate_limits(size_t chan_count, double tick_rate, const std::string &direction /*= ""*/)
+void b200_impl::enforce_tick_rate_limits(
+ size_t chan_count, double tick_rate, const std::string& direction /*= ""*/)
{
const size_t max_chans = 2;
- if (chan_count > max_chans)
- {
+ if (chan_count > max_chans) {
throw uhd::value_error(boost::str(
- boost::format("cannot not setup %d %s channels (maximum is %d)")
- % chan_count
- % (direction.empty() ? "data" : direction)
- % max_chans
- ));
- }
- else
- {
- const double max_tick_rate = ad9361_device_t::AD9361_MAX_CLOCK_RATE / ((chan_count <= 1) ? 1 : 2);
- if (tick_rate - max_tick_rate >= 1.0)
- {
+ boost::format("cannot not setup %d %s channels (maximum is %d)") % chan_count
+ % (direction.empty() ? "data" : direction) % max_chans));
+ } else {
+ const double max_tick_rate =
+ ad9361_device_t::AD9361_MAX_CLOCK_RATE / ((chan_count <= 1) ? 1 : 2);
+ if (tick_rate - max_tick_rate >= 1.0) {
throw uhd::value_error(boost::str(
- boost::format("current master clock rate (%.6f MHz) exceeds maximum possible master clock rate (%.6f MHz) when using %d %s channels")
- % (tick_rate/1e6)
- % (max_tick_rate/1e6)
- % chan_count
- % (direction.empty() ? "data" : direction)
- ));
+ boost::format(
+ "current master clock rate (%.6f MHz) exceeds maximum possible "
+ "master clock rate (%.6f MHz) when using %d %s channels")
+ % (tick_rate / 1e6) % (max_tick_rate / 1e6) % chan_count
+ % (direction.empty() ? "data" : direction)));
}
- const double min_tick_rate = ad9361_device_t::AD9361_MIN_CLOCK_RATE / ((chan_count <= 1) ? 1 : 2);
- if (min_tick_rate - tick_rate >= 1.0)
- {
+ const double min_tick_rate =
+ ad9361_device_t::AD9361_MIN_CLOCK_RATE / ((chan_count <= 1) ? 1 : 2);
+ if (min_tick_rate - tick_rate >= 1.0) {
throw uhd::value_error(boost::str(
- boost::format("current master clock rate (%.6f MHz) is less than minimum possible master clock rate (%.6f MHz) when using %d %s channels")
- % (tick_rate/1e6)
- % (min_tick_rate/1e6)
- % chan_count
- % (direction.empty() ? "data" : direction)
- ));
+ boost::format(
+ "current master clock rate (%.6f MHz) is less than minimum possible "
+ "master clock rate (%.6f MHz) when using %d %s channels")
+ % (tick_rate / 1e6) % (min_tick_rate / 1e6) % chan_count
+ % (direction.empty() ? "data" : direction)));
}
}
}
double b200_impl::set_tick_rate(const double new_tick_rate)
{
- UHD_LOGGER_INFO("B200") << (boost::format("Asking for clock rate %.6f MHz... ") % (new_tick_rate/1e6)) << std::flush;
- check_tick_rate_with_current_streamers(new_tick_rate); // Defined in b200_io_impl.cpp
+ UHD_LOGGER_INFO("B200") << (boost::format("Asking for clock rate %.6f MHz... ")
+ % (new_tick_rate / 1e6))
+ << std::flush;
+ check_tick_rate_with_current_streamers(new_tick_rate); // Defined in b200_io_impl.cpp
// Make sure the clock rate is actually changed before doing
// the full Monty of setting regs and loopback tests etc.
if (std::abs(new_tick_rate - _tick_rate) < 1.0) {
- UHD_LOGGER_INFO("B200") << "OK" ;
+ UHD_LOGGER_INFO("B200") << "OK";
return _tick_rate;
}
_tick_rate = _codec_ctrl->set_clock_rate(new_tick_rate);
- UHD_LOGGER_INFO("B200") << (boost::format("Actually got clock rate %.6f MHz.") % (_tick_rate/1e6)) ;
+ UHD_LOGGER_INFO("B200") << (boost::format("Actually got clock rate %.6f MHz.")
+ % (_tick_rate / 1e6));
- for(radio_perifs_t &perif: _radio_perifs)
- {
+ for (radio_perifs_t& perif : _radio_perifs) {
perif.time64->set_tick_rate(_tick_rate);
perif.time64->self_test();
}
@@ -1036,76 +1099,72 @@ double b200_impl::set_tick_rate(const double new_tick_rate)
void b200_impl::check_fw_compat(void)
{
- uint16_t compat_num = _iface->get_compat_num();
- uint32_t compat_major = (uint32_t) (compat_num >> 8);
- uint32_t compat_minor = (uint32_t) (compat_num & 0xFF);
-
- if (compat_major != B200_FW_COMPAT_NUM_MAJOR){
- throw uhd::runtime_error(str(boost::format(
- "Expected firmware compatibility number %d.%d, but got %d.%d:\n"
- "The firmware build is not compatible with the host code build.\n"
- "%s"
- ) % int(B200_FW_COMPAT_NUM_MAJOR) % int(B200_FW_COMPAT_NUM_MINOR)
- % compat_major % compat_minor % print_utility_error("uhd_images_downloader.py")));
+ uint16_t compat_num = _iface->get_compat_num();
+ uint32_t compat_major = (uint32_t)(compat_num >> 8);
+ uint32_t compat_minor = (uint32_t)(compat_num & 0xFF);
+
+ if (compat_major != B200_FW_COMPAT_NUM_MAJOR) {
+ throw uhd::runtime_error(str(
+ boost::format(
+ "Expected firmware compatibility number %d.%d, but got %d.%d:\n"
+ "The firmware build is not compatible with the host code build.\n"
+ "%s")
+ % int(B200_FW_COMPAT_NUM_MAJOR) % int(B200_FW_COMPAT_NUM_MINOR) % compat_major
+ % compat_minor % print_utility_error("uhd_images_downloader.py")));
}
- _tree->create<std::string>("/mboards/0/fw_version").set(str(boost::format("%u.%u")
- % compat_major % compat_minor));
+ _tree->create<std::string>("/mboards/0/fw_version")
+ .set(str(boost::format("%u.%u") % compat_major % compat_minor));
}
void b200_impl::check_fpga_compat(void)
{
- const uint64_t compat = _local_ctrl->peek64(0);
- const uint32_t signature = uint32_t(compat >> 32);
+ const uint64_t compat = _local_ctrl->peek64(0);
+ const uint32_t signature = uint32_t(compat >> 32);
const uint16_t compat_major = uint16_t(compat >> 16);
const uint16_t compat_minor = uint16_t(compat & 0xffff);
- if (signature != 0xACE0BA5E) throw uhd::runtime_error(
- "b200::check_fpga_compat signature register readback failed");
-
- const uint16_t expected = ((_product == B200MINI or _product == B205MINI) ? B205_FPGA_COMPAT_NUM : B200_FPGA_COMPAT_NUM);
- if (compat_major != expected)
- {
- throw uhd::runtime_error(str(boost::format(
- "Expected FPGA compatibility number %d, but got %d:\n"
- "The FPGA build is not compatible with the host code build.\n"
- "%s"
- ) % int(expected) % compat_major % print_utility_error("uhd_images_downloader.py")));
+ if (signature != 0xACE0BA5E)
+ throw uhd::runtime_error(
+ "b200::check_fpga_compat signature register readback failed");
+
+ const uint16_t expected = ((_product == B200MINI or _product == B205MINI)
+ ? B205_FPGA_COMPAT_NUM
+ : B200_FPGA_COMPAT_NUM);
+ if (compat_major != expected) {
+ throw uhd::runtime_error(str(
+ boost::format("Expected FPGA compatibility number %d, but got %d:\n"
+ "The FPGA build is not compatible with the host code build.\n"
+ "%s")
+ % int(expected) % compat_major
+ % print_utility_error("uhd_images_downloader.py")));
}
- _tree->create<std::string>("/mboards/0/fpga_version").set(str(boost::format("%u.%u")
- % compat_major % compat_minor));
+ _tree->create<std::string>("/mboards/0/fpga_version")
+ .set(str(boost::format("%u.%u") % compat_major % compat_minor));
}
/***********************************************************************
* Reference time and clock
**********************************************************************/
-void b200_impl::update_clock_source(const std::string &source)
+void b200_impl::update_clock_source(const std::string& source)
{
// For B205, ref_sel selects whether or not to lock to the external clock source
- if (_product == B200MINI or _product == B205MINI)
- {
- if (source == "external" and _time_source == EXTERNAL)
- {
- throw uhd::value_error("external reference cannot be both a clock source and a time source");
+ if (_product == B200MINI or _product == B205MINI) {
+ if (source == "external" and _time_source == EXTERNAL) {
+ throw uhd::value_error(
+ "external reference cannot be both a clock source and a time source");
}
- if (source == "internal")
- {
- if (_gpio_state.ref_sel != 0)
- {
+ if (source == "internal") {
+ if (_gpio_state.ref_sel != 0) {
_gpio_state.ref_sel = 0;
this->update_gpio_state();
}
- }
- else if (source == "external")
- {
- if (_gpio_state.ref_sel != 1)
- {
+ } else if (source == "external") {
+ if (_gpio_state.ref_sel != 1) {
_gpio_state.ref_sel = 1;
this->update_gpio_state();
}
- }
- else
- {
+ } else {
throw uhd::key_error("update_clock_source: unknown source: " + source);
}
return;
@@ -1113,42 +1172,35 @@ void b200_impl::update_clock_source(const std::string &source)
// For all other devices, ref_sel selects the external or gpsdo clock source
// and the ADF4001 selects whether to lock to it or not
- if (source == "internal")
- {
+ if (source == "internal") {
_adf4001_iface->set_lock_to_ext_ref(false);
- }
- else if (source == "external")
- {
- if (_gpio_state.ref_sel != 0)
- {
+ } else if (source == "external") {
+ if (_gpio_state.ref_sel != 0) {
_gpio_state.ref_sel = 0;
this->update_gpio_state();
}
_adf4001_iface->set_lock_to_ext_ref(true);
- }
- else if (source == "gpsdo")
- {
+ } else if (source == "gpsdo") {
if (not _gps or not _gps->gps_detected()) {
- throw uhd::key_error("update_clock_source: gpsdo selected, but no gpsdo detected!");
+ throw uhd::key_error(
+ "update_clock_source: gpsdo selected, but no gpsdo detected!");
}
- if (_gpio_state.ref_sel != 1)
- {
+ if (_gpio_state.ref_sel != 1) {
_gpio_state.ref_sel = 1;
this->update_gpio_state();
}
_adf4001_iface->set_lock_to_ext_ref(true);
- }
- else
- {
+ } else {
throw uhd::key_error("update_clock_source: unknown source: " + source);
}
}
-void b200_impl::update_time_source(const std::string &source)
+void b200_impl::update_time_source(const std::string& source)
{
- if ((_product == B200MINI or _product == B205MINI) and source == "external" and _gpio_state.ref_sel == 1)
- {
- throw uhd::value_error("external reference cannot be both a time source and a clock source");
+ if ((_product == B200MINI or _product == B205MINI) and source == "external"
+ and _gpio_state.ref_sel == 1) {
+ throw uhd::value_error(
+ "external reference cannot be both a time source and a clock source");
}
// We assume source is valid for this device (if it's gone through
@@ -1164,8 +1216,7 @@ void b200_impl::update_time_source(const std::string &source)
value = GPSDO;
else
throw uhd::key_error("update_time_source: unknown source: " + source);
- if (_time_source != value)
- {
+ if (_time_source != value) {
_local_ctrl->poke32(TOREG(SR_CORE_SYNC), value);
_time_source = value;
}
@@ -1173,7 +1224,7 @@ void b200_impl::update_time_source(const std::string &source)
void b200_impl::set_time(const uhd::time_spec_t& t)
{
- for(radio_perifs_t &perif: _radio_perifs)
+ for (radio_perifs_t& perif : _radio_perifs)
perif.time64->set_time_sync(t);
_local_ctrl->poke32(TOREG(SR_CORE_SYNC), 1 << 2 | uint32_t(_time_source));
_local_ctrl->poke32(TOREG(SR_CORE_SYNC), _time_source);
@@ -1195,27 +1246,27 @@ void b200_impl::update_bandsel(const std::string& which, double freq)
return;
}
- if(which[0] == 'R') {
- if(freq < 2.2e9) {
+ if (which[0] == 'R') {
+ if (freq < 2.2e9) {
_gpio_state.rx_bandsel_a = 0;
_gpio_state.rx_bandsel_b = 0;
_gpio_state.rx_bandsel_c = 1;
- } else if((freq >= 2.2e9) && (freq < 4e9)) {
+ } else if ((freq >= 2.2e9) && (freq < 4e9)) {
_gpio_state.rx_bandsel_a = 0;
_gpio_state.rx_bandsel_b = 1;
_gpio_state.rx_bandsel_c = 0;
- } else if((freq >= 4e9) && (freq <= 6e9)) {
+ } else if ((freq >= 4e9) && (freq <= 6e9)) {
_gpio_state.rx_bandsel_a = 1;
_gpio_state.rx_bandsel_b = 0;
_gpio_state.rx_bandsel_c = 0;
} else {
UHD_THROW_INVALID_CODE_PATH();
}
- } else if(which[0] == 'T') {
- if(freq < 2.5e9) {
+ } else if (which[0] == 'T') {
+ if (freq < 2.5e9) {
_gpio_state.tx_bandsel_a = 0;
_gpio_state.tx_bandsel_b = 1;
- } else if((freq >= 2.5e9) && (freq <= 6e9)) {
+ } else if ((freq >= 2.5e9) && (freq <= 6e9)) {
_gpio_state.tx_bandsel_a = 1;
_gpio_state.tx_bandsel_b = 0;
} else {
@@ -1238,53 +1289,54 @@ void b200_impl::reset_codec()
void b200_impl::update_gpio_state(void)
{
- const uint32_t misc_word = 0
- | (_gpio_state.swap_atr << 8)
- | (_gpio_state.tx_bandsel_a << 7)
- | (_gpio_state.tx_bandsel_b << 6)
- | (_gpio_state.rx_bandsel_a << 5)
- | (_gpio_state.rx_bandsel_b << 4)
- | (_gpio_state.rx_bandsel_c << 3)
- | (_gpio_state.codec_arst << 2)
- | (_gpio_state.mimo << 1)
- | (_gpio_state.ref_sel << 0)
- ;
+ const uint32_t misc_word =
+ 0 | (_gpio_state.swap_atr << 8) | (_gpio_state.tx_bandsel_a << 7)
+ | (_gpio_state.tx_bandsel_b << 6) | (_gpio_state.rx_bandsel_a << 5)
+ | (_gpio_state.rx_bandsel_b << 4) | (_gpio_state.rx_bandsel_c << 3)
+ | (_gpio_state.codec_arst << 2) | (_gpio_state.mimo << 1)
+ | (_gpio_state.ref_sel << 0);
_local_ctrl->poke32(TOREG(SR_CORE_MISC), misc_word);
}
void b200_impl::update_atrs(void)
{
- if (_radio_perifs.size() > _fe1 and _radio_perifs[_fe1].atr)
- {
- radio_perifs_t &perif = _radio_perifs[_fe1];
- const bool enb_rx = bool(perif.rx_streamer.lock());
- const bool enb_tx = bool(perif.tx_streamer.lock());
- const bool is_rx2 = perif.ant_rx2;
- const uint32_t rxonly = (enb_rx)? ((is_rx2)? STATE_RX1_RX2 : STATE_RX1_TXRX) : STATE_OFF;
- const uint32_t txonly = (enb_tx)? (STATE_TX1_TXRX) : STATE_OFF;
- uint32_t fd = STATE_OFF;
- if (enb_rx and enb_tx) fd = STATE_FDX1_TXRX;
- if (enb_rx and not enb_tx) fd = rxonly;
- if (not enb_rx and enb_tx) fd = txonly;
+ if (_radio_perifs.size() > _fe1 and _radio_perifs[_fe1].atr) {
+ radio_perifs_t& perif = _radio_perifs[_fe1];
+ const bool enb_rx = bool(perif.rx_streamer.lock());
+ const bool enb_tx = bool(perif.tx_streamer.lock());
+ const bool is_rx2 = perif.ant_rx2;
+ const uint32_t rxonly = (enb_rx) ? ((is_rx2) ? STATE_RX1_RX2 : STATE_RX1_TXRX)
+ : STATE_OFF;
+ const uint32_t txonly = (enb_tx) ? (STATE_TX1_TXRX) : STATE_OFF;
+ uint32_t fd = STATE_OFF;
+ if (enb_rx and enb_tx)
+ fd = STATE_FDX1_TXRX;
+ if (enb_rx and not enb_tx)
+ fd = rxonly;
+ if (not enb_rx and enb_tx)
+ fd = txonly;
gpio_atr_3000::sptr atr = perif.atr;
atr->set_atr_reg(ATR_REG_IDLE, STATE_OFF);
atr->set_atr_reg(ATR_REG_RX_ONLY, rxonly);
atr->set_atr_reg(ATR_REG_TX_ONLY, txonly);
atr->set_atr_reg(ATR_REG_FULL_DUPLEX, fd);
}
- if (_radio_perifs.size() > _fe2 and _radio_perifs[_fe2].atr)
- {
- radio_perifs_t &perif = _radio_perifs[_fe2];
- const bool enb_rx = bool(perif.rx_streamer.lock());
- const bool enb_tx = bool(perif.tx_streamer.lock());
- const bool is_rx2 = perif.ant_rx2;
- const uint32_t rxonly = (enb_rx)? ((is_rx2)? STATE_RX2_RX2 : STATE_RX2_TXRX) : STATE_OFF;
- const uint32_t txonly = (enb_tx)? (STATE_TX2_TXRX) : STATE_OFF;
- uint32_t fd = STATE_OFF;
- if (enb_rx and enb_tx) fd = STATE_FDX2_TXRX;
- if (enb_rx and not enb_tx) fd = rxonly;
- if (not enb_rx and enb_tx) fd = txonly;
+ if (_radio_perifs.size() > _fe2 and _radio_perifs[_fe2].atr) {
+ radio_perifs_t& perif = _radio_perifs[_fe2];
+ const bool enb_rx = bool(perif.rx_streamer.lock());
+ const bool enb_tx = bool(perif.tx_streamer.lock());
+ const bool is_rx2 = perif.ant_rx2;
+ const uint32_t rxonly = (enb_rx) ? ((is_rx2) ? STATE_RX2_RX2 : STATE_RX2_TXRX)
+ : STATE_OFF;
+ const uint32_t txonly = (enb_tx) ? (STATE_TX2_TXRX) : STATE_OFF;
+ uint32_t fd = STATE_OFF;
+ if (enb_rx and enb_tx)
+ fd = STATE_FDX2_TXRX;
+ if (enb_rx and not enb_tx)
+ fd = rxonly;
+ if (not enb_rx and enb_tx)
+ fd = txonly;
gpio_atr_3000::sptr atr = perif.atr;
atr->set_atr_reg(ATR_REG_IDLE, STATE_OFF);
atr->set_atr_reg(ATR_REG_RX_ONLY, rxonly);
@@ -1293,38 +1345,44 @@ void b200_impl::update_atrs(void)
}
}
-void b200_impl::update_antenna_sel(const size_t which, const std::string &ant)
+void b200_impl::update_antenna_sel(const size_t which, const std::string& ant)
{
- if (ant != "TX/RX" and ant != "RX2") throw uhd::value_error("b200: unknown RX antenna option: " + ant);
+ if (ant != "TX/RX" and ant != "RX2")
+ throw uhd::value_error("b200: unknown RX antenna option: " + ant);
_radio_perifs[which].ant_rx2 = (ant == "RX2");
this->update_atrs();
}
void b200_impl::update_enables(void)
{
- //extract settings from state variables
- const bool enb_tx1 = (_radio_perifs.size() > _fe1) and bool(_radio_perifs[_fe1].tx_streamer.lock());
- const bool enb_rx1 = (_radio_perifs.size() > _fe1) and bool(_radio_perifs[_fe1].rx_streamer.lock());
- const bool enb_tx2 = (_radio_perifs.size() > _fe2) and bool(_radio_perifs[_fe2].tx_streamer.lock());
- const bool enb_rx2 = (_radio_perifs.size() > _fe2) and bool(_radio_perifs[_fe2].rx_streamer.lock());
- const size_t num_rx = (enb_rx1?1:0) + (enb_rx2?1:0);
- const size_t num_tx = (enb_tx1?1:0) + (enb_tx2?1:0);
- const bool mimo = num_rx == 2 or num_tx == 2;
-
- if ((num_rx + num_tx) == 3)
- {
- throw uhd::runtime_error("b200: 2 RX 1 TX and 1 RX 2 TX configurations not possible");
+ // extract settings from state variables
+ const bool enb_tx1 = (_radio_perifs.size() > _fe1)
+ and bool(_radio_perifs[_fe1].tx_streamer.lock());
+ const bool enb_rx1 = (_radio_perifs.size() > _fe1)
+ and bool(_radio_perifs[_fe1].rx_streamer.lock());
+ const bool enb_tx2 = (_radio_perifs.size() > _fe2)
+ and bool(_radio_perifs[_fe2].tx_streamer.lock());
+ const bool enb_rx2 = (_radio_perifs.size() > _fe2)
+ and bool(_radio_perifs[_fe2].rx_streamer.lock());
+ const size_t num_rx = (enb_rx1 ? 1 : 0) + (enb_rx2 ? 1 : 0);
+ const size_t num_tx = (enb_tx1 ? 1 : 0) + (enb_tx2 ? 1 : 0);
+ const bool mimo = num_rx == 2 or num_tx == 2;
+
+ if ((num_rx + num_tx) == 3) {
+ throw uhd::runtime_error(
+ "b200: 2 RX 1 TX and 1 RX 2 TX configurations not possible");
}
- //setup the active chains in the codec
+ // setup the active chains in the codec
_codec_ctrl->set_active_chains(enb_tx1, enb_tx2, enb_rx1, enb_rx2);
- if ((num_rx + num_tx) == 0) _codec_ctrl->set_active_chains(true, false, true, false); //enable something
+ if ((num_rx + num_tx) == 0)
+ _codec_ctrl->set_active_chains(true, false, true, false); // enable something
- //figure out if mimo is enabled based on new state
- _gpio_state.mimo = (mimo)? 1 : 0;
+ // figure out if mimo is enabled based on new state
+ _gpio_state.mimo = (mimo) ? 1 : 0;
update_gpio_state();
- //atrs change based on enables
+ // atrs change based on enables
this->update_atrs();
}
diff --git a/host/lib/usrp/b200/b200_impl.hpp b/host/lib/usrp/b200/b200_impl.hpp
index bd44aa14f..d151bc59d 100644
--- a/host/lib/usrp/b200/b200_impl.hpp
+++ b/host/lib/usrp/b200/b200_impl.hpp
@@ -8,47 +8,47 @@
#ifndef INCLUDED_B200_IMPL_HPP
#define INCLUDED_B200_IMPL_HPP
+#include "b200_cores.hpp"
#include "b200_iface.hpp"
#include "b200_uart.hpp"
-#include "b200_cores.hpp"
#include <uhd/device.hpp>
#include <uhd/property_tree.hpp>
-#include <uhd/utils/pimpl.hpp>
-#include <uhd/utils/tasks.hpp>
+#include <uhd/transport/bounded_buffer.hpp>
+#include <uhd/transport/usb_zero_copy.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/types/stream_cmd.hpp>
+#include <uhd/usrp/gps_ctrl.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/usrp/subdev_spec.hpp>
-#include <uhd/usrp/gps_ctrl.hpp>
-#include <uhd/transport/usb_zero_copy.hpp>
-#include <uhd/transport/bounded_buffer.hpp>
+#include <uhd/utils/pimpl.hpp>
+#include <uhd/utils/tasks.hpp>
#include <uhdlib/usrp/common/ad9361_ctrl.hpp>
-#include <uhdlib/usrp/cores/rx_vita_core_3000.hpp>
-#include <uhdlib/usrp/cores/tx_vita_core_3000.hpp>
-#include <uhdlib/usrp/cores/time_core_3000.hpp>
+#include <uhdlib/usrp/common/ad936x_manager.hpp>
+#include <uhdlib/usrp/common/adf4001_ctrl.hpp>
+#include <uhdlib/usrp/common/recv_packet_demuxer_3000.hpp>
#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <uhdlib/usrp/cores/radio_ctrl_core_3000.hpp>
#include <uhdlib/usrp/cores/rx_dsp_core_3000.hpp>
+#include <uhdlib/usrp/cores/rx_vita_core_3000.hpp>
+#include <uhdlib/usrp/cores/time_core_3000.hpp>
#include <uhdlib/usrp/cores/tx_dsp_core_3000.hpp>
+#include <uhdlib/usrp/cores/tx_vita_core_3000.hpp>
#include <uhdlib/usrp/cores/user_settings_core_3000.hpp>
-#include <uhdlib/usrp/common/recv_packet_demuxer_3000.hpp>
-#include <uhdlib/usrp/common/ad936x_manager.hpp>
-#include <uhdlib/usrp/common/adf4001_ctrl.hpp>
#include <boost/assign.hpp>
-#include <mutex>
#include <memory>
+#include <mutex>
-static const uint8_t B200_FW_COMPAT_NUM_MAJOR = 8;
-static const uint8_t B200_FW_COMPAT_NUM_MINOR = 0;
-static const uint16_t B200_FPGA_COMPAT_NUM = 16;
-static const uint16_t B205_FPGA_COMPAT_NUM = 7;
-static const double B200_BUS_CLOCK_RATE = 100e6;
-static const uint32_t B200_GPSDO_ST_NONE = 0x83;
-static constexpr double B200_MAX_RATE_USB2 = 53248000; // bytes/s
-static constexpr double B200_MAX_RATE_USB3 = 500000000; // bytes/s
+static const uint8_t B200_FW_COMPAT_NUM_MAJOR = 8;
+static const uint8_t B200_FW_COMPAT_NUM_MINOR = 0;
+static const uint16_t B200_FPGA_COMPAT_NUM = 16;
+static const uint16_t B205_FPGA_COMPAT_NUM = 7;
+static const double B200_BUS_CLOCK_RATE = 100e6;
+static const uint32_t B200_GPSDO_ST_NONE = 0x83;
+static constexpr double B200_MAX_RATE_USB2 = 53248000; // bytes/s
+static constexpr double B200_MAX_RATE_USB3 = 500000000; // bytes/s
-#define FLIP_SID(sid) (((sid)<<16)|((sid)>>16))
+#define FLIP_SID(sid) (((sid) << 16) | ((sid) >> 16))
static const uint32_t B200_CTRL0_MSG_SID = 0x00000010;
static const uint32_t B200_RESP0_MSG_SID = FLIP_SID(B200_CTRL0_MSG_SID);
@@ -57,10 +57,10 @@ static const uint32_t B200_CTRL1_MSG_SID = 0x00000020;
static const uint32_t B200_RESP1_MSG_SID = FLIP_SID(B200_CTRL1_MSG_SID);
static const uint32_t B200_TX_DATA0_SID = 0x00000050;
-static const uint32_t B200_TX_MSG0_SID = FLIP_SID(B200_TX_DATA0_SID);
+static const uint32_t B200_TX_MSG0_SID = FLIP_SID(B200_TX_DATA0_SID);
static const uint32_t B200_TX_DATA1_SID = 0x00000060;
-static const uint32_t B200_TX_MSG1_SID = FLIP_SID(B200_TX_DATA1_SID);
+static const uint32_t B200_TX_MSG1_SID = FLIP_SID(B200_TX_DATA1_SID);
static const uint32_t B200_RX_DATA0_SID = 0x000000A0;
static const uint32_t B200_RX_DATA1_SID = 0x000000B0;
@@ -91,48 +91,55 @@ static const int B200_USB_DATA_MAX_RECV_FRAME_SIZE = 16360;
* VID/PID pairs for all B2xx products
*/
static std::vector<uhd::transport::usb_device_handle::vid_pid_pair_t> b200_vid_pid_pairs =
- boost::assign::list_of
- (uhd::transport::usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200_PRODUCT_ID))
- (uhd::transport::usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B200MINI_PRODUCT_ID))
- (uhd::transport::usb_device_handle::vid_pid_pair_t(B200_VENDOR_ID, B205MINI_PRODUCT_ID))
- (uhd::transport::usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B200_PRODUCT_NI_ID))
- (uhd::transport::usb_device_handle::vid_pid_pair_t(B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID))
- ;
-
-b200_product_t get_b200_product(const uhd::transport::usb_device_handle::sptr& handle, const uhd::usrp::mboard_eeprom_t &mb_eeprom);
-std::vector<uhd::transport::usb_device_handle::sptr> get_b200_device_handles(const uhd::device_addr_t &hint);
+ boost::assign::list_of(uhd::transport::usb_device_handle::vid_pid_pair_t(
+ B200_VENDOR_ID, B200_PRODUCT_ID))(
+ uhd::transport::usb_device_handle::vid_pid_pair_t(
+ B200_VENDOR_ID, B200MINI_PRODUCT_ID))(
+ uhd::transport::usb_device_handle::vid_pid_pair_t(
+ B200_VENDOR_ID, B205MINI_PRODUCT_ID))(
+ uhd::transport::usb_device_handle::vid_pid_pair_t(
+ B200_VENDOR_NI_ID, B200_PRODUCT_NI_ID))(
+ uhd::transport::usb_device_handle::vid_pid_pair_t(
+ B200_VENDOR_NI_ID, B210_PRODUCT_NI_ID));
+
+b200_product_t get_b200_product(const uhd::transport::usb_device_handle::sptr& handle,
+ const uhd::usrp::mboard_eeprom_t& mb_eeprom);
+std::vector<uhd::transport::usb_device_handle::sptr> get_b200_device_handles(
+ const uhd::device_addr_t& hint);
//! Implementation guts
class b200_impl : public uhd::device
{
public:
- //structors
- b200_impl(const uhd::device_addr_t &, uhd::transport::usb_device_handle::sptr &handle);
+ // structors
+ b200_impl(const uhd::device_addr_t&, uhd::transport::usb_device_handle::sptr& handle);
~b200_impl(void);
- //the io interface
- uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t &args);
- uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &args);
- bool recv_async_msg(uhd::async_metadata_t &, double);
+ // the io interface
+ uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t& args);
+ uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t& args);
+ bool recv_async_msg(uhd::async_metadata_t&, double);
//! Check that the combination of stream args and tick rate are valid.
//
// Basically figures out the arguments for enforce_tick_rate_limits()
// and calls said method. If arguments are invalid, throws a
// uhd::value_error.
- void check_streamer_args(const uhd::stream_args_t &args, double tick_rate, const std::string &direction = "");
+ void check_streamer_args(const uhd::stream_args_t& args,
+ double tick_rate,
+ const std::string& direction = "");
static uhd::usrp::mboard_eeprom_t get_mb_eeprom(uhd::i2c_iface::sptr);
private:
- b200_product_t _product;
- size_t _revision;
- bool _gpsdo_capable;
+ b200_product_t _product;
+ size_t _revision;
+ bool _gpsdo_capable;
//! This flag is true if the FPGA has custom (user) registers and access to
// those needs to be enabled from software.
- const bool _enable_user_regs;
+ const bool _enable_user_regs;
- //controllers
+ // controllers
b200_iface::sptr _iface;
radio_ctrl_core_3000::sptr _local_ctrl;
uhd::usrp::ad9361_ctrl::sptr _codec_ctrl;
@@ -141,7 +148,7 @@ private:
std::shared_ptr<uhd::usrp::adf4001_ctrl> _adf4001_iface;
uhd::gps_ctrl::sptr _gps;
- //transports
+ // transports
uhd::transport::zero_copy_if::sptr _data_transport;
uhd::transport::zero_copy_if::sptr _ctrl_transport;
uhd::usrp::recv_packet_demuxer_3000::sptr _demux;
@@ -151,7 +158,7 @@ private:
std::mutex _transport_setup_mutex;
- //async ctrl + msgs
+ // async ctrl + msgs
uhd::msg_task::sptr _async_task;
typedef uhd::transport::bounded_buffer<uhd::async_metadata_t> async_md_type;
struct AsyncTaskData
@@ -162,25 +169,26 @@ private:
b200_uart::sptr gpsdo_uart;
};
std::shared_ptr<AsyncTaskData> _async_task_data;
- boost::optional<uhd::msg_task::msg_type_t> handle_async_task(uhd::transport::zero_copy_if::sptr, std::shared_ptr<AsyncTaskData>);
+ boost::optional<uhd::msg_task::msg_type_t> handle_async_task(
+ uhd::transport::zero_copy_if::sptr, std::shared_ptr<AsyncTaskData>);
void register_loopback_self_test(uhd::wb_iface::sptr iface);
- void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t &);
+ void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t&);
void check_fw_compat(void);
void check_fpga_compat(void);
- uhd::usrp::subdev_spec_t coerce_subdev_spec(const uhd::usrp::subdev_spec_t &);
- void update_subdev_spec(const std::string &tx_rx, const uhd::usrp::subdev_spec_t &);
- void update_time_source(const std::string &);
+ uhd::usrp::subdev_spec_t coerce_subdev_spec(const uhd::usrp::subdev_spec_t&);
+ void update_subdev_spec(const std::string& tx_rx, const uhd::usrp::subdev_spec_t&);
+ void update_time_source(const std::string&);
void set_time(const uhd::time_spec_t&);
void sync_times(void);
- void update_clock_source(const std::string &);
+ void update_clock_source(const std::string&);
void update_bandsel(const std::string& which, double freq);
void reset_codec(void);
- void update_antenna_sel(const size_t which, const std::string &ant);
+ void update_antenna_sel(const size_t which, const std::string& ant);
uhd::sensor_value_t get_ref_locked(void);
uhd::sensor_value_t get_fe_pll_locked(const bool is_tx);
- //perifs in the radio core
+ // perifs in the radio core
struct radio_perifs_t
{
radio_ctrl_core_3000::sptr ctrl;
@@ -198,10 +206,10 @@ private:
};
std::vector<radio_perifs_t> _radio_perifs;
- //mapping of AD936x frontends (FE1 and FE2) to radio perif index (0 and 1)
- //FE1 corresponds to the ports labeled "RF B" on the B200/B210
- //FE2 corresponds to the ports labeled "RF A" on the B200/B210
- //the mapping is product and revision specific
+ // mapping of AD936x frontends (FE1 and FE2) to radio perif index (0 and 1)
+ // FE1 corresponds to the ports labeled "RF B" on the B200/B210
+ // FE2 corresponds to the ports labeled "RF A" on the B200/B210
+ // the mapping is product and revision specific
size_t _fe1;
size_t _fe2;
@@ -211,23 +219,32 @@ private:
void setup_radio(const size_t radio_index);
void handle_overflow(const size_t radio_index);
- struct gpio_state {
- uint32_t tx_bandsel_a, tx_bandsel_b, rx_bandsel_a, rx_bandsel_b, rx_bandsel_c, codec_arst, mimo, ref_sel, swap_atr;
+ struct gpio_state
+ {
+ uint32_t tx_bandsel_a, tx_bandsel_b, rx_bandsel_a, rx_bandsel_b, rx_bandsel_c,
+ codec_arst, mimo, ref_sel, swap_atr;
- gpio_state() {
+ gpio_state()
+ {
tx_bandsel_a = 0;
tx_bandsel_b = 0;
rx_bandsel_a = 0;
rx_bandsel_b = 0;
rx_bandsel_c = 0;
- codec_arst = 0;
- mimo = 0;
- ref_sel = 0;
- swap_atr = 0;
+ codec_arst = 0;
+ mimo = 0;
+ ref_sel = 0;
+ swap_atr = 0;
}
} _gpio_state;
- enum time_source_t {GPSDO=0,EXTERNAL=1,INTERNAL=2,NONE=3,UNKNOWN=4} _time_source;
+ enum time_source_t {
+ GPSDO = 0,
+ EXTERNAL = 1,
+ INTERNAL = 2,
+ NONE = 3,
+ UNKNOWN = 4
+ } _time_source;
void update_gpio_state(void);
@@ -235,10 +252,14 @@ private:
void update_atrs(void);
double _tick_rate;
- double get_tick_rate(void){return _tick_rate;}
+ double get_tick_rate(void)
+ {
+ return _tick_rate;
+ }
double set_tick_rate(const double rate);
- /*! \brief Choose a tick rate (master clock rate) that works well for the given sampling rate.
+ /*! \brief Choose a tick rate (master clock rate) that works well for the given
+ * sampling rate.
*
* This function will try and choose a master clock rate automatically.
* See the function definition for details on the algorithm.
@@ -257,30 +278,32 @@ private:
* will be ignored.
* \param num_chans If given, specifies the number of channels.
*/
- void set_auto_tick_rate(
- const double rate=0,
- const uhd::fs_path &tree_dsp_path="",
- size_t num_chans=0
- );
+ void set_auto_tick_rate(const double rate = 0,
+ const uhd::fs_path& tree_dsp_path = "",
+ size_t num_chans = 0);
void update_tick_rate(const double);
/*! Subscriber to the tick_rate property, updates DDCs after tick rate change.
*/
- void update_rx_dsp_tick_rate(const double, rx_dsp_core_3000::sptr, uhd::fs_path rx_dsp_path);
+ void update_rx_dsp_tick_rate(
+ const double, rx_dsp_core_3000::sptr, uhd::fs_path rx_dsp_path);
/*! Subscriber to the tick_rate property, updates DUCs after tick rate change.
*/
- void update_tx_dsp_tick_rate(const double, tx_dsp_core_3000::sptr, uhd::fs_path tx_dsp_path);
+ void update_tx_dsp_tick_rate(
+ const double, tx_dsp_core_3000::sptr, uhd::fs_path tx_dsp_path);
/*! Check if \p tick_rate works with \p chan_count channels.
*
* Throws a uhd::value_error if not.
*/
- void enforce_tick_rate_limits(size_t chan_count, double tick_rate, const std::string &direction = "");
+ void enforce_tick_rate_limits(
+ size_t chan_count, double tick_rate, const std::string& direction = "");
void check_tick_rate_with_current_streamers(double rate);
- /*! Return the max number of channels on active rx_streamer or tx_streamer objects associated with this device.
+ /*! Return the max number of channels on active rx_streamer or tx_streamer objects
+ * associated with this device.
*
* \param direction Set to "TX" to only check tx_streamers, "RX" to only check
* rx_streamers. Any other value will check if \e any active
@@ -288,7 +311,7 @@ private:
* \return Return the number of tx streamers (direction=="TX"), the number of rx
* streamers (direction=="RX") or the total number of streamers.
*/
- size_t max_chan_count(const std::string &direction="");
+ size_t max_chan_count(const std::string& direction = "");
//! Coercer, attached to the "rate/value" property on the rx dsps.
double coerce_rx_samp_rate(rx_dsp_core_3000::sptr, size_t, const double);
diff --git a/host/lib/usrp/b200/b200_io_impl.cpp b/host/lib/usrp/b200/b200_io_impl.cpp
index 6eb3631ab..57a1b18c7 100644
--- a/host/lib/usrp/b200/b200_io_impl.cpp
+++ b/host/lib/usrp/b200/b200_io_impl.cpp
@@ -458,12 +458,17 @@ rx_streamer::sptr b200_impl::get_rx_stream(const uhd::stream_args_t& args_)
perif.ddc->setup(args);
_demux->realloc_sid(sid);
my_streamer->set_xport_chan_get_buff(stream_i,
- std::bind(&recv_packet_demuxer_3000::get_recv_buff, _demux, sid, std::placeholders::_1),
+ std::bind(&recv_packet_demuxer_3000::get_recv_buff,
+ _demux,
+ sid,
+ std::placeholders::_1),
true /*flush*/);
my_streamer->set_overflow_handler(
stream_i, std::bind(&b200_impl::handle_overflow, this, radio_index));
my_streamer->set_issue_stream_cmd(stream_i,
- std::bind(&rx_vita_core_3000::issue_stream_command, perif.framer, std::placeholders::_1));
+ std::bind(&rx_vita_core_3000::issue_stream_command,
+ perif.framer,
+ std::placeholders::_1));
perif.rx_streamer = my_streamer; // store weak pointer
// sets all tick and samp rates on this streamer
@@ -574,10 +579,13 @@ tx_streamer::sptr b200_impl::get_tx_stream(const uhd::stream_args_t& args_)
perif.deframer->setup(args);
perif.duc->setup(args);
- my_streamer->set_xport_chan_get_buff(
- stream_i, std::bind(&zero_copy_if::get_send_buff, _data_transport, std::placeholders::_1));
- my_streamer->set_async_receiver(std::bind(
- &async_md_type::pop_with_timed_wait, _async_task_data->async_md, std::placeholders::_1, std::placeholders::_2));
+ my_streamer->set_xport_chan_get_buff(stream_i,
+ std::bind(
+ &zero_copy_if::get_send_buff, _data_transport, std::placeholders::_1));
+ my_streamer->set_async_receiver(std::bind(&async_md_type::pop_with_timed_wait,
+ _async_task_data->async_md,
+ std::placeholders::_1,
+ std::placeholders::_2));
my_streamer->set_xport_chan_sid(
stream_i, true, radio_index ? B200_TX_DATA1_SID : B200_TX_DATA0_SID);
my_streamer->set_enable_trailer(false); // TODO not implemented trailer support
diff --git a/host/lib/usrp/b200/b200_mb_eeprom.cpp b/host/lib/usrp/b200/b200_mb_eeprom.cpp
index 5a37cc9c1..a83dce189 100644
--- a/host/lib/usrp/b200/b200_mb_eeprom.cpp
+++ b/host/lib/usrp/b200/b200_mb_eeprom.cpp
@@ -7,7 +7,6 @@
#include "b200_impl.hpp"
#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhdlib/utils/eeprom_utils.hpp>
-
#include <unordered_map>
using namespace uhd;
@@ -27,7 +26,7 @@ struct eeprom_field_t
// firmware and bootloader code.
// EEPROM map information is duplicated in b2xx_fx3_utils.cpp
-constexpr uint16_t SIGNATURE_ADDR = 0x0000;
+constexpr uint16_t SIGNATURE_ADDR = 0x0000;
constexpr size_t SIGNATURE_LENGTH = 4;
constexpr auto EXPECTED_MAGIC = "45568"; // 0xB200
@@ -38,15 +37,15 @@ constexpr uint16_t REV1_BASE_ADDR = 0x7F00;
constexpr size_t REV1_LENGTH = 46;
const std::unordered_map<std::string, eeprom_field_t> B200_REV1_MAP = {
- {"magic", {0, 2}},
- {"eeprom_revision", {2, 2}},
- {"eeprom_compat", {4, 2}},
- {"vendor_id", {6, 2}},
- {"product_id", {8, 2}},
- {"revision", {10, 2}},
- {"product", {12, 2}},
- {"name", {14, NAME_MAX_LEN}},
- {"serial", {14 + NAME_MAX_LEN, SERIAL_LEN}},
+ {"magic", {0, 2}},
+ {"eeprom_revision", {2, 2}},
+ {"eeprom_compat", {4, 2}},
+ {"vendor_id", {6, 2}},
+ {"product_id", {8, 2}},
+ {"revision", {10, 2}},
+ {"product", {12, 2}},
+ {"name", {14, NAME_MAX_LEN}},
+ {"serial", {14 + NAME_MAX_LEN, SERIAL_LEN}},
// pad of 210 bytes
};
@@ -56,10 +55,10 @@ constexpr size_t REV0_LENGTH = 36;
const std::unordered_map<std::string, eeprom_field_t> B200_REV0_MAP = {
// front pad of 220 bytes
- {"revision", {0, 2}},
- {"product", {2, 2}},
- {"name", {4, NAME_MAX_LEN}},
- {"serial", {4 + NAME_MAX_LEN, SERIAL_LEN}},
+ {"revision", {0, 2}},
+ {"product", {2, 2}},
+ {"name", {4, NAME_MAX_LEN}},
+ {"serial", {4 + NAME_MAX_LEN, SERIAL_LEN}},
};
constexpr int UNKNOWN_REV = -1;
@@ -82,8 +81,7 @@ int _get_rev(uhd::i2c_iface::sptr iface)
byte_vector_t _get_eeprom(uhd::i2c_iface::sptr iface)
{
const auto rev = _get_rev(iface);
- if (rev == UNKNOWN_REV)
- {
+ if (rev == UNKNOWN_REV) {
return byte_vector_t();
}
@@ -93,7 +91,7 @@ byte_vector_t _get_eeprom(uhd::i2c_iface::sptr iface)
return iface->read_eeprom(addr >> 8, addr & 0xFF, length);
}
-}
+} // namespace
mboard_eeprom_t b200_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
{
@@ -106,8 +104,7 @@ mboard_eeprom_t b200_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
auto eeprom_map = (rev == 0) ? B200_REV0_MAP : B200_REV1_MAP;
- for (const auto &element : eeprom_map)
- {
+ for (const auto& element : eeprom_map) {
// There is an assumption here that fields of length 2 are uint16's and
// lengths other than 2 are strings. Update this code if that
// assumption changes.
@@ -115,23 +112,22 @@ mboard_eeprom_t b200_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
bytes.begin() + element.second.offset + element.second.length);
mb_eeprom[element.first] = (element.second.length == 2)
- ? uint16_bytes_to_string(element_bytes)
- : bytes_to_string(element_bytes);
+ ? uint16_bytes_to_string(element_bytes)
+ : bytes_to_string(element_bytes);
}
if (rev > 0) {
- if (mb_eeprom["magic"] != EXPECTED_MAGIC)
- {
+ if (mb_eeprom["magic"] != EXPECTED_MAGIC) {
throw uhd::runtime_error(
str(boost::format("EEPROM magic value mismatch. Device returns %s, but "
"should have been %s.")
- % mb_eeprom["magic"] % EXPECTED_MAGIC));
+ % mb_eeprom["magic"] % EXPECTED_MAGIC));
}
if (mb_eeprom["eeprom_compat"] != EXPECTED_COMPAT) {
throw uhd::runtime_error(
str(boost::format("EEPROM compat value mismatch. Device returns %s, but "
"should have been %s.")
- % mb_eeprom["eeprom_compat"] % EXPECTED_COMPAT));
+ % mb_eeprom["eeprom_compat"] % EXPECTED_COMPAT));
}
}
@@ -140,13 +136,11 @@ mboard_eeprom_t b200_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
void b200_impl::set_mb_eeprom(const mboard_eeprom_t& mb_eeprom)
{
- const auto rev = _get_rev(_iface);
+ const auto rev = _get_rev(_iface);
auto eeprom_map = (rev == 0) ? B200_REV0_MAP : B200_REV1_MAP;
auto base_addr = (rev == 0) ? REV0_BASE_ADDR : REV1_BASE_ADDR;
- for (const auto& key : mb_eeprom.keys())
- {
- if (eeprom_map.find(key) == eeprom_map.end())
- {
+ for (const auto& key : mb_eeprom.keys()) {
+ if (eeprom_map.find(key) == eeprom_map.end()) {
UHD_LOG_WARNING(
LOG_ID, "Unknown key in mb_eeprom during set_mb_eeprom: " << key);
continue;
diff --git a/host/lib/usrp/b200/b200_regs.hpp b/host/lib/usrp/b200/b200_regs.hpp
index cedbe0ff5..4554eb52c 100644
--- a/host/lib/usrp/b200/b200_regs.hpp
+++ b/host/lib/usrp/b200/b200_regs.hpp
@@ -14,60 +14,60 @@
#define localparam static const int
-localparam SR_CORE_SPI = 8;
-localparam SR_CORE_MISC = 16;
-localparam SR_CORE_COMPAT = 24;
-localparam SR_CORE_GPSDO_ST = 40;
-localparam SR_CORE_SYNC = 48;
-localparam RB32_CORE_SPI = 8;
-localparam RB32_CORE_MISC = 16;
-localparam RB32_CORE_STATUS = 20;
-localparam RB32_CORE_PLL = 24;
-
-localparam SR_SPI = 8;
-localparam SR_ATR = 12;
-localparam SR_TEST = 21;
-localparam SR_CODEC_IDLE = 22;
-localparam SR_READBACK = 32;
-localparam SR_TX_CTRL = 64;
-localparam SR_RX_CTRL = 96;
-localparam SR_RX_DSP = 144;
-localparam SR_TX_DSP = 184;
-localparam SR_TIME = 128;
-localparam SR_RX_FMT = 136;
-localparam SR_TX_FMT = 138;
-localparam SR_FP_GPIO = 200;
+localparam SR_CORE_SPI = 8;
+localparam SR_CORE_MISC = 16;
+localparam SR_CORE_COMPAT = 24;
+localparam SR_CORE_GPSDO_ST = 40;
+localparam SR_CORE_SYNC = 48;
+localparam RB32_CORE_SPI = 8;
+localparam RB32_CORE_MISC = 16;
+localparam RB32_CORE_STATUS = 20;
+localparam RB32_CORE_PLL = 24;
+
+localparam SR_SPI = 8;
+localparam SR_ATR = 12;
+localparam SR_TEST = 21;
+localparam SR_CODEC_IDLE = 22;
+localparam SR_READBACK = 32;
+localparam SR_TX_CTRL = 64;
+localparam SR_RX_CTRL = 96;
+localparam SR_RX_DSP = 144;
+localparam SR_TX_DSP = 184;
+localparam SR_TIME = 128;
+localparam SR_RX_FMT = 136;
+localparam SR_TX_FMT = 138;
+localparam SR_FP_GPIO = 200;
localparam SR_USER_SR_BASE = 253;
localparam SR_USER_RB_ADDR = 255;
-localparam RB32_TEST = 0;
-localparam RB64_TIME_NOW = 8;
-localparam RB64_TIME_PPS = 16;
-localparam RB64_CODEC_READBACK = 24;
-localparam RB32_FP_GPIO = 32;
+localparam RB32_TEST = 0;
+localparam RB64_TIME_NOW = 8;
+localparam RB64_TIME_PPS = 16;
+localparam RB64_CODEC_READBACK = 24;
+localparam RB32_FP_GPIO = 32;
-//pll constants
-static const int AD9361_SLAVENO = (1 << 0);
-static const int ADF4001_SLAVENO = (1 << 1);
-static const double AD9361_SPI_RATE = 1e6;
-static const double ADF4001_SPI_RATE = 10e3; //slow for large time constant on spi lines
+// pll constants
+static const int AD9361_SLAVENO = (1 << 0);
+static const int ADF4001_SLAVENO = (1 << 1);
+static const double AD9361_SPI_RATE = 1e6;
+static const double ADF4001_SPI_RATE = 10e3; // slow for large time constant on spi lines
/* ATR Control Bits */
-static const uint32_t TX_ENABLE1 = (1 << 7);
-static const uint32_t SFDX1_RX = (1 << 6);
-static const uint32_t SFDX1_TX = (1 << 5);
-static const uint32_t SRX1_RX = (1 << 4);
-static const uint32_t SRX1_TX = (1 << 3);
-static const uint32_t LED_RX1 = (1 << 2);
+static const uint32_t TX_ENABLE1 = (1 << 7);
+static const uint32_t SFDX1_RX = (1 << 6);
+static const uint32_t SFDX1_TX = (1 << 5);
+static const uint32_t SRX1_RX = (1 << 4);
+static const uint32_t SRX1_TX = (1 << 3);
+static const uint32_t LED_RX1 = (1 << 2);
static const uint32_t LED_TXRX_RX1 = (1 << 1);
static const uint32_t LED_TXRX_TX1 = (1 << 0);
-static const uint32_t TX_ENABLE2 = (1 << 7);
-static const uint32_t SFDX2_RX = (1 << 6);
-static const uint32_t SFDX2_TX = (1 << 5);
-static const uint32_t SRX2_RX = (1 << 4);
-static const uint32_t SRX2_TX = (1 << 3);
-static const uint32_t LED_RX2 = (1 << 2);
+static const uint32_t TX_ENABLE2 = (1 << 7);
+static const uint32_t SFDX2_RX = (1 << 6);
+static const uint32_t SFDX2_TX = (1 << 5);
+static const uint32_t SRX2_RX = (1 << 4);
+static const uint32_t SRX2_TX = (1 << 3);
+static const uint32_t LED_RX2 = (1 << 2);
static const uint32_t LED_TXRX_RX2 = (1 << 1);
static const uint32_t LED_TXRX_TX2 = (1 << 0);
@@ -76,44 +76,24 @@ static const uint32_t LED_TXRX_TX2 = (1 << 0);
static const uint32_t STATE_OFF = 0x00;
///////////////////////// side 1 ///////////////////////////////////
-static const uint32_t STATE_RX1_RX2 = (SFDX1_RX
- | SFDX1_TX
- | LED_RX1);
+static const uint32_t STATE_RX1_RX2 = (SFDX1_RX | SFDX1_TX | LED_RX1);
-static const uint32_t STATE_RX1_TXRX = (SRX1_RX
- | SRX1_TX
- | LED_TXRX_RX1);
+static const uint32_t STATE_RX1_TXRX = (SRX1_RX | SRX1_TX | LED_TXRX_RX1);
-static const uint32_t STATE_FDX1_TXRX = (TX_ENABLE1
- | SFDX1_RX
- | SFDX1_TX
- | LED_TXRX_TX1
- | LED_RX1);
+static const uint32_t STATE_FDX1_TXRX =
+ (TX_ENABLE1 | SFDX1_RX | SFDX1_TX | LED_TXRX_TX1 | LED_RX1);
-static const uint32_t STATE_TX1_TXRX = (TX_ENABLE1
- | SFDX1_RX
- | SFDX1_TX
- | LED_TXRX_TX1);
+static const uint32_t STATE_TX1_TXRX = (TX_ENABLE1 | SFDX1_RX | SFDX1_TX | LED_TXRX_TX1);
///////////////////////// side 2 ///////////////////////////////////
-static const uint32_t STATE_RX2_RX2 = (SFDX2_RX
- | SRX2_TX
- | LED_RX2);
-
-static const uint32_t STATE_RX2_TXRX = (SRX2_TX
- | SRX2_RX
- | LED_TXRX_RX2);
-
-static const uint32_t STATE_FDX2_TXRX = (TX_ENABLE2
- | SFDX2_RX
- | SFDX2_TX
- | LED_TXRX_TX2
- | LED_RX2);
-
-static const uint32_t STATE_TX2_TXRX = (TX_ENABLE2
- | SFDX2_RX
- | SFDX2_TX
- | LED_TXRX_TX2);
+static const uint32_t STATE_RX2_RX2 = (SFDX2_RX | SRX2_TX | LED_RX2);
+
+static const uint32_t STATE_RX2_TXRX = (SRX2_TX | SRX2_RX | LED_TXRX_RX2);
+
+static const uint32_t STATE_FDX2_TXRX =
+ (TX_ENABLE2 | SFDX2_RX | SFDX2_TX | LED_TXRX_TX2 | LED_RX2);
+
+static const uint32_t STATE_TX2_TXRX = (TX_ENABLE2 | SFDX2_RX | SFDX2_TX | LED_TXRX_TX2);
#endif /* INCLUDED_B200_REGS_HPP */
diff --git a/host/lib/usrp/b200/b200_uart.cpp b/host/lib/usrp/b200/b200_uart.cpp
index 8c8e2462a..b78690705 100644
--- a/host/lib/usrp/b200/b200_uart.cpp
+++ b/host/lib/usrp/b200/b200_uart.cpp
@@ -7,24 +7,24 @@
#include "b200_uart.hpp"
#include "b200_impl.hpp"
+#include <uhd/exception.hpp>
#include <uhd/transport/bounded_buffer.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
+#include <uhd/types/time_spec.hpp>
#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/log.hpp>
-#include <uhd/types/time_spec.hpp>
-#include <uhd/exception.hpp>
using namespace uhd;
using namespace uhd::transport;
struct b200_uart_impl : b200_uart
{
- b200_uart_impl(zero_copy_if::sptr xport, const uint32_t sid):
- _xport(xport),
- _sid(sid),
- _count(0),
- _baud_div(std::floor(B200_BUS_CLOCK_RATE/115200 + 0.5)),
- _line_queue(4096)
+ b200_uart_impl(zero_copy_if::sptr xport, const uint32_t sid)
+ : _xport(xport)
+ , _sid(sid)
+ , _count(0)
+ , _baud_div(std::floor(B200_BUS_CLOCK_RATE / 115200 + 0.5))
+ , _line_queue(4096)
{
/*NOP*/
}
@@ -35,31 +35,31 @@ struct b200_uart_impl : b200_uart
UHD_ASSERT_THROW(bool(buff));
vrt::if_packet_info_t packet_info;
- packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
- packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
+ packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
+ packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
packet_info.num_payload_words32 = 2;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
+ packet_info.num_payload_bytes =
+ packet_info.num_payload_words32 * sizeof(uint32_t);
packet_info.packet_count = _count++;
- packet_info.sob = false;
- packet_info.eob = false;
- packet_info.sid = _sid;
- packet_info.has_sid = true;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = false;
- packet_info.has_tlr = false;
+ packet_info.sob = false;
+ packet_info.eob = false;
+ packet_info.sid = _sid;
+ packet_info.has_sid = true;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = false;
+ packet_info.has_tlr = false;
- uint32_t *packet_buff = buff->cast<uint32_t *>();
+ uint32_t* packet_buff = buff->cast<uint32_t*>();
vrt::if_hdr_pack_le(packet_buff, packet_info);
- packet_buff[packet_info.num_header_words32+0] = uhd::htowx(uint32_t(_baud_div));
- packet_buff[packet_info.num_header_words32+1] = uhd::htowx(uint32_t(ch));
- buff->commit(packet_info.num_packet_words32*sizeof(uint32_t));
+ packet_buff[packet_info.num_header_words32 + 0] = uhd::htowx(uint32_t(_baud_div));
+ packet_buff[packet_info.num_header_words32 + 1] = uhd::htowx(uint32_t(ch));
+ buff->commit(packet_info.num_packet_words32 * sizeof(uint32_t));
}
- void write_uart(const std::string &buff)
+ void write_uart(const std::string& buff)
{
- for(const char ch: buff)
- {
+ for (const char ch : buff) {
this->send_char(ch);
}
}
@@ -73,15 +73,14 @@ struct b200_uart_impl : b200_uart
void handle_uart_packet(managed_recv_buffer::sptr buff)
{
- const uint32_t *packet_buff = buff->cast<const uint32_t *>();
+ const uint32_t* packet_buff = buff->cast<const uint32_t*>();
vrt::if_packet_info_t packet_info;
- packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
- packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
+ packet_info.link_type = vrt::if_packet_info_t::LINK_TYPE_CHDR;
+ packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
vrt::if_hdr_unpack_le(packet_buff, packet_info);
- const char ch = char(uhd::wtohx(packet_buff[packet_info.num_header_words32+1]));
+ const char ch = char(uhd::wtohx(packet_buff[packet_info.num_header_words32 + 1]));
_line += ch;
- if (ch == '\n')
- {
+ if (ch == '\n') {
_line_queue.push_with_pop_on_full(_line);
_line.clear();
}
diff --git a/host/lib/usrp/b200/b200_uart.hpp b/host/lib/usrp/b200/b200_uart.hpp
index c6de5f844..b70cdfa89 100644
--- a/host/lib/usrp/b200/b200_uart.hpp
+++ b/host/lib/usrp/b200/b200_uart.hpp
@@ -14,7 +14,7 @@
#include <uhd/utils/noncopyable.hpp>
#include <memory>
-class b200_uart: uhd::noncopyable, public uhd::uart_iface
+class b200_uart : uhd::noncopyable, public uhd::uart_iface
{
public:
typedef std::shared_ptr<b200_uart> sptr;
diff --git a/host/lib/usrp/common/ad9361_ctrl.cpp b/host/lib/usrp/common/ad9361_ctrl.cpp
index 2c928efcc..a584ef0f7 100644
--- a/host/lib/usrp/common/ad9361_ctrl.cpp
+++ b/host/lib/usrp/common/ad9361_ctrl.cpp
@@ -9,8 +9,8 @@
#include <uhd/types/serial.hpp>
#include <uhd/utils/log.hpp>
#include <uhdlib/usrp/common/ad9361_ctrl.hpp>
-#include <memory>
#include <cstring>
+#include <memory>
#include <mutex>
using namespace uhd;
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
index 44b650f52..784658cb0 100644
--- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
+++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
@@ -5,22 +5,21 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "ad9361_device.h"
+#include "ad9361_client.h"
#include "ad9361_filter_taps.h"
#include "ad9361_gain_tables.h"
#include "ad9361_synth_lut.h"
-#include "ad9361_client.h"
-#include "ad9361_device.h"
#define _USE_MATH_DEFINES
#include <uhd/exception.hpp>
#include <uhd/utils/log.hpp>
-
-#include <boost/scoped_array.hpp>
+#include <stdint.h>
#include <boost/format.hpp>
#include <boost/math/special_functions.hpp>
+#include <boost/scoped_array.hpp>
#include <chrono>
-#include <thread>
#include <cmath>
-#include <stdint.h>
+#include <thread>
////////////////////////////////////////////////////////////
// the following macros evaluate to a compile time constant
@@ -33,14 +32,11 @@
#define HEX__(n) 0x##n##LU
/* 8-bit conversion function */
-#define B8__(x) ((x&0x0000000FLU)?1:0) \
-+((x&0x000000F0LU)?2:0) \
-+((x&0x00000F00LU)?4:0) \
-+((x&0x0000F000LU)?8:0) \
-+((x&0x000F0000LU)?16:0) \
-+((x&0x00F00000LU)?32:0) \
-+((x&0x0F000000LU)?64:0) \
-+((x&0xF0000000LU)?128:0)
+#define B8__(x) \
+ ((x & 0x0000000FLU) ? 1 : 0) + ((x & 0x000000F0LU) ? 2 : 0) \
+ + ((x & 0x00000F00LU) ? 4 : 0) + ((x & 0x0000F000LU) ? 8 : 0) \
+ + ((x & 0x000F0000LU) ? 16 : 0) + ((x & 0x00F00000LU) ? 32 : 0) \
+ + ((x & 0x0F000000LU) ? 64 : 0) + ((x & 0xF0000000LU) ? 128 : 0)
/* for upto 8-bit binary constants */
#define B8(d) ((unsigned char)B8__(HEX__(d)))
@@ -53,8 +49,9 @@ namespace uhd { namespace usrp {
* point numbers. It is used to prevent re-tunes for frequencies that are
* the same but not 'exactly' because of data precision issues. */
// TODO: see if we can avoid the need for this function
-int freq_is_nearly_equal(double a, double b) {
- return std::max(a,b) - std::min(a,b) < 1;
+int freq_is_nearly_equal(double a, double b)
+{
+ return std::max(a, b) - std::min(a, b) < 1;
}
/***********************************************************************
@@ -63,26 +60,29 @@ int freq_is_nearly_equal(double a, double b) {
/* This function takes in the calculated maximum number of FIR taps, and
* returns a number of taps that makes AD9361 happy. */
-int get_num_taps(int max_num_taps) {
-
- int num_taps = 0;
+int get_num_taps(int max_num_taps)
+{
+ int num_taps = 0;
int num_taps_list[] = {16, 32, 48, 64, 80, 96, 112, 128};
int i;
- for(i = 1; i < 8; i++) {
- if(max_num_taps >= num_taps_list[i]) {
+ for (i = 1; i < 8; i++) {
+ if (max_num_taps >= num_taps_list[i]) {
continue;
} else {
num_taps = num_taps_list[i - 1];
break;
}
- } if(num_taps == 0) { num_taps = 128; }
+ }
+ if (num_taps == 0) {
+ num_taps = 128;
+ }
return num_taps;
}
-const double ad9361_device_t::AD9361_MAX_GAIN = 89.75;
-const double ad9361_device_t::AD9361_MIN_CLOCK_RATE = 220e3;
-const double ad9361_device_t::AD9361_MAX_CLOCK_RATE = 61.44e6;
+const double ad9361_device_t::AD9361_MAX_GAIN = 89.75;
+const double ad9361_device_t::AD9361_MIN_CLOCK_RATE = 220e3;
+const double ad9361_device_t::AD9361_MAX_CLOCK_RATE = 61.44e6;
const double ad9361_device_t::AD9361_CAL_VALID_WINDOW = 100e6;
// Max bandwdith is due to filter rolloff in analog filter stage
const double ad9361_device_t::AD9361_MIN_BW = 200e3;
@@ -98,7 +98,8 @@ const double ad9361_device_t::DEFAULT_TX_FREQ = 850e6;
* how many taps are in the filter, and given a vector of the taps
* themselves. */
-void ad9361_device_t::_program_fir_filter(direction_t direction, chain_t chain, int num_taps, uint16_t *coeffs)
+void ad9361_device_t::_program_fir_filter(
+ direction_t direction, chain_t chain, int num_taps, uint16_t* coeffs)
{
uint16_t base;
@@ -115,14 +116,14 @@ void ad9361_device_t::_program_fir_filter(direction_t direction, chain_t chain,
uint8_t reg_chain = 0;
switch (chain) {
- case CHAIN_1:
- reg_chain = 0x01 << 3;
- break;
- case CHAIN_2:
- reg_chain = 0x02 << 3;
- break;
- default:
- reg_chain = 0x03 << 3;
+ case CHAIN_1:
+ reg_chain = 0x01 << 3;
+ break;
+ case CHAIN_2:
+ reg_chain = 0x02 << 3;
+ break;
+ default:
+ reg_chain = 0x03 << 3;
}
/* Turn on the filter clock. */
@@ -140,7 +141,8 @@ void ad9361_device_t::_program_fir_filter(direction_t direction, chain_t chain,
_io_iface->poke8(base + 4, 0x00);
}
- /* Iterate through indirect programming of filter coeffs using ADI recomended procedure */
+ /* Iterate through indirect programming of filter coeffs using ADI recomended
+ * procedure */
for (addr = 0; addr < num_taps; addr++) {
_io_iface->poke8(base + 0, addr);
_io_iface->poke8(base + 1, (coeffs[addr]) & 0xff);
@@ -151,23 +153,25 @@ void ad9361_device_t::_program_fir_filter(direction_t direction, chain_t chain,
}
/* UG-671 states (page 25) (paraphrased and clarified):
- " After the table has been programmed, write to register BASE+5 with the write bit D2 cleared and D1 high.
- Then, write to register BASE+5 again with D1 clear, thus ensuring that the write bit resets internally
- before the clock stops. Wait 4 sample clock periods after setting D2 high while that data writes into the table"
+ " After the table has been programmed, write to register BASE+5 with the write bit D2
+ cleared and D1 high. Then, write to register BASE+5 again with D1 clear, thus
+ ensuring that the write bit resets internally before the clock stops. Wait 4 sample
+ clock periods after setting D2 high while that data writes into the table"
*/
_io_iface->poke8(base + 5, reg_numtaps | reg_chain | (1 << 1));
if (direction == RX) {
- _io_iface->poke8(base + 5, reg_numtaps | reg_chain );
+ _io_iface->poke8(base + 5, reg_numtaps | reg_chain);
/* Rx Gain, set to prevent digital overflow/saturation in filters
0:+6dB, 1:0dB, 2:-6dB, 3:-12dB
page 35 of UG-671 */
- _io_iface->poke8(base + 6, 0x02); /* Also turn on -6dB Rx gain here, to stop filter overfow.*/
+ _io_iface->poke8(
+ base + 6, 0x02); /* Also turn on -6dB Rx gain here, to stop filter overfow.*/
} else {
/* Tx Gain. bit[0]. set to prevent digital overflow/saturation in filters
0: 0dB, 1:-6dB
page 25 of UG-671 */
- _io_iface->poke8(base + 5, reg_numtaps | reg_chain );
+ _io_iface->poke8(base + 5, reg_numtaps | reg_chain);
}
}
@@ -175,26 +179,31 @@ void ad9361_device_t::_program_fir_filter(direction_t direction, chain_t chain,
/* Program the RX FIR Filter. */
void ad9361_device_t::_setup_rx_fir(size_t num_taps, int32_t decimation)
{
- if (not (decimation == 1 or decimation == 2 or decimation == 4)) {
+ if (not(decimation == 1 or decimation == 2 or decimation == 4)) {
throw uhd::runtime_error("[ad9361_device_t] Invalid Rx FIR decimation.");
}
boost::scoped_array<uint16_t> coeffs(new uint16_t[num_taps]);
for (size_t i = 0; i < num_taps; i++) {
switch (num_taps) {
- case 128:
- coeffs[i] = uint16_t((decimation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);
- break;
- case 96:
- coeffs[i] = uint16_t((decimation==4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]);
- break;
- case 64:
- coeffs[i] = uint16_t((decimation==4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]);
- break;
- case 48:
- coeffs[i] = uint16_t((decimation==4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]);
- break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] Unsupported number of Rx FIR taps.");
+ case 128:
+ coeffs[i] =
+ uint16_t((decimation == 4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);
+ break;
+ case 96:
+ coeffs[i] =
+ uint16_t((decimation == 4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]);
+ break;
+ case 64:
+ coeffs[i] =
+ uint16_t((decimation == 4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]);
+ break;
+ case 48:
+ coeffs[i] =
+ uint16_t((decimation == 4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]);
+ break;
+ default:
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Unsupported number of Rx FIR taps.");
}
}
@@ -204,29 +213,35 @@ void ad9361_device_t::_setup_rx_fir(size_t num_taps, int32_t decimation)
/* Program the TX FIR Filter. */
void ad9361_device_t::_setup_tx_fir(size_t num_taps, int32_t interpolation)
{
- if (not (interpolation == 1 or interpolation == 2 or interpolation == 4)) {
+ if (not(interpolation == 1 or interpolation == 2 or interpolation == 4)) {
throw uhd::runtime_error("[ad9361_device_t] Invalid Tx FIR interpolation.");
}
if (interpolation == 1 and num_taps > 64) {
- throw uhd::runtime_error("[ad9361_device_t] Too many Tx FIR taps for interpolation value.");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Too many Tx FIR taps for interpolation value.");
}
boost::scoped_array<uint16_t> coeffs(new uint16_t[num_taps]);
for (size_t i = 0; i < num_taps; i++) {
switch (num_taps) {
- case 128:
- coeffs[i] = uint16_t((interpolation==4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);
- break;
- case 96:
- coeffs[i] = uint16_t((interpolation==4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]);
- break;
- case 64:
- coeffs[i] = uint16_t((interpolation==4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]);
- break;
- case 48:
- coeffs[i] = uint16_t((interpolation==4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]);
- break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] Unsupported number of Tx FIR taps.");
+ case 128:
+ coeffs[i] = uint16_t(
+ (interpolation == 4) ? fir_128_x4_coeffs[i] : hb127_coeffs[i]);
+ break;
+ case 96:
+ coeffs[i] =
+ uint16_t((interpolation == 4) ? fir_96_x4_coeffs[i] : hb95_coeffs[i]);
+ break;
+ case 64:
+ coeffs[i] =
+ uint16_t((interpolation == 4) ? fir_64_x4_coeffs[i] : hb63_coeffs[i]);
+ break;
+ case 48:
+ coeffs[i] =
+ uint16_t((interpolation == 4) ? fir_48_x4_coeffs[i] : hb47_coeffs[i]);
+ break;
+ default:
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Unsupported number of Tx FIR taps.");
}
}
@@ -310,9 +325,10 @@ void ad9361_device_t::_calibrate_synth_charge_pumps()
double ad9361_device_t::_calibrate_baseband_rx_analog_filter(double req_rfbw)
{
double bbbw = req_rfbw / 2.0;
- if(bbbw > _baseband_bw / 2.0)
- {
- UHD_LOGGER_DEBUG("AD936X")<< "baseband bandwidth too large for current sample rate. Setting bandwidth to: "<<_baseband_bw;
+ if (bbbw > _baseband_bw / 2.0) {
+ UHD_LOGGER_DEBUG("AD936X") << "baseband bandwidth too large for current sample "
+ "rate. Setting bandwidth to: "
+ << _baseband_bw;
bbbw = _baseband_bw / 2.0;
}
@@ -326,16 +342,17 @@ double ad9361_device_t::_calibrate_baseband_rx_analog_filter(double req_rfbw)
}
double rxtune_clk = ((1.4 * bbbw * 2 * M_PI) / M_LN2);
- _rx_bbf_tunediv = std::min<uint16_t>(511, uint16_t(std::ceil(_bbpll_freq / rxtune_clk)));
+ _rx_bbf_tunediv =
+ std::min<uint16_t>(511, uint16_t(std::ceil(_bbpll_freq / rxtune_clk)));
_regs.bbftune_config = (_regs.bbftune_config & 0xFE)
- | ((_rx_bbf_tunediv >> 8) & 0x0001);
+ | ((_rx_bbf_tunediv >> 8) & 0x0001);
- double bbbw_mhz = bbbw / 1e6;
- double temp = ((bbbw_mhz - std::floor(bbbw_mhz)) * 1000) / 7.8125;
+ double bbbw_mhz = bbbw / 1e6;
+ double temp = ((bbbw_mhz - std::floor(bbbw_mhz)) * 1000) / 7.8125;
uint8_t bbbw_khz = std::min<uint8_t>(127, uint8_t(std::floor(temp + 0.5)));
/* Set corner frequencies and dividers. */
- _io_iface->poke8(0x1fb, (uint8_t) (bbbw_mhz));
+ _io_iface->poke8(0x1fb, (uint8_t)(bbbw_mhz));
_io_iface->poke8(0x1fc, bbbw_khz);
_io_iface->poke8(0x1f8, (_rx_bbf_tunediv & 0x00FF));
_io_iface->poke8(0x1f9, _regs.bbftune_config);
@@ -377,9 +394,10 @@ double ad9361_device_t::_calibrate_baseband_tx_analog_filter(double req_rfbw)
{
double bbbw = req_rfbw / 2.0;
- if(bbbw > _baseband_bw / 2.0)
- {
- UHD_LOGGER_DEBUG("AD936X")<< "baseband bandwidth too large for current sample rate. Setting bandwidth to: "<<_baseband_bw;
+ if (bbbw > _baseband_bw / 2.0) {
+ UHD_LOGGER_DEBUG("AD936X") << "baseband bandwidth too large for current sample "
+ "rate. Setting bandwidth to: "
+ << _baseband_bw;
bbbw = _baseband_bw / 2.0;
}
@@ -393,9 +411,9 @@ double ad9361_device_t::_calibrate_baseband_tx_analog_filter(double req_rfbw)
}
double txtune_clk = ((1.6 * bbbw * 2 * M_PI) / M_LN2);
- uint16_t txbbfdiv = std::min<uint16_t>(511, uint16_t(std::ceil(_bbpll_freq / txtune_clk)));
- _regs.bbftune_mode = (_regs.bbftune_mode & 0xFE)
- | ((txbbfdiv >> 8) & 0x0001);
+ uint16_t txbbfdiv =
+ std::min<uint16_t>(511, uint16_t(std::ceil(_bbpll_freq / txtune_clk)));
+ _regs.bbftune_mode = (_regs.bbftune_mode & 0xFE) | ((txbbfdiv >> 8) & 0x0001);
/* Program the divider values. */
_io_iface->poke8(0x0d6, (txbbfdiv & 0x00FF));
@@ -432,9 +450,10 @@ double ad9361_device_t::_calibrate_secondary_tx_filter(double req_rfbw)
{
double bbbw = req_rfbw / 2.0;
- if(bbbw > _baseband_bw / 2.0)
- {
- UHD_LOGGER_DEBUG("AD936X")<< "baseband bandwidth too large for current sample rate. Setting bandwidth to: "<<_baseband_bw;
+ if (bbbw > _baseband_bw / 2.0) {
+ UHD_LOGGER_DEBUG("AD936X") << "baseband bandwidth too large for current sample "
+ "rate. Setting bandwidth to: "
+ << _baseband_bw;
bbbw = _baseband_bw / 2.0;
}
@@ -459,8 +478,9 @@ double ad9361_device_t::_calibrate_secondary_tx_filter(double req_rfbw)
int cap = 0;
int i;
for (i = 0; i <= 3; i++) {
- cap = static_cast<int>(std::floor(0.5 + ((1 / ((corner_freq * res) * 1e6)) * 1e12)))
- - 12;
+ cap =
+ static_cast<int>(std::floor(0.5 + ((1 / ((corner_freq * res) * 1e6)) * 1e12)))
+ - 12;
if (cap <= 63) {
break;
@@ -483,7 +503,8 @@ double ad9361_device_t::_calibrate_secondary_tx_filter(double req_rfbw)
reg0d0 = 0x57;
} else {
reg0d0 = 0x00;
- throw uhd::runtime_error("[ad9361_device_t] Cal2ndTxFil: INVALID_CODE_PATH bad bbbw_mhz");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Cal2ndTxFil: INVALID_CODE_PATH bad bbbw_mhz");
}
/* Translate resistor values to register settings. */
@@ -528,9 +549,10 @@ double ad9361_device_t::_calibrate_rx_TIAs(double req_rfbw)
double bbbw = req_rfbw / 2.0;
- if(bbbw > _baseband_bw / 2.0)
- {
- UHD_LOGGER_DEBUG("AD936X")<< "baseband bandwidth too large for current sample rate. Setting bandwidth to: "<<_baseband_bw;
+ if (bbbw > _baseband_bw / 2.0) {
+ UHD_LOGGER_DEBUG("AD936X") << "baseband bandwidth too large for current sample "
+ "rate. Setting bandwidth to: "
+ << _baseband_bw;
bbbw = _baseband_bw / 2.0;
}
@@ -545,8 +567,8 @@ double ad9361_device_t::_calibrate_rx_TIAs(double req_rfbw)
double ceil_bbbw_mhz = std::ceil(bbbw / 1e6);
/* Do some crazy resistor and capacitor math. */
- int Cbbf = (reg1eb * 160) + (reg1ec * 10) + 140;
- int R2346 = 18300 * (reg1e6 & 0x07);
+ int Cbbf = (reg1eb * 160) + (reg1ec * 10) + 140;
+ int R2346 = 18300 * (reg1e6 & 0x07);
double CTIA_fF = (Cbbf * R2346 * 0.56) / 3500;
/* Translate baseband BW to register settings. */
@@ -557,22 +579,23 @@ double ad9361_device_t::_calibrate_rx_TIAs(double req_rfbw)
} else if (ceil_bbbw_mhz > 10) {
reg1db = 0x20;
} else {
- throw uhd::runtime_error("[ad9361_device_t] CalRxTias: INVALID_CODE_PATH bad bbbw_mhz");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] CalRxTias: INVALID_CODE_PATH bad bbbw_mhz");
}
if (CTIA_fF > 2920) {
- reg1dc = 0x40;
- reg1de = 0x40;
- uint8_t temp = (uint8_t) std::min<uint8_t>(127,
- uint8_t(std::floor(0.5 + ((CTIA_fF - 400.0) / 320.0))));
+ reg1dc = 0x40;
+ reg1de = 0x40;
+ uint8_t temp = (uint8_t)std::min<uint8_t>(
+ 127, uint8_t(std::floor(0.5 + ((CTIA_fF - 400.0) / 320.0))));
reg1dd = temp;
reg1df = temp;
} else {
uint8_t temp = uint8_t(std::floor(0.5 + ((CTIA_fF - 400.0) / 40.0)) + 0x40);
- reg1dc = temp;
- reg1de = temp;
- reg1dd = 0;
- reg1df = 0;
+ reg1dc = temp;
+ reg1de = temp;
+ reg1dd = 0;
+ reg1df = 0;
}
/* w00t. Settings calculated. Program them and roll out. */
@@ -593,12 +616,12 @@ double ad9361_device_t::_calibrate_rx_TIAs(double req_rfbw)
* some of the 40 registers depend on the values in others. */
void ad9361_device_t::_setup_adc()
{
- double bbbw_mhz = (((_bbpll_freq / 1e6) / _rx_bbf_tunediv) * M_LN2) \
- / (1.4 * 2 * M_PI);
+ double bbbw_mhz =
+ (((_bbpll_freq / 1e6) / _rx_bbf_tunediv) * M_LN2) / (1.4 * 2 * M_PI);
/* For calibration, baseband BW is half the complex BW, and must be
* between 28e6 and 0.2e6. */
- if(bbbw_mhz > 28) {
+ if (bbbw_mhz > 28) {
bbbw_mhz = 28;
} else if (bbbw_mhz < 0.20) {
bbbw_mhz = 0.20;
@@ -606,101 +629,111 @@ void ad9361_device_t::_setup_adc()
uint8_t rxbbf_c3_msb = _io_iface->peek8(0x1eb) & 0x3F;
uint8_t rxbbf_c3_lsb = _io_iface->peek8(0x1ec) & 0x7F;
- uint8_t rxbbf_r2346 = _io_iface->peek8(0x1e6) & 0x07;
+ uint8_t rxbbf_r2346 = _io_iface->peek8(0x1e6) & 0x07;
double fsadc = _adcclock_freq / 1e6;
/* Sort out the RC time constant for our baseband bandwidth... */
double rc_timeconst = 0.0;
- if(bbbw_mhz < 18) {
- rc_timeconst = (1 / ((1.4 * 2 * M_PI) \
- * (18300 * rxbbf_r2346)
- * ((160e-15 * rxbbf_c3_msb)
- + (10e-15 * rxbbf_c3_lsb) + 140e-15)
- * (bbbw_mhz * 1e6)));
+ if (bbbw_mhz < 18) {
+ rc_timeconst =
+ (1
+ / ((1.4 * 2 * M_PI) * (18300 * rxbbf_r2346)
+ * ((160e-15 * rxbbf_c3_msb) + (10e-15 * rxbbf_c3_lsb) + 140e-15)
+ * (bbbw_mhz * 1e6)));
} else {
- rc_timeconst = (1 / ((1.4 * 2 * M_PI) \
- * (18300 * rxbbf_r2346)
- * ((160e-15 * rxbbf_c3_msb)
- + (10e-15 * rxbbf_c3_lsb) + 140e-15)
- * (bbbw_mhz * 1e6) * (1 + (0.01 * (bbbw_mhz - 18)))));
+ rc_timeconst =
+ (1
+ / ((1.4 * 2 * M_PI) * (18300 * rxbbf_r2346)
+ * ((160e-15 * rxbbf_c3_msb) + (10e-15 * rxbbf_c3_lsb) + 140e-15)
+ * (bbbw_mhz * 1e6) * (1 + (0.01 * (bbbw_mhz - 18)))));
}
double scale_res = sqrt(1 / rc_timeconst);
double scale_cap = sqrt(1 / rc_timeconst);
double scale_snr = (_adcclock_freq < 80e6) ? 1.0 : 1.584893192;
- double maxsnr = 640 / 160;
+ double maxsnr = 640 / 160;
/* Calculate the values for all 40 settings registers.
*
* DO NOT TOUCH THIS UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING. kthx.*/
uint8_t data[40];
- data[0] = 0; data[1] = 0; data[2] = 0; data[3] = 0x24;
- data[4] = 0x24; data[5] = 0; data[6] = 0;
- data[7] = std::min<uint8_t>(124, uint8_t(std::floor(-0.5
- + (80.0 * scale_snr * scale_res
- * std::min<double>(1.0, sqrt(maxsnr * fsadc / 640.0))))));
+ data[0] = 0;
+ data[1] = 0;
+ data[2] = 0;
+ data[3] = 0x24;
+ data[4] = 0x24;
+ data[5] = 0;
+ data[6] = 0;
+ data[7] = std::min<uint8_t>(124,
+ uint8_t(
+ std::floor(-0.5
+ + (80.0 * scale_snr * scale_res
+ * std::min<double>(1.0, sqrt(maxsnr * fsadc / 640.0))))));
double data007 = data[7];
- data[8] = std::min<uint8_t>(255, uint8_t(std::floor(0.5
- + ((20.0 * (640.0 / fsadc) * ((data007 / 80.0))
- / (scale_res * scale_cap))))));
- data[10] = std::min<uint8_t>(127, uint8_t(std::floor(-0.5 + (77.0 * scale_res
- * std::min<double>(1.0, sqrt(maxsnr * fsadc / 640.0))))));
+ data[8] = std::min<uint8_t>(255,
+ uint8_t(std::floor(0.5
+ + ((20.0 * (640.0 / fsadc) * ((data007 / 80.0))
+ / (scale_res * scale_cap))))));
+ data[10] = std::min<uint8_t>(127,
+ uint8_t(std::floor(
+ -0.5
+ + (77.0 * scale_res * std::min<double>(1.0, sqrt(maxsnr * fsadc / 640.0))))));
double data010 = data[10];
- data[9] = std::min<uint8_t>(127, uint8_t(std::floor(0.8 * data010)));
- data[11] = std::min<uint8_t>(255, uint8_t(std::floor(0.5
- + (20.0 * (640.0 / fsadc) * ((data010 / 77.0)
- / (scale_res * scale_cap))))));
- data[12] = std::min<uint8_t>(127, uint8_t(std::floor(-0.5
- + (80.0 * scale_res * std::min<double>(1.0,
- sqrt(maxsnr * fsadc / 640.0))))));
+ data[9] = std::min<uint8_t>(127, uint8_t(std::floor(0.8 * data010)));
+ data[11] = std::min<uint8_t>(255,
+ uint8_t(std::floor(
+ 0.5
+ + (20.0 * (640.0 / fsadc) * ((data010 / 77.0) / (scale_res * scale_cap))))));
+ data[12] = std::min<uint8_t>(127,
+ uint8_t(std::floor(
+ -0.5
+ + (80.0 * scale_res * std::min<double>(1.0, sqrt(maxsnr * fsadc / 640.0))))));
double data012 = data[12];
- data[13] = std::min<uint8_t>(255, uint8_t(std::floor(-1.5
- + (20.0 * (640.0 / fsadc) * ((data012 / 80.0)
- / (scale_res * scale_cap))))));
- data[14] = 21 * uint8_t(std::floor(0.1 * 640.0 / fsadc));
- data[15] = std::min<uint8_t>(127, uint8_t(1.025 * data007));
+ data[13] = std::min<uint8_t>(255,
+ uint8_t(std::floor(
+ -1.5
+ + (20.0 * (640.0 / fsadc) * ((data012 / 80.0) / (scale_res * scale_cap))))));
+ data[14] = 21 * uint8_t(std::floor(0.1 * 640.0 / fsadc));
+ data[15] = std::min<uint8_t>(127, uint8_t(1.025 * data007));
double data015 = data[15];
- data[16] = std::min<uint8_t>(127, uint8_t(std::floor((data015
- * (0.98 + (0.02 * std::max<double>(1.0,
- (640.0 / fsadc) / maxsnr)))))));
- data[17] = data[15];
- data[18] = std::min<uint8_t>(127, uint8_t(0.975 * (data010)));
+ data[16] = std::min<uint8_t>(127,
+ uint8_t(std::floor(
+ (data015
+ * (0.98 + (0.02 * std::max<double>(1.0, (640.0 / fsadc) / maxsnr)))))));
+ data[17] = data[15];
+ data[18] = std::min<uint8_t>(127, uint8_t(0.975 * (data010)));
double data018 = data[18];
- data[19] = std::min<uint8_t>(127, uint8_t(std::floor((data018
- * (0.98 + (0.02 * std::max<double>(1.0,
- (640.0 / fsadc) / maxsnr)))))));
- data[20] = data[18];
- data[21] = std::min<uint8_t>(127, uint8_t(0.975 * data012));
+ data[19] = std::min<uint8_t>(127,
+ uint8_t(std::floor(
+ (data018
+ * (0.98 + (0.02 * std::max<double>(1.0, (640.0 / fsadc) / maxsnr)))))));
+ data[20] = data[18];
+ data[21] = std::min<uint8_t>(127, uint8_t(0.975 * data012));
double data021 = data[21];
- data[22] = std::min<uint8_t>(127, uint8_t(std::floor((data021
- * (0.98 + (0.02 * std::max<double>(1.0,
- (640.0 / fsadc) / maxsnr)))))));
- data[23] = data[21];
- data[24] = 0x2e;
- data[25] = uint8_t(std::floor(128.0 + std::min<double>(63.0,
- 63.0 * (fsadc / 640.0))));
- data[26] = uint8_t(std::floor(std::min<double>(63.0, 63.0 * (fsadc / 640.0)
- * (0.92 + (0.08 * (640.0 / fsadc))))));
- data[27] = uint8_t(std::floor(std::min<double>(63.0,
- 32.0 * sqrt(fsadc / 640.0))));
- data[28] = uint8_t(std::floor(128.0 + std::min<double>(63.0,
- 63.0 * (fsadc / 640.0))));
- data[29] = uint8_t(std::floor(std::min<double>(63.0,
- 63.0 * (fsadc / 640.0)
- * (0.92 + (0.08 * (640.0 / fsadc))))));
- data[30] = uint8_t(std::floor(std::min<double>(63.0,
- 32.0 * sqrt(fsadc / 640.0))));
- data[31] = uint8_t(std::floor(128.0 + std::min<double>(63.0,
- 63.0 * (fsadc / 640.0))));
- data[32] = uint8_t(std::floor(std::min<double>(63.0,
- 63.0 * (fsadc / 640.0) * (0.92
- + (0.08 * (640.0 / fsadc))))));
- data[33] = uint8_t(std::floor(std::min<double>(63.0,
- 63.0 * sqrt(fsadc / 640.0))));
- data[34] = std::min<uint8_t>(127, uint8_t(std::floor(64.0
- * sqrt(fsadc / 640.0))));
+ data[22] = std::min<uint8_t>(127,
+ uint8_t(std::floor(
+ (data021
+ * (0.98 + (0.02 * std::max<double>(1.0, (640.0 / fsadc) / maxsnr)))))));
+ data[23] = data[21];
+ data[24] = 0x2e;
+ data[25] =
+ uint8_t(std::floor(128.0 + std::min<double>(63.0, 63.0 * (fsadc / 640.0))));
+ data[26] = uint8_t(std::floor(std::min<double>(
+ 63.0, 63.0 * (fsadc / 640.0) * (0.92 + (0.08 * (640.0 / fsadc))))));
+ data[27] = uint8_t(std::floor(std::min<double>(63.0, 32.0 * sqrt(fsadc / 640.0))));
+ data[28] =
+ uint8_t(std::floor(128.0 + std::min<double>(63.0, 63.0 * (fsadc / 640.0))));
+ data[29] = uint8_t(std::floor(std::min<double>(
+ 63.0, 63.0 * (fsadc / 640.0) * (0.92 + (0.08 * (640.0 / fsadc))))));
+ data[30] = uint8_t(std::floor(std::min<double>(63.0, 32.0 * sqrt(fsadc / 640.0))));
+ data[31] =
+ uint8_t(std::floor(128.0 + std::min<double>(63.0, 63.0 * (fsadc / 640.0))));
+ data[32] = uint8_t(std::floor(std::min<double>(
+ 63.0, 63.0 * (fsadc / 640.0) * (0.92 + (0.08 * (640.0 / fsadc))))));
+ data[33] = uint8_t(std::floor(std::min<double>(63.0, 63.0 * sqrt(fsadc / 640.0))));
+ data[34] = std::min<uint8_t>(127, uint8_t(std::floor(64.0 * sqrt(fsadc / 640.0))));
data[35] = 0x40;
data[36] = 0x40;
data[37] = 0x2c;
@@ -708,8 +741,8 @@ void ad9361_device_t::_setup_adc()
data[39] = 0x00;
/* Program the registers! */
- for(size_t i = 0; i < 40; i++) {
- _io_iface->poke8(0x200+i, data[i]);
+ for (size_t i = 0; i < 40; i++) {
+ _io_iface->poke8(0x200 + i, data[i]);
}
}
@@ -718,11 +751,12 @@ void ad9361_device_t::_setup_adc()
*/
void ad9361_device_t::_calibrate_baseband_dc_offset()
{
- _io_iface->poke8(0x18b, 0x83); //Reset RF DC tracking flag
+ _io_iface->poke8(0x18b, 0x83); // Reset RF DC tracking flag
_io_iface->poke8(0x193, 0x3f); // Calibration settings
_io_iface->poke8(0x190, 0x0f); // Set tracking coefficient
- //write_ad9361_reg(device, 0x190, /*0x0f*//*0xDF*/0x80*1 | 0x40*1 | (16+8/*+4*/)); // Set tracking coefficient: don't *4 counter, do decim /4, increased gain shift
+ // write_ad9361_reg(device, 0x190, /*0x0f*//*0xDF*/0x80*1 | 0x40*1 | (16+8/*+4*/)); //
+ // Set tracking coefficient: don't *4 counter, do decim /4, increased gain shift
_io_iface->poke8(0x194, 0x01); // More calibration settings
/* Start that calibration, baby. */
@@ -730,7 +764,8 @@ void ad9361_device_t::_calibrate_baseband_dc_offset()
_io_iface->poke8(0x016, 0x01);
while (_io_iface->peek8(0x016) & 0x01) {
if (count > 100) {
- throw uhd::runtime_error("[ad9361_device_t] Baseband DC Offset Calibration Failure");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Baseband DC Offset Calibration Failure");
break;
}
count++;
@@ -763,7 +798,8 @@ void ad9361_device_t::_calibrate_rf_dc_offset()
_io_iface->poke8(0x016, 0x02);
while (_io_iface->peek8(0x016) & 0x02) {
if (count > 200) {
- throw uhd::runtime_error("[ad9361_device_t] RF DC Offset Calibration Failure");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] RF DC Offset Calibration Failure");
break;
}
count++;
@@ -814,7 +850,8 @@ void ad9361_device_t::_calibrate_rx_quadrature()
_io_iface->poke8(0x016, 0x20);
while (_io_iface->peek8(0x016) & 0x20) {
if (count > 1000) {
- throw uhd::runtime_error("[ad9361_device_t] Rx Quadrature Calibration Failure");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Rx Quadrature Calibration Failure");
break;
}
count++;
@@ -831,15 +868,15 @@ void ad9361_device_t::_calibrate_rx_quadrature()
* The TX quadrature needs to be done twice, once for each TX chain, with
* only one register change in between. Thus, this function enacts the
* calibrations, and it is called from calibrate_tx_quadrature. */
-void ad9361_device_t::_tx_quadrature_cal_routine() {
-
+void ad9361_device_t::_tx_quadrature_cal_routine()
+{
/* This is a weird process, but here is how it works:
* 1) Read the calibrated NCO frequency bits out of 0A3.
* 2) Write the two bits to the RX NCO freq part of 0A0.
* 3) Re-read 0A3 to get bits [5:0] because maybe they changed?
* 4) Update only the TX NCO freq bits in 0A3.
* 5) Profit (I hope). */
- uint8_t reg0a3 = _io_iface->peek8(0x0a3);
+ uint8_t reg0a3 = _io_iface->peek8(0x0a3);
uint8_t nco_freq = (reg0a3 & 0xC0);
_io_iface->poke8(0x0a0, 0x15 | (nco_freq >> 1));
reg0a3 = _io_iface->peek8(0x0a3);
@@ -849,8 +886,8 @@ void ad9361_device_t::_tx_quadrature_cal_routine() {
* where the two test tones used for quadrature calibration are outside
* of the RX BBF, and therefore don't make it to the ADC. We will check
* for that scenario here. */
- double max_cal_freq = (((_baseband_bw * _tfir_factor)
- * ((nco_freq >> 6) + 1)) / 32) * 2;
+ double max_cal_freq =
+ (((_baseband_bw * _tfir_factor) * ((nco_freq >> 6) + 1)) / 32) * 2;
double bbbw = _baseband_bw / 2.0; // bbbw represents the one-sided BW
if (bbbw > 28e6) {
bbbw = 28e6;
@@ -882,7 +919,8 @@ void ad9361_device_t::_tx_quadrature_cal_routine() {
_io_iface->poke8(0x016, 0x10);
while (_io_iface->peek8(0x016) & 0x10) {
if (count > 100) {
- throw uhd::runtime_error("[ad9361_device_t] TX Quadrature Calibration Failure");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] TX Quadrature Calibration Failure");
break;
}
count++;
@@ -897,7 +935,8 @@ void ad9361_device_t::_calibrate_tx_quadrature()
/* Make sure we are, in fact, in the ALERT state. If not, something is
* terribly wrong in the driver execution flow. */
if ((_io_iface->peek8(0x017) & 0x0F) != 5) {
- throw uhd::runtime_error("[ad9361_device_t] TX Quad Cal started, but not in ALERT");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] TX Quad Cal started, but not in ALERT");
}
/* Turn off free-running and continuous calibrations. Note that this
@@ -974,19 +1013,20 @@ void ad9361_device_t::_program_mixer_gm_subtable()
/* Program the gain table.
*
* There are three different gain tables for different frequency ranges! */
-void ad9361_device_t::_program_gain_table() {
+void ad9361_device_t::_program_gain_table()
+{
/* Figure out which gain table we should be using for our current
* frequency band. */
- uint8_t (*gain_table)[3] = NULL;
+ uint8_t(*gain_table)[3] = NULL;
uint8_t new_gain_table;
if (_rx_freq < 1300e6) {
- gain_table = gain_table_sub_1300mhz;
+ gain_table = gain_table_sub_1300mhz;
new_gain_table = 1;
} else if (_rx_freq < 4e9) {
- gain_table = gain_table_1300mhz_to_4000mhz;
+ gain_table = gain_table_1300mhz_to_4000mhz;
new_gain_table = 2;
} else if (_rx_freq <= 6e9) {
- gain_table = gain_table_4000mhz_to_6000mhz;
+ gain_table = gain_table_4000mhz_to_6000mhz;
new_gain_table = 3;
} else {
new_gain_table = 1;
@@ -1112,17 +1152,17 @@ void ad9361_device_t::_setup_synth(direction_t direction, double vcorate)
/* Parse the values out of the LUT based on our calculated index... */
uint8_t vco_output_level = synth_cal_lut[vcoindex][0];
- uint8_t vco_varactor = synth_cal_lut[vcoindex][1];
- uint8_t vco_bias_ref = synth_cal_lut[vcoindex][2];
- uint8_t vco_bias_tcf = synth_cal_lut[vcoindex][3];
- uint8_t vco_cal_offset = synth_cal_lut[vcoindex][4];
+ uint8_t vco_varactor = synth_cal_lut[vcoindex][1];
+ uint8_t vco_bias_ref = synth_cal_lut[vcoindex][2];
+ uint8_t vco_bias_tcf = synth_cal_lut[vcoindex][3];
+ uint8_t vco_cal_offset = synth_cal_lut[vcoindex][4];
uint8_t vco_varactor_ref = synth_cal_lut[vcoindex][5];
uint8_t charge_pump_curr = synth_cal_lut[vcoindex][6];
- uint8_t loop_filter_c2 = synth_cal_lut[vcoindex][7];
- uint8_t loop_filter_c1 = synth_cal_lut[vcoindex][8];
- uint8_t loop_filter_r1 = synth_cal_lut[vcoindex][9];
- uint8_t loop_filter_c3 = synth_cal_lut[vcoindex][10];
- uint8_t loop_filter_r3 = synth_cal_lut[vcoindex][11];
+ uint8_t loop_filter_c2 = synth_cal_lut[vcoindex][7];
+ uint8_t loop_filter_c1 = synth_cal_lut[vcoindex][8];
+ uint8_t loop_filter_r1 = synth_cal_lut[vcoindex][9];
+ uint8_t loop_filter_c3 = synth_cal_lut[vcoindex][10];
+ uint8_t loop_filter_r3 = synth_cal_lut[vcoindex][11];
/* ... annnd program! */
if (direction == RX) {
@@ -1171,8 +1211,8 @@ double ad9361_device_t::_tune_bbvco(const double rate)
_req_coreclk = rate;
- const double fref = 40e6;
- const int modulus = 2088960;
+ const double fref = 40e6;
+ const int modulus = 2088960;
const double vcomax = 1430e6;
const double vcomin = 672e6;
double vcorate;
@@ -1181,7 +1221,7 @@ double ad9361_device_t::_tune_bbvco(const double rate)
/* Iterate over VCO dividers until appropriate divider is found. */
int i = 1;
for (; i <= 6; i++) {
- vcodiv = 1 << i;
+ vcodiv = 1 << i;
vcorate = rate * vcodiv;
if (vcorate >= vcomin && vcorate <= vcomax)
@@ -1196,40 +1236,40 @@ double ad9361_device_t::_tune_bbvco(const double rate)
/* Fo = Fref * (Nint + Nfrac / mod) */
int nint = static_cast<int>(vcorate / fref);
UHD_LOG_TRACE("AD936X", "[ad9361_device_t::_tune_bbvco] (nint)=" << (vcorate / fref));
- int nfrac = static_cast<int>(boost::math::round(((vcorate / fref) - (double) nint) * (double) modulus));
+ int nfrac = static_cast<int>(
+ boost::math::round(((vcorate / fref) - (double)nint) * (double)modulus));
UHD_LOG_TRACE("AD936X",
"[ad9361_device_t::_tune_bbvco] (nfrac)=" << ((vcorate / fref) - (double)nint)
* (double)modulus);
UHD_LOG_TRACE("AD936X",
boost::format("[ad9361_device_t::_tune_bbvco] nint=%d nfrac=%d") % nint % nfrac);
- double actual_vcorate = fref
- * ((double) nint + ((double) nfrac / (double) modulus));
+ double actual_vcorate = fref * ((double)nint + ((double)nfrac / (double)modulus));
/* Scale CP current according to VCO rate */
- const double icp_baseline = 150e-6;
+ const double icp_baseline = 150e-6;
const double freq_baseline = 1280e6;
- double icp = icp_baseline * (actual_vcorate / freq_baseline);
- int icp_reg = static_cast<int>(icp / 25e-6) - 1;
+ double icp = icp_baseline * (actual_vcorate / freq_baseline);
+ int icp_reg = static_cast<int>(icp / 25e-6) - 1;
- _io_iface->poke8(0x045, 0x00); // REFCLK / 1 to BBPLL
- _io_iface->poke8(0x046, icp_reg & 0x3F); // CP current
- _io_iface->poke8(0x048, 0xe8); // BBPLL loop filters
- _io_iface->poke8(0x049, 0x5b); // BBPLL loop filters
- _io_iface->poke8(0x04a, 0x35); // BBPLL loop filters
+ _io_iface->poke8(0x045, 0x00); // REFCLK / 1 to BBPLL
+ _io_iface->poke8(0x046, icp_reg & 0x3F); // CP current
+ _io_iface->poke8(0x048, 0xe8); // BBPLL loop filters
+ _io_iface->poke8(0x049, 0x5b); // BBPLL loop filters
+ _io_iface->poke8(0x04a, 0x35); // BBPLL loop filters
_io_iface->poke8(0x04b, 0xe0);
- _io_iface->poke8(0x04e, 0x10); // Max accuracy
+ _io_iface->poke8(0x04e, 0x10); // Max accuracy
- _io_iface->poke8(0x043, nfrac & 0xFF); // Nfrac[7:0]
- _io_iface->poke8(0x042, (nfrac >> 8) & 0xFF); // Nfrac[15:8]
+ _io_iface->poke8(0x043, nfrac & 0xFF); // Nfrac[7:0]
+ _io_iface->poke8(0x042, (nfrac >> 8) & 0xFF); // Nfrac[15:8]
_io_iface->poke8(0x041, (nfrac >> 16) & 0xFF); // Nfrac[23:16]
- _io_iface->poke8(0x044, nint); // Nint
+ _io_iface->poke8(0x044, nint); // Nint
_calibrate_lock_bbpll();
_regs.bbpll = (_regs.bbpll & 0xF8) | i;
- _bbpll_freq = actual_vcorate;
+ _bbpll_freq = actual_vcorate;
_adcclock_freq = (actual_vcorate / vcodiv);
return _adcclock_freq;
@@ -1242,10 +1282,10 @@ double ad9361_device_t::_tune_bbvco(const double rate)
* settings to the appropriate index after a re-tune. */
void ad9361_device_t::_reprogram_gains()
{
- set_gain(RX, CHAIN_1,_rx1_gain);
- set_gain(RX, CHAIN_2,_rx2_gain);
- set_gain(TX, CHAIN_1,_tx1_gain);
- set_gain(TX, CHAIN_2,_tx2_gain);
+ set_gain(RX, CHAIN_1, _rx1_gain);
+ set_gain(RX, CHAIN_2, _rx2_gain);
+ set_gain(TX, CHAIN_1, _tx1_gain);
+ set_gain(TX, CHAIN_2, _tx2_gain);
}
/* This is the internal tune function, not available for a host call.
@@ -1255,8 +1295,8 @@ void ad9361_device_t::_reprogram_gains()
double ad9361_device_t::_tune_helper(direction_t direction, const double value)
{
/* The RFPLL runs from 6 GHz - 12 GHz */
- const double fref = 80e6;
- const int modulus = 8388593;
+ const double fref = 80e6;
+ const int modulus = 8388593;
const double vcomax = 12e9;
const double vcomin = 6e9;
double vcorate;
@@ -1265,7 +1305,7 @@ double ad9361_device_t::_tune_helper(direction_t direction, const double value)
/* Iterate over VCO dividers until appropriate divider is found. */
int i;
for (i = 0; i <= 6; i++) {
- vcodiv = 2 << i;
+ vcodiv = 2 << i;
vcorate = value * vcodiv;
if (vcorate >= vcomin && vcorate <= vcomax)
break;
@@ -1273,30 +1313,27 @@ double ad9361_device_t::_tune_helper(direction_t direction, const double value)
if (i == 7)
throw uhd::runtime_error("[ad9361_device_t] RFVCO can't find valid VCO rate!");
- int nint = static_cast<int>(vcorate / fref);
+ int nint = static_cast<int>(vcorate / fref);
int nfrac = static_cast<int>(((vcorate / fref) - nint) * modulus);
- double actual_vcorate = fref * (nint + (double) (nfrac) / modulus);
- double actual_lo = actual_vcorate / vcodiv;
+ double actual_vcorate = fref * (nint + (double)(nfrac) / modulus);
+ double actual_lo = actual_vcorate / vcodiv;
if (direction == RX) {
-
_req_rx_freq = value;
/* Set band-specific settings. */
if (value < _client_params->get_band_edge(AD9361_RX_BAND0)) {
_regs.inputsel = (_regs.inputsel & 0xC0) | 0x30; // Port C, balanced
- } else if ((value
- >= _client_params->get_band_edge(AD9361_RX_BAND0))
- && (value
- < _client_params->get_band_edge(AD9361_RX_BAND1))) {
+ } else if ((value >= _client_params->get_band_edge(AD9361_RX_BAND0))
+ && (value < _client_params->get_band_edge(AD9361_RX_BAND1))) {
_regs.inputsel = (_regs.inputsel & 0xC0) | 0x0C; // Port B, balanced
- } else if ((value
- >= _client_params->get_band_edge(AD9361_RX_BAND1))
- && (value <= 6e9)) {
+ } else if ((value >= _client_params->get_band_edge(AD9361_RX_BAND1))
+ && (value <= 6e9)) {
_regs.inputsel = (_regs.inputsel & 0xC0) | 0x03; // Port A, balanced
} else {
- throw uhd::runtime_error("[ad9361_device_t] [_tune_helper] INVALID_CODE_PATH");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [_tune_helper] INVALID_CODE_PATH");
}
_io_iface->poke8(0x004, _regs.inputsel);
@@ -1326,18 +1363,17 @@ double ad9361_device_t::_tune_helper(direction_t direction, const double value)
return actual_lo;
} else {
-
_req_tx_freq = value;
/* Set band-specific settings. */
if (value < _client_params->get_band_edge(AD9361_TX_BAND0)) {
_regs.inputsel = _regs.inputsel | 0x40;
- } else if ((value
- >= _client_params->get_band_edge(AD9361_TX_BAND0))
- && (value <= 6e9)) {
+ } else if ((value >= _client_params->get_band_edge(AD9361_TX_BAND0))
+ && (value <= 6e9)) {
_regs.inputsel = _regs.inputsel & 0xBF;
} else {
- throw uhd::runtime_error("[ad9361_device_t] [_tune_helper] INVALID_CODE_PATH");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [_tune_helper] INVALID_CODE_PATH");
}
_io_iface->poke8(0x004, _regs.inputsel);
@@ -1387,8 +1423,8 @@ double ad9361_device_t::_setup_rates(const double rate)
* bring-up, and then they will be switched out to reflect the actual
* user-requested antenna selections. */
int divfactor = 0;
- _tfir_factor = 0;
- _rfir_factor = 0;
+ _tfir_factor = 0;
+ _rfir_factor = 0;
if (rate < 0.33e6) {
// RX1 + RX2 enabled, 3, 2, 2, 4
@@ -1397,7 +1433,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 3, 2, 2, 4
_regs.txfilt = B8(11101111);
- divfactor = 48;
+ divfactor = 48;
_tfir_factor = 4;
_rfir_factor = 4;
} else if (rate < 0.66e6) {
@@ -1407,7 +1443,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 2, 2, 2, 4
_regs.txfilt = B8(11011111);
- divfactor = 32;
+ divfactor = 32;
_tfir_factor = 4;
_rfir_factor = 4;
} else if (rate <= 20e6) {
@@ -1417,7 +1453,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 2, 2, 2, 2
_regs.txfilt = B8(11011110);
- divfactor = 16;
+ divfactor = 16;
_tfir_factor = 2;
_rfir_factor = 2;
} else if ((rate > 20e6) && (rate < 23e6)) {
@@ -1427,7 +1463,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 3, 1, 2, 2
_regs.txfilt = B8(11100110);
- divfactor = 24;
+ divfactor = 24;
_tfir_factor = 2;
_rfir_factor = 2;
} else if ((rate >= 23e6) && (rate < 41e6)) {
@@ -1437,7 +1473,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 1, 2, 2, 2
_regs.txfilt = B8(11001110);
- divfactor = 16;
+ divfactor = 16;
_tfir_factor = 2;
_rfir_factor = 2;
} else if ((rate >= 41e6) && (rate <= 58e6)) {
@@ -1447,7 +1483,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 3, 1, 1, 2
_regs.txfilt = B8(11100010);
- divfactor = 12;
+ divfactor = 12;
_tfir_factor = 2;
_rfir_factor = 2;
} else if ((rate > 58e6) && (rate <= 61.44e6)) {
@@ -1458,7 +1494,7 @@ double ad9361_device_t::_setup_rates(const double rate)
// TX1 + TX2 enabled, 2, 1, 1, 2
_regs.txfilt = B8(11010010);
- divfactor = 8;
+ divfactor = 8;
_tfir_factor = 2;
_rfir_factor = 2;
} else {
@@ -1470,14 +1506,14 @@ double ad9361_device_t::_setup_rates(const double rate)
/* Tune the BBPLL to get the ADC and DAC clocks. */
const double adcclk = _tune_bbvco(rate * divfactor);
- double dacclk = adcclk;
+ double dacclk = adcclk;
/* The DAC clock must be <= 336e6, and is either the ADC clock or 1/2 the
* ADC clock.*/
if (adcclk > 336e6) {
/* Make the DAC clock = ADC/2 */
_regs.bbpll = _regs.bbpll | 0x08;
- dacclk = adcclk / 2.0;
+ dacclk = adcclk / 2.0;
} else {
_regs.bbpll = _regs.bbpll & 0xF7;
}
@@ -1492,24 +1528,27 @@ double ad9361_device_t::_setup_rates(const double rate)
_baseband_bw = (adcclk / divfactor);
/*
- The Tx & Rx FIR calculate 16 taps per clock cycle. This limits the number of available taps to the ratio of DAC_CLK/ADC_CLK
- to the input data rate multiplied by 16. For example, if the input data rate is 25 MHz and DAC_CLK is 100 MHz,
- then the ratio of DAC_CLK to the input data rate is 100/25 or 4. In this scenario, the total number of taps available is 64.
-
- Also, whilst the Rx FIR filter always has memory available for 128 taps, the Tx FIR Filter can only support a maximum length of 64 taps
- in 1x interpolation mode, and 128 taps in 2x & 4x modes.
+ The Tx & Rx FIR calculate 16 taps per clock cycle. This limits the number of
+ available taps to the ratio of DAC_CLK/ADC_CLK to the input data rate multiplied
+ by 16. For example, if the input data rate is 25 MHz and DAC_CLK is 100 MHz, then the
+ ratio of DAC_CLK to the input data rate is 100/25 or 4. In this scenario, the total
+ number of taps available is 64.
+
+ Also, whilst the Rx FIR filter always has memory available for 128 taps, the Tx FIR
+ Filter can only support a maximum length of 64 taps in 1x interpolation mode, and 128
+ taps in 2x & 4x modes.
*/
- const size_t max_tx_taps = std::min<size_t>(
- std::min<size_t>((16 * (int)((dacclk / rate) + 0.5)), 128),
+ const size_t max_tx_taps =
+ std::min<size_t>(std::min<size_t>((16 * (int)((dacclk / rate) + 0.5)), 128),
(_tfir_factor == 1) ? 64 : 128);
- const size_t max_rx_taps = std::min<size_t>((16 * (size_t)((adcclk / rate) + 0.5)),
- 128);
+ const size_t max_rx_taps =
+ std::min<size_t>((16 * (size_t)((adcclk / rate) + 0.5)), 128);
const size_t num_tx_taps = get_num_taps(max_tx_taps);
const size_t num_rx_taps = get_num_taps(max_rx_taps);
- _setup_tx_fir(num_tx_taps,_tfir_factor);
- _setup_rx_fir(num_rx_taps,_rfir_factor);
+ _setup_tx_fir(num_tx_taps, _tfir_factor);
+ _setup_rx_fir(num_rx_taps, _rfir_factor);
return _baseband_bw;
}
@@ -1522,42 +1561,42 @@ void ad9361_device_t::initialize()
std::lock_guard<std::recursive_mutex> lock(_mutex);
/* Initialize shadow registers. */
- _regs.vcodivs = 0x00;
- _regs.inputsel = 0x30;
- _regs.rxfilt = 0x00;
- _regs.txfilt = 0x00;
- _regs.bbpll = 0x02;
+ _regs.vcodivs = 0x00;
+ _regs.inputsel = 0x30;
+ _regs.rxfilt = 0x00;
+ _regs.txfilt = 0x00;
+ _regs.bbpll = 0x02;
_regs.bbftune_config = 0x1e;
- _regs.bbftune_mode = 0x1e;
+ _regs.bbftune_mode = 0x1e;
/* Initialize private VRQ fields. */
- _rx_freq = DEFAULT_RX_FREQ;
- _tx_freq = DEFAULT_TX_FREQ;
- _req_rx_freq = 0.0;
- _req_tx_freq = 0.0;
- _baseband_bw = 0.0;
- _req_clock_rate = 0.0;
- _req_coreclk = 0.0;
- _bbpll_freq = 0.0;
- _adcclock_freq = 0.0;
- _rx_bbf_tunediv = 0;
- _curr_gain_table = 0;
- _rx1_gain = 0;
- _rx2_gain = 0;
- _tx1_gain = 0;
- _tx2_gain = 0;
- _use_dc_offset_tracking = true;
+ _rx_freq = DEFAULT_RX_FREQ;
+ _tx_freq = DEFAULT_TX_FREQ;
+ _req_rx_freq = 0.0;
+ _req_tx_freq = 0.0;
+ _baseband_bw = 0.0;
+ _req_clock_rate = 0.0;
+ _req_coreclk = 0.0;
+ _bbpll_freq = 0.0;
+ _adcclock_freq = 0.0;
+ _rx_bbf_tunediv = 0;
+ _curr_gain_table = 0;
+ _rx1_gain = 0;
+ _rx2_gain = 0;
+ _tx1_gain = 0;
+ _tx2_gain = 0;
+ _use_dc_offset_tracking = true;
_use_iq_balance_tracking = true;
- _rx1_agc_mode = GAIN_MODE_SLOW_AGC;
- _rx2_agc_mode = GAIN_MODE_SLOW_AGC;
- _rx1_agc_enable = false;
- _rx2_agc_enable = false;
- _rx_analog_bw = 0;
- _tx_analog_bw = 0;
- _rx_tia_lp_bw = 0;
- _tx_sec_lp_bw = 0;
- _rx_bb_lp_bw = 0;
- _tx_bb_lp_bw = 0;
+ _rx1_agc_mode = GAIN_MODE_SLOW_AGC;
+ _rx2_agc_mode = GAIN_MODE_SLOW_AGC;
+ _rx1_agc_enable = false;
+ _rx2_agc_enable = false;
+ _rx_analog_bw = 0;
+ _tx_analog_bw = 0;
+ _rx_tia_lp_bw = 0;
+ _tx_sec_lp_bw = 0;
+ _rx_bb_lp_bw = 0;
+ _tx_bb_lp_bw = 0;
/* Reset the device. */
_io_iface->poke8(0x000, 0x01);
@@ -1567,7 +1606,10 @@ void ad9361_device_t::initialize()
/* Check device ID to make sure iface works */
uint32_t device_id = (_io_iface->peek8(0x037) & 0x8);
if (device_id != 0x8) {
- throw uhd::runtime_error(str(boost::format("[ad9361_device_t::initialize] Device ID readback failure. Expected: 0x8, Received: 0x%x") % device_id));
+ throw uhd::runtime_error(
+ str(boost::format("[ad9361_device_t::initialize] Device ID readback failure. "
+ "Expected: 0x8, Received: 0x%x")
+ % device_id));
}
/* There is not a WAT big enough for this. */
@@ -1582,20 +1624,20 @@ void ad9361_device_t::initialize()
/* Enable clocks. */
switch (_client_params->get_clocking_mode()) {
- case clocking_mode_t::AD9361_XTAL_N_CLK_PATH: {
- _io_iface->poke8(0x009, 0x17);
- } break;
-
- case clocking_mode_t::AD9361_XTAL_P_CLK_PATH: {
- _io_iface->poke8(0x009, 0x07);
- _io_iface->poke8(0x292, 0x08);
- _io_iface->poke8(0x293, 0x80);
- _io_iface->poke8(0x294, 0x00);
- _io_iface->poke8(0x295, 0x14);
- } break;
+ case clocking_mode_t::AD9361_XTAL_N_CLK_PATH: {
+ _io_iface->poke8(0x009, 0x17);
+ } break;
+
+ case clocking_mode_t::AD9361_XTAL_P_CLK_PATH: {
+ _io_iface->poke8(0x009, 0x07);
+ _io_iface->poke8(0x292, 0x08);
+ _io_iface->poke8(0x293, 0x80);
+ _io_iface->poke8(0x294, 0x00);
+ _io_iface->poke8(0x295, 0x14);
+ } break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
+ default:
+ throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
}
std::this_thread::sleep_for(std::chrono::milliseconds(20));
@@ -1606,34 +1648,33 @@ void ad9361_device_t::initialize()
* FDD dual port DDR CMOS no swap.
* Force TX on one port, RX on the other. */
switch (_client_params->get_digital_interface_mode()) {
- case AD9361_DDR_FDD_LVCMOS: {
- _io_iface->poke8(0x010, 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode
- _io_iface->poke8(0x011, 0x00);
- _io_iface->poke8(0x012, 0x02);
- } break;
+ case AD9361_DDR_FDD_LVCMOS: {
+ _io_iface->poke8(
+ 0x010, 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode
+ _io_iface->poke8(0x011, 0x00);
+ _io_iface->poke8(0x012, 0x02);
+ } break;
- case AD9361_DDR_FDD_LVDS: {
- _io_iface->poke8(0x010, 0xcc); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode, 2R2T timing.
- _io_iface->poke8(0x011, 0x00);
- _io_iface->poke8(0x012, 0x10);
+ case AD9361_DDR_FDD_LVDS: {
+ _io_iface->poke8(0x010, 0xcc); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame
+ // sync mode, 2R2T timing.
+ _io_iface->poke8(0x011, 0x00);
+ _io_iface->poke8(0x012, 0x10);
- //LVDS Specific
- _io_iface->poke8(0x03C, 0x23);
- _io_iface->poke8(0x03D, 0xFF);
- _io_iface->poke8(0x03E, 0x0F);
- } break;
+ // LVDS Specific
+ _io_iface->poke8(0x03C, 0x23);
+ _io_iface->poke8(0x03D, 0xFF);
+ _io_iface->poke8(0x03E, 0x0F);
+ } break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
+ default:
+ throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
}
/* Data delay for TX and RX data clocks */
- digital_interface_delays_t timing =
- _client_params->get_digital_interface_timing();
- uint8_t rx_delays = ((timing.rx_clk_delay & 0xF) << 4)
- | (timing.rx_data_delay & 0xF);
- uint8_t tx_delays = ((timing.tx_clk_delay & 0xF) << 4)
- | (timing.tx_data_delay & 0xF);
+ digital_interface_delays_t timing = _client_params->get_digital_interface_timing();
+ uint8_t rx_delays = ((timing.rx_clk_delay & 0xF) << 4) | (timing.rx_data_delay & 0xF);
+ uint8_t tx_delays = ((timing.tx_clk_delay & 0xF) << 4) | (timing.tx_data_delay & 0xF);
_io_iface->poke8(0x006, rx_delays);
_io_iface->poke8(0x007, tx_delays);
@@ -1670,7 +1711,7 @@ void ad9361_device_t::initialize()
_io_iface->poke8(0x036, 0xFF);
/* Setup GPO */
- _io_iface->poke8(0x03a, 0x27); //set delay register
+ _io_iface->poke8(0x03a, 0x27); // set delay register
_io_iface->poke8(0x020, 0x00); // GPO Auto Enable Setup in RX and TX
_io_iface->poke8(0x027, 0x03); // GPO Manual and GPO auto value in ALERT
_io_iface->poke8(0x028, 0x00); // GPO_0 RX Delay
@@ -1739,16 +1780,16 @@ void ad9361_device_t::initialize()
// cals done, set PPORT config
switch (_client_params->get_digital_interface_mode()) {
- case AD9361_DDR_FDD_LVCMOS: {
- _io_iface->poke8(0x012, 0x02);
- } break;
+ case AD9361_DDR_FDD_LVCMOS: {
+ _io_iface->poke8(0x012, 0x02);
+ } break;
- case AD9361_DDR_FDD_LVDS: {
- _io_iface->poke8(0x012, 0x10);
- } break;
+ case AD9361_DDR_FDD_LVDS: {
+ _io_iface->poke8(0x012, 0x10);
+ } break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
+ default:
+ throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
}
_io_iface->poke8(0x013, 0x01); // Set ENSM FDD bit
@@ -1794,7 +1835,8 @@ double ad9361_device_t::set_clock_rate(const double req_rate)
std::lock_guard<std::recursive_mutex> lock(_mutex);
if (req_rate > 61.44e6) {
- throw uhd::runtime_error("[ad9361_device_t] Requested master clock rate outside range");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Requested master clock rate outside range");
}
UHD_LOG_TRACE("AD936X", "[ad9361_device_t::set_clock_rate] req_rate=" << req_rate);
@@ -1812,21 +1854,22 @@ double ad9361_device_t::set_clock_rate(const double req_rate)
* there, transition the ENSM to State 0. */
uint8_t current_state = _io_iface->peek8(0x017) & 0x0F;
switch (current_state) {
- case 0x05:
- /* We are in the ALERT state. */
- _io_iface->poke8(0x014, 0x21);
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- _io_iface->poke8(0x014, 0x00);
- break;
+ case 0x05:
+ /* We are in the ALERT state. */
+ _io_iface->poke8(0x014, 0x21);
+ std::this_thread::sleep_for(std::chrono::milliseconds(5));
+ _io_iface->poke8(0x014, 0x00);
+ break;
- case 0x0A:
- /* We are in the FDD state. */
- _io_iface->poke8(0x014, 0x00);
- break;
+ case 0x0A:
+ /* We are in the FDD state. */
+ _io_iface->poke8(0x014, 0x00);
+ break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] [set_clock_rate:1] AD9361 in unknown state");
- break;
+ default:
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [set_clock_rate:1] AD9361 in unknown state");
+ break;
};
/* Store the current chain / antenna selections so that we can restore
@@ -1842,9 +1885,9 @@ double ad9361_device_t::set_clock_rate(const double req_rate)
UHD_LOG_TRACE("AD936X", "[ad9361_device_t::set_clock_rate] rate=" << rate);
/* Transition to the ALERT state and calibrate everything. */
- _io_iface->poke8(0x015, 0x04); //dual synth mode, synth en ctrl en
- _io_iface->poke8(0x014, 0x05); //use SPI for TXNRX ctrl, to ALERT, TX on
- _io_iface->poke8(0x013, 0x01); //enable ENSM
+ _io_iface->poke8(0x015, 0x04); // dual synth mode, synth en ctrl en
+ _io_iface->poke8(0x014, 0x05); // use SPI for TXNRX ctrl, to ALERT, TX on
+ _io_iface->poke8(0x013, 0x01); // enable ENSM
std::this_thread::sleep_for(std::chrono::milliseconds(1));
_calibrate_synth_charge_pumps();
@@ -1882,38 +1925,39 @@ double ad9361_device_t::set_clock_rate(const double req_rate)
switch (_client_params->get_digital_interface_mode()) {
case AD9361_DDR_FDD_LVCMOS: {
_io_iface->poke8(0x012, 0x02);
- }break;
+ } break;
case AD9361_DDR_FDD_LVDS: {
_io_iface->poke8(0x012, 0x10);
- }break;
+ } break;
default:
- throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
+ throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
}
_io_iface->poke8(0x013, 0x01); // Set ENSM FDD bit
_io_iface->poke8(0x015, 0x04); // dual synth mode, synth en ctrl en
/* End the function in the same state as the entry state. */
switch (current_state) {
- case 0x05:
- /* We are already in ALERT. */
- break;
-
- case 0x0A:
- /* Transition back to FDD, and restore the original antenna
- * / chain selections. */
- _regs.txfilt = (_regs.txfilt & 0x3F) | orig_tx_chains;
- _regs.rxfilt = (_regs.rxfilt & 0x3F) | orig_rx_chains;
-
- _io_iface->poke8(0x002, _regs.txfilt);
- _io_iface->poke8(0x003, _regs.rxfilt);
- _io_iface->poke8(0x014, 0x21);
- break;
+ case 0x05:
+ /* We are already in ALERT. */
+ break;
- default:
- throw uhd::runtime_error("[ad9361_device_t] [set_clock_rate:2] AD9361 in unknown state");
- break;
+ case 0x0A:
+ /* Transition back to FDD, and restore the original antenna
+ * / chain selections. */
+ _regs.txfilt = (_regs.txfilt & 0x3F) | orig_tx_chains;
+ _regs.rxfilt = (_regs.rxfilt & 0x3F) | orig_rx_chains;
+
+ _io_iface->poke8(0x002, _regs.txfilt);
+ _io_iface->poke8(0x003, _regs.rxfilt);
+ _io_iface->poke8(0x014, 0x21);
+ break;
+
+ default:
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [set_clock_rate:2] AD9361 in unknown state");
+ break;
};
return get_clock_rate();
@@ -1967,9 +2011,9 @@ void ad9361_device_t::set_active_chains(bool tx1, bool tx2, bool rx1, bool rx2)
/* Check for FDD state */
uint8_t set_back_to_fdd = 0;
- uint8_t ensm_state = _io_iface->peek8(0x017) & 0x0F;
- if (ensm_state == 0xA) // FDD
- {
+ uint8_t ensm_state = _io_iface->peek8(0x017) & 0x0F;
+ if (ensm_state == 0xA) // FDD
+ {
/* Put into ALERT state (via the FDD flush state). */
_io_iface->poke8(0x014, 0x01);
set_back_to_fdd = 1;
@@ -2003,38 +2047,42 @@ void ad9361_device_t::set_active_chains(bool tx1, bool tx2, bool rx1, bool rx2)
void ad9361_device_t::set_timing_mode(const ad9361_device_t::timing_mode_t timing_mode)
{
switch (_client_params->get_digital_interface_mode()) {
- case AD9361_DDR_FDD_LVCMOS: {
- switch(timing_mode) {
- case TIMING_MODE_1R1T: {
- _io_iface->poke8(0x010, 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode
- break;
- }
- case TIMING_MODE_2R2T: {
- throw uhd::runtime_error("[ad9361_device_t] [set_timing_mode] 2R2T timing mode not supported for CMOS");
- break;
- }
- default:
- UHD_THROW_INVALID_CODE_PATH();
- }
- break;
- }
- case AD9361_DDR_FDD_LVDS: {
- switch(timing_mode) {
- case TIMING_MODE_1R1T: {
- _io_iface->poke8(0x010, 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode, 1R1T timing.
+ case AD9361_DDR_FDD_LVCMOS: {
+ switch (timing_mode) {
+ case TIMING_MODE_1R1T: {
+ _io_iface->poke8(0x010,
+ 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode
+ break;
+ }
+ case TIMING_MODE_2R2T: {
+ throw uhd::runtime_error("[ad9361_device_t] [set_timing_mode] 2R2T "
+ "timing mode not supported for CMOS");
+ break;
+ }
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
+ }
break;
}
- case TIMING_MODE_2R2T: {
- _io_iface->poke8(0x010, 0xcc); // Swap I&Q on Tx, Swap I&Q on Rx, Toggle frame sync mode, 2R2T timing.
+ case AD9361_DDR_FDD_LVDS: {
+ switch (timing_mode) {
+ case TIMING_MODE_1R1T: {
+ _io_iface->poke8(0x010, 0xc8); // Swap I&Q on Tx, Swap I&Q on Rx,
+ // Toggle frame sync mode, 1R1T timing.
+ break;
+ }
+ case TIMING_MODE_2R2T: {
+ _io_iface->poke8(0x010, 0xcc); // Swap I&Q on Tx, Swap I&Q on Rx,
+ // Toggle frame sync mode, 2R2T timing.
+ break;
+ }
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
+ }
break;
}
default:
- UHD_THROW_INVALID_CODE_PATH();
- }
- break;
- }
- default:
- throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
+ throw uhd::runtime_error("[ad9361_device_t] NOT IMPLEMENTED");
}
}
@@ -2138,7 +2186,6 @@ double ad9361_device_t::set_gain(direction_t direction, chain_t chain, const dou
std::lock_guard<std::recursive_mutex> lock(_mutex);
if (direction == RX) {
-
int gain_index = static_cast<int>(value);
/* Clip the gain values to the proper min/max gain values. */
@@ -2169,7 +2216,7 @@ double ad9361_device_t::set_gain(direction_t direction, chain_t chain, const dou
* "value" is out of bounds, so range checking must be performed
* outside this function.
*/
- double atten = AD9361_MAX_GAIN - value;
+ double atten = AD9361_MAX_GAIN - value;
uint32_t attenreg = uint32_t(atten * 4);
if (chain == CHAIN_1) {
_tx1_gain = value;
@@ -2180,11 +2227,11 @@ double ad9361_device_t::set_gain(direction_t direction, chain_t chain, const dou
_io_iface->poke8(0x075, attenreg & 0xFF);
_io_iface->poke8(0x076, (attenreg >> 8) & 0x01);
}
- return AD9361_MAX_GAIN - ((double) (attenreg) / 4);
+ return AD9361_MAX_GAIN - ((double)(attenreg) / 4);
}
}
-void ad9361_device_t::output_test_tone() // On RF side!
+void ad9361_device_t::output_test_tone() // On RF side!
{
std::lock_guard<std::recursive_mutex> lock(_mutex);
/* Output a 480 kHz tone at 800 MHz */
@@ -2212,19 +2259,20 @@ void ad9361_device_t::data_port_loopback(const bool loopback_enabled)
* -0.25dB / bit 9bit resolution.*/
double ad9361_device_t::get_rssi(chain_t chain)
{
- uint32_t reg_rssi = 0;
+ uint32_t reg_rssi = 0;
uint8_t lsb_bit_pos = 0;
if (chain == CHAIN_1) {
- reg_rssi = 0x1A7;
+ reg_rssi = 0x1A7;
lsb_bit_pos = 0;
- }else {
- reg_rssi = 0x1A9;
+ } else {
+ reg_rssi = 0x1A9;
lsb_bit_pos = 1;
}
uint8_t msbs = _io_iface->peek8(reg_rssi);
- uint8_t lsb = ((_io_iface->peek8(0x1AB)) >> lsb_bit_pos) & 0x01;
+ uint8_t lsb = ((_io_iface->peek8(0x1AB)) >> lsb_bit_pos) & 0x01;
uint16_t val = ((msbs << 1) | lsb);
- double rssi = (-0.25f * ((double)val)); //-0.25dB/lsb (See Gain Control Users Guide p. 25)
+ double rssi =
+ (-0.25f * ((double)val)); //-0.25dB/lsb (See Gain Control Users Guide p. 25)
return rssi;
}
@@ -2235,39 +2283,40 @@ double ad9361_device_t::get_rssi(chain_t chain)
*/
double ad9361_device_t::_get_temperature(const double cal_offset, const double timeout)
{
- //set 0x01D[0] to 1 to disable AuxADC GPIO reading
+ // set 0x01D[0] to 1 to disable AuxADC GPIO reading
uint8_t tmp = 0;
- tmp = _io_iface->peek8(0x01D);
+ tmp = _io_iface->peek8(0x01D);
_io_iface->poke8(0x01D, (tmp | 0x01));
- _io_iface->poke8(0x00B, 0); //set offset to 0
-
- _io_iface->poke8(0x00C, 0x01); //start reading, clears bit 0x00C[1]
- auto end_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(int64_t(timeout * 1000));
- //wait for valid data (toggle of bit 1 in 0x00C)
- while(((_io_iface->peek8(0x00C) >> 1) & 0x01) == 0) {
+ _io_iface->poke8(0x00B, 0); // set offset to 0
+
+ _io_iface->poke8(0x00C, 0x01); // start reading, clears bit 0x00C[1]
+ auto end_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(int64_t(timeout * 1000));
+ // wait for valid data (toggle of bit 1 in 0x00C)
+ while (((_io_iface->peek8(0x00C) >> 1) & 0x01) == 0) {
std::this_thread::sleep_for(std::chrono::microseconds(100));
if (std::chrono::steady_clock::now() > end_time) {
throw uhd::runtime_error(
"[ad9361_device_t] timeout while reading temperature");
}
}
- _io_iface->poke8(0x00C, 0x00); //clear read flag
+ _io_iface->poke8(0x00C, 0x00); // clear read flag
- uint8_t temp = _io_iface->peek8(0x00E); //read temperature.
- double tmp_temp = temp/1.140f; //according to ADI driver
- tmp_temp = tmp_temp + cal_offset; //Constant offset acquired by one point calibration.
+ uint8_t temp = _io_iface->peek8(0x00E); // read temperature.
+ double tmp_temp = temp / 1.140f; // according to ADI driver
+ tmp_temp = tmp_temp + cal_offset; // Constant offset acquired by one point
+ // calibration.
return tmp_temp;
}
-double ad9361_device_t::get_average_temperature(const double cal_offset, const size_t num_samples)
+double ad9361_device_t::get_average_temperature(
+ const double cal_offset, const size_t num_samples)
{
double d_temp = 0;
- for(size_t i = 0; i < num_samples; i++) {
+ for (size_t i = 0; i < num_samples; i++) {
double tmp_temp = _get_temperature(cal_offset);
- d_temp += (tmp_temp/num_samples);
+ d_temp += (tmp_temp / num_samples);
}
return d_temp;
}
@@ -2289,7 +2338,8 @@ void ad9361_device_t::set_dc_offset_auto(direction_t direction, const bool on)
_use_dc_offset_tracking = on;
_configure_bb_dc_tracking();
} else {
- throw uhd::runtime_error("[ad9361_device_t] [set_dc_offset_auto] Tx DC tracking not supported");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [set_dc_offset_auto] Tx DC tracking not supported");
}
}
@@ -2312,7 +2362,8 @@ void ad9361_device_t::set_iq_balance_auto(direction_t direction, const bool on)
_io_iface->poke8(0x014, 0x21); // FDD mode
}
} else {
- throw uhd::runtime_error("[ad9361_device_t] [set_iq_balance_auto] Tx IQ tracking not supported");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] [set_iq_balance_auto] Tx IQ tracking not supported");
}
}
@@ -2321,41 +2372,41 @@ void ad9361_device_t::set_iq_balance_auto(direction_t direction, const bool on)
* the gain configuration will be reloaded. */
void ad9361_device_t::_setup_agc(chain_t chain, gain_mode_t gain_mode)
{
- uint8_t gain_mode_reg = 0;
- uint8_t gain_mode_prev = 0;
+ uint8_t gain_mode_reg = 0;
+ uint8_t gain_mode_prev = 0;
uint8_t gain_mode_bits_pos = 0;
- gain_mode_reg = _io_iface->peek8(0x0FA);
+ gain_mode_reg = _io_iface->peek8(0x0FA);
gain_mode_prev = (gain_mode_reg & 0x0F);
if (chain == CHAIN_1) {
gain_mode_bits_pos = 0;
} else if (chain == CHAIN_2) {
gain_mode_bits_pos = 2;
- } else
- {
+ } else {
throw uhd::runtime_error("[ad9361_device_t] Wrong value for chain");
}
- gain_mode_reg = (gain_mode_reg & (~(0x03<<gain_mode_bits_pos))); //clear mode bits
+ gain_mode_reg = (gain_mode_reg & (~(0x03 << gain_mode_bits_pos))); // clear mode bits
switch (gain_mode) {
case GAIN_MODE_MANUAL:
- //leave bits cleared
+ // leave bits cleared
break;
case GAIN_MODE_SLOW_AGC:
- gain_mode_reg = (gain_mode_reg | (0x02<<gain_mode_bits_pos));
+ gain_mode_reg = (gain_mode_reg | (0x02 << gain_mode_bits_pos));
break;
case GAIN_MODE_FAST_AGC:
- gain_mode_reg = (gain_mode_reg | (0x01<<gain_mode_bits_pos));
+ gain_mode_reg = (gain_mode_reg | (0x01 << gain_mode_bits_pos));
break;
default:
throw uhd::runtime_error("[ad9361_device_t] Gain mode does not exist");
}
_io_iface->poke8(0x0FA, gain_mode_reg);
uint8_t gain_mode_status = _io_iface->peek8(0x0FA);
- gain_mode_status = (gain_mode_status & 0x0F);
+ gain_mode_status = (gain_mode_status & 0x0F);
/*Check if gain mode configuration needs to be reprogrammed*/
- if (((gain_mode_prev == 0) && (gain_mode_status != 0)) || ((gain_mode_prev != 0) && (gain_mode_status == 0))) {
+ if (((gain_mode_prev == 0) && (gain_mode_status != 0))
+ || ((gain_mode_prev != 0) && (gain_mode_status == 0))) {
if (gain_mode_status == 0) {
/*load manual mode config*/
_setup_gain_control(false);
@@ -2368,50 +2419,45 @@ void ad9361_device_t::_setup_agc(chain_t chain, gain_mode_t gain_mode)
void ad9361_device_t::set_agc(chain_t chain, bool enable)
{
- if(chain == CHAIN_1) {
+ if (chain == CHAIN_1) {
_rx1_agc_enable = enable;
- if(enable) {
+ if (enable) {
_setup_agc(chain, _rx1_agc_mode);
} else {
_setup_agc(chain, GAIN_MODE_MANUAL);
}
- } else if (chain == CHAIN_2){
+ } else if (chain == CHAIN_2) {
_rx2_agc_enable = enable;
- if(enable) {
+ if (enable) {
_setup_agc(chain, _rx2_agc_mode);
} else {
_setup_agc(chain, GAIN_MODE_MANUAL);
}
- } else
- {
+ } else {
throw uhd::runtime_error("[ad9361_device_t] Wrong value for chain");
}
}
void ad9361_device_t::set_agc_mode(chain_t chain, gain_mode_t gain_mode)
{
- if(chain == CHAIN_1) {
+ if (chain == CHAIN_1) {
_rx1_agc_mode = gain_mode;
- if(_rx1_agc_enable) {
+ if (_rx1_agc_enable) {
_setup_agc(chain, _rx1_agc_mode);
}
- } else if(chain == CHAIN_2){
+ } else if (chain == CHAIN_2) {
_rx2_agc_mode = gain_mode;
- if(_rx2_agc_enable) {
+ if (_rx2_agc_enable) {
_setup_agc(chain, _rx2_agc_mode);
}
- } else
- {
+ } else {
throw uhd::runtime_error("[ad9361_device_t] Wrong value for chain");
}
}
std::vector<std::string> ad9361_device_t::get_filter_names(direction_t direction)
{
- auto& filters = (direction == RX)
- ? _rx_filters
- : _tx_filters
- ;
+ auto& filters = (direction == RX) ? _rx_filters : _tx_filters;
std::vector<std::string> ret;
ret.reserve(filters.size());
@@ -2423,68 +2469,53 @@ std::vector<std::string> ad9361_device_t::get_filter_names(direction_t direction
}
filter_info_base::sptr ad9361_device_t::get_filter(
- direction_t direction,
- chain_t chain,
- const std::string &name
-) {
- auto& filters = (direction == RX)
- ? _rx_filters
- : _tx_filters
- ;
+ direction_t direction, chain_t chain, const std::string& name)
+{
+ auto& filters = (direction == RX) ? _rx_filters : _tx_filters;
if (!filters.count(name)) {
throw uhd::runtime_error(
- "ad9361_device_t::get_filter this filter does not exist: " + name
- );
+ "ad9361_device_t::get_filter this filter does not exist: " + name);
}
// Check entry 0 in the tuple (the getter) exists before calling it
if (!std::get<0>(filters[name])) {
throw uhd::runtime_error(
- "ad9361_device_t::get_filter this filter can not be read: " + name
- );
+ "ad9361_device_t::get_filter this filter can not be read: " + name);
}
return std::get<0>(filters[name])(chain);
}
-void ad9361_device_t::set_filter(
- direction_t direction,
- chain_t chain,
- const std::string &name,
- filter_info_base::sptr filter
-) {
- auto& filters = (direction == RX)
- ? _rx_filters
- : _tx_filters
- ;
+void ad9361_device_t::set_filter(direction_t direction,
+ chain_t chain,
+ const std::string& name,
+ filter_info_base::sptr filter)
+{
+ auto& filters = (direction == RX) ? _rx_filters : _tx_filters;
if (!filters.count(name)) {
throw uhd::runtime_error(
- "ad9361_device_t::set_filter this filter does not exist: " + name
- );
+ "ad9361_device_t::set_filter this filter does not exist: " + name);
}
// Check entry 1 in the tuple (the setter) exists before calling it
if (!std::get<1>(filters[name])) {
throw uhd::runtime_error(
- "ad9361_device_t::set_filter this filter can not be written: " +
- name
- );
+ "ad9361_device_t::set_filter this filter can not be written: " + name);
}
std::get<1>(filters[name])(chain, filter);
}
double ad9361_device_t::set_bw_filter(direction_t direction, const double rf_bw)
{
- //both low pass filters are programmed to the same bw. However, their cutoffs will differ.
- //Together they should create the requested bb bw.
- //Select rf_bw if it is between AD9361_MIN_BW & AD9361_MAX_BW.
+ // both low pass filters are programmed to the same bw. However, their cutoffs will
+ // differ. Together they should create the requested bb bw. Select rf_bw if it is
+ // between AD9361_MIN_BW & AD9361_MAX_BW.
const double clipped_bw = std::min(std::max(rf_bw, AD9361_MIN_BW), AD9361_MAX_BW);
- if(direction == RX)
- {
- _rx_bb_lp_bw = _calibrate_baseband_rx_analog_filter(clipped_bw); //returns bb bw
+ if (direction == RX) {
+ _rx_bb_lp_bw = _calibrate_baseband_rx_analog_filter(clipped_bw); // returns bb bw
_rx_tia_lp_bw = _calibrate_rx_TIAs(clipped_bw);
_rx_analog_bw = clipped_bw;
} else {
- _tx_bb_lp_bw = _calibrate_baseband_tx_analog_filter(clipped_bw); //returns bb bw
+ _tx_bb_lp_bw = _calibrate_baseband_tx_analog_filter(clipped_bw); // returns bb bw
_tx_sec_lp_bw = _calibrate_secondary_tx_filter(clipped_bw);
_tx_analog_bw = clipped_bw;
}
@@ -2492,20 +2523,20 @@ double ad9361_device_t::set_bw_filter(direction_t direction, const double rf_bw)
return (clipped_bw);
}
-void ad9361_device_t::_set_fir_taps(direction_t direction, chain_t chain, const std::vector<int16_t>& taps)
+void ad9361_device_t::_set_fir_taps(
+ direction_t direction, chain_t chain, const std::vector<int16_t>& taps)
{
- size_t num_taps = taps.size();
+ size_t num_taps = taps.size();
size_t num_taps_avail = _get_num_fir_taps(direction);
- if(num_taps == num_taps_avail)
- {
+ if (num_taps == num_taps_avail) {
boost::scoped_array<uint16_t> coeffs(new uint16_t[num_taps_avail]);
- for (size_t i = 0; i < num_taps_avail; i++)
- {
+ for (size_t i = 0; i < num_taps_avail; i++) {
coeffs[i] = uint16_t(taps[i]);
}
_program_fir_filter(direction, chain, num_taps_avail, coeffs.get());
- } else if(num_taps < num_taps_avail){
- throw uhd::runtime_error("ad9361_device_t::_set_fir_taps not enough coefficients.");
+ } else if (num_taps < num_taps_avail) {
+ throw uhd::runtime_error(
+ "ad9361_device_t::_set_fir_taps not enough coefficients.");
} else {
throw uhd::runtime_error("ad9361_device_t::_set_fir_taps too many coefficients.");
}
@@ -2514,7 +2545,7 @@ void ad9361_device_t::_set_fir_taps(direction_t direction, chain_t chain, const
size_t ad9361_device_t::_get_num_fir_taps(direction_t direction)
{
uint8_t num = 0;
- if(direction == RX)
+ if (direction == RX)
num = _io_iface->peek8(0x0F5);
else
num = _io_iface->peek8(0x065);
@@ -2525,7 +2556,7 @@ size_t ad9361_device_t::_get_num_fir_taps(direction_t direction)
size_t ad9361_device_t::_get_fir_dec_int(direction_t direction)
{
uint8_t dec_int = 0;
- if(direction == RX)
+ if (direction == RX)
dec_int = _io_iface->peek8(0x003);
else
dec_int = _io_iface->peek8(0x002);
@@ -2535,8 +2566,7 @@ size_t ad9361_device_t::_get_fir_dec_int(direction_t direction)
* 2 = dec/int by 2
* 3 = dec/int by 4 */
dec_int = (dec_int & 0x03);
- if(dec_int == 3)
- {
+ if (dec_int == 3) {
return 4;
}
return dec_int;
@@ -2548,41 +2578,39 @@ std::vector<int16_t> ad9361_device_t::_get_fir_taps(direction_t direction, chain
size_t num_taps = _get_num_fir_taps(direction);
uint8_t config;
uint8_t reg_numtaps = (((num_taps / 16) - 1) & 0x07) << 5;
- config = reg_numtaps | 0x02; //start the programming clock
+ config = reg_numtaps | 0x02; // start the programming clock
- if(chain == CHAIN_1)
- {
+ if (chain == CHAIN_1) {
config = config | (1 << 3);
- } else if (chain == CHAIN_2){
+ } else if (chain == CHAIN_2) {
config = config | (1 << 4);
} else {
- throw uhd::runtime_error("[ad9361_device_t] Can not read both chains synchronously");
+ throw uhd::runtime_error(
+ "[ad9361_device_t] Can not read both chains synchronously");
}
- if(direction == RX)
- {
+ if (direction == RX) {
base = 0xF0;
} else {
base = 0x60;
}
- _io_iface->poke8(base+5,config);
+ _io_iface->poke8(base + 5, config);
std::vector<int16_t> taps;
uint8_t lower_val;
uint8_t higher_val;
uint16_t coeff;
- for(size_t i = 0;i < num_taps;i++)
- {
- _io_iface->poke8(base,0x00+i);
- lower_val = _io_iface->peek8(base+3);
- higher_val = _io_iface->peek8(base+4);
- coeff = ((higher_val << 8) | lower_val);
+ for (size_t i = 0; i < num_taps; i++) {
+ _io_iface->poke8(base, 0x00 + i);
+ lower_val = _io_iface->peek8(base + 3);
+ higher_val = _io_iface->peek8(base + 4);
+ coeff = ((higher_val << 8) | lower_val);
taps.push_back(int16_t(coeff));
}
- config = (config & (~(1 << 1))); //disable filter clock
- _io_iface->poke8(base+5,config);
+ config = (config & (~(1 << 1))); // disable filter clock
+ _io_iface->poke8(base + 5, config);
return taps;
}
@@ -2594,15 +2622,15 @@ filter_info_base::sptr ad9361_device_t::_get_filter_lp_tia_sec(direction_t direc
{
double cutoff = 0;
- if(direction == RX)
- {
- cutoff = 2.5 * _rx_tia_lp_bw;
+ if (direction == RX) {
+ cutoff = 2.5 * _rx_tia_lp_bw;
} else {
- cutoff = 5 * _tx_sec_lp_bw;
+ cutoff = 5 * _tx_sec_lp_bw;
}
- filter_info_base::sptr lp(new analog_filter_lp(filter_info_base::ANALOG_LOW_PASS, false, 0, "single-pole", cutoff, 20));
- return lp;
+ filter_info_base::sptr lp(new analog_filter_lp(
+ filter_info_base::ANALOG_LOW_PASS, false, 0, "single-pole", cutoff, 20));
+ return lp;
}
/*
@@ -2611,15 +2639,19 @@ filter_info_base::sptr ad9361_device_t::_get_filter_lp_tia_sec(direction_t direc
filter_info_base::sptr ad9361_device_t::_get_filter_lp_bb(direction_t direction)
{
double cutoff = 0;
- if(direction == RX)
- {
+ if (direction == RX) {
cutoff = 1.4 * _rx_bb_lp_bw;
} else {
cutoff = 1.6 * _tx_bb_lp_bw;
}
- filter_info_base::sptr bb_lp(new analog_filter_lp(filter_info_base::ANALOG_LOW_PASS, false, 1, "third-order Butterworth", cutoff, 60));
- return bb_lp;
+ filter_info_base::sptr bb_lp(new analog_filter_lp(filter_info_base::ANALOG_LOW_PASS,
+ false,
+ 1,
+ "third-order Butterworth",
+ cutoff,
+ 60));
+ return bb_lp;
}
/*
@@ -2642,227 +2674,272 @@ filter_info_base::sptr ad9361_device_t::_get_filter_dec_int_3(direction_t direct
filter_info_base::sptr ret;
- if(direction == RX)
- {
+ if (direction == RX) {
full_scale = 16384;
- dec = 3;
- interpol = 1;
+ dec = 3;
+ interpol = 1;
enable = _io_iface->peek8(0x003);
enable = ((enable >> 4) & 0x03);
- taps.assign(taps_array_rx, taps_array_rx + sizeof(taps_array_rx) / sizeof(int16_t) );
+ taps.assign(
+ taps_array_rx, taps_array_rx + sizeof(taps_array_rx) / sizeof(int16_t));
} else {
full_scale = 8192;
- dec = 1;
- interpol = 3;
+ dec = 1;
+ interpol = 3;
uint8_t use_dac_clk_div = _io_iface->peek8(0x00A);
- use_dac_clk_div = ((use_dac_clk_div >> 3) & 0x01);
- if(use_dac_clk_div == 1)
- {
+ use_dac_clk_div = ((use_dac_clk_div >> 3) & 0x01);
+ if (use_dac_clk_div == 1) {
rate = rate / 2;
}
enable = _io_iface->peek8(0x002);
enable = ((enable >> 4) & 0x03);
- if(enable == 2) //0 => int. by 1, 1 => int. by 2 (HB3), 2 => int. by 3
+ if (enable == 2) // 0 => int. by 1, 1 => int. by 2 (HB3), 2 => int. by 3
{
rate /= 3;
}
- taps.assign(taps_array_tx, taps_array_tx + sizeof(taps_array_tx) / sizeof(int16_t) );
+ taps.assign(
+ taps_array_tx, taps_array_tx + sizeof(taps_array_tx) / sizeof(int16_t));
}
- ret = filter_info_base::sptr(new digital_filter_base<int16_t>(type, (enable != 2) ? true : false, 2, rate, interpol, dec, full_scale, taps.size(), taps));
- return ret;
+ ret = filter_info_base::sptr(new digital_filter_base<int16_t>(type,
+ (enable != 2) ? true : false,
+ 2,
+ rate,
+ interpol,
+ dec,
+ full_scale,
+ taps.size(),
+ taps));
+ return ret;
}
filter_info_base::sptr ad9361_device_t::_get_filter_hb_3(direction_t direction)
{
- uint8_t enable = 0;
- double rate = _adcclock_freq;
- double full_scale = 0;
- size_t dec = 1;
- size_t interpol = 1;
+ uint8_t enable = 0;
+ double rate = _adcclock_freq;
+ double full_scale = 0;
+ size_t dec = 1;
+ size_t interpol = 1;
filter_info_base::filter_type type = filter_info_base::DIGITAL_I16;
- int16_t taps_array_rx[] = {1, 4, 6, 4, 1};
- int16_t taps_array_tx[] = {1, 2, 1};
+ int16_t taps_array_rx[] = {1, 4, 6, 4, 1};
+ int16_t taps_array_tx[] = {1, 2, 1};
std::vector<int16_t> taps;
- if(direction == RX)
- {
+ if (direction == RX) {
full_scale = 16;
- dec = 2;
+ dec = 2;
enable = _io_iface->peek8(0x003);
enable = ((enable >> 4) & 0x03);
- taps.assign(taps_array_rx, taps_array_rx + sizeof(taps_array_rx) / sizeof(int16_t) );
+ taps.assign(
+ taps_array_rx, taps_array_rx + sizeof(taps_array_rx) / sizeof(int16_t));
} else {
full_scale = 2;
- interpol = 2;
+ interpol = 2;
uint8_t use_dac_clk_div = _io_iface->peek8(0x00A);
- use_dac_clk_div = ((use_dac_clk_div >> 3) & 0x01);
- if(use_dac_clk_div == 1)
- {
+ use_dac_clk_div = ((use_dac_clk_div >> 3) & 0x01);
+ if (use_dac_clk_div == 1) {
rate = rate / 2;
}
enable = _io_iface->peek8(0x002);
enable = ((enable >> 4) & 0x03);
- if(enable == 1)
- {
+ if (enable == 1) {
rate /= 2;
}
- taps.assign(taps_array_tx, taps_array_tx + sizeof(taps_array_tx) / sizeof(int16_t) );
+ taps.assign(
+ taps_array_tx, taps_array_tx + sizeof(taps_array_tx) / sizeof(int16_t));
}
- filter_info_base::sptr hb = filter_info_base::sptr(new digital_filter_base<int16_t>(type, (enable != 1) ? true : false, 2, rate, interpol, dec, full_scale, taps.size(), taps));
- return hb;
+ filter_info_base::sptr hb =
+ filter_info_base::sptr(new digital_filter_base<int16_t>(type,
+ (enable != 1) ? true : false,
+ 2,
+ rate,
+ interpol,
+ dec,
+ full_scale,
+ taps.size(),
+ taps));
+ return hb;
}
filter_info_base::sptr ad9361_device_t::_get_filter_hb_2(direction_t direction)
{
- uint8_t enable = 0;
- double rate = _adcclock_freq;
- double full_scale = 0;
- size_t dec = 1;
- size_t interpol = 1;
+ uint8_t enable = 0;
+ double rate = _adcclock_freq;
+ double full_scale = 0;
+ size_t dec = 1;
+ size_t interpol = 1;
filter_info_base::filter_type type = filter_info_base::DIGITAL_I16;
- int16_t taps_array[] = {-9, 0, 73, 128, 73, 0, -9};
- std::vector<int16_t> taps(taps_array, taps_array + sizeof(taps_array) / sizeof(int16_t) );
+ int16_t taps_array[] = {-9, 0, 73, 128, 73, 0, -9};
+ std::vector<int16_t> taps(
+ taps_array, taps_array + sizeof(taps_array) / sizeof(int16_t));
- digital_filter_base<int16_t>::sptr hb_3 = std::dynamic_pointer_cast<digital_filter_base<int16_t> >(_get_filter_hb_3(direction));
- digital_filter_base<int16_t>::sptr dec_int_3 = std::dynamic_pointer_cast<digital_filter_base<int16_t> >(_get_filter_dec_int_3(direction));
+ digital_filter_base<int16_t>::sptr hb_3 =
+ std::dynamic_pointer_cast<digital_filter_base<int16_t>>(
+ _get_filter_hb_3(direction));
+ digital_filter_base<int16_t>::sptr dec_int_3 =
+ std::dynamic_pointer_cast<digital_filter_base<int16_t>>(
+ _get_filter_dec_int_3(direction));
- if(direction == RX)
- {
+ if (direction == RX) {
full_scale = 256;
- dec = 2;
- enable = _io_iface->peek8(0x003);
+ dec = 2;
+ enable = _io_iface->peek8(0x003);
} else {
full_scale = 128;
- interpol = 2;
- enable = _io_iface->peek8(0x002);
+ interpol = 2;
+ enable = _io_iface->peek8(0x002);
}
enable = ((enable >> 3) & 0x01);
- if(!(hb_3->is_bypassed()))
- {
- if(direction == RX)
- {
+ if (!(hb_3->is_bypassed())) {
+ if (direction == RX) {
rate = hb_3->get_output_rate();
- }else if (direction == TX) {
+ } else if (direction == TX) {
rate = hb_3->get_input_rate();
- if(enable)
- {
+ if (enable) {
rate /= 2;
}
}
- } else { //else dec3/int3 or none of them is used.
- if(direction == RX)
- {
+ } else { // else dec3/int3 or none of them is used.
+ if (direction == RX) {
rate = dec_int_3->get_output_rate();
- }else if (direction == TX) {
+ } else if (direction == TX) {
rate = dec_int_3->get_input_rate();
- if(enable)
- {
+ if (enable) {
rate /= 2;
}
}
}
- filter_info_base::sptr hb(new digital_filter_base<int16_t>(type, (enable == 0) ? true : false, 3, rate, interpol, dec, full_scale, taps.size(), taps));
- return hb;
+ filter_info_base::sptr hb(new digital_filter_base<int16_t>(type,
+ (enable == 0) ? true : false,
+ 3,
+ rate,
+ interpol,
+ dec,
+ full_scale,
+ taps.size(),
+ taps));
+ return hb;
}
filter_info_base::sptr ad9361_device_t::_get_filter_hb_1(direction_t direction)
{
- uint8_t enable = 0;
- double rate = 0;
- double full_scale = 0;
- size_t dec = 1;
- size_t interpol = 1;
+ uint8_t enable = 0;
+ double rate = 0;
+ double full_scale = 0;
+ size_t dec = 1;
+ size_t interpol = 1;
filter_info_base::filter_type type = filter_info_base::DIGITAL_I16;
std::vector<int16_t> taps;
- int16_t taps_rx_array[] = {-8, 0, 42, 0, -147, 0, 619, 1013, 619, 0, -147, 0, 42, 0, -8};
- int16_t taps_tx_array[] = {-53, 0, 313, 0, -1155, 0, 4989, 8192, 4989, 0, -1155, 0, 313, 0, -53};
+ int16_t taps_rx_array[] = {
+ -8, 0, 42, 0, -147, 0, 619, 1013, 619, 0, -147, 0, 42, 0, -8};
+ int16_t taps_tx_array[] = {
+ -53, 0, 313, 0, -1155, 0, 4989, 8192, 4989, 0, -1155, 0, 313, 0, -53};
- digital_filter_base<int16_t>::sptr hb_2 = std::dynamic_pointer_cast<digital_filter_base<int16_t> >(_get_filter_hb_2(direction));
+ digital_filter_base<int16_t>::sptr hb_2 =
+ std::dynamic_pointer_cast<digital_filter_base<int16_t>>(
+ _get_filter_hb_2(direction));
- if(direction == RX)
- {
+ if (direction == RX) {
full_scale = 2048;
- dec = 2;
- enable = _io_iface->peek8(0x003);
- enable = ((enable >> 2) & 0x01);
- rate = hb_2->get_output_rate();
- taps.assign(taps_rx_array, taps_rx_array + sizeof(taps_rx_array) / sizeof(int16_t) );
+ dec = 2;
+ enable = _io_iface->peek8(0x003);
+ enable = ((enable >> 2) & 0x01);
+ rate = hb_2->get_output_rate();
+ taps.assign(
+ taps_rx_array, taps_rx_array + sizeof(taps_rx_array) / sizeof(int16_t));
} else if (direction == TX) {
full_scale = 8192;
- interpol = 2;
- enable = _io_iface->peek8(0x002);
- enable = ((enable >> 2) & 0x01);
- rate = hb_2->get_input_rate();
- if(enable)
- {
+ interpol = 2;
+ enable = _io_iface->peek8(0x002);
+ enable = ((enable >> 2) & 0x01);
+ rate = hb_2->get_input_rate();
+ if (enable) {
rate /= 2;
}
- taps.assign(taps_tx_array, taps_tx_array + sizeof(taps_tx_array) / sizeof(int16_t) );
+ taps.assign(
+ taps_tx_array, taps_tx_array + sizeof(taps_tx_array) / sizeof(int16_t));
}
- filter_info_base::sptr hb(new digital_filter_base<int16_t>(type, (enable == 0) ? true : false, 4, rate, interpol, dec, full_scale, taps.size(), taps));
- return hb;
+ filter_info_base::sptr hb(new digital_filter_base<int16_t>(type,
+ (enable == 0) ? true : false,
+ 4,
+ rate,
+ interpol,
+ dec,
+ full_scale,
+ taps.size(),
+ taps));
+ return hb;
}
-filter_info_base::sptr ad9361_device_t::_get_filter_fir(direction_t direction, chain_t chain)
+filter_info_base::sptr ad9361_device_t::_get_filter_fir(
+ direction_t direction, chain_t chain)
{
- double rate = 0;
- size_t dec = 1;
- size_t interpol = 1;
+ double rate = 0;
+ size_t dec = 1;
+ size_t interpol = 1;
size_t max_num_taps = 128;
- uint8_t enable = 1;
+ uint8_t enable = 1;
- digital_filter_base<int16_t>::sptr hb_1 = std::dynamic_pointer_cast<digital_filter_base<int16_t> >(_get_filter_hb_1(direction));
+ digital_filter_base<int16_t>::sptr hb_1 =
+ std::dynamic_pointer_cast<digital_filter_base<int16_t>>(
+ _get_filter_hb_1(direction));
- if(direction == RX)
- {
+ if (direction == RX) {
dec = _get_fir_dec_int(direction);
- if(dec == 0)
- {
+ if (dec == 0) {
enable = 0;
- dec = 1;
+ dec = 1;
}
interpol = 1;
- rate = hb_1->get_output_rate();
- }else if (direction == TX) {
+ rate = hb_1->get_output_rate();
+ } else if (direction == TX) {
interpol = _get_fir_dec_int(direction);
- if(interpol == 0)
- {
- enable = 0;
+ if (interpol == 0) {
+ enable = 0;
interpol = 1;
}
- dec = 1;
+ dec = 1;
rate = hb_1->get_input_rate();
- if(enable)
- {
+ if (enable) {
rate /= interpol;
}
}
max_num_taps = _get_num_fir_taps(direction);
- filter_info_base::sptr fir(new digital_filter_fir<int16_t>(filter_info_base::DIGITAL_FIR_I16, (enable == 0) ? true : false, 5, rate, interpol, dec, 32767, max_num_taps, _get_fir_taps(direction, chain)));
+ filter_info_base::sptr fir(
+ new digital_filter_fir<int16_t>(filter_info_base::DIGITAL_FIR_I16,
+ (enable == 0) ? true : false,
+ 5,
+ rate,
+ interpol,
+ dec,
+ 32767,
+ max_num_taps,
+ _get_fir_taps(direction, chain)));
return fir;
}
-void ad9361_device_t::_set_filter_fir(direction_t direction, chain_t channel, filter_info_base::sptr filter)
+void ad9361_device_t::_set_filter_fir(
+ direction_t direction, chain_t channel, filter_info_base::sptr filter)
{
- digital_filter_fir<int16_t>::sptr fir = std::dynamic_pointer_cast<digital_filter_fir<int16_t> >(filter);
- //only write taps. Ignore everything else for now
+ digital_filter_fir<int16_t>::sptr fir =
+ std::dynamic_pointer_cast<digital_filter_fir<int16_t>>(filter);
+ // only write taps. Ignore everything else for now
_set_fir_taps(direction, channel, fir->get_taps());
}
@@ -2871,34 +2948,39 @@ void ad9361_device_t::_set_filter_fir(direction_t direction, chain_t channel, fi
* _tx_analog_bw and _rx_analog_bw are not valid any more!
* For useful data in those variables set_bw_filter method should be used
*/
-void ad9361_device_t::_set_filter_lp_bb(direction_t direction, filter_info_base::sptr filter)
+void ad9361_device_t::_set_filter_lp_bb(
+ direction_t direction, filter_info_base::sptr filter)
{
analog_filter_lp::sptr lpf = std::dynamic_pointer_cast<analog_filter_lp>(filter);
- double bw = lpf->get_cutoff();
- if(direction == RX)
- {
- //remember: this function takes rf bw as its input and calibrated to 1.4 x the given value
- _rx_bb_lp_bw = _calibrate_baseband_rx_analog_filter(2 * bw / 1.4); //returns bb bw
+ double bw = lpf->get_cutoff();
+ if (direction == RX) {
+ // remember: this function takes rf bw as its input and calibrated to 1.4 x the
+ // given value
+ _rx_bb_lp_bw = _calibrate_baseband_rx_analog_filter(2 * bw / 1.4); // returns bb
+ // bw
} else {
- //remember: this function takes rf bw as its input and calibrates to 1.6 x the given value
+ // remember: this function takes rf bw as its input and calibrates to 1.6 x the
+ // given value
_tx_bb_lp_bw = _calibrate_baseband_tx_analog_filter(2 * bw / 1.6);
}
}
-void ad9361_device_t::_set_filter_lp_tia_sec(direction_t direction, filter_info_base::sptr filter)
+void ad9361_device_t::_set_filter_lp_tia_sec(
+ direction_t direction, filter_info_base::sptr filter)
{
analog_filter_lp::sptr lpf = std::dynamic_pointer_cast<analog_filter_lp>(filter);
- double bw = lpf->get_cutoff();
- if(direction == RX)
- {
- //remember: this function takes rf bw as its input and calibrated to 2.5 x the given value
- _rx_tia_lp_bw = _calibrate_rx_TIAs(2 * bw / 2.5); //returns bb bw
+ double bw = lpf->get_cutoff();
+ if (direction == RX) {
+ // remember: this function takes rf bw as its input and calibrated to 2.5 x the
+ // given value
+ _rx_tia_lp_bw = _calibrate_rx_TIAs(2 * bw / 2.5); // returns bb bw
} else {
- //remember: this function takes rf bw as its input and calibrates to 5 x the given value
+ // remember: this function takes rf bw as its input and calibrates to 5 x the
+ // given value
_tx_sec_lp_bw = _calibrate_secondary_tx_filter(2 * bw / 5);
}
}
-}}
+}} // namespace uhd::usrp
diff --git a/host/lib/usrp/common/ad936x_manager.cpp b/host/lib/usrp/common/ad936x_manager.cpp
index b57b94302..9646f0427 100644
--- a/host/lib/usrp/common/ad936x_manager.cpp
+++ b/host/lib/usrp/common/ad936x_manager.cpp
@@ -8,9 +8,9 @@
#include <uhd/utils/log.hpp>
#include <uhdlib/usrp/common/ad936x_manager.hpp>
#include <boost/functional/hash.hpp>
-#include <memory>
#include <chrono>
#include <cmath>
+#include <memory>
#include <thread>
using namespace uhd;
diff --git a/host/lib/usrp/common/adf4001_ctrl.cpp b/host/lib/usrp/common/adf4001_ctrl.cpp
index 85a13455f..a9f3c1fdb 100644
--- a/host/lib/usrp/common/adf4001_ctrl.cpp
+++ b/host/lib/usrp/common/adf4001_ctrl.cpp
@@ -10,71 +10,72 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/common/adf4001_ctrl.hpp>
#include <uhd/utils/log.hpp>
-
-#include <iostream>
+#include <uhdlib/usrp/common/adf4001_ctrl.hpp>
#include <iomanip>
+#include <iostream>
using namespace uhd;
using namespace uhd::usrp;
-adf4001_regs_t::adf4001_regs_t(void) {
- ref_counter = 0;
- n = 0;
- charge_pump_current_1 = 0;
- charge_pump_current_2 = 0;
- anti_backlash_width = ANTI_BACKLASH_WIDTH_2_9NS;
- lock_detect_precision = LOCK_DETECT_PRECISION_3CYC;
- charge_pump_gain = CHARGE_PUMP_GAIN_1;
- counter_reset = COUNTER_RESET_NORMAL;
- power_down = POWER_DOWN_NORMAL;
- muxout = MUXOUT_TRISTATE_OUT;
+adf4001_regs_t::adf4001_regs_t(void)
+{
+ ref_counter = 0;
+ n = 0;
+ charge_pump_current_1 = 0;
+ charge_pump_current_2 = 0;
+ anti_backlash_width = ANTI_BACKLASH_WIDTH_2_9NS;
+ lock_detect_precision = LOCK_DETECT_PRECISION_3CYC;
+ charge_pump_gain = CHARGE_PUMP_GAIN_1;
+ counter_reset = COUNTER_RESET_NORMAL;
+ power_down = POWER_DOWN_NORMAL;
+ muxout = MUXOUT_TRISTATE_OUT;
phase_detector_polarity = PHASE_DETECTOR_POLARITY_NEGATIVE;
- charge_pump_mode = CHARGE_PUMP_TRISTATE;
- fastlock_mode = FASTLOCK_MODE_DISABLED;
- timer_counter_control = TIMEOUT_3CYC;
+ charge_pump_mode = CHARGE_PUMP_TRISTATE;
+ fastlock_mode = FASTLOCK_MODE_DISABLED;
+ timer_counter_control = TIMEOUT_3CYC;
}
-uint32_t adf4001_regs_t::get_reg(uint8_t addr) {
+uint32_t adf4001_regs_t::get_reg(uint8_t addr)
+{
uint32_t reg = 0;
switch (addr) {
- case 0:
- reg |= (uint32_t(ref_counter) & 0x003FFF) << 2;
- reg |= (uint32_t(anti_backlash_width) & 0x000003) << 16;
- reg |= (uint32_t(lock_detect_precision) & 0x000001) << 20;
- break;
- case 1:
- reg |= (uint32_t(n) & 0x001FFF) << 8;
- reg |= (uint32_t(charge_pump_gain) & 0x000001) << 21;
- break;
- case 2:
- reg |= (uint32_t(counter_reset) & 0x000001) << 2;
- reg |= (uint32_t(power_down) & 0x000001) << 3;
- reg |= (uint32_t(muxout) & 0x000007) << 4;
- reg |= (uint32_t(phase_detector_polarity) & 0x000001) << 7;
- reg |= (uint32_t(charge_pump_mode) & 0x000001) << 8;
- reg |= (uint32_t(fastlock_mode) & 0x000003) << 9;
- reg |= (uint32_t(timer_counter_control) & 0x00000F) << 11;
- reg |= (uint32_t(charge_pump_current_1) & 0x000007) << 15;
- reg |= (uint32_t(charge_pump_current_2) & 0x000007) << 18;
- reg |= (uint32_t(power_down) & 0x000002) << 20;
- break;
- case 3:
- reg |= (uint32_t(counter_reset) & 0x000001) << 2;
- reg |= (uint32_t(power_down) & 0x000001) << 3;
- reg |= (uint32_t(muxout) & 0x000007) << 4;
- reg |= (uint32_t(phase_detector_polarity) & 0x000001) << 7;
- reg |= (uint32_t(charge_pump_mode) & 0x000001) << 8;
- reg |= (uint32_t(fastlock_mode) & 0x000003) << 9;
- reg |= (uint32_t(timer_counter_control) & 0x00000F) << 11;
- reg |= (uint32_t(charge_pump_current_1) & 0x000007) << 15;
- reg |= (uint32_t(charge_pump_current_2) & 0x000007) << 18;
- reg |= (uint32_t(power_down) & 0x000002) << 20;
- break;
- default:
- break;
+ case 0:
+ reg |= (uint32_t(ref_counter) & 0x003FFF) << 2;
+ reg |= (uint32_t(anti_backlash_width) & 0x000003) << 16;
+ reg |= (uint32_t(lock_detect_precision) & 0x000001) << 20;
+ break;
+ case 1:
+ reg |= (uint32_t(n) & 0x001FFF) << 8;
+ reg |= (uint32_t(charge_pump_gain) & 0x000001) << 21;
+ break;
+ case 2:
+ reg |= (uint32_t(counter_reset) & 0x000001) << 2;
+ reg |= (uint32_t(power_down) & 0x000001) << 3;
+ reg |= (uint32_t(muxout) & 0x000007) << 4;
+ reg |= (uint32_t(phase_detector_polarity) & 0x000001) << 7;
+ reg |= (uint32_t(charge_pump_mode) & 0x000001) << 8;
+ reg |= (uint32_t(fastlock_mode) & 0x000003) << 9;
+ reg |= (uint32_t(timer_counter_control) & 0x00000F) << 11;
+ reg |= (uint32_t(charge_pump_current_1) & 0x000007) << 15;
+ reg |= (uint32_t(charge_pump_current_2) & 0x000007) << 18;
+ reg |= (uint32_t(power_down) & 0x000002) << 20;
+ break;
+ case 3:
+ reg |= (uint32_t(counter_reset) & 0x000001) << 2;
+ reg |= (uint32_t(power_down) & 0x000001) << 3;
+ reg |= (uint32_t(muxout) & 0x000007) << 4;
+ reg |= (uint32_t(phase_detector_polarity) & 0x000001) << 7;
+ reg |= (uint32_t(charge_pump_mode) & 0x000001) << 8;
+ reg |= (uint32_t(fastlock_mode) & 0x000003) << 9;
+ reg |= (uint32_t(timer_counter_control) & 0x00000F) << 11;
+ reg |= (uint32_t(charge_pump_current_1) & 0x000007) << 15;
+ reg |= (uint32_t(charge_pump_current_2) & 0x000007) << 18;
+ reg |= (uint32_t(power_down) & 0x000002) << 20;
+ break;
+ default:
+ break;
}
reg |= (uint32_t(addr) & 0x03);
@@ -83,30 +84,30 @@ uint32_t adf4001_regs_t::get_reg(uint8_t addr) {
}
-adf4001_ctrl::adf4001_ctrl(uhd::spi_iface::sptr _spi, int slaveno):
- spi_iface(_spi),
- slaveno(slaveno)
- {
-
+adf4001_ctrl::adf4001_ctrl(uhd::spi_iface::sptr _spi, int slaveno)
+ : spi_iface(_spi), slaveno(slaveno)
+{
spi_config.mosi_edge = spi_config_t::EDGE_RISE;
- //set defaults
- adf4001_regs.ref_counter = 1;
- adf4001_regs.n = 4;
+ // set defaults
+ adf4001_regs.ref_counter = 1;
+ adf4001_regs.n = 4;
adf4001_regs.charge_pump_current_1 = 7;
adf4001_regs.charge_pump_current_2 = 7;
- adf4001_regs.muxout = adf4001_regs_t::MUXOUT_DLD;
- adf4001_regs.counter_reset = adf4001_regs_t::COUNTER_RESET_NORMAL;
- adf4001_regs.phase_detector_polarity = adf4001_regs_t::PHASE_DETECTOR_POLARITY_POSITIVE;
+ adf4001_regs.muxout = adf4001_regs_t::MUXOUT_DLD;
+ adf4001_regs.counter_reset = adf4001_regs_t::COUNTER_RESET_NORMAL;
+ adf4001_regs.phase_detector_polarity =
+ adf4001_regs_t::PHASE_DETECTOR_POLARITY_POSITIVE;
adf4001_regs.charge_pump_mode = adf4001_regs_t::CHARGE_PUMP_TRISTATE;
- //everything else should be defaults
+ // everything else should be defaults
program_regs();
}
-void adf4001_ctrl::set_lock_to_ext_ref(bool external) {
- if(external) {
+void adf4001_ctrl::set_lock_to_ext_ref(bool external)
+{
+ if (external) {
adf4001_regs.charge_pump_mode = adf4001_regs_t::CHARGE_PUMP_NORMAL;
} else {
adf4001_regs.charge_pump_mode = adf4001_regs_t::CHARGE_PUMP_TRISTATE;
@@ -115,27 +116,25 @@ void adf4001_ctrl::set_lock_to_ext_ref(bool external) {
program_regs();
}
-void adf4001_ctrl::program_regs(void) {
- //no control over CE, only LE, therefore we use the initialization latch method
+void adf4001_ctrl::program_regs(void)
+{
+ // no control over CE, only LE, therefore we use the initialization latch method
write_reg(3);
- //conduct a function latch (2)
+ // conduct a function latch (2)
write_reg(2);
- //write R counter latch (0)
+ // write R counter latch (0)
write_reg(0);
- //write N counter latch (1)
+ // write N counter latch (1)
write_reg(1);
}
-void adf4001_ctrl::write_reg(uint8_t addr) {
- uint32_t reg = adf4001_regs.get_reg(addr); //load the reg data
+void adf4001_ctrl::write_reg(uint8_t addr)
+{
+ uint32_t reg = adf4001_regs.get_reg(addr); // load the reg data
- spi_iface->transact_spi(slaveno,
- spi_config,
- reg,
- 24,
- false);
+ spi_iface->transact_spi(slaveno, spi_config, reg, 24, false);
}
diff --git a/host/lib/usrp/common/adf435x.cpp b/host/lib/usrp/common/adf435x.cpp
index 6d59befaa..4b5f9ac7e 100644
--- a/host/lib/usrp/common/adf435x.cpp
+++ b/host/lib/usrp/common/adf435x.cpp
@@ -9,9 +9,7 @@
using namespace uhd;
-adf435x_iface::~adf435x_iface()
-{
-}
+adf435x_iface::~adf435x_iface() {}
adf435x_iface::sptr adf435x_iface::make_adf4350(write_fn_t write)
{
diff --git a/host/lib/usrp/common/apply_corrections.cpp b/host/lib/usrp/common/apply_corrections.cpp
index b57ace71b..b75ab7d95 100644
--- a/host/lib/usrp/common/apply_corrections.cpp
+++ b/host/lib/usrp/common/apply_corrections.cpp
@@ -5,16 +5,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/common/apply_corrections.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/utils/paths.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/utils/csv.hpp>
-#include <uhd/types/dict.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/paths.hpp>
+#include <uhdlib/usrp/common/apply_corrections.hpp>
#include <boost/filesystem.hpp>
#include <boost/thread/mutex.hpp>
-#include <cstdio>
#include <complex>
+#include <cstdio>
#include <fstream>
namespace fs = boost::filesystem;
@@ -24,24 +24,27 @@ boost::mutex corrections_mutex;
/***********************************************************************
* Helper routines
**********************************************************************/
-static double linear_interp(double x, double x0, double y0, double x1, double y1){
- return y0 + (x - x0)*(y1 - y0)/(x1 - x0);
+static double linear_interp(double x, double x0, double y0, double x1, double y1)
+{
+ return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
}
/***********************************************************************
* FE apply corrections implementation
**********************************************************************/
-struct fe_cal_t{
+struct fe_cal_t
+{
double lo_freq;
double iq_corr_real;
double iq_corr_imag;
};
-static bool fe_cal_comp(fe_cal_t a, fe_cal_t b){
+static bool fe_cal_comp(fe_cal_t a, fe_cal_t b)
+{
return (a.lo_freq < b.lo_freq);
}
-static uhd::dict<std::string, std::vector<fe_cal_t> > fe_cal_cache;
+static uhd::dict<std::string, std::vector<fe_cal_t>> fe_cal_cache;
static bool is_same_freq(const double f1, const double f2)
{
@@ -50,36 +53,46 @@ static bool is_same_freq(const double f1, const double f2)
}
static std::complex<double> get_fe_correction(
- const std::string &key, const double lo_freq
-){
- const std::vector<fe_cal_t> &datas = fe_cal_cache[key];
- if (datas.empty()) throw uhd::runtime_error("empty calibration table " + key);
+ const std::string& key, const double lo_freq)
+{
+ const std::vector<fe_cal_t>& datas = fe_cal_cache[key];
+ if (datas.empty())
+ throw uhd::runtime_error("empty calibration table " + key);
- //search for lo freq
+ // search for lo freq
size_t lo_index = 0;
- size_t hi_index = datas.size()-1;
- for (size_t i = 0; i < datas.size(); i++){
- if (is_same_freq(datas[i].lo_freq, lo_freq))
- {
+ size_t hi_index = datas.size() - 1;
+ for (size_t i = 0; i < datas.size(); i++) {
+ if (is_same_freq(datas[i].lo_freq, lo_freq)) {
hi_index = i;
lo_index = i;
break;
}
- if (datas[i].lo_freq > lo_freq){
+ if (datas[i].lo_freq > lo_freq) {
hi_index = i;
break;
}
lo_index = i;
}
- if (lo_index == 0) return std::complex<double>(datas[lo_index].iq_corr_real, datas[lo_index].iq_corr_imag);
- if (hi_index == lo_index) return std::complex<double>(datas[hi_index].iq_corr_real, datas[hi_index].iq_corr_imag);
-
- //interpolation time
- return std::complex<double>(
- linear_interp(lo_freq, datas[lo_index].lo_freq, datas[lo_index].iq_corr_real, datas[hi_index].lo_freq, datas[hi_index].iq_corr_real),
- linear_interp(lo_freq, datas[lo_index].lo_freq, datas[lo_index].iq_corr_imag, datas[hi_index].lo_freq, datas[hi_index].iq_corr_imag)
- );
+ if (lo_index == 0)
+ return std::complex<double>(
+ datas[lo_index].iq_corr_real, datas[lo_index].iq_corr_imag);
+ if (hi_index == lo_index)
+ return std::complex<double>(
+ datas[hi_index].iq_corr_real, datas[hi_index].iq_corr_imag);
+
+ // interpolation time
+ return std::complex<double>(linear_interp(lo_freq,
+ datas[lo_index].lo_freq,
+ datas[lo_index].iq_corr_real,
+ datas[hi_index].lo_freq,
+ datas[hi_index].iq_corr_real),
+ linear_interp(lo_freq,
+ datas[lo_index].lo_freq,
+ datas[lo_index].iq_corr_imag,
+ datas[hi_index].lo_freq,
+ datas[hi_index].iq_corr_imag));
}
static void apply_fe_corrections(uhd::property_tree::sptr sub_tree,
@@ -88,43 +101,45 @@ static void apply_fe_corrections(uhd::property_tree::sptr sub_tree,
const std::string& file_prefix,
const double lo_freq)
{
- //make the calibration file path
+ // make the calibration file path
const fs::path cal_data_path = fs::path(uhd::get_app_path()) / ".uhd" / "cal"
/ (file_prefix + db_serial + ".csv");
- if (not fs::exists(cal_data_path)) return;
+ if (not fs::exists(cal_data_path))
+ return;
- //parse csv file or get from cache
- if (not fe_cal_cache.has_key(cal_data_path.string())){
+ // parse csv file or get from cache
+ if (not fe_cal_cache.has_key(cal_data_path.string())) {
std::ifstream cal_data(cal_data_path.string().c_str());
const uhd::csv::rows_type rows = uhd::csv::to_rows(cal_data);
- bool read_data = false, skip_next = false;;
+ bool read_data = false, skip_next = false;
+ ;
std::vector<fe_cal_t> datas;
- for(const uhd::csv::row_type &row: rows){
- if (not read_data and not row.empty() and row[0] == "DATA STARTS HERE"){
+ for (const uhd::csv::row_type& row : rows) {
+ if (not read_data and not row.empty() and row[0] == "DATA STARTS HERE") {
read_data = true;
skip_next = true;
continue;
}
- if (not read_data) continue;
- if (skip_next){
+ if (not read_data)
+ continue;
+ if (skip_next) {
skip_next = false;
continue;
}
fe_cal_t data;
- std::sscanf(row[0].c_str(), "%lf" , &data.lo_freq);
- std::sscanf(row[1].c_str(), "%lf" , &data.iq_corr_real);
- std::sscanf(row[2].c_str(), "%lf" , &data.iq_corr_imag);
+ std::sscanf(row[0].c_str(), "%lf", &data.lo_freq);
+ std::sscanf(row[1].c_str(), "%lf", &data.iq_corr_real);
+ std::sscanf(row[2].c_str(), "%lf", &data.iq_corr_imag);
datas.push_back(data);
}
std::sort(datas.begin(), datas.end(), fe_cal_comp);
fe_cal_cache[cal_data_path.string()] = datas;
UHD_LOGGER_INFO("CAL") << "Calibration data loaded: " << cal_data_path.string();
-
}
- sub_tree->access<std::complex<double> >(fe_path)
- .set(get_fe_correction(cal_data_path.string(), lo_freq));
+ sub_tree->access<std::complex<double>>(fe_path).set(
+ get_fe_correction(cal_data_path.string(), lo_freq));
}
/***********************************************************************
@@ -139,7 +154,7 @@ void uhd::usrp::apply_tx_fe_corrections( // overloading to work according to rfn
)
{
boost::mutex::scoped_lock l(corrections_mutex);
- try{
+ try {
apply_fe_corrections(sub_tree,
db_serial,
tx_fe_corr_path + "/iq_balance/value",
@@ -150,17 +165,17 @@ void uhd::usrp::apply_tx_fe_corrections( // overloading to work according to rfn
tx_fe_corr_path + "/dc_offset/value",
"tx_dc_cal_v0.2_",
lo_freq);
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
UHD_LOGGER_ERROR("CAL") << "Failure in apply_tx_fe_corrections: " << e.what();
}
}
void uhd::usrp::apply_tx_fe_corrections(
- property_tree::sptr sub_tree, //starts at mboards/x
- const std::string &slot, //name of dboard slot
- const double lo_freq //actual lo freq
-){
+ property_tree::sptr sub_tree, // starts at mboards/x
+ const std::string& slot, // name of dboard slot
+ const double lo_freq // actual lo freq
+)
+{
boost::mutex::scoped_lock l(corrections_mutex);
// extract eeprom serial
@@ -168,7 +183,7 @@ void uhd::usrp::apply_tx_fe_corrections(
const std::string db_serial =
sub_tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get().serial;
- try{
+ try {
apply_fe_corrections(sub_tree,
db_serial,
"tx_frontends/" + slot + "/iq_balance/value",
@@ -179,8 +194,7 @@ void uhd::usrp::apply_tx_fe_corrections(
"tx_frontends/" + slot + "/dc_offset/value",
"tx_dc_cal_v0.2_",
lo_freq);
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
UHD_LOGGER_ERROR("CAL") << "Failure in apply_tx_fe_corrections: " << e.what();
}
}
@@ -194,35 +208,34 @@ void uhd::usrp::apply_rx_fe_corrections( // overloading to work according to rfn
)
{
boost::mutex::scoped_lock l(corrections_mutex);
- try{
+ try {
apply_fe_corrections(sub_tree,
db_serial,
rx_fe_corr_path + "/iq_balance/value",
"rx_iq_cal_v0.2_",
lo_freq);
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
UHD_LOGGER_ERROR("CAL") << "Failure in apply_tx_fe_corrections: " << e.what();
}
}
void uhd::usrp::apply_rx_fe_corrections(
- property_tree::sptr sub_tree, //starts at mboards/x
- const std::string &slot, //name of dboard slot
- const double lo_freq //actual lo freq
-){
+ property_tree::sptr sub_tree, // starts at mboards/x
+ const std::string& slot, // name of dboard slot
+ const double lo_freq // actual lo freq
+)
+{
boost::mutex::scoped_lock l(corrections_mutex);
const uhd::fs_path db_path = "dboards/" + slot + "/rx_eeprom";
const std::string db_serial =
sub_tree->access<uhd::usrp::dboard_eeprom_t>(db_path).get().serial;
- try{
+ try {
apply_fe_corrections(sub_tree,
db_serial,
"rx_frontends/" + slot + "/iq_balance/value",
"rx_iq_cal_v0.2_",
lo_freq);
- }
- catch(const std::exception &e){
+ } catch (const std::exception& e) {
UHD_LOGGER_ERROR("CAL") << "Failure in apply_rx_fe_corrections: " << e.what();
}
}
diff --git a/host/lib/usrp/common/fx2_ctrl.cpp b/host/lib/usrp/common/fx2_ctrl.cpp
index 77501d981..cbb108dae 100644
--- a/host/lib/usrp/common/fx2_ctrl.cpp
+++ b/host/lib/usrp/common/fx2_ctrl.cpp
@@ -5,19 +5,19 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/common/fx2_ctrl.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/exception.hpp>
#include <uhd/transport/usb_control.hpp>
-#include <boost/functional/hash.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhdlib/usrp/common/fx2_ctrl.hpp>
#include <stdint.h>
+#include <boost/functional/hash.hpp>
+#include <chrono>
+#include <cstring>
#include <fstream>
#include <sstream>
#include <string>
-#include <vector>
-#include <cstring>
-#include <chrono>
#include <thread>
+#include <vector>
using namespace uhd;
using namespace uhd::usrp;
@@ -37,10 +37,10 @@ typedef uint32_t hash_type;
* \param filename file used to generate hash value
* \return hash value in a size_t type
*/
-static hash_type generate_hash(const char *filename)
+static hash_type generate_hash(const char* filename)
{
std::ifstream file(filename);
- if (not file){
+ if (not file) {
throw uhd::io_error(std::string("cannot open input file ") + filename);
}
@@ -51,7 +51,7 @@ static hash_type generate_hash(const char *filename)
boost::hash_combine(hash, ch);
}
- if (not file.eof()){
+ if (not file.eof()) {
throw uhd::io_error(std::string("file error ") + filename);
}
@@ -65,9 +65,8 @@ static hash_type generate_hash(const char *filename)
* \param record a line from an Intel HEX file
* \return true if record is valid, false otherwise
*/
-static bool checksum(std::string *record)
+static bool checksum(std::string* record)
{
-
size_t len = record->length();
unsigned int i;
unsigned char sum = 0;
@@ -79,9 +78,9 @@ static bool checksum(std::string *record)
}
if (sum == 0)
- return true;
+ return true;
else
- return false;
+ return false;
}
@@ -95,9 +94,11 @@ static bool checksum(std::string *record)
* \param data output data
* \return true if record is sucessfully read, false on error
*/
-bool parse_record(std::string *record, unsigned int &len,
- unsigned int &addr, unsigned int &type,
- unsigned char* data)
+bool parse_record(std::string* record,
+ unsigned int& len,
+ unsigned int& addr,
+ unsigned int& type,
+ unsigned char* data)
{
unsigned int i;
std::string _data;
@@ -110,12 +111,12 @@ bool parse_record(std::string *record, unsigned int &len,
std::istringstream(record->substr(3, 4)) >> std::hex >> addr;
std::istringstream(record->substr(7, 2)) >> std::hex >> type;
- if (len > (2 * (record->length() - 9))) // sanity check to prevent buffer overrun
+ if (len > (2 * (record->length() - 9))) // sanity check to prevent buffer overrun
return false;
for (i = 0; i < len; i++) {
std::istringstream(record->substr(9 + 2 * i, 2)) >> std::hex >> val;
- data[i] = (unsigned char) val;
+ data[i] = (unsigned char)val;
}
return true;
@@ -125,33 +126,37 @@ bool parse_record(std::string *record, unsigned int &len,
/*!
* USRP control implementation for device discovery and configuration
*/
-class fx2_ctrl_impl : public fx2_ctrl {
+class fx2_ctrl_impl : public fx2_ctrl
+{
public:
fx2_ctrl_impl(uhd::transport::usb_control::sptr ctrl_transport)
{
_ctrl_transport = ctrl_transport;
}
- void usrp_fx2_reset(void){
+ void usrp_fx2_reset(void)
+ {
unsigned char reset_y = 1;
unsigned char reset_n = 0;
usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_y, 1);
usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_n, 1);
- //wait for things to settle
+ // wait for things to settle
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
void usrp_load_firmware(std::string filestring, bool force)
{
- const char *filename = filestring.c_str();
+ const char* filename = filestring.c_str();
hash_type hash = generate_hash(filename);
- hash_type loaded_hash; usrp_get_firmware_hash(loaded_hash);
+ hash_type loaded_hash;
+ usrp_get_firmware_hash(loaded_hash);
- if (not force and (hash == loaded_hash)) return;
+ if (not force and (hash == loaded_hash))
+ return;
- //FIXME: verify types
+ // FIXME: verify types
unsigned int len;
unsigned int addr;
unsigned int type;
@@ -167,54 +172,59 @@ public:
unsigned char reset_y = 1;
unsigned char reset_n = 0;
- //hit the reset line
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "Loading firmware image: " << filestring << "...";
+ // hit the reset line
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "Loading firmware image: " << filestring << "...";
usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_y, 1);
while (!file.eof()) {
- std::string record;
- file >> record;
+ std::string record;
+ file >> record;
if (!(record.length() > 0))
continue;
- //check for valid record
- if (not checksum(&record) or not parse_record(&record, len, addr, type, data)) {
+ // check for valid record
+ if (not checksum(&record)
+ or not parse_record(&record, len, addr, type, data)) {
throw uhd::io_error("usrp_load_firmware: bad record checksum");
}
- //type 0x00 is data
+ // type 0x00 is data
if (type == 0x00) {
int ret = usrp_control_write(FX2_FIRMWARE_LOAD, addr, 0, data, len);
- if (ret < 0) throw uhd::io_error("usrp_load_firmware: usrp_control_write failed");
+ if (ret < 0)
+ throw uhd::io_error("usrp_load_firmware: usrp_control_write failed");
}
- //type 0x01 is end
+ // type 0x01 is end
else if (type == 0x01) {
- usrp_set_firmware_hash(hash); //set hash before reset
+ usrp_set_firmware_hash(hash); // set hash before reset
usrp_control_write(FX2_FIRMWARE_LOAD, 0xe600, 0, &reset_n, 1);
file.close();
- //wait for things to settle
+ // wait for things to settle
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "Firmware loaded";
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "Firmware loaded";
return;
}
- //type anything else is unhandled
+ // type anything else is unhandled
else {
throw uhd::io_error("usrp_load_firmware: unsupported record");
}
}
- //file did not end
+ // file did not end
throw uhd::io_error("usrp_load_firmware: bad record");
}
- void usrp_init(void){
- //disable
+ void usrp_init(void)
+ {
+ // disable
usrp_rx_enable(false);
usrp_tx_enable(false);
- //toggle resets
+ // toggle resets
usrp_rx_reset(true);
usrp_tx_reset(true);
usrp_rx_reset(false);
@@ -223,33 +233,37 @@ public:
void usrp_load_fpga(std::string filestring)
{
- const char *filename = filestring.c_str();
+ const char* filename = filestring.c_str();
hash_type hash = generate_hash(filename);
- hash_type loaded_hash; usrp_get_fpga_hash(loaded_hash);
+ hash_type loaded_hash;
+ usrp_get_fpga_hash(loaded_hash);
- if (hash == loaded_hash) return;
+ if (hash == loaded_hash)
+ return;
const int ep0_size = 64;
unsigned char buf[ep0_size];
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "Loading FPGA image: " << filestring << "...";
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "Loading FPGA image: " << filestring << "...";
std::ifstream file;
file.open(filename, std::ios::in | std::ios::binary);
if (not file.good()) {
throw uhd::io_error("usrp_load_fpga: cannot open fpga input file");
}
- usrp_fpga_reset(true); //holding the fpga in reset while loading
+ usrp_fpga_reset(true); // holding the fpga in reset while loading
if (usrp_control_write_cmd(VRQ_FPGA_LOAD, 0, FL_BEGIN) < 0) {
throw uhd::io_error("usrp_load_fpga: fpga load error");
}
while (not file.eof()) {
- file.read((char *)buf, sizeof(buf));
+ file.read((char*)buf, sizeof(buf));
const std::streamsize n = file.gcount();
- if(n == 0) continue;
+ if (n == 0)
+ continue;
int ret = usrp_control_write(VRQ_FPGA_LOAD, 0, FL_XFER, buf, uint16_t(n));
if (ret < 0 or std::streamsize(ret) != n) {
throw uhd::io_error("usrp_load_fpga: fpga load error");
@@ -262,16 +276,18 @@ public:
usrp_set_fpga_hash(hash);
- usrp_fpga_reset(false); //done loading, take fpga out of reset
+ usrp_fpga_reset(false); // done loading, take fpga out of reset
file.close();
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "FPGA image loaded";
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "FPGA image loaded";
}
void usrp_load_eeprom(std::string filestring)
{
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "Loading EEPROM image: " << filestring << "...";
- const char *filename = filestring.c_str();
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "Loading EEPROM image: " << filestring << "...";
+ const char* filename = filestring.c_str();
const uint16_t i2c_addr = 0x50;
unsigned int addr;
@@ -285,19 +301,20 @@ public:
throw uhd::io_error("usrp_load_eeprom: cannot open EEPROM input file");
}
- file.read((char *)data, 256);
+ file.read((char*)data, 256);
std::streamsize len = file.gcount();
- if(len == 256) {
+ if (len == 256) {
throw uhd::io_error("usrp_load_eeprom: image size too large");
}
const int pagesize = 16;
- addr = 0;
- while(len > 0) {
+ addr = 0;
+ while (len > 0) {
sendbuf[0] = addr;
- memcpy(sendbuf+1, &data[addr], len > pagesize ? pagesize : size_t(len));
- int ret = usrp_i2c_write(i2c_addr, sendbuf, (len > pagesize ? pagesize : size_t(len))+1);
+ memcpy(sendbuf + 1, &data[addr], len > pagesize ? pagesize : size_t(len));
+ int ret = usrp_i2c_write(
+ i2c_addr, sendbuf, (len > pagesize ? pagesize : size_t(len)) + 1);
if (ret < 0) {
throw uhd::io_error("usrp_load_eeprom: usrp_i2c_write failed");
}
@@ -306,7 +323,8 @@ public:
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
file.close();
- if (load_img_msg) UHD_LOGGER_INFO("FX2") << "EEPROM image loaded";
+ if (load_img_msg)
+ UHD_LOGGER_INFO("FX2") << "EEPROM image loaded";
}
@@ -316,32 +334,39 @@ public:
}
- void usrp_get_firmware_hash(hash_type &hash)
+ void usrp_get_firmware_hash(hash_type& hash)
{
- UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(hash)) >= 0);
+ UHD_ASSERT_THROW(
+ usrp_control_read(
+ 0xa0, USRP_HASH_SLOT_0_ADDR, 0, (unsigned char*)&hash, sizeof(hash))
+ >= 0);
}
void usrp_set_firmware_hash(hash_type hash)
{
- UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_0_ADDR, 0,
- (unsigned char*) &hash, sizeof(hash)) >= 0);
-
+ UHD_ASSERT_THROW(
+ usrp_control_write(
+ 0xa0, USRP_HASH_SLOT_0_ADDR, 0, (unsigned char*)&hash, sizeof(hash))
+ >= 0);
}
- void usrp_get_fpga_hash(hash_type &hash)
+ void usrp_get_fpga_hash(hash_type& hash)
{
- UHD_ASSERT_THROW(usrp_control_read(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(hash)) >= 0);
+ UHD_ASSERT_THROW(
+ usrp_control_read(
+ 0xa0, USRP_HASH_SLOT_1_ADDR, 0, (unsigned char*)&hash, sizeof(hash))
+ >= 0);
}
void usrp_set_fpga_hash(hash_type hash)
{
- UHD_ASSERT_THROW(usrp_control_write(0xa0, USRP_HASH_SLOT_1_ADDR, 0,
- (unsigned char*) &hash, sizeof(hash)) >= 0);
+ UHD_ASSERT_THROW(
+ usrp_control_write(
+ 0xa0, USRP_HASH_SLOT_1_ADDR, 0, (unsigned char*)&hash, sizeof(hash))
+ >= 0);
}
void usrp_tx_enable(bool on)
@@ -373,32 +398,32 @@ public:
}
int usrp_control_write(uint8_t request,
- uint16_t value,
- uint16_t index,
- unsigned char *buff,
- uint16_t length)
+ uint16_t value,
+ uint16_t index,
+ unsigned char* buff,
+ uint16_t length)
{
- return _ctrl_transport->submit(VRT_VENDOR_OUT, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length); // wLength
+ return _ctrl_transport->submit(VRT_VENDOR_OUT, // bmReqeustType
+ request, // bRequest
+ value, // wValue
+ index, // wIndex
+ buff, // data
+ length); // wLength
}
int usrp_control_read(uint8_t request,
- uint16_t value,
- uint16_t index,
- unsigned char *buff,
- uint16_t length)
+ uint16_t value,
+ uint16_t index,
+ unsigned char* buff,
+ uint16_t length)
{
- return _ctrl_transport->submit(VRT_VENDOR_IN, // bmReqeustType
- request, // bRequest
- value, // wValue
- index, // wIndex
- buff, // data
- length); // wLength
+ return _ctrl_transport->submit(VRT_VENDOR_IN, // bmReqeustType
+ request, // bRequest
+ value, // wValue
+ index, // wIndex
+ buff, // data
+ length); // wLength
}
@@ -407,33 +432,31 @@ public:
return usrp_control_write(request, value, index, 0, 0);
}
- byte_vector_t read_eeprom(
- uint16_t addr,
- uint16_t offset,
- size_t num_bytes
- ){
+ byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes)
+ {
this->write_i2c(addr, byte_vector_t(1, uint8_t(offset)));
return this->read_i2c(addr, num_bytes);
}
- int usrp_i2c_write(uint16_t i2c_addr, unsigned char *buf, uint16_t len)
+ int usrp_i2c_write(uint16_t i2c_addr, unsigned char* buf, uint16_t len)
{
return usrp_control_write(VRQ_I2C_WRITE, i2c_addr, 0, buf, len);
}
- int usrp_i2c_read(uint16_t i2c_addr, unsigned char *buf, uint16_t len)
+ int usrp_i2c_read(uint16_t i2c_addr, unsigned char* buf, uint16_t len)
{
return usrp_control_read(VRQ_I2C_READ, i2c_addr, 0, buf, len);
}
- static const bool iface_debug = false;
+ static const bool iface_debug = false;
static const size_t max_i2c_data_bytes = 64;
- void write_i2c(uint16_t addr, const byte_vector_t &bytes)
+ void write_i2c(uint16_t addr, const byte_vector_t& bytes)
{
UHD_ASSERT_THROW(bytes.size() < max_i2c_data_bytes);
- int ret = this->usrp_i2c_write(addr, (unsigned char *)&bytes.front(), bytes.size());
+ int ret =
+ this->usrp_i2c_write(addr, (unsigned char*)&bytes.front(), bytes.size());
if (iface_debug && (ret < 0))
uhd::runtime_error("USRP: failed i2c write");
@@ -441,15 +464,15 @@ public:
byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
{
- UHD_ASSERT_THROW(num_bytes < max_i2c_data_bytes);
+ UHD_ASSERT_THROW(num_bytes < max_i2c_data_bytes);
- byte_vector_t bytes(num_bytes);
- int ret = this->usrp_i2c_read(addr, (unsigned char *)&bytes.front(), num_bytes);
+ byte_vector_t bytes(num_bytes);
+ int ret = this->usrp_i2c_read(addr, (unsigned char*)&bytes.front(), num_bytes);
- if (iface_debug && ((ret < 0) || (unsigned)ret < (num_bytes)))
- uhd::runtime_error("USRP: failed i2c read");
+ if (iface_debug && ((ret < 0) || (unsigned)ret < (num_bytes)))
+ uhd::runtime_error("USRP: failed i2c read");
- return bytes;
+ return bytes;
}
@@ -460,7 +483,7 @@ private:
/***********************************************************************
* Public make function for fx2_ctrl interface
**********************************************************************/
-fx2_ctrl::sptr fx2_ctrl::make(uhd::transport::usb_control::sptr ctrl_transport){
+fx2_ctrl::sptr fx2_ctrl::make(uhd::transport::usb_control::sptr ctrl_transport)
+{
return sptr(new fx2_ctrl_impl(ctrl_transport));
}
-
diff --git a/host/lib/usrp/common/io_service_args.cpp b/host/lib/usrp/common/io_service_args.cpp
index 8a55b8ee0..8be1ff89b 100644
--- a/host/lib/usrp/common/io_service_args.cpp
+++ b/host/lib/usrp/common/io_service_args.cpp
@@ -58,16 +58,18 @@ io_service_args_t read_io_service_args(
io_service_args_t io_srv_args;
std::string tmp_str, default_str;
- io_srv_args.recv_offload = get_bool_arg(args, recv_offload_str, defaults.recv_offload);
- io_srv_args.send_offload = get_bool_arg(args, send_offload_str, defaults.send_offload);
+ io_srv_args.recv_offload =
+ get_bool_arg(args, recv_offload_str, defaults.recv_offload);
+ io_srv_args.send_offload =
+ get_bool_arg(args, send_offload_str, defaults.send_offload);
io_srv_args.recv_offload_wait_mode = get_wait_mode_arg(
args, recv_offload_wait_mode_str, defaults.recv_offload_wait_mode);
io_srv_args.send_offload_wait_mode = get_wait_mode_arg(
args, send_offload_wait_mode_str, defaults.send_offload_wait_mode);
- io_srv_args.num_poll_offload_threads =
- args.cast<size_t>(num_poll_offload_threads_str, defaults.num_poll_offload_threads);
+ io_srv_args.num_poll_offload_threads = args.cast<size_t>(
+ num_poll_offload_threads_str, defaults.num_poll_offload_threads);
if (io_srv_args.num_poll_offload_threads == 0) {
UHD_LOG_WARNING(LOG_ID,
"Invalid value for num_poll_offload_threads. "
@@ -75,7 +77,8 @@ io_service_args_t read_io_service_args(
io_srv_args.num_poll_offload_threads = 1;
}
- auto read_thread_args = [&args](const std::regex& expr, std::map<size_t, size_t>& dest) {
+ auto read_thread_args = [&args](
+ const std::regex& expr, std::map<size_t, size_t>& dest) {
auto keys = args.keys();
for (const auto& key : keys) {
std::smatch match;
diff --git a/host/lib/usrp/common/io_service_mgr.cpp b/host/lib/usrp/common/io_service_mgr.cpp
index 19c06a826..e30fa422d 100644
--- a/host/lib/usrp/common/io_service_mgr.cpp
+++ b/host/lib/usrp/common/io_service_mgr.cpp
@@ -40,8 +40,8 @@ namespace uhd { namespace usrp {
class inline_io_service_mgr
{
public:
- io_service::sptr connect_links(recv_link_if::sptr recv_link,
- send_link_if::sptr send_link);
+ io_service::sptr connect_links(
+ recv_link_if::sptr recv_link, send_link_if::sptr send_link);
void disconnect_links(recv_link_if::sptr recv_link, send_link_if::sptr send_link);
@@ -56,8 +56,8 @@ private:
std::map<link_pair_t, link_info_t> _link_info_map;
};
-io_service::sptr inline_io_service_mgr::connect_links(recv_link_if::sptr recv_link,
- send_link_if::sptr send_link)
+io_service::sptr inline_io_service_mgr::connect_links(
+ recv_link_if::sptr recv_link, send_link_if::sptr send_link)
{
// Check if links are already connected
const link_pair_t links{recv_link, send_link};
@@ -421,12 +421,7 @@ public:
void disconnect_links(recv_link_if::sptr recv_link, send_link_if::sptr send_link);
private:
- enum io_service_type_t
- {
- INLINE_IO_SRV,
- BLOCKING_IO_SRV,
- POLLING_IO_SRV
- };
+ enum io_service_type_t { INLINE_IO_SRV, BLOCKING_IO_SRV, POLLING_IO_SRV };
struct xport_args_t
{
bool offload = false;
@@ -463,7 +458,8 @@ io_service_mgr::sptr io_service_mgr::make(const uhd::device_addr_t& args)
#ifdef HAVE_DPDK
return std::make_shared<dpdk_io_service_mgr_impl>();
#else
- UHD_LOG_WARNING(LOG_ID, "Cannot instantiate DPDK I/O service. Proceeding with regular I/O service.");
+ UHD_LOG_WARNING(LOG_ID,
+ "Cannot instantiate DPDK I/O service. Proceeding with regular I/O service.");
#endif
}
return std::make_shared<io_service_mgr_impl>(args);
@@ -485,8 +481,8 @@ io_service::sptr io_service_mgr_impl::connect_links(recv_link_if::sptr recv_link
default_args.send_offload = false;
}
- const io_service_args_t args = read_io_service_args(
- merge_io_service_dev_args(_args, stream_args), default_args);
+ const io_service_args_t args =
+ read_io_service_args(merge_io_service_dev_args(_args, stream_args), default_args);
// Check if the links are already attached to an I/O service. If they are,
// then use the same manager to connect, since links can only be connected
@@ -528,7 +524,8 @@ io_service::sptr io_service_mgr_impl::connect_links(recv_link_if::sptr recv_link
// the inline I/O service. Warn if a different one was requested.
if (!_out_of_order_supported(recv_link, send_link)) {
if (io_srv_type != INLINE_IO_SRV) {
- UHD_LOG_WARNING(LOG_ID, "Link type does not support send/recv offload, ignoring");
+ UHD_LOG_WARNING(
+ LOG_ID, "Link type does not support send/recv offload, ignoring");
}
io_srv_type = INLINE_IO_SRV;
}
diff --git a/host/lib/usrp/common/lmx2592.cpp b/host/lib/usrp/common/lmx2592.cpp
index e6ffdfbfb..e1c85c05f 100644
--- a/host/lib/usrp/common/lmx2592.cpp
+++ b/host/lib/usrp/common/lmx2592.cpp
@@ -80,12 +80,17 @@ enum intermediate_frequency_t {
FRF_IN,
};
-const char* log_intermediate_frequency(intermediate_frequency_t inter) {
+const char* log_intermediate_frequency(intermediate_frequency_t inter)
+{
switch (inter) {
- case FRF_IN: return "FRF_IN";
- case FVCO: return "FVCO";
- case FLO: return "FLO";
- default: return "???";
+ case FRF_IN:
+ return "FRF_IN";
+ case FVCO:
+ return "FVCO";
+ case FLO:
+ return "FLO";
+ default:
+ return "???";
}
}
@@ -98,30 +103,30 @@ inline bool abs_less_than_compare(const double a, const double b)
typedef std::pair<double, intermediate_frequency_t> offset_t;
// comparator that uses absolute value on the first value of an offset_t
-inline bool offset_abs_less_than_compare(
- const offset_t a,
- const offset_t b)
+inline bool offset_abs_less_than_compare(const offset_t a, const offset_t b)
{
return std::abs(a.first) < std::abs(b.first);
}
-}
+} // namespace
-class lmx2592_impl : public lmx2592_iface {
+class lmx2592_impl : public lmx2592_iface
+{
public:
explicit lmx2592_impl(write_spi_t write_fn, read_spi_t read_fn)
: _write_fn([write_fn](const uint8_t addr, const uint16_t data) {
- const uint32_t spi_transaction =
- 0 | ((addr & SPI_ADDR_MASK) << SPI_ADDR_SHIFT) | data;
- write_fn(spi_transaction);
- }),
- _read_fn([read_fn](const uint8_t addr) {
- const uint32_t spi_transaction =
- SPI_READ_FLAG | ((addr & SPI_ADDR_MASK) << SPI_ADDR_SHIFT);
- return read_fn(spi_transaction);
- }),
- _regs(),
- _rewrite_regs(true) {
+ const uint32_t spi_transaction =
+ 0 | ((addr & SPI_ADDR_MASK) << SPI_ADDR_SHIFT) | data;
+ write_fn(spi_transaction);
+ })
+ , _read_fn([read_fn](const uint8_t addr) {
+ const uint32_t spi_transaction = SPI_READ_FLAG
+ | ((addr & SPI_ADDR_MASK) << SPI_ADDR_SHIFT);
+ return read_fn(spi_transaction);
+ })
+ , _regs()
+ , _rewrite_regs(true)
+ {
UHD_LOG_TRACE("LMX2592", "Initializing Synthesizer");
// Soft Reset
@@ -133,16 +138,16 @@ public:
_regs.reset = 0;
// Set register values where driver defaults differ from the datasheet values
- _regs.acal_enable = 0;
- _regs.fcal_enable = 0;
- _regs.cal_clk_div = 0;
- _regs.vco_idac_ovr = 1;
- _regs.cp_idn = 12;
- _regs.cp_iup = 12;
- _regs.vco_idac = 350;
+ _regs.acal_enable = 0;
+ _regs.fcal_enable = 0;
+ _regs.cal_clk_div = 0;
+ _regs.vco_idac_ovr = 1;
+ _regs.cp_idn = 12;
+ _regs.cp_iup = 12;
+ _regs.vco_idac = 350;
_regs.mash_ditherer = 1;
- _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_VCO;
- _regs.fcal_fast = 1;
+ _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_VCO;
+ _regs.fcal_fast = 1;
// Write default register values, ensures register copy is synchronized
_rewrite_regs = true;
@@ -152,13 +157,15 @@ public:
commit();
}
- ~lmx2592_impl() override { UHD_SAFE_CALL(_regs.powerdown = 1; commit();) }
+ ~lmx2592_impl() override
+ {
+ UHD_SAFE_CALL(_regs.powerdown = 1; commit();)
+ }
- double set_frequency(
- const double target_freq,
+ double set_frequency(const double target_freq,
const bool spur_dodging = false,
- const double spur_dodging_threshold = DEFAULT_LMX2592_SPUR_DODGING_THRESHOLD)
- override
+ const double spur_dodging_threshold =
+ DEFAULT_LMX2592_SPUR_DODGING_THRESHOLD) override
{
// Enforce LMX frequency limits
if (target_freq < LMX2592_MIN_OUT_FREQ or target_freq > LMX2592_MAX_OUT_FREQ) {
@@ -187,7 +194,7 @@ public:
const int vco_multiplier = target_freq > LMX2592_MAX_VCO_FREQ ? 2 : 1;
const auto target_vco_freq = target_freq * output_divider;
- const auto core_vco_freq = target_vco_freq / vco_multiplier;
+ const auto core_vco_freq = target_vco_freq / vco_multiplier;
double input_freq = _ref_freq;
@@ -205,18 +212,20 @@ public:
input_freq /= _regs.pll_r_pre;
// Multiplier
- _regs.mult = narrow_cast<uint8_t>(std::floor(LMX2592_MAX_MULT_OUT_FREQ / input_freq));
+ _regs.mult =
+ narrow_cast<uint8_t>(std::floor(LMX2592_MAX_MULT_OUT_FREQ / input_freq));
input_freq *= _regs.mult;
// Post R divider
- _regs.pll_r = narrow_cast<uint8_t>(std::ceil(input_freq / LMX2592_MAX_POSTR_DIV_OUT_FREQ));
+ _regs.pll_r =
+ narrow_cast<uint8_t>(std::ceil(input_freq / LMX2592_MAX_POSTR_DIV_OUT_FREQ));
// Default to divide by 2, will be increased later if N exceeds its limit
- int prescaler = 2;
+ int prescaler = 2;
_regs.pll_n_pre = lmx2592_regs_t::pll_n_pre_t::PLL_N_PRE_DIVIDE_BY_2;
const int min_n_divider = LMX2592_MIN_N_DIV[_regs.mash_order];
- double pfd_freq = input_freq / _regs.pll_r;
+ double pfd_freq = input_freq / _regs.pll_r;
while (pfd_freq * (prescaler * min_n_divider) / vco_multiplier > core_vco_freq) {
_regs.pll_r++;
pfd_freq = input_freq / _regs.pll_r;
@@ -224,7 +233,7 @@ public:
// Calculate N and frac
const auto N_dot_F = target_vco_freq / (pfd_freq * prescaler);
- auto N = static_cast<uint16_t>(std::floor(N_dot_F));
+ auto N = static_cast<uint16_t>(std::floor(N_dot_F));
if (N > MAX_N_DIVIDER) {
_regs.pll_n_pre = lmx2592_regs_t::pll_n_pre_t::PLL_N_PRE_DIVIDE_BY_4;
N /= 2;
@@ -234,30 +243,37 @@ public:
// Increase VCO step size to threshold to avoid primary fractional spurs
const double min_vco_step_size = spur_dodging ? spur_dodging_threshold : 1;
// Calculate Fden
- const auto initial_fden = static_cast<uint32_t>(std::floor(pfd_freq * prescaler / min_vco_step_size));
+ const auto initial_fden =
+ static_cast<uint32_t>(std::floor(pfd_freq * prescaler / min_vco_step_size));
const auto fden = (spur_dodging) ? _find_fden(initial_fden) : initial_fden;
// Calculate Fnum
const auto initial_fnum = static_cast<uint32_t>(std::round(frac * fden));
- const auto fnum = (spur_dodging) ? _find_fnum(N, initial_fnum, fden, prescaler, pfd_freq, output_divider, spur_dodging_threshold) : initial_fnum;
+ const auto fnum = (spur_dodging) ? _find_fnum(N,
+ initial_fnum,
+ fden,
+ prescaler,
+ pfd_freq,
+ output_divider,
+ spur_dodging_threshold)
+ : initial_fnum;
// Calculate mash_seed
// if spur_dodging is true, mash_seed is the first odd value less than fden
// else mash_seed is int(fden / 2);
- const uint32_t mash_seed = (spur_dodging) ?
- _find_mash_seed(fden) :
- static_cast<uint32_t>(fden / 2);
+ const uint32_t mash_seed = (spur_dodging) ? _find_mash_seed(fden)
+ : static_cast<uint32_t>(fden / 2);
// Calculate actual Fcore_vco, Fvco, F_lo frequencies
const auto actual_fvco = pfd_freq * prescaler * (N + double(fnum) / double(fden));
const auto actual_fcore_vco = actual_fvco / vco_multiplier;
- const auto actual_f_lo = actual_fcore_vco * vco_multiplier / output_divider;
+ const auto actual_f_lo = actual_fcore_vco * vco_multiplier / output_divider;
// Write to registers
- _regs.pll_n = N;
- _regs.pll_num_lsb = narrow_cast<uint16_t>(fnum);
- _regs.pll_num_msb = narrow_cast<uint16_t>(fnum >> 16);
- _regs.pll_den_lsb = narrow_cast<uint16_t>(fden);
- _regs.pll_den_msb = narrow_cast<uint16_t>(fden >> 16);
+ _regs.pll_n = N;
+ _regs.pll_num_lsb = narrow_cast<uint16_t>(fnum);
+ _regs.pll_num_msb = narrow_cast<uint16_t>(fnum >> 16);
+ _regs.pll_den_lsb = narrow_cast<uint16_t>(fden);
+ _regs.pll_den_msb = narrow_cast<uint16_t>(fden >> 16);
_regs.mash_seed_lsb = narrow_cast<uint16_t>(mash_seed);
_regs.mash_seed_msb = narrow_cast<uint16_t>(mash_seed >> 16);
@@ -276,7 +292,8 @@ public:
return actual_f_lo;
}
- void set_mash_order(const mash_order_t mash_order) override {
+ void set_mash_order(const mash_order_t mash_order) override
+ {
if (mash_order == mash_order_t::INT_N) {
_regs.mash_order = lmx2592_regs_t::mash_order_t::MASH_ORDER_INT_MODE;
@@ -294,22 +311,26 @@ public:
}
}
- void set_reference_frequency(const double ref_freq) override {
+ void set_reference_frequency(const double ref_freq) override
+ {
if (ref_freq < LMX2592_MIN_REF_FREQ or ref_freq > LMX2592_MAX_REF_FREQ) {
- throw std::runtime_error("Reference frequency is out of bounds for the LMX2592");
+ throw std::runtime_error(
+ "Reference frequency is out of bounds for the LMX2592");
}
_ref_freq = ref_freq;
}
- void set_output_power(const output_t output, const unsigned int power) override {
+ void set_output_power(const output_t output, const unsigned int power) override
+ {
UHD_LOGGER_TRACE("LMX2592")
- << "Set output: " << (output == RF_OUTPUT_A ? "A" : "B") << " to power " << power;
+ << "Set output: " << (output == RF_OUTPUT_A ? "A" : "B") << " to power "
+ << power;
const auto MAX_POWER = 63;
if (power > MAX_POWER) {
- UHD_LOGGER_ERROR("LMX2592")
- << "Requested power level of " << power << " exceeds maximum of " << MAX_POWER;
+ UHD_LOGGER_ERROR("LMX2592") << "Requested power level of " << power
+ << " exceeds maximum of " << MAX_POWER;
return;
}
@@ -322,9 +343,11 @@ public:
commit();
}
- void set_output_enable(const output_t output, const bool enable) override {
- UHD_LOGGER_TRACE("LMX2592") << "Set output " << (output == RF_OUTPUT_A ? "A" : "B")
- << " to " << (enable ? "On" : "Off");
+ void set_output_enable(const output_t output, const bool enable) override
+ {
+ UHD_LOGGER_TRACE("LMX2592")
+ << "Set output " << (output == RF_OUTPUT_A ? "A" : "B") << " to "
+ << (enable ? "On" : "Off");
if (enable) {
_regs.chdiv_dist_pd = 0;
@@ -338,13 +361,13 @@ public:
} else {
if (output == RF_OUTPUT_A) {
- _regs.outa_pd = 1;
- _regs.vco_dista_pd = 1;
+ _regs.outa_pd = 1;
+ _regs.vco_dista_pd = 1;
_regs.chdiv_dista_en = 0;
} else {
- _regs.outb_pd = 1;
- _regs.vco_distb_pd = 1;
+ _regs.outb_pd = 1;
+ _regs.vco_distb_pd = 1;
_regs.chdiv_distb_en = 0;
}
}
@@ -357,40 +380,41 @@ public:
commit();
}
- bool get_lock_status() override {
+ bool get_lock_status() override
+ {
// SPI MISO is being driven by lock detect
// If the PLL is locked we expect to read 0xFFFF from any read, else 0x0000
- const auto value_read = _read_fn(_regs.ADDR_R0);
+ const auto value_read = _read_fn(_regs.ADDR_R0);
const auto lock_status = (value_read == 0xFFFF);
- UHD_LOG_TRACE(
- "LMX2592",
- str(boost::format("Read Lock status: 0x%04X") % static_cast<unsigned int>(value_read)));
+ UHD_LOG_TRACE("LMX2592",
+ str(boost::format("Read Lock status: 0x%04X")
+ % static_cast<unsigned int>(value_read)));
return lock_status;
}
- void commit() override {
+ void commit() override
+ {
UHD_LOGGER_DEBUG("LMX2592")
<< "Storing register cache " << (_rewrite_regs ? "completely" : "selectively")
<< " to LMX via SPI...";
- const auto changed_addrs =
- _rewrite_regs ? _regs.get_all_addrs() : _regs.get_changed_addrs<size_t>();
+ const auto changed_addrs = _rewrite_regs ? _regs.get_all_addrs()
+ : _regs.get_changed_addrs<size_t>();
for (const auto addr : changed_addrs) {
_write_fn(addr, _regs.get_reg(addr));
UHD_LOGGER_TRACE("LMX2592")
- << "Register " << std::setw(2) << static_cast<unsigned int>(addr) << ": 0x"
- << std::hex << std::uppercase << std::setw(4) << std::setfill('0')
- << static_cast<unsigned int>(_regs.get_reg(addr));
+ << "Register " << std::setw(2) << static_cast<unsigned int>(addr)
+ << ": 0x" << std::hex << std::uppercase << std::setw(4)
+ << std::setfill('0') << static_cast<unsigned int>(_regs.get_reg(addr));
}
_regs.save_state();
UHD_LOG_DEBUG("LMX2592",
- "Writing registers complete: "
- "Updated "
- << changed_addrs.size()
- << " registers.");
+ "Writing registers complete: "
+ "Updated "
+ << changed_addrs.size() << " registers.");
_rewrite_regs = false;
}
@@ -407,8 +431,8 @@ private: // Members
bool _rewrite_regs;
double _ref_freq;
- void _set_chdiv_values(const int output_divider_index) {
-
+ void _set_chdiv_values(const int output_divider_index)
+ {
// Configure divide segments and mux
const auto seg1 = LMX2592_CHDIV_SEGS[output_divider_index][0];
const auto seg2 = LMX2592_CHDIV_SEGS[output_divider_index][1];
@@ -417,12 +441,13 @@ private: // Members
_regs.chdiv_seg_sel = lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_POWERDOWN;
if (seg1 > 1) {
- _regs.chdiv_seg_sel = lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1;
+ _regs.chdiv_seg_sel =
+ lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1;
_regs.chdiv_seg1_en = 1;
- _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_DIVIDER;
- _regs.outb_mux = lmx2592_regs_t::outb_mux_t::OUTB_MUX_DIVIDER;
- _regs.vco_dista_pd = 1;
- _regs.vco_distb_pd = 1;
+ _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_DIVIDER;
+ _regs.outb_mux = lmx2592_regs_t::outb_mux_t::OUTB_MUX_DIVIDER;
+ _regs.vco_dista_pd = 1;
+ _regs.vco_distb_pd = 1;
_regs.chdiv_dist_pd = 0;
if (_regs.outa_pd == 0) {
@@ -434,8 +459,8 @@ private: // Members
} else {
_regs.chdiv_seg1_en = 0;
- _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_VCO;
- _regs.outb_mux = lmx2592_regs_t::outb_mux_t::OUTB_MUX_VCO;
+ _regs.outa_mux = lmx2592_regs_t::outa_mux_t::OUTA_MUX_VCO;
+ _regs.outb_mux = lmx2592_regs_t::outb_mux_t::OUTB_MUX_VCO;
_regs.chdiv_dist_pd = 1;
if (_regs.outa_pd == 0) {
@@ -454,7 +479,8 @@ private: // Members
if (seg2 > 1) {
_regs.chdiv_seg2_en = 1;
- _regs.chdiv_seg_sel = lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1_AND_2;
+ _regs.chdiv_seg_sel =
+ lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1_AND_2;
} else {
_regs.chdiv_seg2_en = 0;
}
@@ -473,7 +499,8 @@ private: // Members
if (seg3 > 1) {
_regs.chdiv_seg3_en = 1;
- _regs.chdiv_seg_sel = lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1_2_AND_3;
+ _regs.chdiv_seg_sel =
+ lmx2592_regs_t::chdiv_seg_sel_t::CHDIV_SEG_SEL_DIV_SEG_1_2_AND_3;
} else {
_regs.chdiv_seg3_en = 0;
}
@@ -498,56 +525,33 @@ private: // Members
int _get_k(const uint32_t fden) const
{
const auto mash = _regs.mash_order;
- if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_INT_MODE or
- mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_FIRST)
- {
+ if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_INT_MODE
+ or mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_FIRST) {
return 1;
- }
- else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_SECOND)
- {
- if (fden % 2 != 0)
- {
+ } else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_SECOND) {
+ if (fden % 2 != 0) {
return 1;
- }
- else {
+ } else {
return 2;
}
- }
- else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_THIRD)
- {
- if (fden % 2 != 0 and fden % 3 != 0)
- {
+ } else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_THIRD) {
+ if (fden % 2 != 0 and fden % 3 != 0) {
return 1;
- }
- else if (fden % 2 == 0 and fden % 3 != 0)
- {
+ } else if (fden % 2 == 0 and fden % 3 != 0) {
return 2;
- }
- else if (fden % 2 != 0 and fden % 3 == 0)
- {
+ } else if (fden % 2 != 0 and fden % 3 == 0) {
return 3;
- }
- else
- {
+ } else {
return 6;
}
- }
- else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_FOURTH)
- {
- if (fden % 2 != 0 and fden % 3 != 0)
- {
+ } else if (mash == lmx2592_regs_t::mash_order_t::MASH_ORDER_FOURTH) {
+ if (fden % 2 != 0 and fden % 3 != 0) {
return 1;
- }
- else if (fden % 2 == 0 and fden % 3 != 0)
- {
+ } else if (fden % 2 == 0 and fden % 3 != 0) {
return 3;
- }
- else if (fden % 2 != 0 and fden % 3 == 0)
- {
+ } else if (fden % 2 != 0 and fden % 3 == 0) {
return 4;
- }
- else
- {
+ } else {
return 12;
}
}
@@ -561,47 +565,38 @@ private: // Members
auto fden = initial_fden;
// mathematically, this loop should run a maximum of 4 times
// i.e. initial_fden = 6N + 4 and mash_order is third or fourth order
- for (int i = 0; i < 4; ++i)
- {
- if (_get_k(fden) == 1)
- {
- UHD_LOGGER_TRACE("LMX2592") <<
- "_find_fden(" << initial_fden << ") returned " << fden;
+ for (int i = 0; i < 4; ++i) {
+ if (_get_k(fden) == 1) {
+ UHD_LOGGER_TRACE("LMX2592")
+ << "_find_fden(" << initial_fden << ") returned " << fden;
return fden;
}
// decrement rather than increment, as incrementing fden would decrease
// the step size and violate any minimum step size that has been set
--fden;
}
- UHD_LOGGER_WARNING("LMX2592") <<
- "Unable to find suitable fractional value denominator for spur dodging on LMX2592";
- UHD_LOGGER_ERROR("LMX2592") <<
- "Spur dodging failed";
+ UHD_LOGGER_WARNING("LMX2592") << "Unable to find suitable fractional value "
+ "denominator for spur dodging on LMX2592";
+ UHD_LOGGER_ERROR("LMX2592") << "Spur dodging failed";
return initial_fden;
}
// returns the offset of the closest multiple of
// spur_frequency_base to target_frequency
// A negative offset indicates the closest multiple is at a lower frequency
- double _get_closest_spur_offset(
- double target_frequency,
- double spur_frequency_base)
+ double _get_closest_spur_offset(double target_frequency, double spur_frequency_base)
{
// find closest multiples of spur_frequency_base to target_frequency
const auto first_harmonic_number =
std::floor(target_frequency / spur_frequency_base);
- const auto second_harmonic_number =
- first_harmonic_number + 1;
+ const auto second_harmonic_number = first_harmonic_number + 1;
// calculate offsets
const auto first_spur_offset =
(first_harmonic_number * spur_frequency_base) - target_frequency;
const auto second_spur_offset =
(second_harmonic_number * spur_frequency_base) - target_frequency;
// select offset with smallest absolute value
- return std::min({
- first_spur_offset,
- second_spur_offset },
- abs_less_than_compare);
+ return std::min({first_spur_offset, second_spur_offset}, abs_less_than_compare);
}
// returns the closest spur offset among 4 different spurs
@@ -611,8 +606,7 @@ private: // Members
// 3. Reference to Fvco spur
// 4. Reference to Flo spur
// A negative offset indicates the closest spur is at a lower frequency
- offset_t _get_min_offset_frequency(
- const uint16_t N,
+ offset_t _get_min_offset_frequency(const uint16_t N,
const uint32_t fnum,
const uint32_t fden,
const int prescaler,
@@ -620,10 +614,10 @@ private: // Members
const int output_divider)
{
// Calculate intermediate values
- const auto fref = _ref_freq;
+ const auto fref = _ref_freq;
const auto frf_in = pfd_freq * (N + double(fnum) / double(fden));
- const auto fvco = frf_in * prescaler;
- const auto flo = fvco / output_divider;
+ const auto fvco = frf_in * prescaler;
+ const auto flo = fvco / output_divider;
// the minimum offset is the smallest absolute value of these 4 values
// as calculated by the _get_closest_spur_offset function
@@ -631,23 +625,19 @@ private: // Members
// in order to calculate the necessary frequency shift
// Integer Boundary:
- const offset_t ib_spur = { _get_closest_spur_offset(frf_in, pfd_freq), FRF_IN };
+ const offset_t ib_spur = {_get_closest_spur_offset(frf_in, pfd_freq), FRF_IN};
// PFD Offset Spur:
- const offset_t pfd_offset_spur = { _get_closest_spur_offset(fvco, pfd_freq), FVCO };
+ const offset_t pfd_offset_spur = {_get_closest_spur_offset(fvco, pfd_freq), FVCO};
// Reference to Fvco Spur:
- const offset_t fvco_spur = { _get_closest_spur_offset(fvco, fref), FVCO };
+ const offset_t fvco_spur = {_get_closest_spur_offset(fvco, fref), FVCO};
// Reference to F_lo Spur:
- const offset_t flo_spur = { _get_closest_spur_offset(flo, fref), FLO };
+ const offset_t flo_spur = {_get_closest_spur_offset(flo, fref), FLO};
// use min with special comparator for minimal absolute value
- return std::min({
- ib_spur,
- pfd_offset_spur,
- fvco_spur,
- flo_spur},
+ return std::min({ib_spur, pfd_offset_spur, fvco_spur, flo_spur},
offset_abs_less_than_compare);
}
@@ -659,8 +649,7 @@ private: // Members
// PFD frequency will be at least 10x larger than the step size of
// (fnum / fden). This function only considers at least 50% potential
// values of fnum, and does not consider changes to N.
- uint32_t _find_fnum(
- const uint16_t N,
+ uint32_t _find_fnum(const uint16_t N,
const uint32_t initial_fnum,
const uint32_t fden,
const int prescaler,
@@ -669,40 +658,28 @@ private: // Members
const double spur_dodging_threshold)
{
auto fnum = initial_fnum;
- auto min_offset = _get_min_offset_frequency(
- N,
- fnum,
- fden,
- prescaler,
- pfd_freq,
- output_divider);
-
- UHD_LOGGER_TRACE("LMX2592") <<
- "closest spur is at " << min_offset.first <<
- " to " << log_intermediate_frequency(min_offset.second);
+ auto min_offset =
+ _get_min_offset_frequency(N, fnum, fden, prescaler, pfd_freq, output_divider);
+
+ UHD_LOGGER_TRACE("LMX2592") << "closest spur is at " << min_offset.first << " to "
+ << log_intermediate_frequency(min_offset.second);
// shift away from the closest integer boundary i.e. towards 0.5
const double delta_fnum_sign = ((((double)fnum) / ((double)fden)) < 0.5) ? 1 : -1;
- while (std::abs(min_offset.first) < spur_dodging_threshold)
- {
+ while (std::abs(min_offset.first) < spur_dodging_threshold) {
double shift = spur_dodging_threshold;
// if the spur is in the same direction as the desired shift direction...
- if (std::signbit(min_offset.first) == std::signbit(delta_fnum_sign))
- {
+ if (std::signbit(min_offset.first) == std::signbit(delta_fnum_sign)) {
shift += std::abs(min_offset.first);
- }
- else {
+ } else {
shift -= std::abs(min_offset.first);
}
// convert shift of IF value to shift of Frf_in
- if (min_offset.second == FVCO)
- {
+ if (min_offset.second == FVCO) {
shift /= prescaler;
- }
- else if (min_offset.second == FLO)
- {
+ } else if (min_offset.second == FLO) {
shift /= prescaler;
shift *= output_divider;
}
@@ -710,33 +687,27 @@ private: // Members
double delta_fnum_value = std::ceil((shift / pfd_freq) * fden);
fnum += narrow_cast<int32_t>(delta_fnum_value * delta_fnum_sign);
- UHD_LOGGER_TRACE("LMX2592") <<
- "adjusting fnum by " << (delta_fnum_value * delta_fnum_sign);
+ UHD_LOGGER_TRACE("LMX2592")
+ << "adjusting fnum by " << (delta_fnum_value * delta_fnum_sign);
// fnum is unsigned, so this also checks for underflow
- if (fnum >= fden)
- {
- UHD_LOGGER_WARNING("LMX2592") <<
- "Unable to find suitable fractional value numerator for spur dodging on LMX2592";
- UHD_LOGGER_ERROR("LMX2592") <<
- "Spur dodging failed";
+ if (fnum >= fden) {
+ UHD_LOGGER_WARNING("LMX2592")
+ << "Unable to find suitable fractional value numerator for spur "
+ "dodging on LMX2592";
+ UHD_LOGGER_ERROR("LMX2592") << "Spur dodging failed";
return initial_fnum;
}
min_offset = _get_min_offset_frequency(
- N,
- fnum,
- fden,
- prescaler,
- pfd_freq,
- output_divider);
-
- UHD_LOGGER_TRACE("LMX2592") <<
- "closest spur is at " << min_offset.first <<
- " to " << log_intermediate_frequency(min_offset.second);
+ N, fnum, fden, prescaler, pfd_freq, output_divider);
+
+ UHD_LOGGER_TRACE("LMX2592")
+ << "closest spur is at " << min_offset.first << " to "
+ << log_intermediate_frequency(min_offset.second);
}
- UHD_LOGGER_TRACE("LMX2592") <<
- "_find_fnum(" << initial_fnum << ") returned " << fnum;
+ UHD_LOGGER_TRACE("LMX2592")
+ << "_find_fnum(" << initial_fnum << ") returned " << fnum;
return fnum;
}
@@ -745,13 +716,13 @@ private: // Members
{
if (fden < 2) {
return 1;
- }
- else {
+ } else {
return (fden - 2) | 0x1;
}
};
};
-lmx2592_impl::sptr lmx2592_iface::make(write_spi_t write, read_spi_t read) {
+lmx2592_impl::sptr lmx2592_iface::make(write_spi_t write, read_spi_t read)
+{
return std::make_shared<lmx2592_impl>(write, read);
}
diff --git a/host/lib/usrp/common/recv_packet_demuxer.cpp b/host/lib/usrp/common/recv_packet_demuxer.cpp
index 96eafa4be..c5ed1563e 100644
--- a/host/lib/usrp/common/recv_packet_demuxer.cpp
+++ b/host/lib/usrp/common/recv_packet_demuxer.cpp
@@ -5,15 +5,14 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/common/recv_packet_demuxer.hpp>
-#include <uhd/utils/log.hpp>
-#include <uhd/utils/byteswap.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/types/metadata.hpp>
-
+#include <uhd/utils/byteswap.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhdlib/usrp/common/recv_packet_demuxer.hpp>
#include <boost/thread/mutex.hpp>
-#include <queue>
#include <deque>
+#include <queue>
#include <vector>
using namespace uhd;
@@ -23,7 +22,9 @@ using namespace uhd::transport;
struct recv_pkt_demux_mrb : public managed_recv_buffer
{
public:
- recv_pkt_demux_mrb(void){/*NOP*/}
+ recv_pkt_demux_mrb(void)
+ { /*NOP*/
+ }
void release(void)
{
@@ -33,62 +34,68 @@ public:
uint32_t buff[10];
};
-static UHD_INLINE uint32_t extract_sid(managed_recv_buffer::sptr &buff){
- //ASSUME that the data is in little endian format
- return uhd::wtohx(buff->cast<const uint32_t *>()[1]);
+static UHD_INLINE uint32_t extract_sid(managed_recv_buffer::sptr& buff)
+{
+ // ASSUME that the data is in little endian format
+ return uhd::wtohx(buff->cast<const uint32_t*>()[1]);
}
-recv_packet_demuxer::~recv_packet_demuxer(void){
+recv_packet_demuxer::~recv_packet_demuxer(void)
+{
/* NOP */
}
-class recv_packet_demuxer_impl : public uhd::usrp::recv_packet_demuxer{
+class recv_packet_demuxer_impl : public uhd::usrp::recv_packet_demuxer
+{
public:
- recv_packet_demuxer_impl(
- transport::zero_copy_if::sptr transport,
+ recv_packet_demuxer_impl(transport::zero_copy_if::sptr transport,
const size_t size,
- const uint32_t sid_base
- ):
- _transport(transport), _sid_base(sid_base), _queues(size)
+ const uint32_t sid_base)
+ : _transport(transport), _sid_base(sid_base), _queues(size)
{
/* NOP */
}
- managed_recv_buffer::sptr get_recv_buff(const size_t index, const double timeout){
+ managed_recv_buffer::sptr get_recv_buff(const size_t index, const double timeout)
+ {
boost::mutex::scoped_lock lock(_mutex);
managed_recv_buffer::sptr buff;
- //there is already an entry in the queue, so pop that
- if (not _queues[index].wrapper.empty()){
+ // there is already an entry in the queue, so pop that
+ if (not _queues[index].wrapper.empty()) {
std::swap(buff, _queues[index].wrapper.front());
_queues[index].wrapper.pop();
return buff;
}
- while (true){
- //otherwise call into the transport
+ while (true) {
+ // otherwise call into the transport
buff = _transport->get_recv_buff(timeout);
- if (buff.get() == NULL) return buff; //timeout
+ if (buff.get() == NULL)
+ return buff; // timeout
- //check the stream id to know which channel
+ // check the stream id to know which channel
const size_t rx_index = extract_sid(buff) - _sid_base;
- if (rx_index == index) return buff; //got expected message
-
- //otherwise queue and try again
- if (rx_index < _queues.size()) _queues[rx_index].wrapper.push(buff);
- else
- {
- UHD_LOGGER_ERROR("STREAMER") << "Got a data packet with unknown SID " << extract_sid(buff) ;
- recv_pkt_demux_mrb *mrb = new recv_pkt_demux_mrb();
+ if (rx_index == index)
+ return buff; // got expected message
+
+ // otherwise queue and try again
+ if (rx_index < _queues.size())
+ _queues[rx_index].wrapper.push(buff);
+ else {
+ UHD_LOGGER_ERROR("STREAMER")
+ << "Got a data packet with unknown SID " << extract_sid(buff);
+ recv_pkt_demux_mrb* mrb = new recv_pkt_demux_mrb();
vrt::if_packet_info_t info;
- info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+ info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
info.num_payload_words32 = 1;
- info.num_payload_bytes = info.num_payload_words32*sizeof(uint32_t);
- info.has_sid = true;
- info.sid = _sid_base + index;
+ info.num_payload_bytes = info.num_payload_words32 * sizeof(uint32_t);
+ info.has_sid = true;
+ info.sid = _sid_base + index;
vrt::if_hdr_pack_le(mrb->buff, info);
mrb->buff[info.num_header_words32] = rx_metadata_t::ERROR_CODE_OVERFLOW;
- return mrb->make(mrb, mrb->buff, info.num_packet_words32*sizeof(uint32_t));
+ return mrb->make(
+ mrb, mrb->buff, info.num_packet_words32 * sizeof(uint32_t));
}
}
}
@@ -97,14 +104,17 @@ private:
transport::zero_copy_if::sptr _transport;
const uint32_t _sid_base;
boost::mutex _mutex;
- struct channel_guts_type{
- channel_guts_type(void): wrapper(container){}
+ struct channel_guts_type
+ {
+ channel_guts_type(void) : wrapper(container) {}
std::deque<managed_recv_buffer::sptr> container;
std::queue<managed_recv_buffer::sptr> wrapper;
};
std::vector<channel_guts_type> _queues;
};
-recv_packet_demuxer::sptr recv_packet_demuxer::make(transport::zero_copy_if::sptr transport, const size_t size, const uint32_t sid_base){
+recv_packet_demuxer::sptr recv_packet_demuxer::make(
+ transport::zero_copy_if::sptr transport, const size_t size, const uint32_t sid_base)
+{
return sptr(new recv_packet_demuxer_impl(transport, size, sid_base));
}
diff --git a/host/lib/usrp/common/validate_subdev_spec.cpp b/host/lib/usrp/common/validate_subdev_spec.cpp
index 369119e4a..61895a7f8 100644
--- a/host/lib/usrp/common/validate_subdev_spec.cpp
+++ b/host/lib/usrp/common/validate_subdev_spec.cpp
@@ -5,58 +5,68 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/common/validate_subdev_spec.hpp>
#include <uhd/exception.hpp>
#include <uhd/utils/assert_has.hpp>
+#include <uhdlib/usrp/common/validate_subdev_spec.hpp>
#include <boost/format.hpp>
using namespace uhd;
using namespace uhd::usrp;
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- static std::ostream& operator<< (std::ostream &out, const subdev_spec_pair_t &pair){
- out << pair.db_name << ":" << pair.sd_name;
- return out;
- }
+static std::ostream& operator<<(std::ostream& out, const subdev_spec_pair_t& pair)
+{
+ out << pair.db_name << ":" << pair.sd_name;
+ return out;
+}
+
+}} // namespace uhd::usrp
+
+void uhd::usrp::validate_subdev_spec(property_tree::sptr tree,
+ const subdev_spec_t& spec,
+ const std::string& type,
+ const std::string& mb)
+{
+ const size_t num_dsps =
+ tree->list(str(boost::format("/mboards/%s/%s_dsps") % mb % type)).size();
+
+ // sanity checking on the length
+ if (spec.size() == 0)
+ throw uhd::value_error(
+ str(boost::format("Empty %s subdevice specification is not supported.\n")
+ % type));
+ if (spec.size() > num_dsps)
+ throw uhd::value_error(
+ str(boost::format("The subdevice specification \"%s\" is too long.\n"
+ "The user specified %u channels, but there are only %u %s "
+ "dsps on mboard %s.\n")
+ % spec.to_string() % spec.size() % num_dsps % type % mb));
-}}
-
-void uhd::usrp::validate_subdev_spec(
- property_tree::sptr tree,
- const subdev_spec_t &spec,
- const std::string &type,
- const std::string &mb
-){
- const size_t num_dsps = tree->list(str(boost::format("/mboards/%s/%s_dsps") % mb % type)).size();
-
- //sanity checking on the length
- if (spec.size() == 0) throw uhd::value_error(str(boost::format(
- "Empty %s subdevice specification is not supported.\n"
- ) % type));
- if (spec.size() > num_dsps) throw uhd::value_error(str(boost::format(
- "The subdevice specification \"%s\" is too long.\n"
- "The user specified %u channels, but there are only %u %s dsps on mboard %s.\n"
- ) % spec.to_string() % spec.size() % num_dsps % type % mb));
-
- //make a list of all possible specs
+ // make a list of all possible specs
subdev_spec_t all_specs;
- for(const std::string &db: tree->list(str(boost::format("/mboards/%s/dboards") % mb))){
- for(const std::string &sd: tree->list(str(boost::format("/mboards/%s/dboards/%s/%s_frontends") % mb % db % type))){
+ for (const std::string& db :
+ tree->list(str(boost::format("/mboards/%s/dboards") % mb))) {
+ for (const std::string& sd :
+ tree->list(str(
+ boost::format("/mboards/%s/dboards/%s/%s_frontends") % mb % db % type))) {
all_specs.push_back(subdev_spec_pair_t(db, sd));
}
}
- //validate that the spec is possible
- for(const subdev_spec_pair_t &pair: spec){
- uhd::assert_has(all_specs, pair, str(boost::format("%s subdevice specification on mboard %s") % type % mb));
+ // validate that the spec is possible
+ for (const subdev_spec_pair_t& pair : spec) {
+ uhd::assert_has(all_specs,
+ pair,
+ str(boost::format("%s subdevice specification on mboard %s") % type % mb));
}
- //enable selected frontends, disable others
- for(const subdev_spec_pair_t &pair: all_specs){
+ // enable selected frontends, disable others
+ for (const subdev_spec_pair_t& pair : all_specs) {
const bool enb = uhd::has(spec, pair);
- tree->access<bool>(str(boost::format(
- "/mboards/%s/dboards/%s/%s_frontends/%s/enabled"
- ) % mb % pair.db_name % type % pair.sd_name)).set(enb);
+ tree->access<bool>(
+ str(boost::format("/mboards/%s/dboards/%s/%s_frontends/%s/enabled") % mb
+ % pair.db_name % type % pair.sd_name))
+ .set(enb);
}
}
diff --git a/host/lib/usrp/cores/dsp_core_utils.cpp b/host/lib/usrp/cores/dsp_core_utils.cpp
index 44885bc6f..a96028d65 100644
--- a/host/lib/usrp/cores/dsp_core_utils.cpp
+++ b/host/lib/usrp/cores/dsp_core_utils.cpp
@@ -5,8 +5,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/math.hpp>
#include <uhd/exception.hpp>
+#include <uhd/utils/math.hpp>
#include <uhdlib/usrp/cores/dsp_core_utils.hpp>
#include <boost/math/special_functions/round.hpp>
#include <boost/math/special_functions/sign.hpp>
@@ -14,19 +14,18 @@
static const int32_t MAX_FREQ_WORD = boost::numeric::bounds<int32_t>::highest();
static const int32_t MIN_FREQ_WORD = boost::numeric::bounds<int32_t>::lowest();
-void get_freq_and_freq_word(
- const double requested_freq,
- const double tick_rate,
- double &actual_freq,
- int32_t &freq_word
-) {
- //correct for outside of rate (wrap around)
+void get_freq_and_freq_word(const double requested_freq,
+ const double tick_rate,
+ double& actual_freq,
+ int32_t& freq_word)
+{
+ // correct for outside of rate (wrap around)
double freq = std::fmod(requested_freq, tick_rate);
- if (std::abs(freq) > tick_rate/2.0)
+ if (std::abs(freq) > tick_rate / 2.0)
freq -= boost::math::sign(freq) * tick_rate;
- //confirm that the target frequency is within range of the CORDIC
- UHD_ASSERT_THROW(std::abs(freq) <= tick_rate/2.0);
+ // confirm that the target frequency is within range of the CORDIC
+ UHD_ASSERT_THROW(std::abs(freq) <= tick_rate / 2.0);
/* Now calculate the frequency word. It is possible for this calculation
* to cause an overflow. As the requested DSP frequency approaches the
@@ -54,11 +53,11 @@ void get_freq_and_freq_word(
actual_freq = (double(freq_word) / scale_factor) * tick_rate;
}
-std::tuple<double, int> get_freq_and_freq_word(const double requested_freq, const double tick_rate)
+std::tuple<double, int> get_freq_and_freq_word(
+ const double requested_freq, const double tick_rate)
{
double actual_freq;
int32_t freq_word;
get_freq_and_freq_word(requested_freq, tick_rate, actual_freq, freq_word);
return std::make_tuple(actual_freq, freq_word);
}
-
diff --git a/host/lib/usrp/cores/gpio_core_200.cpp b/host/lib/usrp/cores/gpio_core_200.cpp
index 7df8e3c19..7ee0daf70 100644
--- a/host/lib/usrp/cores/gpio_core_200.cpp
+++ b/host/lib/usrp/cores/gpio_core_200.cpp
@@ -8,85 +8,108 @@
#include <uhd/types/dict.hpp>
#include <uhdlib/usrp/cores/gpio_core_200.hpp>
-#define REG_GPIO_IDLE _base + 0
-#define REG_GPIO_RX_ONLY _base + 4
-#define REG_GPIO_TX_ONLY _base + 8
-#define REG_GPIO_BOTH _base + 12
-#define REG_GPIO_DDR _base + 16
+#define REG_GPIO_IDLE _base + 0
+#define REG_GPIO_RX_ONLY _base + 4
+#define REG_GPIO_TX_ONLY _base + 8
+#define REG_GPIO_BOTH _base + 12
+#define REG_GPIO_DDR _base + 16
using namespace uhd;
using namespace usrp;
template <typename T>
-static void shadow_it(T &shadow, const T &value, const T &mask){
+static void shadow_it(T& shadow, const T& value, const T& mask)
+{
shadow = (shadow & ~mask) | (value & mask);
}
-gpio_core_200::~gpio_core_200(void){
+gpio_core_200::~gpio_core_200(void)
+{
/* NOP */
}
-class gpio_core_200_impl : public gpio_core_200{
+class gpio_core_200_impl : public gpio_core_200
+{
public:
- gpio_core_200_impl(wb_iface::sptr iface, const size_t base, const size_t rb_addr):
- _iface(iface), _base(base), _rb_addr(rb_addr), _first_atr(true) { /* NOP */ }
+ gpio_core_200_impl(wb_iface::sptr iface, const size_t base, const size_t rb_addr)
+ : _iface(iface), _base(base), _rb_addr(rb_addr), _first_atr(true)
+ { /* NOP */
+ }
- void set_pin_ctrl(const unit_t unit, const uint16_t value, const uint16_t mask){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ void set_pin_ctrl(const unit_t unit, const uint16_t value, const uint16_t mask)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
shadow_it(_pin_ctrl[unit], value, mask);
- update(); //full update
+ update(); // full update
}
- uint16_t get_pin_ctrl(unit_t unit){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ uint16_t get_pin_ctrl(unit_t unit)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
return _pin_ctrl[unit];
}
- void set_atr_reg(const unit_t unit, const atr_reg_t atr, const uint16_t value, const uint16_t mask){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ void set_atr_reg(
+ const unit_t unit, const atr_reg_t atr, const uint16_t value, const uint16_t mask)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
shadow_it(_atr_regs[unit][atr], value, mask);
- if (_first_atr)
- {
+ if (_first_atr) {
// To preserve legacy behavior, update all registers the first time
update();
_first_atr = false;
- }
- else
+ } else
update(atr);
}
- uint16_t get_atr_reg(unit_t unit, atr_reg_t reg){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ uint16_t get_atr_reg(unit_t unit, atr_reg_t reg)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
return _atr_regs[unit][reg];
}
- void set_gpio_ddr(const unit_t unit, const uint16_t value, const uint16_t mask){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ void set_gpio_ddr(const unit_t unit, const uint16_t value, const uint16_t mask)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
shadow_it(_gpio_ddr[unit], value, mask);
- _iface->poke32(REG_GPIO_DDR, //update the 32 bit register
- (uint32_t(_gpio_ddr[dboard_iface::UNIT_RX]) << shift_by_unit(dboard_iface::UNIT_RX)) |
- (uint32_t(_gpio_ddr[dboard_iface::UNIT_TX]) << shift_by_unit(dboard_iface::UNIT_TX))
- );
+ _iface->poke32(REG_GPIO_DDR, // update the 32 bit register
+ (uint32_t(_gpio_ddr[dboard_iface::UNIT_RX])
+ << shift_by_unit(dboard_iface::UNIT_RX))
+ | (uint32_t(_gpio_ddr[dboard_iface::UNIT_TX])
+ << shift_by_unit(dboard_iface::UNIT_TX)));
}
- uint16_t get_gpio_ddr(unit_t unit){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ uint16_t get_gpio_ddr(unit_t unit)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
return _gpio_ddr[unit];
}
- void set_gpio_out(const unit_t unit, const uint16_t value, const uint16_t mask){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ void set_gpio_out(const unit_t unit, const uint16_t value, const uint16_t mask)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
shadow_it(_gpio_out[unit], value, mask);
- this->update(); //full update
+ this->update(); // full update
}
- uint16_t get_gpio_out(unit_t unit){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ uint16_t get_gpio_out(unit_t unit)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
return _gpio_out[unit];
}
- uint16_t read_gpio(const unit_t unit){
- if (unit == dboard_iface::UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
+ uint16_t read_gpio(const unit_t unit)
+ {
+ if (unit == dboard_iface::UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported in gpio_core_200");
return uint16_t(_iface->peek32(_rb_addr) >> shift_by_unit(unit));
}
@@ -98,81 +121,90 @@ private:
uhd::dict<size_t, uint32_t> _update_cache;
uhd::dict<unit_t, uint16_t> _pin_ctrl, _gpio_out, _gpio_ddr;
- uhd::dict<unit_t, uhd::dict<atr_reg_t, uint16_t> > _atr_regs;
+ uhd::dict<unit_t, uhd::dict<atr_reg_t, uint16_t>> _atr_regs;
- unsigned shift_by_unit(const unit_t unit){
- return (unit == dboard_iface::UNIT_RX)? 0 : 16;
+ unsigned shift_by_unit(const unit_t unit)
+ {
+ return (unit == dboard_iface::UNIT_RX) ? 0 : 16;
}
- void update(void){
+ void update(void)
+ {
update(gpio_atr::ATR_REG_IDLE);
update(gpio_atr::ATR_REG_TX_ONLY);
update(gpio_atr::ATR_REG_RX_ONLY);
update(gpio_atr::ATR_REG_FULL_DUPLEX);
}
- void update(const atr_reg_t atr){
+ void update(const atr_reg_t atr)
+ {
size_t addr;
- switch (atr)
- {
- case gpio_atr::ATR_REG_IDLE:
- addr = REG_GPIO_IDLE;
- break;
- case gpio_atr::ATR_REG_TX_ONLY:
- addr = REG_GPIO_TX_ONLY;
- break;
- case gpio_atr::ATR_REG_RX_ONLY:
- addr = REG_GPIO_RX_ONLY;
- break;
- case gpio_atr::ATR_REG_FULL_DUPLEX:
- addr = REG_GPIO_BOTH;
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (atr) {
+ case gpio_atr::ATR_REG_IDLE:
+ addr = REG_GPIO_IDLE;
+ break;
+ case gpio_atr::ATR_REG_TX_ONLY:
+ addr = REG_GPIO_TX_ONLY;
+ break;
+ case gpio_atr::ATR_REG_RX_ONLY:
+ addr = REG_GPIO_RX_ONLY;
+ break;
+ case gpio_atr::ATR_REG_FULL_DUPLEX:
+ addr = REG_GPIO_BOTH;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
- const uint32_t atr_val =
- (uint32_t(_atr_regs[dboard_iface::UNIT_RX][atr]) << shift_by_unit(dboard_iface::UNIT_RX)) |
- (uint32_t(_atr_regs[dboard_iface::UNIT_TX][atr]) << shift_by_unit(dboard_iface::UNIT_TX));
-
- const uint32_t gpio_val =
- (uint32_t(_gpio_out[dboard_iface::UNIT_RX]) << shift_by_unit(dboard_iface::UNIT_RX)) |
- (uint32_t(_gpio_out[dboard_iface::UNIT_TX]) << shift_by_unit(dboard_iface::UNIT_TX));
-
- const uint32_t ctrl =
- (uint32_t(_pin_ctrl[dboard_iface::UNIT_RX]) << shift_by_unit(dboard_iface::UNIT_RX)) |
- (uint32_t(_pin_ctrl[dboard_iface::UNIT_TX]) << shift_by_unit(dboard_iface::UNIT_TX));
+ const uint32_t atr_val = (uint32_t(_atr_regs[dboard_iface::UNIT_RX][atr])
+ << shift_by_unit(dboard_iface::UNIT_RX))
+ | (uint32_t(_atr_regs[dboard_iface::UNIT_TX][atr])
+ << shift_by_unit(dboard_iface::UNIT_TX));
+
+ const uint32_t gpio_val = (uint32_t(_gpio_out[dboard_iface::UNIT_RX])
+ << shift_by_unit(dboard_iface::UNIT_RX))
+ | (uint32_t(_gpio_out[dboard_iface::UNIT_TX])
+ << shift_by_unit(dboard_iface::UNIT_TX));
+
+ const uint32_t ctrl = (uint32_t(_pin_ctrl[dboard_iface::UNIT_RX])
+ << shift_by_unit(dboard_iface::UNIT_RX))
+ | (uint32_t(_pin_ctrl[dboard_iface::UNIT_TX])
+ << shift_by_unit(dboard_iface::UNIT_TX));
const uint32_t val = (ctrl & atr_val) | ((~ctrl) & gpio_val);
- if (not _update_cache.has_key(addr) or _update_cache[addr] != val)
- {
+ if (not _update_cache.has_key(addr) or _update_cache[addr] != val) {
_iface->poke32(addr, val);
}
_update_cache[addr] = val;
}
-
};
-gpio_core_200::sptr gpio_core_200::make(wb_iface::sptr iface, const size_t base, const size_t rb_addr){
+gpio_core_200::sptr gpio_core_200::make(
+ wb_iface::sptr iface, const size_t base, const size_t rb_addr)
+{
return sptr(new gpio_core_200_impl(iface, base, rb_addr));
}
-gpio_core_200_32wo::~gpio_core_200_32wo(void){
+gpio_core_200_32wo::~gpio_core_200_32wo(void)
+{
/* NOP */
}
-class gpio_core_200_32wo_impl : public gpio_core_200_32wo{
+class gpio_core_200_32wo_impl : public gpio_core_200_32wo
+{
public:
- gpio_core_200_32wo_impl(wb_iface::sptr iface, const size_t base):
- _iface(iface), _base(base)
+ gpio_core_200_32wo_impl(wb_iface::sptr iface, const size_t base)
+ : _iface(iface), _base(base)
{
set_ddr_reg();
}
- void set_ddr_reg(){
+ void set_ddr_reg()
+ {
_iface->poke32(REG_GPIO_DDR, 0xffffffff);
}
- void set_atr_reg(const atr_reg_t atr, const uint32_t value){
+ void set_atr_reg(const atr_reg_t atr, const uint32_t value)
+ {
if (atr == gpio_atr::ATR_REG_IDLE)
_iface->poke32(REG_GPIO_IDLE, value);
else if (atr == gpio_atr::ATR_REG_TX_ONLY)
@@ -185,19 +217,20 @@ public:
UHD_THROW_INVALID_CODE_PATH();
}
- void set_all_regs(const uint32_t value){
- set_atr_reg(gpio_atr::ATR_REG_IDLE, value);
- set_atr_reg(gpio_atr::ATR_REG_TX_ONLY, value);
- set_atr_reg(gpio_atr::ATR_REG_RX_ONLY, value);
+ void set_all_regs(const uint32_t value)
+ {
+ set_atr_reg(gpio_atr::ATR_REG_IDLE, value);
+ set_atr_reg(gpio_atr::ATR_REG_TX_ONLY, value);
+ set_atr_reg(gpio_atr::ATR_REG_RX_ONLY, value);
set_atr_reg(gpio_atr::ATR_REG_FULL_DUPLEX, value);
}
private:
wb_iface::sptr _iface;
const size_t _base;
-
};
-gpio_core_200_32wo::sptr gpio_core_200_32wo::make(wb_iface::sptr iface, const size_t base){
+gpio_core_200_32wo::sptr gpio_core_200_32wo::make(wb_iface::sptr iface, const size_t base)
+{
return sptr(new gpio_core_200_32wo_impl(iface, base));
}
diff --git a/host/lib/usrp/cores/i2c_core_100_wb32.cpp b/host/lib/usrp/cores/i2c_core_100_wb32.cpp
index ec47aa8f0..d3d0a135a 100644
--- a/host/lib/usrp/cores/i2c_core_100_wb32.cpp
+++ b/host/lib/usrp/cores/i2c_core_100_wb32.cpp
@@ -13,67 +13,69 @@
#define REG_I2C_PRESCALER_LO _base + 0
#define REG_I2C_PRESCALER_HI _base + 4
-#define REG_I2C_CTRL _base + 8
-#define REG_I2C_DATA _base + 12
-#define REG_I2C_CMD_STATUS _base + 16
+#define REG_I2C_CTRL _base + 8
+#define REG_I2C_DATA _base + 12
+#define REG_I2C_CMD_STATUS _base + 16
//
// STA, STO, RD, WR, and IACK bits are cleared automatically
//
-#define I2C_CTRL_EN (1 << 7) // core enable
-#define I2C_CTRL_IE (1 << 6) // interrupt enable
-
-#define I2C_CMD_START (1 << 7) // generate (repeated) start condition
-#define I2C_CMD_STOP (1 << 6) // generate stop condition
-#define I2C_CMD_RD (1 << 5) // read from slave
-#define I2C_CMD_WR (1 << 4) // write to slave
-#define I2C_CMD_NACK (1 << 3) // when a rcvr, send ACK (ACK=0) or NACK (ACK=1)
-#define I2C_CMD_RSVD_2 (1 << 2) // reserved
-#define I2C_CMD_RSVD_1 (1 << 1) // reserved
-#define I2C_CMD_IACK (1 << 0) // set to clear pending interrupt
-
-#define I2C_ST_RXACK (1 << 7) // Received acknowledgement from slave (1 = NAK, 0 = ACK)
-#define I2C_ST_BUSY (1 << 6) // 1 after START signal detected; 0 after STOP signal detected
-#define I2C_ST_AL (1 << 5) // Arbitration lost. 1 when core lost arbitration
-#define I2C_ST_RSVD_4 (1 << 4) // reserved
-#define I2C_ST_RSVD_3 (1 << 3) // reserved
-#define I2C_ST_RSVD_2 (1 << 2) // reserved
-#define I2C_ST_TIP (1 << 1) // Transfer-in-progress
-#define I2C_ST_IP (1 << 0) // Interrupt pending
+#define I2C_CTRL_EN (1 << 7) // core enable
+#define I2C_CTRL_IE (1 << 6) // interrupt enable
+
+#define I2C_CMD_START (1 << 7) // generate (repeated) start condition
+#define I2C_CMD_STOP (1 << 6) // generate stop condition
+#define I2C_CMD_RD (1 << 5) // read from slave
+#define I2C_CMD_WR (1 << 4) // write to slave
+#define I2C_CMD_NACK (1 << 3) // when a rcvr, send ACK (ACK=0) or NACK (ACK=1)
+#define I2C_CMD_RSVD_2 (1 << 2) // reserved
+#define I2C_CMD_RSVD_1 (1 << 1) // reserved
+#define I2C_CMD_IACK (1 << 0) // set to clear pending interrupt
+
+#define I2C_ST_RXACK (1 << 7) // Received acknowledgement from slave (1 = NAK, 0 = ACK)
+#define I2C_ST_BUSY \
+ (1 << 6) // 1 after START signal detected; 0 after STOP signal detected
+#define I2C_ST_AL (1 << 5) // Arbitration lost. 1 when core lost arbitration
+#define I2C_ST_RSVD_4 (1 << 4) // reserved
+#define I2C_ST_RSVD_3 (1 << 3) // reserved
+#define I2C_ST_RSVD_2 (1 << 2) // reserved
+#define I2C_ST_TIP (1 << 1) // Transfer-in-progress
+#define I2C_ST_IP (1 << 0) // Interrupt pending
using namespace uhd;
-i2c_core_100_wb32::~i2c_core_100_wb32(void){
+i2c_core_100_wb32::~i2c_core_100_wb32(void)
+{
/* NOP */
}
-class i2c_core_100_wb32_wb32_impl : public i2c_core_100_wb32{
+class i2c_core_100_wb32_wb32_impl : public i2c_core_100_wb32
+{
public:
- i2c_core_100_wb32_wb32_impl(wb_iface::sptr iface, const size_t base):
- _iface(iface), _base(base)
+ i2c_core_100_wb32_wb32_impl(wb_iface::sptr iface, const size_t base)
+ : _iface(iface), _base(base)
{
- //init I2C FPGA interface.
+ // init I2C FPGA interface.
_iface->poke32(REG_I2C_CTRL, 0x0000);
- _iface->poke32(REG_I2C_CTRL, I2C_CTRL_EN); //enable I2C core
+ _iface->poke32(REG_I2C_CTRL, I2C_CTRL_EN); // enable I2C core
}
void set_clock_rate(const double rate)
{
static const uint32_t i2c_datarate = 400000;
- uint16_t prescaler = uint16_t(rate / (i2c_datarate*5) - 1);
+ uint16_t prescaler = uint16_t(rate / (i2c_datarate * 5) - 1);
_iface->poke32(REG_I2C_PRESCALER_LO, prescaler & 0xFF);
_iface->poke32(REG_I2C_PRESCALER_HI, (prescaler >> 8) & 0xFF);
}
- void write_i2c(
- uint16_t addr,
- const byte_vector_t &bytes
- ){
- _iface->poke32(REG_I2C_DATA, (addr << 1) | 0); //addr and read bit (0)
- _iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_WR | I2C_CMD_START | (bytes.size() == 0 ? I2C_CMD_STOP : 0));
+ void write_i2c(uint16_t addr, const byte_vector_t& bytes)
+ {
+ _iface->poke32(REG_I2C_DATA, (addr << 1) | 0); // addr and read bit (0)
+ _iface->poke32(REG_I2C_CMD_STATUS,
+ I2C_CMD_WR | I2C_CMD_START | (bytes.size() == 0 ? I2C_CMD_STOP : 0));
- //wait for previous transfer to complete
+ // wait for previous transfer to complete
if (not wait_chk_ack()) {
_iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_STOP);
return;
@@ -81,41 +83,42 @@ public:
for (size_t i = 0; i < bytes.size(); i++) {
_iface->poke32(REG_I2C_DATA, bytes[i]);
- _iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_WR | ((i == (bytes.size() - 1)) ? I2C_CMD_STOP : 0));
- if(!wait_chk_ack()) {
+ _iface->poke32(REG_I2C_CMD_STATUS,
+ I2C_CMD_WR | ((i == (bytes.size() - 1)) ? I2C_CMD_STOP : 0));
+ if (!wait_chk_ack()) {
_iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_STOP);
return;
}
}
}
- byte_vector_t read_i2c(
- uint16_t addr,
- size_t num_bytes
- ){
+ byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
+ {
byte_vector_t bytes;
- if (num_bytes == 0) return bytes;
+ if (num_bytes == 0)
+ return bytes;
- while (_iface->peek32(REG_I2C_CMD_STATUS) & I2C_ST_BUSY){
+ while (_iface->peek32(REG_I2C_CMD_STATUS) & I2C_ST_BUSY) {
/* NOP */
}
- _iface->poke32(REG_I2C_DATA, (addr << 1) | 1); //addr and read bit (1)
+ _iface->poke32(REG_I2C_DATA, (addr << 1) | 1); // addr and read bit (1)
_iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_WR | I2C_CMD_START);
- //wait for previous transfer to complete
+ // wait for previous transfer to complete
if (not wait_chk_ack()) {
_iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_STOP);
}
for (size_t i = 0; i < num_bytes; i++) {
- _iface->poke32(REG_I2C_CMD_STATUS, I2C_CMD_RD | ((num_bytes == i+1) ? (I2C_CMD_STOP | I2C_CMD_NACK) : 0));
+ _iface->poke32(REG_I2C_CMD_STATUS,
+ I2C_CMD_RD | ((num_bytes == i + 1) ? (I2C_CMD_STOP | I2C_CMD_NACK) : 0));
i2c_wait();
bytes.push_back(uint8_t(_iface->peek32(REG_I2C_DATA)));
}
return bytes;
}
- //override read_eeprom so we can write once, read all N bytes
- //the default implementation calls read i2c once per byte
+ // override read_eeprom so we can write once, read all N bytes
+ // the default implementation calls read i2c once per byte
byte_vector_t read_eeprom(uint16_t addr, uint16_t offset, size_t num_bytes)
{
this->write_i2c(addr, byte_vector_t(1, uint8_t(offset)));
@@ -123,16 +126,18 @@ public:
}
private:
- void i2c_wait(void) {
- for (size_t i = 0; i < 10; i++)
- {
- if ((_iface->peek32(REG_I2C_CMD_STATUS) & I2C_ST_TIP) == 0) return;
+ void i2c_wait(void)
+ {
+ for (size_t i = 0; i < 10; i++) {
+ if ((_iface->peek32(REG_I2C_CMD_STATUS) & I2C_ST_TIP) == 0)
+ return;
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
- UHD_LOGGER_ERROR("CORES") << "i2c_core_100_wb32: i2c_wait timeout" ;
+ UHD_LOGGER_ERROR("CORES") << "i2c_core_100_wb32: i2c_wait timeout";
}
- bool wait_chk_ack(void){
+ bool wait_chk_ack(void)
+ {
i2c_wait();
return (_iface->peek32(REG_I2C_CMD_STATUS) & I2C_ST_RXACK) == 0;
}
diff --git a/host/lib/usrp/cores/i2c_core_200.cpp b/host/lib/usrp/cores/i2c_core_200.cpp
index 4278bf611..431ba194c 100644
--- a/host/lib/usrp/cores/i2c_core_200.cpp
+++ b/host/lib/usrp/cores/i2c_core_200.cpp
@@ -14,67 +14,69 @@
#define REG_I2C_WR_PRESCALER_LO (1 << 3) | 0
#define REG_I2C_WR_PRESCALER_HI (1 << 3) | 1
-#define REG_I2C_WR_CTRL (1 << 3) | 2
-#define REG_I2C_WR_DATA (1 << 3) | 3
-#define REG_I2C_WR_CMD (1 << 3) | 4
-#define REG_I2C_RD_DATA (0 << 3) | 3
-#define REG_I2C_RD_ST (0 << 3) | 4
+#define REG_I2C_WR_CTRL (1 << 3) | 2
+#define REG_I2C_WR_DATA (1 << 3) | 3
+#define REG_I2C_WR_CMD (1 << 3) | 4
+#define REG_I2C_RD_DATA (0 << 3) | 3
+#define REG_I2C_RD_ST (0 << 3) | 4
//
// STA, STO, RD, WR, and IACK bits are cleared automatically
//
-#define I2C_CTRL_EN (1 << 7) // core enable
-#define I2C_CTRL_IE (1 << 6) // interrupt enable
-
-#define I2C_CMD_START (1 << 7) // generate (repeated) start condition
-#define I2C_CMD_STOP (1 << 6) // generate stop condition
-#define I2C_CMD_RD (1 << 5) // read from slave
-#define I2C_CMD_WR (1 << 4) // write to slave
-#define I2C_CMD_NACK (1 << 3) // when a rcvr, send ACK (ACK=0) or NACK (ACK=1)
-#define I2C_CMD_RSVD_2 (1 << 2) // reserved
-#define I2C_CMD_RSVD_1 (1 << 1) // reserved
-#define I2C_CMD_IACK (1 << 0) // set to clear pending interrupt
-
-#define I2C_ST_RXACK (1 << 7) // Received acknowledgement from slave (1 = NAK, 0 = ACK)
-#define I2C_ST_BUSY (1 << 6) // 1 after START signal detected; 0 after STOP signal detected
-#define I2C_ST_AL (1 << 5) // Arbitration lost. 1 when core lost arbitration
-#define I2C_ST_RSVD_4 (1 << 4) // reserved
-#define I2C_ST_RSVD_3 (1 << 3) // reserved
-#define I2C_ST_RSVD_2 (1 << 2) // reserved
-#define I2C_ST_TIP (1 << 1) // Transfer-in-progress
-#define I2C_ST_IP (1 << 0) // Interrupt pending
+#define I2C_CTRL_EN (1 << 7) // core enable
+#define I2C_CTRL_IE (1 << 6) // interrupt enable
+
+#define I2C_CMD_START (1 << 7) // generate (repeated) start condition
+#define I2C_CMD_STOP (1 << 6) // generate stop condition
+#define I2C_CMD_RD (1 << 5) // read from slave
+#define I2C_CMD_WR (1 << 4) // write to slave
+#define I2C_CMD_NACK (1 << 3) // when a rcvr, send ACK (ACK=0) or NACK (ACK=1)
+#define I2C_CMD_RSVD_2 (1 << 2) // reserved
+#define I2C_CMD_RSVD_1 (1 << 1) // reserved
+#define I2C_CMD_IACK (1 << 0) // set to clear pending interrupt
+
+#define I2C_ST_RXACK (1 << 7) // Received acknowledgement from slave (1 = NAK, 0 = ACK)
+#define I2C_ST_BUSY \
+ (1 << 6) // 1 after START signal detected; 0 after STOP signal detected
+#define I2C_ST_AL (1 << 5) // Arbitration lost. 1 when core lost arbitration
+#define I2C_ST_RSVD_4 (1 << 4) // reserved
+#define I2C_ST_RSVD_3 (1 << 3) // reserved
+#define I2C_ST_RSVD_2 (1 << 2) // reserved
+#define I2C_ST_TIP (1 << 1) // Transfer-in-progress
+#define I2C_ST_IP (1 << 0) // Interrupt pending
using namespace uhd;
-i2c_core_200::~i2c_core_200(void){
+i2c_core_200::~i2c_core_200(void)
+{
/* NOP */
}
-class i2c_core_200_impl : public i2c_core_200{
+class i2c_core_200_impl : public i2c_core_200
+{
public:
- i2c_core_200_impl(wb_iface::sptr iface, const size_t base, const size_t readback):
- _iface(iface), _base(base), _readback(readback)
+ i2c_core_200_impl(wb_iface::sptr iface, const size_t base, const size_t readback)
+ : _iface(iface), _base(base), _readback(readback)
{
- //init I2C FPGA interface.
+ // init I2C FPGA interface.
this->poke(REG_I2C_WR_CTRL, 0x0000);
- //set prescalers to operate at 400kHz: WB_CLK is 64MHz...
+ // set prescalers to operate at 400kHz: WB_CLK is 64MHz...
static const uint32_t i2c_datarate = 400000;
- static const uint32_t wishbone_clk = 64000000; //FIXME should go somewhere else
- uint16_t prescaler = wishbone_clk / (i2c_datarate*5) - 1;
+ static const uint32_t wishbone_clk = 64000000; // FIXME should go somewhere else
+ uint16_t prescaler = wishbone_clk / (i2c_datarate * 5) - 1;
this->poke(REG_I2C_WR_PRESCALER_LO, prescaler & 0xFF);
this->poke(REG_I2C_WR_PRESCALER_HI, (prescaler >> 8) & 0xFF);
- this->poke(REG_I2C_WR_CTRL, I2C_CTRL_EN); //enable I2C core
+ this->poke(REG_I2C_WR_CTRL, I2C_CTRL_EN); // enable I2C core
}
- void write_i2c(
- uint16_t addr,
- const byte_vector_t &bytes
- ){
- this->poke(REG_I2C_WR_DATA, (addr << 1) | 0); //addr and read bit (0)
- this->poke(REG_I2C_WR_CMD, I2C_CMD_WR | I2C_CMD_START | (bytes.size() == 0 ? I2C_CMD_STOP : 0));
+ void write_i2c(uint16_t addr, const byte_vector_t& bytes)
+ {
+ this->poke(REG_I2C_WR_DATA, (addr << 1) | 0); // addr and read bit (0)
+ this->poke(REG_I2C_WR_CMD,
+ I2C_CMD_WR | I2C_CMD_START | (bytes.size() == 0 ? I2C_CMD_STOP : 0));
- //wait for previous transfer to complete
+ // wait for previous transfer to complete
if (not wait_chk_ack()) {
this->poke(REG_I2C_WR_CMD, I2C_CMD_STOP);
return;
@@ -82,33 +84,34 @@ public:
for (size_t i = 0; i < bytes.size(); i++) {
this->poke(REG_I2C_WR_DATA, bytes[i]);
- this->poke(REG_I2C_WR_CMD, I2C_CMD_WR | ((i == (bytes.size() - 1)) ? I2C_CMD_STOP : 0));
- if(!wait_chk_ack()) {
+ this->poke(REG_I2C_WR_CMD,
+ I2C_CMD_WR | ((i == (bytes.size() - 1)) ? I2C_CMD_STOP : 0));
+ if (!wait_chk_ack()) {
this->poke(REG_I2C_WR_CMD, I2C_CMD_STOP);
return;
}
}
}
- byte_vector_t read_i2c(
- uint16_t addr,
- size_t num_bytes
- ){
+ byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
+ {
byte_vector_t bytes;
- if (num_bytes == 0) return bytes;
+ if (num_bytes == 0)
+ return bytes;
- while (this->peek(REG_I2C_RD_ST) & I2C_ST_BUSY){
+ while (this->peek(REG_I2C_RD_ST) & I2C_ST_BUSY) {
/* NOP */
}
- this->poke(REG_I2C_WR_DATA, (addr << 1) | 1); //addr and read bit (1)
+ this->poke(REG_I2C_WR_DATA, (addr << 1) | 1); // addr and read bit (1)
this->poke(REG_I2C_WR_CMD, I2C_CMD_WR | I2C_CMD_START);
- //wait for previous transfer to complete
+ // wait for previous transfer to complete
if (not wait_chk_ack()) {
this->poke(REG_I2C_WR_CMD, I2C_CMD_STOP);
}
for (size_t i = 0; i < num_bytes; i++) {
- this->poke(REG_I2C_WR_CMD, I2C_CMD_RD | ((num_bytes == i+1) ? (I2C_CMD_STOP | I2C_CMD_NACK) : 0));
+ this->poke(REG_I2C_WR_CMD,
+ I2C_CMD_RD | ((num_bytes == i + 1) ? (I2C_CMD_STOP | I2C_CMD_NACK) : 0));
i2c_wait();
bytes.push_back(this->peek(REG_I2C_RD_DATA));
}
@@ -116,15 +119,18 @@ public:
}
private:
- void i2c_wait(void) {
- for (size_t i = 0; i < 100; i++){
- if ((this->peek(REG_I2C_RD_ST) & I2C_ST_TIP) == 0) return;
+ void i2c_wait(void)
+ {
+ for (size_t i = 0; i < 100; i++) {
+ if ((this->peek(REG_I2C_RD_ST) & I2C_ST_TIP) == 0)
+ return;
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
- UHD_LOGGER_ERROR("CORES") << "i2c_core_200: i2c_wait timeout" ;
+ UHD_LOGGER_ERROR("CORES") << "i2c_core_200: i2c_wait timeout";
}
- bool wait_chk_ack(void){
+ bool wait_chk_ack(void)
+ {
i2c_wait();
return (this->peek(REG_I2C_RD_ST) & I2C_ST_RXACK) == 0;
}
@@ -148,6 +154,8 @@ private:
boost::mutex _mutex;
};
-i2c_core_200::sptr i2c_core_200::make(wb_iface::sptr iface, const size_t base, const size_t readback){
+i2c_core_200::sptr i2c_core_200::make(
+ wb_iface::sptr iface, const size_t base, const size_t readback)
+{
return sptr(new i2c_core_200_impl(iface, base, readback));
}
diff --git a/host/lib/usrp/cores/radio_ctrl_core_3000.cpp b/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
index 15226e8c4..7518bfe6f 100644
--- a/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
+++ b/host/lib/usrp/cores/radio_ctrl_core_3000.cpp
@@ -6,16 +6,16 @@
//
#include <uhd/exception.hpp>
-#include <uhd/utils/log.hpp>
-#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/safe_call.hpp>
#include <uhd/transport/bounded_buffer.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
+#include <uhd/utils/byteswap.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <uhdlib/usrp/common/async_packet_handler.hpp>
#include <uhdlib/usrp/cores/radio_ctrl_core_3000.hpp>
+#include <boost/format.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
-#include <boost/format.hpp>
#include <functional>
#include <queue>
@@ -23,43 +23,49 @@ using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-static const double ACK_TIMEOUT = 2.0; //supposed to be worst case practical timeout
-static const double MASSIVE_TIMEOUT = 10.0; //for when we wait on a timed command
+static const double ACK_TIMEOUT = 2.0; // supposed to be worst case practical timeout
+static const double MASSIVE_TIMEOUT = 10.0; // for when we wait on a timed command
static const size_t SR_READBACK = 32;
-radio_ctrl_core_3000::~radio_ctrl_core_3000(void){
+radio_ctrl_core_3000::~radio_ctrl_core_3000(void)
+{
/* NOP */
}
-class radio_ctrl_core_3000_impl: public radio_ctrl_core_3000
+class radio_ctrl_core_3000_impl : public radio_ctrl_core_3000
{
public:
-
radio_ctrl_core_3000_impl(const bool big_endian,
- uhd::transport::zero_copy_if::sptr ctrl_xport,
- uhd::transport::zero_copy_if::sptr resp_xport,
- const uint32_t sid, const std::string &name) :
- _link_type(vrt::if_packet_info_t::LINK_TYPE_CHDR), _packet_type(
- vrt::if_packet_info_t::PACKET_TYPE_CONTEXT), _bige(
- big_endian), _ctrl_xport(ctrl_xport), _resp_xport(
- resp_xport), _sid(sid), _name(name), _seq_out(0), _timeout(
- ACK_TIMEOUT), _resp_queue(128/*max response msgs*/), _resp_queue_size(
- _resp_xport ? _resp_xport->get_num_recv_frames() : 3)
+ uhd::transport::zero_copy_if::sptr ctrl_xport,
+ uhd::transport::zero_copy_if::sptr resp_xport,
+ const uint32_t sid,
+ const std::string& name)
+ : _link_type(vrt::if_packet_info_t::LINK_TYPE_CHDR)
+ , _packet_type(vrt::if_packet_info_t::PACKET_TYPE_CONTEXT)
+ , _bige(big_endian)
+ , _ctrl_xport(ctrl_xport)
+ , _resp_xport(resp_xport)
+ , _sid(sid)
+ , _name(name)
+ , _seq_out(0)
+ , _timeout(ACK_TIMEOUT)
+ , _resp_queue(128 /*max response msgs*/)
+ , _resp_queue_size(_resp_xport ? _resp_xport->get_num_recv_frames() : 3)
{
- if (resp_xport)
- {
- while (resp_xport->get_recv_buff(0.0)) {} //flush
+ if (resp_xport) {
+ while (resp_xport->get_recv_buff(0.0)) {
+ } // flush
}
this->set_time(uhd::time_spec_t(0.0));
- this->set_tick_rate(1.0); //something possible but bogus
+ this->set_tick_rate(1.0); // something possible but bogus
}
~radio_ctrl_core_3000_impl(void)
{
- _timeout = ACK_TIMEOUT; //reset timeout to something small
+ _timeout = ACK_TIMEOUT; // reset timeout to something small
UHD_SAFE_CALL(
- this->peek32(0);//dummy peek with the purpose of ack'ing all packets
- _async_task.reset();//now its ok to release the task
+ this->peek32(0); // dummy peek with the purpose of ack'ing all packets
+ _async_task.reset(); // now its ok to release the task
)
}
@@ -69,36 +75,37 @@ public:
void poke32(const wb_addr_type addr, const uint32_t data)
{
boost::mutex::scoped_lock lock(_mutex);
- this->send_pkt(addr/4, data);
+ this->send_pkt(addr / 4, data);
this->wait_for_ack(false);
}
uint32_t peek32(const wb_addr_type addr)
{
boost::mutex::scoped_lock lock(_mutex);
- this->send_pkt(SR_READBACK, addr/8);
+ this->send_pkt(SR_READBACK, addr / 8);
const uint64_t res = this->wait_for_ack(true);
- const uint32_t lo = uint32_t(res & 0xffffffff);
- const uint32_t hi = uint32_t(res >> 32);
- return ((addr/4) & 0x1)? hi : lo;
+ const uint32_t lo = uint32_t(res & 0xffffffff);
+ const uint32_t hi = uint32_t(res >> 32);
+ return ((addr / 4) & 0x1) ? hi : lo;
}
uint64_t peek64(const wb_addr_type addr)
{
boost::mutex::scoped_lock lock(_mutex);
- this->send_pkt(SR_READBACK, addr/8);
+ this->send_pkt(SR_READBACK, addr / 8);
return this->wait_for_ack(true);
}
/*******************************************************************
* Update methods for time
******************************************************************/
- void set_time(const uhd::time_spec_t &time)
+ void set_time(const uhd::time_spec_t& time)
{
boost::mutex::scoped_lock lock(_mutex);
- _time = time;
+ _time = time;
_use_time = _time != uhd::time_spec_t(0.0);
- if (_use_time) _timeout = MASSIVE_TIMEOUT; //permanently sets larger timeout
+ if (_use_time)
+ _timeout = MASSIVE_TIMEOUT; // permanently sets larger timeout
}
uhd::time_spec_t get_time(void)
@@ -129,76 +136,77 @@ private:
if (not buff) {
throw uhd::runtime_error("fifo ctrl timed out getting a send buffer");
}
- uint32_t *pkt = buff->cast<uint32_t *>();
+ uint32_t* pkt = buff->cast<uint32_t*>();
- //load packet info
+ // load packet info
vrt::if_packet_info_t packet_info;
- packet_info.link_type = _link_type;
- packet_info.packet_type = _packet_type;
+ packet_info.link_type = _link_type;
+ packet_info.packet_type = _packet_type;
packet_info.num_payload_words32 = 2;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
+ packet_info.num_payload_bytes =
+ packet_info.num_payload_words32 * sizeof(uint32_t);
packet_info.packet_count = _seq_out;
- packet_info.tsf = _time.to_ticks(_tick_rate);
- packet_info.sob = false;
- packet_info.eob = false;
- packet_info.sid = _sid;
- packet_info.has_sid = true;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = _use_time;
- packet_info.has_tlr = false;
-
- //load header
- if (_bige) vrt::if_hdr_pack_be(pkt, packet_info);
- else vrt::if_hdr_pack_le(pkt, packet_info);
-
- //load payload
- pkt[packet_info.num_header_words32+0] = (_bige)? uhd::htonx(addr) : uhd::htowx(addr);
- pkt[packet_info.num_header_words32+1] = (_bige)? uhd::htonx(data) : uhd::htowx(data);
- //UHD_LOGGER_INFO("radio_ctrl") << boost::format("0x%08x, 0x%08x\n") % addr % data;
- //send the buffer over the interface
+ packet_info.tsf = _time.to_ticks(_tick_rate);
+ packet_info.sob = false;
+ packet_info.eob = false;
+ packet_info.sid = _sid;
+ packet_info.has_sid = true;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = _use_time;
+ packet_info.has_tlr = false;
+
+ // load header
+ if (_bige)
+ vrt::if_hdr_pack_be(pkt, packet_info);
+ else
+ vrt::if_hdr_pack_le(pkt, packet_info);
+
+ // load payload
+ pkt[packet_info.num_header_words32 + 0] = (_bige) ? uhd::htonx(addr)
+ : uhd::htowx(addr);
+ pkt[packet_info.num_header_words32 + 1] = (_bige) ? uhd::htonx(data)
+ : uhd::htowx(data);
+ // UHD_LOGGER_INFO("radio_ctrl") << boost::format("0x%08x, 0x%08x\n") % addr %
+ // data; send the buffer over the interface
_outstanding_seqs.push(_seq_out);
- buff->commit(sizeof(uint32_t)*(packet_info.num_packet_words32));
+ buff->commit(sizeof(uint32_t) * (packet_info.num_packet_words32));
- _seq_out++;//inc seq for next call
+ _seq_out++; // inc seq for next call
}
UHD_INLINE uint64_t wait_for_ack(const bool readback)
{
- while (readback or (_outstanding_seqs.size() >= _resp_queue_size))
- {
- //get seq to ack from outstanding packets list
+ while (readback or (_outstanding_seqs.size() >= _resp_queue_size)) {
+ // get seq to ack from outstanding packets list
UHD_ASSERT_THROW(not _outstanding_seqs.empty());
const size_t seq_to_ack = _outstanding_seqs.front();
_outstanding_seqs.pop();
- //parse the packet
+ // parse the packet
vrt::if_packet_info_t packet_info;
resp_buff_type resp_buff;
memset(&resp_buff, 0x00, sizeof(resp_buff));
- uint32_t const *pkt = NULL;
+ uint32_t const* pkt = NULL;
managed_recv_buffer::sptr buff;
- //get buffer from response endpoint - or die in timeout
- if (_resp_xport)
- {
+ // get buffer from response endpoint - or die in timeout
+ if (_resp_xport) {
buff = _resp_xport->get_recv_buff(_timeout);
- try
- {
+ try {
UHD_ASSERT_THROW(bool(buff));
UHD_ASSERT_THROW(buff->size() > 0);
+ } catch (const std::exception& ex) {
+ throw uhd::io_error(
+ str(boost::format("Radio ctrl (%s) no response packet - %s")
+ % _name % ex.what()));
}
- catch(const std::exception &ex)
- {
- throw uhd::io_error(str(boost::format("Radio ctrl (%s) no response packet - %s") % _name % ex.what()));
- }
- pkt = buff->cast<const uint32_t *>();
- packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
+ pkt = buff->cast<const uint32_t*>();
+ packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
}
- //get buffer from response endpoint - or die in timeout
- else
- {
+ // get buffer from response endpoint - or die in timeout
+ else {
/*
* Couldn't get message with haste.
* Now check both possible queues for messages.
@@ -206,12 +214,12 @@ private:
* but could end up in dump_queue.
* If we don't get a message --> Die in timeout.
*/
- double accum_timeout = 0.0;
+ double accum_timeout = 0.0;
const double short_timeout = 0.005; // == 5ms
- while(not ((_resp_queue.pop_with_haste(resp_buff))
+ while (
+ not((_resp_queue.pop_with_haste(resp_buff))
|| (check_dump_queue(resp_buff))
- || (_resp_queue.pop_with_timed_wait(resp_buff, short_timeout))
- )){
+ || (_resp_queue.pop_with_timed_wait(resp_buff, short_timeout)))) {
/*
* If a message couldn't be received within a given timeout
* --> throw AssertionError!
@@ -220,51 +228,53 @@ private:
UHD_ASSERT_THROW(accum_timeout < _timeout);
}
- pkt = resp_buff.data;
- packet_info.num_packet_words32 = sizeof(resp_buff)/sizeof(uint32_t);
+ pkt = resp_buff.data;
+ packet_info.num_packet_words32 = sizeof(resp_buff) / sizeof(uint32_t);
}
- //parse the buffer
- try
- {
+ // parse the buffer
+ try {
packet_info.link_type = _link_type;
- if (_bige) vrt::if_hdr_unpack_be(pkt, packet_info);
- else vrt::if_hdr_unpack_le(pkt, packet_info);
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("radio_ctrl") << "Radio ctrl bad VITA packet: " << ex.what() ;
- if (buff){
+ if (_bige)
+ vrt::if_hdr_unpack_be(pkt, packet_info);
+ else
+ vrt::if_hdr_unpack_le(pkt, packet_info);
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("radio_ctrl")
+ << "Radio ctrl bad VITA packet: " << ex.what();
+ if (buff) {
UHD_VAR(buff->size());
+ } else {
+ UHD_LOGGER_INFO("radio_ctrl") << "buff is NULL";
}
- else{
- UHD_LOGGER_INFO("radio_ctrl") << "buff is NULL" ;
- }
- UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[0] << std::dec ;
- UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[1] << std::dec ;
- UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[2] << std::dec ;
- UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[3] << std::dec ;
+ UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[0] << std::dec;
+ UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[1] << std::dec;
+ UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[2] << std::dec;
+ UHD_LOGGER_INFO("radio_ctrl") << std::hex << pkt[3] << std::dec;
}
- //check the buffer
- try
- {
+ // check the buffer
+ try {
UHD_ASSERT_THROW(packet_info.has_sid);
- UHD_ASSERT_THROW(packet_info.sid == uint32_t((_sid >> 16) | (_sid << 16)));
+ UHD_ASSERT_THROW(
+ packet_info.sid == uint32_t((_sid >> 16) | (_sid << 16)));
UHD_ASSERT_THROW(packet_info.packet_count == (seq_to_ack & 0xfff));
UHD_ASSERT_THROW(packet_info.num_payload_words32 == 2);
UHD_ASSERT_THROW(packet_info.packet_type == _packet_type);
- }
- catch(const std::exception &ex)
- {
- throw uhd::io_error(str(boost::format("Radio ctrl (%s) packet parse error - %s") % _name % ex.what()));
+ } catch (const std::exception& ex) {
+ throw uhd::io_error(
+ str(boost::format("Radio ctrl (%s) packet parse error - %s") % _name
+ % ex.what()));
}
- //return the readback value
- if (readback and _outstanding_seqs.empty())
- {
- const uint64_t hi = (_bige)? uhd::ntohx(pkt[packet_info.num_header_words32+0]) : uhd::wtohx(pkt[packet_info.num_header_words32+0]);
- const uint64_t lo = (_bige)? uhd::ntohx(pkt[packet_info.num_header_words32+1]) : uhd::wtohx(pkt[packet_info.num_header_words32+1]);
+ // return the readback value
+ if (readback and _outstanding_seqs.empty()) {
+ const uint64_t hi =
+ (_bige) ? uhd::ntohx(pkt[packet_info.num_header_words32 + 0])
+ : uhd::wtohx(pkt[packet_info.num_header_words32 + 0]);
+ const uint64_t lo =
+ (_bige) ? uhd::ntohx(pkt[packet_info.num_header_words32 + 1])
+ : uhd::wtohx(pkt[packet_info.num_header_words32 + 1]);
return ((hi << 32) | lo);
}
}
@@ -273,30 +283,31 @@ private:
}
/*
- * If ctrl_core waits for a message that didn't arrive it can search for it in the dump queue.
- * This actually happens during shutdown.
- * handle_async_task can't access radio_ctrl_cores queue anymore thus it returns the corresponding message.
- * msg_task class implements a dump_queue to store such messages.
- * With check_dump_queue we can check if a message we are waiting for got stranded there.
- * If a message got stuck we get it here and push it onto our own message_queue.
+ * If ctrl_core waits for a message that didn't arrive it can search for it in the
+ * dump queue. This actually happens during shutdown. handle_async_task can't access
+ * radio_ctrl_cores queue anymore thus it returns the corresponding message. msg_task
+ * class implements a dump_queue to store such messages. With check_dump_queue we can
+ * check if a message we are waiting for got stranded there. If a message got stuck we
+ * get it here and push it onto our own message_queue.
*/
- bool check_dump_queue(resp_buff_type& b) {
- const size_t min_buff_size = 8; // Same value as in b200_io_impl->handle_async_task
- uint32_t recv_sid = (((_sid)<<16)|((_sid)>>16));
+ bool check_dump_queue(resp_buff_type& b)
+ {
+ const size_t min_buff_size =
+ 8; // Same value as in b200_io_impl->handle_async_task
+ uint32_t recv_sid = (((_sid) << 16) | ((_sid) >> 16));
uhd::msg_task::msg_payload_t msg;
- do{
+ do {
msg = _async_task->get_msg_from_dump_queue(recv_sid);
- }
- while(msg.size() < min_buff_size && msg.size() != 0);
+ } while (msg.size() < min_buff_size && msg.size() != 0);
- if(msg.size() >= min_buff_size) {
+ if (msg.size() >= min_buff_size) {
memcpy(b.data, &msg.front(), std::min(msg.size(), sizeof(b.data)));
return true;
}
return false;
}
- void push_response(const uint32_t *buff)
+ void push_response(const uint32_t* buff)
{
resp_buff_type resp_buff;
std::memcpy(resp_buff.data, buff, sizeof(resp_buff));
@@ -328,10 +339,11 @@ private:
};
radio_ctrl_core_3000::sptr radio_ctrl_core_3000::make(const bool big_endian,
- zero_copy_if::sptr ctrl_xport, zero_copy_if::sptr resp_xport,
- const uint32_t sid, const std::string &name)
+ zero_copy_if::sptr ctrl_xport,
+ zero_copy_if::sptr resp_xport,
+ const uint32_t sid,
+ const std::string& name)
{
return sptr(
- new radio_ctrl_core_3000_impl(big_endian, ctrl_xport, resp_xport,
- sid, name));
+ new radio_ctrl_core_3000_impl(big_endian, ctrl_xport, resp_xport, sid, name));
}
diff --git a/host/lib/usrp/cores/rx_dsp_core_200.cpp b/host/lib/usrp/cores/rx_dsp_core_200.cpp
index 700a3c207..89b44290f 100644
--- a/host/lib/usrp/cores/rx_dsp_core_200.cpp
+++ b/host/lib/usrp/cores/rx_dsp_core_200.cpp
@@ -5,73 +5,78 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/types/dict.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/math.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <uhd/utils/safe_call.hpp>
-#include <uhdlib/usrp/cores/rx_dsp_core_200.hpp>
#include <uhdlib/usrp/cores/dsp_core_utils.hpp>
+#include <uhdlib/usrp/cores/rx_dsp_core_200.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
#include <boost/numeric/conversion/bounds.hpp>
#include <algorithm>
-#include <cmath>
#include <chrono>
+#include <cmath>
#include <thread>
#include <tuple>
-#define REG_DSP_RX_FREQ _dsp_base + 0
-#define REG_DSP_RX_SCALE_IQ _dsp_base + 4
-#define REG_DSP_RX_DECIM _dsp_base + 8
-#define REG_DSP_RX_MUX _dsp_base + 12
+#define REG_DSP_RX_FREQ _dsp_base + 0
+#define REG_DSP_RX_SCALE_IQ _dsp_base + 4
+#define REG_DSP_RX_DECIM _dsp_base + 8
+#define REG_DSP_RX_MUX _dsp_base + 12
-#define FLAG_DSP_RX_MUX_SWAP_IQ (1 << 0)
+#define FLAG_DSP_RX_MUX_SWAP_IQ (1 << 0)
#define FLAG_DSP_RX_MUX_REAL_MODE (1 << 1)
-#define REG_RX_CTRL_STREAM_CMD _ctrl_base + 0
-#define REG_RX_CTRL_TIME_HI _ctrl_base + 4
-#define REG_RX_CTRL_TIME_LO _ctrl_base + 8
-#define REG_RX_CTRL_FORMAT _ctrl_base + 12
-#define REG_RX_CTRL_VRT_HDR _ctrl_base + 16
-#define REG_RX_CTRL_VRT_SID _ctrl_base + 20
-#define REG_RX_CTRL_VRT_TLR _ctrl_base + 24
-#define REG_RX_CTRL_NSAMPS_PP _ctrl_base + 28
-#define REG_RX_CTRL_NCHANNELS _ctrl_base + 32
-
-template <class T> T ceil_log2(T num){
- return std::ceil(std::log(num)/std::log(T(2)));
+#define REG_RX_CTRL_STREAM_CMD _ctrl_base + 0
+#define REG_RX_CTRL_TIME_HI _ctrl_base + 4
+#define REG_RX_CTRL_TIME_LO _ctrl_base + 8
+#define REG_RX_CTRL_FORMAT _ctrl_base + 12
+#define REG_RX_CTRL_VRT_HDR _ctrl_base + 16
+#define REG_RX_CTRL_VRT_SID _ctrl_base + 20
+#define REG_RX_CTRL_VRT_TLR _ctrl_base + 24
+#define REG_RX_CTRL_NSAMPS_PP _ctrl_base + 28
+#define REG_RX_CTRL_NCHANNELS _ctrl_base + 32
+
+template <class T>
+T ceil_log2(T num)
+{
+ return std::ceil(std::log(num) / std::log(T(2)));
}
using namespace uhd;
-rx_dsp_core_200::~rx_dsp_core_200(void){
+rx_dsp_core_200::~rx_dsp_core_200(void)
+{
/* NOP */
}
-class rx_dsp_core_200_impl : public rx_dsp_core_200{
+class rx_dsp_core_200_impl : public rx_dsp_core_200
+{
public:
- rx_dsp_core_200_impl(
- wb_iface::sptr iface,
- const size_t dsp_base, const size_t ctrl_base,
- const uint32_t sid, const bool lingering_packet
- ):
- _iface(iface), _dsp_base(dsp_base), _ctrl_base(ctrl_base), _sid(sid)
+ rx_dsp_core_200_impl(wb_iface::sptr iface,
+ const size_t dsp_base,
+ const size_t ctrl_base,
+ const uint32_t sid,
+ const bool lingering_packet)
+ : _iface(iface), _dsp_base(dsp_base), _ctrl_base(ctrl_base), _sid(sid)
{
// previously uninitialized - assuming zero for all
_tick_rate = _link_rate = _host_extra_scaling = _fxpt_scalar_correction = 0.0;
- //init to something so update method has reasonable defaults
+ // init to something so update method has reasonable defaults
_scaling_adjustment = 1.0;
- _dsp_extra_scaling = 1.0;
+ _dsp_extra_scaling = 1.0;
- //This is a hack/fix for the lingering packet problem.
- //The caller should also flush the recv transports
- if (lingering_packet){
+ // This is a hack/fix for the lingering packet problem.
+ // The caller should also flush the recv transports
+ if (lingering_packet) {
stream_cmd_t stream_cmd(stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
stream_cmd.num_samps = 1;
issue_stream_command(stream_cmd);
- std::this_thread::sleep_for(std::chrono::milliseconds(10)); //lets lingering pkt propagate
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(10)); // lets lingering pkt propagate
}
this->clear();
@@ -79,143 +84,164 @@ public:
~rx_dsp_core_200_impl(void)
{
- UHD_SAFE_CALL
- (
- //shutdown any possible streaming
- this->clear();
- )
+ UHD_SAFE_CALL(
+ // shutdown any possible streaming
+ this->clear();)
}
- void clear(void){
- _iface->poke32(REG_RX_CTRL_NCHANNELS, 0); //also reset
- _iface->poke32(REG_RX_CTRL_VRT_HDR, 0
- | (0x1 << 28) //if data with stream id
- | (0x1 << 26) //has trailer
- | (0x1 << 20) //fractional time sample count
+ void clear(void)
+ {
+ _iface->poke32(REG_RX_CTRL_NCHANNELS, 0); // also reset
+ _iface->poke32(REG_RX_CTRL_VRT_HDR,
+ 0 | (0x1 << 28) // if data with stream id
+ | (0x1 << 26) // has trailer
+ | (0x1 << 20) // fractional time sample count
);
_iface->poke32(REG_RX_CTRL_VRT_SID, _sid);
_iface->poke32(REG_RX_CTRL_VRT_TLR, 0);
}
- void set_nsamps_per_packet(const size_t nsamps){
+ void set_nsamps_per_packet(const size_t nsamps)
+ {
_iface->poke32(REG_RX_CTRL_NSAMPS_PP, nsamps);
}
- void issue_stream_command(const stream_cmd_t &stream_cmd){
+ void issue_stream_command(const stream_cmd_t& stream_cmd)
+ {
UHD_ASSERT_THROW(stream_cmd.num_samps <= 0x0fffffff);
- _continuous_streaming = stream_cmd.stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
+ _continuous_streaming = stream_cmd.stream_mode
+ == stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
- //setup the mode to instruction flags
+ // setup the mode to instruction flags
typedef std::tuple<bool, bool, bool, bool> inst_t;
- static const uhd::dict<stream_cmd_t::stream_mode_t, inst_t> mode_to_inst = boost::assign::map_list_of
- //reload, chain, samps, stop
- (stream_cmd_t::STREAM_MODE_START_CONTINUOUS, inst_t(true, true, false, false))
- (stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS, inst_t(false, false, false, true))
- (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE, inst_t(false, false, true, false))
- (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE, inst_t(false, true, true, false))
- ;
-
- //setup the instruction flag values
+ static const uhd::dict<stream_cmd_t::stream_mode_t, inst_t> mode_to_inst =
+ boost::assign::map_list_of
+ // reload, chain, samps, stop
+ (stream_cmd_t::STREAM_MODE_START_CONTINUOUS,
+ inst_t(true, true, false, false))(
+ stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS,
+ inst_t(false, false, false, true))(
+ stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE,
+ inst_t(false, false, true, false))(
+ stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE,
+ inst_t(false, true, true, false));
+
+ // setup the instruction flag values
bool inst_reload, inst_chain, inst_samps, inst_stop;
- std::tie(inst_reload, inst_chain, inst_samps, inst_stop) = mode_to_inst[stream_cmd.stream_mode];
+ std::tie(inst_reload, inst_chain, inst_samps, inst_stop) =
+ mode_to_inst[stream_cmd.stream_mode];
- //calculate the word from flags and length
+ // calculate the word from flags and length
uint32_t cmd_word = 0;
- cmd_word |= uint32_t((stream_cmd.stream_now)? 1 : 0) << 31;
- cmd_word |= uint32_t((inst_chain)? 1 : 0) << 30;
- cmd_word |= uint32_t((inst_reload)? 1 : 0) << 29;
- cmd_word |= uint32_t((inst_stop)? 1 : 0) << 28;
- cmd_word |= (inst_samps)? stream_cmd.num_samps : ((inst_stop)? 0 : 1);
+ cmd_word |= uint32_t((stream_cmd.stream_now) ? 1 : 0) << 31;
+ cmd_word |= uint32_t((inst_chain) ? 1 : 0) << 30;
+ cmd_word |= uint32_t((inst_reload) ? 1 : 0) << 29;
+ cmd_word |= uint32_t((inst_stop) ? 1 : 0) << 28;
+ cmd_word |= (inst_samps) ? stream_cmd.num_samps : ((inst_stop) ? 0 : 1);
- //issue the stream command
+ // issue the stream command
_iface->poke32(REG_RX_CTRL_STREAM_CMD, cmd_word);
- const uint64_t ticks = (stream_cmd.stream_now)? 0 : stream_cmd.time_spec.to_ticks(_tick_rate);
+ const uint64_t ticks =
+ (stream_cmd.stream_now) ? 0 : stream_cmd.time_spec.to_ticks(_tick_rate);
_iface->poke32(REG_RX_CTRL_TIME_HI, uint32_t(ticks >> 32));
- _iface->poke32(REG_RX_CTRL_TIME_LO, uint32_t(ticks >> 0)); //latches the command
+ _iface->poke32(REG_RX_CTRL_TIME_LO, uint32_t(ticks >> 0)); // latches the command
}
- void set_mux(const std::string &mode, const bool fe_swapped){
- static const uhd::dict<std::string, uint32_t> mode_to_mux = boost::assign::map_list_of
- ("IQ", 0)
- ("QI", FLAG_DSP_RX_MUX_SWAP_IQ)
- ("I", FLAG_DSP_RX_MUX_REAL_MODE)
- ("Q", FLAG_DSP_RX_MUX_SWAP_IQ | FLAG_DSP_RX_MUX_REAL_MODE)
- ;
- _iface->poke32(REG_DSP_RX_MUX, mode_to_mux[mode] ^ (fe_swapped? FLAG_DSP_RX_MUX_SWAP_IQ : 0));
+ void set_mux(const std::string& mode, const bool fe_swapped)
+ {
+ static const uhd::dict<std::string, uint32_t> mode_to_mux =
+ boost::assign::map_list_of("IQ", 0)("QI", FLAG_DSP_RX_MUX_SWAP_IQ)(
+ "I", FLAG_DSP_RX_MUX_REAL_MODE)(
+ "Q", FLAG_DSP_RX_MUX_SWAP_IQ | FLAG_DSP_RX_MUX_REAL_MODE);
+ _iface->poke32(REG_DSP_RX_MUX,
+ mode_to_mux[mode] ^ (fe_swapped ? FLAG_DSP_RX_MUX_SWAP_IQ : 0));
}
- void set_tick_rate(const double rate){
+ void set_tick_rate(const double rate)
+ {
_tick_rate = rate;
}
- void set_link_rate(const double rate){
+ void set_link_rate(const double rate)
+ {
//_link_rate = rate/sizeof(uint32_t); //in samps/s
- _link_rate = rate/sizeof(uint16_t); //in samps/s (allows for 8sc)
+ _link_rate = rate / sizeof(uint16_t); // in samps/s (allows for 8sc)
}
- uhd::meta_range_t get_host_rates(void){
+ uhd::meta_range_t get_host_rates(void)
+ {
meta_range_t range;
- for (int rate = 512; rate > 256; rate -= 4){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 512; rate > 256; rate -= 4) {
+ range.push_back(range_t(_tick_rate / rate));
}
- for (int rate = 256; rate > 128; rate -= 2){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 256; rate > 128; rate -= 2) {
+ range.push_back(range_t(_tick_rate / rate));
}
- for (int rate = 128; rate >= int(std::ceil(_tick_rate/_link_rate)); rate -= 1){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 128; rate >= int(std::ceil(_tick_rate / _link_rate)); rate -= 1) {
+ range.push_back(range_t(_tick_rate / rate));
}
return range;
}
- double set_host_rate(const double rate){
- const size_t decim_rate = boost::math::iround(_tick_rate/this->get_host_rates().clip(rate, true));
+ double set_host_rate(const double rate)
+ {
+ const size_t decim_rate =
+ boost::math::iround(_tick_rate / this->get_host_rates().clip(rate, true));
size_t decim = decim_rate;
- //determine which half-band filters are activated
+ // determine which half-band filters are activated
int hb0 = 0, hb1 = 0;
- // hb0 can only be enabled if the rate will be decimated by at least 2 between the CIC and hb1
- if (decim >= 4 && decim % 2 == 0){
+ // hb0 can only be enabled if the rate will be decimated by at least 2 between the
+ // CIC and hb1
+ if (decim >= 4 && decim % 2 == 0) {
hb0 = 1;
decim /= 2;
}
- if (decim % 2 == 0){
+ if (decim % 2 == 0) {
hb1 = 1;
decim /= 2;
}
_iface->poke32(REG_DSP_RX_DECIM, (hb1 << 9) | (hb0 << 8) | (decim & 0xff));
- if (decim > 1 and hb0 == 0 and hb1 == 0)
- {
- UHD_LOGGER_WARNING("CORES") << boost::format(
- "The requested decimation is odd; the user should expect CIC rolloff.\n"
- "Select an even decimation to ensure that a halfband filter is enabled.\n"
- "decimation = dsp_rate/samp_rate -> %d = (%f MHz)/(%f MHz)\n"
- ) % decim_rate % (_tick_rate/1e6) % (rate/1e6);
+ if (decim > 1 and hb0 == 0 and hb1 == 0) {
+ UHD_LOGGER_WARNING("CORES")
+ << boost::format(
+ "The requested decimation is odd; the user should expect CIC "
+ "rolloff.\n"
+ "Select an even decimation to ensure that a halfband filter is "
+ "enabled.\n"
+ "decimation = dsp_rate/samp_rate -> %d = (%f MHz)/(%f MHz)\n")
+ % decim_rate % (_tick_rate / 1e6) % (rate / 1e6);
}
// Calculate CIC decimation (i.e., without halfband decimators)
// Calculate closest multiplier constant to reverse gain absent scale multipliers
const double rate_pow = std::pow(double(decim & 0xff), 4);
- _scaling_adjustment = std::pow(2, ceil_log2(rate_pow))/(1.65*rate_pow);
+ _scaling_adjustment = std::pow(2, ceil_log2(rate_pow)) / (1.65 * rate_pow);
this->update_scalar();
- return _tick_rate/decim_rate;
+ return _tick_rate / decim_rate;
}
- void update_scalar(void){
+ void update_scalar(void)
+ {
const double factor = 1.0 + std::max(ceil_log2(_scaling_adjustment), 0.0);
- const double target_scalar = (1 << 17)*_scaling_adjustment/_dsp_extra_scaling/factor;
+ const double target_scalar =
+ (1 << 17) * _scaling_adjustment / _dsp_extra_scaling / factor;
const int32_t actual_scalar = boost::math::iround(target_scalar);
- _fxpt_scalar_correction = target_scalar/actual_scalar*factor; //should be small
+ _fxpt_scalar_correction =
+ target_scalar / actual_scalar * factor; // should be small
_iface->poke32(REG_DSP_RX_SCALE_IQ, actual_scalar);
}
- double get_scaling_adjustment(void){
- return _fxpt_scalar_correction*_host_extra_scaling/32767.;
+ double get_scaling_adjustment(void)
+ {
+ return _fxpt_scalar_correction * _host_extra_scaling / 32767.;
}
- double set_freq(const double requested_freq){
+ double set_freq(const double requested_freq)
+ {
double actual_freq;
int32_t freq_word;
get_freq_and_freq_word(requested_freq, _tick_rate, actual_freq, freq_word);
@@ -223,31 +249,37 @@ public:
return actual_freq;
}
- uhd::meta_range_t get_freq_range(void){
- return uhd::meta_range_t(-_tick_rate/2, +_tick_rate/2, _tick_rate/std::pow(2.0, 32));
+ uhd::meta_range_t get_freq_range(void)
+ {
+ return uhd::meta_range_t(
+ -_tick_rate / 2, +_tick_rate / 2, _tick_rate / std::pow(2.0, 32));
}
- void handle_overflow(void){
- if (_continuous_streaming) issue_stream_command(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ void handle_overflow(void)
+ {
+ if (_continuous_streaming)
+ issue_stream_command(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
}
- void setup(const uhd::stream_args_t &stream_args){
- if (not stream_args.args.has_key("noclear")) this->clear();
+ void setup(const uhd::stream_args_t& stream_args)
+ {
+ if (not stream_args.args.has_key("noclear"))
+ this->clear();
unsigned format_word = 0;
- if (stream_args.otw_format == "sc16"){
- format_word = 0;
- _dsp_extra_scaling = 1.0;
+ if (stream_args.otw_format == "sc16") {
+ format_word = 0;
+ _dsp_extra_scaling = 1.0;
_host_extra_scaling = 1.0;
- }
- else if (stream_args.otw_format == "sc8"){
- format_word = (1 << 0);
- double peak = stream_args.args.cast<double>("peak", 1.0);
- peak = std::max(peak, 1.0/256);
- _host_extra_scaling = peak*256;
- _dsp_extra_scaling = peak*256;
- }
- else throw uhd::value_error("USRP RX cannot handle requested wire format: " + stream_args.otw_format);
+ } else if (stream_args.otw_format == "sc8") {
+ format_word = (1 << 0);
+ double peak = stream_args.args.cast<double>("peak", 1.0);
+ peak = std::max(peak, 1.0 / 256);
+ _host_extra_scaling = peak * 256;
+ _dsp_extra_scaling = peak * 256;
+ } else
+ throw uhd::value_error(
+ "USRP RX cannot handle requested wire format: " + stream_args.otw_format);
_host_extra_scaling *= stream_args.args.cast<double>("fullscale", 1.0);
@@ -262,10 +294,17 @@ private:
const size_t _dsp_base, _ctrl_base;
double _tick_rate, _link_rate;
bool _continuous_streaming;
- double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling, _fxpt_scalar_correction;
+ double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling,
+ _fxpt_scalar_correction;
const uint32_t _sid;
};
-rx_dsp_core_200::sptr rx_dsp_core_200::make(wb_iface::sptr iface, const size_t dsp_base, const size_t ctrl_base, const uint32_t sid, const bool lingering_packet){
- return sptr(new rx_dsp_core_200_impl(iface, dsp_base, ctrl_base, sid, lingering_packet));
+rx_dsp_core_200::sptr rx_dsp_core_200::make(wb_iface::sptr iface,
+ const size_t dsp_base,
+ const size_t ctrl_base,
+ const uint32_t sid,
+ const bool lingering_packet)
+{
+ return sptr(
+ new rx_dsp_core_200_impl(iface, dsp_base, ctrl_base, sid, lingering_packet));
}
diff --git a/host/lib/usrp/cores/rx_dsp_core_3000.cpp b/host/lib/usrp/cores/rx_dsp_core_3000.cpp
index d9ad108aa..3724ca827 100644
--- a/host/lib/usrp/cores/rx_dsp_core_3000.cpp
+++ b/host/lib/usrp/cores/rx_dsp_core_3000.cpp
@@ -300,10 +300,12 @@ public:
.set_publisher(std::bind(&rx_dsp_core_3000::get_host_rates, this));
subtree->create<double>("rate/value")
.set(DEFAULT_RATE)
- .set_coercer(std::bind(&rx_dsp_core_3000::set_host_rate, this, std::placeholders::_1));
+ .set_coercer(
+ std::bind(&rx_dsp_core_3000::set_host_rate, this, std::placeholders::_1));
subtree->create<double>("freq/value")
.set(DEFAULT_CORDIC_FREQ)
- .set_coercer(std::bind(&rx_dsp_core_3000::set_freq, this, std::placeholders::_1))
+ .set_coercer(
+ std::bind(&rx_dsp_core_3000::set_freq, this, std::placeholders::_1))
.set_publisher([this]() { return this->get_freq(); });
subtree->create<meta_range_t>("freq/range")
.set_publisher(std::bind(&rx_dsp_core_3000::get_freq_range, this));
diff --git a/host/lib/usrp/cores/rx_frontend_core_200.cpp b/host/lib/usrp/cores/rx_frontend_core_200.cpp
index f30da9466..b16de0d9e 100644
--- a/host/lib/usrp/cores/rx_frontend_core_200.cpp
+++ b/host/lib/usrp/cores/rx_frontend_core_200.cpp
@@ -12,65 +12,75 @@
using namespace uhd;
-#define REG_RX_FE_SWAP_IQ _base + 0 //lower bit
-#define REG_RX_FE_MAG_CORRECTION _base + 4 //18 bits
-#define REG_RX_FE_PHASE_CORRECTION _base + 8 //18 bits
-#define REG_RX_FE_OFFSET_I _base + 12 //18 bits
-#define REG_RX_FE_OFFSET_Q _base + 16 //18 bits
+#define REG_RX_FE_SWAP_IQ _base + 0 // lower bit
+#define REG_RX_FE_MAG_CORRECTION _base + 4 // 18 bits
+#define REG_RX_FE_PHASE_CORRECTION _base + 8 // 18 bits
+#define REG_RX_FE_OFFSET_I _base + 12 // 18 bits
+#define REG_RX_FE_OFFSET_Q _base + 16 // 18 bits
#define OFFSET_FIXED (1ul << 31)
-#define OFFSET_SET (1ul << 30)
+#define OFFSET_SET (1ul << 30)
#define FLAG_MASK (OFFSET_FIXED | OFFSET_SET)
namespace {
- static const double DC_OFFSET_MIN = -1.0;
- static const double DC_OFFSET_MAX = 1.0;
-}
+static const double DC_OFFSET_MIN = -1.0;
+static const double DC_OFFSET_MAX = 1.0;
+} // namespace
-static uint32_t fs_to_bits(const double num, const size_t bits){
- return int32_t(boost::math::round(num * (1 << (bits-1))));
+static uint32_t fs_to_bits(const double num, const size_t bits)
+{
+ return int32_t(boost::math::round(num * (1 << (bits - 1))));
}
-rx_frontend_core_200::~rx_frontend_core_200(void){
+rx_frontend_core_200::~rx_frontend_core_200(void)
+{
/* NOP */
}
-const std::complex<double> rx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE = std::complex<double>(0.0, 0.0);
+const std::complex<double> rx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE =
+ std::complex<double>(0.0, 0.0);
const bool rx_frontend_core_200::DEFAULT_DC_OFFSET_ENABLE = true;
-const std::complex<double> rx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE = std::complex<double>(0.0, 0.0);
+const std::complex<double> rx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE =
+ std::complex<double>(0.0, 0.0);
-class rx_frontend_core_200_impl : public rx_frontend_core_200{
+class rx_frontend_core_200_impl : public rx_frontend_core_200
+{
public:
- rx_frontend_core_200_impl(wb_iface::sptr iface, const size_t base):
- _i_dc_off(0), _q_dc_off(0), _iface(iface), _base(base)
+ rx_frontend_core_200_impl(wb_iface::sptr iface, const size_t base)
+ : _i_dc_off(0), _q_dc_off(0), _iface(iface), _base(base)
{
- //NOP
+ // NOP
}
- void set_mux(const bool swap){
- _iface->poke32(REG_RX_FE_SWAP_IQ, swap? 1 : 0);
+ void set_mux(const bool swap)
+ {
+ _iface->poke32(REG_RX_FE_SWAP_IQ, swap ? 1 : 0);
}
- void set_dc_offset_auto(const bool enb){
- this->set_dc_offset(enb? 0 : OFFSET_FIXED);
+ void set_dc_offset_auto(const bool enb)
+ {
+ this->set_dc_offset(enb ? 0 : OFFSET_FIXED);
}
- std::complex<double> set_dc_offset(const std::complex<double> &off){
+ std::complex<double> set_dc_offset(const std::complex<double>& off)
+ {
static const double scaler = double(1ul << 29);
- _i_dc_off = boost::math::iround(off.real()*scaler);
- _q_dc_off = boost::math::iround(off.imag()*scaler);
+ _i_dc_off = boost::math::iround(off.real() * scaler);
+ _q_dc_off = boost::math::iround(off.imag() * scaler);
this->set_dc_offset(OFFSET_SET | OFFSET_FIXED);
- return std::complex<double>(_i_dc_off/scaler, _q_dc_off/scaler);
+ return std::complex<double>(_i_dc_off / scaler, _q_dc_off / scaler);
}
- void set_dc_offset(const uint32_t flags){
+ void set_dc_offset(const uint32_t flags)
+ {
_iface->poke32(REG_RX_FE_OFFSET_I, flags | (_i_dc_off & ~FLAG_MASK));
_iface->poke32(REG_RX_FE_OFFSET_Q, flags | (_q_dc_off & ~FLAG_MASK));
}
- void set_iq_balance(const std::complex<double> &cor){
+ void set_iq_balance(const std::complex<double>& cor)
+ {
_iface->poke32(REG_RX_FE_MAG_CORRECTION, fs_to_bits(cor.real(), 18));
_iface->poke32(REG_RX_FE_PHASE_CORRECTION, fs_to_bits(cor.imag(), 18));
}
@@ -78,20 +88,19 @@ public:
void populate_subtree(uhd::property_tree::sptr subtree)
{
subtree->create<uhd::meta_range_t>("dc_offset/range")
- .set(meta_range_t(DC_OFFSET_MIN, DC_OFFSET_MAX))
- ;
- subtree->create<std::complex<double> >("dc_offset/value")
+ .set(meta_range_t(DC_OFFSET_MIN, DC_OFFSET_MAX));
+ subtree->create<std::complex<double>>("dc_offset/value")
.set(DEFAULT_DC_OFFSET_VALUE)
- .set_coercer(std::bind(&rx_frontend_core_200::set_dc_offset, this, std::placeholders::_1))
- ;
+ .set_coercer(std::bind(
+ &rx_frontend_core_200::set_dc_offset, this, std::placeholders::_1));
subtree->create<bool>("dc_offset/enable")
.set(DEFAULT_DC_OFFSET_ENABLE)
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_dc_offset_auto, this, std::placeholders::_1))
- ;
- subtree->create<std::complex<double> >("iq_balance/value")
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_200::set_dc_offset_auto, this, std::placeholders::_1));
+ subtree->create<std::complex<double>>("iq_balance/value")
.set(DEFAULT_IQ_BALANCE_VALUE)
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_iq_balance, this, std::placeholders::_1))
- ;
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_200::set_iq_balance, this, std::placeholders::_1));
}
private:
@@ -100,6 +109,8 @@ private:
const size_t _base;
};
-rx_frontend_core_200::sptr rx_frontend_core_200::make(wb_iface::sptr iface, const size_t base){
+rx_frontend_core_200::sptr rx_frontend_core_200::make(
+ wb_iface::sptr iface, const size_t base)
+{
return sptr(new rx_frontend_core_200_impl(iface, base));
}
diff --git a/host/lib/usrp/cores/rx_frontend_core_3000.cpp b/host/lib/usrp/cores/rx_frontend_core_3000.cpp
index aa83b83c8..788e222ed 100644
--- a/host/lib/usrp/cores/rx_frontend_core_3000.cpp
+++ b/host/lib/usrp/cores/rx_frontend_core_3000.cpp
@@ -177,15 +177,16 @@ public:
.set(meta_range_t(DC_OFFSET_MIN, DC_OFFSET_MAX));
subtree->create<std::complex<double>>("dc_offset/value")
.set(DEFAULT_DC_OFFSET_VALUE)
- .set_coercer(std::bind(&rx_frontend_core_3000::set_dc_offset, this, std::placeholders::_1));
+ .set_coercer(std::bind(
+ &rx_frontend_core_3000::set_dc_offset, this, std::placeholders::_1));
subtree->create<bool>("dc_offset/enable")
.set(DEFAULT_DC_OFFSET_ENABLE)
- .add_coerced_subscriber(
- std::bind(&rx_frontend_core_3000::set_dc_offset_auto, this, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_3000::set_dc_offset_auto, this, std::placeholders::_1));
subtree->create<std::complex<double>>("iq_balance/value")
.set(DEFAULT_IQ_BALANCE_VALUE)
- .add_coerced_subscriber(
- std::bind(&rx_frontend_core_3000::set_iq_balance, this, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &rx_frontend_core_3000::set_iq_balance, this, std::placeholders::_1));
}
double get_output_rate()
diff --git a/host/lib/usrp/cores/rx_vita_core_3000.cpp b/host/lib/usrp/cores/rx_vita_core_3000.cpp
index 166e0d83f..8a20e637b 100644
--- a/host/lib/usrp/cores/rx_vita_core_3000.cpp
+++ b/host/lib/usrp/cores/rx_vita_core_3000.cpp
@@ -10,48 +10,40 @@
#include <uhdlib/usrp/cores/rx_vita_core_3000.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/date_time.hpp>
-#include <thread>
#include <chrono>
+#include <thread>
#include <tuple>
-#define REG_FRAMER_MAXLEN _base + 4*4 + 0
-#define REG_FRAMER_SID _base + 4*4 + 4
+#define REG_FRAMER_MAXLEN _base + 4 * 4 + 0
+#define REG_FRAMER_SID _base + 4 * 4 + 4
-#define REG_CTRL_CMD _base + 0
-#define REG_CTRL_TIME_HI _base + 4
-#define REG_CTRL_TIME_LO _base + 8
+#define REG_CTRL_CMD _base + 0
+#define REG_CTRL_TIME_HI _base + 4
+#define REG_CTRL_TIME_LO _base + 8
-#define REG_FC_WINDOW _base + 6*4 + 0
-#define REG_FC_ENABLE _base + 6*4 + 4
+#define REG_FC_WINDOW _base + 6 * 4 + 0
+#define REG_FC_ENABLE _base + 6 * 4 + 4
using namespace uhd;
-rx_vita_core_3000::~rx_vita_core_3000(void){
+rx_vita_core_3000::~rx_vita_core_3000(void)
+{
/* NOP */
}
struct rx_vita_core_3000_impl : rx_vita_core_3000
{
- rx_vita_core_3000_impl(
- wb_iface::sptr iface,
- const size_t base
- ):
- _iface(iface),
- _base(base),
- _continuous_streaming(false),
- _is_setup(false)
+ rx_vita_core_3000_impl(wb_iface::sptr iface, const size_t base)
+ : _iface(iface), _base(base), _continuous_streaming(false), _is_setup(false)
{
- this->set_tick_rate(1); //init to non zero
- this->set_nsamps_per_packet(100); //init to non zero
+ this->set_tick_rate(1); // init to non zero
+ this->set_nsamps_per_packet(100); // init to non zero
this->clear();
}
~rx_vita_core_3000_impl(void)
{
- UHD_SAFE_CALL
- (
- this->clear();
- )
+ UHD_SAFE_CALL(this->clear();)
}
void configure_flow_control(const size_t window_size)
@@ -67,15 +59,15 @@ struct rx_vita_core_3000_impl : rx_vita_core_3000
// is on the order of kilobytes
std::this_thread::sleep_for(std::chrono::milliseconds(1));
- _iface->poke32(REG_FC_WINDOW, window_size-1);
- _iface->poke32(REG_FC_ENABLE, window_size?1:0);
+ _iface->poke32(REG_FC_WINDOW, window_size - 1);
+ _iface->poke32(REG_FC_ENABLE, window_size ? 1 : 0);
}
void clear(void)
{
// FC should never be disabled, this will actually become
// impossible in the future
- //this->configure_flow_control(0); //disable fc
+ // this->configure_flow_control(0); //disable fc
}
void set_nsamps_per_packet(const size_t nsamps)
@@ -83,43 +75,50 @@ struct rx_vita_core_3000_impl : rx_vita_core_3000
_iface->poke32(REG_FRAMER_MAXLEN, nsamps);
}
- void issue_stream_command(const uhd::stream_cmd_t &stream_cmd)
+ void issue_stream_command(const uhd::stream_cmd_t& stream_cmd)
{
- if (not _is_setup)
- {
- //UHD_LOGGER_WARNING("CORES") << "rx vita core 3000 issue stream command - not setup yet!";
+ if (not _is_setup) {
+ // UHD_LOGGER_WARNING("CORES") << "rx vita core 3000 issue stream command -
+ // not setup yet!";
return;
}
UHD_ASSERT_THROW(stream_cmd.num_samps <= 0x0fffffff);
- _continuous_streaming = stream_cmd.stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
+ _continuous_streaming = stream_cmd.stream_mode
+ == stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
- //setup the mode to instruction flags
+ // setup the mode to instruction flags
typedef std::tuple<bool, bool, bool, bool> inst_t;
- static const uhd::dict<stream_cmd_t::stream_mode_t, inst_t> mode_to_inst = boost::assign::map_list_of
- //reload, chain, samps, stop
- (stream_cmd_t::STREAM_MODE_START_CONTINUOUS, inst_t(true, true, false, false))
- (stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS, inst_t(false, false, false, true))
- (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE, inst_t(false, false, true, false))
- (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE, inst_t(false, true, true, false))
- ;
-
- //setup the instruction flag values
+ static const uhd::dict<stream_cmd_t::stream_mode_t, inst_t> mode_to_inst =
+ boost::assign::map_list_of
+ // reload, chain, samps, stop
+ (stream_cmd_t::STREAM_MODE_START_CONTINUOUS,
+ inst_t(true, true, false, false))(
+ stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS,
+ inst_t(false, false, false, true))(
+ stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE,
+ inst_t(false, false, true, false))(
+ stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE,
+ inst_t(false, true, true, false));
+
+ // setup the instruction flag values
bool inst_reload, inst_chain, inst_samps, inst_stop;
- std::tie(inst_reload, inst_chain, inst_samps, inst_stop) = mode_to_inst[stream_cmd.stream_mode];
+ std::tie(inst_reload, inst_chain, inst_samps, inst_stop) =
+ mode_to_inst[stream_cmd.stream_mode];
- //calculate the word from flags and length
+ // calculate the word from flags and length
uint32_t cmd_word = 0;
- cmd_word |= uint32_t((stream_cmd.stream_now)? 1 : 0) << 31;
- cmd_word |= uint32_t((inst_chain)? 1 : 0) << 30;
- cmd_word |= uint32_t((inst_reload)? 1 : 0) << 29;
- cmd_word |= uint32_t((inst_stop)? 1 : 0) << 28;
- cmd_word |= (inst_samps)? stream_cmd.num_samps : ((inst_stop)? 0 : 1);
+ cmd_word |= uint32_t((stream_cmd.stream_now) ? 1 : 0) << 31;
+ cmd_word |= uint32_t((inst_chain) ? 1 : 0) << 30;
+ cmd_word |= uint32_t((inst_reload) ? 1 : 0) << 29;
+ cmd_word |= uint32_t((inst_stop) ? 1 : 0) << 28;
+ cmd_word |= (inst_samps) ? stream_cmd.num_samps : ((inst_stop) ? 0 : 1);
- //issue the stream command
+ // issue the stream command
_iface->poke32(REG_CTRL_CMD, cmd_word);
- const uint64_t ticks = (stream_cmd.stream_now)? 0 : stream_cmd.time_spec.to_ticks(_tick_rate);
+ const uint64_t ticks =
+ (stream_cmd.stream_now) ? 0 : stream_cmd.time_spec.to_ticks(_tick_rate);
_iface->poke32(REG_CTRL_TIME_HI, uint32_t(ticks >> 32));
- _iface->poke32(REG_CTRL_TIME_LO, uint32_t(ticks >> 0)); //latches the command
+ _iface->poke32(REG_CTRL_TIME_LO, uint32_t(ticks >> 0)); // latches the command
}
void set_tick_rate(const double rate)
@@ -134,10 +133,11 @@ struct rx_vita_core_3000_impl : rx_vita_core_3000
void handle_overflow(void)
{
- if (_continuous_streaming) this->issue_stream_command(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ if (_continuous_streaming)
+ this->issue_stream_command(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
}
- void setup(const uhd::stream_args_t &)
+ void setup(const uhd::stream_args_t&)
{
_is_setup = true;
}
@@ -154,10 +154,7 @@ struct rx_vita_core_3000_impl : rx_vita_core_3000
bool _is_setup;
};
-rx_vita_core_3000::sptr rx_vita_core_3000::make(
- wb_iface::sptr iface,
- const size_t base
-)
+rx_vita_core_3000::sptr rx_vita_core_3000::make(wb_iface::sptr iface, const size_t base)
{
return rx_vita_core_3000::sptr(new rx_vita_core_3000_impl(iface, base));
}
diff --git a/host/lib/usrp/cores/spi_core_3000.cpp b/host/lib/usrp/cores/spi_core_3000.cpp
index fb9d9d549..ad9df68dd 100644
--- a/host/lib/usrp/cores/spi_core_3000.cpp
+++ b/host/lib/usrp/cores/spi_core_3000.cpp
@@ -8,8 +8,8 @@
#include <uhd/exception.hpp>
#include <uhdlib/usrp/cores/spi_core_3000.hpp>
-#include <memory>
#include <chrono>
+#include <memory>
#include <mutex>
#include <thread>
diff --git a/host/lib/usrp/cores/time64_core_200.cpp b/host/lib/usrp/cores/time64_core_200.cpp
index 09fa92dcd..a7d5427c1 100644
--- a/host/lib/usrp/cores/time64_core_200.cpp
+++ b/host/lib/usrp/cores/time64_core_200.cpp
@@ -10,17 +10,17 @@
#include <uhdlib/usrp/cores/time64_core_200.hpp>
#include <boost/math/special_functions/round.hpp>
-#define REG_TIME64_TICKS_HI _base + 0
-#define REG_TIME64_TICKS_LO _base + 4
-#define REG_TIME64_FLAGS _base + 8
-#define REG_TIME64_IMM _base + 12
-#define REG_TIME64_MIMO_SYNC _base + 20 //lower byte is delay cycles
+#define REG_TIME64_TICKS_HI _base + 0
+#define REG_TIME64_TICKS_LO _base + 4
+#define REG_TIME64_FLAGS _base + 8
+#define REG_TIME64_IMM _base + 12
+#define REG_TIME64_MIMO_SYNC _base + 20 // lower byte is delay cycles
-//pps flags (see above)
+// pps flags (see above)
#define FLAG_TIME64_PPS_NEGEDGE (0 << 0)
#define FLAG_TIME64_PPS_POSEDGE (1 << 0)
-#define FLAG_TIME64_PPS_SMA (0 << 1)
-#define FLAG_TIME64_PPS_MIMO (1 << 1) //apparently not used
+#define FLAG_TIME64_PPS_SMA (0 << 1)
+#define FLAG_TIME64_PPS_MIMO (1 << 1) // apparently not used
#define FLAG_TIME64_LATCH_NOW 1
#define FLAG_TIME64_LATCH_NEXT_PPS 0
@@ -29,93 +29,109 @@
using namespace uhd;
-time64_core_200::~time64_core_200(void){
+time64_core_200::~time64_core_200(void)
+{
/* NOP */
}
-class time64_core_200_impl : public time64_core_200{
+class time64_core_200_impl : public time64_core_200
+{
public:
- time64_core_200_impl(
- wb_iface::sptr iface, const size_t base,
- const readback_bases_type &readback_bases,
- const size_t mimo_delay_cycles
- ):
- _iface(iface), _base(base),
- _readback_bases(readback_bases),
- _tick_rate(0.0),
- _mimo_delay_cycles(mimo_delay_cycles)
+ time64_core_200_impl(wb_iface::sptr iface,
+ const size_t base,
+ const readback_bases_type& readback_bases,
+ const size_t mimo_delay_cycles)
+ : _iface(iface)
+ , _base(base)
+ , _readback_bases(readback_bases)
+ , _tick_rate(0.0)
+ , _mimo_delay_cycles(mimo_delay_cycles)
{
_sources.push_back("none");
_sources.push_back("external");
_sources.push_back("_external_");
- if (_mimo_delay_cycles != 0) _sources.push_back("mimo");
+ if (_mimo_delay_cycles != 0)
+ _sources.push_back("mimo");
}
- void enable_gpsdo(void){
+ void enable_gpsdo(void)
+ {
_sources.push_back("gpsdo");
}
- void set_tick_rate(const double rate){
+ void set_tick_rate(const double rate)
+ {
_tick_rate = rate;
}
- uhd::time_spec_t get_time_now(void){
- for (size_t i = 0; i < 3; i++){ //special algorithm because we cant read 64 bits synchronously
+ uhd::time_spec_t get_time_now(void)
+ {
+ for (size_t i = 0; i < 3;
+ i++) { // special algorithm because we cant read 64 bits synchronously
const uint32_t ticks_hi = _iface->peek32(_readback_bases.rb_hi_now);
const uint32_t ticks_lo = _iface->peek32(_readback_bases.rb_lo_now);
- if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_now)) continue;
+ if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_now))
+ continue;
const uint64_t ticks = (uint64_t(ticks_hi) << 32) | ticks_lo;
return time_spec_t::from_ticks(ticks, _tick_rate);
}
throw uhd::runtime_error("time64_core_200: get time now timeout");
}
- uhd::time_spec_t get_time_last_pps(void){
- for (size_t i = 0; i < 3; i++){ //special algorithm because we cant read 64 bits synchronously
+ uhd::time_spec_t get_time_last_pps(void)
+ {
+ for (size_t i = 0; i < 3;
+ i++) { // special algorithm because we cant read 64 bits synchronously
const uint32_t ticks_hi = _iface->peek32(_readback_bases.rb_hi_pps);
const uint32_t ticks_lo = _iface->peek32(_readback_bases.rb_lo_pps);
- if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_pps)) continue;
+ if (ticks_hi != _iface->peek32(_readback_bases.rb_hi_pps))
+ continue;
const uint64_t ticks = (uint64_t(ticks_hi) << 32) | ticks_lo;
return time_spec_t::from_ticks(ticks, _tick_rate);
}
throw uhd::runtime_error("time64_core_200: get time last pps timeout");
}
- void set_time_now(const uhd::time_spec_t &time){
+ void set_time_now(const uhd::time_spec_t& time)
+ {
const uint64_t ticks = time.to_ticks(_tick_rate);
_iface->poke32(REG_TIME64_TICKS_LO, uint32_t(ticks >> 0));
_iface->poke32(REG_TIME64_IMM, FLAG_TIME64_LATCH_NOW);
- _iface->poke32(REG_TIME64_TICKS_HI, uint32_t(ticks >> 32)); //latches all 3
+ _iface->poke32(REG_TIME64_TICKS_HI, uint32_t(ticks >> 32)); // latches all 3
}
- void set_time_next_pps(const uhd::time_spec_t &time){
+ void set_time_next_pps(const uhd::time_spec_t& time)
+ {
const uint64_t ticks = time.to_ticks(_tick_rate);
_iface->poke32(REG_TIME64_TICKS_LO, uint32_t(ticks >> 0));
_iface->poke32(REG_TIME64_IMM, FLAG_TIME64_LATCH_NEXT_PPS);
- _iface->poke32(REG_TIME64_TICKS_HI, uint32_t(ticks >> 32)); //latches all 3
+ _iface->poke32(REG_TIME64_TICKS_HI, uint32_t(ticks >> 32)); // latches all 3
}
- void set_time_source(const std::string &source){
+ void set_time_source(const std::string& source)
+ {
assert_has(_sources, source, "time source");
- //setup pps flags
- if (source == "external" or source == "gpsdo"){
- _iface->poke32(REG_TIME64_FLAGS, FLAG_TIME64_PPS_SMA | FLAG_TIME64_PPS_POSEDGE);
- }
- else if (source == "_external_"){
- _iface->poke32(REG_TIME64_FLAGS, FLAG_TIME64_PPS_SMA | FLAG_TIME64_PPS_NEGEDGE);
+ // setup pps flags
+ if (source == "external" or source == "gpsdo") {
+ _iface->poke32(
+ REG_TIME64_FLAGS, FLAG_TIME64_PPS_SMA | FLAG_TIME64_PPS_POSEDGE);
+ } else if (source == "_external_") {
+ _iface->poke32(
+ REG_TIME64_FLAGS, FLAG_TIME64_PPS_SMA | FLAG_TIME64_PPS_NEGEDGE);
}
- //setup mimo flags
- if (source == "mimo"){
- _iface->poke32(REG_TIME64_MIMO_SYNC, FLAG_TIME64_MIMO_SYNC | (_mimo_delay_cycles & 0xff));
- }
- else{
+ // setup mimo flags
+ if (source == "mimo") {
+ _iface->poke32(REG_TIME64_MIMO_SYNC,
+ FLAG_TIME64_MIMO_SYNC | (_mimo_delay_cycles & 0xff));
+ } else {
_iface->poke32(REG_TIME64_MIMO_SYNC, 0);
}
}
- std::vector<std::string> get_time_sources(void){
+ std::vector<std::string> get_time_sources(void)
+ {
return _sources;
}
@@ -128,6 +144,10 @@ private:
std::vector<std::string> _sources;
};
-time64_core_200::sptr time64_core_200::make(wb_iface::sptr iface, const size_t base, const readback_bases_type &readback_bases, const size_t mimo_delay_cycles){
+time64_core_200::sptr time64_core_200::make(wb_iface::sptr iface,
+ const size_t base,
+ const readback_bases_type& readback_bases,
+ const size_t mimo_delay_cycles)
+{
return sptr(new time64_core_200_impl(iface, base, readback_bases, mimo_delay_cycles));
}
diff --git a/host/lib/usrp/cores/time_core_3000.cpp b/host/lib/usrp/cores/time_core_3000.cpp
index 3fb6c3d57..852c3882e 100644
--- a/host/lib/usrp/cores/time_core_3000.cpp
+++ b/host/lib/usrp/cores/time_core_3000.cpp
@@ -5,44 +5,40 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/utils/safe_call.hpp>
#include <uhd/utils/log.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <uhdlib/usrp/cores/time_core_3000.hpp>
#include <chrono>
#include <thread>
-#define REG_TIME_HI _base + 0
-#define REG_TIME_LO _base + 4
-#define REG_TIME_CTRL _base + 8
+#define REG_TIME_HI _base + 0
+#define REG_TIME_LO _base + 4
+#define REG_TIME_CTRL _base + 8
-#define CTRL_LATCH_TIME_NOW (1 << 0)
-#define CTRL_LATCH_TIME_PPS (1 << 1)
-#define CTRL_LATCH_TIME_SYNC (1 << 2)
+#define CTRL_LATCH_TIME_NOW (1 << 0)
+#define CTRL_LATCH_TIME_PPS (1 << 1)
+#define CTRL_LATCH_TIME_SYNC (1 << 2)
using namespace uhd;
-time_core_3000::~time_core_3000(void){
+time_core_3000::~time_core_3000(void)
+{
/* NOP */
}
struct time_core_3000_impl : time_core_3000
{
- time_core_3000_impl(
- wb_iface::sptr iface, const size_t base,
- const readback_bases_type &readback_bases
- ):
- _iface(iface),
- _base(base),
- _readback_bases(readback_bases)
+ time_core_3000_impl(wb_iface::sptr iface,
+ const size_t base,
+ const readback_bases_type& readback_bases)
+ : _iface(iface), _base(base), _readback_bases(readback_bases)
{
- this->set_tick_rate(1); //init to non zero
+ this->set_tick_rate(1); // init to non zero
}
~time_core_3000_impl(void)
{
- UHD_SAFE_CALL
- (
- ;//NOP
+ UHD_SAFE_CALL(; // NOP
)
}
@@ -57,22 +53,22 @@ struct time_core_3000_impl : time_core_3000
UHD_LOGGER_DEBUG("CORES") << "Performing timer loopback test... ";
const time_spec_t time0 = this->get_time_now();
std::this_thread::sleep_for(std::chrono::milliseconds(sleep_millis));
- const time_spec_t time1 = this->get_time_now();
+ const time_spec_t time1 = this->get_time_now();
const double approx_secs = (time1 - time0).get_real_secs();
- const bool test_fail = (approx_secs > 0.15) or (approx_secs < 0.05);
+ const bool test_fail = (approx_secs > 0.15) or (approx_secs < 0.05);
if (test_fail) {
UHD_LOG_WARNING("CORES", "Timer loopback test failed!");
} else {
UHD_LOG_DEBUG("CORES", "Timer loopback test passed.");
}
- //useful warning for debugging actual rate
- const size_t ticks_elapsed = size_t(_tick_rate*approx_secs);
- const size_t approx_rate = size_t(ticks_elapsed/(sleep_millis/1e3));
- if (test_fail) UHD_LOGGER_WARNING("CORES")
- << "Expecting clock rate: " << (_tick_rate/1e6) << " MHz\n"
- << "Approximate clock rate: " << (approx_rate/1e6) << " MHz\n"
- ;
+ // useful warning for debugging actual rate
+ const size_t ticks_elapsed = size_t(_tick_rate * approx_secs);
+ const size_t approx_rate = size_t(ticks_elapsed / (sleep_millis / 1e3));
+ if (test_fail)
+ UHD_LOGGER_WARNING("CORES")
+ << "Expecting clock rate: " << (_tick_rate / 1e6) << " MHz\n"
+ << "Approximate clock rate: " << (approx_rate / 1e6) << " MHz\n";
}
uhd::time_spec_t get_time_now(void)
@@ -87,7 +83,7 @@ struct time_core_3000_impl : time_core_3000
return time_spec_t::from_ticks(ticks, _tick_rate);
}
- void set_time_now(const uhd::time_spec_t &time)
+ void set_time_now(const uhd::time_spec_t& time)
{
const uint64_t ticks = time.to_ticks(_tick_rate);
_iface->poke32(REG_TIME_HI, uint32_t(ticks >> 32));
@@ -95,7 +91,7 @@ struct time_core_3000_impl : time_core_3000
_iface->poke32(REG_TIME_CTRL, CTRL_LATCH_TIME_NOW);
}
- void set_time_sync(const uhd::time_spec_t &time)
+ void set_time_sync(const uhd::time_spec_t& time)
{
const uint64_t ticks = time.to_ticks(_tick_rate);
_iface->poke32(REG_TIME_HI, uint32_t(ticks >> 32));
@@ -103,7 +99,7 @@ struct time_core_3000_impl : time_core_3000
_iface->poke32(REG_TIME_CTRL, CTRL_LATCH_TIME_SYNC);
}
- void set_time_next_pps(const uhd::time_spec_t &time)
+ void set_time_next_pps(const uhd::time_spec_t& time)
{
const uint64_t ticks = time.to_ticks(_tick_rate);
_iface->poke32(REG_TIME_HI, uint32_t(ticks >> 32));
@@ -118,9 +114,7 @@ struct time_core_3000_impl : time_core_3000
};
time_core_3000::sptr time_core_3000::make(
- wb_iface::sptr iface, const size_t base,
- const readback_bases_type &readback_bases
-)
+ wb_iface::sptr iface, const size_t base, const readback_bases_type& readback_bases)
{
return time_core_3000::sptr(new time_core_3000_impl(iface, base, readback_bases));
}
diff --git a/host/lib/usrp/cores/tx_dsp_core_200.cpp b/host/lib/usrp/cores/tx_dsp_core_200.cpp
index 6418d7049..8dd48181c 100644
--- a/host/lib/usrp/cores/tx_dsp_core_200.cpp
+++ b/host/lib/usrp/cores/tx_dsp_core_200.cpp
@@ -5,156 +5,173 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
-#include <uhdlib/usrp/cores/dsp_core_utils.hpp>
-#include <uhd/types/dict.hpp>
#include <uhd/exception.hpp>
-#include <uhd/utils/math.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
+#include <uhdlib/usrp/cores/dsp_core_utils.hpp>
+#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
#include <algorithm>
-#include <cmath>
#include <chrono>
+#include <cmath>
#include <thread>
-#define REG_DSP_TX_FREQ _dsp_base + 0
-#define REG_DSP_TX_SCALE_IQ _dsp_base + 4
-#define REG_DSP_TX_INTERP _dsp_base + 8
+#define REG_DSP_TX_FREQ _dsp_base + 0
+#define REG_DSP_TX_SCALE_IQ _dsp_base + 4
+#define REG_DSP_TX_INTERP _dsp_base + 8
-#define REG_TX_CTRL_CLEAR _ctrl_base + 0
-#define REG_TX_CTRL_FORMAT _ctrl_base + 4
-#define REG_TX_CTRL_REPORT_SID _ctrl_base + 8
-#define REG_TX_CTRL_POLICY _ctrl_base + 12
-#define REG_TX_CTRL_CYCLES_PER_UP _ctrl_base + 16
-#define REG_TX_CTRL_PACKETS_PER_UP _ctrl_base + 20
+#define REG_TX_CTRL_CLEAR _ctrl_base + 0
+#define REG_TX_CTRL_FORMAT _ctrl_base + 4
+#define REG_TX_CTRL_REPORT_SID _ctrl_base + 8
+#define REG_TX_CTRL_POLICY _ctrl_base + 12
+#define REG_TX_CTRL_CYCLES_PER_UP _ctrl_base + 16
+#define REG_TX_CTRL_PACKETS_PER_UP _ctrl_base + 20
-#define FLAG_TX_CTRL_POLICY_WAIT (0x1 << 0)
-#define FLAG_TX_CTRL_POLICY_NEXT_PACKET (0x1 << 1)
-#define FLAG_TX_CTRL_POLICY_NEXT_BURST (0x1 << 2)
+#define FLAG_TX_CTRL_POLICY_WAIT (0x1 << 0)
+#define FLAG_TX_CTRL_POLICY_NEXT_PACKET (0x1 << 1)
+#define FLAG_TX_CTRL_POLICY_NEXT_BURST (0x1 << 2)
-//enable flag for registers: cycles and packets per update packet
-#define FLAG_TX_CTRL_UP_ENB (1ul << 31)
+// enable flag for registers: cycles and packets per update packet
+#define FLAG_TX_CTRL_UP_ENB (1ul << 31)
-template <class T> T ceil_log2(T num){
- return std::ceil(std::log(num)/std::log(T(2)));
+template <class T>
+T ceil_log2(T num)
+{
+ return std::ceil(std::log(num) / std::log(T(2)));
}
using namespace uhd;
-tx_dsp_core_200::~tx_dsp_core_200(void){
+tx_dsp_core_200::~tx_dsp_core_200(void)
+{
/* NOP */
}
-class tx_dsp_core_200_impl : public tx_dsp_core_200{
+class tx_dsp_core_200_impl : public tx_dsp_core_200
+{
public:
- tx_dsp_core_200_impl(
- wb_iface::sptr iface,
- const size_t dsp_base, const size_t ctrl_base,
- const uint32_t sid
- ):
- _iface(iface), _dsp_base(dsp_base), _ctrl_base(ctrl_base), _sid(sid)
+ tx_dsp_core_200_impl(wb_iface::sptr iface,
+ const size_t dsp_base,
+ const size_t ctrl_base,
+ const uint32_t sid)
+ : _iface(iface), _dsp_base(dsp_base), _ctrl_base(ctrl_base), _sid(sid)
{
// previously uninitialized - assuming zero for all
_tick_rate = _link_rate = _host_extra_scaling = _fxpt_scalar_correction = 0.0;
- //init to something so update method has reasonable defaults
+ // init to something so update method has reasonable defaults
_scaling_adjustment = 1.0;
- _dsp_extra_scaling = 1.0;
+ _dsp_extra_scaling = 1.0;
- //init the tx control registers
+ // init the tx control registers
this->clear();
this->set_underflow_policy("next_packet");
}
- void clear(void){
- _iface->poke32(REG_TX_CTRL_CLEAR, 1); //reset and flush technique
+ void clear(void)
+ {
+ _iface->poke32(REG_TX_CTRL_CLEAR, 1); // reset and flush technique
std::this_thread::sleep_for(std::chrono::milliseconds(10));
_iface->poke32(REG_TX_CTRL_CLEAR, 0);
_iface->poke32(REG_TX_CTRL_REPORT_SID, _sid);
}
- void set_underflow_policy(const std::string &policy){
- if (policy == "next_packet"){
+ void set_underflow_policy(const std::string& policy)
+ {
+ if (policy == "next_packet") {
_iface->poke32(REG_TX_CTRL_POLICY, FLAG_TX_CTRL_POLICY_NEXT_PACKET);
- }
- else if (policy == "next_burst"){
+ } else if (policy == "next_burst") {
_iface->poke32(REG_TX_CTRL_POLICY, FLAG_TX_CTRL_POLICY_NEXT_BURST);
- }
- else throw uhd::value_error("USRP TX cannot handle requested underflow policy: " + policy);
+ } else
+ throw uhd::value_error(
+ "USRP TX cannot handle requested underflow policy: " + policy);
}
- void set_tick_rate(const double rate){
+ void set_tick_rate(const double rate)
+ {
_tick_rate = rate;
}
- void set_link_rate(const double rate){
+ void set_link_rate(const double rate)
+ {
//_link_rate = rate/sizeof(uint32_t); //in samps/s
- _link_rate = rate/sizeof(uint16_t); //in samps/s (allows for 8sc)
+ _link_rate = rate / sizeof(uint16_t); // in samps/s (allows for 8sc)
}
- uhd::meta_range_t get_host_rates(void){
+ uhd::meta_range_t get_host_rates(void)
+ {
meta_range_t range;
- for (int rate = 512; rate > 256; rate -= 4){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 512; rate > 256; rate -= 4) {
+ range.push_back(range_t(_tick_rate / rate));
}
- for (int rate = 256; rate > 128; rate -= 2){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 256; rate > 128; rate -= 2) {
+ range.push_back(range_t(_tick_rate / rate));
}
- for (int rate = 128; rate >= int(std::ceil(_tick_rate/_link_rate)); rate -= 1){
- range.push_back(range_t(_tick_rate/rate));
+ for (int rate = 128; rate >= int(std::ceil(_tick_rate / _link_rate)); rate -= 1) {
+ range.push_back(range_t(_tick_rate / rate));
}
return range;
}
- double set_host_rate(const double rate){
- const size_t interp_rate = boost::math::iround(_tick_rate/this->get_host_rates().clip(rate, true));
+ double set_host_rate(const double rate)
+ {
+ const size_t interp_rate =
+ boost::math::iround(_tick_rate / this->get_host_rates().clip(rate, true));
size_t interp = interp_rate;
- //determine which half-band filters are activated
+ // determine which half-band filters are activated
int hb0 = 0, hb1 = 0;
- if (interp % 2 == 0){
+ if (interp % 2 == 0) {
hb0 = 1;
interp /= 2;
}
- if (interp % 2 == 0){
+ if (interp % 2 == 0) {
hb1 = 1;
interp /= 2;
}
_iface->poke32(REG_DSP_TX_INTERP, (hb1 << 9) | (hb0 << 8) | (interp & 0xff));
- if (interp > 1 and hb0 == 0 and hb1 == 0)
- {
- UHD_LOGGER_WARNING("CORES") << boost::format(
- "The requested interpolation is odd; the user should expect CIC rolloff.\n"
- "Select an even interpolation to ensure that a halfband filter is enabled.\n"
- "interpolation = dsp_rate/samp_rate -> %d = (%f MHz)/(%f MHz)\n"
- ) % interp_rate % (_tick_rate/1e6) % (rate/1e6);
+ if (interp > 1 and hb0 == 0 and hb1 == 0) {
+ UHD_LOGGER_WARNING("CORES")
+ << boost::format(
+ "The requested interpolation is odd; the user should expect CIC "
+ "rolloff.\n"
+ "Select an even interpolation to ensure that a halfband filter is "
+ "enabled.\n"
+ "interpolation = dsp_rate/samp_rate -> %d = (%f MHz)/(%f MHz)\n")
+ % interp_rate % (_tick_rate / 1e6) % (rate / 1e6);
}
// Calculate CIC interpolation (i.e., without halfband interpolators)
// Calculate closest multiplier constant to reverse gain absent scale multipliers
const double rate_pow = std::pow(double(interp & 0xff), 3);
- _scaling_adjustment = std::pow(2, ceil_log2(rate_pow))/(1.65*rate_pow);
+ _scaling_adjustment = std::pow(2, ceil_log2(rate_pow)) / (1.65 * rate_pow);
this->update_scalar();
- return _tick_rate/interp_rate;
+ return _tick_rate / interp_rate;
}
- void update_scalar(void){
+ void update_scalar(void)
+ {
const double factor = 1.0 + std::max(ceil_log2(_scaling_adjustment), 0.0);
- const double target_scalar = (1 << 17)*_scaling_adjustment/_dsp_extra_scaling/factor;
+ const double target_scalar =
+ (1 << 17) * _scaling_adjustment / _dsp_extra_scaling / factor;
const int32_t actual_scalar = boost::math::iround(target_scalar);
- _fxpt_scalar_correction = target_scalar/actual_scalar*factor; //should be small
+ _fxpt_scalar_correction =
+ target_scalar / actual_scalar * factor; // should be small
_iface->poke32(REG_DSP_TX_SCALE_IQ, actual_scalar);
}
- double get_scaling_adjustment(void){
- return _fxpt_scalar_correction*_host_extra_scaling*32767.;
+ double get_scaling_adjustment(void)
+ {
+ return _fxpt_scalar_correction * _host_extra_scaling * 32767.;
}
- double set_freq(const double requested_freq){
+ double set_freq(const double requested_freq)
+ {
double actual_freq;
int32_t freq_word;
get_freq_and_freq_word(requested_freq, _tick_rate, actual_freq, freq_word);
@@ -162,32 +179,39 @@ public:
return actual_freq;
}
- uhd::meta_range_t get_freq_range(void){
- return uhd::meta_range_t(-_tick_rate/2, +_tick_rate/2, _tick_rate/std::pow(2.0, 32));
+ uhd::meta_range_t get_freq_range(void)
+ {
+ return uhd::meta_range_t(
+ -_tick_rate / 2, +_tick_rate / 2, _tick_rate / std::pow(2.0, 32));
}
- void set_updates(const size_t cycles_per_up, const size_t packets_per_up){
- _iface->poke32(REG_TX_CTRL_CYCLES_PER_UP, (cycles_per_up == 0)? 0 : (FLAG_TX_CTRL_UP_ENB | cycles_per_up));
- _iface->poke32(REG_TX_CTRL_PACKETS_PER_UP, (packets_per_up == 0)? 0 : (FLAG_TX_CTRL_UP_ENB | packets_per_up));
+ void set_updates(const size_t cycles_per_up, const size_t packets_per_up)
+ {
+ _iface->poke32(REG_TX_CTRL_CYCLES_PER_UP,
+ (cycles_per_up == 0) ? 0 : (FLAG_TX_CTRL_UP_ENB | cycles_per_up));
+ _iface->poke32(REG_TX_CTRL_PACKETS_PER_UP,
+ (packets_per_up == 0) ? 0 : (FLAG_TX_CTRL_UP_ENB | packets_per_up));
}
- void setup(const uhd::stream_args_t &stream_args){
- if (not stream_args.args.has_key("noclear")) this->clear();
+ void setup(const uhd::stream_args_t& stream_args)
+ {
+ if (not stream_args.args.has_key("noclear"))
+ this->clear();
unsigned format_word = 0;
- if (stream_args.otw_format == "sc16"){
- format_word = 0;
- _dsp_extra_scaling = 1.0;
+ if (stream_args.otw_format == "sc16") {
+ format_word = 0;
+ _dsp_extra_scaling = 1.0;
_host_extra_scaling = 1.0;
- }
- else if (stream_args.otw_format == "sc8"){
- format_word = (1 << 0);
- double peak = stream_args.args.cast<double>("peak", 1.0);
- peak = std::max(peak, 1.0/256);
- _host_extra_scaling = 1.0/peak/256;
- _dsp_extra_scaling = 1.0/peak;
- }
- else throw uhd::value_error("USRP TX cannot handle requested wire format: " + stream_args.otw_format);
+ } else if (stream_args.otw_format == "sc8") {
+ format_word = (1 << 0);
+ double peak = stream_args.args.cast<double>("peak", 1.0);
+ peak = std::max(peak, 1.0 / 256);
+ _host_extra_scaling = 1.0 / peak / 256;
+ _dsp_extra_scaling = 1.0 / peak;
+ } else
+ throw uhd::value_error(
+ "USRP TX cannot handle requested wire format: " + stream_args.otw_format);
_host_extra_scaling /= stream_args.args.cast<double>("fullscale", 1.0);
@@ -195,7 +219,7 @@ public:
_iface->poke32(REG_TX_CTRL_FORMAT, format_word);
- if (stream_args.args.has_key("underflow_policy")){
+ if (stream_args.args.has_key("underflow_policy")) {
this->set_underflow_policy(stream_args.args["underflow_policy"]);
}
}
@@ -204,10 +228,15 @@ private:
wb_iface::sptr _iface;
const size_t _dsp_base, _ctrl_base;
double _tick_rate, _link_rate;
- double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling, _fxpt_scalar_correction;
+ double _scaling_adjustment, _dsp_extra_scaling, _host_extra_scaling,
+ _fxpt_scalar_correction;
const uint32_t _sid;
};
-tx_dsp_core_200::sptr tx_dsp_core_200::make(wb_iface::sptr iface, const size_t dsp_base, const size_t ctrl_base, const uint32_t sid){
+tx_dsp_core_200::sptr tx_dsp_core_200::make(wb_iface::sptr iface,
+ const size_t dsp_base,
+ const size_t ctrl_base,
+ const uint32_t sid)
+{
return sptr(new tx_dsp_core_200_impl(iface, dsp_base, ctrl_base, sid));
}
diff --git a/host/lib/usrp/cores/tx_dsp_core_3000.cpp b/host/lib/usrp/cores/tx_dsp_core_3000.cpp
index c89b684fa..3b0d85c00 100644
--- a/host/lib/usrp/cores/tx_dsp_core_3000.cpp
+++ b/host/lib/usrp/cores/tx_dsp_core_3000.cpp
@@ -187,10 +187,12 @@ public:
.set_publisher(std::bind(&tx_dsp_core_3000::get_host_rates, this));
subtree->create<double>("rate/value")
.set(DEFAULT_RATE)
- .set_coercer(std::bind(&tx_dsp_core_3000::set_host_rate, this, std::placeholders::_1));
+ .set_coercer(
+ std::bind(&tx_dsp_core_3000::set_host_rate, this, std::placeholders::_1));
subtree->create<double>("freq/value")
.set(DEFAULT_CORDIC_FREQ)
- .set_coercer(std::bind(&tx_dsp_core_3000::set_freq, this, std::placeholders::_1))
+ .set_coercer(
+ std::bind(&tx_dsp_core_3000::set_freq, this, std::placeholders::_1))
.set_publisher([this]() { return this->get_freq(); });
subtree->create<meta_range_t>("freq/range")
.set_publisher(std::bind(&tx_dsp_core_3000::get_freq_range, this));
diff --git a/host/lib/usrp/cores/tx_frontend_core_200.cpp b/host/lib/usrp/cores/tx_frontend_core_200.cpp
index c02ce755a..46a79c497 100644
--- a/host/lib/usrp/cores/tx_frontend_core_200.cpp
+++ b/host/lib/usrp/cores/tx_frontend_core_200.cpp
@@ -5,68 +5,78 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
+#include <uhd/exception.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
-#include <uhd/exception.hpp>
+#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
#include <functional>
using namespace uhd;
-#define REG_TX_FE_DC_OFFSET_I _base + 0 * _offset //24 bits
-#define REG_TX_FE_DC_OFFSET_Q _base + 1 * _offset //24 bits
-#define REG_TX_FE_MAG_CORRECTION _base + 2 * _offset //18 bits
-#define REG_TX_FE_PHASE_CORRECTION _base + 3 * _offset //18 bits
-#define REG_TX_FE_MUX _base + 4 * _offset //8 bits (std output = 0x10, reversed = 0x01)
+#define REG_TX_FE_DC_OFFSET_I _base + 0 * _offset // 24 bits
+#define REG_TX_FE_DC_OFFSET_Q _base + 1 * _offset // 24 bits
+#define REG_TX_FE_MAG_CORRECTION _base + 2 * _offset // 18 bits
+#define REG_TX_FE_PHASE_CORRECTION _base + 3 * _offset // 18 bits
+#define REG_TX_FE_MUX _base + 4 * _offset // 8 bits (std output = 0x10, reversed = 0x01)
-const std::complex<double> tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE = std::complex<double>(0.0, 0.0);
-const std::complex<double> tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE = std::complex<double>(0.0, 0.0);
+const std::complex<double> tx_frontend_core_200::DEFAULT_DC_OFFSET_VALUE =
+ std::complex<double>(0.0, 0.0);
+const std::complex<double> tx_frontend_core_200::DEFAULT_IQ_BALANCE_VALUE =
+ std::complex<double>(0.0, 0.0);
namespace {
- static const double DC_OFFSET_MIN = -1.0;
- static const double DC_OFFSET_MAX = 1.0;
-}
+static const double DC_OFFSET_MIN = -1.0;
+static const double DC_OFFSET_MAX = 1.0;
+} // namespace
-static uint32_t fs_to_bits(const double num, const size_t bits){
- return int32_t(boost::math::round(num * (1 << (bits-1))));
+static uint32_t fs_to_bits(const double num, const size_t bits)
+{
+ return int32_t(boost::math::round(num * (1 << (bits - 1))));
}
-tx_frontend_core_200::~tx_frontend_core_200(void){
+tx_frontend_core_200::~tx_frontend_core_200(void)
+{
/* NOP */
}
-class tx_frontend_core_200_impl : public tx_frontend_core_200{
+class tx_frontend_core_200_impl : public tx_frontend_core_200
+{
public:
- tx_frontend_core_200_impl(wb_iface::sptr iface, const size_t base, const size_t offset):
- _iface(iface), _base(base), _offset(offset)
+ tx_frontend_core_200_impl(
+ wb_iface::sptr iface, const size_t base, const size_t offset)
+ : _iface(iface), _base(base), _offset(offset)
{
- //NOP
+ // NOP
}
- void set_mux(const std::string &mode){
- static const uhd::dict<std::string, uint32_t> mode_to_mux = boost::assign::map_list_of
- ("IQ", (0x1 << 4) | (0x0 << 0)) //DAC0Q=DUC0Q, DAC0I=DUC0I
- ("QI", (0x0 << 4) | (0x1 << 0)) //DAC0Q=DUC0I, DAC0I=DUC0Q
- ("I", (0xf << 4) | (0x0 << 0)) //DAC0Q=ZERO, DAC0I=DUC0I
- ("Q", (0x0 << 4) | (0xf << 0)) //DAC0Q=DUC0I, DAC0I=ZERO
- ;
+ void set_mux(const std::string& mode)
+ {
+ static const uhd::dict<std::string, uint32_t> mode_to_mux =
+ boost::assign::map_list_of(
+ "IQ", (0x1 << 4) | (0x0 << 0)) // DAC0Q=DUC0Q, DAC0I=DUC0I
+ ("QI", (0x0 << 4) | (0x1 << 0)) // DAC0Q=DUC0I, DAC0I=DUC0Q
+ ("I", (0xf << 4) | (0x0 << 0)) // DAC0Q=ZERO, DAC0I=DUC0I
+ ("Q", (0x0 << 4) | (0xf << 0)) // DAC0Q=DUC0I, DAC0I=ZERO
+ ;
_iface->poke32(REG_TX_FE_MUX, mode_to_mux[mode]);
}
- std::complex<double> set_dc_offset(const std::complex<double> &off){
+ std::complex<double> set_dc_offset(const std::complex<double>& off)
+ {
static const double scaler = double(1ul << 23);
- const int32_t i_dc_off = boost::math::iround(off.real()*scaler);
- const int32_t q_dc_off = boost::math::iround(off.imag()*scaler);
+ const int32_t i_dc_off = boost::math::iround(off.real() * scaler);
+ const int32_t q_dc_off = boost::math::iround(off.imag() * scaler);
_iface->poke32(REG_TX_FE_DC_OFFSET_I, i_dc_off);
_iface->poke32(REG_TX_FE_DC_OFFSET_Q, q_dc_off);
- return std::complex<double>(i_dc_off/scaler, q_dc_off/scaler);
+ return std::complex<double>(i_dc_off / scaler, q_dc_off / scaler);
}
- void set_iq_balance(const std::complex<double> &cor){
+ void set_iq_balance(const std::complex<double>& cor)
+ {
_iface->poke32(REG_TX_FE_MAG_CORRECTION, fs_to_bits(cor.real(), 18));
_iface->poke32(REG_TX_FE_PHASE_CORRECTION, fs_to_bits(cor.imag(), 18));
}
@@ -74,16 +84,15 @@ public:
void populate_subtree(uhd::property_tree::sptr subtree)
{
subtree->create<uhd::meta_range_t>("dc_offset/range")
- .set(meta_range_t(DC_OFFSET_MIN, DC_OFFSET_MAX))
- ;
- subtree->create< std::complex<double> >("dc_offset/value")
+ .set(meta_range_t(DC_OFFSET_MIN, DC_OFFSET_MAX));
+ subtree->create<std::complex<double>>("dc_offset/value")
.set(DEFAULT_DC_OFFSET_VALUE)
- .set_coercer(std::bind(&tx_frontend_core_200::set_dc_offset, this, std::placeholders::_1))
- ;
- subtree->create< std::complex<double> >("iq_balance/value")
+ .set_coercer(std::bind(
+ &tx_frontend_core_200::set_dc_offset, this, std::placeholders::_1));
+ subtree->create<std::complex<double>>("iq_balance/value")
.set(DEFAULT_IQ_BALANCE_VALUE)
- .add_coerced_subscriber(std::bind(&tx_frontend_core_200::set_iq_balance, this, std::placeholders::_1))
- ;
+ .add_coerced_subscriber(std::bind(
+ &tx_frontend_core_200::set_iq_balance, this, std::placeholders::_1));
}
private:
@@ -92,6 +101,8 @@ private:
const size_t _offset;
};
-tx_frontend_core_200::sptr tx_frontend_core_200::make(wb_iface::sptr iface, const size_t base, const size_t offset){
+tx_frontend_core_200::sptr tx_frontend_core_200::make(
+ wb_iface::sptr iface, const size_t base, const size_t offset)
+{
return sptr(new tx_frontend_core_200_impl(iface, base, offset));
}
diff --git a/host/lib/usrp/cores/tx_vita_core_3000.cpp b/host/lib/usrp/cores/tx_vita_core_3000.cpp
index 689a6cf45..c89301464 100644
--- a/host/lib/usrp/cores/tx_vita_core_3000.cpp
+++ b/host/lib/usrp/cores/tx_vita_core_3000.cpp
@@ -8,35 +8,35 @@
#include <uhd/utils/safe_call.hpp>
#include <uhdlib/usrp/cores/tx_vita_core_3000.hpp>
-#define REG_CTRL_ERROR_POLICY (_base + 0)
-#define REG_FC_PRE_RADIO_RESP_BASE (_base + 2*4)
-#define REG_FC_PRE_FIFO_RESP_BASE (_base + 4*4)
-#define REG_CTRL_FC_CYCLE_OFFSET (0*4)
-#define REG_CTRL_FC_PACKET_OFFSET (1*4)
+#define REG_CTRL_ERROR_POLICY (_base + 0)
+#define REG_FC_PRE_RADIO_RESP_BASE (_base + 2 * 4)
+#define REG_FC_PRE_FIFO_RESP_BASE (_base + 4 * 4)
+#define REG_CTRL_FC_CYCLE_OFFSET (0 * 4)
+#define REG_CTRL_FC_PACKET_OFFSET (1 * 4)
using namespace uhd;
-tx_vita_core_3000::~tx_vita_core_3000(void){
+tx_vita_core_3000::~tx_vita_core_3000(void)
+{
/* NOP */
}
struct tx_vita_core_3000_impl : tx_vita_core_3000
{
tx_vita_core_3000_impl(
- wb_iface::sptr iface,
- const size_t base,
- fc_monitor_loc fc_location
- ):
- _iface(iface),
- _base(base),
- _fc_base((fc_location==FC_PRE_RADIO or fc_location==FC_DEFAULT) ?
- REG_FC_PRE_RADIO_RESP_BASE : REG_FC_PRE_FIFO_RESP_BASE),
- _fc_location(fc_location)
+ wb_iface::sptr iface, const size_t base, fc_monitor_loc fc_location)
+ : _iface(iface)
+ , _base(base)
+ , _fc_base((fc_location == FC_PRE_RADIO or fc_location == FC_DEFAULT)
+ ? REG_FC_PRE_RADIO_RESP_BASE
+ : REG_FC_PRE_FIFO_RESP_BASE)
+ , _fc_location(fc_location)
{
if (fc_location != FC_DEFAULT) {
- //Turn off the other FC monitoring module
- const size_t other_fc_base = (fc_location==FC_PRE_RADIO) ?
- REG_FC_PRE_FIFO_RESP_BASE : REG_FC_PRE_RADIO_RESP_BASE;
+ // Turn off the other FC monitoring module
+ const size_t other_fc_base = (fc_location == FC_PRE_RADIO)
+ ? REG_FC_PRE_FIFO_RESP_BASE
+ : REG_FC_PRE_RADIO_RESP_BASE;
_iface->poke32(other_fc_base + REG_CTRL_FC_CYCLE_OFFSET, 0);
_iface->poke32(other_fc_base + REG_CTRL_FC_PACKET_OFFSET, 0);
}
@@ -46,75 +46,67 @@ struct tx_vita_core_3000_impl : tx_vita_core_3000
~tx_vita_core_3000_impl(void)
{
- UHD_SAFE_CALL
- (
- this->clear();
- )
+ UHD_SAFE_CALL(this->clear();)
}
void clear(void)
{
this->configure_flow_control(0, 0);
- this->set_underflow_policy(_policy); //clears the seq
+ this->set_underflow_policy(_policy); // clears the seq
}
- void set_underflow_policy(const std::string &policy)
+ void set_underflow_policy(const std::string& policy)
{
- if (policy == "next_packet")
- {
+ if (policy == "next_packet") {
_iface->poke32(REG_CTRL_ERROR_POLICY, (1 << 1));
- }
- else if (policy == "next_burst")
- {
+ } else if (policy == "next_burst") {
_iface->poke32(REG_CTRL_ERROR_POLICY, (1 << 2));
- }
- else if (policy == "wait")
- {
+ } else if (policy == "wait") {
_iface->poke32(REG_CTRL_ERROR_POLICY, (1 << 0));
- }
- else throw uhd::value_error("USRP TX cannot handle requested underflow policy: " + policy);
+ } else
+ throw uhd::value_error(
+ "USRP TX cannot handle requested underflow policy: " + policy);
_policy = policy;
}
- void setup(const uhd::stream_args_t &stream_args)
+ void setup(const uhd::stream_args_t& stream_args)
{
- if (stream_args.args.has_key("underflow_policy"))
- {
+ if (stream_args.args.has_key("underflow_policy")) {
this->set_underflow_policy(stream_args.args["underflow_policy"]);
}
}
void configure_flow_control(const size_t cycs_per_up, const size_t pkts_per_up)
{
- if (cycs_per_up == 0) _iface->poke32(_fc_base + REG_CTRL_FC_CYCLE_OFFSET, 0);
- else _iface->poke32(_fc_base + REG_CTRL_FC_CYCLE_OFFSET, (1 << 31) | ((cycs_per_up) & 0xffffff));
+ if (cycs_per_up == 0)
+ _iface->poke32(_fc_base + REG_CTRL_FC_CYCLE_OFFSET, 0);
+ else
+ _iface->poke32(_fc_base + REG_CTRL_FC_CYCLE_OFFSET,
+ (1 << 31) | ((cycs_per_up)&0xffffff));
- if (pkts_per_up == 0) _iface->poke32(_fc_base + REG_CTRL_FC_PACKET_OFFSET, 0);
- else _iface->poke32(_fc_base + REG_CTRL_FC_PACKET_OFFSET, (1 << 31) | ((pkts_per_up) & 0xffff));
+ if (pkts_per_up == 0)
+ _iface->poke32(_fc_base + REG_CTRL_FC_PACKET_OFFSET, 0);
+ else
+ _iface->poke32(
+ _fc_base + REG_CTRL_FC_PACKET_OFFSET, (1 << 31) | ((pkts_per_up)&0xffff));
}
- wb_iface::sptr _iface;
- const size_t _base;
- const size_t _fc_base;
- std::string _policy;
- fc_monitor_loc _fc_location;
-
+ wb_iface::sptr _iface;
+ const size_t _base;
+ const size_t _fc_base;
+ std::string _policy;
+ fc_monitor_loc _fc_location;
};
tx_vita_core_3000::sptr tx_vita_core_3000::make(
- wb_iface::sptr iface,
- const size_t base,
- fc_monitor_loc fc_location
-)
+ wb_iface::sptr iface, const size_t base, fc_monitor_loc fc_location)
{
return tx_vita_core_3000::sptr(new tx_vita_core_3000_impl(iface, base, fc_location));
}
tx_vita_core_3000::sptr tx_vita_core_3000::make_no_radio_buff(
- wb_iface::sptr iface,
- const size_t base
-)
+ wb_iface::sptr iface, const size_t base)
{
- //No internal radio buffer so only pre-radio monitoring is supported.
+ // No internal radio buffer so only pre-radio monitoring is supported.
return tx_vita_core_3000::sptr(new tx_vita_core_3000_impl(iface, base, FC_DEFAULT));
}
diff --git a/host/lib/usrp/cores/user_settings_core_200.cpp b/host/lib/usrp/cores/user_settings_core_200.cpp
index 7de18d11c..c3606738a 100644
--- a/host/lib/usrp/cores/user_settings_core_200.cpp
+++ b/host/lib/usrp/cores/user_settings_core_200.cpp
@@ -9,22 +9,25 @@
using namespace uhd;
-#define REG_USER_ADDR _base + 0
-#define REG_USER_DATA _base + 4
+#define REG_USER_ADDR _base + 0
+#define REG_USER_DATA _base + 4
-user_settings_core_200::~user_settings_core_200(void){
+user_settings_core_200::~user_settings_core_200(void)
+{
/* NOP */
}
-class user_settings_core_200_impl : public user_settings_core_200{
+class user_settings_core_200_impl : public user_settings_core_200
+{
public:
- user_settings_core_200_impl(wb_iface::sptr iface, const size_t base):
- _iface(iface), _base(base)
+ user_settings_core_200_impl(wb_iface::sptr iface, const size_t base)
+ : _iface(iface), _base(base)
{
- //NOP
+ // NOP
}
- void set_reg(const user_reg_t &reg){
+ void set_reg(const user_reg_t& reg)
+ {
_iface->poke32(REG_USER_ADDR, reg.first);
_iface->poke32(REG_USER_DATA, reg.second);
}
@@ -34,6 +37,8 @@ private:
const size_t _base;
};
-user_settings_core_200::sptr user_settings_core_200::make(wb_iface::sptr iface, const size_t base){
+user_settings_core_200::sptr user_settings_core_200::make(
+ wb_iface::sptr iface, const size_t base)
+{
return sptr(new user_settings_core_200_impl(iface, base));
}
diff --git a/host/lib/usrp/cores/user_settings_core_3000.cpp b/host/lib/usrp/cores/user_settings_core_3000.cpp
index 66baed57a..7518756f7 100644
--- a/host/lib/usrp/cores/user_settings_core_3000.cpp
+++ b/host/lib/usrp/cores/user_settings_core_3000.cpp
@@ -5,53 +5,60 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhdlib/usrp/cores/user_settings_core_3000.hpp>
#include <uhd/exception.hpp>
+#include <uhdlib/usrp/cores/user_settings_core_3000.hpp>
#include <boost/thread/thread.hpp>
using namespace uhd;
-#define REG_USER_SR_ADDR _sr_base_addr + 0
-#define REG_USER_SR_DATA _sr_base_addr + 4
-#define REG_USER_RB_ADDR _sr_base_addr + 8
+#define REG_USER_SR_ADDR _sr_base_addr + 0
+#define REG_USER_SR_DATA _sr_base_addr + 4
+#define REG_USER_RB_ADDR _sr_base_addr + 8
-class user_settings_core_3000_impl : public user_settings_core_3000 {
+class user_settings_core_3000_impl : public user_settings_core_3000
+{
public:
- user_settings_core_3000_impl(
- wb_iface::sptr iface,
- const wb_addr_type sr_base_addr, const wb_addr_type rb_reg_addr):
- _iface(iface), _sr_base_addr(sr_base_addr), _rb_reg_addr(rb_reg_addr)
+ user_settings_core_3000_impl(wb_iface::sptr iface,
+ const wb_addr_type sr_base_addr,
+ const wb_addr_type rb_reg_addr)
+ : _iface(iface), _sr_base_addr(sr_base_addr), _rb_reg_addr(rb_reg_addr)
{
}
void poke64(const wb_addr_type offset, const uint64_t value)
{
- if (offset % sizeof(uint64_t) != 0) throw uhd::value_error("poke64: Incorrect address alignment");
+ if (offset % sizeof(uint64_t) != 0)
+ throw uhd::value_error("poke64: Incorrect address alignment");
poke32(offset, static_cast<uint32_t>(value));
poke32(offset + 4, static_cast<uint32_t>(value >> 32));
}
uint64_t peek64(const wb_addr_type offset)
{
- if (offset % sizeof(uint64_t) != 0) throw uhd::value_error("peek64: Incorrect address alignment");
+ if (offset % sizeof(uint64_t) != 0)
+ throw uhd::value_error("peek64: Incorrect address alignment");
boost::unique_lock<boost::mutex> lock(_mutex);
- _iface->poke32(REG_USER_RB_ADDR, offset >> 3); //Translate byte offset to 64-bit offset
+ _iface->poke32(
+ REG_USER_RB_ADDR, offset >> 3); // Translate byte offset to 64-bit offset
return _iface->peek64(_rb_reg_addr);
}
void poke32(const wb_addr_type offset, const uint32_t value)
{
- if (offset % sizeof(uint32_t) != 0) throw uhd::value_error("poke32: Incorrect address alignment");
+ if (offset % sizeof(uint32_t) != 0)
+ throw uhd::value_error("poke32: Incorrect address alignment");
boost::unique_lock<boost::mutex> lock(_mutex);
- _iface->poke32(REG_USER_SR_ADDR, offset >> 2); //Translate byte offset to 64-bit offset
+ _iface->poke32(
+ REG_USER_SR_ADDR, offset >> 2); // Translate byte offset to 64-bit offset
_iface->poke32(REG_USER_SR_DATA, value);
}
uint32_t peek32(const wb_addr_type offset)
{
- if (offset % sizeof(uint32_t) != 0) throw uhd::value_error("peek32: Incorrect address alignment");
+ if (offset % sizeof(uint32_t) != 0)
+ throw uhd::value_error("peek32: Incorrect address alignment");
uint64_t value = peek64((offset >> 3) << 3);
if ((offset & 0x7) == 0) {
@@ -62,14 +69,14 @@ public:
}
private:
- wb_iface::sptr _iface;
- const wb_addr_type _sr_base_addr;
- const wb_addr_type _rb_reg_addr;
- boost::mutex _mutex;
+ wb_iface::sptr _iface;
+ const wb_addr_type _sr_base_addr;
+ const wb_addr_type _rb_reg_addr;
+ boost::mutex _mutex;
};
-wb_iface::sptr user_settings_core_3000::make(wb_iface::sptr iface,
- const wb_addr_type sr_base_addr, const wb_addr_type rb_reg_addr)
+wb_iface::sptr user_settings_core_3000::make(
+ wb_iface::sptr iface, const wb_addr_type sr_base_addr, const wb_addr_type rb_reg_addr)
{
return sptr(new user_settings_core_3000_impl(iface, sr_base_addr, rb_reg_addr));
}
diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp
index 81a7aa534..5e8ac310e 100644
--- a/host/lib/usrp/dboard/db_basic_and_lf.cpp
+++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp
@@ -7,11 +7,11 @@
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
-#include <uhd/utils/assert_has.hpp>
-#include <uhd/utils/static.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
+#include <uhd/utils/assert_has.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/static.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
@@ -22,37 +22,29 @@ using namespace uhd::usrp;
* Constants
**********************************************************************/
namespace {
- constexpr uint32_t BASIC_TX_PID = 0x0000;
- constexpr uint32_t BASIC_RX_PID = 0x0001;
- constexpr uint32_t LF_TX_PID = 0x000E;
- constexpr uint32_t LF_RX_PID = 0x000F;
-
- constexpr double BASIC_MAX_BANDWIDTH = 250e6; // Hz
- constexpr double LF_MAX_BANDWIDTH = 32e6; // Hz
-
-
- const std::map<std::string, double> subdev_bandwidth_scalar{
- {"A", 1.0},
- {"B", 1.0},
- {"AB", 2.0},
- {"BA", 2.0}
- };
-
- const uhd::dict<std::string, std::string> sd_name_to_conn =
- boost::assign::map_list_of
- ("AB", "IQ")
- ("BA", "QI")
- ("A", "I")
- ("B", "Q")
- ;
-}
+constexpr uint32_t BASIC_TX_PID = 0x0000;
+constexpr uint32_t BASIC_RX_PID = 0x0001;
+constexpr uint32_t LF_TX_PID = 0x000E;
+constexpr uint32_t LF_RX_PID = 0x000F;
+
+constexpr double BASIC_MAX_BANDWIDTH = 250e6; // Hz
+constexpr double LF_MAX_BANDWIDTH = 32e6; // Hz
+
+
+const std::map<std::string, double> subdev_bandwidth_scalar{
+ {"A", 1.0}, {"B", 1.0}, {"AB", 2.0}, {"BA", 2.0}};
+
+const uhd::dict<std::string, std::string> sd_name_to_conn =
+ boost::assign::map_list_of("AB", "IQ")("BA", "QI")("A", "I")("B", "Q");
+} // namespace
/***********************************************************************
* The basic and lf boards:
* They share a common class because only the frequency bounds differ.
**********************************************************************/
-class basic_rx : public rx_dboard_base{
+class basic_rx : public rx_dboard_base
+{
public:
basic_rx(ctor_args_t args, double max_freq);
virtual ~basic_rx(void);
@@ -63,7 +55,8 @@ private:
double _max_freq;
};
-class basic_tx : public tx_dboard_base{
+class basic_tx : public tx_dboard_base
+{
public:
basic_tx(ctor_args_t args, double max_freq);
virtual ~basic_tx(void);
@@ -75,167 +68,171 @@ private:
/***********************************************************************
* Register the basic and LF dboards
**********************************************************************/
-static dboard_base::sptr make_basic_rx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_basic_rx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new basic_rx(args, BASIC_MAX_BANDWIDTH));
}
-static dboard_base::sptr make_basic_tx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_basic_tx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new basic_tx(args, BASIC_MAX_BANDWIDTH));
}
-static dboard_base::sptr make_lf_rx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_lf_rx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new basic_rx(args, LF_MAX_BANDWIDTH));
}
-static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new basic_tx(args, LF_MAX_BANDWIDTH));
}
-UHD_STATIC_BLOCK(reg_basic_and_lf_dboards){
- dboard_manager::register_dboard(BASIC_TX_PID, &make_basic_tx, "Basic TX", sd_name_to_conn.keys());
- dboard_manager::register_dboard(BASIC_RX_PID, &make_basic_rx, "Basic RX", sd_name_to_conn.keys());
- dboard_manager::register_dboard(LF_TX_PID, &make_lf_tx, "LF TX", sd_name_to_conn.keys());
- dboard_manager::register_dboard(LF_RX_PID, &make_lf_rx, "LF RX", sd_name_to_conn.keys());
+UHD_STATIC_BLOCK(reg_basic_and_lf_dboards)
+{
+ dboard_manager::register_dboard(
+ BASIC_TX_PID, &make_basic_tx, "Basic TX", sd_name_to_conn.keys());
+ dboard_manager::register_dboard(
+ BASIC_RX_PID, &make_basic_rx, "Basic RX", sd_name_to_conn.keys());
+ dboard_manager::register_dboard(
+ LF_TX_PID, &make_lf_tx, "LF TX", sd_name_to_conn.keys());
+ dboard_manager::register_dboard(
+ LF_RX_PID, &make_lf_rx, "LF RX", sd_name_to_conn.keys());
}
/***********************************************************************
* Basic and LF RX dboard
**********************************************************************/
basic_rx::basic_rx(ctor_args_t args, double max_freq)
- : rx_dboard_base(args),
- _max_freq(max_freq)
+ : rx_dboard_base(args), _max_freq(max_freq)
{
const std::string fe_name(get_subdev_name());
const std::string fe_conn(sd_name_to_conn[fe_name]);
- const std::string db_name(str(
- boost::format("%s (%s)")
- % ((get_rx_id() == BASIC_RX_PID) ? "BasicRX" : "LFRX")
- % fe_name));
+ const std::string db_name(
+ str(boost::format("%s (%s)")
+ % ((get_rx_id() == BASIC_RX_PID) ? "BasicRX" : "LFRX") % fe_name));
UHD_LOG_TRACE("BASICRX",
- "Initializing driver for: " << db_name <<
- " IQ connection type: " << fe_conn);
+ "Initializing driver for: " << db_name << " IQ connection type: " << fe_conn);
const bool has_fe_conn_settings =
get_iface()->has_set_fe_connection(dboard_iface::UNIT_RX);
UHD_LOG_TRACE("BASICRX",
- "Access to FE connection settings: "
- << (has_fe_conn_settings ? "Yes" : "No"));
+ "Access to FE connection settings: " << (has_fe_conn_settings ? "Yes" : "No"));
- std::vector<std::string> antenna_options = has_fe_conn_settings
- ? sd_name_to_conn.keys()
- : std::vector<std::string>(1, "");
+ std::vector<std::string> antenna_options =
+ has_fe_conn_settings ? sd_name_to_conn.keys() : std::vector<std::string>(1, "");
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
this->get_rx_subtree()->create<std::string>("name").set(db_name);
- this->get_rx_subtree()->create<int>("gains"); //phony property so this dir exists
- this->get_rx_subtree()->create<double>("freq/value")
- .set_publisher([](){ return 0.0; });
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
+ this->get_rx_subtree()->create<int>("gains"); // phony property so this dir exists
+ this->get_rx_subtree()->create<double>("freq/value").set_publisher([]() {
+ return 0.0;
+ });
+ this->get_rx_subtree()
+ ->create<meta_range_t>("freq/range")
.set(freq_range_t(-_max_freq, +_max_freq));
- this->get_rx_subtree()->create<std::string>("antenna/value")
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
.set(has_fe_conn_settings ? fe_name : "");
if (has_fe_conn_settings) {
- this->get_rx_subtree()->access<std::string>("antenna/value")
- .add_coerced_subscriber([this](const std::string& ant){
- this->set_rx_ant(ant);
- })
- ;
+ this->get_rx_subtree()
+ ->access<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ [this](const std::string& ant) { this->set_rx_ant(ant); });
}
- this->get_rx_subtree()->create<std::vector<std::string>>("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(antenna_options);
- this->get_rx_subtree()->create<int>("sensors"); //phony property so this dir exists
- this->get_rx_subtree()->create<std::string>("connection")
+ this->get_rx_subtree()->create<int>("sensors"); // phony property so this dir exists
+ this->get_rx_subtree()
+ ->create<std::string>("connection")
.set(sd_name_to_conn[get_subdev_name()]);
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
- .set(subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq);
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(
- subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq,
- subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq));
-
- //disable RX dboard clock by default
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
+ .set(subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq);
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq,
+ subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq));
+
+ // disable RX dboard clock by default
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, false);
- //set GPIOs to output 0x0000 to decrease noise pickup
+ // set GPIOs to output 0x0000 to decrease noise pickup
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0000);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0xFFFF);
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, 0x0000);
}
-basic_rx::~basic_rx(void){
+basic_rx::~basic_rx(void)
+{
/* NOP */
}
void basic_rx::set_rx_ant(const std::string& ant)
{
UHD_ASSERT_THROW(get_iface()->has_set_fe_connection(dboard_iface::UNIT_RX));
- UHD_LOG_TRACE("BASICRX",
- "Setting antenna value to: " << ant);
- get_iface()->set_fe_connection(
- dboard_iface::UNIT_RX,
+ UHD_LOG_TRACE("BASICRX", "Setting antenna value to: " << ant);
+ get_iface()->set_fe_connection(dboard_iface::UNIT_RX,
get_subdev_name(),
- usrp::fe_connection_t(sd_name_to_conn[ant], 0.0 /* IF */)
- );
+ usrp::fe_connection_t(sd_name_to_conn[ant], 0.0 /* IF */));
}
/***********************************************************************
* Basic and LF TX dboard
**********************************************************************/
-basic_tx::basic_tx(ctor_args_t args, double max_freq) : tx_dboard_base(args){
+basic_tx::basic_tx(ctor_args_t args, double max_freq) : tx_dboard_base(args)
+{
_max_freq = max_freq;
- //this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
+ // this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
if (get_tx_id() == BASIC_TX_PID) {
this->get_tx_subtree()->create<std::string>("name").set(
- std::string(str(boost::format("BasicTX (%s)") % get_subdev_name()
- )));
- }
- else {
+ std::string(str(boost::format("BasicTX (%s)") % get_subdev_name())));
+ } else {
this->get_tx_subtree()->create<std::string>("name").set(
- std::string(str(boost::format("LFTX (%s)") % get_subdev_name()
- )));
+ std::string(str(boost::format("LFTX (%s)") % get_subdev_name())));
}
- this->get_tx_subtree()->create<int>("gains"); //phony property so this dir exists
- this->get_tx_subtree()->create<double>("freq/value")
- .set_publisher([](){ return 0.0; });
- this->get_tx_subtree()->create<meta_range_t>("freq/range")
+ this->get_tx_subtree()->create<int>("gains"); // phony property so this dir exists
+ this->get_tx_subtree()->create<double>("freq/value").set_publisher([]() {
+ return 0.0;
+ });
+ this->get_tx_subtree()
+ ->create<meta_range_t>("freq/range")
.set(freq_range_t(-_max_freq, +_max_freq));
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .set("");
- this->get_tx_subtree()->create<std::vector<std::string>>("antenna/options")
- .set({""});
- this->get_tx_subtree()->create<int>("sensors"); //phony property so this dir exists
- this->get_tx_subtree()->create<std::string>("connection")
+ this->get_tx_subtree()->create<std::string>("antenna/value").set("");
+ this->get_tx_subtree()->create<std::vector<std::string>>("antenna/options").set({""});
+ this->get_tx_subtree()->create<int>("sensors"); // phony property so this dir exists
+ this->get_tx_subtree()
+ ->create<std::string>("connection")
.set(sd_name_to_conn[get_subdev_name()]);
- this->get_tx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_tx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_tx_subtree()->create<double>("bandwidth/value")
- .set(subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq);
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(
- subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq,
- subdev_bandwidth_scalar.at(get_subdev_name())*_max_freq));
-
- //disable TX dboard clock by default
+ this->get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_tx_subtree()
+ ->create<double>("bandwidth/value")
+ .set(subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq);
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq,
+ subdev_bandwidth_scalar.at(get_subdev_name()) * _max_freq));
+
+ // disable TX dboard clock by default
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, false);
- //set GPIOs to output 0x0000 to decrease noise pickup
+ // set GPIOs to output 0x0000 to decrease noise pickup
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, 0x0000);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, 0xFFFF);
this->get_iface()->set_gpio_out(dboard_iface::UNIT_TX, 0x0000);
}
-basic_tx::~basic_tx(void){
+basic_tx::~basic_tx(void)
+{
/* NOP */
}
diff --git a/host/lib/usrp/dboard/db_cbx.cpp b/host/lib/usrp/dboard/db_cbx.cpp
index c08ae11ae..40bc49861 100644
--- a/host/lib/usrp/dboard/db_cbx.cpp
+++ b/host/lib/usrp/dboard/db_cbx.cpp
@@ -17,22 +17,30 @@ using namespace boost::assign;
/***********************************************************************
* Structors
**********************************************************************/
-sbx_xcvr::cbx::cbx(sbx_xcvr *_self_sbx_xcvr) {
- //register the handle to our base CBX class
+sbx_xcvr::cbx::cbx(sbx_xcvr* _self_sbx_xcvr)
+{
+ // register the handle to our base CBX class
self_base = _self_sbx_xcvr;
- _txlo = max287x_iface::make<max2870>(std::bind(&sbx_xcvr::cbx::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = max287x_iface::make<max2870>(std::bind(&sbx_xcvr::cbx::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = max287x_iface::make<max2870>(std::bind(&sbx_xcvr::cbx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = max287x_iface::make<max2870>(std::bind(&sbx_xcvr::cbx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
}
-sbx_xcvr::cbx::~cbx(void){
+sbx_xcvr::cbx::~cbx(void)
+{
/* NOP */
}
-void sbx_xcvr::cbx::write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs)
+void sbx_xcvr::cbx::write_lo_regs(
+ dboard_iface::unit_t unit, const std::vector<uint32_t>& regs)
{
- for(uint32_t reg: regs)
- {
+ for (uint32_t reg : regs) {
self_base->get_iface()->write_spi(unit, spi_config_t::EDGE_RISE, reg, 32);
}
}
@@ -41,39 +49,40 @@ void sbx_xcvr::cbx::write_lo_regs(dboard_iface::unit_t unit, const std::vector<u
/***********************************************************************
* Tuning
**********************************************************************/
-double sbx_xcvr::cbx::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- UHD_LOGGER_TRACE("CBX") << boost::format(
- "CBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+double sbx_xcvr::cbx::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ UHD_LOGGER_TRACE("CBX") << boost::format("CBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
- //clip the input
+ // clip the input
target_freq = cbx_freq_range.clip(target_freq);
- double ref_freq = self_base->get_iface()->get_clock_rate(unit);
+ double ref_freq = self_base->get_iface()->get_clock_rate(unit);
double target_pfd_freq = 25e6;
- double actual_freq = 0.0;
+ double actual_freq = 0.0;
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
- if (unit == dboard_iface::UNIT_RX)
- {
- actual_freq = _rxlo->set_frequency(target_freq, ref_freq, target_pfd_freq, is_int_n);
+ if (unit == dboard_iface::UNIT_RX) {
+ actual_freq =
+ _rxlo->set_frequency(target_freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo->commit();
} else {
- actual_freq = _txlo->set_frequency(target_freq, ref_freq, target_pfd_freq, is_int_n);
+ actual_freq =
+ _txlo->set_frequency(target_freq, ref_freq, target_pfd_freq, is_int_n);
_txlo->set_output_power((actual_freq == sbx_tx_lo_2dbm.clip(actual_freq))
- ? max287x_iface::OUTPUT_POWER_2DBM
- : max287x_iface::OUTPUT_POWER_5DBM);
+ ? max287x_iface::OUTPUT_POWER_2DBM
+ : max287x_iface::OUTPUT_POWER_5DBM);
_txlo->commit();
}
return actual_freq;
}
-
diff --git a/host/lib/usrp/dboard/db_dbsrx.cpp b/host/lib/usrp/dboard/db_dbsrx.cpp
index 6e4d482be..238dbd95e 100644
--- a/host/lib/usrp/dboard/db_dbsrx.cpp
+++ b/host/lib/usrp/dboard/db_dbsrx.cpp
@@ -37,24 +37,23 @@ using namespace boost::assign;
**********************************************************************/
static const freq_range_t dbsrx_freq_range(0.8e9, 2.4e9);
-//Multiplied by 2.0 for conversion to complex bandpass from lowpass
-static const freq_range_t dbsrx_bandwidth_range(2.0*4.0e6, 2.0*33.0e6);
+// Multiplied by 2.0 for conversion to complex bandpass from lowpass
+static const freq_range_t dbsrx_bandwidth_range(2.0 * 4.0e6, 2.0 * 33.0e6);
static const freq_range_t dbsrx_pfd_freq_range(0.15e6, 2.01e6);
static const std::vector<std::string> dbsrx_antennas = list_of("J3");
-static const uhd::dict<std::string, gain_range_t> dbsrx_gain_ranges = map_list_of
- ("GC1", gain_range_t(0, 56, 0.5))
- ("GC2", gain_range_t(0, 24, 1))
-;
+static const uhd::dict<std::string, gain_range_t> dbsrx_gain_ranges =
+ map_list_of("GC1", gain_range_t(0, 56, 0.5))("GC2", gain_range_t(0, 24, 1));
static const double usrp1_gpio_clock_rate_limit = 4e6;
/***********************************************************************
* The DBSRX dboard class
**********************************************************************/
-class dbsrx : public rx_dboard_base{
+class dbsrx : public rx_dboard_base
+{
public:
dbsrx(ctor_args_t args);
virtual ~dbsrx(void);
@@ -65,65 +64,74 @@ private:
uhd::dict<std::string, double> _gains;
max2118_write_regs_t _max2118_write_regs;
max2118_read_regs_t _max2118_read_regs;
- uint8_t _max2118_addr(void){
- return (this->get_iface()->get_special_props().mangle_i2c_addrs)? 0x65 : 0x67;
+ uint8_t _max2118_addr(void)
+ {
+ return (this->get_iface()->get_special_props().mangle_i2c_addrs) ? 0x65 : 0x67;
};
double set_lo_freq(double target_freq);
- double set_gain(double gain, const std::string &name);
+ double set_gain(double gain, const std::string& name);
double set_bandwidth(double bandwidth);
- void send_reg(uint8_t start_reg, uint8_t stop_reg){
+ void send_reg(uint8_t start_reg, uint8_t stop_reg)
+ {
start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x5));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x5));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x5));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t) - 1){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1 ? sizeof(uint32_t) - 1 : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t) - 1) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1
+ ? sizeof(uint32_t) - 1
+ : stop_reg - start_addr + 1;
- //create buffer for register data (+1 for start address)
+ // create buffer for register data (+1 for start address)
byte_vector_t regs_vector(num_bytes + 1);
- //first byte is the address of first register
+ // first byte is the address of first register
regs_vector[0] = start_addr;
- //get the register data
- for(int i=0; i<num_bytes; i++){
- regs_vector[1+i] = _max2118_write_regs.get_reg(start_addr+i);
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: send reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % int(start_addr+i) % int(regs_vector[1+i]) % int(start_addr) % num_bytes ;
+ // get the register data
+ for (int i = 0; i < num_bytes; i++) {
+ regs_vector[1 + i] = _max2118_write_regs.get_reg(start_addr + i);
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX: send reg 0x%02x, value 0x%04x, start_addr = "
+ "0x%04x, num_bytes %d")
+ % int(start_addr + i) % int(regs_vector[1 + i])
+ % int(start_addr) % num_bytes;
}
- //send the data
- this->get_iface()->write_i2c(
- _max2118_addr(), regs_vector
- );
+ // send the data
+ this->get_iface()->write_i2c(_max2118_addr(), regs_vector);
}
}
- void read_reg(uint8_t start_reg, uint8_t stop_reg){
+ void read_reg(uint8_t start_reg, uint8_t stop_reg)
+ {
static const uint8_t status_addr = 0x0;
- start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x1));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x1));
+ start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x1));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x1));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t)){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) ? sizeof(uint32_t) : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t)) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t))
+ ? sizeof(uint32_t)
+ : stop_reg - start_addr + 1;
- //create buffer for register data
+ // create buffer for register data
byte_vector_t regs_vector(num_bytes);
- //read from i2c
- regs_vector = this->get_iface()->read_i2c(
- _max2118_addr(), num_bytes
- );
+ // read from i2c
+ regs_vector = this->get_iface()->read_i2c(_max2118_addr(), num_bytes);
- for(uint8_t i=0; i < num_bytes; i++){
- if (i + start_addr >= status_addr){
+ for (uint8_t i = 0; i < num_bytes; i++) {
+ if (i + start_addr >= status_addr) {
_max2118_read_regs.set_reg(i + start_addr, regs_vector[i]);
}
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: read reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % int(start_addr+i) % int(regs_vector[i]) % int(start_addr) % num_bytes ;
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX: read reg 0x%02x, value 0x%04x, start_addr = "
+ "0x%04x, num_bytes %d")
+ % int(start_addr + i) % int(regs_vector[i]) % int(start_addr)
+ % num_bytes;
}
}
}
@@ -132,15 +140,14 @@ private:
* Get the lock detect status of the LO.
* \return sensor for locked
*/
- sensor_value_t get_locked(void){
+ sensor_value_t get_locked(void)
+ {
read_reg(0x0, 0x0);
- //mask and return lock detect
+ // mask and return lock detect
bool locked = 5 >= _max2118_read_regs.adc and _max2118_read_regs.adc >= 2;
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: locked %d"
- ) % locked ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX: locked %d") % locked;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
@@ -149,190 +156,214 @@ private:
/***********************************************************************
* Register the DBSRX dboard
**********************************************************************/
-static dboard_base::sptr make_dbsrx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_dbsrx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new dbsrx(args));
}
-UHD_STATIC_BLOCK(reg_dbsrx_dboard){
- //register the factory function for the rx dbid (others version)
+UHD_STATIC_BLOCK(reg_dbsrx_dboard)
+{
+ // register the factory function for the rx dbid (others version)
dboard_manager::register_dboard(0x000D, &make_dbsrx, "DBSRX");
- //register the factory function for the rx dbid (USRP1 version)
+ // register the factory function for the rx dbid (USRP1 version)
dboard_manager::register_dboard(0x0002, &make_dbsrx, "DBSRX");
}
/***********************************************************************
* Structors
**********************************************************************/
-dbsrx::dbsrx(ctor_args_t args) : rx_dboard_base(args){
- //warn user about incorrect DBID on USRP1, requires R193 populated
- if (this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x000D)
- UHD_LOGGER_WARNING("DBSRX") << boost::format(
- "DBSRX: incorrect dbid\n"
- "Expected dbid 0x0002 and R193\n"
- "found dbid == %d\n"
- "Please see the daughterboard app notes"
- ) % this->get_rx_id().to_pp_string();
-
- //warn user about incorrect DBID on non-USRP1, requires R194 populated
- if (not this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x0002)
- UHD_LOGGER_WARNING("DBSRX") << boost::format(
- "DBSRX: incorrect dbid\n"
- "Expected dbid 0x000D and R194\n"
- "found dbid == %d\n"
- "Please see the daughterboard app notes"
- ) % this->get_rx_id().to_pp_string();
-
- //send initial register settings
+dbsrx::dbsrx(ctor_args_t args) : rx_dboard_base(args)
+{
+ // warn user about incorrect DBID on USRP1, requires R193 populated
+ if (this->get_iface()->get_special_props().soft_clock_divider
+ and this->get_rx_id() == 0x000D)
+ UHD_LOGGER_WARNING("DBSRX")
+ << boost::format("DBSRX: incorrect dbid\n"
+ "Expected dbid 0x0002 and R193\n"
+ "found dbid == %d\n"
+ "Please see the daughterboard app notes")
+ % this->get_rx_id().to_pp_string();
+
+ // warn user about incorrect DBID on non-USRP1, requires R194 populated
+ if (not this->get_iface()->get_special_props().soft_clock_divider
+ and this->get_rx_id() == 0x0002)
+ UHD_LOGGER_WARNING("DBSRX")
+ << boost::format("DBSRX: incorrect dbid\n"
+ "Expected dbid 0x000D and R194\n"
+ "found dbid == %d\n"
+ "Please see the daughterboard app notes")
+ % this->get_rx_id().to_pp_string();
+
+ // send initial register settings
this->send_reg(0x0, 0x5);
- //set defaults for LO, gains, and filter bandwidth
+ // set defaults for LO, gains, and filter bandwidth
double codec_rate = this->get_iface()->get_codec_rate(dboard_iface::UNIT_RX);
- _bandwidth = 0.8*codec_rate/2.0; // default to anti-alias at different codec_rate
+ _bandwidth = 0.8 * codec_rate / 2.0; // default to anti-alias at different codec_rate
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name")
- .set("DBSRX");
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_rx_subtree()->create<std::string>("name").set("DBSRX");
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&dbsrx::get_locked, this));
- for(const std::string &name: dbsrx_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
+ for (const std::string& name : dbsrx_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
.set_coercer(std::bind(&dbsrx::set_gain, this, std::placeholders::_1, name))
.set(dbsrx_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(dbsrx_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&dbsrx::set_lo_freq, this, std::placeholders::_1));
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(dbsrx_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(dbsrx_freq_range);
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
.set(dbsrx_antennas.at(0));
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(dbsrx_antennas);
- this->get_rx_subtree()->create<std::string>("connection")
- .set("IQ");
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
+ this->get_rx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
.set_coercer(std::bind(&dbsrx::set_bandwidth, this, std::placeholders::_1));
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(dbsrx_bandwidth_range);
- //enable only the clocks we need
+ // enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0); // All unused in atr
- if (this->get_iface()->get_special_props().soft_clock_divider){
- this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x1); // GPIO0 is clock when on USRP1
- }
- else{
+ if (this->get_iface()->get_special_props().soft_clock_divider) {
+ this->get_iface()->set_gpio_ddr(
+ dboard_iface::UNIT_RX, 0x1); // GPIO0 is clock when on USRP1
+ } else {
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x0); // All Inputs
}
- //now its safe to set inital freq and bw
- this->get_rx_subtree()->access<double>("freq/value")
- .set(dbsrx_freq_range.start());
- this->get_rx_subtree()->access<double>("bandwidth/value")
- .set(2.0*_bandwidth); //_bandwidth in lowpass, convert to complex bandpass
+ // now its safe to set inital freq and bw
+ this->get_rx_subtree()->access<double>("freq/value").set(dbsrx_freq_range.start());
+ this->get_rx_subtree()
+ ->access<double>("bandwidth/value")
+ .set(2.0 * _bandwidth); //_bandwidth in lowpass, convert to complex bandpass
}
-dbsrx::~dbsrx(void){
-}
+dbsrx::~dbsrx(void) {}
/***********************************************************************
* Tuning
**********************************************************************/
-double dbsrx::set_lo_freq(double target_freq){
+double dbsrx::set_lo_freq(double target_freq)
+{
target_freq = dbsrx_freq_range.clip(target_freq);
- double actual_freq=0.0, pfd_freq=0.0, ref_clock=0.0;
- int R=0, N=0, r=0, m=0;
+ double actual_freq = 0.0, pfd_freq = 0.0, ref_clock = 0.0;
+ int R = 0, N = 0, r = 0, m = 0;
bool update_filter_settings = false;
- //choose refclock
- std::vector<double> clock_rates = this->get_iface()->get_clock_rates(dboard_iface::UNIT_RX);
+ // choose refclock
+ std::vector<double> clock_rates =
+ this->get_iface()->get_clock_rates(dboard_iface::UNIT_RX);
const double max_clock_rate = uhd::sorted(clock_rates).back();
- for(auto ref_clock: uhd::reversed(uhd::sorted(clock_rates))){
- //USRP1 feeds the DBSRX clock from a FPGA GPIO line.
- //make sure that this clock does not exceed rate limit.
- if (this->get_iface()->get_special_props().soft_clock_divider){
- if (ref_clock > usrp1_gpio_clock_rate_limit) continue;
+ for (auto ref_clock : uhd::reversed(uhd::sorted(clock_rates))) {
+ // USRP1 feeds the DBSRX clock from a FPGA GPIO line.
+ // make sure that this clock does not exceed rate limit.
+ if (this->get_iface()->get_special_props().soft_clock_divider) {
+ if (ref_clock > usrp1_gpio_clock_rate_limit)
+ continue;
}
- if (ref_clock > 27.0e6) continue;
- if (size_t(max_clock_rate/ref_clock)%2 == 1) continue; //reject asymmetric clocks (odd divisors)
+ if (ref_clock > 27.0e6)
+ continue;
+ if (size_t(max_clock_rate / ref_clock) % 2 == 1)
+ continue; // reject asymmetric clocks (odd divisors)
- //choose m_divider such that filter tuning constraint is met
+ // choose m_divider such that filter tuning constraint is met
m = 31;
- while ((ref_clock/m < 1e6 or ref_clock/m > 2.5e6) and m > 0){ m--; }
+ while ((ref_clock / m < 1e6 or ref_clock / m > 2.5e6) and m > 0) {
+ m--;
+ }
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: trying ref_clock %f and m_divider %d"
- ) % (ref_clock) % m ;
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX: trying ref_clock %f and m_divider %d") % (ref_clock)
+ % m;
- if (m >= 32) continue;
+ if (m >= 32)
+ continue;
- //choose R
- for(auto r = 0; r <= 6; r += 1) {
- //compute divider from setting
- R = 1 << (r+1);
- UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX R:%d\n") % R ;
+ // choose R
+ for (auto r = 0; r <= 6; r += 1) {
+ // compute divider from setting
+ R = 1 << (r + 1);
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX R:%d\n") % R;
- //compute PFD compare frequency = ref_clock/R
+ // compute PFD compare frequency = ref_clock/R
pfd_freq = ref_clock / R;
- //constrain the PFD frequency to specified range
- if ((pfd_freq < dbsrx_pfd_freq_range.start()) or (pfd_freq > dbsrx_pfd_freq_range.stop())) continue;
+ // constrain the PFD frequency to specified range
+ if ((pfd_freq < dbsrx_pfd_freq_range.start())
+ or (pfd_freq > dbsrx_pfd_freq_range.stop()))
+ continue;
- //compute N
- N = int(std::floor(target_freq/pfd_freq));
+ // compute N
+ N = int(std::floor(target_freq / pfd_freq));
- //constrain N to specified range
- if ((N < 256) or (N > 32768)) continue;
+ // constrain N to specified range
+ if ((N < 256) or (N > 32768))
+ continue;
goto done_loop;
}
}
- done_loop:
+done_loop:
- //Assert because we failed to find a suitable combination of ref_clock, R and N
+ // Assert because we failed to find a suitable combination of ref_clock, R and N
UHD_ASSERT_THROW(ref_clock <= 27.0e6 and ref_clock >= 0.0);
- UHD_ASSERT_THROW(m and ref_clock/m >= 1e6 and ref_clock/m <= 2.5e6);
- UHD_ASSERT_THROW((pfd_freq >= dbsrx_pfd_freq_range.start()) and (pfd_freq <= dbsrx_pfd_freq_range.stop()));
+ UHD_ASSERT_THROW(m and ref_clock / m >= 1e6 and ref_clock / m <= 2.5e6);
+ UHD_ASSERT_THROW((pfd_freq >= dbsrx_pfd_freq_range.start())
+ and (pfd_freq <= dbsrx_pfd_freq_range.stop()));
UHD_ASSERT_THROW((N >= 256) and (N <= 32768));
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: choose ref_clock (current: %f, new: %f) and m_divider %d"
- ) % (this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX)) % ref_clock % m ;
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format(
+ "DBSRX: choose ref_clock (current: %f, new: %f) and m_divider %d")
+ % (this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX)) % ref_clock
+ % m;
- //if ref_clock or m divider changed, we need to update the filter settings
- if (ref_clock != this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX) or m != _max2118_write_regs.m_divider) update_filter_settings = true;
+ // if ref_clock or m divider changed, we need to update the filter settings
+ if (ref_clock != this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX)
+ or m != _max2118_write_regs.m_divider)
+ update_filter_settings = true;
- //compute resulting output frequency
+ // compute resulting output frequency
actual_freq = pfd_freq * N;
- //apply ref_clock, R, and N settings
+ // apply ref_clock, R, and N settings
this->get_iface()->set_clock_rate(dboard_iface::UNIT_RX, ref_clock);
ref_clock = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
_max2118_write_regs.m_divider = m;
- _max2118_write_regs.r_divider = (max2118_write_regs_t::r_divider_t) r;
+ _max2118_write_regs.r_divider = (max2118_write_regs_t::r_divider_t)r;
_max2118_write_regs.set_n_divider(N);
_max2118_write_regs.ade_vco_ade_read = max2118_write_regs_t::ADE_VCO_ADE_READ_ENABLED;
- //compute prescaler variables
- int scaler = actual_freq > 1125e6 ? 2 : 4;
- _max2118_write_regs.div2 = scaler == 4 ? max2118_write_regs_t::DIV2_DIV4 : max2118_write_regs_t::DIV2_DIV2;
+ // compute prescaler variables
+ int scaler = actual_freq > 1125e6 ? 2 : 4;
+ _max2118_write_regs.div2 = scaler == 4 ? max2118_write_regs_t::DIV2_DIV4
+ : max2118_write_regs_t::DIV2_DIV2;
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: scaler %d, actual_freq %f MHz, register bit: %d"
- ) % scaler % (actual_freq/1e6) % int(_max2118_write_regs.div2) ;
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX: scaler %d, actual_freq %f MHz, register bit: %d")
+ % scaler % (actual_freq / 1e6) % int(_max2118_write_regs.div2);
- //compute vco frequency and select vco
+ // compute vco frequency and select vco
double vco_freq = actual_freq * scaler;
if (vco_freq < 2433e6)
_max2118_write_regs.osc_band = 0;
@@ -351,82 +382,94 @@ double dbsrx::set_lo_freq(double target_freq){
else
_max2118_write_regs.osc_band = 7;
- //send settings over i2c
+ // send settings over i2c
send_reg(0x0, 0x4);
- //check vtune for lock condition
+ // check vtune for lock condition
read_reg(0x0, 0x0);
UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: initial guess for vco %d, vtune adc %d"
- ) % int(_max2118_write_regs.osc_band) % int(_max2118_read_regs.adc) ;
-
- //if we are out of lock for chosen vco, change vco
- while ((_max2118_read_regs.adc == 0) or (_max2118_read_regs.adc == 7)){
-
- //vtune is too low, try lower frequency vco
- if (_max2118_read_regs.adc == 0){
- if (_max2118_write_regs.osc_band == 0){
- UHD_LOGGER_WARNING("DBSRX") << boost::format(
- "DBSRX: Tuning exceeded vco range, _max2118_write_regs.osc_band == %d\n"
- ) % int(_max2118_write_regs.osc_band);
- UHD_ASSERT_THROW(_max2118_read_regs.adc != 0); //just to cause a throw
+ "DBSRX: initial guess for vco %d, vtune adc %d")
+ % int(_max2118_write_regs.osc_band)
+ % int(_max2118_read_regs.adc);
+
+ // if we are out of lock for chosen vco, change vco
+ while ((_max2118_read_regs.adc == 0) or (_max2118_read_regs.adc == 7)) {
+ // vtune is too low, try lower frequency vco
+ if (_max2118_read_regs.adc == 0) {
+ if (_max2118_write_regs.osc_band == 0) {
+ UHD_LOGGER_WARNING("DBSRX")
+ << boost::format("DBSRX: Tuning exceeded vco range, "
+ "_max2118_write_regs.osc_band == %d\n")
+ % int(_max2118_write_regs.osc_band);
+ UHD_ASSERT_THROW(_max2118_read_regs.adc != 0); // just to cause a throw
}
- if (_max2118_write_regs.osc_band <= 0) break;
+ if (_max2118_write_regs.osc_band <= 0)
+ break;
_max2118_write_regs.osc_band -= 1;
}
- //vtune is too high, try higher frequency vco
- if (_max2118_read_regs.adc == 7){
- if (_max2118_write_regs.osc_band == 7){
- UHD_LOGGER_WARNING("DBSRX") << boost::format(
- "DBSRX: Tuning exceeded vco range, _max2118_write_regs.osc_band == %d\n"
- ) % int(_max2118_write_regs.osc_band);
- UHD_ASSERT_THROW(_max2118_read_regs.adc != 7); //just to cause a throw
+ // vtune is too high, try higher frequency vco
+ if (_max2118_read_regs.adc == 7) {
+ if (_max2118_write_regs.osc_band == 7) {
+ UHD_LOGGER_WARNING("DBSRX")
+ << boost::format("DBSRX: Tuning exceeded vco range, "
+ "_max2118_write_regs.osc_band == %d\n")
+ % int(_max2118_write_regs.osc_band);
+ UHD_ASSERT_THROW(_max2118_read_regs.adc != 7); // just to cause a throw
}
- if (_max2118_write_regs.osc_band >= 7) break;
+ if (_max2118_write_regs.osc_band >= 7)
+ break;
_max2118_write_regs.osc_band += 1;
}
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: trying vco %d, vtune adc %d"
- ) % int(_max2118_write_regs.osc_band) % int(_max2118_read_regs.adc) ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX: trying vco %d, vtune adc %d")
+ % int(_max2118_write_regs.osc_band)
+ % int(_max2118_read_regs.adc);
- //update vco selection and check vtune
+ // update vco selection and check vtune
send_reg(0x2, 0x2);
read_reg(0x0, 0x0);
- //allow for setup time before checking condition again
+ // allow for setup time before checking condition again
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX: final vco %d, vtune adc %d"
- ) % int(_max2118_write_regs.osc_band) % int(_max2118_read_regs.adc) ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX: final vco %d, vtune adc %d")
+ % int(_max2118_write_regs.osc_band)
+ % int(_max2118_read_regs.adc);
- //select charge pump bias current
- if (_max2118_read_regs.adc <= 2) _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_100UA;
- else if (_max2118_read_regs.adc >= 5) _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_400UA;
- else _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_200UA;
+ // select charge pump bias current
+ if (_max2118_read_regs.adc <= 2)
+ _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_100UA;
+ else if (_max2118_read_regs.adc >= 5)
+ _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_400UA;
+ else
+ _max2118_write_regs.cp_current = max2118_write_regs_t::CP_CURRENT_I_CP_200UA;
- //update charge pump bias current setting
+ // update charge pump bias current setting
send_reg(0x2, 0x2);
- //compute actual tuned frequency
- _lo_freq = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX) / std::pow(2.0,(1 + _max2118_write_regs.r_divider)) * _max2118_write_regs.get_n_divider();
+ // compute actual tuned frequency
+ _lo_freq = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX)
+ / std::pow(2.0, (1 + _max2118_write_regs.r_divider))
+ * _max2118_write_regs.get_n_divider();
- //debug output of calculated variables
+ // debug output of calculated variables
UHD_LOGGER_TRACE("DBSRX")
<< boost::format("DBSRX tune:\n")
- << boost::format(" VCO=%d, CP=%d, PFD Freq=%fMHz\n") % int(_max2118_write_regs.osc_band) % _max2118_write_regs.cp_current % (pfd_freq/1e6)
- << boost::format(" R=%d, N=%f, scaler=%d, div2=%d\n") % R % N % scaler % int(_max2118_write_regs.div2)
- << boost::format(" Ref Freq=%fMHz\n") % (ref_clock/1e6)
- << boost::format(" Target Freq=%fMHz\n") % (target_freq/1e6)
- << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq/1e6)
- << boost::format(" VCO Freq=%fMHz\n") % (vco_freq/1e6)
- ;
-
- if (update_filter_settings) set_bandwidth(_bandwidth);
+ << boost::format(" VCO=%d, CP=%d, PFD Freq=%fMHz\n")
+ % int(_max2118_write_regs.osc_band) % _max2118_write_regs.cp_current
+ % (pfd_freq / 1e6)
+ << boost::format(" R=%d, N=%f, scaler=%d, div2=%d\n") % R % N % scaler
+ % int(_max2118_write_regs.div2)
+ << boost::format(" Ref Freq=%fMHz\n") % (ref_clock / 1e6)
+ << boost::format(" Target Freq=%fMHz\n") % (target_freq / 1e6)
+ << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq / 1e6)
+ << boost::format(" VCO Freq=%fMHz\n") % (vco_freq / 1e6);
+
+ if (update_filter_settings)
+ set_bandwidth(_bandwidth);
get_locked();
return _lo_freq;
@@ -441,22 +484,22 @@ double dbsrx::set_lo_freq(double target_freq){
* \param gain the requested gain in dB
* \return 5 bit the register value
*/
-static int gain_to_gc2_vga_reg(double &gain){
+static int gain_to_gc2_vga_reg(double& gain)
+{
int reg = 0;
- gain = dbsrx_gain_ranges["GC2"].clip(gain);
+ gain = dbsrx_gain_ranges["GC2"].clip(gain);
// Half dB steps from 0-5dB, 1dB steps from 5-24dB
if (gain < 5) {
- reg = boost::math::iround(31.0 - gain/0.5);
+ reg = boost::math::iround(31.0 - gain / 0.5);
gain = double(boost::math::iround(gain) * 0.5);
} else {
- reg = boost::math::iround(22.0 - (gain - 4.0));
+ reg = boost::math::iround(22.0 - (gain - 4.0));
gain = double(boost::math::iround(gain));
}
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX GC2 Gain: %f dB, reg: %d"
- ) % gain % reg ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX GC2 Gain: %f dB, reg: %d") % gain
+ % reg;
return reg;
}
@@ -467,38 +510,39 @@ static int gain_to_gc2_vga_reg(double &gain){
* \param gain the requested gain in dB
* \return dac voltage value
*/
-static double gain_to_gc1_rfvga_dac(double &gain){
- //clip the input
+static double gain_to_gc1_rfvga_dac(double& gain)
+{
+ // clip the input
gain = dbsrx_gain_ranges["GC1"].clip(gain);
- //voltage level constants
+ // voltage level constants
static const double max_volts = 1.2, min_volts = 2.7;
- static const double slope = (max_volts-min_volts)/dbsrx_gain_ranges["GC1"].stop();
+ static const double slope = (max_volts - min_volts) / dbsrx_gain_ranges["GC1"].stop();
- //calculate the voltage for the aux dac
- double dac_volts = gain*slope + min_volts;
+ // calculate the voltage for the aux dac
+ double dac_volts = gain * slope + min_volts;
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX GC1 Gain: %f dB, dac_volts: %f V"
- ) % gain % dac_volts ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX GC1 Gain: %f dB, dac_volts: %f V")
+ % gain % dac_volts;
- //the actual gain setting
- gain = (dac_volts - min_volts)/slope;
+ // the actual gain setting
+ gain = (dac_volts - min_volts) / slope;
return dac_volts;
}
-double dbsrx::set_gain(double gain, const std::string &name){
+double dbsrx::set_gain(double gain, const std::string& name)
+{
assert_has(dbsrx_gain_ranges.keys(), name, "dbsrx gain name");
- if (name == "GC2"){
+ if (name == "GC2") {
_max2118_write_regs.gc2 = gain_to_gc2_vga_reg(gain);
send_reg(0x5, 0x5);
- }
- else if(name == "GC1"){
- //write the new voltage to the aux dac
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, gain_to_gc1_rfvga_dac(gain));
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else if (name == "GC1") {
+ // write the new voltage to the aux dac
+ this->get_iface()->write_aux_dac(
+ dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, gain_to_gc1_rfvga_dac(gain));
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
_gains[name] = gain;
return gain;
@@ -507,29 +551,36 @@ double dbsrx::set_gain(double gain, const std::string &name){
/***********************************************************************
* Bandwidth Handling
**********************************************************************/
-double dbsrx::set_bandwidth(double bandwidth){
- //convert complex bandpass to lowpass bandwidth
- bandwidth = bandwidth/2.0;
+double dbsrx::set_bandwidth(double bandwidth)
+{
+ // convert complex bandpass to lowpass bandwidth
+ bandwidth = bandwidth / 2.0;
- //clip the input
+ // clip the input
bandwidth = dbsrx_bandwidth_range.clip(bandwidth);
double ref_clock = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
- //NOTE: _max2118_write_regs.m_divider set in set_lo_freq
+ // NOTE: _max2118_write_regs.m_divider set in set_lo_freq
- //compute f_dac setting
- _max2118_write_regs.f_dac = uhd::clip<int>(int((((bandwidth*_max2118_write_regs.m_divider)/ref_clock) - 4)/0.145),0,127);
+ // compute f_dac setting
+ _max2118_write_regs.f_dac = uhd::clip<int>(
+ int((((bandwidth * _max2118_write_regs.m_divider) / ref_clock) - 4) / 0.145),
+ 0,
+ 127);
- //determine actual bandwidth
- _bandwidth = double((ref_clock/(_max2118_write_regs.m_divider))*(4+0.145*_max2118_write_regs.f_dac));
+ // determine actual bandwidth
+ _bandwidth = double((ref_clock / (_max2118_write_regs.m_divider))
+ * (4 + 0.145 * _max2118_write_regs.f_dac));
UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX Filter Bandwidth: %f MHz, m: %d, f_dac: %d\n"
- ) % (_bandwidth/1e6) % int(_max2118_write_regs.m_divider) % int(_max2118_write_regs.f_dac) ;
+ "DBSRX Filter Bandwidth: %f MHz, m: %d, f_dac: %d\n")
+ % (_bandwidth / 1e6)
+ % int(_max2118_write_regs.m_divider)
+ % int(_max2118_write_regs.f_dac);
this->send_reg(0x3, 0x4);
- //convert lowpass back to complex bandpass bandwidth
- return 2.0*_bandwidth;
+ // convert lowpass back to complex bandpass bandwidth
+ return 2.0 * _bandwidth;
}
diff --git a/host/lib/usrp/dboard/db_dbsrx2.cpp b/host/lib/usrp/dboard/db_dbsrx2.cpp
index 2d800467c..19c058ada 100644
--- a/host/lib/usrp/dboard/db_dbsrx2.cpp
+++ b/host/lib/usrp/dboard/db_dbsrx2.cpp
@@ -33,22 +33,21 @@ using namespace boost::assign;
**********************************************************************/
static const freq_range_t dbsrx2_freq_range(0.8e9, 2.3e9);
-//Multiplied by 2.0 for conversion to complex bandpass from lowpass
-static const freq_range_t dbsrx2_bandwidth_range(2.0*4.0e6, 2.0*40.0e6);
+// Multiplied by 2.0 for conversion to complex bandpass from lowpass
+static const freq_range_t dbsrx2_bandwidth_range(2.0 * 4.0e6, 2.0 * 40.0e6);
static const int dbsrx2_ref_divider = 4; // Hitachi HMC426 divider (U7)
static const std::vector<std::string> dbsrx2_antennas = list_of("J3");
-static const uhd::dict<std::string, gain_range_t> dbsrx2_gain_ranges = map_list_of
- ("GC1", gain_range_t(0, 73, 0.05))
- ("BBG", gain_range_t(0, 15, 1))
-;
+static const uhd::dict<std::string, gain_range_t> dbsrx2_gain_ranges =
+ map_list_of("GC1", gain_range_t(0, 73, 0.05))("BBG", gain_range_t(0, 15, 1));
/***********************************************************************
* The DBSRX2 dboard class
**********************************************************************/
-class dbsrx2 : public rx_dboard_base{
+class dbsrx2 : public rx_dboard_base
+{
public:
dbsrx2(ctor_args_t args);
virtual ~dbsrx2(void);
@@ -59,74 +58,81 @@ private:
uhd::dict<std::string, double> _gains;
max2112_write_regs_t _max2112_write_regs;
max2112_read_regs_t _max2112_read_regs;
- uint8_t _max2112_addr(){ //0x60 or 0x61 depending on which side
- return (this->get_iface()->get_special_props().mangle_i2c_addrs)? 0x60 : 0x61;
+ uint8_t _max2112_addr()
+ { // 0x60 or 0x61 depending on which side
+ return (this->get_iface()->get_special_props().mangle_i2c_addrs) ? 0x60 : 0x61;
}
double set_lo_freq(double target_freq);
- double set_gain(double gain, const std::string &name);
+ double set_gain(double gain, const std::string& name);
double set_bandwidth(double bandwidth);
- void send_reg(uint8_t start_reg, uint8_t stop_reg){
+ void send_reg(uint8_t start_reg, uint8_t stop_reg)
+ {
start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0xB));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0xB));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0xB));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t) - 1){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1 ? sizeof(uint32_t) - 1 : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t) - 1) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1
+ ? sizeof(uint32_t) - 1
+ : stop_reg - start_addr + 1;
- //create buffer for register data (+1 for start address)
+ // create buffer for register data (+1 for start address)
byte_vector_t regs_vector(num_bytes + 1);
- //first byte is the address of first register
+ // first byte is the address of first register
regs_vector[0] = start_addr;
- //get the register data
- for(int i=0; i<num_bytes; i++){
- regs_vector[1+i] = _max2112_write_regs.get_reg(start_addr+i);
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX2: send reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % int(start_addr+i) % int(regs_vector[1+i]) % int(start_addr) % num_bytes ;
+ // get the register data
+ for (int i = 0; i < num_bytes; i++) {
+ regs_vector[1 + i] = _max2112_write_regs.get_reg(start_addr + i);
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX2: send reg 0x%02x, value 0x%04x, start_addr "
+ "= 0x%04x, num_bytes %d")
+ % int(start_addr + i) % int(regs_vector[1 + i])
+ % int(start_addr) % num_bytes;
}
- //send the data
- this->get_iface()->write_i2c(
- _max2112_addr(), regs_vector
- );
+ // send the data
+ this->get_iface()->write_i2c(_max2112_addr(), regs_vector);
}
}
- void read_reg(uint8_t start_reg, uint8_t stop_reg){
+ void read_reg(uint8_t start_reg, uint8_t stop_reg)
+ {
static const uint8_t status_addr = 0xC;
- start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0xD));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0xD));
+ start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0xD));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0xD));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t)){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) ? sizeof(uint32_t) : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t)) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t))
+ ? sizeof(uint32_t)
+ : stop_reg - start_addr + 1;
- //create address to start reading register data
+ // create address to start reading register data
byte_vector_t address_vector(1);
address_vector[0] = start_addr;
- //send the address
- this->get_iface()->write_i2c(
- _max2112_addr(), address_vector
- );
+ // send the address
+ this->get_iface()->write_i2c(_max2112_addr(), address_vector);
- //create buffer for register data
+ // create buffer for register data
byte_vector_t regs_vector(num_bytes);
- //read from i2c
- regs_vector = this->get_iface()->read_i2c(
- _max2112_addr(), num_bytes
- );
+ // read from i2c
+ regs_vector = this->get_iface()->read_i2c(_max2112_addr(), num_bytes);
- for(uint8_t i=0; i < num_bytes; i++){
- if (i + start_addr >= status_addr){
+ for (uint8_t i = 0; i < num_bytes; i++) {
+ if (i + start_addr >= status_addr) {
_max2112_read_regs.set_reg(i + start_addr, regs_vector[i]);
}
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX2: read reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % int(start_addr+i) % int(regs_vector[i]) % int(start_addr) % num_bytes ;
+ UHD_LOGGER_TRACE("DBSRX")
+ << boost::format("DBSRX2: read reg 0x%02x, value 0x%04x, start_addr "
+ "= 0x%04x, num_bytes %d")
+ % int(start_addr + i) % int(regs_vector[i]) % int(start_addr)
+ % num_bytes;
}
}
}
@@ -135,15 +141,16 @@ private:
* Get the lock detect status of the LO.
* \return sensor for locked
*/
- sensor_value_t get_locked(void){
+ sensor_value_t get_locked(void)
+ {
read_reg(0xC, 0xD);
- //mask and return lock detect
- bool locked = (_max2112_read_regs.ld & _max2112_read_regs.vasa & _max2112_read_regs.vase) != 0;
+ // mask and return lock detect
+ bool locked =
+ (_max2112_read_regs.ld & _max2112_read_regs.vasa & _max2112_read_regs.vase)
+ != 0;
- UHD_LOGGER_TRACE("DBSRX") << boost::format(
- "DBSRX2 locked: %d"
- ) % locked ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX2 locked: %d") % locked;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
@@ -154,124 +161,135 @@ private:
**********************************************************************/
// FIXME 0x67 is the default i2c address on USRP2
// need to handle which side for USRP1 with different address
-static dboard_base::sptr make_dbsrx2(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_dbsrx2(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new dbsrx2(args));
}
-UHD_STATIC_BLOCK(reg_dbsrx2_dboard){
- //register the factory function for the rx dbid
+UHD_STATIC_BLOCK(reg_dbsrx2_dboard)
+{
+ // register the factory function for the rx dbid
dboard_manager::register_dboard(0x0012, &make_dbsrx2, "DBSRX2");
}
/***********************************************************************
* Structors
**********************************************************************/
-dbsrx2::dbsrx2(ctor_args_t args) : rx_dboard_base(args){
- //send initial register settings
+dbsrx2::dbsrx2(ctor_args_t args) : rx_dboard_base(args)
+{
+ // send initial register settings
send_reg(0x0, 0xB);
- //for (uint8_t addr=0; addr<=12; addr++) this->send_reg(addr, addr);
+ // for (uint8_t addr=0; addr<=12; addr++) this->send_reg(addr, addr);
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name")
- .set("DBSRX");
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_rx_subtree()->create<std::string>("name").set("DBSRX");
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&dbsrx2::get_locked, this));
- for(const std::string &name: dbsrx2_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
+ for (const std::string& name : dbsrx2_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
.set_coercer(std::bind(&dbsrx2::set_gain, this, std::placeholders::_1, name))
.set(dbsrx2_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(dbsrx2_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&dbsrx2::set_lo_freq, this, std::placeholders::_1))
.set(dbsrx2_freq_range.start());
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(dbsrx2_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(dbsrx2_freq_range);
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
.set(dbsrx2_antennas.at(0));
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(dbsrx2_antennas);
- this->get_rx_subtree()->create<std::string>("connection")
- .set("QI");
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
+ this->get_rx_subtree()->create<std::string>("connection").set("QI");
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
double codec_rate = this->get_iface()->get_codec_rate(dboard_iface::UNIT_RX);
- this->get_rx_subtree()->create<double>("bandwidth/value")
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
.set_coercer(std::bind(&dbsrx2::set_bandwidth, this, std::placeholders::_1))
- .set(2.0*(0.8*codec_rate/2.0)); //bandwidth in lowpass, convert to complex bandpass
- //default to anti-alias at different codec_rate
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ .set(2.0
+ * (0.8 * codec_rate
+ / 2.0)); // bandwidth in lowpass, convert to complex bandpass
+ // default to anti-alias at different codec_rate
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(dbsrx2_bandwidth_range);
- //enable only the clocks we need
+ // enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0); // All unused in atr
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x0); // All Inputs
get_locked();
}
-dbsrx2::~dbsrx2(void){
-}
+dbsrx2::~dbsrx2(void) {}
/***********************************************************************
* Tuning
**********************************************************************/
-double dbsrx2::set_lo_freq(double target_freq){
- //target_freq = dbsrx2_freq_range.clip(target_freq);
+double dbsrx2::set_lo_freq(double target_freq)
+{
+ // target_freq = dbsrx2_freq_range.clip(target_freq);
- //variables used in the calculation below
- int scaler = target_freq >= 1125e6 ? 2 : 4;
+ // variables used in the calculation below
+ int scaler = target_freq >= 1125e6 ? 2 : 4;
double ref_freq = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
int R, intdiv, fracdiv, ext_div;
double N;
- //compute tuning variables
+ // compute tuning variables
ext_div = dbsrx2_ref_divider; // 12MHz < ref_freq/ext_divider < 30MHz
- R = 1; //Divide by 1 is the only tested value
+ R = 1; // Divide by 1 is the only tested value
- N = (target_freq*R*ext_div)/(ref_freq); //actual spec range is (19, 251)
- intdiv = int(std::floor(N)); // if (intdiv < 19 or intdiv > 251) continue;
- fracdiv = boost::math::iround((N - intdiv)*double(1 << 20));
+ N = (target_freq * R * ext_div) / (ref_freq); // actual spec range is (19, 251)
+ intdiv = int(std::floor(N)); // if (intdiv < 19 or intdiv > 251) continue;
+ fracdiv = boost::math::iround((N - intdiv) * double(1 << 20));
- //calculate the actual freq from the values above
- N = double(intdiv) + double(fracdiv)/double(1 << 20);
- _lo_freq = (N*ref_freq)/(R*ext_div);
+ // calculate the actual freq from the values above
+ N = double(intdiv) + double(fracdiv) / double(1 << 20);
+ _lo_freq = (N * ref_freq) / (R * ext_div);
- //load new counters into registers
+ // load new counters into registers
_max2112_write_regs.set_n_divider(intdiv);
_max2112_write_regs.set_f_divider(fracdiv);
_max2112_write_regs.r_divider = R;
- _max2112_write_regs.d24 = scaler == 4 ? max2112_write_regs_t::D24_DIV4 : max2112_write_regs_t::D24_DIV2;
+ _max2112_write_regs.d24 = scaler == 4 ? max2112_write_regs_t::D24_DIV4
+ : max2112_write_regs_t::D24_DIV2;
- //debug output of calculated variables
+ // debug output of calculated variables
UHD_LOGGER_TRACE("DBSRX")
<< boost::format("DBSRX2 tune:\n")
- << boost::format(" R=%d, N=%f, scaler=%d, ext_div=%d\n") % R % N % scaler % ext_div
- << boost::format(" int=%d, frac=%d, d24=%d\n") % intdiv % fracdiv % int(_max2112_write_regs.d24)
- << boost::format(" Ref Freq=%fMHz\n") % (ref_freq/1e6)
- << boost::format(" Target Freq=%fMHz\n") % (target_freq/1e6)
- << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq/1e6)
- ;
-
- //send the registers 0x0 through 0x7
- //writing register 0x4 (F divider LSB) starts the VCO auto seletion so it must be written last
+ << boost::format(" R=%d, N=%f, scaler=%d, ext_div=%d\n") % R % N % scaler
+ % ext_div
+ << boost::format(" int=%d, frac=%d, d24=%d\n") % intdiv % fracdiv
+ % int(_max2112_write_regs.d24)
+ << boost::format(" Ref Freq=%fMHz\n") % (ref_freq / 1e6)
+ << boost::format(" Target Freq=%fMHz\n") % (target_freq / 1e6)
+ << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq / 1e6);
+
+ // send the registers 0x0 through 0x7
+ // writing register 0x4 (F divider LSB) starts the VCO auto seletion so it must be
+ // written last
send_reg(0x5, 0x7);
send_reg(0x0, 0x4);
- //FIXME: probably unnecessary to call get_locked here
- //get_locked();
+ // FIXME: probably unnecessary to call get_locked here
+ // get_locked();
return _lo_freq;
}
@@ -285,15 +303,14 @@ double dbsrx2::set_lo_freq(double target_freq){
* \param gain the requested gain in dB
* \return 4 bit the register value
*/
-static int gain_to_bbg_vga_reg(double &gain){
+static int gain_to_bbg_vga_reg(double& gain)
+{
int reg = boost::math::iround(dbsrx2_gain_ranges["BBG"].clip(gain));
gain = double(reg);
- UHD_LOGGER_TRACE("DBSRX")
- << boost::format("DBSRX2 BBG Gain:\n")
- << boost::format(" %f dB, bbg: %d") % gain % reg
- ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX2 BBG Gain:\n")
+ << boost::format(" %f dB, bbg: %d") % gain % reg;
return reg;
}
@@ -304,39 +321,41 @@ static int gain_to_bbg_vga_reg(double &gain){
* \param gain the requested gain in dB
* \return dac voltage value
*/
-static double gain_to_gc1_rfvga_dac(double &gain){
- //clip the input
+static double gain_to_gc1_rfvga_dac(double& gain)
+{
+ // clip the input
gain = dbsrx2_gain_ranges["GC1"].clip(gain);
- //voltage level constants
+ // voltage level constants
static const double max_volts = 0.5, min_volts = 2.7;
- static const double slope = (max_volts-min_volts)/dbsrx2_gain_ranges["GC1"].stop();
+ static const double slope =
+ (max_volts - min_volts) / dbsrx2_gain_ranges["GC1"].stop();
- //calculate the voltage for the aux dac
- double dac_volts = gain*slope + min_volts;
+ // calculate the voltage for the aux dac
+ double dac_volts = gain * slope + min_volts;
- UHD_LOGGER_TRACE("DBSRX")
- << boost::format("DBSRX2 GC1 Gain:\n")
- << boost::format(" %f dB, dac_volts: %f V") % gain % dac_volts
- ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX2 GC1 Gain:\n")
+ << boost::format(" %f dB, dac_volts: %f V") % gain
+ % dac_volts;
- //the actual gain setting
- gain = (dac_volts - min_volts)/slope;
+ // the actual gain setting
+ gain = (dac_volts - min_volts) / slope;
return dac_volts;
}
-double dbsrx2::set_gain(double gain, const std::string &name){
+double dbsrx2::set_gain(double gain, const std::string& name)
+{
assert_has(dbsrx2_gain_ranges.keys(), name, "dbsrx2 gain name");
- if (name == "BBG"){
+ if (name == "BBG") {
_max2112_write_regs.bbg = gain_to_bbg_vga_reg(gain);
send_reg(0x9, 0x9);
- }
- else if(name == "GC1"){
- //write the new voltage to the aux dac
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, gain_to_gc1_rfvga_dac(gain));
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else if (name == "GC1") {
+ // write the new voltage to the aux dac
+ this->get_iface()->write_aux_dac(
+ dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, gain_to_gc1_rfvga_dac(gain));
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
_gains[name] = gain;
return gain;
@@ -345,23 +364,23 @@ double dbsrx2::set_gain(double gain, const std::string &name){
/***********************************************************************
* Bandwidth Handling
**********************************************************************/
-double dbsrx2::set_bandwidth(double bandwidth){
- //clip the input
+double dbsrx2::set_bandwidth(double bandwidth)
+{
+ // clip the input
bandwidth = dbsrx2_bandwidth_range.clip(bandwidth);
- //convert complex bandpass to lowpass bandwidth
- bandwidth = bandwidth/2.0;
+ // convert complex bandpass to lowpass bandwidth
+ bandwidth = bandwidth / 2.0;
- _max2112_write_regs.lp = int((bandwidth/1e6 - 4)/0.29 + 12);
- _bandwidth = double(4 + (_max2112_write_regs.lp - 12) * 0.29)*1e6;
+ _max2112_write_regs.lp = int((bandwidth / 1e6 - 4) / 0.29 + 12);
+ _bandwidth = double(4 + (_max2112_write_regs.lp - 12) * 0.29) * 1e6;
- UHD_LOGGER_TRACE("DBSRX")
- << boost::format("DBSRX2 Bandwidth:\n")
- << boost::format(" %f MHz, lp: %f V") % (_bandwidth/1e6) % int(_max2112_write_regs.lp)
- ;
+ UHD_LOGGER_TRACE("DBSRX") << boost::format("DBSRX2 Bandwidth:\n")
+ << boost::format(" %f MHz, lp: %f V")
+ % (_bandwidth / 1e6) % int(_max2112_write_regs.lp);
this->send_reg(0x8, 0x8);
- //convert lowpass back to complex bandpass bandwidth
- return 2.0*_bandwidth;
+ // convert lowpass back to complex bandpass bandwidth
+ return 2.0 * _bandwidth;
}
diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp
index 1bf4a7228..05f5c9a0e 100644
--- a/host/lib/usrp/dboard/db_rfx.cpp
+++ b/host/lib/usrp/dboard/db_rfx.cpp
@@ -6,21 +6,21 @@
//
// IO Pin functions
-#define POWER_IO (1 << 7) // Low enables power supply
-#define ANTSW_IO (1 << 6) // On TX DB, 0 = TX, 1 = RX, on RX DB 0 = main ant, 1 = RX2
-#define MIXER_IO (1 << 5) // Enable appropriate mixer
-#define LOCKDET_MASK (1 << 2) // Input pin
+#define POWER_IO (1 << 7) // Low enables power supply
+#define ANTSW_IO (1 << 6) // On TX DB, 0 = TX, 1 = RX, on RX DB 0 = main ant, 1 = RX2
+#define MIXER_IO (1 << 5) // Enable appropriate mixer
+#define LOCKDET_MASK (1 << 2) // Input pin
// Mixer constants
-#define MIXER_ENB MIXER_IO
-#define MIXER_DIS 0
+#define MIXER_ENB MIXER_IO
+#define MIXER_DIS 0
// Antenna constants
-#define ANT_TX 0 //the tx line is transmitting
-#define ANT_RX ANTSW_IO //the tx line is receiving
-#define ANT_TXRX 0 //the rx line is on txrx
-#define ANT_RX2 ANTSW_IO //the rx line in on rx2
-#define ANT_XX 0 //dont care how the antenna is set
+#define ANT_TX 0 // the tx line is transmitting
+#define ANT_RX ANTSW_IO // the tx line is receiving
+#define ANT_TXRX 0 // the rx line is on txrx
+#define ANT_RX2 ANTSW_IO // the rx line in on rx2
+#define ANT_XX 0 // dont care how the antenna is set
#include "adf4360_regs.hpp"
#include <uhd/types/dict.hpp>
@@ -49,37 +49,33 @@ static const std::vector<std::string> rfx_tx_antennas = list_of("TX/RX")("CAL");
static const std::vector<std::string> rfx_rx_antennas = list_of("TX/RX")("RX2")("CAL");
-static const uhd::dict<std::string, gain_range_t> rfx_rx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 70, 0.022))
-;
+static const uhd::dict<std::string, gain_range_t> rfx_rx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 70, 0.022));
-static const uhd::dict<std::string, gain_range_t> rfx400_rx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 45, 0.022))
-;
+static const uhd::dict<std::string, gain_range_t> rfx400_rx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 45, 0.022));
/***********************************************************************
* The RFX series of dboards
**********************************************************************/
-class rfx_xcvr : public xcvr_dboard_base{
+class rfx_xcvr : public xcvr_dboard_base
+{
public:
rfx_xcvr(
- ctor_args_t args,
- const freq_range_t &freq_range,
- bool rx_div2, bool tx_div2
- );
+ ctor_args_t args, const freq_range_t& freq_range, bool rx_div2, bool tx_div2);
virtual ~rfx_xcvr(void);
private:
const freq_range_t _freq_range;
const uhd::dict<std::string, gain_range_t> _rx_gain_ranges;
const uhd::dict<dboard_iface::unit_t, bool> _div2;
- std::string _rx_ant;
+ std::string _rx_ant;
uhd::dict<std::string, double> _rx_gains;
uint16_t _power_up;
- void set_rx_ant(const std::string &ant);
- void set_tx_ant(const std::string &ant);
- double set_rx_gain(double gain, const std::string &name);
+ void set_rx_ant(const std::string& ant);
+ void set_tx_ant(const std::string& ant);
+ double set_rx_gain(double gain, const std::string& name);
/*!
* Set the LO frequency for the particular dboard unit.
@@ -94,7 +90,8 @@ private:
* \param unit which unit rx or tx
* \return sensor for locked
*/
- sensor_value_t get_locked(dboard_iface::unit_t unit){
+ sensor_value_t get_locked(dboard_iface::unit_t unit)
+ {
const bool locked = (this->get_iface()->read_gpio(unit) & LOCKDET_MASK) != 0;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
@@ -108,33 +105,44 @@ private:
/***********************************************************************
* Register the RFX dboards (min freq, max freq, rx div2, tx div2)
**********************************************************************/
-static dboard_base::sptr make_rfx_flex400(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_rfx_flex400(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(400e6, 500e6), true, true));
}
-static dboard_base::sptr make_rfx_flex900(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_rfx_flex900(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(750e6, 1050e6), true, true));
}
-static dboard_base::sptr make_rfx_flex1800(dboard_base::ctor_args_t args){
- return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(1500e6, 2100e6), false, false));
+static dboard_base::sptr make_rfx_flex1800(dboard_base::ctor_args_t args)
+{
+ return dboard_base::sptr(
+ new rfx_xcvr(args, freq_range_t(1500e6, 2100e6), false, false));
}
-static dboard_base::sptr make_rfx_flex1200(dboard_base::ctor_args_t args){
- return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(1150e6, 1450e6), true, true));
+static dboard_base::sptr make_rfx_flex1200(dboard_base::ctor_args_t args)
+{
+ return dboard_base::sptr(
+ new rfx_xcvr(args, freq_range_t(1150e6, 1450e6), true, true));
}
-static dboard_base::sptr make_rfx_flex2200(dboard_base::ctor_args_t args){
- return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(2000e6, 2400e6), false, false));
+static dboard_base::sptr make_rfx_flex2200(dboard_base::ctor_args_t args)
+{
+ return dboard_base::sptr(
+ new rfx_xcvr(args, freq_range_t(2000e6, 2400e6), false, false));
}
-static dboard_base::sptr make_rfx_flex2400(dboard_base::ctor_args_t args){
- return dboard_base::sptr(new rfx_xcvr(args, freq_range_t(2300e6, 2900e6), false, false));
+static dboard_base::sptr make_rfx_flex2400(dboard_base::ctor_args_t args)
+{
+ return dboard_base::sptr(
+ new rfx_xcvr(args, freq_range_t(2300e6, 2900e6), false, false));
}
-UHD_STATIC_BLOCK(reg_rfx_dboards){
- dboard_manager::register_dboard(0x0024, 0x0028, &make_rfx_flex400, "RFX400");
- dboard_manager::register_dboard(0x0025, 0x0029, &make_rfx_flex900, "RFX900");
+UHD_STATIC_BLOCK(reg_rfx_dboards)
+{
+ dboard_manager::register_dboard(0x0024, 0x0028, &make_rfx_flex400, "RFX400");
+ dboard_manager::register_dboard(0x0025, 0x0029, &make_rfx_flex900, "RFX900");
dboard_manager::register_dboard(0x0034, 0x0035, &make_rfx_flex1800, "RFX1800");
dboard_manager::register_dboard(0x0026, 0x002a, &make_rfx_flex1200, "RFX1200");
dboard_manager::register_dboard(0x002c, 0x002d, &make_rfx_flex2200, "RFX2200");
@@ -145,217 +153,274 @@ UHD_STATIC_BLOCK(reg_rfx_dboards){
* Structors
**********************************************************************/
rfx_xcvr::rfx_xcvr(
- ctor_args_t args,
- const freq_range_t &freq_range,
- bool rx_div2, bool tx_div2
-):
- xcvr_dboard_base(args),
- _freq_range(freq_range),
- _rx_gain_ranges((get_rx_id() == 0x0024)?
- rfx400_rx_gain_ranges : rfx_rx_gain_ranges
- ),
- _div2(map_list_of
- (dboard_iface::UNIT_RX, rx_div2)
- (dboard_iface::UNIT_TX, tx_div2)
- ),
- _power_up((get_rx_id() == 0x0024 && get_tx_id() == 0x0028) ? POWER_IO : 0)
+ ctor_args_t args, const freq_range_t& freq_range, bool rx_div2, bool tx_div2)
+ : xcvr_dboard_base(args)
+ , _freq_range(freq_range)
+ , _rx_gain_ranges(
+ (get_rx_id() == 0x0024) ? rfx400_rx_gain_ranges : rfx_rx_gain_ranges)
+ , _div2(map_list_of(dboard_iface::UNIT_RX, rx_div2)(dboard_iface::UNIT_TX, tx_div2))
+ , _power_up((get_rx_id() == 0x0024 && get_tx_id() == 0x0028) ? POWER_IO : 0)
{
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
- if(get_rx_id() == 0x0024) this->get_rx_subtree()->create<std::string>("name").set("RFX400 RX");
- else if(get_rx_id() == 0x0025) this->get_rx_subtree()->create<std::string>("name").set("RFX900 RX");
- else if(get_rx_id() == 0x0034) this->get_rx_subtree()->create<std::string>("name").set("RFX1800 RX");
- else if(get_rx_id() == 0x0026) this->get_rx_subtree()->create<std::string>("name").set("RFX1200 RX");
- else if(get_rx_id() == 0x002c) this->get_rx_subtree()->create<std::string>("name").set("RFX2200 RX");
- else if(get_rx_id() == 0x0027) this->get_rx_subtree()->create<std::string>("name").set("RFX2400 RX");
- else this->get_rx_subtree()->create<std::string>("name").set("RFX RX");
-
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ if (get_rx_id() == 0x0024)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX400 RX");
+ else if (get_rx_id() == 0x0025)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX900 RX");
+ else if (get_rx_id() == 0x0034)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX1800 RX");
+ else if (get_rx_id() == 0x0026)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX1200 RX");
+ else if (get_rx_id() == 0x002c)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX2200 RX");
+ else if (get_rx_id() == 0x0027)
+ this->get_rx_subtree()->create<std::string>("name").set("RFX2400 RX");
+ else
+ this->get_rx_subtree()->create<std::string>("name").set("RFX RX");
+
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&rfx_xcvr::get_locked, this, dboard_iface::UNIT_RX));
- for(const std::string &name: _rx_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&rfx_xcvr::set_rx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : _rx_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&rfx_xcvr::set_rx_gain, this, std::placeholders::_1, name))
.set(_rx_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(_rx_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&rfx_xcvr::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
- .set((_freq_range.start() + _freq_range.stop())/2.0);
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(
+ &rfx_xcvr::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
+ .set((_freq_range.start() + _freq_range.stop()) / 2.0);
this->get_rx_subtree()->create<meta_range_t>("freq/range").set(_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&rfx_xcvr::set_rx_ant, this, std::placeholders::_1))
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&rfx_xcvr::set_rx_ant, this, std::placeholders::_1))
.set("RX2");
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(rfx_rx_antennas);
this->get_rx_subtree()->create<std::string>("connection").set("QI");
- this->get_rx_subtree()->create<bool>("enabled").set(true); //always enabled
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value").set(2*20.0e6); //20MHz low-pass, we want complex double-sided
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*20.0e6, 2*20.0e6));
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
+ .set(2 * 20.0e6); // 20MHz low-pass, we want complex double-sided
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * 20.0e6, 2 * 20.0e6));
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
- if(get_tx_id() == 0x0028) this->get_tx_subtree()->create<std::string>("name").set("RFX400 TX");
- else if(get_tx_id() == 0x0029) this->get_tx_subtree()->create<std::string>("name").set("RFX900 TX");
- else if(get_tx_id() == 0x0035) this->get_tx_subtree()->create<std::string>("name").set("RFX1800 TX");
- else if(get_tx_id() == 0x002a) this->get_tx_subtree()->create<std::string>("name").set("RFX1200 TX");
- else if(get_tx_id() == 0x002d) this->get_tx_subtree()->create<std::string>("name").set("RFX2200 TX");
- else if(get_tx_id() == 0x002b) this->get_tx_subtree()->create<std::string>("name").set("RFX2400 TX");
- else this->get_tx_subtree()->create<std::string>("name").set("RFX TX");
-
- this->get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ if (get_tx_id() == 0x0028)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX400 TX");
+ else if (get_tx_id() == 0x0029)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX900 TX");
+ else if (get_tx_id() == 0x0035)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX1800 TX");
+ else if (get_tx_id() == 0x002a)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX1200 TX");
+ else if (get_tx_id() == 0x002d)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX2200 TX");
+ else if (get_tx_id() == 0x002b)
+ this->get_tx_subtree()->create<std::string>("name").set("RFX2400 TX");
+ else
+ this->get_tx_subtree()->create<std::string>("name").set("RFX TX");
+
+ this->get_tx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&rfx_xcvr::get_locked, this, dboard_iface::UNIT_TX));
- this->get_tx_subtree()->create<int>("gains"); //phony property so this dir exists
- this->get_tx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&rfx_xcvr::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
- .set((_freq_range.start() + _freq_range.stop())/2.0);
+ this->get_tx_subtree()->create<int>("gains"); // phony property so this dir exists
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(
+ &rfx_xcvr::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
+ .set((_freq_range.start() + _freq_range.stop()) / 2.0);
this->get_tx_subtree()->create<meta_range_t>("freq/range").set(_freq_range);
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&rfx_xcvr::set_tx_ant, this, std::placeholders::_1)).set(rfx_tx_antennas.at(0));
- this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_tx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&rfx_xcvr::set_tx_ant, this, std::placeholders::_1))
+ .set(rfx_tx_antennas.at(0));
+ this->get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(rfx_tx_antennas);
this->get_tx_subtree()->create<std::string>("connection").set("IQ");
- this->get_tx_subtree()->create<bool>("enabled").set(true); //always enabled
+ this->get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
this->get_tx_subtree()->create<bool>("use_lo_offset").set(true);
- this->get_tx_subtree()->create<double>("bandwidth/value").set(2*20.0e6); //20MHz low-pass, we want complex double-sided
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*20.0e6, 2*20.0e6));
-
- //enable the clocks that we need
+ this->get_tx_subtree()
+ ->create<double>("bandwidth/value")
+ .set(2 * 20.0e6); // 20MHz low-pass, we want complex double-sided
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * 20.0e6, 2 * 20.0e6));
+
+ // enable the clocks that we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
uint16_t output_enables = POWER_IO | ANTSW_IO | MIXER_IO;
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, output_enables);
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, output_enables);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, output_enables);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, output_enables);
- //setup the tx atr (this does not change with antenna)
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, _power_up | ANT_XX | MIXER_DIS);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, _power_up | ANT_RX | MIXER_DIS);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_TX | MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_TX | MIXER_ENB);
-
- //setup the rx atr (this does not change with antenna)
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, _power_up | ANT_XX | MIXER_DIS);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_XX | MIXER_DIS);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_RX2| MIXER_ENB);
+ // setup the tx atr (this does not change with antenna)
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, _power_up | ANT_XX | MIXER_DIS);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, _power_up | ANT_RX | MIXER_DIS);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_TX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_TX | MIXER_ENB);
+
+ // setup the rx atr (this does not change with antenna)
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, _power_up | ANT_XX | MIXER_DIS);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_XX | MIXER_DIS);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_RX2 | MIXER_ENB);
}
-rfx_xcvr::~rfx_xcvr(void){
+rfx_xcvr::~rfx_xcvr(void)
+{
/* NOP */
}
/***********************************************************************
* Antenna Handling
**********************************************************************/
-void rfx_xcvr::set_rx_ant(const std::string &ant){
- //validate input
+void rfx_xcvr::set_rx_ant(const std::string& ant)
+{
+ // validate input
assert_has(rfx_rx_antennas, ant, "rfx rx antenna name");
- //set the rx atr regs that change with antenna setting
+ // set the rx atr regs that change with antenna setting
if (ant == "CAL") {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_TXRX | MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_TXRX | MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, _power_up | MIXER_ENB | ANT_TXRX );
- }
- else {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_XX | MIXER_DIS);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_RX2| MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, _power_up | MIXER_ENB |
- ((ant == "TX/RX")? ANT_TXRX : ANT_RX2));
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ _power_up | ANT_TXRX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_TXRX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ _power_up | MIXER_ENB | ANT_TXRX);
+ } else {
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ _power_up | ANT_XX | MIXER_DIS);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_RX2 | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ _power_up | MIXER_ENB | ((ant == "TX/RX") ? ANT_TXRX : ANT_RX2));
}
- //shadow the setting
+ // shadow the setting
_rx_ant = ant;
}
-void rfx_xcvr::set_tx_ant(const std::string &ant){
+void rfx_xcvr::set_tx_ant(const std::string& ant)
+{
assert_has(rfx_tx_antennas, ant, "rfx tx antenna name");
- //set the tx atr regs that change with antenna setting
+ // set the tx atr regs that change with antenna setting
if (ant == "CAL") {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_RX | MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_RX | MIXER_ENB);
- }
- else {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _power_up | ANT_TX | MIXER_ENB);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, _power_up | ANT_TX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ _power_up | ANT_RX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_RX | MIXER_ENB);
+ } else {
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ _power_up | ANT_TX | MIXER_ENB);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _power_up | ANT_TX | MIXER_ENB);
}
}
/***********************************************************************
* Gain Handling
**********************************************************************/
-static double rx_pga0_gain_to_dac_volts(double &gain, double range){
- //voltage level constants (negative slope)
+static double rx_pga0_gain_to_dac_volts(double& gain, double range)
+{
+ // voltage level constants (negative slope)
static const double max_volts = .2, min_volts = 1.2;
- static const double slope = (max_volts-min_volts)/(range);
+ static const double slope = (max_volts - min_volts) / (range);
- //calculate the voltage for the aux dac
- double dac_volts = uhd::clip<double>(gain*slope + min_volts, max_volts, min_volts);
+ // calculate the voltage for the aux dac
+ double dac_volts = uhd::clip<double>(gain * slope + min_volts, max_volts, min_volts);
- //the actual gain setting
- gain = (dac_volts - min_volts)/slope;
+ // the actual gain setting
+ gain = (dac_volts - min_volts) / slope;
return dac_volts;
}
-double rfx_xcvr::set_rx_gain(double gain, const std::string &name){
+double rfx_xcvr::set_rx_gain(double gain, const std::string& name)
+{
assert_has(_rx_gain_ranges.keys(), name, "rfx rx gain name");
- if(name == "PGA0"){
- double dac_volts = rx_pga0_gain_to_dac_volts(gain,
- (_rx_gain_ranges["PGA0"].stop() - _rx_gain_ranges["PGA0"].start()));
+ if (name == "PGA0") {
+ double dac_volts = rx_pga0_gain_to_dac_volts(
+ gain, (_rx_gain_ranges["PGA0"].stop() - _rx_gain_ranges["PGA0"].start()));
- //write the new voltage to the aux dac
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, dac_volts);
+ // write the new voltage to the aux dac
+ this->get_iface()->write_aux_dac(
+ dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, dac_volts);
return gain;
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
}
/***********************************************************************
* Tuning
**********************************************************************/
-double rfx_xcvr::set_lo_freq(
- dboard_iface::unit_t unit,
- double target_freq
-){
- UHD_LOGGER_TRACE("RFX") << boost::format(
- "RFX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+double rfx_xcvr::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ UHD_LOGGER_TRACE("RFX") << boost::format("RFX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
- //clip the input
+ // clip the input
target_freq = _freq_range.clip(target_freq);
- if (_div2[unit]) target_freq *= 2;
+ if (_div2[unit])
+ target_freq *= 2;
- //rfx400 rx is a special case with div2 in mixer, so adf4360 must output fundamental
+ // rfx400 rx is a special case with div2 in mixer, so adf4360 must output fundamental
bool is_rx_rfx400 = ((get_rx_id() == 0x0024) && unit != dboard_iface::UNIT_TX);
- //map prescalers to the register enums
- static const uhd::dict<int, adf4360_regs_t::prescaler_value_t> prescaler_to_enum = map_list_of
- (8, adf4360_regs_t::PRESCALER_VALUE_8_9)
- (16, adf4360_regs_t::PRESCALER_VALUE_16_17)
- (32, adf4360_regs_t::PRESCALER_VALUE_32_33)
- ;
+ // map prescalers to the register enums
+ static const uhd::dict<int, adf4360_regs_t::prescaler_value_t> prescaler_to_enum =
+ map_list_of(8, adf4360_regs_t::PRESCALER_VALUE_8_9)(
+ 16, adf4360_regs_t::PRESCALER_VALUE_16_17)(
+ 32, adf4360_regs_t::PRESCALER_VALUE_32_33);
- //map band select clock dividers to enums
- static const uhd::dict<int, adf4360_regs_t::band_select_clock_div_t> bandsel_to_enum = map_list_of
- (1, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_1)
- (2, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_2)
- (4, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_4)
- (8, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_8)
- ;
+ // map band select clock dividers to enums
+ static const uhd::dict<int, adf4360_regs_t::band_select_clock_div_t> bandsel_to_enum =
+ map_list_of(1, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_1)(
+ 2, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_2)(
+ 4, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_4)(
+ 8, adf4360_regs_t::BAND_SELECT_CLOCK_DIV_8);
- double actual_freq=0, ref_freq = this->get_iface()->get_clock_rate(unit);
- int R=0, BS=0, P=0, B=0, A=0;
+ double actual_freq = 0, ref_freq = this->get_iface()->get_clock_rate(unit);
+ int R = 0, BS = 0, P = 0, B = 0, A = 0;
/*
* The goal here to to loop through possible R dividers,
@@ -393,10 +458,11 @@ double rfx_xcvr::set_lo_freq(
done_loop:
UHD_LOGGER_TRACE("RFX") << boost::format(
- "RFX tune: R=%d, BS=%d, P=%d, B=%d, A=%d, DIV2=%d"
- ) % R % BS % P % B % A % int(_div2[unit] && (!is_rx_rfx400)) ;
+ "RFX tune: R=%d, BS=%d, P=%d, B=%d, A=%d, DIV2=%d")
+ % R % BS % P % B % A
+ % int(_div2[unit] && (!is_rx_rfx400));
- //load the register values
+ // load the register values
adf4360_regs_t regs;
regs.core_power_level = adf4360_regs_t::CORE_POWER_LEVEL_10MA;
regs.counter_operation = adf4360_regs_t::COUNTER_OPERATION_NORMAL;
@@ -413,33 +479,31 @@ done_loop:
regs.a_counter = A;
regs.b_counter = B;
regs.cp_gain_1 = adf4360_regs_t::CP_GAIN_1_SET1;
- regs.divide_by_2_output = (_div2[unit] && (!is_rx_rfx400)) ? // Special case RFX400 RX Mixer divides by two
- adf4360_regs_t::DIVIDE_BY_2_OUTPUT_DIV2 :
- adf4360_regs_t::DIVIDE_BY_2_OUTPUT_FUND ;
- regs.divide_by_2_prescaler = adf4360_regs_t::DIVIDE_BY_2_PRESCALER_FUND;
- regs.r_counter = R;
- regs.ablpw = adf4360_regs_t::ABLPW_3_0NS;
- regs.lock_detect_precision = adf4360_regs_t::LOCK_DETECT_PRECISION_5CYCLES;
- regs.test_mode_bit = 0;
- regs.band_select_clock_div = bandsel_to_enum[BS];
-
- //write the registers
- std::vector<adf4360_regs_t::addr_t> addrs = list_of //correct power-up sequence to write registers (R, C, N)
- (adf4360_regs_t::ADDR_RCOUNTER)
- (adf4360_regs_t::ADDR_CONTROL)
- (adf4360_regs_t::ADDR_NCOUNTER)
- ;
- for(adf4360_regs_t::addr_t addr: addrs){
+ regs.divide_by_2_output = (_div2[unit] && (!is_rx_rfx400))
+ ? // Special case RFX400 RX Mixer divides by two
+ adf4360_regs_t::DIVIDE_BY_2_OUTPUT_DIV2
+ : adf4360_regs_t::DIVIDE_BY_2_OUTPUT_FUND;
+ regs.divide_by_2_prescaler = adf4360_regs_t::DIVIDE_BY_2_PRESCALER_FUND;
+ regs.r_counter = R;
+ regs.ablpw = adf4360_regs_t::ABLPW_3_0NS;
+ regs.lock_detect_precision = adf4360_regs_t::LOCK_DETECT_PRECISION_5CYCLES;
+ regs.test_mode_bit = 0;
+ regs.band_select_clock_div = bandsel_to_enum[BS];
+
+ // write the registers
+ std::vector<adf4360_regs_t::addr_t> addrs =
+ list_of // correct power-up sequence to write registers (R, C, N)
+ (adf4360_regs_t::ADDR_RCOUNTER)(adf4360_regs_t::ADDR_CONTROL)(
+ adf4360_regs_t::ADDR_NCOUNTER);
+ for (adf4360_regs_t::addr_t addr : addrs) {
this->get_iface()->write_spi(
- unit, spi_config_t::EDGE_RISE,
- regs.get_reg(addr), 24
- );
+ unit, spi_config_t::EDGE_RISE, regs.get_reg(addr), 24);
}
- //return the actual frequency
- if (_div2[unit]) actual_freq /= 2;
- UHD_LOGGER_TRACE("RFX") << boost::format(
- "RFX tune: actual frequency %f MHz"
- ) % (actual_freq/1e6) ;
+ // return the actual frequency
+ if (_div2[unit])
+ actual_freq /= 2;
+ UHD_LOGGER_TRACE("RFX") << boost::format("RFX tune: actual frequency %f MHz")
+ % (actual_freq / 1e6);
return actual_freq;
}
diff --git a/host/lib/usrp/dboard/db_sbx_common.cpp b/host/lib/usrp/dboard/db_sbx_common.cpp
index dc49a97aa..f79b70f53 100644
--- a/host/lib/usrp/dboard/db_sbx_common.cpp
+++ b/host/lib/usrp/dboard/db_sbx_common.cpp
@@ -16,11 +16,13 @@ using namespace boost::assign;
/***********************************************************************
* Register the SBX dboard (min freq, max freq, rx div2, tx div2)
**********************************************************************/
-static dboard_base::sptr make_sbx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_sbx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new sbx_xcvr(args));
}
-UHD_STATIC_BLOCK(reg_sbx_dboards){
+UHD_STATIC_BLOCK(reg_sbx_dboards)
+{
dboard_manager::register_dboard(0x0054, 0x0055, &make_sbx, "SBX");
dboard_manager::register_dboard(0x0065, 0x0064, &make_sbx, "SBX v4");
dboard_manager::register_dboard(0x0067, 0x0066, &make_sbx, "CBX");
@@ -33,71 +35,75 @@ UHD_STATIC_BLOCK(reg_sbx_dboards){
/***********************************************************************
* Gain Handling
**********************************************************************/
-static int rx_pga0_gain_to_iobits(double &gain){
- //clip the input
+static int rx_pga0_gain_to_iobits(double& gain)
+{
+ // clip the input
gain = sbx_rx_gain_ranges["PGA0"].clip(gain);
- //convert to attenuation and update iobits for atr
+ // convert to attenuation and update iobits for atr
double attn = sbx_rx_gain_ranges["PGA0"].stop() - gain;
- //calculate the RX attenuation
- int attn_code = int(floor(attn*2));
- int iobits = ((~attn_code) << RX_ATTN_SHIFT) & RX_ATTN_MASK;
+ // calculate the RX attenuation
+ int attn_code = int(floor(attn * 2));
+ int iobits = ((~attn_code) << RX_ATTN_SHIFT) & RX_ATTN_MASK;
- UHD_LOGGER_TRACE("SBX") << boost::format(
- "SBX RX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x"
- ) % attn % attn_code % (iobits & RX_ATTN_MASK) % RX_ATTN_MASK ;
+ UHD_LOGGER_TRACE("SBX")
+ << boost::format("SBX RX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x")
+ % attn % attn_code % (iobits & RX_ATTN_MASK) % RX_ATTN_MASK;
- //the actual gain setting
- gain = sbx_rx_gain_ranges["PGA0"].stop() - double(attn_code)/2;
+ // the actual gain setting
+ gain = sbx_rx_gain_ranges["PGA0"].stop() - double(attn_code) / 2;
return iobits;
}
-static int tx_pga0_gain_to_iobits(double &gain){
- //clip the input
+static int tx_pga0_gain_to_iobits(double& gain)
+{
+ // clip the input
gain = sbx_tx_gain_ranges["PGA0"].clip(gain);
- //convert to attenuation and update iobits for atr
+ // convert to attenuation and update iobits for atr
double attn = sbx_tx_gain_ranges["PGA0"].stop() - gain;
- //calculate the TX attenuation
- int attn_code = int(floor(attn*2));
- int iobits = ((~attn_code) << TX_ATTN_SHIFT) & TX_ATTN_MASK;
+ // calculate the TX attenuation
+ int attn_code = int(floor(attn * 2));
+ int iobits = ((~attn_code) << TX_ATTN_SHIFT) & TX_ATTN_MASK;
- UHD_LOGGER_TRACE("SBX") << boost::format(
- "SBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x"
- ) % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK ;
+ UHD_LOGGER_TRACE("SBX")
+ << boost::format("SBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x")
+ % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK;
- //the actual gain setting
- gain = sbx_tx_gain_ranges["PGA0"].stop() - double(attn_code)/2;
+ // the actual gain setting
+ gain = sbx_tx_gain_ranges["PGA0"].stop() - double(attn_code) / 2;
return iobits;
}
-double sbx_xcvr::set_tx_gain(double gain, const std::string &name){
+double sbx_xcvr::set_tx_gain(double gain, const std::string& name)
+{
assert_has(sbx_tx_gain_ranges.keys(), name, "sbx tx gain name");
- if(name == "PGA0"){
+ if (name == "PGA0") {
tx_pga0_gain_to_iobits(gain);
_tx_gains[name] = gain;
- //write the new gain to atr regs
+ // write the new gain to atr regs
update_atr();
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
return _tx_gains[name];
}
-double sbx_xcvr::set_rx_gain(double gain, const std::string &name){
+double sbx_xcvr::set_rx_gain(double gain, const std::string& name)
+{
assert_has(sbx_rx_gain_ranges.keys(), name, "sbx rx gain name");
- if(name == "PGA0"){
+ if (name == "PGA0") {
rx_pga0_gain_to_iobits(gain);
_rx_gains[name] = gain;
- //write the new gain to atr regs
+ // write the new gain to atr regs
update_atr();
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
return _rx_gains[name];
}
@@ -105,26 +111,27 @@ double sbx_xcvr::set_rx_gain(double gain, const std::string &name){
/***********************************************************************
* Structors
**********************************************************************/
-sbx_xcvr::sbx_xcvr(ctor_args_t args) : xcvr_dboard_base(args){
- switch(get_rx_id().to_uint16()) {
+sbx_xcvr::sbx_xcvr(ctor_args_t args) : xcvr_dboard_base(args)
+{
+ switch (get_rx_id().to_uint16()) {
case 0x0054:
- db_actual = sbx_versionx_sptr(new sbx_version3(this));
- freq_range = sbx_freq_range;
+ db_actual = sbx_versionx_sptr(new sbx_version3(this));
+ freq_range = sbx_freq_range;
enable_rx_lo_filter = sbx_enable_rx_lo_filter;
enable_tx_lo_filter = sbx_enable_tx_lo_filter;
break;
case 0x0065:
case 0x0069:
case 0x0083:
- db_actual = sbx_versionx_sptr(new sbx_version4(this));
- freq_range = sbx_freq_range;
+ db_actual = sbx_versionx_sptr(new sbx_version4(this));
+ freq_range = sbx_freq_range;
enable_rx_lo_filter = sbx_enable_rx_lo_filter;
enable_tx_lo_filter = sbx_enable_tx_lo_filter;
break;
case 0x0067:
case 0x0085:
- db_actual = sbx_versionx_sptr(new cbx(this));
- freq_range = cbx_freq_range;
+ db_actual = sbx_versionx_sptr(new cbx(this));
+ freq_range = cbx_freq_range;
enable_rx_lo_filter = cbx_enable_rx_lo_filter;
enable_tx_lo_filter = cbx_enable_tx_lo_filter;
break;
@@ -139,40 +146,56 @@ sbx_xcvr::sbx_xcvr(ctor_args_t args) : xcvr_dboard_base(args){
this->get_rx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
uint16_t rx_id = get_rx_id().to_uint16();
- if(rx_id == 0x0054) this->get_rx_subtree()->create<std::string>("name").set("SBXv3 RX");
- else if(rx_id == 0x0065) this->get_rx_subtree()->create<std::string>("name").set("SBXv4 RX");
- else if(rx_id == 0x0067) this->get_rx_subtree()->create<std::string>("name").set("CBX RX");
- else if(rx_id == 0x0083) this->get_rx_subtree()->create<std::string>("name").set("SBX-120 RX");
- else if(rx_id == 0x0085) this->get_rx_subtree()->create<std::string>("name").set("CBX-120 RX");
- else this->get_rx_subtree()->create<std::string>("name").set("SBX/CBX RX");
-
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ if (rx_id == 0x0054)
+ this->get_rx_subtree()->create<std::string>("name").set("SBXv3 RX");
+ else if (rx_id == 0x0065)
+ this->get_rx_subtree()->create<std::string>("name").set("SBXv4 RX");
+ else if (rx_id == 0x0067)
+ this->get_rx_subtree()->create<std::string>("name").set("CBX RX");
+ else if (rx_id == 0x0083)
+ this->get_rx_subtree()->create<std::string>("name").set("SBX-120 RX");
+ else if (rx_id == 0x0085)
+ this->get_rx_subtree()->create<std::string>("name").set("CBX-120 RX");
+ else
+ this->get_rx_subtree()->create<std::string>("name").set("SBX/CBX RX");
+
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&sbx_xcvr::get_locked, this, dboard_iface::UNIT_RX));
- for(const std::string &name: sbx_rx_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&sbx_xcvr::set_rx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : sbx_rx_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&sbx_xcvr::set_rx_gain, this, std::placeholders::_1, name))
.set(sbx_rx_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(sbx_rx_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&sbx_xcvr::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
- .set((freq_range.start() + freq_range.stop())/2.0);
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(
+ &sbx_xcvr::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
+ .set((freq_range.start() + freq_range.stop()) / 2.0);
this->get_rx_subtree()->create<meta_range_t>("freq/range").set(freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&sbx_xcvr::set_rx_ant, this, std::placeholders::_1))
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&sbx_xcvr::set_rx_ant, this, std::placeholders::_1))
.set("RX2");
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(sbx_rx_antennas);
this->get_rx_subtree()->create<std::string>("connection").set("IQ");
- this->get_rx_subtree()->create<bool>("enabled").set(true); //always enabled
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
- //Value of bw low-pass dependent on board, we want complex double-sided
+ // Value of bw low-pass dependent on board, we want complex double-sided
double rx_bw = ((rx_id != 0x0083) && (rx_id != 0x0085)) ? 20.0e6 : 60.0e6;
- this->get_rx_subtree()->create<double>("bandwidth/value").set(2*rx_bw);
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*rx_bw, 2*rx_bw));
+ this->get_rx_subtree()->create<double>("bandwidth/value").set(2 * rx_bw);
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * rx_bw, 2 * rx_bw));
////////////////////////////////////////////////////////////////////
// Register TX properties
@@ -180,156 +203,180 @@ sbx_xcvr::sbx_xcvr(ctor_args_t args) : xcvr_dboard_base(args){
this->get_tx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
uint16_t tx_id = get_tx_id().to_uint16();
- if(tx_id == 0x0055) this->get_tx_subtree()->create<std::string>("name").set("SBXv3 TX");
- else if(tx_id == 0x0064) this->get_tx_subtree()->create<std::string>("name").set("SBXv4 TX");
- else if(tx_id == 0x0066) this->get_tx_subtree()->create<std::string>("name").set("CBX TX");
- else if(tx_id == 0x0082) this->get_tx_subtree()->create<std::string>("name").set("SBX-120 TX");
- else if(tx_id == 0x0084) this->get_tx_subtree()->create<std::string>("name").set("CBX-120 TX");
- else this->get_tx_subtree()->create<std::string>("name").set("SBX/CBX TX");
-
- this->get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ if (tx_id == 0x0055)
+ this->get_tx_subtree()->create<std::string>("name").set("SBXv3 TX");
+ else if (tx_id == 0x0064)
+ this->get_tx_subtree()->create<std::string>("name").set("SBXv4 TX");
+ else if (tx_id == 0x0066)
+ this->get_tx_subtree()->create<std::string>("name").set("CBX TX");
+ else if (tx_id == 0x0082)
+ this->get_tx_subtree()->create<std::string>("name").set("SBX-120 TX");
+ else if (tx_id == 0x0084)
+ this->get_tx_subtree()->create<std::string>("name").set("CBX-120 TX");
+ else
+ this->get_tx_subtree()->create<std::string>("name").set("SBX/CBX TX");
+
+ this->get_tx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&sbx_xcvr::get_locked, this, dboard_iface::UNIT_TX));
- for(const std::string &name: sbx_tx_gain_ranges.keys()){
- this->get_tx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&sbx_xcvr::set_tx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : sbx_tx_gain_ranges.keys()) {
+ this->get_tx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&sbx_xcvr::set_tx_gain, this, std::placeholders::_1, name))
.set(sbx_tx_gain_ranges[name].start());
- this->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_tx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(sbx_tx_gain_ranges[name]);
}
- this->get_tx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&sbx_xcvr::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
- .set((freq_range.start() + freq_range.stop())/2.0);
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(
+ &sbx_xcvr::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
+ .set((freq_range.start() + freq_range.stop()) / 2.0);
this->get_tx_subtree()->create<meta_range_t>("freq/range").set(freq_range);
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&sbx_xcvr::set_tx_ant, this, std::placeholders::_1))
+ this->get_tx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&sbx_xcvr::set_tx_ant, this, std::placeholders::_1))
.set(sbx_tx_antennas.at(0));
- this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(sbx_tx_antennas);
this->get_tx_subtree()->create<std::string>("connection").set("QI");
- this->get_tx_subtree()->create<bool>("enabled").set(true); //always enabled
+ this->get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
- //Value of bw low-pass dependent on board, we want complex double-sided
+ // Value of bw low-pass dependent on board, we want complex double-sided
double tx_bw = ((tx_id != 0x0082) && (tx_id != 0x0084)) ? 20.0e6 : 60.0e6;
- this->get_tx_subtree()->create<double>("bandwidth/value").set(2*tx_bw);
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*tx_bw, 2*tx_bw));
+ this->get_tx_subtree()->create<double>("bandwidth/value").set(2 * tx_bw);
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * tx_bw, 2 * tx_bw));
- //enable the clocks that we need
+ // enable the clocks that we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //set the gpio directions and atr controls (identically)
- this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, (TXIO_MASK|TX_LED_IO));
- this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, (RXIO_MASK|RX_LED_IO));
- this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, (TXIO_MASK|TX_LED_IO));
- this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, (RXIO_MASK|RX_LED_IO));
+ // set the gpio directions and atr controls (identically)
+ this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, (TXIO_MASK | TX_LED_IO));
+ this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, (RXIO_MASK | RX_LED_IO));
+ this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, (TXIO_MASK | TX_LED_IO));
+ this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, (RXIO_MASK | RX_LED_IO));
- //Initialize ATR registers after direction and pin ctrl configuration
+ // Initialize ATR registers after direction and pin ctrl configuration
update_atr();
- UHD_LOGGER_TRACE("SBX") << boost::format(
- "SBX GPIO Direction: RX: 0x%08x, TX: 0x%08x"
- ) % RXIO_MASK % TXIO_MASK ;
+ UHD_LOGGER_TRACE("SBX") << boost::format("SBX GPIO Direction: RX: 0x%08x, TX: 0x%08x")
+ % RXIO_MASK % TXIO_MASK;
}
-sbx_xcvr::~sbx_xcvr(void){
+sbx_xcvr::~sbx_xcvr(void)
+{
/* NOP */
}
/***********************************************************************
* Antenna Handling
**********************************************************************/
-void sbx_xcvr::update_atr(void){
- //calculate atr pins
+void sbx_xcvr::update_atr(void)
+{
+ // calculate atr pins
int rx_pga0_iobits = rx_pga0_gain_to_iobits(_rx_gains["PGA0"]);
int tx_pga0_iobits = tx_pga0_gain_to_iobits(_tx_gains["PGA0"]);
- int rx_lo_lpf_en = (_rx_lo_freq == enable_rx_lo_filter.clip(_rx_lo_freq)) ? LO_LPF_EN : 0;
- int tx_lo_lpf_en = (_tx_lo_freq == enable_tx_lo_filter.clip(_tx_lo_freq)) ? LO_LPF_EN : 0;
- int rx_ld_led = _rx_lo_lock_cache ? 0 : RX_LED_LD;
- int tx_ld_led = _tx_lo_lock_cache ? 0 : TX_LED_LD;
+ int rx_lo_lpf_en = (_rx_lo_freq == enable_rx_lo_filter.clip(_rx_lo_freq)) ? LO_LPF_EN
+ : 0;
+ int tx_lo_lpf_en = (_tx_lo_freq == enable_tx_lo_filter.clip(_tx_lo_freq)) ? LO_LPF_EN
+ : 0;
+ int rx_ld_led = _rx_lo_lock_cache ? 0 : RX_LED_LD;
+ int tx_ld_led = _tx_lo_lock_cache ? 0 : TX_LED_LD;
int rx_ant_led = _rx_ant == "TX/RX" ? RX_LED_RX1RX2 : 0;
int tx_ant_led = _tx_ant == "TX/RX" ? 0 : TX_LED_TXRX;
- //setup the tx atr (this does not change with antenna)
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_IDLE, 0 | tx_lo_lpf_en \
- | tx_ld_led | tx_ant_led | TX_POWER_UP | ANT_XX | TX_MIXER_DIS);
-
- //setup the rx atr (this does not change with antenna)
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_IDLE, rx_pga0_iobits | rx_lo_lpf_en \
- | rx_ld_led | rx_ant_led | RX_POWER_UP | ANT_XX | RX_MIXER_DIS);
-
- //set the RX atr regs that change with antenna setting
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_RX_ONLY, rx_pga0_iobits | rx_lo_lpf_en \
- | rx_ld_led | rx_ant_led | RX_POWER_UP | RX_MIXER_ENB \
- | ((_rx_ant != "RX2")? ANT_TXRX : ANT_RX2));
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_TX_ONLY, rx_pga0_iobits | rx_lo_lpf_en \
- | rx_ld_led | rx_ant_led | RX_POWER_UP | RX_MIXER_DIS \
- | ((_rx_ant == "CAL")? ANT_TXRX : ANT_RX2));
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, rx_pga0_iobits | rx_lo_lpf_en \
- | rx_ld_led | rx_ant_led | RX_POWER_UP | RX_MIXER_ENB \
- | ((_rx_ant == "CAL")? ANT_TXRX : ANT_RX2));
-
- //set the TX atr regs that change with antenna setting
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_RX_ONLY, 0 | tx_lo_lpf_en \
- | tx_ld_led | tx_ant_led | TX_POWER_UP | TX_MIXER_DIS \
- | ((_rx_ant != "RX2")? ANT_RX : ANT_TX));
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_TX_ONLY, tx_pga0_iobits | tx_lo_lpf_en \
- | tx_ld_led | tx_ant_led | TX_POWER_UP | TX_MIXER_ENB \
- | ((_tx_ant == "CAL")? ANT_RX : ANT_TX));
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, tx_pga0_iobits | tx_lo_lpf_en \
- | tx_ld_led | tx_ant_led | TX_POWER_UP | TX_MIXER_ENB \
- | ((_tx_ant == "CAL")? ANT_RX : ANT_TX));
+ // setup the tx atr (this does not change with antenna)
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_IDLE,
+ 0 | tx_lo_lpf_en | tx_ld_led | tx_ant_led | TX_POWER_UP | ANT_XX | TX_MIXER_DIS);
+
+ // setup the rx atr (this does not change with antenna)
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_IDLE,
+ rx_pga0_iobits | rx_lo_lpf_en | rx_ld_led | rx_ant_led | RX_POWER_UP | ANT_XX
+ | RX_MIXER_DIS);
+
+ // set the RX atr regs that change with antenna setting
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ rx_pga0_iobits | rx_lo_lpf_en | rx_ld_led | rx_ant_led | RX_POWER_UP
+ | RX_MIXER_ENB | ((_rx_ant != "RX2") ? ANT_TXRX : ANT_RX2));
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ rx_pga0_iobits | rx_lo_lpf_en | rx_ld_led | rx_ant_led | RX_POWER_UP
+ | RX_MIXER_DIS | ((_rx_ant == "CAL") ? ANT_TXRX : ANT_RX2));
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ rx_pga0_iobits | rx_lo_lpf_en | rx_ld_led | rx_ant_led | RX_POWER_UP
+ | RX_MIXER_ENB | ((_rx_ant == "CAL") ? ANT_TXRX : ANT_RX2));
+
+ // set the TX atr regs that change with antenna setting
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ 0 | tx_lo_lpf_en | tx_ld_led | tx_ant_led | TX_POWER_UP | TX_MIXER_DIS
+ | ((_rx_ant != "RX2") ? ANT_RX : ANT_TX));
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ tx_pga0_iobits | tx_lo_lpf_en | tx_ld_led | tx_ant_led | TX_POWER_UP
+ | TX_MIXER_ENB | ((_tx_ant == "CAL") ? ANT_RX : ANT_TX));
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ tx_pga0_iobits | tx_lo_lpf_en | tx_ld_led | tx_ant_led | TX_POWER_UP
+ | TX_MIXER_ENB | ((_tx_ant == "CAL") ? ANT_RX : ANT_TX));
}
-void sbx_xcvr::set_rx_ant(const std::string &ant){
- //validate input
+void sbx_xcvr::set_rx_ant(const std::string& ant)
+{
+ // validate input
assert_has(sbx_rx_antennas, ant, "sbx rx antenna name");
- //shadow the setting
+ // shadow the setting
_rx_ant = ant;
- //write the new antenna setting to atr regs
+ // write the new antenna setting to atr regs
update_atr();
}
-void sbx_xcvr::set_tx_ant(const std::string &ant){
+void sbx_xcvr::set_tx_ant(const std::string& ant)
+{
assert_has(sbx_tx_antennas, ant, "sbx tx antenna name");
- //shadow the setting
+ // shadow the setting
_tx_ant = ant;
- //write the new antenna setting to atr regs
+ // write the new antenna setting to atr regs
update_atr();
}
/***********************************************************************
* Tuning
**********************************************************************/
-double sbx_xcvr::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
+double sbx_xcvr::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
const double actual = db_actual->set_lo_freq(unit, target_freq);
- if (unit == dboard_iface::UNIT_RX){
+ if (unit == dboard_iface::UNIT_RX) {
_rx_lo_lock_cache = false;
- _rx_lo_freq = actual;
+ _rx_lo_freq = actual;
}
- if (unit == dboard_iface::UNIT_TX){
+ if (unit == dboard_iface::UNIT_TX) {
_tx_lo_lock_cache = false;
- _tx_lo_freq = actual;
+ _tx_lo_freq = actual;
}
update_atr();
return actual;
}
-sensor_value_t sbx_xcvr::get_locked(dboard_iface::unit_t unit) {
+sensor_value_t sbx_xcvr::get_locked(dboard_iface::unit_t unit)
+{
const bool locked = (this->get_iface()->read_gpio(unit) & LOCKDET_MASK) != 0;
bool& lock_cache = (unit == dboard_iface::UNIT_RX) ? _rx_lo_lock_cache
: _tx_lo_lock_cache;
diff --git a/host/lib/usrp/dboard/db_sbx_common.hpp b/host/lib/usrp/dboard/db_sbx_common.hpp
index 9c09f21a3..c11f0bbe2 100644
--- a/host/lib/usrp/dboard/db_sbx_common.hpp
+++ b/host/lib/usrp/dboard/db_sbx_common.hpp
@@ -10,73 +10,76 @@
#include <uhdlib/usrp/common/max287x.hpp>
// LO Related
-#define ADF435X_CE (1 << 3)
-#define ADF435X_PDBRF (1 << 2)
-#define ADF435X_MUXOUT (1 << 1) // INPUT!!!
-#define LOCKDET_MASK (1 << 0) // INPUT!!!
+#define ADF435X_CE (1 << 3)
+#define ADF435X_PDBRF (1 << 2)
+#define ADF435X_MUXOUT (1 << 1) // INPUT!!!
+#define LOCKDET_MASK (1 << 0) // INPUT!!!
// Common IO Pins
-#define LO_LPF_EN (1 << 15)
+#define LO_LPF_EN (1 << 15)
// TX IO Pins
-#define TRSW (1 << 14) // 0 = TX, 1 = RX
-#define TX_LED_TXRX (1 << 7) // LED for TX Antenna Selection TX/RX
-#define TX_LED_LD (1 << 6) // LED for TX Lock Detect
-#define DIS_POWER_TX (1 << 5) // on UNIT_TX, 0 powers up TX
-#define TX_ENABLE (1 << 4) // on UNIT_TX, 0 disables TX Mixer
+#define TRSW (1 << 14) // 0 = TX, 1 = RX
+#define TX_LED_TXRX (1 << 7) // LED for TX Antenna Selection TX/RX
+#define TX_LED_LD (1 << 6) // LED for TX Lock Detect
+#define DIS_POWER_TX (1 << 5) // on UNIT_TX, 0 powers up TX
+#define TX_ENABLE (1 << 4) // on UNIT_TX, 0 disables TX Mixer
// RX IO Pins
-#define LNASW (1 << 14) // 0 = TX/RX, 1 = RX2
-#define RX_LED_RX1RX2 (1 << 7) // LED for RX Antenna Selection RX1/RX2
-#define RX_LED_LD (1 << 6) // LED for RX Lock Detect
-#define DIS_POWER_RX (1 << 5) // on UNIT_RX, 0 powers up RX
-#define RX_DISABLE (1 << 4) // on UNIT_RX, 1 disables RX Mixer and Baseband
-#define RX_ATTN_SHIFT 8 //lsb of RX Attenuator Control
-#define RX_ATTN_MASK (63 << RX_ATTN_SHIFT) //valid bits of RX Attenuator Control
+#define LNASW (1 << 14) // 0 = TX/RX, 1 = RX2
+#define RX_LED_RX1RX2 (1 << 7) // LED for RX Antenna Selection RX1/RX2
+#define RX_LED_LD (1 << 6) // LED for RX Lock Detect
+#define DIS_POWER_RX (1 << 5) // on UNIT_RX, 0 powers up RX
+#define RX_DISABLE (1 << 4) // on UNIT_RX, 1 disables RX Mixer and Baseband
+#define RX_ATTN_SHIFT 8 // lsb of RX Attenuator Control
+#define RX_ATTN_MASK (63 << RX_ATTN_SHIFT) // valid bits of RX Attenuator Control
// TX Attenuator Pins
-#define TX_ATTN_SHIFT 8 // lsb of TX Attenuator Control
-#define TX_ATTN_MASK (63 << TX_ATTN_SHIFT) // valid bits of TX Attenuator Control
+#define TX_ATTN_SHIFT 8 // lsb of TX Attenuator Control
+#define TX_ATTN_MASK (63 << TX_ATTN_SHIFT) // valid bits of TX Attenuator Control
// Mixer functions
-#define TX_MIXER_ENB (ADF435X_PDBRF|TX_ENABLE)
-#define TX_MIXER_DIS 0
+#define TX_MIXER_ENB (ADF435X_PDBRF | TX_ENABLE)
+#define TX_MIXER_DIS 0
-#define RX_MIXER_ENB (ADF435X_PDBRF)
-#define RX_MIXER_DIS 0
+#define RX_MIXER_ENB (ADF435X_PDBRF)
+#define RX_MIXER_DIS 0
// Pin functions
-#define TX_LED_IO (TX_LED_TXRX|TX_LED_LD) // LED gpio lines, pull down for LED
-#define TXIO_MASK (LO_LPF_EN|TRSW|ADF435X_CE|ADF435X_PDBRF|TX_ATTN_MASK|DIS_POWER_TX|TX_ENABLE)
+#define TX_LED_IO (TX_LED_TXRX | TX_LED_LD) // LED gpio lines, pull down for LED
+#define TXIO_MASK \
+ (LO_LPF_EN | TRSW | ADF435X_CE | ADF435X_PDBRF | TX_ATTN_MASK | DIS_POWER_TX \
+ | TX_ENABLE)
-#define RX_LED_IO (RX_LED_RX1RX2|RX_LED_LD) // LED gpio lines, pull down for LED
-#define RXIO_MASK (LO_LPF_EN|LNASW|ADF435X_CE|ADF435X_PDBRF|RX_ATTN_MASK|DIS_POWER_RX|RX_DISABLE)
+#define RX_LED_IO (RX_LED_RX1RX2 | RX_LED_LD) // LED gpio lines, pull down for LED
+#define RXIO_MASK \
+ (LO_LPF_EN | LNASW | ADF435X_CE | ADF435X_PDBRF | RX_ATTN_MASK | DIS_POWER_RX \
+ | RX_DISABLE)
// Power functions
-#define TX_POWER_UP (ADF435X_CE)
-#define TX_POWER_DOWN (DIS_POWER_TX)
+#define TX_POWER_UP (ADF435X_CE)
+#define TX_POWER_DOWN (DIS_POWER_TX)
-#define RX_POWER_UP (ADF435X_CE)
-#define RX_POWER_DOWN (DIS_POWER_RX)
+#define RX_POWER_UP (ADF435X_CE)
+#define RX_POWER_DOWN (DIS_POWER_RX)
// Antenna constants
-#define ANT_TX TRSW //the tx line is transmitting
-#define ANT_RX 0 //the tx line is receiving
-#define ANT_TXRX 0 //the rx line is on txrx
-#define ANT_RX2 LNASW //the rx line in on rx2
-#define ANT_XX LNASW //dont care how the antenna is set
+#define ANT_TX TRSW // the tx line is transmitting
+#define ANT_RX 0 // the tx line is receiving
+#define ANT_TXRX 0 // the rx line is on txrx
+#define ANT_RX2 LNASW // the rx line in on rx2
+#define ANT_XX LNASW // dont care how the antenna is set
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
+#include <uhd/usrp/dboard_base.hpp>
+#include <uhd/usrp/dboard_manager.hpp>
+#include <uhd/utils/algorithm.hpp>
#include <uhd/utils/assert_has.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/utils/algorithm.hpp>
-
-#include <uhd/usrp/dboard_base.hpp>
-#include <uhd/usrp/dboard_manager.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
@@ -94,57 +97,45 @@ using namespace boost::assign;
static const freq_range_t sbx_freq_range(400e6, 4.4e9);
static const freq_range_t cbx_freq_range(1200e6, 6.0e9);
-static const freq_range_t sbx_tx_lo_2dbm = list_of
- (range_t(0.35e9, 0.37e9))
-;
+static const freq_range_t sbx_tx_lo_2dbm = list_of(range_t(0.35e9, 0.37e9));
-static const freq_range_t sbx_enable_tx_lo_filter = list_of
- (range_t(0.4e9, 1.5e9))
-;
+static const freq_range_t sbx_enable_tx_lo_filter = list_of(range_t(0.4e9, 1.5e9));
-static const freq_range_t sbx_enable_rx_lo_filter = list_of
- (range_t(0.4e9, 1.5e9))
-;
+static const freq_range_t sbx_enable_rx_lo_filter = list_of(range_t(0.4e9, 1.5e9));
-static const freq_range_t cbx_enable_tx_lo_filter = list_of
- (range_t(1.2e9, 2e9))
-;
+static const freq_range_t cbx_enable_tx_lo_filter = list_of(range_t(1.2e9, 2e9));
-static const freq_range_t cbx_enable_rx_lo_filter = list_of
- (range_t(1.2e9, 2e9))
-;
+static const freq_range_t cbx_enable_rx_lo_filter = list_of(range_t(1.2e9, 2e9));
static const std::vector<std::string> sbx_tx_antennas = list_of("TX/RX")("CAL");
static const std::vector<std::string> sbx_rx_antennas = list_of("TX/RX")("RX2")("CAL");
-static const uhd::dict<std::string, gain_range_t> sbx_tx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 31.5, double(0.5)))
-;
+static const uhd::dict<std::string, gain_range_t> sbx_tx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 31.5, double(0.5)));
-static const uhd::dict<std::string, gain_range_t> sbx_rx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 31.5, double(0.5)))
-;
+static const uhd::dict<std::string, gain_range_t> sbx_rx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 31.5, double(0.5)));
/***********************************************************************
* The SBX dboard
**********************************************************************/
-class sbx_xcvr : public xcvr_dboard_base{
+class sbx_xcvr : public xcvr_dboard_base
+{
public:
sbx_xcvr(ctor_args_t args);
virtual ~sbx_xcvr(void);
protected:
-
uhd::dict<std::string, double> _tx_gains, _rx_gains;
- double _rx_lo_freq, _tx_lo_freq;
- std::string _tx_ant, _rx_ant;
+ double _rx_lo_freq, _tx_lo_freq;
+ std::string _tx_ant, _rx_ant;
bool _rx_lo_lock_cache, _tx_lo_lock_cache;
- void set_rx_ant(const std::string &ant);
- void set_tx_ant(const std::string &ant);
- double set_rx_gain(double gain, const std::string &name);
- double set_tx_gain(double gain, const std::string &name);
+ void set_rx_ant(const std::string& ant);
+ void set_tx_ant(const std::string& ant);
+ double set_rx_gain(double gain, const std::string& name);
+ double set_tx_gain(double gain, const std::string& name);
void update_atr(void);
@@ -175,7 +166,8 @@ protected:
* This class is an abstract base class, and thus is impossible to
* instantiate.
*/
- class sbx_versionx {
+ class sbx_versionx
+ {
public:
sbx_versionx() {}
virtual ~sbx_versionx(void) {}
@@ -186,19 +178,21 @@ protected:
/*!
* Version 3 of the SBX Daughterboard
*/
- class sbx_version3 : public sbx_versionx {
+ class sbx_version3 : public sbx_versionx
+ {
public:
- sbx_version3(sbx_xcvr *_self_sbx_xcvr);
+ sbx_version3(sbx_xcvr* _self_sbx_xcvr);
virtual ~sbx_version3(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
/*! This is the registered instance of the wrapper class, sbx_base. */
- sbx_xcvr *self_base;
+ sbx_xcvr* self_base;
+
private:
adf435x_iface::sptr _txlo;
adf435x_iface::sptr _rxlo;
- void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs);
+ void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs);
};
/*!
@@ -206,19 +200,21 @@ protected:
*
* The only difference in the fourth revision is the ADF4351 vs the ADF4350.
*/
- class sbx_version4 : public sbx_versionx {
+ class sbx_version4 : public sbx_versionx
+ {
public:
- sbx_version4(sbx_xcvr *_self_sbx_xcvr);
+ sbx_version4(sbx_xcvr* _self_sbx_xcvr);
virtual ~sbx_version4(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
/*! This is the registered instance of the wrapper class, sbx_base. */
- sbx_xcvr *self_base;
+ sbx_xcvr* self_base;
+
private:
adf435x_iface::sptr _txlo;
adf435x_iface::sptr _rxlo;
- void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs);
+ void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs);
};
/*!
@@ -231,17 +227,19 @@ protected:
* There is also no LO filter switching required on CBX, but the GPIO is left
* blank so we don't worry about it.
*/
- class cbx : public sbx_versionx {
+ class cbx : public sbx_versionx
+ {
public:
- cbx(sbx_xcvr *_self_sbx_xcvr);
+ cbx(sbx_xcvr* _self_sbx_xcvr);
virtual ~cbx(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
/*! This is the registered instance of the wrapper class, sbx_base. */
- sbx_xcvr *self_base;
+ sbx_xcvr* self_base;
+
private:
- void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs);
+ void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs);
max287x_iface::sptr _txlo;
max287x_iface::sptr _rxlo;
};
@@ -253,15 +251,15 @@ protected:
freq_range_t freq_range;
/*!
- * Frequency range to use the LO LPF in RX; this is set in the constructor
- * to correspond either to SBX or CBX.
- */
+ * Frequency range to use the LO LPF in RX; this is set in the constructor
+ * to correspond either to SBX or CBX.
+ */
freq_range_t enable_rx_lo_filter;
/*!
- * Frequency range to use the LO LPF in TX; this is set in the constructor
- * to correspond either to SBX or CBX.
- */
+ * Frequency range to use the LO LPF in TX; this is set in the constructor
+ * to correspond either to SBX or CBX.
+ */
freq_range_t enable_tx_lo_filter;
/*!
@@ -275,4 +273,3 @@ protected:
typedef std::shared_ptr<sbx_versionx> sbx_versionx_sptr;
sbx_versionx_sptr db_actual;
};
-
diff --git a/host/lib/usrp/dboard/db_sbx_version3.cpp b/host/lib/usrp/dboard/db_sbx_version3.cpp
index 835b2f725..215c50c40 100644
--- a/host/lib/usrp/dboard/db_sbx_version3.cpp
+++ b/host/lib/usrp/dboard/db_sbx_version3.cpp
@@ -18,21 +18,29 @@ using namespace boost::assign;
/***********************************************************************
* Structors
**********************************************************************/
-sbx_xcvr::sbx_version3::sbx_version3(sbx_xcvr *_self_sbx_xcvr) {
- //register the handle to our base SBX class
+sbx_xcvr::sbx_version3::sbx_version3(sbx_xcvr* _self_sbx_xcvr)
+{
+ // register the handle to our base SBX class
self_base = _self_sbx_xcvr;
- _txlo = adf435x_iface::make_adf4350(std::bind(&sbx_xcvr::sbx_version3::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = adf435x_iface::make_adf4350(std::bind(&sbx_xcvr::sbx_version3::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = adf435x_iface::make_adf4350(std::bind(&sbx_xcvr::sbx_version3::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = adf435x_iface::make_adf4350(std::bind(&sbx_xcvr::sbx_version3::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
}
-sbx_xcvr::sbx_version3::~sbx_version3(void){
+sbx_xcvr::sbx_version3::~sbx_version3(void)
+{
/* NOP */
}
-void sbx_xcvr::sbx_version3::write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs)
+void sbx_xcvr::sbx_version3::write_lo_regs(
+ dboard_iface::unit_t unit, const std::vector<uint32_t>& regs)
{
- for(uint32_t reg: regs)
- {
+ for (uint32_t reg : regs) {
self_base->get_iface()->write_spi(unit, spi_config_t::EDGE_RISE, reg, 32);
}
}
@@ -40,42 +48,44 @@ void sbx_xcvr::sbx_version3::write_lo_regs(dboard_iface::unit_t unit, const std:
/***********************************************************************
* Tuning
**********************************************************************/
-double sbx_xcvr::sbx_version3::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- UHD_LOGGER_TRACE("SBX") << boost::format(
- "SBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+double sbx_xcvr::sbx_version3::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ UHD_LOGGER_TRACE("SBX") << boost::format("SBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
- //Select the LO
+ // Select the LO
adf435x_iface::sptr& lo_iface = unit == dboard_iface::UNIT_RX ? _rxlo : _txlo;
lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
lo_iface->set_reference_freq(self_base->get_iface()->get_clock_rate(unit));
- //Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
- lo_iface->set_prescaler(target_freq > 3e9 ? adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
+ // Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
+ lo_iface->set_prescaler(
+ target_freq > 3e9 ? adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
- //Configure the LO
+ // Configure the LO
double actual_freq = 0.0;
actual_freq = lo_iface->set_frequency(sbx_freq_range.clip(target_freq), is_int_n);
- if ((unit == dboard_iface::UNIT_TX) and (actual_freq == sbx_tx_lo_2dbm.clip(actual_freq))) {
+ if ((unit == dboard_iface::UNIT_TX)
+ and (actual_freq == sbx_tx_lo_2dbm.clip(actual_freq))) {
lo_iface->set_output_power(adf435x_iface::OUTPUT_POWER_2DBM);
} else {
lo_iface->set_output_power(adf435x_iface::OUTPUT_POWER_5DBM);
}
- //Write to hardware
+ // Write to hardware
lo_iface->commit();
return actual_freq;
}
-
diff --git a/host/lib/usrp/dboard/db_sbx_version4.cpp b/host/lib/usrp/dboard/db_sbx_version4.cpp
index 5c76a1b12..cf6dc4553 100644
--- a/host/lib/usrp/dboard/db_sbx_version4.cpp
+++ b/host/lib/usrp/dboard/db_sbx_version4.cpp
@@ -18,22 +18,30 @@ using namespace boost::assign;
/***********************************************************************
* Structors
**********************************************************************/
-sbx_xcvr::sbx_version4::sbx_version4(sbx_xcvr *_self_sbx_xcvr) {
- //register the handle to our base SBX class
+sbx_xcvr::sbx_version4::sbx_version4(sbx_xcvr* _self_sbx_xcvr)
+{
+ // register the handle to our base SBX class
self_base = _self_sbx_xcvr;
- _txlo = adf435x_iface::make_adf4351(std::bind(&sbx_xcvr::sbx_version4::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = adf435x_iface::make_adf4351(std::bind(&sbx_xcvr::sbx_version4::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = adf435x_iface::make_adf4351(std::bind(&sbx_xcvr::sbx_version4::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = adf435x_iface::make_adf4351(std::bind(&sbx_xcvr::sbx_version4::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
}
-sbx_xcvr::sbx_version4::~sbx_version4(void){
+sbx_xcvr::sbx_version4::~sbx_version4(void)
+{
/* NOP */
}
-void sbx_xcvr::sbx_version4::write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs)
+void sbx_xcvr::sbx_version4::write_lo_regs(
+ dboard_iface::unit_t unit, const std::vector<uint32_t>& regs)
{
- for(uint32_t reg: regs)
- {
+ for (uint32_t reg : regs) {
self_base->get_iface()->write_spi(unit, spi_config_t::EDGE_RISE, reg, 32);
}
}
@@ -42,42 +50,44 @@ void sbx_xcvr::sbx_version4::write_lo_regs(dboard_iface::unit_t unit, const std:
/***********************************************************************
* Tuning
**********************************************************************/
-double sbx_xcvr::sbx_version4::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- UHD_LOGGER_TRACE("SBX") << boost::format(
- "SBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+double sbx_xcvr::sbx_version4::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ UHD_LOGGER_TRACE("SBX") << boost::format("SBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
- //Select the LO
+ // Select the LO
adf435x_iface::sptr& lo_iface = unit == dboard_iface::UNIT_RX ? _rxlo : _txlo;
lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
lo_iface->set_reference_freq(self_base->get_iface()->get_clock_rate(unit));
- //Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
- lo_iface->set_prescaler(target_freq > 3.6e9 ? adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
+ // Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
+ lo_iface->set_prescaler(target_freq > 3.6e9 ? adf435x_iface::PRESCALER_8_9
+ : adf435x_iface::PRESCALER_4_5);
- //Configure the LO
+ // Configure the LO
double actual_freq = 0.0;
actual_freq = lo_iface->set_frequency(sbx_freq_range.clip(target_freq), is_int_n);
- if ((unit == dboard_iface::UNIT_TX) and (actual_freq == sbx_tx_lo_2dbm.clip(actual_freq))) {
+ if ((unit == dboard_iface::UNIT_TX)
+ and (actual_freq == sbx_tx_lo_2dbm.clip(actual_freq))) {
lo_iface->set_output_power(adf435x_iface::OUTPUT_POWER_2DBM);
} else {
lo_iface->set_output_power(adf435x_iface::OUTPUT_POWER_5DBM);
}
- //Write to hardware
+ // Write to hardware
lo_iface->commit();
return actual_freq;
}
-
diff --git a/host/lib/usrp/dboard/db_tvrx.cpp b/host/lib/usrp/dboard/db_tvrx.cpp
index cd238ddc8..02fed018c 100644
--- a/host/lib/usrp/dboard/db_tvrx.cpp
+++ b/host/lib/usrp/dboard/db_tvrx.cpp
@@ -10,13 +10,13 @@
// RX IO Functions
-//ADC/DAC functions:
-//DAC 1: RF AGC
-//DAC 2: IF AGC
+// ADC/DAC functions:
+// DAC 1: RF AGC
+// DAC 2: IF AGC
-//min freq: 50e6
-//max freq: 860e6
-//gain range: [0:1dB:115dB]
+// min freq: 50e6
+// max freq: 860e6
+// gain range: [0:1dB:115dB]
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
@@ -51,79 +51,140 @@ static const freq_range_t tvrx_freq_range(50e6, 860e6);
static const std::vector<std::string> tvrx_antennas = list_of("RX");
-static const uhd::dict<std::string, freq_range_t> tvrx_freq_ranges = map_list_of
- ("VHFLO", freq_range_t(50e6, 158e6))
- ("VHFHI", freq_range_t(158e6, 454e6))
- ("UHF" , freq_range_t(454e6, 860e6))
-;
-
-static const boost::array<double, 17> vhflo_gains_db =
- {{-6.00000, -6.00000, -6.00000, -4.00000, 0.00000,
- 5.00000, 10.00000, 17.40000, 26.30000, 36.00000,
- 43.00000, 48.00000, 49.50000, 50.10000, 50.30000,
- 50.30000, 50.30000}};
-
-static const boost::array<double, 17> vhfhi_gains_db =
- {{-13.3000, -13.3000, -13.3000, -1.0000, 7.7000,
- 11.0000, 14.7000, 19.3000, 26.1000, 36.0000,
- 42.7000, 46.0000, 47.0000, 47.8000, 48.2000,
- 48.2000, 48.2000}};
-
-static const boost::array<double, 17> uhf_gains_db =
- {{-8.0000, -8.0000, -7.0000, 4.0000, 10.2000,
- 14.5000, 17.5000, 20.0000, 24.5000, 30.8000,
- 37.0000, 39.8000, 40.7000, 41.6000, 42.6000,
- 43.2000, 43.8000}};
-
-static const boost::array<double, 17> tvrx_if_gains_db =
- {{-1.50000, -1.50000, -1.50000, -1.00000, 0.20000,
- 2.10000, 4.30000, 6.40000, 9.00000, 12.00000,
- 14.80000, 18.20000, 26.10000, 32.50000, 32.50000,
- 32.50000, 32.50000}};
-
-//gain linearization data
-//this is from the datasheet and is dB vs. volts (below)
-//i tried to curve fit this, but it's really just so nonlinear that you'd
-//need dang near as many coefficients as to just map it like this and interp.
-//these numbers are culled from the 4937DI5 datasheet and are probably totally inaccurate
-//but if it's better than the old linear fit i'm happy
-static const uhd::dict<std::string, boost::array<double, 17> > tvrx_rf_gains_db = map_list_of
- ("VHFLO", vhflo_gains_db)
- ("VHFHI", vhfhi_gains_db)
- ("UHF" , uhf_gains_db)
-;
-
-//sample voltages for the above points
-static const boost::array<double, 17> tvrx_gains_volts =
- {{0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0}};
-
-static uhd::dict<std::string, gain_range_t> get_tvrx_gain_ranges(void) {
+static const uhd::dict<std::string, freq_range_t> tvrx_freq_ranges =
+ map_list_of("VHFLO", freq_range_t(50e6, 158e6))("VHFHI", freq_range_t(158e6, 454e6))(
+ "UHF", freq_range_t(454e6, 860e6));
+
+static const boost::array<double, 17> vhflo_gains_db = {{-6.00000,
+ -6.00000,
+ -6.00000,
+ -4.00000,
+ 0.00000,
+ 5.00000,
+ 10.00000,
+ 17.40000,
+ 26.30000,
+ 36.00000,
+ 43.00000,
+ 48.00000,
+ 49.50000,
+ 50.10000,
+ 50.30000,
+ 50.30000,
+ 50.30000}};
+
+static const boost::array<double, 17> vhfhi_gains_db = {{-13.3000,
+ -13.3000,
+ -13.3000,
+ -1.0000,
+ 7.7000,
+ 11.0000,
+ 14.7000,
+ 19.3000,
+ 26.1000,
+ 36.0000,
+ 42.7000,
+ 46.0000,
+ 47.0000,
+ 47.8000,
+ 48.2000,
+ 48.2000,
+ 48.2000}};
+
+static const boost::array<double, 17> uhf_gains_db = {{-8.0000,
+ -8.0000,
+ -7.0000,
+ 4.0000,
+ 10.2000,
+ 14.5000,
+ 17.5000,
+ 20.0000,
+ 24.5000,
+ 30.8000,
+ 37.0000,
+ 39.8000,
+ 40.7000,
+ 41.6000,
+ 42.6000,
+ 43.2000,
+ 43.8000}};
+
+static const boost::array<double, 17> tvrx_if_gains_db = {{-1.50000,
+ -1.50000,
+ -1.50000,
+ -1.00000,
+ 0.20000,
+ 2.10000,
+ 4.30000,
+ 6.40000,
+ 9.00000,
+ 12.00000,
+ 14.80000,
+ 18.20000,
+ 26.10000,
+ 32.50000,
+ 32.50000,
+ 32.50000,
+ 32.50000}};
+
+// gain linearization data
+// this is from the datasheet and is dB vs. volts (below)
+// i tried to curve fit this, but it's really just so nonlinear that you'd
+// need dang near as many coefficients as to just map it like this and interp.
+// these numbers are culled from the 4937DI5 datasheet and are probably totally inaccurate
+// but if it's better than the old linear fit i'm happy
+static const uhd::dict<std::string, boost::array<double, 17>> tvrx_rf_gains_db =
+ map_list_of("VHFLO", vhflo_gains_db)("VHFHI", vhfhi_gains_db)("UHF", uhf_gains_db);
+
+// sample voltages for the above points
+static const boost::array<double, 17> tvrx_gains_volts = {{0.8,
+ 1.0,
+ 1.2,
+ 1.4,
+ 1.6,
+ 1.8,
+ 2.0,
+ 2.2,
+ 2.4,
+ 2.6,
+ 2.8,
+ 3.0,
+ 3.2,
+ 3.4,
+ 3.6,
+ 3.8,
+ 4.0}};
+
+static uhd::dict<std::string, gain_range_t> get_tvrx_gain_ranges(void)
+{
double rfmax = 0.0, rfmin = FLT_MAX;
- for(const std::string range: tvrx_rf_gains_db.keys()) {
- double my_max = tvrx_rf_gains_db[range].back(); //we're assuming it's monotonic
- double my_min = tvrx_rf_gains_db[range].front(); //if it's not this is wrong wrong wrong
- if(my_max > rfmax) rfmax = my_max;
- if(my_min < rfmin) rfmin = my_min;
+ for (const std::string range : tvrx_rf_gains_db.keys()) {
+ double my_max = tvrx_rf_gains_db[range].back(); // we're assuming it's monotonic
+ double my_min =
+ tvrx_rf_gains_db[range].front(); // if it's not this is wrong wrong wrong
+ if (my_max > rfmax)
+ rfmax = my_max;
+ if (my_min < rfmin)
+ rfmin = my_min;
}
double ifmin = tvrx_if_gains_db.front();
double ifmax = tvrx_if_gains_db.back();
- return map_list_of
- ("RF", gain_range_t(rfmin, rfmax, (rfmax-rfmin)/4096.0))
- ("IF", gain_range_t(ifmin, ifmax, (ifmax-ifmin)/4096.0))
- ;
+ return map_list_of("RF", gain_range_t(rfmin, rfmax, (rfmax - rfmin) / 4096.0))(
+ "IF", gain_range_t(ifmin, ifmax, (ifmax - ifmin) / 4096.0));
}
-static const double opamp_gain = 1.22; //onboard DAC opamp gain
-static const double tvrx_if_freq = 43.75e6; //IF freq of TVRX module
-static const uint16_t reference_divider = 640; //clock reference divider to use
+static const double opamp_gain = 1.22; // onboard DAC opamp gain
+static const double tvrx_if_freq = 43.75e6; // IF freq of TVRX module
+static const uint16_t reference_divider = 640; // clock reference divider to use
static const double reference_freq = 4.0e6;
/***********************************************************************
* The tvrx dboard class
**********************************************************************/
-class tvrx : public rx_dboard_base{
+class tvrx : public rx_dboard_base
+{
public:
tvrx(ctor_args_t args);
virtual ~tvrx(void);
@@ -132,116 +193,119 @@ private:
uhd::dict<std::string, double> _gains;
double _lo_freq;
tuner_4937di5_regs_t _tuner_4937di5_regs;
- uint8_t _tuner_4937di5_addr(void){
- return (this->get_iface()->get_special_props().mangle_i2c_addrs)? 0x61 : 0x60; //ok really? we could rename that call
+ uint8_t _tuner_4937di5_addr(void)
+ {
+ return (this->get_iface()->get_special_props().mangle_i2c_addrs)
+ ? 0x61
+ : 0x60; // ok really? we could rename that call
};
- double set_gain(double gain, const std::string &name);
+ double set_gain(double gain, const std::string& name);
double set_freq(double freq);
- void update_regs(void){
+ void update_regs(void)
+ {
byte_vector_t regs_vector(4);
- //get the register data
- for(int i=0; i<4; i++){
+ // get the register data
+ for (int i = 0; i < 4; i++) {
regs_vector[i] = _tuner_4937di5_regs.get_reg(i);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "tvrx: send reg 0x%02x, value 0x%04x"
- ) % int(i) % int(regs_vector[i]) ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("tvrx: send reg 0x%02x, value 0x%04x") % int(i)
+ % int(regs_vector[i]);
}
- //send the data
- this->get_iface()->write_i2c(
- _tuner_4937di5_addr(), regs_vector
- );
+ // send the data
+ this->get_iface()->write_i2c(_tuner_4937di5_addr(), regs_vector);
}
-
};
/***********************************************************************
* Register the tvrx dboard
**********************************************************************/
-static dboard_base::sptr make_tvrx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_tvrx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new tvrx(args));
}
-UHD_STATIC_BLOCK(reg_tvrx_dboard){
- //register the factory function for the rx dbid
+UHD_STATIC_BLOCK(reg_tvrx_dboard)
+{
+ // register the factory function for the rx dbid
dboard_manager::register_dboard(0x0040, &make_tvrx, "TVRX");
}
/***********************************************************************
* Structors
**********************************************************************/
-tvrx::tvrx(ctor_args_t args) : rx_dboard_base(args){
+tvrx::tvrx(ctor_args_t args) : rx_dboard_base(args)
+{
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name")
- .set("TVRX");
- this->get_rx_subtree()->create<int>("sensors"); //phony property so this dir exists
- for(const std::string &name: get_tvrx_gain_ranges().keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
+ this->get_rx_subtree()->create<std::string>("name").set("TVRX");
+ this->get_rx_subtree()->create<int>("sensors"); // phony property so this dir exists
+ for (const std::string& name : get_tvrx_gain_ranges().keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
.set_coercer(std::bind(&tvrx::set_gain, this, std::placeholders::_1, name));
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(get_tvrx_gain_ranges()[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&tvrx::set_freq, this, std::placeholders::_1));
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(tvrx_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .set(tvrx_antennas.at(0));
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(tvrx_freq_range);
+ this->get_rx_subtree()->create<std::string>("antenna/value").set(tvrx_antennas.at(0));
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(tvrx_antennas);
- this->get_rx_subtree()->create<std::string>("connection")
- .set("I");
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
- .set(6.0e6);
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_rx_subtree()->create<std::string>("connection").set("I");
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()->create<double>("bandwidth/value").set(6.0e6);
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(6.0e6, 6.0e6));
- //enable only the clocks we need
+ // enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0); // All unused in atr
- if (this->get_iface()->get_special_props().soft_clock_divider){
+ if (this->get_iface()->get_special_props().soft_clock_divider) {
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x1); // GPIO0 is clock
- }
- else{
+ } else {
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x0); // All Inputs
}
- //send initial register settings if necessary
+ // send initial register settings if necessary
- //set default freq
- _lo_freq = tvrx_freq_range.start() + tvrx_if_freq; //init _lo_freq to a sane default
+ // set default freq
+ _lo_freq = tvrx_freq_range.start() + tvrx_if_freq; // init _lo_freq to a sane default
this->get_rx_subtree()->access<double>("freq/value").set(tvrx_freq_range.start());
- //set default gains
- for(const std::string &name: get_tvrx_gain_ranges().keys()){
- this->get_rx_subtree()->access<double>("gains/"+name+"/value")
+ // set default gains
+ for (const std::string& name : get_tvrx_gain_ranges().keys()) {
+ this->get_rx_subtree()
+ ->access<double>("gains/" + name + "/value")
.set(get_tvrx_gain_ranges()[name].start());
}
}
-tvrx::~tvrx(void){
-}
+tvrx::~tvrx(void) {}
/*! Return a string corresponding to the relevant band
* \param freq the frequency of interest
* \return a string corresponding to the band
*/
-static std::string get_band(double freq) {
- for(const std::string &band: tvrx_freq_ranges.keys()) {
- if(freq >= tvrx_freq_ranges[band].start() && freq <= tvrx_freq_ranges[band].stop()){
- UHD_LOGGER_TRACE("TVRX") << "Band: " << band ;
+static std::string get_band(double freq)
+{
+ for (const std::string& band : tvrx_freq_ranges.keys()) {
+ if (freq >= tvrx_freq_ranges[band].start()
+ && freq <= tvrx_freq_ranges[band].stop()) {
+ UHD_LOGGER_TRACE("TVRX") << "Band: " << band;
return band;
}
}
@@ -259,33 +323,39 @@ static std::string get_band(double freq) {
* \return a voltage to feed the TVRX analog gain
*/
-static double gain_interp(double gain, const boost::array<double, 17>& db_vector, const boost::array<double, 17>& volts_vector) {
+static double gain_interp(double gain,
+ const boost::array<double, 17>& db_vector,
+ const boost::array<double, 17>& volts_vector)
+{
double volts;
- gain = uhd::clip<double>(gain, db_vector.front(), db_vector.back()); //let's not get carried away here
+ gain = uhd::clip<double>(
+ gain, db_vector.front(), db_vector.back()); // let's not get carried away here
uint8_t gain_step = 0;
- //find which bin we're in
- for(size_t i = 0; i < db_vector.size()-1; i++) {
- if (gain >= db_vector[i] && gain <= db_vector[i+1]) {
+ // find which bin we're in
+ for (size_t i = 0; i < db_vector.size() - 1; i++) {
+ if (gain >= db_vector[i] && gain <= db_vector[i + 1]) {
gain_step = uhd::narrow_cast<uint8_t>(i);
}
}
- //find the current slope for linear interpolation
+ // find the current slope for linear interpolation
double slope = (volts_vector[gain_step + 1] - volts_vector[gain_step])
- / (db_vector[gain_step + 1] - db_vector[gain_step]);
+ / (db_vector[gain_step + 1] - db_vector[gain_step]);
- //the problem here is that for gains approaching the maximum, the voltage slope becomes infinite
- //i.e., a small change in gain requires an infinite change in voltage
- //to cope, we limit the slope
+ // the problem here is that for gains approaching the maximum, the voltage slope
+ // becomes infinite i.e., a small change in gain requires an infinite change in
+ // voltage to cope, we limit the slope
- if(slope == std::numeric_limits<double>::infinity())
+ if (slope == std::numeric_limits<double>::infinity())
return volts_vector[gain_step];
- //use the volts per dB slope to find the final interpolated voltage
+ // use the volts per dB slope to find the final interpolated voltage
volts = volts_vector[gain_step] + (slope * (gain - db_vector[gain_step]));
- UHD_LOGGER_TRACE("TVRX") << "Gain interp: gain: " << gain << ", gain_step: " << int(gain_step) << ", slope: " << slope << ", volts: " << volts ;
+ UHD_LOGGER_TRACE("TVRX") << "Gain interp: gain: " << gain
+ << ", gain_step: " << int(gain_step) << ", slope: " << slope
+ << ", volts: " << volts;
return volts;
}
@@ -297,23 +367,24 @@ static double gain_interp(double gain, const boost::array<double, 17>& db_vector
* \return dac voltage value
*/
-static double rf_gain_to_voltage(double gain, double lo_freq){
- //clip the input
+static double rf_gain_to_voltage(double gain, double lo_freq)
+{
+ // clip the input
gain = get_tvrx_gain_ranges()["RF"].clip(gain);
- //first we need to find out what band we're in, because gains are different across different bands
+ // first we need to find out what band we're in, because gains are different across
+ // different bands
std::string band = get_band(lo_freq - tvrx_if_freq);
- //this is the voltage at the TVRX gain input
+ // this is the voltage at the TVRX gain input
double gain_volts = gain_interp(gain, tvrx_rf_gains_db[band], tvrx_gains_volts);
- //this is the voltage at the USRP DAC output
+ // this is the voltage at the USRP DAC output
double dac_volts = gain_volts / opamp_gain;
dac_volts = uhd::clip<double>(dac_volts, 0.0, 3.3);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "tvrx RF AGC gain: %f dB, dac_volts: %f V"
- ) % gain % dac_volts ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("tvrx RF AGC gain: %f dB, dac_volts: %f V")
+ % gain % dac_volts;
return dac_volts;
}
@@ -325,31 +396,34 @@ static double rf_gain_to_voltage(double gain, double lo_freq){
* \return dac voltage value
*/
-static double if_gain_to_voltage(double gain){
- //clip the input
+static double if_gain_to_voltage(double gain)
+{
+ // clip the input
gain = get_tvrx_gain_ranges()["IF"].clip(gain);
double gain_volts = gain_interp(gain, tvrx_if_gains_db, tvrx_gains_volts);
- double dac_volts = gain_volts / opamp_gain;
+ double dac_volts = gain_volts / opamp_gain;
dac_volts = uhd::clip<double>(dac_volts, 0.0, 3.3);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "tvrx IF AGC gain: %f dB, dac_volts: %f V"
- ) % gain % dac_volts ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("tvrx IF AGC gain: %f dB, dac_volts: %f V")
+ % gain % dac_volts;
return dac_volts;
}
-double tvrx::set_gain(double gain, const std::string &name){
+double tvrx::set_gain(double gain, const std::string& name)
+{
assert_has(get_tvrx_gain_ranges().keys(), name, "tvrx gain name");
- if (name == "RF"){
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_B, rf_gain_to_voltage(gain, _lo_freq));
- }
- else if(name == "IF"){
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, if_gain_to_voltage(gain));
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ if (name == "RF") {
+ this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX,
+ dboard_iface::AUX_DAC_B,
+ rf_gain_to_voltage(gain, _lo_freq));
+ } else if (name == "IF") {
+ this->get_iface()->write_aux_dac(
+ dboard_iface::UNIT_RX, dboard_iface::AUX_DAC_A, if_gain_to_voltage(gain));
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
_gains[name] = gain;
return gain;
@@ -360,44 +434,55 @@ double tvrx::set_gain(double gain, const std::string &name){
* \param freq the requested frequency
*/
-double tvrx::set_freq(double freq) {
- freq = tvrx_freq_range.clip(freq);
+double tvrx::set_freq(double freq)
+{
+ freq = tvrx_freq_range.clip(freq);
std::string prev_band = get_band(_lo_freq - tvrx_if_freq);
- std::string new_band = get_band(freq);
+ std::string new_band = get_band(freq);
- double target_lo_freq = freq + tvrx_if_freq; //the desired LO freq for high-side mixing
- double f_ref = reference_freq / double(reference_divider); //your tuning step size
+ double target_lo_freq =
+ freq + tvrx_if_freq; // the desired LO freq for high-side mixing
+ double f_ref = reference_freq / double(reference_divider); // your tuning step size
- int divisor = int((target_lo_freq + (f_ref * 4.0)) / (f_ref * 8)); //the divisor we'll use
- double actual_lo_freq = (f_ref * 8 * divisor); //the LO freq we'll actually get
+ int divisor =
+ int((target_lo_freq + (f_ref * 4.0)) / (f_ref * 8)); // the divisor we'll use
+ double actual_lo_freq = (f_ref * 8 * divisor); // the LO freq we'll actually get
- if((divisor & ~0x7fff)) UHD_THROW_INVALID_CODE_PATH();
+ if ((divisor & ~0x7fff))
+ UHD_THROW_INVALID_CODE_PATH();
- //now we update the registers
+ // now we update the registers
_tuner_4937di5_regs.db1 = (divisor >> 8) & 0xff;
_tuner_4937di5_regs.db2 = divisor & 0xff;
- if(new_band == "VHFLO") _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_VHFLO;
- else if(new_band == "VHFHI") _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_VHFHI;
- else if(new_band == "UHF") _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_UHF;
- else UHD_THROW_INVALID_CODE_PATH();
+ if (new_band == "VHFLO")
+ _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_VHFLO;
+ else if (new_band == "VHFHI")
+ _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_VHFHI;
+ else if (new_band == "UHF")
+ _tuner_4937di5_regs.bandsel = tuner_4937di5_regs_t::BANDSEL_UHF;
+ else
+ UHD_THROW_INVALID_CODE_PATH();
_tuner_4937di5_regs.power = tuner_4937di5_regs_t::POWER_OFF;
update_regs();
- //ok don't forget to reset RF gain here if the new band != the old band
- //we do this because the gains are different for different band settings
- //not FAR off, but we do this to be consistent
- if(prev_band != new_band) set_gain(_gains["RF"], "RF");
+ // ok don't forget to reset RF gain here if the new band != the old band
+ // we do this because the gains are different for different band settings
+ // not FAR off, but we do this to be consistent
+ if (prev_band != new_band)
+ set_gain(_gains["RF"], "RF");
- UHD_LOGGER_TRACE("TVRX") << boost::format("set_freq: target LO: %f f_ref: %f divisor: %i actual LO: %f") % target_lo_freq % f_ref % divisor % actual_lo_freq ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("set_freq: target LO: %f f_ref: %f divisor: %i actual LO: %f")
+ % target_lo_freq % f_ref % divisor % actual_lo_freq;
- _lo_freq = actual_lo_freq; //for rx props
+ _lo_freq = actual_lo_freq; // for rx props
- //Check the the IF if larger than the dsp rate and apply a corrective adjustment
- //so that the cordic will be tuned to a possible rate within its range.
+ // Check the the IF if larger than the dsp rate and apply a corrective adjustment
+ // so that the cordic will be tuned to a possible rate within its range.
const double codec_rate = this->get_iface()->get_codec_rate(dboard_iface::UNIT_RX);
- if (tvrx_if_freq >= codec_rate/2){
+ if (tvrx_if_freq >= codec_rate / 2) {
return _lo_freq - codec_rate;
}
diff --git a/host/lib/usrp/dboard/db_tvrx2.cpp b/host/lib/usrp/dboard/db_tvrx2.cpp
index 5767243d9..0f1673633 100644
--- a/host/lib/usrp/dboard/db_tvrx2.cpp
+++ b/host/lib/usrp/dboard/db_tvrx2.cpp
@@ -70,34 +70,50 @@ using namespace boost::assign;
/***********************************************************************
* The TVRX2 types
**********************************************************************/
-struct tvrx2_tda18272_rfcal_result_t {
- int8_t delta_c;
- int8_t c_offset;
- tvrx2_tda18272_rfcal_result_t(void): delta_c(0), c_offset(0){}
+struct tvrx2_tda18272_rfcal_result_t
+{
+ int8_t delta_c;
+ int8_t c_offset;
+ tvrx2_tda18272_rfcal_result_t(void) : delta_c(0), c_offset(0) {}
};
-struct tvrx2_tda18272_rfcal_coeffs_t {
- uint8_t cal_number;
- int32_t RF_A1;
- int32_t RF_B1;
- tvrx2_tda18272_rfcal_coeffs_t(void): cal_number(0), RF_A1(0), RF_B1(0) {}
- tvrx2_tda18272_rfcal_coeffs_t(uint32_t num): RF_A1(0), RF_B1(0) { cal_number = num; }
+struct tvrx2_tda18272_rfcal_coeffs_t
+{
+ uint8_t cal_number;
+ int32_t RF_A1;
+ int32_t RF_B1;
+ tvrx2_tda18272_rfcal_coeffs_t(void) : cal_number(0), RF_A1(0), RF_B1(0) {}
+ tvrx2_tda18272_rfcal_coeffs_t(uint32_t num) : RF_A1(0), RF_B1(0)
+ {
+ cal_number = num;
+ }
};
-struct tvrx2_tda18272_cal_map_t {
- boost::array<uint32_t, 4> cal_freq;
- boost::array<uint8_t, 4> c_offset;
- tvrx2_tda18272_cal_map_t(boost::array<uint32_t, 4> freqs, boost::array<uint8_t, 4> offsets)
- { cal_freq = freqs; c_offset = offsets; }
+struct tvrx2_tda18272_cal_map_t
+{
+ boost::array<uint32_t, 4> cal_freq;
+ boost::array<uint8_t, 4> c_offset;
+ tvrx2_tda18272_cal_map_t(
+ boost::array<uint32_t, 4> freqs, boost::array<uint8_t, 4> offsets)
+ {
+ cal_freq = freqs;
+ c_offset = offsets;
+ }
};
-struct tvrx2_tda18272_freq_map_t {
- uint32_t rf_max;
- uint8_t c_prog;
- uint8_t gain_taper;
- uint8_t rf_band;
- tvrx2_tda18272_freq_map_t( uint32_t max, uint8_t c, uint8_t taper, uint8_t band)
- { rf_max = max; c_prog = c; gain_taper = taper; rf_band = band; }
+struct tvrx2_tda18272_freq_map_t
+{
+ uint32_t rf_max;
+ uint8_t c_prog;
+ uint8_t gain_taper;
+ uint8_t rf_band;
+ tvrx2_tda18272_freq_map_t(uint32_t max, uint8_t c, uint8_t taper, uint8_t band)
+ {
+ rf_max = max;
+ c_prog = c;
+ gain_taper = taper;
+ rf_band = band;
+ }
};
/***********************************************************************
@@ -743,7 +759,8 @@ static const uhd::dict<std::string, gain_range_t> tvrx2_gain_ranges = map_list_o
/***********************************************************************
* The TVRX2 dboard class
**********************************************************************/
-class tvrx2 : public rx_dboard_base{
+class tvrx2 : public rx_dboard_base
+{
public:
tvrx2(ctor_args_t args);
virtual ~tvrx2(void);
@@ -763,7 +780,7 @@ private:
bool set_enabled(bool);
double set_lo_freq(double target_freq);
- double set_gain(double gain, const std::string &name);
+ double set_gain(double gain, const std::string& name);
double set_bandwidth(double bandwidth);
void set_scaled_rf_freq(double rf_freq);
@@ -785,22 +802,22 @@ private:
void wait_irq(void);
void test_rf_filter_robustness(void);
-/***********************************************************************
- * The TVRX2 class helper functions
- **********************************************************************/
+ /***********************************************************************
+ * The TVRX2 class helper functions
+ **********************************************************************/
/*!
* Is the IRQ set or cleared?
* \return true for set
*/
- bool get_irq(void){
+ bool get_irq(void)
+ {
read_reg(0x8, 0x8);
- //return irq status
+ // return irq status
bool irq = _tda18272hnm_regs.irq_status == tda18272hnm_regs_t::IRQ_STATUS_SET;
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): IRQ %d"
- ) % (get_subdev_name()) % irq ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s): IRQ %d") % (get_subdev_name()) % irq;
return irq;
}
@@ -810,15 +827,16 @@ private:
* Check POR logic for reset state (causes POR to clear)
* \return true for reset
*/
- bool get_power_reset(void){
+ bool get_power_reset(void)
+ {
read_reg(0x5, 0x5);
- //return POR state
+ // return POR state
bool por = _tda18272hnm_regs.por == tda18272hnm_regs_t::POR_RESET;
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): POR %d"
- ) % (get_subdev_name()) % int(_tda18272hnm_regs.por) ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("TVRX2 (%s): POR %d")
+ % (get_subdev_name())
+ % int(_tda18272hnm_regs.por);
return por;
}
@@ -827,15 +845,15 @@ private:
* Get the lock detect status of the LO.
* \return sensor for locked
*/
- sensor_value_t get_locked(void){
+ sensor_value_t get_locked(void)
+ {
read_reg(0x5, 0x5);
- //return lock detect
+ // return lock detect
bool locked = _tda18272hnm_regs.lo_lock == tda18272hnm_regs_t::LO_LOCK_LOCKED;
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): locked %d"
- ) % (get_subdev_name()) % locked ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s): locked %d") % (get_subdev_name()) % locked;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
@@ -845,21 +863,26 @@ private:
* Read the RSSI from the aux adc
* \return the rssi sensor in dB(m?) FIXME
*/
- sensor_value_t get_rssi(void){
- //Launch RSSI calculation with MSM statemachine
- _tda18272hnm_regs.set_reg(0x19, 0x80); //set MSM_byte_1 for rssi calculation
- _tda18272hnm_regs.set_reg(0x1A, 0x01); //set MSM_byte_2 for launching rssi calculation
+ sensor_value_t get_rssi(void)
+ {
+ // Launch RSSI calculation with MSM statemachine
+ _tda18272hnm_regs.set_reg(0x19, 0x80); // set MSM_byte_1 for rssi calculation
+ _tda18272hnm_regs.set_reg(
+ 0x1A, 0x01); // set MSM_byte_2 for launching rssi calculation
send_reg(0x19, 0x1A);
wait_irq();
- //read rssi in dBuV
+ // read rssi in dBuV
read_reg(0x7, 0x7);
- //calculate the rssi from the voltage
- double rssi_dBuV = 40.0 + double(((110.0 - 40.0)/128.0) * _tda18272hnm_regs.get_reg(0x7));
- double rssi = rssi_dBuV - 107.0; //convert to dBm in 50ohm environment ( -108.8 if 75ohm ) FIXME
+ // calculate the rssi from the voltage
+ double rssi_dBuV =
+ 40.0 + double(((110.0 - 40.0) / 128.0) * _tda18272hnm_regs.get_reg(0x7));
+ double rssi =
+ rssi_dBuV
+ - 107.0; // convert to dBm in 50ohm environment ( -108.8 if 75ohm ) FIXME
return sensor_value_t("RSSI", rssi, "dBm");
}
@@ -868,19 +891,20 @@ private:
* Read the Temperature from the registers
* \return the temp in degC
*/
- sensor_value_t get_temp(void){
- //Enable Temperature reading
+ sensor_value_t get_temp(void)
+ {
+ // Enable Temperature reading
_tda18272hnm_regs.tm_on = tda18272hnm_regs_t::TM_ON_SENSOR_ON;
send_reg(0x4, 0x4);
- //read temp in degC
+ // read temp in degC
read_reg(0x3, 0x3);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Temperature %f C"
- ) % (get_subdev_name()) % (double(_tda18272hnm_regs.tm_d)) ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("TVRX2 (%s): Temperature %f C")
+ % (get_subdev_name())
+ % (double(_tda18272hnm_regs.tm_d));
- //Disable Temperature reading
+ // Disable Temperature reading
_tda18272hnm_regs.tm_on = tda18272hnm_regs_t::TM_ON_SENSOR_OFF;
send_reg(0x4, 0x4);
@@ -891,194 +915,205 @@ private:
/***********************************************************************
* Register the TVRX2 dboard
**********************************************************************/
-static dboard_base::sptr make_tvrx2(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_tvrx2(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new tvrx2(args));
}
-UHD_STATIC_BLOCK(reg_tvrx2_dboard){
- //register the factory function for the rx dbid
- dboard_manager::register_dboard(0x0046, &make_tvrx2, "TVRX2", tvrx2_sd_name_to_conn.keys());
+UHD_STATIC_BLOCK(reg_tvrx2_dboard)
+{
+ // register the factory function for the rx dbid
+ dboard_manager::register_dboard(
+ 0x0046, &make_tvrx2, "TVRX2", tvrx2_sd_name_to_conn.keys());
}
/***********************************************************************
* Structors
**********************************************************************/
-tvrx2::tvrx2(ctor_args_t args) : rx_dboard_base(args){
- //FIXME for USRP1, we can only support one TVRX2 installed
-
- _rfcal_results = map_list_of
- ( 0, tvrx2_tda18272_rfcal_result_t() )
- ( 1, tvrx2_tda18272_rfcal_result_t() )
- ( 2, tvrx2_tda18272_rfcal_result_t() )
- ( 3, tvrx2_tda18272_rfcal_result_t() )
- ( 4, tvrx2_tda18272_rfcal_result_t() )
- ( 5, tvrx2_tda18272_rfcal_result_t() )
- ( 6, tvrx2_tda18272_rfcal_result_t() )
- ( 7, tvrx2_tda18272_rfcal_result_t() )
- ( 8, tvrx2_tda18272_rfcal_result_t() )
- ( 9, tvrx2_tda18272_rfcal_result_t() )
- ( 10, tvrx2_tda18272_rfcal_result_t() )
- ( 11, tvrx2_tda18272_rfcal_result_t() )
- ;
-
- _rfcal_coeffs = map_list_of
- ( 0, tvrx2_tda18272_rfcal_coeffs_t(0) )
- ( 1, tvrx2_tda18272_rfcal_coeffs_t(1) )
- ( 2, tvrx2_tda18272_rfcal_coeffs_t(3) )
- ( 3, tvrx2_tda18272_rfcal_coeffs_t(4) )
- ( 4, tvrx2_tda18272_rfcal_coeffs_t(6) )
- ( 5, tvrx2_tda18272_rfcal_coeffs_t(7) )
- ( 6, tvrx2_tda18272_rfcal_coeffs_t(9) )
- ( 7, tvrx2_tda18272_rfcal_coeffs_t(10) )
- ;
-
- //set defaults for LO, gains, and filter bandwidth
+tvrx2::tvrx2(ctor_args_t args) : rx_dboard_base(args)
+{
+ // FIXME for USRP1, we can only support one TVRX2 installed
+
+ _rfcal_results = map_list_of(0, tvrx2_tda18272_rfcal_result_t())(
+ 1, tvrx2_tda18272_rfcal_result_t())(2, tvrx2_tda18272_rfcal_result_t())(
+ 3, tvrx2_tda18272_rfcal_result_t())(4, tvrx2_tda18272_rfcal_result_t())(
+ 5, tvrx2_tda18272_rfcal_result_t())(6, tvrx2_tda18272_rfcal_result_t())(
+ 7, tvrx2_tda18272_rfcal_result_t())(8, tvrx2_tda18272_rfcal_result_t())(
+ 9, tvrx2_tda18272_rfcal_result_t())(10, tvrx2_tda18272_rfcal_result_t())(
+ 11, tvrx2_tda18272_rfcal_result_t());
+
+ _rfcal_coeffs = map_list_of(0, tvrx2_tda18272_rfcal_coeffs_t(0))(
+ 1, tvrx2_tda18272_rfcal_coeffs_t(1))(2, tvrx2_tda18272_rfcal_coeffs_t(3))(
+ 3, tvrx2_tda18272_rfcal_coeffs_t(4))(4, tvrx2_tda18272_rfcal_coeffs_t(6))(
+ 5, tvrx2_tda18272_rfcal_coeffs_t(7))(6, tvrx2_tda18272_rfcal_coeffs_t(9))(
+ 7, tvrx2_tda18272_rfcal_coeffs_t(10));
+
+ // set defaults for LO, gains, and filter bandwidth
_bandwidth = 10e6;
_if_freq = 12.5e6;
_enabled = false;
- //send initial register settings
- //this->read_reg(0x0, 0x43);
- //this->send_reg(0x0, 0x43);
+ // send initial register settings
+ // this->read_reg(0x0, 0x43);
+ // this->send_reg(0x0, 0x43);
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name")
- .set("TVRX2");
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_rx_subtree()->create<std::string>("name").set("TVRX2");
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&tvrx2::get_locked, this));
- this->get_rx_subtree()->create<sensor_value_t>("sensors/rssi")
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/rssi")
.set_publisher(std::bind(&tvrx2::get_rssi, this));
- this->get_rx_subtree()->create<sensor_value_t>("sensors/temperature")
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/temperature")
.set_publisher(std::bind(&tvrx2::get_temp, this));
- for(const std::string &name: tvrx2_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
+ for (const std::string& name : tvrx2_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
.set_coercer(std::bind(&tvrx2::set_gain, this, std::placeholders::_1, name));
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(tvrx2_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&tvrx2::set_lo_freq, this, std::placeholders::_1));
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(tvrx2_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(tvrx2_freq_range);
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
.set(tvrx2_sd_name_to_antennas[get_subdev_name()]);
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(list_of(tvrx2_sd_name_to_antennas[get_subdev_name()]));
- this->get_rx_subtree()->create<std::string>("connection")
+ this->get_rx_subtree()
+ ->create<std::string>("connection")
.set(tvrx2_sd_name_to_conn[get_subdev_name()]);
- this->get_rx_subtree()->create<bool>("enabled")
+ this->get_rx_subtree()
+ ->create<bool>("enabled")
.set_coercer(std::bind(&tvrx2::set_enabled, this, std::placeholders::_1))
.set(_enabled);
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
.set_coercer(std::bind(&tvrx2::set_bandwidth, this, std::placeholders::_1))
.set(_bandwidth);
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(tvrx2_bandwidth_range);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0); // All unused in atr
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, OUTPUT_MASK); // Set outputs
- //configure ref_clock
+ // configure ref_clock
double ref_clock = this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
if (ref_clock == 64.0e6) {
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, REFCLOCK_DIV4);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Dividing Refclock by 4"
- ) % (get_subdev_name()) ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s): Dividing Refclock by 4") % (get_subdev_name());
- _freq_scalar = (4*16.0e6)/(this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX));
+ _freq_scalar =
+ (4 * 16.0e6) / (this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX));
} else if (ref_clock == 100e6) {
-
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, REFCLOCK_DIV6);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Dividing Refclock by 6"
- ) % (get_subdev_name()) ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s): Dividing Refclock by 6") % (get_subdev_name());
- _freq_scalar = (6*16.0e6)/this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
- } else if (ref_clock == 200e6) {
- UHD_LOGGER_WARNING("TVRX") << boost::format("ref_clock was 200e6, setting ref_clock divider for 100e6.") ;
+ _freq_scalar =
+ (6 * 16.0e6) / this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
+ } else if (ref_clock == 200e6) {
+ UHD_LOGGER_WARNING("TVRX")
+ << boost::format("ref_clock was 200e6, setting ref_clock divider for 100e6.");
this->get_iface()->set_clock_rate(dboard_iface::UNIT_RX, 100e6);
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, REFCLOCK_DIV6);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Dividing Refclock by 6"
- ) % (get_subdev_name()) ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s): Dividing Refclock by 6") % (get_subdev_name());
- _freq_scalar = (6*16.0e6)/this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
+ _freq_scalar =
+ (6 * 16.0e6) / this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX);
} else {
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, REFCLOCK_DIV6);
- UHD_LOGGER_WARNING("TVRX") << boost::format("Unsupported ref_clock %0.2f, valid options 64e6, 100e6, 200e6") % ref_clock ;
+ UHD_LOGGER_WARNING("TVRX")
+ << boost::format(
+ "Unsupported ref_clock %0.2f, valid options 64e6, 100e6, 200e6")
+ % ref_clock;
_freq_scalar = 1.0;
}
- //enable only the clocks we need
+ // enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Refclock %f Hz, scalar = %f"
- ) % (get_subdev_name()) % (this->get_iface()->get_clock_rate(dboard_iface::UNIT_RX)) % _freq_scalar ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("TVRX2 (%s): Refclock %f Hz, scalar = %f")
+ % (get_subdev_name())
+ % (this->get_iface()->get_clock_rate(
+ dboard_iface::UNIT_RX))
+ % _freq_scalar;
_tda18272hnm_regs.irq_polarity = tda18272hnm_regs_t::IRQ_POLARITY_RAISED_VCC;
- _tda18272hnm_regs.irq_clear = tda18272hnm_regs_t::IRQ_CLEAR_TRUE;
+ _tda18272hnm_regs.irq_clear = tda18272hnm_regs_t::IRQ_CLEAR_TRUE;
send_reg(0x37, 0x37);
send_reg(0xA, 0xA);
- send_reg(0x31, 0x31); //N_CP_Current
- send_reg(0x36, 0x36); //RSSI_Clock
- send_reg(0x24, 0x25); //AGC1_Do_step
- send_reg(0x2C, 0x2C); //AGC1_Do_step
- send_reg(0x2E, 0x2E); //AGC2_Do_step
- send_reg(0x0E, 0x0E); //AGCs_Up_step_assym
- send_reg(0x11, 0x11); //AGCs_Do_step_assym
-
- //intialize i2c
- //soft_calibration();
- //tvrx2_tda18272_init_rfcal();
+ send_reg(0x31, 0x31); // N_CP_Current
+ send_reg(0x36, 0x36); // RSSI_Clock
+ send_reg(0x24, 0x25); // AGC1_Do_step
+ send_reg(0x2C, 0x2C); // AGC1_Do_step
+ send_reg(0x2E, 0x2E); // AGC2_Do_step
+ send_reg(0x0E, 0x0E); // AGCs_Up_step_assym
+ send_reg(0x11, 0x11); // AGCs_Do_step_assym
+
+ // intialize i2c
+ // soft_calibration();
+ // tvrx2_tda18272_init_rfcal();
transition_0();
}
-bool tvrx2::set_enabled(bool enable){
- if (enable == _enabled) return _enabled;
+bool tvrx2::set_enabled(bool enable)
+{
+ if (enable == _enabled)
+ return _enabled;
- if (enable and not _enabled){
- //setup tuner parameters
+ if (enable and not _enabled) {
+ // setup tuner parameters
transition_1();
transition_2(int(tvrx2_freq_range.start()));
test_rf_filter_robustness();
- for(const std::string &name: tvrx2_gain_ranges.keys()){
- this->get_rx_subtree()->access<double>("gains/"+name+"/value")
+ for (const std::string& name : tvrx2_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->access<double>("gains/" + name + "/value")
.set(tvrx2_gain_ranges[name].start());
}
- this->get_rx_subtree()->access<double>("bandwidth/value")
+ this->get_rx_subtree()
+ ->access<double>("bandwidth/value")
.set(_bandwidth); // default bandwidth from datasheet
- //transition_2 equivalent
- this->get_rx_subtree()->access<double>("freq/value")
+ // transition_2 equivalent
+ this->get_rx_subtree()
+ ->access<double>("freq/value")
.set(tvrx2_freq_range.start());
- //enter standby mode
+ // enter standby mode
transition_3();
_enabled = true;
} else {
- //enter standby mode
+ // enter standby mode
transition_3();
_enabled = false;
}
@@ -1086,10 +1121,10 @@ bool tvrx2::set_enabled(bool enable){
return _enabled;
}
-tvrx2::~tvrx2(void){
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s): Called Destructor"
- ) % (get_subdev_name()) ;
+tvrx2::~tvrx2(void)
+{
+ UHD_LOGGER_TRACE("TVRX") << boost::format("TVRX2 (%s): Called Destructor")
+ % (get_subdev_name());
UHD_SAFE_CALL(if (_enabled) set_enabled(false);)
}
@@ -1097,84 +1132,101 @@ tvrx2::~tvrx2(void){
/***********************************************************************
* TDA18272 Register IO Functions
**********************************************************************/
-void tvrx2::set_scaled_rf_freq(double rf_freq){
- _tda18272hnm_regs.set_rf_freq(uint32_t(_freq_scalar*rf_freq/1e3));
+void tvrx2::set_scaled_rf_freq(double rf_freq)
+{
+ _tda18272hnm_regs.set_rf_freq(uint32_t(_freq_scalar * rf_freq / 1e3));
}
-double tvrx2::get_scaled_rf_freq(void){
- return _tda18272hnm_regs.get_rf_freq()*1e3/_freq_scalar;
+double tvrx2::get_scaled_rf_freq(void)
+{
+ return _tda18272hnm_regs.get_rf_freq() * 1e3 / _freq_scalar;
}
-void tvrx2::set_scaled_if_freq(double if_freq){
- _tda18272hnm_regs.if_freq = int(_freq_scalar*if_freq/(50e3)); //max 12.8MHz??
+void tvrx2::set_scaled_if_freq(double if_freq)
+{
+ _tda18272hnm_regs.if_freq = int(_freq_scalar * if_freq / (50e3)); // max 12.8MHz??
}
-double tvrx2::get_scaled_if_freq(void){
- return _tda18272hnm_regs.if_freq*50e3/_freq_scalar;
+double tvrx2::get_scaled_if_freq(void)
+{
+ return _tda18272hnm_regs.if_freq * 50e3 / _freq_scalar;
}
-void tvrx2::send_reg(uint8_t start_reg, uint8_t stop_reg){
+void tvrx2::send_reg(uint8_t start_reg, uint8_t stop_reg)
+{
start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x43));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x43));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x43));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t) - 1){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1 ? sizeof(uint32_t) - 1 : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t) - 1) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) - 1
+ ? sizeof(uint32_t) - 1
+ : stop_reg - start_addr + 1;
- //create buffer for register data (+1 for start address)
+ // create buffer for register data (+1 for start address)
byte_vector_t regs_vector(num_bytes + 1);
- //first byte is the address of first register
+ // first byte is the address of first register
regs_vector[0] = start_addr;
- //get the register data
- for(int i=0; i<num_bytes; i++){
- regs_vector[1+i] = _tda18272hnm_regs.get_reg(start_addr+i);
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s, 0x%02x): send reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % (get_subdev_name()) % int(tvrx2_sd_name_to_i2c_addr[get_subdev_name()]) % int(start_addr+i) % int(regs_vector[1+i]) % int(start_addr) % num_bytes ;
+ // get the register data
+ for (int i = 0; i < num_bytes; i++) {
+ regs_vector[1 + i] = _tda18272hnm_regs.get_reg(start_addr + i);
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s, 0x%02x): send reg 0x%02x, value 0x%04x, "
+ "start_addr = 0x%04x, num_bytes %d")
+ % (get_subdev_name())
+ % int(tvrx2_sd_name_to_i2c_addr[get_subdev_name()])
+ % int(start_addr + i) % int(regs_vector[1 + i]) % int(start_addr)
+ % num_bytes;
}
- //send the data
+ // send the data
this->get_iface()->write_i2c(
- tvrx2_sd_name_to_i2c_addr[get_subdev_name()], regs_vector
- );
+ tvrx2_sd_name_to_i2c_addr[get_subdev_name()], regs_vector);
}
}
-void tvrx2::read_reg(uint8_t start_reg, uint8_t stop_reg){
+void tvrx2::read_reg(uint8_t start_reg, uint8_t stop_reg)
+{
static const uint8_t status_addr = 0x0;
- start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x43));
- stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x43));
+ start_reg = uint8_t(uhd::clip(int(start_reg), 0x0, 0x43));
+ stop_reg = uint8_t(uhd::clip(int(stop_reg), 0x0, 0x43));
- for(uint8_t start_addr=start_reg; start_addr <= stop_reg; start_addr += sizeof(uint32_t)){
- int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t)) ? sizeof(uint32_t) : stop_reg - start_addr + 1;
+ for (uint8_t start_addr = start_reg; start_addr <= stop_reg;
+ start_addr += sizeof(uint32_t)) {
+ int num_bytes = int(stop_reg - start_addr + 1) > int(sizeof(uint32_t))
+ ? sizeof(uint32_t)
+ : stop_reg - start_addr + 1;
- //create buffer for starting address
+ // create buffer for starting address
byte_vector_t start_address_vector(1);
- //first byte is the address of first register
+ // first byte is the address of first register
start_address_vector[0] = start_addr;
- //send the start address
+ // send the start address
this->get_iface()->write_i2c(
- tvrx2_sd_name_to_i2c_addr[get_subdev_name()], start_address_vector
- );
+ tvrx2_sd_name_to_i2c_addr[get_subdev_name()], start_address_vector);
- //create buffer for register data
+ // create buffer for register data
byte_vector_t regs_vector(num_bytes);
- //read from i2c
+ // read from i2c
regs_vector = this->get_iface()->read_i2c(
- tvrx2_sd_name_to_i2c_addr[get_subdev_name()], num_bytes
- );
+ tvrx2_sd_name_to_i2c_addr[get_subdev_name()], num_bytes);
- for(uint8_t i=0; i < num_bytes; i++){
- if (i + start_addr >= status_addr){
+ for (uint8_t i = 0; i < num_bytes; i++) {
+ if (i + start_addr >= status_addr) {
_tda18272hnm_regs.set_reg(i + start_addr, regs_vector[i]);
}
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s, 0x%02x): read reg 0x%02x, value 0x%04x, start_addr = 0x%04x, num_bytes %d"
- ) % (get_subdev_name()) % int(tvrx2_sd_name_to_i2c_addr[get_subdev_name()]) % int(start_addr+i) % int(regs_vector[i]) % int(start_addr) % num_bytes ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format("TVRX2 (%s, 0x%02x): read reg 0x%02x, value 0x%04x, "
+ "start_addr = 0x%04x, num_bytes %d")
+ % (get_subdev_name())
+ % int(tvrx2_sd_name_to_i2c_addr[get_subdev_name()])
+ % int(start_addr + i) % int(regs_vector[i]) % int(start_addr)
+ % num_bytes;
}
}
}
@@ -1185,56 +1237,65 @@ void tvrx2::read_reg(uint8_t start_reg, uint8_t stop_reg){
**********************************************************************/
freq_range_t tvrx2::get_tda18272_rfcal_result_freq_range(uint32_t result)
{
-
- uhd::dict<uint32_t, freq_range_t> result_to_cal_freq_ranges_map = map_list_of
- ( 0, freq_range_t(
- (double) tvrx2_tda18272_cal_map[0].cal_freq[_tda18272hnm_regs.rfcal_freq0] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[1].cal_freq[_tda18272hnm_regs.rfcal_freq1] * _freq_scalar
- ) )
- ( 1, freq_range_t(
- (double) tvrx2_tda18272_cal_map[1].cal_freq[_tda18272hnm_regs.rfcal_freq1] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[2].cal_freq[_tda18272hnm_regs.rfcal_freq2] * _freq_scalar
- ) )
- ( 2, freq_range_t(
- (double) tvrx2_tda18272_cal_map[2].cal_freq[_tda18272hnm_regs.rfcal_freq2] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[3].cal_freq[_tda18272hnm_regs.rfcal_freq3] * _freq_scalar
- ) )
- ( 3, freq_range_t(
- (double) tvrx2_tda18272_cal_map[3].cal_freq[_tda18272hnm_regs.rfcal_freq3] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[4].cal_freq[_tda18272hnm_regs.rfcal_freq4] * _freq_scalar
- ) )
- ( 4, freq_range_t(
- (double) tvrx2_tda18272_cal_map[4].cal_freq[_tda18272hnm_regs.rfcal_freq4] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[5].cal_freq[_tda18272hnm_regs.rfcal_freq5] * _freq_scalar
- ) )
- ( 5, freq_range_t(
- (double) tvrx2_tda18272_cal_map[5].cal_freq[_tda18272hnm_regs.rfcal_freq5] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[6].cal_freq[_tda18272hnm_regs.rfcal_freq6] * _freq_scalar
- ) )
- ( 6, freq_range_t(
- (double) tvrx2_tda18272_cal_map[6].cal_freq[_tda18272hnm_regs.rfcal_freq6] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[7].cal_freq[_tda18272hnm_regs.rfcal_freq7] * _freq_scalar
- ) )
- ( 7, freq_range_t(
- (double) tvrx2_tda18272_cal_map[7].cal_freq[_tda18272hnm_regs.rfcal_freq7] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[8].cal_freq[_tda18272hnm_regs.rfcal_freq8] * _freq_scalar
- ) )
- ( 8, freq_range_t(
- (double) tvrx2_tda18272_cal_map[8].cal_freq[_tda18272hnm_regs.rfcal_freq8] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[9].cal_freq[_tda18272hnm_regs.rfcal_freq9] * _freq_scalar
- ) )
- ( 9, freq_range_t(
- (double) tvrx2_tda18272_cal_map[9].cal_freq[_tda18272hnm_regs.rfcal_freq9] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[10].cal_freq[_tda18272hnm_regs.rfcal_freq10] * _freq_scalar
- ) )
- (10, freq_range_t(
- (double) tvrx2_tda18272_cal_map[10].cal_freq[_tda18272hnm_regs.rfcal_freq10] * _freq_scalar,
- (double) tvrx2_tda18272_cal_map[11].cal_freq[_tda18272hnm_regs.rfcal_freq11] * _freq_scalar
- ) )
- ;
+ uhd::dict<uint32_t, freq_range_t> result_to_cal_freq_ranges_map = map_list_of(0,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[0].cal_freq[_tda18272hnm_regs.rfcal_freq0]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[1].cal_freq[_tda18272hnm_regs.rfcal_freq1]
+ * _freq_scalar))(1,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[1].cal_freq[_tda18272hnm_regs.rfcal_freq1]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[2].cal_freq[_tda18272hnm_regs.rfcal_freq2]
+ * _freq_scalar))(2,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[2].cal_freq[_tda18272hnm_regs.rfcal_freq2]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[3].cal_freq[_tda18272hnm_regs.rfcal_freq3]
+ * _freq_scalar))(3,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[3].cal_freq[_tda18272hnm_regs.rfcal_freq3]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[4].cal_freq[_tda18272hnm_regs.rfcal_freq4]
+ * _freq_scalar))(4,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[4].cal_freq[_tda18272hnm_regs.rfcal_freq4]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[5].cal_freq[_tda18272hnm_regs.rfcal_freq5]
+ * _freq_scalar))(5,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[5].cal_freq[_tda18272hnm_regs.rfcal_freq5]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[6].cal_freq[_tda18272hnm_regs.rfcal_freq6]
+ * _freq_scalar))(6,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[6].cal_freq[_tda18272hnm_regs.rfcal_freq6]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[7].cal_freq[_tda18272hnm_regs.rfcal_freq7]
+ * _freq_scalar))(7,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[7].cal_freq[_tda18272hnm_regs.rfcal_freq7]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[8].cal_freq[_tda18272hnm_regs.rfcal_freq8]
+ * _freq_scalar))(8,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[8].cal_freq[_tda18272hnm_regs.rfcal_freq8]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[9].cal_freq[_tda18272hnm_regs.rfcal_freq9]
+ * _freq_scalar))(9,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[9].cal_freq[_tda18272hnm_regs.rfcal_freq9]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[10].cal_freq[_tda18272hnm_regs.rfcal_freq10]
+ * _freq_scalar))(10,
+ freq_range_t(
+ (double)tvrx2_tda18272_cal_map[10].cal_freq[_tda18272hnm_regs.rfcal_freq10]
+ * _freq_scalar,
+ (double)tvrx2_tda18272_cal_map[11].cal_freq[_tda18272hnm_regs.rfcal_freq11]
+ * _freq_scalar));
if (result < 11)
- return result_to_cal_freq_ranges_map[result];
+ return result_to_cal_freq_ranges_map[result];
else
return freq_range_t(0.0, 0.0);
}
@@ -1245,53 +1306,52 @@ freq_range_t tvrx2::get_tda18272_rfcal_result_freq_range(uint32_t result)
*/
void tvrx2::tvrx2_tda18272_init_rfcal(void)
{
-
/* read byte 0x38-0x43 */
read_reg(0x38, 0x43);
- uhd::dict<uint32_t, uint8_t> result_to_cal_regs = map_list_of
- ( 0, _tda18272hnm_regs.rfcal_log_1)
- ( 1, _tda18272hnm_regs.rfcal_log_2)
- ( 2, _tda18272hnm_regs.rfcal_log_3)
- ( 3, _tda18272hnm_regs.rfcal_log_4)
- ( 4, _tda18272hnm_regs.rfcal_log_5)
- ( 5, _tda18272hnm_regs.rfcal_log_6)
- ( 6, _tda18272hnm_regs.rfcal_log_7)
- ( 7, _tda18272hnm_regs.rfcal_log_8)
- ( 8, _tda18272hnm_regs.rfcal_log_9)
- ( 9, _tda18272hnm_regs.rfcal_log_10)
- (10, _tda18272hnm_regs.rfcal_log_11)
- (11, _tda18272hnm_regs.rfcal_log_12)
- ;
+ uhd::dict<uint32_t, uint8_t> result_to_cal_regs =
+ map_list_of(0, _tda18272hnm_regs.rfcal_log_1)(1, _tda18272hnm_regs.rfcal_log_2)(
+ 2, _tda18272hnm_regs.rfcal_log_3)(3, _tda18272hnm_regs.rfcal_log_4)(
+ 4, _tda18272hnm_regs.rfcal_log_5)(5, _tda18272hnm_regs.rfcal_log_6)(
+ 6, _tda18272hnm_regs.rfcal_log_7)(7, _tda18272hnm_regs.rfcal_log_8)(
+ 8, _tda18272hnm_regs.rfcal_log_9)(9, _tda18272hnm_regs.rfcal_log_10)(
+ 10, _tda18272hnm_regs.rfcal_log_11)(11, _tda18272hnm_regs.rfcal_log_12);
// Loop through rfcal_log_* registers, initialize _rfcal_results
- for(const uint32_t &result: result_to_cal_regs.keys())
- _rfcal_results[result].delta_c = result_to_cal_regs[result] > 63 ? result_to_cal_regs[result] - 128 : result_to_cal_regs[result];
+ for (const uint32_t& result : result_to_cal_regs.keys())
+ _rfcal_results[result].delta_c = result_to_cal_regs[result] > 63
+ ? result_to_cal_regs[result] - 128
+ : result_to_cal_regs[result];
/* read byte 0x26-0x2B */
read_reg(0x26, 0x2B);
// Loop through rfcal_byte_* registers, initialize _rfcal_coeffs
- for(const uint32_t &subband: _rfcal_coeffs.keys())
- {
+ for (const uint32_t& subband : _rfcal_coeffs.keys()) {
freq_range_t subband_freqs;
uint32_t result = _rfcal_coeffs[subband].cal_number;
subband_freqs = get_tda18272_rfcal_result_freq_range(result);
- _rfcal_coeffs[subband].RF_B1 = _rfcal_results[result].delta_c + tvrx2_tda18272_cal_map[result].c_offset[_rfcal_results[result].c_offset];
+ _rfcal_coeffs[subband].RF_B1 =
+ _rfcal_results[result].delta_c
+ + tvrx2_tda18272_cal_map[result].c_offset[_rfcal_results[result].c_offset];
- uint32_t quotient = (((_rfcal_results[result+1].delta_c + tvrx2_tda18272_cal_map[result+1].c_offset[_rfcal_results[result].c_offset])
- - (_rfcal_results[result].delta_c + tvrx2_tda18272_cal_map[result].c_offset[_rfcal_results[result].c_offset])) * 1000000);
+ uint32_t quotient = (((_rfcal_results[result + 1].delta_c
+ + tvrx2_tda18272_cal_map[result + 1]
+ .c_offset[_rfcal_results[result].c_offset])
+ - (_rfcal_results[result].delta_c
+ + tvrx2_tda18272_cal_map[result]
+ .c_offset[_rfcal_results[result].c_offset]))
+ * 1000000);
- uint32_t divisor = ((int32_t)(subband_freqs.stop() - subband_freqs.start())/1000);
+ uint32_t divisor =
+ ((int32_t)(subband_freqs.stop() - subband_freqs.start()) / 1000);
_rfcal_coeffs[subband].RF_A1 = quotient / divisor;
-
}
-
}
/*
@@ -1299,97 +1359,101 @@ void tvrx2::tvrx2_tda18272_init_rfcal(void)
*/
void tvrx2::tvrx2_tda18272_tune_rf_filter(uint32_t uRF)
{
- uint32_t uCounter = 0;
- uint8_t cal_result = 0;
- uint32_t uRFCal0 = 0;
- uint32_t uRFCal1 = 0;
- uint8_t subband = 0;
- int32_t cProg = 0;
- uint8_t gain_taper = 0;
- uint8_t RFBand = 0;
- int32_t RF_A1 = 0;
- int32_t RF_B1 = 0;
- freq_range_t subband_freqs;
+ uint32_t uCounter = 0;
+ uint8_t cal_result = 0;
+ uint32_t uRFCal0 = 0;
+ uint32_t uRFCal1 = 0;
+ uint8_t subband = 0;
+ int32_t cProg = 0;
+ uint8_t gain_taper = 0;
+ uint8_t RFBand = 0;
+ int32_t RF_A1 = 0;
+ int32_t RF_B1 = 0;
+ freq_range_t subband_freqs;
/* read byte 0x26-0x2B */
read_reg(0x26, 0x2B);
subband_freqs = get_tda18272_rfcal_result_freq_range(1);
- uRFCal0 = uint32_t(subband_freqs.start());
+ uRFCal0 = uint32_t(subband_freqs.start());
subband_freqs = get_tda18272_rfcal_result_freq_range(4);
- uRFCal1 = uint32_t(subband_freqs.start());
+ uRFCal1 = uint32_t(subband_freqs.start());
- if(uRF < uRFCal0)
+ if (uRF < uRFCal0)
subband = 0;
- else if(uRF < 145700000)
+ else if (uRF < 145700000)
subband = 1;
- else if(uRF < uRFCal1)
+ else if (uRF < uRFCal1)
subband = 2;
- else if(uRF < 367400000)
+ else if (uRF < 367400000)
subband = 3;
- else
- {
+ else {
subband_freqs = get_tda18272_rfcal_result_freq_range(7);
- uRFCal0 = uint32_t(subband_freqs.start());
+ uRFCal0 = uint32_t(subband_freqs.start());
subband_freqs = get_tda18272_rfcal_result_freq_range(10);
- uRFCal1 = uint32_t(subband_freqs.start());
+ uRFCal1 = uint32_t(subband_freqs.start());
- if(uRF < uRFCal0)
+ if (uRF < uRFCal0)
subband = 4;
- else if(uRF < 625000000)
+ else if (uRF < 625000000)
subband = 5;
- else if(uRF < uRFCal1)
+ else if (uRF < uRFCal1)
subband = 6;
else
subband = 7;
}
- cal_result = _rfcal_coeffs[subband].cal_number;
+ cal_result = _rfcal_coeffs[subband].cal_number;
subband_freqs = get_tda18272_rfcal_result_freq_range(cal_result);
- uRFCal0 = uint32_t(subband_freqs.start());
+ uRFCal0 = uint32_t(subband_freqs.start());
RF_A1 = _rfcal_coeffs[subband].RF_A1;
RF_B1 = _rfcal_coeffs[subband].RF_B1;
uCounter = 0;
- do uCounter ++;
- while (uRF >= tvrx2_tda18272_freq_map[uCounter].rf_max && uCounter < TVRX2_TDA18272_FREQ_MAP_ENTRIES);
+ do
+ uCounter++;
+ while (uRF >= tvrx2_tda18272_freq_map[uCounter].rf_max
+ && uCounter < TVRX2_TDA18272_FREQ_MAP_ENTRIES);
- cProg = tvrx2_tda18272_freq_map[uCounter - 1].c_prog;
+ cProg = tvrx2_tda18272_freq_map[uCounter - 1].c_prog;
gain_taper = tvrx2_tda18272_freq_map[uCounter - 1].gain_taper;
- RFBand = tvrx2_tda18272_freq_map[uCounter - 1].rf_band;
+ RFBand = tvrx2_tda18272_freq_map[uCounter - 1].rf_band;
- cProg = (int32_t)(cProg + RF_B1 + (RF_A1*((int32_t)(uRF - uRFCal0)/1000))/1000000);
+ cProg =
+ (int32_t)(cProg + RF_B1 + (RF_A1 * ((int32_t)(uRF - uRFCal0) / 1000)) / 1000000);
- if(cProg>255) cProg = 255;
- if(cProg<0) cProg = 0;
+ if (cProg > 255)
+ cProg = 255;
+ if (cProg < 0)
+ cProg = 0;
_tda18272hnm_regs.rf_filter_bypass = 1;
- _tda18272hnm_regs.rf_filter_cap = (uint8_t) cProg;
- _tda18272hnm_regs.gain_taper = gain_taper;
- _tda18272hnm_regs.rf_filter_band = RFBand;
-
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Software Calibration:\n"
- "\tRF Filter Bypass = %d\n"
- "\tRF Filter Cap = %d\n"
- "\tRF Filter Band = %d\n"
- "\tGain Taper = %d\n")
- % (get_subdev_name())
- % int(_tda18272hnm_regs.rf_filter_bypass)
- % int(_tda18272hnm_regs.rf_filter_cap)
- % int(_tda18272hnm_regs.rf_filter_band)
- % int(_tda18272hnm_regs.gain_taper)
- ;
+ _tda18272hnm_regs.rf_filter_cap = (uint8_t)cProg;
+ _tda18272hnm_regs.gain_taper = gain_taper;
+ _tda18272hnm_regs.rf_filter_band = RFBand;
+
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): Software Calibration:\n"
+ "\tRF Filter Bypass = %d\n"
+ "\tRF Filter Cap = %d\n"
+ "\tRF Filter Band = %d\n"
+ "\tGain Taper = %d\n")
+ % (get_subdev_name())
+ % int(_tda18272hnm_regs.rf_filter_bypass)
+ % int(_tda18272hnm_regs.rf_filter_cap)
+ % int(_tda18272hnm_regs.rf_filter_band)
+ % int(_tda18272hnm_regs.gain_taper);
send_reg(0x2c, 0x2f);
}
-void tvrx2::soft_calibration(void){
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Software Calibration: Initialize Tuner, Calibrate and Standby\n") % (get_subdev_name()) ;
+void tvrx2::soft_calibration(void)
+{
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): Software Calibration: "
+ "Initialize Tuner, Calibrate and Standby\n")
+ % (get_subdev_name());
- _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
+ _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
_tda18272hnm_regs.sm_lna = tda18272hnm_regs_t::SM_LNA_ON;
_tda18272hnm_regs.sm_pll = tda18272hnm_regs_t::SM_PLL_ON;
@@ -1414,20 +1478,20 @@ void tvrx2::soft_calibration(void){
send_reg(0x26, 0x2B);
- _tda18272hnm_regs.set_reg(0x19, 0x3B); //set MSM_byte_1 for calibration per datasheet
- _tda18272hnm_regs.set_reg(0x1A, 0x01); //set MSM_byte_2 for launching calibration
+ _tda18272hnm_regs.set_reg(0x19, 0x3B); // set MSM_byte_1 for calibration per datasheet
+ _tda18272hnm_regs.set_reg(0x1A, 0x01); // set MSM_byte_2 for launching calibration
send_reg(0x19, 0x1A);
wait_irq();
- send_reg(0x1D, 0x1D); //Fmax_LO
- send_reg(0x0C, 0x0C); //LT_Enable
- send_reg(0x1B, 0x1B); //PSM_AGC1
- send_reg(0x0C, 0x0C); //AGC1_6_15dB
+ send_reg(0x1D, 0x1D); // Fmax_LO
+ send_reg(0x0C, 0x0C); // LT_Enable
+ send_reg(0x1B, 0x1B); // PSM_AGC1
+ send_reg(0x0C, 0x0C); // AGC1_6_15dB
- //set spread spectrum for clock
- //FIXME: NXP turns clock spread on and off
+ // set spread spectrum for clock
+ // FIXME: NXP turns clock spread on and off
// based on where clock spurs would be relative to RF frequency
// we should do this also
_tda18272hnm_regs.digital_clock = tda18272hnm_regs_t::DIGITAL_CLOCK_SPREAD_OFF;
@@ -1437,18 +1501,19 @@ void tvrx2::soft_calibration(void){
else
//_tda18272hnm_regs.xtout = tda18272hnm_regs_t::XTOUT_NO;
_tda18272hnm_regs.xtout = tda18272hnm_regs_t::XTOUT_16MHZ;
-
+
send_reg(0x14, 0x14);
- _tda18272hnm_regs.set_reg(0x36, 0x0E); //sets clock mode
+ _tda18272hnm_regs.set_reg(0x36, 0x0E); // sets clock mode
send_reg(0x36, 0x36);
- //go to standby mode
+ // go to standby mode
_tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_STANDBY;
send_reg(0x6, 0x6);
}
-void tvrx2::test_rf_filter_robustness(void){
+void tvrx2::test_rf_filter_robustness(void)
+{
typedef uhd::dict<std::string, std::string> tvrx2_filter_ratings_t;
typedef uhd::dict<std::string, double> tvrx2_filter_margins_t;
@@ -1457,62 +1522,123 @@ void tvrx2::test_rf_filter_robustness(void){
read_reg(0x38, 0x43);
- uhd::dict<std::string, uint8_t> filter_cal_regs = map_list_of
- ("VHFLow_0", 0x38)
- ("VHFLow_1", 0x3a)
- ("VHFHigh_0", 0x3b)
- ("VHFHigh_1", 0x3d)
- ("UHFLow_0", 0x3e)
- ("UHFLow_1", 0x40)
- ("UHFHigh_0", 0x41)
- ("UHFHigh_1", 0x43)
- ;
-
- for(const std::string &name: filter_cal_regs.keys()){
+ uhd::dict<std::string, uint8_t> filter_cal_regs = map_list_of("VHFLow_0", 0x38)(
+ "VHFLow_1", 0x3a)("VHFHigh_0", 0x3b)("VHFHigh_1", 0x3d)("UHFLow_0", 0x3e)(
+ "UHFLow_1", 0x40)("UHFHigh_0", 0x41)("UHFHigh_1", 0x43);
+
+ for (const std::string& name : filter_cal_regs.keys()) {
uint8_t cal_result = _tda18272hnm_regs.get_reg(filter_cal_regs[name]);
if (cal_result & 0x80) {
_filter_ratings.set(name, "E");
_filter_margins.set(name, 0.0);
- }
- else {
+ } else {
double partial;
if (name == "VHFLow_0")
- partial = 100 * (45 - 39.8225 * (1 + (0.31 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0)) / 45.0;
+ partial = 100
+ * (45
+ - 39.8225
+ * (1
+ + (0.31
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0))
+ / 45.0;
else if (name == "VHFLow_1")
- partial = 100 * (152.1828 * (1 + (1.53 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0) - (144.896 - 6)) / (144.896 - 6);
+ partial = 100
+ * (152.1828
+ * (1
+ + (1.53
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0)
+ - (144.896 - 6))
+ / (144.896 - 6);
else if (name == "VHFHigh_0")
- partial = 100 * ((144.896 + 6) - 135.4063 * (1 + (0.27 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0)) / (144.896 + 6);
+ partial = 100
+ * ((144.896 + 6)
+ - 135.4063
+ * (1
+ + (0.27
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0))
+ / (144.896 + 6);
else if (name == "VHFHigh_1")
- partial = 100 * (383.1455 * (1 + (0.91 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0) - (367.104 - 8)) / (367.104 - 8);
+ partial = 100
+ * (383.1455
+ * (1
+ + (0.91
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0)
+ - (367.104 - 8))
+ / (367.104 - 8);
else if (name == "UHFLow_0")
- partial = 100 * ((367.104 + 8) - 342.6224 * (1 + (0.21 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0)) / (367.104 + 8);
+ partial = 100
+ * ((367.104 + 8)
+ - 342.6224
+ * (1
+ + (0.21
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0))
+ / (367.104 + 8);
else if (name == "UHFLow_1")
- partial = 100 * (662.5595 * (1 + (0.33 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0) - (624.128 - 2)) / (624.128 - 2);
+ partial = 100
+ * (662.5595
+ * (1
+ + (0.33
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0)
+ - (624.128 - 2))
+ / (624.128 - 2);
else if (name == "UHFHigh_0")
- partial = 100 * ((624.128 + 2) - 508.2747 * (1 + (0.23 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0)) / (624.128 + 2);
+ partial = 100
+ * ((624.128 + 2)
+ - 508.2747
+ * (1
+ + (0.23
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0))
+ / (624.128 + 2);
else if (name == "UHFHigh_1")
- partial = 100 * (947.8913 * (1 + (0.3 * (cal_result < 64 ? cal_result : cal_result - 128)) / 1.0 / 100.0) - (866 - 14)) / (866 - 14);
+ partial = 100
+ * (947.8913
+ * (1
+ + (0.3
+ * (cal_result < 64 ? cal_result
+ : cal_result - 128))
+ / 1.0 / 100.0)
+ - (866 - 14))
+ / (866 - 14);
else
UHD_THROW_INVALID_CODE_PATH();
- _filter_margins.set(name, 0.0024 * partial * partial * partial - 0.101 * partial * partial + 1.629 * partial + 1.8266);
+ _filter_margins.set(name,
+ 0.0024 * partial * partial * partial - 0.101 * partial * partial
+ + 1.629 * partial + 1.8266);
_filter_ratings.set(name, _filter_margins[name] >= 0.0 ? "H" : "L");
}
}
std::stringstream robustness_message;
- robustness_message << boost::format("TVRX2 (%s): RF Filter Robustness Results:") % (get_subdev_name());
- for(const std::string &name: uhd::sorted(_filter_ratings.keys())){
- robustness_message << boost::format("\t%s:\tMargin = %0.2f,\tRobustness = %c") % name % (_filter_margins[name]) % (_filter_ratings[name]);
+ robustness_message << boost::format("TVRX2 (%s): RF Filter Robustness Results:")
+ % (get_subdev_name());
+ for (const std::string& name : uhd::sorted(_filter_ratings.keys())) {
+ robustness_message << boost::format("\t%s:\tMargin = %0.2f,\tRobustness = %c")
+ % name % (_filter_margins[name])
+ % (_filter_ratings[name]);
}
UHD_LOGGER_DEBUG("TVRX") << robustness_message.str();
@@ -1521,14 +1647,17 @@ void tvrx2::test_rf_filter_robustness(void){
/***********************************************************************
* TDA18272 State Functions
**********************************************************************/
-void tvrx2::transition_0(void){
- //Transition 0: Initialize Tuner and place in standby
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Transition 0: Initialize Tuner, Calibrate and Standby\n") % (get_subdev_name()) ;
+void tvrx2::transition_0(void)
+{
+ // Transition 0: Initialize Tuner and place in standby
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format(
+ "\nTVRX2 (%s): Transition 0: Initialize Tuner, Calibrate and Standby\n")
+ % (get_subdev_name());
- //Check for Power-On Reset, if reset, initialze tuner
+ // Check for Power-On Reset, if reset, initialze tuner
if (get_power_reset()) {
- _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
+ _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
_tda18272hnm_regs.sm_lna = tda18272hnm_regs_t::SM_LNA_ON;
_tda18272hnm_regs.sm_pll = tda18272hnm_regs_t::SM_PLL_ON;
@@ -1537,24 +1666,25 @@ void tvrx2::transition_0(void){
read_reg(0x19, 0x1A);
- _tda18272hnm_regs.set_reg(0x19, 0x3B); //set MSM_byte_1 for calibration per datasheet
- _tda18272hnm_regs.set_reg(0x1A, 0x01); //set MSM_byte_2 for launching calibration
+ _tda18272hnm_regs.set_reg(
+ 0x19, 0x3B); // set MSM_byte_1 for calibration per datasheet
+ _tda18272hnm_regs.set_reg(0x1A, 0x01); // set MSM_byte_2 for launching calibration
send_reg(0x19, 0x1A);
wait_irq();
}
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
- send_reg(0x1D, 0x1D); //Fmax_LO
- send_reg(0x0C, 0x0C); //LT_Enable
- send_reg(0x1B, 0x1B); //PSM_AGC1
- send_reg(0x0C, 0x0C); //AGC1_6_15dB
+ send_reg(0x1D, 0x1D); // Fmax_LO
+ send_reg(0x0C, 0x0C); // LT_Enable
+ send_reg(0x1B, 0x1B); // PSM_AGC1
+ send_reg(0x0C, 0x0C); // AGC1_6_15dB
- //set spread spectrum for clock
- //FIXME: NXP turns clock spread on and off
+ // set spread spectrum for clock
+ // FIXME: NXP turns clock spread on and off
// based on where clock spurs would be relative to RF frequency
// we should do this also
_tda18272hnm_regs.digital_clock = tda18272hnm_regs_t::DIGITAL_CLOCK_SPREAD_OFF;
@@ -1564,199 +1694,224 @@ void tvrx2::transition_0(void){
else
//_tda18272hnm_regs.xtout = tda18272hnm_regs_t::XTOUT_NO;
_tda18272hnm_regs.xtout = tda18272hnm_regs_t::XTOUT_16MHZ;
-
+
send_reg(0x14, 0x14);
- _tda18272hnm_regs.set_reg(0x36, 0x0E); //sets clock mode
+ _tda18272hnm_regs.set_reg(0x36, 0x0E); // sets clock mode
send_reg(0x36, 0x36);
- //go to standby mode
+ // go to standby mode
_tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_STANDBY;
send_reg(0x6, 0x6);
}
-void tvrx2::transition_1(void){
- //Transition 1: Select TV Standard
+void tvrx2::transition_1(void)
+{
+ // Transition 1: Select TV Standard
UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Transition 1: Select TV Standard\n") % (get_subdev_name()) ;
+ "\nTVRX2 (%s): Transition 1: Select TV Standard\n")
+ % (get_subdev_name());
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
- //Choose IF Byte 1 Setting
+ // Choose IF Byte 1 Setting
//_tda18272hnm_regs.if_hp_fc = tda18272hnm_regs_t::IF_HP_FC_0_4MHZ;
//_tda18272hnm_regs.if_notch = tda18272hnm_regs_t::IF_NOTCH_OFF;
//_tda18272hnm_regs.lp_fc_offset = tda18272hnm_regs_t::LP_FC_OFFSET_0_PERCENT;
//_tda18272hnm_regs.lp_fc = tda18272hnm_regs_t::LP_FC_10_0MHZ;
- //send_reg(0x13, 0x13);
+ // send_reg(0x13, 0x13);
- //Choose IR Mixer Byte 2 Setting
+ // Choose IR Mixer Byte 2 Setting
//_tda18272hnm_regs.hi_pass = tda18272hnm_regs_t::HI_PASS_DISABLE;
//_tda18272hnm_regs.dc_notch = tda18272hnm_regs_t::DC_NOTCH_OFF;
send_reg(0x23, 0x23);
- //Set AGC TOP Bytes
+ // Set AGC TOP Bytes
send_reg(0x0C, 0x13);
- //Set PSM Byt1
+ // Set PSM Byt1
send_reg(0x1B, 0x1B);
- //Choose IF Frequency, setting is 50KHz steps
+ // Choose IF Frequency, setting is 50KHz steps
set_scaled_if_freq(_if_freq);
send_reg(0x15, 0x15);
}
-void tvrx2::transition_2(int rf_freq){
- //Transition 2: Select RF Frequency after changing TV Standard
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Transition 2: Select RF Frequency after changing TV Standard\n") % (get_subdev_name()) ;
+void tvrx2::transition_2(int rf_freq)
+{
+ // Transition 2: Select RF Frequency after changing TV Standard
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): Transition 2: Select RF "
+ "Frequency after changing TV Standard\n")
+ % (get_subdev_name());
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
- //Wake up from Standby
- _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
+ // Wake up from Standby
+ _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_NORMAL;
_tda18272hnm_regs.sm_lna = tda18272hnm_regs_t::SM_LNA_ON;
_tda18272hnm_regs.sm_pll = tda18272hnm_regs_t::SM_PLL_ON;
-
+
send_reg(0x6, 0x6);
-
- //Set Clock Mode
+
+ // Set Clock Mode
_tda18272hnm_regs.set_reg(0x36, 0x00);
send_reg(0x36, 0x36);
-
- //Set desired RF Frequency
+
+ // Set desired RF Frequency
set_scaled_rf_freq(rf_freq);
send_reg(0x16, 0x18);
-
- //Lock PLL and tune RF Filters
- _tda18272hnm_regs.set_reg(0x19, 0x41); //set MSM_byte_1 for RF Filters Tuning, PLL Locking
- _tda18272hnm_regs.set_reg(0x1A, 0x01); //set MSM_byte_2 for launching calibration
-
+
+ // Lock PLL and tune RF Filters
+ _tda18272hnm_regs.set_reg(
+ 0x19, 0x41); // set MSM_byte_1 for RF Filters Tuning, PLL Locking
+ _tda18272hnm_regs.set_reg(0x1A, 0x01); // set MSM_byte_2 for launching calibration
+
send_reg(0x19, 0x1A);
-
+
wait_irq();
tvrx2_tda18272_tune_rf_filter(rf_freq);
////LO Lock state in Reg 0x5 LSB
- //read_reg(0x6, 0x6);
-
+ // read_reg(0x6, 0x6);
}
-void tvrx2::transition_3(void){
- //Transition 3: Standby Mode
+void tvrx2::transition_3(void)
+{
+ // Transition 3: Standby Mode
UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Transition 3: Standby Mode\n") % (get_subdev_name()) ;
+ "\nTVRX2 (%s): Transition 3: Standby Mode\n")
+ % (get_subdev_name());
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
- //Set clock mode
+ // Set clock mode
_tda18272hnm_regs.set_reg(0x36, 0x0E);
send_reg(0x36, 0x36);
- //go to standby mode
- _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_STANDBY;
+ // go to standby mode
+ _tda18272hnm_regs.sm = tda18272hnm_regs_t::SM_STANDBY;
_tda18272hnm_regs.sm_lna = tda18272hnm_regs_t::SM_LNA_OFF;
_tda18272hnm_regs.sm_pll = tda18272hnm_regs_t::SM_PLL_OFF;
send_reg(0x6, 0x6);
}
-void tvrx2::transition_4(int rf_freq){
- //Transition 4: Change RF Frequency without changing TV Standard
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Transition 4: Change RF Frequency without changing TV Standard\n") % (get_subdev_name()) ;
+void tvrx2::transition_4(int rf_freq)
+{
+ // Transition 4: Change RF Frequency without changing TV Standard
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): Transition 4: Change RF "
+ "Frequency without changing TV Standard\n")
+ % (get_subdev_name());
- //send magic xtal_cal_dac setting
+ // send magic xtal_cal_dac setting
send_reg(0x65, 0x65);
- //Set desired RF Frequency
+ // Set desired RF Frequency
set_scaled_rf_freq(rf_freq);
send_reg(0x16, 0x18);
-
- //Lock PLL and tune RF Filters
- _tda18272hnm_regs.set_reg(0x19, 0x41); //set MSM_byte_1 for RF Filters Tuning, PLL Locking
- _tda18272hnm_regs.set_reg(0x1A, 0x01); //set MSM_byte_2 for launching calibration
-
+
+ // Lock PLL and tune RF Filters
+ _tda18272hnm_regs.set_reg(
+ 0x19, 0x41); // set MSM_byte_1 for RF Filters Tuning, PLL Locking
+ _tda18272hnm_regs.set_reg(0x1A, 0x01); // set MSM_byte_2 for launching calibration
+
send_reg(0x19, 0x1A);
-
+
wait_irq();
tvrx2_tda18272_tune_rf_filter(rf_freq);
////LO Lock state in Reg 0x5 LSB
- //read_reg(0x5, 0x6);
-
+ // read_reg(0x5, 0x6);
}
-void tvrx2::wait_irq(void){
- int timeout = 20; //irq waiting timeout in milliseconds
- //int irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) & int(tvrx2_sd_name_to_irq_io[get_subdev_name()]));
+void tvrx2::wait_irq(void)
+{
+ int timeout = 20; // irq waiting timeout in milliseconds
+ // int irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) &
+ // int(tvrx2_sd_name_to_irq_io[get_subdev_name()]));
bool irq = get_irq();
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Waiting on IRQ, subdev = %d, mask = 0x%x, Status: 0x%x\n") % (get_subdev_name()) % get_subdev_name() % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()])) % irq ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format(
+ "\nTVRX2 (%s): Waiting on IRQ, subdev = %d, mask = 0x%x, Status: 0x%x\n")
+ % (get_subdev_name()) % get_subdev_name()
+ % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()])) % irq;
while (not irq and timeout > 0) {
- //irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) & tvrx2_sd_name_to_irq_io[get_subdev_name()]);
+ // irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) &
+ // tvrx2_sd_name_to_irq_io[get_subdev_name()]);
irq = get_irq();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
timeout -= 1;
}
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): IRQ Raised, subdev = %d, mask = 0x%x, Status: 0x%x, Timeout: %d\n") % (get_subdev_name()) % get_subdev_name() % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()])) % irq % timeout ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): IRQ Raised, subdev = %d, "
+ "mask = 0x%x, Status: 0x%x, Timeout: %d\n")
+ % (get_subdev_name()) % get_subdev_name()
+ % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()]))
+ % irq % timeout;
read_reg(0xA, 0xB);
- //UHD_ASSERT_THROW(timeout > 0);
- if(timeout <= 0) UHD_LOGGER_WARNING("TVRX") << boost::format(
- "\nTVRX2 (%s): Timeout waiting on IRQ\n") % (get_subdev_name()) ;
+ // UHD_ASSERT_THROW(timeout > 0);
+ if (timeout <= 0)
+ UHD_LOGGER_WARNING("TVRX")
+ << boost::format("\nTVRX2 (%s): Timeout waiting on IRQ\n")
+ % (get_subdev_name());
_tda18272hnm_regs.irq_clear = tda18272hnm_regs_t::IRQ_CLEAR_TRUE;
send_reg(0xA, 0xA);
read_reg(0xA, 0xB);
- irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) & tvrx2_sd_name_to_irq_io[get_subdev_name()]) > 0;
+ irq = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX)
+ & tvrx2_sd_name_to_irq_io[get_subdev_name()])
+ > 0;
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): Cleared IRQ, subdev = %d, mask = 0x%x, Status: 0x%x\n") % (get_subdev_name()) % get_subdev_name() % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()])) % irq ;
+ UHD_LOGGER_TRACE("TVRX")
+ << boost::format(
+ "\nTVRX2 (%s): Cleared IRQ, subdev = %d, mask = 0x%x, Status: 0x%x\n")
+ % (get_subdev_name()) % get_subdev_name()
+ % (int(tvrx2_sd_name_to_irq_io[get_subdev_name()])) % irq;
}
-
/***********************************************************************
* Tuning
**********************************************************************/
-double tvrx2::set_lo_freq(double target_freq){
- //target_freq = std::clip(target_freq, tvrx2_freq_range.min, tvrx2_freq_range.max);
+double tvrx2::set_lo_freq(double target_freq)
+{
+ // target_freq = std::clip(target_freq, tvrx2_freq_range.min, tvrx2_freq_range.max);
read_reg(0x6, 0x6);
if (_tda18272hnm_regs.sm == tda18272hnm_regs_t::SM_STANDBY) {
- transition_2(int(target_freq + _bandwidth/2 - get_scaled_if_freq()));
+ transition_2(int(target_freq + _bandwidth / 2 - get_scaled_if_freq()));
} else {
- transition_4(int(target_freq + _bandwidth/2 - get_scaled_if_freq()));
+ transition_4(int(target_freq + _bandwidth / 2 - get_scaled_if_freq()));
}
read_reg(0x16, 0x18);
- //compute actual tuned frequency
+ // compute actual tuned frequency
_lo_freq = get_scaled_rf_freq() + get_scaled_if_freq(); // - _bandwidth/2;
- //debug output of calculated variables
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): LO Frequency\n"
- "\tRequested: \t%f\n"
- "\tComputed: \t%f\n"
- "\tReadback: \t%f\n"
- "\tIF Frequency: \t%f\n") % (get_subdev_name()) % target_freq % double(int(target_freq/1e3)*1e3) % get_scaled_rf_freq() % get_scaled_if_freq() ;
+ // debug output of calculated variables
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): LO Frequency\n"
+ "\tRequested: \t%f\n"
+ "\tComputed: \t%f\n"
+ "\tReadback: \t%f\n"
+ "\tIF Frequency: \t%f\n")
+ % (get_subdev_name()) % target_freq
+ % double(int(target_freq / 1e3) * 1e3)
+ % get_scaled_rf_freq() % get_scaled_if_freq();
get_locked();
test_rf_filter_robustness();
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "\nTVRX2 (%s): RSSI = %f dBm\n"
- ) % (get_subdev_name()) % (get_rssi().to_real()) ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("\nTVRX2 (%s): RSSI = %f dBm\n")
+ % (get_subdev_name()) % (get_rssi().to_real());
return _lo_freq;
}
@@ -1767,37 +1922,40 @@ double tvrx2::set_lo_freq(double target_freq){
/*
* Convert the requested gain into a dac voltage
*/
-static double gain_to_if_gain_dac(double &gain){
- //clip the input
+static double gain_to_if_gain_dac(double& gain)
+{
+ // clip the input
gain = tvrx2_gain_ranges["IF"].clip(gain);
- //voltage level constants
+ // voltage level constants
static const double max_volts = double(1.7), min_volts = double(0.5);
- static const double slope = (max_volts-min_volts)/tvrx2_gain_ranges["IF"].stop();
+ static const double slope = (max_volts - min_volts) / tvrx2_gain_ranges["IF"].stop();
- //calculate the voltage for the aux dac
- double dac_volts = gain*slope + min_volts;
+ // calculate the voltage for the aux dac
+ double dac_volts = gain * slope + min_volts;
- UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 IF Gain: %f dB, dac_volts: %f V"
- ) % gain % dac_volts ;
+ UHD_LOGGER_TRACE("TVRX") << boost::format("TVRX2 IF Gain: %f dB, dac_volts: %f V")
+ % gain % dac_volts;
- //the actual gain setting
- gain = (dac_volts - min_volts)/slope;
+ // the actual gain setting
+ gain = (dac_volts - min_volts) / slope;
return dac_volts;
}
-double tvrx2::set_gain(double gain, const std::string &name){
+double tvrx2::set_gain(double gain, const std::string& name)
+{
assert_has(tvrx2_gain_ranges.keys(), name, "tvrx2 gain name");
- if (name == "IF"){
- //write voltage to aux_dac
- this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX, tvrx2_sd_name_to_dac[get_subdev_name()], gain_to_if_gain_dac(gain));
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ if (name == "IF") {
+ // write voltage to aux_dac
+ this->get_iface()->write_aux_dac(dboard_iface::UNIT_RX,
+ tvrx2_sd_name_to_dac[get_subdev_name()],
+ gain_to_if_gain_dac(gain));
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
- //shadow gain setting
+ // shadow gain setting
_gains[name] = gain;
return gain;
@@ -1806,45 +1964,48 @@ double tvrx2::set_gain(double gain, const std::string &name){
/***********************************************************************
* Bandwidth Handling
**********************************************************************/
-static tda18272hnm_regs_t::lp_fc_t bandwidth_to_lp_fc_reg(double &bandwidth){
- int reg = uhd::clip(boost::math::iround((bandwidth-5.0e6)/1.0e6), 0, 4);
-
- switch(reg){
- case 0:
- bandwidth = 1.7e6;
- return tda18272hnm_regs_t::LP_FC_1_7MHZ;
- case 1:
- bandwidth = 6e6;
- return tda18272hnm_regs_t::LP_FC_6_0MHZ;
- case 2:
- bandwidth = 7e6;
- return tda18272hnm_regs_t::LP_FC_7_0MHZ;
- case 3:
- bandwidth = 8e6;
- return tda18272hnm_regs_t::LP_FC_8_0MHZ;
- case 4:
- bandwidth = 10e6;
- return tda18272hnm_regs_t::LP_FC_10_0MHZ;
+static tda18272hnm_regs_t::lp_fc_t bandwidth_to_lp_fc_reg(double& bandwidth)
+{
+ int reg = uhd::clip(boost::math::iround((bandwidth - 5.0e6) / 1.0e6), 0, 4);
+
+ switch (reg) {
+ case 0:
+ bandwidth = 1.7e6;
+ return tda18272hnm_regs_t::LP_FC_1_7MHZ;
+ case 1:
+ bandwidth = 6e6;
+ return tda18272hnm_regs_t::LP_FC_6_0MHZ;
+ case 2:
+ bandwidth = 7e6;
+ return tda18272hnm_regs_t::LP_FC_7_0MHZ;
+ case 3:
+ bandwidth = 8e6;
+ return tda18272hnm_regs_t::LP_FC_8_0MHZ;
+ case 4:
+ bandwidth = 10e6;
+ return tda18272hnm_regs_t::LP_FC_10_0MHZ;
}
UHD_THROW_INVALID_CODE_PATH();
}
-double tvrx2::set_bandwidth(double bandwidth){
- //clip the input
+double tvrx2::set_bandwidth(double bandwidth)
+{
+ // clip the input
bandwidth = tvrx2_bandwidth_range.clip(bandwidth);
- //compute low pass cutoff frequency setting
+ // compute low pass cutoff frequency setting
_tda18272hnm_regs.lp_fc = bandwidth_to_lp_fc_reg(bandwidth);
- //shadow bandwidth setting
+ // shadow bandwidth setting
_bandwidth = bandwidth;
- //update register
+ // update register
send_reg(0x13, 0x13);
UHD_LOGGER_TRACE("TVRX") << boost::format(
- "TVRX2 (%s) Bandwidth (lp_fc): %f Hz, reg: %d"
- ) % (get_subdev_name()) % _bandwidth % (int(_tda18272hnm_regs.lp_fc)) ;
+ "TVRX2 (%s) Bandwidth (lp_fc): %f Hz, reg: %d")
+ % (get_subdev_name()) % _bandwidth
+ % (int(_tda18272hnm_regs.lp_fc));
return _bandwidth;
}
diff --git a/host/lib/usrp/dboard/db_twinrx.cpp b/host/lib/usrp/dboard/db_twinrx.cpp
index 9f9efd158..258dc95a4 100644
--- a/host/lib/usrp/dboard/db_twinrx.cpp
+++ b/host/lib/usrp/dboard/db_twinrx.cpp
@@ -39,76 +39,105 @@ class twinrx_rcvr_fe : public rx_dboard_base
{
public:
twinrx_rcvr_fe(
- ctor_args_t args,
- expert_container::sptr expert,
- twinrx_ctrl::sptr ctrl
- ) :
- rx_dboard_base(args), _expert(expert), _ctrl(ctrl),
- _ch_name(dboard_ctor_args_t::cast(args).sd_name)
+ ctor_args_t args, expert_container::sptr expert, twinrx_ctrl::sptr ctrl)
+ : rx_dboard_base(args)
+ , _expert(expert)
+ , _ctrl(ctrl)
+ , _ch_name(dboard_ctor_args_t::cast(args).sd_name)
{
//---------------------------------------------------------
// Add user-visible, channel specific properties to front-end tree
//---------------------------------------------------------
- //Generic
- get_rx_subtree()->create<std::string>("name")
- .set("TwinRX RX" + _ch_name);
- get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- get_rx_subtree()->create<std::string>("connection")
- .set(_ch_name == "0" ? "II" : "QQ"); //Ch->ADC port mapping
+ // Generic
+ get_rx_subtree()->create<std::string>("name").set("TwinRX RX" + _ch_name);
+ get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ get_rx_subtree()
+ ->create<std::string>("connection")
+ .set(_ch_name == "0" ? "II" : "QQ"); // Ch->ADC port mapping
static const double BW = 80e6;
- get_rx_subtree()->create<double>("bandwidth/value")
- .set(BW);
- get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ get_rx_subtree()->create<double>("bandwidth/value").set(BW);
+ get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(BW, BW));
// Command Time
- expert_factory::add_data_node<time_spec_t>(_expert, prepend_ch("time/rx_frontend", _ch_name), time_spec_t(0.0));
- expert_factory::add_prop_node<time_spec_t>(_expert, get_rx_subtree(),
- "time/cmd", prepend_ch("time/cmd", _ch_name), time_spec_t(0.0));
+ expert_factory::add_data_node<time_spec_t>(
+ _expert, prepend_ch("time/rx_frontend", _ch_name), time_spec_t(0.0));
+ expert_factory::add_prop_node<time_spec_t>(_expert,
+ get_rx_subtree(),
+ "time/cmd",
+ prepend_ch("time/cmd", _ch_name),
+ time_spec_t(0.0));
- //Frequency Specific
- get_rx_subtree()->create<meta_range_t>("freq/range")
+ // Frequency Specific
+ get_rx_subtree()
+ ->create<meta_range_t>("freq/range")
.set(freq_range_t(10e6, 6.0e9));
- expert_factory::add_dual_prop_node<double>(_expert, get_rx_subtree(),
- "freq/value", prepend_ch("freq/desired", _ch_name), prepend_ch("freq/coerced", _ch_name),
- 1.0e9, AUTO_RESOLVE_ON_READ_WRITE);
- get_rx_subtree()->create<device_addr_t>("tune_args")
- .set(device_addr_t());
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "freq/value",
+ prepend_ch("freq/desired", _ch_name),
+ prepend_ch("freq/coerced", _ch_name),
+ 1.0e9,
+ AUTO_RESOLVE_ON_READ_WRITE);
+ get_rx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
static const double DEFAULT_IF_FREQ = 150e6;
meta_range_t if_freq_range;
- if_freq_range.push_back(range_t(-DEFAULT_IF_FREQ-(BW/2), -DEFAULT_IF_FREQ+(BW/2)));
- if_freq_range.push_back(range_t( DEFAULT_IF_FREQ-(BW/2), DEFAULT_IF_FREQ+(BW/2)));
- get_rx_subtree()->create<meta_range_t>("if_freq/range")
- .set(if_freq_range);
- expert_factory::add_dual_prop_node<double>(_expert, get_rx_subtree(),
- "if_freq/value", prepend_ch("if_freq/desired", _ch_name), prepend_ch("if_freq/coerced", _ch_name),
- DEFAULT_IF_FREQ, AUTO_RESOLVE_ON_WRITE);
-
- //LO Specific
- get_rx_subtree()->create<meta_range_t>("los/LO1/freq/range")
+ if_freq_range.push_back(
+ range_t(-DEFAULT_IF_FREQ - (BW / 2), -DEFAULT_IF_FREQ + (BW / 2)));
+ if_freq_range.push_back(
+ range_t(DEFAULT_IF_FREQ - (BW / 2), DEFAULT_IF_FREQ + (BW / 2)));
+ get_rx_subtree()->create<meta_range_t>("if_freq/range").set(if_freq_range);
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "if_freq/value",
+ prepend_ch("if_freq/desired", _ch_name),
+ prepend_ch("if_freq/coerced", _ch_name),
+ DEFAULT_IF_FREQ,
+ AUTO_RESOLVE_ON_WRITE);
+
+ // LO Specific
+ get_rx_subtree()
+ ->create<meta_range_t>("los/LO1/freq/range")
.set(freq_range_t(2.0e9, 6.8e9));
- expert_factory::add_dual_prop_node<double>(_expert, get_rx_subtree(),
- "los/LO1/freq/value", prepend_ch("los/LO1/freq/desired", _ch_name), prepend_ch("los/LO1/freq/coerced", _ch_name),
- 0.0, AUTO_RESOLVE_ON_READ_WRITE);
- get_rx_subtree()->create<meta_range_t>("los/LO2/freq/range")
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "los/LO1/freq/value",
+ prepend_ch("los/LO1/freq/desired", _ch_name),
+ prepend_ch("los/LO1/freq/coerced", _ch_name),
+ 0.0,
+ AUTO_RESOLVE_ON_READ_WRITE);
+ get_rx_subtree()
+ ->create<meta_range_t>("los/LO2/freq/range")
.set(freq_range_t(1.0e9, 3.0e9));
- expert_factory::add_dual_prop_node<double>(_expert, get_rx_subtree(),
- "los/LO2/freq/value", prepend_ch("los/LO2/freq/desired", _ch_name), prepend_ch("los/LO2/freq/coerced", _ch_name),
- 0.0, AUTO_RESOLVE_ON_READ_WRITE);
- get_rx_subtree()->create<std::vector<std::string>>("los/all/source/options")
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "los/LO2/freq/value",
+ prepend_ch("los/LO2/freq/desired", _ch_name),
+ prepend_ch("los/LO2/freq/coerced", _ch_name),
+ 0.0,
+ AUTO_RESOLVE_ON_READ_WRITE);
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("los/all/source/options")
.set({"internal", "external", "companion", "disabled", "reimport"});
- expert_factory::add_prop_node<std::string>(_expert, get_rx_subtree(),
- "los/all/source/value", prepend_ch("los/all/source", _ch_name),
- "internal", AUTO_RESOLVE_ON_WRITE);
- expert_factory::add_prop_node<bool>(_expert, get_rx_subtree(),
- "los/all/export", prepend_ch("los/all/export", _ch_name),
- false, AUTO_RESOLVE_ON_WRITE);
+ expert_factory::add_prop_node<std::string>(_expert,
+ get_rx_subtree(),
+ "los/all/source/value",
+ prepend_ch("los/all/source", _ch_name),
+ "internal",
+ AUTO_RESOLVE_ON_WRITE);
+ expert_factory::add_prop_node<bool>(_expert,
+ get_rx_subtree(),
+ "los/all/export",
+ prepend_ch("los/all/export", _ch_name),
+ false,
+ AUTO_RESOLVE_ON_WRITE);
// LO1 Charge Pump
- get_rx_subtree()->create<meta_range_t>("los/LO1/charge_pump/range")
+ get_rx_subtree()
+ ->create<meta_range_t>("los/LO1/charge_pump/range")
.set(_ctrl->get_lo1_charge_pump_range());
expert_factory::add_dual_prop_node<double>(_expert,
get_rx_subtree(),
@@ -119,7 +148,8 @@ public:
AUTO_RESOLVE_ON_READ_WRITE);
// LO2 Charge Pump
- get_rx_subtree()->create<meta_range_t>("los/LO2/charge_pump/range")
+ get_rx_subtree()
+ ->create<meta_range_t>("los/LO2/charge_pump/range")
.set(_ctrl->get_lo2_charge_pump_range());
expert_factory::add_dual_prop_node<double>(_expert,
get_rx_subtree(),
@@ -129,29 +159,44 @@ public:
1.25e-6,
AUTO_RESOLVE_ON_READ_WRITE);
- //Gain Specific
- get_rx_subtree()->create<meta_range_t>("gains/all/range")
+ // Gain Specific
+ get_rx_subtree()
+ ->create<meta_range_t>("gains/all/range")
.set(gain_range_t(0, 93, double(1.0)));
- expert_factory::add_prop_node<double>(_expert, get_rx_subtree(),
- "gains/all/value", prepend_ch("gain", _ch_name),
- 0.0, AUTO_RESOLVE_ON_WRITE);
- get_rx_subtree()->create<std::vector<std::string> >("gains/all/profile/options")
+ expert_factory::add_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "gains/all/value",
+ prepend_ch("gain", _ch_name),
+ 0.0,
+ AUTO_RESOLVE_ON_WRITE);
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("gains/all/profile/options")
.set({"low-noise", "low-distortion", "default"});
- expert_factory::add_prop_node<std::string>(_expert, get_rx_subtree(),
- "gains/all/profile/value", prepend_ch("gain_profile", _ch_name),
- "default", AUTO_RESOLVE_ON_WRITE);
+ expert_factory::add_prop_node<std::string>(_expert,
+ get_rx_subtree(),
+ "gains/all/profile/value",
+ prepend_ch("gain_profile", _ch_name),
+ "default",
+ AUTO_RESOLVE_ON_WRITE);
- //Antenna Specific
- get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ // Antenna Specific
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set({"RX1", "RX2"});
- expert_factory::add_prop_node<std::string>(_expert, get_rx_subtree(),
- "antenna/value", prepend_ch("antenna", _ch_name),
- (_ch_name == "0" ? "RX1" : "RX2"), AUTO_RESOLVE_ON_WRITE);
- expert_factory::add_prop_node<bool>(_expert, get_rx_subtree(),
- "enabled", prepend_ch("enabled", _ch_name),
- false, AUTO_RESOLVE_ON_WRITE);
-
- //Readback
+ expert_factory::add_prop_node<std::string>(_expert,
+ get_rx_subtree(),
+ "antenna/value",
+ prepend_ch("antenna", _ch_name),
+ (_ch_name == "0" ? "RX1" : "RX2"),
+ AUTO_RESOLVE_ON_WRITE);
+ expert_factory::add_prop_node<bool>(_expert,
+ get_rx_subtree(),
+ "enabled",
+ prepend_ch("enabled", _ch_name),
+ false,
+ AUTO_RESOLVE_ON_WRITE);
+
+ // Readback
get_rx_subtree()
->create<sensor_value_t>("sensors/lo_locked")
.set_publisher([this]() { return this->get_lo_locked(); });
@@ -159,55 +204,53 @@ public:
//---------------------------------------------------------
// Add internal channel-specific data nodes to expert
//---------------------------------------------------------
- expert_factory::add_data_node<lo_inj_side_t>(_expert,
- prepend_ch("ch/LO1/inj_side", _ch_name), INJ_LOW_SIDE);
- expert_factory::add_data_node<lo_inj_side_t>(_expert,
- prepend_ch("ch/LO2/inj_side", _ch_name), INJ_LOW_SIDE);
- expert_factory::add_data_node<twinrx_ctrl::signal_path_t>(_expert,
- prepend_ch("ch/signal_path", _ch_name), twinrx_ctrl::PATH_LOWBAND);
- expert_factory::add_data_node<twinrx_ctrl::preselector_path_t>(_expert,
- prepend_ch("ch/lb_presel", _ch_name), twinrx_ctrl::PRESEL_PATH1);
- expert_factory::add_data_node<twinrx_ctrl::preselector_path_t>(_expert,
- prepend_ch("ch/hb_presel", _ch_name), twinrx_ctrl::PRESEL_PATH1);
- expert_factory::add_data_node<bool>(_expert,
- prepend_ch("ch/lb_preamp_presel", _ch_name), false);
- expert_factory::add_data_node<bool>(_expert,
- prepend_ch("ant/lb_preamp_presel", _ch_name), false);
- expert_factory::add_data_node<twinrx_ctrl::preamp_state_t>(_expert,
- prepend_ch("ch/preamp1", _ch_name), twinrx_ctrl::PREAMP_BYPASS);
- expert_factory::add_data_node<twinrx_ctrl::preamp_state_t>(_expert,
- prepend_ch("ant/preamp1", _ch_name), twinrx_ctrl::PREAMP_BYPASS);
- expert_factory::add_data_node<bool>(_expert,
- prepend_ch("ch/preamp2", _ch_name), false);
- expert_factory::add_data_node<bool>(_expert,
- prepend_ch("ant/preamp2", _ch_name), false);
- expert_factory::add_data_node<uint8_t>(_expert,
- prepend_ch("ch/input_atten", _ch_name), 0);
- expert_factory::add_data_node<uint8_t>(_expert,
- prepend_ch("ant/input_atten", _ch_name), 0);
- expert_factory::add_data_node<uint8_t>(_expert,
- prepend_ch("ch/lb_atten", _ch_name), 0);
- expert_factory::add_data_node<uint8_t>(_expert,
- prepend_ch("ch/hb_atten", _ch_name), 0);
- expert_factory::add_data_node<twinrx_ctrl::lo_source_t>(_expert,
- prepend_ch("ch/LO1/source", _ch_name), twinrx_ctrl::LO_INTERNAL);
- expert_factory::add_data_node<twinrx_ctrl::lo_source_t>(_expert,
- prepend_ch("ch/LO2/source", _ch_name), twinrx_ctrl::LO_INTERNAL);
- expert_factory::add_data_node<lo_synth_mapping_t>(_expert,
- prepend_ch("synth/LO1/mapping", _ch_name), MAPPING_NONE);
- expert_factory::add_data_node<lo_synth_mapping_t>(_expert,
- prepend_ch("synth/LO2/mapping", _ch_name), MAPPING_NONE);
-
+ expert_factory::add_data_node<lo_inj_side_t>(
+ _expert, prepend_ch("ch/LO1/inj_side", _ch_name), INJ_LOW_SIDE);
+ expert_factory::add_data_node<lo_inj_side_t>(
+ _expert, prepend_ch("ch/LO2/inj_side", _ch_name), INJ_LOW_SIDE);
+ expert_factory::add_data_node<twinrx_ctrl::signal_path_t>(
+ _expert, prepend_ch("ch/signal_path", _ch_name), twinrx_ctrl::PATH_LOWBAND);
+ expert_factory::add_data_node<twinrx_ctrl::preselector_path_t>(
+ _expert, prepend_ch("ch/lb_presel", _ch_name), twinrx_ctrl::PRESEL_PATH1);
+ expert_factory::add_data_node<twinrx_ctrl::preselector_path_t>(
+ _expert, prepend_ch("ch/hb_presel", _ch_name), twinrx_ctrl::PRESEL_PATH1);
+ expert_factory::add_data_node<bool>(
+ _expert, prepend_ch("ch/lb_preamp_presel", _ch_name), false);
+ expert_factory::add_data_node<bool>(
+ _expert, prepend_ch("ant/lb_preamp_presel", _ch_name), false);
+ expert_factory::add_data_node<twinrx_ctrl::preamp_state_t>(
+ _expert, prepend_ch("ch/preamp1", _ch_name), twinrx_ctrl::PREAMP_BYPASS);
+ expert_factory::add_data_node<twinrx_ctrl::preamp_state_t>(
+ _expert, prepend_ch("ant/preamp1", _ch_name), twinrx_ctrl::PREAMP_BYPASS);
+ expert_factory::add_data_node<bool>(
+ _expert, prepend_ch("ch/preamp2", _ch_name), false);
+ expert_factory::add_data_node<bool>(
+ _expert, prepend_ch("ant/preamp2", _ch_name), false);
+ expert_factory::add_data_node<uint8_t>(
+ _expert, prepend_ch("ch/input_atten", _ch_name), 0);
+ expert_factory::add_data_node<uint8_t>(
+ _expert, prepend_ch("ant/input_atten", _ch_name), 0);
+ expert_factory::add_data_node<uint8_t>(
+ _expert, prepend_ch("ch/lb_atten", _ch_name), 0);
+ expert_factory::add_data_node<uint8_t>(
+ _expert, prepend_ch("ch/hb_atten", _ch_name), 0);
+ expert_factory::add_data_node<twinrx_ctrl::lo_source_t>(
+ _expert, prepend_ch("ch/LO1/source", _ch_name), twinrx_ctrl::LO_INTERNAL);
+ expert_factory::add_data_node<twinrx_ctrl::lo_source_t>(
+ _expert, prepend_ch("ch/LO2/source", _ch_name), twinrx_ctrl::LO_INTERNAL);
+ expert_factory::add_data_node<lo_synth_mapping_t>(
+ _expert, prepend_ch("synth/LO1/mapping", _ch_name), MAPPING_NONE);
+ expert_factory::add_data_node<lo_synth_mapping_t>(
+ _expert, prepend_ch("synth/LO2/mapping", _ch_name), MAPPING_NONE);
}
- virtual ~twinrx_rcvr_fe(void)
- {
- }
+ virtual ~twinrx_rcvr_fe(void) {}
sensor_value_t get_lo_locked()
{
- bool locked = true;
- twinrx_ctrl::channel_t ch = (_ch_name == "0") ? twinrx_ctrl::CH1 : twinrx_ctrl::CH2;
+ bool locked = true;
+ twinrx_ctrl::channel_t ch = (_ch_name == "0") ? twinrx_ctrl::CH1
+ : twinrx_ctrl::CH2;
locked &= _ctrl->read_lo1_locked(ch);
locked &= _ctrl->read_lo2_locked(ch);
return sensor_value_t("LO", locked, "locked", "unlocked");
@@ -215,8 +258,8 @@ public:
private:
expert_container::sptr _expert;
- twinrx_ctrl::sptr _ctrl;
- const std::string _ch_name;
+ twinrx_ctrl::sptr _ctrl;
+ const std::string _ch_name;
};
/*!
@@ -233,23 +276,23 @@ public:
twinrx_rcvr(ctor_args_t args) : rx_dboard_base(args)
{
- _db_iface = get_iface();
- twinrx_gpio::sptr gpio_iface = std::make_shared<twinrx_gpio>(_db_iface);
+ _db_iface = get_iface();
+ twinrx_gpio::sptr gpio_iface = std::make_shared<twinrx_gpio>(_db_iface);
twinrx_cpld_regmap::sptr cpld_regs = std::make_shared<twinrx_cpld_regmap>();
cpld_regs->initialize(*gpio_iface, false);
- _ctrl = twinrx_ctrl::make(_db_iface, gpio_iface, cpld_regs, get_rx_id());
+ _ctrl = twinrx_ctrl::make(_db_iface, gpio_iface, cpld_regs, get_rx_id());
_expert = expert_factory::create_container("twinrx_expert");
}
- virtual ~twinrx_rcvr(void)
- {
- }
+ virtual ~twinrx_rcvr(void) {}
- inline expert_container::sptr get_expert() {
+ inline expert_container::sptr get_expert()
+ {
return _expert;
}
- inline twinrx_ctrl::sptr get_ctrl() {
+ inline twinrx_ctrl::sptr get_ctrl()
+ {
return _ctrl;
}
@@ -258,38 +301,49 @@ public:
//---------------------------------------------------------
// Add internal channel-agnostic data nodes to expert
//---------------------------------------------------------
- expert_factory::add_data_node<twinrx_ctrl::lo_export_source_t>(_expert,
- "com/LO1/export_source", twinrx_ctrl::LO_EXPORT_DISABLED);
- expert_factory::add_data_node<twinrx_ctrl::lo_export_source_t>(_expert,
- "com/LO2/export_source", twinrx_ctrl::LO_EXPORT_DISABLED);
- expert_factory::add_data_node<twinrx_ctrl::antenna_mapping_t>(_expert,
- "com/ant_mapping", twinrx_ctrl::ANTX_NATIVE);
- expert_factory::add_data_node<twinrx_ctrl::cal_mode_t>(_expert,
- "com/cal_mode", twinrx_ctrl::CAL_DISABLED);
- expert_factory::add_data_node<bool>(_expert,
- "com/synth/LO1/hopping_enabled", false);
- expert_factory::add_data_node<bool>(_expert,
- "com/synth/LO2/hopping_enabled", false);
+ expert_factory::add_data_node<twinrx_ctrl::lo_export_source_t>(
+ _expert, "com/LO1/export_source", twinrx_ctrl::LO_EXPORT_DISABLED);
+ expert_factory::add_data_node<twinrx_ctrl::lo_export_source_t>(
+ _expert, "com/LO2/export_source", twinrx_ctrl::LO_EXPORT_DISABLED);
+ expert_factory::add_data_node<twinrx_ctrl::antenna_mapping_t>(
+ _expert, "com/ant_mapping", twinrx_ctrl::ANTX_NATIVE);
+ expert_factory::add_data_node<twinrx_ctrl::cal_mode_t>(
+ _expert, "com/cal_mode", twinrx_ctrl::CAL_DISABLED);
+ expert_factory::add_data_node<bool>(
+ _expert, "com/synth/LO1/hopping_enabled", false);
+ expert_factory::add_data_node<bool>(
+ _expert, "com/synth/LO2/hopping_enabled", false);
//---------------------------------------------------------
// Add workers to expert
//---------------------------------------------------------
- //Channel (front-end) specific
- for(const std::string& fe: _fe_names) {
- expert_factory::add_worker_node<twinrx_freq_path_expert>(_expert, _expert->node_retriever(), fe);
- expert_factory::add_worker_node<twinrx_freq_coercion_expert>(_expert, _expert->node_retriever(), fe);
- expert_factory::add_worker_node<twinrx_chan_gain_expert>(_expert, _expert->node_retriever(), fe);
- expert_factory::add_worker_node<twinrx_scheduling_expert>(_expert, _expert->node_retriever(), fe);
- expert_factory::add_worker_node<twinrx_nyquist_expert>(_expert, _expert->node_retriever(), fe, _db_iface);
+ // Channel (front-end) specific
+ for (const std::string& fe : _fe_names) {
+ expert_factory::add_worker_node<twinrx_freq_path_expert>(
+ _expert, _expert->node_retriever(), fe);
+ expert_factory::add_worker_node<twinrx_freq_coercion_expert>(
+ _expert, _expert->node_retriever(), fe);
+ expert_factory::add_worker_node<twinrx_chan_gain_expert>(
+ _expert, _expert->node_retriever(), fe);
+ expert_factory::add_worker_node<twinrx_scheduling_expert>(
+ _expert, _expert->node_retriever(), fe);
+ expert_factory::add_worker_node<twinrx_nyquist_expert>(
+ _expert, _expert->node_retriever(), fe, _db_iface);
}
- //Channel (front-end) agnostic
- expert_factory::add_worker_node<twinrx_lo_config_expert>(_expert, _expert->node_retriever());
- expert_factory::add_worker_node<twinrx_lo_mapping_expert>(_expert, _expert->node_retriever(), STAGE_LO1);
- expert_factory::add_worker_node<twinrx_lo_mapping_expert>(_expert, _expert->node_retriever(), STAGE_LO2);
- expert_factory::add_worker_node<twinrx_antenna_expert>(_expert, _expert->node_retriever());
- expert_factory::add_worker_node<twinrx_ant_gain_expert>(_expert, _expert->node_retriever());
- expert_factory::add_worker_node<twinrx_settings_expert>(_expert, _expert->node_retriever(), _ctrl);
+ // Channel (front-end) agnostic
+ expert_factory::add_worker_node<twinrx_lo_config_expert>(
+ _expert, _expert->node_retriever());
+ expert_factory::add_worker_node<twinrx_lo_mapping_expert>(
+ _expert, _expert->node_retriever(), STAGE_LO1);
+ expert_factory::add_worker_node<twinrx_lo_mapping_expert>(
+ _expert, _expert->node_retriever(), STAGE_LO2);
+ expert_factory::add_worker_node<twinrx_antenna_expert>(
+ _expert, _expert->node_retriever());
+ expert_factory::add_worker_node<twinrx_ant_gain_expert>(
+ _expert, _expert->node_retriever());
+ expert_factory::add_worker_node<twinrx_settings_expert>(
+ _expert, _expert->node_retriever(), _ctrl);
/*//Expert debug code
std::ofstream dot_file("/tmp/twinrx.dot", std::ios::out);
@@ -316,24 +370,27 @@ public:
}
protected:
- inline void add_twinrx_fe(const std::string& name) {
+ inline void add_twinrx_fe(const std::string& name)
+ {
_fe_names.push_back(name);
}
private:
typedef std::map<std::string, dboard_base::sptr> twinrx_fe_map_t;
- dboard_iface::sptr _db_iface;
- twinrx_ctrl::sptr _ctrl;
- std::vector<std::string> _fe_names;
- expert_container::sptr _expert;
+ dboard_iface::sptr _db_iface;
+ twinrx_ctrl::sptr _ctrl;
+ std::vector<std::string> _fe_names;
+ expert_container::sptr _expert;
};
/*!
* Initialization Sequence for each TwinRX board:
* - make_twinrx_container is called which creates an instance of twinrx_rcvr
- * - twinrx_rcvr::make_twinrx_fe is called with channel "0" which creates an instance of twinrx_rcvr_fe
- * - twinrx_rcvr::make_twinrx_fe is called with channel "1" which creates an instance of twinrx_rcvr_fe
+ * - twinrx_rcvr::make_twinrx_fe is called with channel "0" which creates an instance of
+ * twinrx_rcvr_fe
+ * - twinrx_rcvr::make_twinrx_fe is called with channel "1" which creates an instance of
+ * twinrx_rcvr_fe
* - twinrx_rcvr::initialize is called with finishes the init sequence
*
*/
@@ -344,27 +401,21 @@ static dboard_base::sptr make_twinrx_container(dboard_base::ctor_args_t args)
UHD_STATIC_BLOCK(reg_twinrx_dboards)
{
- dboard_manager::register_dboard_restricted(
- twinrx::TWINRX_REV_A_ID,
+ dboard_manager::register_dboard_restricted(twinrx::TWINRX_REV_A_ID,
&twinrx_rcvr::make_twinrx_fe,
"TwinRX Rev A",
{"0", "1"},
- &make_twinrx_container
- );
+ &make_twinrx_container);
- dboard_manager::register_dboard_restricted(
- twinrx::TWINRX_REV_B_ID,
+ dboard_manager::register_dboard_restricted(twinrx::TWINRX_REV_B_ID,
&twinrx_rcvr::make_twinrx_fe,
"TwinRX Rev B",
{"0", "1"},
- &make_twinrx_container
- );
+ &make_twinrx_container);
- dboard_manager::register_dboard_restricted(
- twinrx::TWINRX_REV_C_ID,
+ dboard_manager::register_dboard_restricted(twinrx::TWINRX_REV_C_ID,
&twinrx_rcvr::make_twinrx_fe,
"TwinRX Rev C",
{"0", "1"},
- &make_twinrx_container
- );
+ &make_twinrx_container);
}
diff --git a/host/lib/usrp/dboard/db_ubx.cpp b/host/lib/usrp/dboard/db_ubx.cpp
index 3771c9f2d..8ac96a2fe 100644
--- a/host/lib/usrp/dboard/db_ubx.cpp
+++ b/host/lib/usrp/dboard/db_ubx.cpp
@@ -34,8 +34,7 @@ using namespace uhd::usrp;
/***********************************************************************
* UBX Data Structures
**********************************************************************/
-enum ubx_gpio_field_id_t
-{
+enum ubx_gpio_field_id_t {
SPI_ADDR,
TX_EN_N,
RX_EN_N,
@@ -51,34 +50,33 @@ enum ubx_gpio_field_id_t
TXLO2_SYNC
};
-enum ubx_cpld_field_id_t
-{
- TXHB_SEL = 0,
- TXLB_SEL = 1,
- TXLO1_FSEL1 = 2,
- TXLO1_FSEL2 = 3,
- TXLO1_FSEL3 = 4,
- RXHB_SEL = 5,
- RXLB_SEL = 6,
- RXLO1_FSEL1 = 7,
- RXLO1_FSEL2 = 8,
- RXLO1_FSEL3 = 9,
- SEL_LNA1 = 10,
- SEL_LNA2 = 11,
- TXLO1_FORCEON = 12,
- TXLO2_FORCEON = 13,
- TXMOD_FORCEON = 14,
+enum ubx_cpld_field_id_t {
+ TXHB_SEL = 0,
+ TXLB_SEL = 1,
+ TXLO1_FSEL1 = 2,
+ TXLO1_FSEL2 = 3,
+ TXLO1_FSEL3 = 4,
+ RXHB_SEL = 5,
+ RXLB_SEL = 6,
+ RXLO1_FSEL1 = 7,
+ RXLO1_FSEL2 = 8,
+ RXLO1_FSEL3 = 9,
+ SEL_LNA1 = 10,
+ SEL_LNA2 = 11,
+ TXLO1_FORCEON = 12,
+ TXLO2_FORCEON = 13,
+ TXMOD_FORCEON = 14,
TXMIXER_FORCEON = 15,
- TXDRV_FORCEON = 16,
- RXLO1_FORCEON = 17,
- RXLO2_FORCEON = 18,
+ TXDRV_FORCEON = 16,
+ RXLO1_FORCEON = 17,
+ RXLO2_FORCEON = 18,
RXDEMOD_FORCEON = 19,
RXMIXER_FORCEON = 20,
- RXDRV_FORCEON = 21,
- RXAMP_FORCEON = 22,
- RXLNA1_FORCEON = 23,
- RXLNA2_FORCEON = 24,
- CAL_ENABLE = 25
+ RXDRV_FORCEON = 21,
+ RXAMP_FORCEON = 22,
+ RXLNA1_FORCEON = 23,
+ RXLNA2_FORCEON = 24,
+ CAL_ENABLE = 25
};
struct ubx_gpio_field_info_t
@@ -88,7 +86,7 @@ struct ubx_gpio_field_info_t
uint32_t offset;
uint32_t mask;
uint32_t width;
- enum {OUTPUT,INPUT} direction;
+ enum { OUTPUT, INPUT } direction;
bool is_atr_controlled;
uint32_t atr_idle;
uint32_t atr_tx;
@@ -125,12 +123,12 @@ struct ubx_cpld_reg_t
};
enum spi_dest_t {
- TXLO1 = 0x0, // 0x00: TXLO1, the main TXLO from 400MHz to 6000MHz
- TXLO2 = 0x1, // 0x01: TXLO2, the low band mixer TXLO 10MHz to 400MHz
- RXLO1 = 0x2, // 0x02: RXLO1, the main RXLO from 400MHz to 6000MHz
- RXLO2 = 0x3, // 0x03: RXLO2, the low band mixer RXLO 10MHz to 400MHz
- CPLD = 0x4 // 0x04: CPLD SPI Register
- };
+ TXLO1 = 0x0, // 0x00: TXLO1, the main TXLO from 400MHz to 6000MHz
+ TXLO2 = 0x1, // 0x01: TXLO2, the low band mixer TXLO 10MHz to 400MHz
+ RXLO1 = 0x2, // 0x02: RXLO1, the main RXLO from 400MHz to 6000MHz
+ RXLO2 = 0x3, // 0x03: RXLO2, the low band mixer RXLO 10MHz to 400MHz
+ CPLD = 0x4 // 0x04: CPLD SPI Register
+};
/***********************************************************************
* UBX Constants
@@ -198,11 +196,11 @@ static const ubx_gpio_field_info_t ubx_v1_gpio_info[] = {
/***********************************************************************
* Macros for routing and writing SPI registers
**********************************************************************/
-#define ROUTE_SPI(iface, dest) \
+#define ROUTE_SPI(iface, dest) \
set_gpio_field(SPI_ADDR, dest); \
write_gpio();
-#define WRITE_SPI(iface, val) \
+#define WRITE_SPI(iface, val) \
iface->write_spi(dboard_iface::UNIT_TX, spi_config_t::EDGE_RISE, val, 32);
/***********************************************************************
@@ -213,91 +211,85 @@ class ubx_xcvr : public xcvr_dboard_base
public:
ubx_xcvr(ctor_args_t args) : xcvr_dboard_base(args)
{
- double bw = 40e6;
+ double bw = 40e6;
double pfd_freq_max = 25e6;
////////////////////////////////////////////////////////////////////
// Setup GPIO hardware
////////////////////////////////////////////////////////////////////
- _iface = get_iface();
+ _iface = get_iface();
dboard_id_t rx_id = get_rx_id();
dboard_id_t tx_id = get_tx_id();
- size_t revision = 1; // default to rev A
+ size_t revision = 1; // default to rev A
// Get revision if programmed
const std::string revision_str = get_rx_eeprom().revision;
- if (not revision_str.empty())
- {
+ if (not revision_str.empty()) {
revision = boost::lexical_cast<size_t>(revision_str);
}
_high_isolation = false;
if (rx_id == UBX_PROTO_V3_RX_ID and tx_id == UBX_PROTO_V3_TX_ID) {
_rev = 0;
- }
- else if (rx_id == UBX_PROTO_V4_RX_ID and tx_id == UBX_PROTO_V4_TX_ID) {
+ } else if (rx_id == UBX_PROTO_V4_RX_ID and tx_id == UBX_PROTO_V4_TX_ID) {
_rev = 1;
- }
- else if (rx_id == UBX_V1_40MHZ_RX_ID and tx_id == UBX_V1_40MHZ_TX_ID) {
+ } else if (rx_id == UBX_V1_40MHZ_RX_ID and tx_id == UBX_V1_40MHZ_TX_ID) {
_rev = 1;
- }
- else if (rx_id == UBX_V2_40MHZ_RX_ID and tx_id == UBX_V2_40MHZ_TX_ID) {
+ } else if (rx_id == UBX_V2_40MHZ_RX_ID and tx_id == UBX_V2_40MHZ_TX_ID) {
_rev = 2;
- if (revision >= 4)
- {
+ if (revision >= 4) {
_high_isolation = true;
}
- }
- else if (rx_id == UBX_V1_160MHZ_RX_ID and tx_id == UBX_V1_160MHZ_TX_ID) {
- bw = 160e6;
+ } else if (rx_id == UBX_V1_160MHZ_RX_ID and tx_id == UBX_V1_160MHZ_TX_ID) {
+ bw = 160e6;
_rev = 1;
- }
- else if (rx_id == UBX_V2_160MHZ_RX_ID and tx_id == UBX_V2_160MHZ_TX_ID) {
- bw = 160e6;
+ } else if (rx_id == UBX_V2_160MHZ_RX_ID and tx_id == UBX_V2_160MHZ_TX_ID) {
+ bw = 160e6;
_rev = 2;
- if (revision >= 4)
- {
+ if (revision >= 4) {
_high_isolation = true;
}
- }
- else if (rx_id == UBX_LP_160MHZ_RX_ID and tx_id == UBX_LP_160MHZ_TX_ID) {
+ } else if (rx_id == UBX_LP_160MHZ_RX_ID and tx_id == UBX_LP_160MHZ_TX_ID) {
// The LP version behaves and looks like a regular UBX-160 v2
- bw = 160e6;
- _rev = 2;
- }
- else if (rx_id == UBX_TDD_160MHZ_RX_ID and tx_id == UBX_TDD_160MHZ_TX_ID) {
- bw = 160e6;
+ bw = 160e6;
_rev = 2;
+ } else if (rx_id == UBX_TDD_160MHZ_RX_ID and tx_id == UBX_TDD_160MHZ_TX_ID) {
+ bw = 160e6;
+ _rev = 2;
_high_isolation = true;
- }
- else {
+ } else {
UHD_THROW_INVALID_CODE_PATH();
}
- switch(_rev)
- {
- case 0:
- for (size_t i = 0; i < sizeof(ubx_proto_gpio_info) / sizeof(ubx_gpio_field_info_t); i++)
- _gpio_map[ubx_proto_gpio_info[i].id] = ubx_proto_gpio_info[i];
- pfd_freq_max = 25e6;
- break;
- case 1:
- case 2:
- for (size_t i = 0; i < sizeof(ubx_v1_gpio_info) / sizeof(ubx_gpio_field_info_t); i++)
- _gpio_map[ubx_v1_gpio_info[i].id] = ubx_v1_gpio_info[i];
- pfd_freq_max = 50e6;
- break;
+ switch (_rev) {
+ case 0:
+ for (size_t i = 0;
+ i < sizeof(ubx_proto_gpio_info) / sizeof(ubx_gpio_field_info_t);
+ i++)
+ _gpio_map[ubx_proto_gpio_info[i].id] = ubx_proto_gpio_info[i];
+ pfd_freq_max = 25e6;
+ break;
+ case 1:
+ case 2:
+ for (size_t i = 0;
+ i < sizeof(ubx_v1_gpio_info) / sizeof(ubx_gpio_field_info_t);
+ i++)
+ _gpio_map[ubx_v1_gpio_info[i].id] = ubx_v1_gpio_info[i];
+ pfd_freq_max = 50e6;
+ break;
}
// Initialize GPIO registers
- memset(&_tx_gpio_reg,0,sizeof(ubx_gpio_reg_t));
- memset(&_rx_gpio_reg,0,sizeof(ubx_gpio_reg_t));
- for (std::map<ubx_gpio_field_id_t,ubx_gpio_field_info_t>::iterator entry = _gpio_map.begin(); entry != _gpio_map.end(); entry++)
- {
+ memset(&_tx_gpio_reg, 0, sizeof(ubx_gpio_reg_t));
+ memset(&_rx_gpio_reg, 0, sizeof(ubx_gpio_reg_t));
+ for (std::map<ubx_gpio_field_id_t, ubx_gpio_field_info_t>::iterator entry =
+ _gpio_map.begin();
+ entry != _gpio_map.end();
+ entry++) {
ubx_gpio_field_info_t info = entry->second;
- ubx_gpio_reg_t *reg = (info.unit == dboard_iface::UNIT_TX ? &_tx_gpio_reg : &_rx_gpio_reg);
+ ubx_gpio_reg_t* reg =
+ (info.unit == dboard_iface::UNIT_TX ? &_tx_gpio_reg : &_rx_gpio_reg);
if (info.direction == ubx_gpio_field_info_t::INPUT)
reg->ddr |= info.mask;
- if (info.is_atr_controlled)
- {
+ if (info.is_atr_controlled) {
reg->atr_mask |= info.mask;
reg->atr_idle |= (info.atr_idle << info.offset) & info.mask;
reg->atr_tx |= (info.atr_tx << info.offset) & info.mask;
@@ -309,44 +301,40 @@ public:
// Enable the reference clocks that we need
_rx_target_pfd_freq = pfd_freq_max;
_tx_target_pfd_freq = pfd_freq_max;
- if (_rev >= 1)
- {
+ if (_rev >= 1) {
bool can_set_clock_rate = true;
// set dboard clock rates to as close to the max PFD freq as possible
- if (_iface->get_clock_rate(dboard_iface::UNIT_RX) > pfd_freq_max)
- {
- std::vector<double> rates = _iface->get_clock_rates(dboard_iface::UNIT_RX);
+ if (_iface->get_clock_rate(dboard_iface::UNIT_RX) > pfd_freq_max) {
+ std::vector<double> rates =
+ _iface->get_clock_rates(dboard_iface::UNIT_RX);
double highest_rate = 0.0;
- for(double rate: rates)
- {
+ for (double rate : rates) {
if (rate <= pfd_freq_max and rate > highest_rate)
highest_rate = rate;
}
try {
_iface->set_clock_rate(dboard_iface::UNIT_RX, highest_rate);
- } catch (const uhd::not_implemented_error &) {
- UHD_LOG_WARNING("UBX",
- "Unable to set dboard clock rate - phase will vary"
- );
+ } catch (const uhd::not_implemented_error&) {
+ UHD_LOG_WARNING(
+ "UBX", "Unable to set dboard clock rate - phase will vary");
can_set_clock_rate = false;
}
_rx_target_pfd_freq = highest_rate;
}
- if (can_set_clock_rate and _iface->get_clock_rate(dboard_iface::UNIT_TX) > pfd_freq_max)
- {
- std::vector<double> rates = _iface->get_clock_rates(dboard_iface::UNIT_TX);
+ if (can_set_clock_rate
+ and _iface->get_clock_rate(dboard_iface::UNIT_TX) > pfd_freq_max) {
+ std::vector<double> rates =
+ _iface->get_clock_rates(dboard_iface::UNIT_TX);
double highest_rate = 0.0;
- for(double rate: rates)
- {
+ for (double rate : rates) {
if (rate <= pfd_freq_max and rate > highest_rate)
highest_rate = rate;
}
try {
_iface->set_clock_rate(dboard_iface::UNIT_TX, highest_rate);
- } catch (const uhd::not_implemented_error &) {
- UHD_LOG_WARNING("UBX",
- "Unable to set dboard clock rate - phase will vary"
- );
+ } catch (const uhd::not_implemented_error&) {
+ UHD_LOG_WARNING(
+ "UBX", "Unable to set dboard clock rate - phase will vary");
}
_tx_target_pfd_freq = highest_rate;
}
@@ -373,97 +361,127 @@ public:
write_gpio();
// Configure ATR
- _iface->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, _tx_gpio_reg.atr_idle);
- _iface->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _tx_gpio_reg.atr_tx);
- _iface->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, _tx_gpio_reg.atr_rx);
- _iface->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, _tx_gpio_reg.atr_full_duplex);
- _iface->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, _rx_gpio_reg.atr_idle);
- _iface->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _rx_gpio_reg.atr_tx);
- _iface->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, _rx_gpio_reg.atr_rx);
- _iface->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, _rx_gpio_reg.atr_full_duplex);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, _tx_gpio_reg.atr_idle);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, _tx_gpio_reg.atr_tx);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, _tx_gpio_reg.atr_rx);
+ _iface->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _tx_gpio_reg.atr_full_duplex);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, _rx_gpio_reg.atr_idle);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, _rx_gpio_reg.atr_tx);
+ _iface->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, _rx_gpio_reg.atr_rx);
+ _iface->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ _rx_gpio_reg.atr_full_duplex);
// Engage ATR control (1 is ATR control, 0 is manual control)
_iface->set_pin_ctrl(dboard_iface::UNIT_TX, _tx_gpio_reg.atr_mask);
_iface->set_pin_ctrl(dboard_iface::UNIT_RX, _rx_gpio_reg.atr_mask);
// bring CPLD out of reset
- std::this_thread::sleep_for(std::chrono::milliseconds(20)); // hold CPLD reset for minimum of 20 ms
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(20)); // hold CPLD reset for minimum of 20 ms
set_gpio_field(CPLD_RST_N, 1);
write_gpio();
// Initialize LOs
- if (_rev == 0)
- {
- _txlo1 = max287x_iface::make<max2870>(std::bind(&ubx_xcvr::write_spi_regs, this, TXLO1, std::placeholders::_1));
- _txlo2 = max287x_iface::make<max2870>(std::bind(&ubx_xcvr::write_spi_regs, this, TXLO2, std::placeholders::_1));
- _rxlo1 = max287x_iface::make<max2870>(std::bind(&ubx_xcvr::write_spi_regs, this, RXLO1, std::placeholders::_1));
- _rxlo2 = max287x_iface::make<max2870>(std::bind(&ubx_xcvr::write_spi_regs, this, RXLO2, std::placeholders::_1));
+ if (_rev == 0) {
+ _txlo1 = max287x_iface::make<max2870>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, TXLO1, std::placeholders::_1));
+ _txlo2 = max287x_iface::make<max2870>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, TXLO2, std::placeholders::_1));
+ _rxlo1 = max287x_iface::make<max2870>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, RXLO1, std::placeholders::_1));
+ _rxlo2 = max287x_iface::make<max2870>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, RXLO2, std::placeholders::_1));
std::vector<max287x_iface::sptr> los{_txlo1, _txlo2, _rxlo1, _rxlo2};
- for(max287x_iface::sptr lo: los)
- {
+ for (max287x_iface::sptr lo : los) {
lo->set_auto_retune(false);
lo->set_muxout_mode(max287x_iface::MUXOUT_DLD);
lo->set_ld_pin_mode(max287x_iface::LD_PIN_MODE_DLD);
}
- }
- else if (_rev == 1 or _rev == 2)
- {
- _txlo1 = max287x_iface::make<max2871>(std::bind(&ubx_xcvr::write_spi_regs, this, TXLO1, std::placeholders::_1));
- _txlo2 = max287x_iface::make<max2871>(std::bind(&ubx_xcvr::write_spi_regs, this, TXLO2, std::placeholders::_1));
- _rxlo1 = max287x_iface::make<max2871>(std::bind(&ubx_xcvr::write_spi_regs, this, RXLO1, std::placeholders::_1));
- _rxlo2 = max287x_iface::make<max2871>(std::bind(&ubx_xcvr::write_spi_regs, this, RXLO2, std::placeholders::_1));
+ } else if (_rev == 1 or _rev == 2) {
+ _txlo1 = max287x_iface::make<max2871>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, TXLO1, std::placeholders::_1));
+ _txlo2 = max287x_iface::make<max2871>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, TXLO2, std::placeholders::_1));
+ _rxlo1 = max287x_iface::make<max2871>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, RXLO1, std::placeholders::_1));
+ _rxlo2 = max287x_iface::make<max2871>(
+ std::bind(&ubx_xcvr::write_spi_regs, this, RXLO2, std::placeholders::_1));
std::vector<max287x_iface::sptr> los{_txlo1, _txlo2, _rxlo1, _rxlo2};
- for(max287x_iface::sptr lo: los)
- {
+ for (max287x_iface::sptr lo : los) {
lo->set_auto_retune(false);
- //lo->set_cycle_slip_mode(true); // tried it - caused longer lock times
+ // lo->set_cycle_slip_mode(true); // tried it - caused longer lock times
lo->set_charge_pump_current(max287x_iface::CHARGE_PUMP_CURRENT_5_12MA);
lo->set_muxout_mode(max287x_iface::MUXOUT_SYNC);
lo->set_ld_pin_mode(max287x_iface::LD_PIN_MODE_DLD);
}
- }
- else
- {
+ } else {
UHD_THROW_INVALID_CODE_PATH();
}
// Initialize CPLD register
_prev_cpld_value = 0xFFFF;
- _cpld_reg.value = 0;
+ _cpld_reg.value = 0;
write_cpld_reg();
////////////////////////////////////////////////////////////////////
// Register power save properties
////////////////////////////////////////////////////////////////////
- get_rx_subtree()->create<std::vector<std::string> >("power_mode/options")
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("power_mode/options")
.set(ubx_power_modes);
- get_rx_subtree()->create<std::string>("power_mode/value")
- .add_coerced_subscriber(std::bind(&ubx_xcvr::set_power_mode, this, std::placeholders::_1))
+ get_rx_subtree()
+ ->create<std::string>("power_mode/value")
+ .add_coerced_subscriber(
+ std::bind(&ubx_xcvr::set_power_mode, this, std::placeholders::_1))
.set("performance");
- get_rx_subtree()->create<std::vector<std::string> >("xcvr_mode/options")
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("xcvr_mode/options")
.set(ubx_xcvr_modes);
- get_rx_subtree()->create<std::string>("xcvr_mode/value")
- .add_coerced_subscriber(std::bind(&ubx_xcvr::set_xcvr_mode, this, std::placeholders::_1))
+ get_rx_subtree()
+ ->create<std::string>("xcvr_mode/value")
+ .add_coerced_subscriber(
+ std::bind(&ubx_xcvr::set_xcvr_mode, this, std::placeholders::_1))
.set("FDX");
- get_rx_subtree()->create<std::vector<std::string> >("temp_comp_mode/options")
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("temp_comp_mode/options")
.set(ubx_temp_comp_modes);
get_rx_subtree()
->create<std::string>("temp_comp_mode/value")
.add_coerced_subscriber(
[this](std::string mode) { this->set_temp_comp_mode(mode); })
.set("disabled");
- get_tx_subtree()->create<std::vector<std::string> >("power_mode/options")
+ get_tx_subtree()
+ ->create<std::vector<std::string>>("power_mode/options")
.set(ubx_power_modes);
- get_tx_subtree()->create<std::string>("power_mode/value")
- .add_coerced_subscriber(std::bind(&uhd::property<std::string>::set, &get_rx_subtree()->access<std::string>("power_mode/value"), std::placeholders::_1))
- .set_publisher(std::bind(&uhd::property<std::string>::get, &get_rx_subtree()->access<std::string>("power_mode/value")));
- get_tx_subtree()->create<std::vector<std::string> >("xcvr_mode/options")
+ get_tx_subtree()
+ ->create<std::string>("power_mode/value")
+ .add_coerced_subscriber(std::bind(&uhd::property<std::string>::set,
+ &get_rx_subtree()->access<std::string>("power_mode/value"),
+ std::placeholders::_1))
+ .set_publisher(std::bind(&uhd::property<std::string>::get,
+ &get_rx_subtree()->access<std::string>("power_mode/value")));
+ get_tx_subtree()
+ ->create<std::vector<std::string>>("xcvr_mode/options")
.set(ubx_xcvr_modes);
- get_tx_subtree()->create<std::string>("xcvr_mode/value")
- .add_coerced_subscriber(std::bind(&uhd::property<std::string>::set, &get_rx_subtree()->access<std::string>("xcvr_mode/value"), std::placeholders::_1))
- .set_publisher(std::bind(&uhd::property<std::string>::get, &get_rx_subtree()->access<std::string>("xcvr_mode/value")));
- get_tx_subtree()->create<std::vector<std::string> >("temp_comp_mode/options")
+ get_tx_subtree()
+ ->create<std::string>("xcvr_mode/value")
+ .add_coerced_subscriber(std::bind(&uhd::property<std::string>::set,
+ &get_rx_subtree()->access<std::string>("xcvr_mode/value"),
+ std::placeholders::_1))
+ .set_publisher(std::bind(&uhd::property<std::string>::get,
+ &get_rx_subtree()->access<std::string>("xcvr_mode/value")));
+ get_tx_subtree()
+ ->create<std::vector<std::string>>("temp_comp_mode/options")
.set(ubx_temp_comp_modes);
get_tx_subtree()
->create<std::string>("temp_comp_mode/value")
@@ -483,83 +501,84 @@ public:
// Register TX properties
////////////////////////////////////////////////////////////////////
get_tx_subtree()->create<std::string>("name").set("UBX TX");
- get_tx_subtree()->create<device_addr_t>("tune_args")
- .set(device_addr_t());
- get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ get_tx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
+ get_tx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&ubx_xcvr::get_locked, this, "TXLO"));
- get_tx_subtree()->create<double>("gains/PGA0/value")
- .set_coercer(std::bind(&ubx_xcvr::set_tx_gain, this, std::placeholders::_1)).set(0);
- get_tx_subtree()->create<meta_range_t>("gains/PGA0/range")
- .set(ubx_tx_gain_range);
- get_tx_subtree()->create<double>("freq/value")
+ get_tx_subtree()
+ ->create<double>("gains/PGA0/value")
+ .set_coercer(std::bind(&ubx_xcvr::set_tx_gain, this, std::placeholders::_1))
+ .set(0);
+ get_tx_subtree()->create<meta_range_t>("gains/PGA0/range").set(ubx_tx_gain_range);
+ get_tx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&ubx_xcvr::set_tx_freq, this, std::placeholders::_1))
.set(ubx_freq_range.start());
- get_tx_subtree()->create<meta_range_t>("freq/range")
- .set(ubx_freq_range);
- get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ get_tx_subtree()->create<meta_range_t>("freq/range").set(ubx_freq_range);
+ get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(ubx_tx_antennas);
- get_tx_subtree()->create<std::string>("antenna/value")
+ get_tx_subtree()
+ ->create<std::string>("antenna/value")
.set_coercer(std::bind(&ubx_xcvr::set_tx_ant, this, std::placeholders::_1))
.set(ubx_tx_antennas.at(0));
- get_tx_subtree()->create<std::string>("connection")
- .set("QI");
- get_tx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- get_tx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- get_tx_subtree()->create<double>("bandwidth/value")
- .set(bw);
- get_tx_subtree()->create<meta_range_t>("bandwidth/range")
+ get_tx_subtree()->create<std::string>("connection").set("QI");
+ get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
+ get_tx_subtree()->create<bool>("use_lo_offset").set(false);
+ get_tx_subtree()->create<double>("bandwidth/value").set(bw);
+ get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(bw, bw));
- get_tx_subtree()->create<int64_t>("sync_delay")
- .add_coerced_subscriber(std::bind(&ubx_xcvr::set_sync_delay, this, true, std::placeholders::_1))
+ get_tx_subtree()
+ ->create<int64_t>("sync_delay")
+ .add_coerced_subscriber(
+ std::bind(&ubx_xcvr::set_sync_delay, this, true, std::placeholders::_1))
.set(0);
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
get_rx_subtree()->create<std::string>("name").set("UBX RX");
- get_rx_subtree()->create<device_addr_t>("tune_args")
- .set(device_addr_t());
- get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ get_rx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
+ get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&ubx_xcvr::get_locked, this, "RXLO"));
- get_rx_subtree()->create<double>("gains/PGA0/value")
+ get_rx_subtree()
+ ->create<double>("gains/PGA0/value")
.set_coercer(std::bind(&ubx_xcvr::set_rx_gain, this, std::placeholders::_1))
.set(0);
- get_rx_subtree()->create<meta_range_t>("gains/PGA0/range")
- .set(ubx_rx_gain_range);
- get_rx_subtree()->create<double>("freq/value")
+ get_rx_subtree()->create<meta_range_t>("gains/PGA0/range").set(ubx_rx_gain_range);
+ get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&ubx_xcvr::set_rx_freq, this, std::placeholders::_1))
.set(ubx_freq_range.start());
- get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(ubx_freq_range);
- get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ get_rx_subtree()->create<meta_range_t>("freq/range").set(ubx_freq_range);
+ get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(ubx_rx_antennas);
- get_rx_subtree()->create<std::string>("antenna/value")
- .set_coercer(std::bind(&ubx_xcvr::set_rx_ant, this, std::placeholders::_1)).set("RX2");
- get_rx_subtree()->create<std::string>("connection")
- .set("IQ");
- get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- get_rx_subtree()->create<double>("bandwidth/value")
- .set(bw);
- get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ get_rx_subtree()
+ ->create<std::string>("antenna/value")
+ .set_coercer(std::bind(&ubx_xcvr::set_rx_ant, this, std::placeholders::_1))
+ .set("RX2");
+ get_rx_subtree()->create<std::string>("connection").set("IQ");
+ get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ get_rx_subtree()->create<double>("bandwidth/value").set(bw);
+ get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(bw, bw));
- get_rx_subtree()->create<int64_t>("sync_delay")
- .add_coerced_subscriber(std::bind(&ubx_xcvr::set_sync_delay, this, false, std::placeholders::_1))
+ get_rx_subtree()
+ ->create<int64_t>("sync_delay")
+ .add_coerced_subscriber(
+ std::bind(&ubx_xcvr::set_sync_delay, this, false, std::placeholders::_1))
.set(0);
}
virtual ~ubx_xcvr(void)
{
- UHD_SAFE_CALL
- (
+ UHD_SAFE_CALL(
// Shutdown synthesizers
- _txlo1->shutdown();
- _txlo2->shutdown();
- _rxlo1->shutdown();
+ _txlo1->shutdown(); _txlo2->shutdown(); _rxlo1->shutdown();
_rxlo2->shutdown();
// Reset CPLD values
@@ -578,17 +597,16 @@ public:
set_gpio_field(TXLO2_SYNC, 0);
set_gpio_field(RXLO1_SYNC, 0);
set_gpio_field(RXLO1_SYNC, 0);
- write_gpio();
- )
+ write_gpio();)
}
private:
- enum power_mode_t {PERFORMANCE,POWERSAVE};
- enum xcvr_mode_t {FDX, TDD, TX, RX, FAST_TDD};
+ enum power_mode_t { PERFORMANCE, POWERSAVE };
+ enum xcvr_mode_t { FDX, TDD, TX, RX, FAST_TDD };
/***********************************************************************
- * Helper Functions
- **********************************************************************/
+ * Helper Functions
+ **********************************************************************/
void write_spi_reg(spi_dest_t dest, uint32_t value)
{
boost::mutex::scoped_lock lock(_spi_mutex);
@@ -600,7 +618,7 @@ private:
{
boost::mutex::scoped_lock lock(_spi_mutex);
ROUTE_SPI(_iface, dest);
- for(uint32_t value: values)
+ for (uint32_t value : values)
WRITE_SPI(_iface, value);
}
@@ -611,8 +629,7 @@ private:
void write_cpld_reg()
{
- if (_cpld_reg.value != _prev_cpld_value)
- {
+ if (_cpld_reg.value != _prev_cpld_value) {
write_spi_reg(CPLD, _cpld_reg.value);
_prev_cpld_value = _cpld_reg.value;
}
@@ -621,15 +638,17 @@ private:
void set_gpio_field(ubx_gpio_field_id_t id, uint32_t value)
{
// Look up field info
- std::map<ubx_gpio_field_id_t,ubx_gpio_field_info_t>::iterator entry = _gpio_map.find(id);
+ std::map<ubx_gpio_field_id_t, ubx_gpio_field_info_t>::iterator entry =
+ _gpio_map.find(id);
if (entry == _gpio_map.end())
return;
ubx_gpio_field_info_t field_info = entry->second;
if (field_info.direction == ubx_gpio_field_info_t::OUTPUT)
return;
- ubx_gpio_reg_t *reg = (field_info.unit == dboard_iface::UNIT_TX ? &_tx_gpio_reg : &_rx_gpio_reg);
+ ubx_gpio_reg_t* reg =
+ (field_info.unit == dboard_iface::UNIT_TX ? &_tx_gpio_reg : &_rx_gpio_reg);
uint32_t _value = reg->value;
- uint32_t _mask = reg->mask;
+ uint32_t _mask = reg->mask;
// Set field and mask
_value &= ~field_info.mask;
@@ -637,10 +656,9 @@ private:
_mask |= field_info.mask;
// Mark whether register is dirty or not
- if (_value != reg->value)
- {
+ if (_value != reg->value) {
reg->value = _value;
- reg->mask = _mask;
+ reg->mask = _mask;
reg->dirty = true;
}
}
@@ -648,13 +666,15 @@ private:
uint32_t get_gpio_field(ubx_gpio_field_id_t id)
{
// Look up field info
- std::map<ubx_gpio_field_id_t,ubx_gpio_field_info_t>::iterator entry = _gpio_map.find(id);
+ std::map<ubx_gpio_field_id_t, ubx_gpio_field_info_t>::iterator entry =
+ _gpio_map.find(id);
if (entry == _gpio_map.end())
return 0;
ubx_gpio_field_info_t field_info = entry->second;
- if (field_info.direction == ubx_gpio_field_info_t::INPUT)
- {
- ubx_gpio_reg_t *reg = (field_info.unit == dboard_iface::UNIT_TX ? &_tx_gpio_reg : &_rx_gpio_reg);
+ if (field_info.direction == ubx_gpio_field_info_t::INPUT) {
+ ubx_gpio_reg_t* reg = (field_info.unit == dboard_iface::UNIT_TX
+ ? &_tx_gpio_reg
+ : &_rx_gpio_reg);
return (reg->value >> field_info.offset) & field_info.mask;
}
@@ -669,25 +689,24 @@ private:
void write_gpio()
{
- if (_tx_gpio_reg.dirty)
- {
- _iface->set_gpio_out(dboard_iface::UNIT_TX, _tx_gpio_reg.value, _tx_gpio_reg.mask);
+ if (_tx_gpio_reg.dirty) {
+ _iface->set_gpio_out(
+ dboard_iface::UNIT_TX, _tx_gpio_reg.value, _tx_gpio_reg.mask);
_tx_gpio_reg.dirty = false;
- _tx_gpio_reg.mask = 0;
+ _tx_gpio_reg.mask = 0;
}
- if (_rx_gpio_reg.dirty)
- {
- _iface->set_gpio_out(dboard_iface::UNIT_RX, _rx_gpio_reg.value, _rx_gpio_reg.mask);
+ if (_rx_gpio_reg.dirty) {
+ _iface->set_gpio_out(
+ dboard_iface::UNIT_RX, _rx_gpio_reg.value, _rx_gpio_reg.mask);
_rx_gpio_reg.dirty = false;
- _rx_gpio_reg.mask = 0;
+ _rx_gpio_reg.mask = 0;
}
}
void sync_phase(uhd::time_spec_t cmd_time, uhd::direction_t dir)
{
// Send phase sync signal only if the command time is set
- if (cmd_time != uhd::time_spec_t(0.0))
- {
+ if (cmd_time != uhd::time_spec_t(0.0)) {
// Delay 400 microseconds to allow LOs to lock
cmd_time += uhd::time_spec_t(0.0004);
@@ -703,14 +722,17 @@ private:
// multiple of the system reference, and the device time has been
// set on a PPS edge sampled by the system reference clock.
- const double pfd_freq = _iface->get_clock_rate(dir == TX_DIRECTION ? dboard_iface::UNIT_TX : dboard_iface::UNIT_RX);
- const double tick_rate = _iface->get_codec_rate(dir == TX_DIRECTION ? dboard_iface::UNIT_TX : dboard_iface::UNIT_RX);
+ const double pfd_freq = _iface->get_clock_rate(
+ dir == TX_DIRECTION ? dboard_iface::UNIT_TX : dboard_iface::UNIT_RX);
+ const double tick_rate = _iface->get_codec_rate(
+ dir == TX_DIRECTION ? dboard_iface::UNIT_TX : dboard_iface::UNIT_RX);
const int64_t ticks_per_pfd_cycle = (int64_t)(tick_rate / pfd_freq);
// Convert time to ticks
int64_t ticks = cmd_time.to_ticks(tick_rate);
// Align time to next falling edge of dboard clock
- ticks += ticks_per_pfd_cycle - (ticks % ticks_per_pfd_cycle) + (ticks_per_pfd_cycle / 2);
+ ticks += ticks_per_pfd_cycle - (ticks % ticks_per_pfd_cycle)
+ + (ticks_per_pfd_cycle / 2);
// Add any user specified delay
ticks += dir == TX_DIRECTION ? _tx_sync_delay : _rx_sync_delay;
// Set the command time
@@ -718,20 +740,22 @@ private:
_iface->set_command_time(cmd_time);
// Assert SYNC
- ubx_gpio_field_info_t lo1_field_info = _gpio_map.find(dir == TX_DIRECTION ? TXLO1_SYNC : RXLO1_SYNC)->second;
- ubx_gpio_field_info_t lo2_field_info = _gpio_map.find(dir == TX_DIRECTION ? TXLO2_SYNC : RXLO2_SYNC)->second;
+ ubx_gpio_field_info_t lo1_field_info =
+ _gpio_map.find(dir == TX_DIRECTION ? TXLO1_SYNC : RXLO1_SYNC)->second;
+ ubx_gpio_field_info_t lo2_field_info =
+ _gpio_map.find(dir == TX_DIRECTION ? TXLO2_SYNC : RXLO2_SYNC)->second;
uint16_t value = (1 << lo1_field_info.offset) | (1 << lo2_field_info.offset);
- uint16_t mask = lo1_field_info.mask | lo2_field_info.mask;
+ uint16_t mask = lo1_field_info.mask | lo2_field_info.mask;
dboard_iface::unit_t unit = lo1_field_info.unit;
UHD_ASSERT_THROW(lo1_field_info.unit == lo2_field_info.unit);
_iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, value, mask);
- cmd_time += uhd::time_spec_t(1/pfd_freq);
+ cmd_time += uhd::time_spec_t(1 / pfd_freq);
_iface->set_command_time(cmd_time);
_iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, value, mask);
- cmd_time += uhd::time_spec_t(1/pfd_freq);
+ cmd_time += uhd::time_spec_t(1 / pfd_freq);
_iface->set_command_time(cmd_time);
_iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, value, mask);
- cmd_time += uhd::time_spec_t(1/pfd_freq);
+ cmd_time += uhd::time_spec_t(1 / pfd_freq);
_iface->set_command_time(cmd_time);
_iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, value, mask);
@@ -747,18 +771,15 @@ private:
/***********************************************************************
* Board Control Handling
**********************************************************************/
- sensor_value_t get_locked(const std::string &pll_name)
+ sensor_value_t get_locked(const std::string& pll_name)
{
boost::mutex::scoped_lock lock(_mutex);
assert_has(ubx_plls, pll_name, "ubx pll name");
- if(pll_name == "TXLO")
- {
+ if (pll_name == "TXLO") {
_txlo_locked = (get_gpio_field(TX_LO_LOCKED) != 0);
return sensor_value_t("TXLO", _txlo_locked, "locked", "unlocked");
- }
- else if(pll_name == "RXLO")
- {
+ } else if (pll_name == "RXLO") {
_rxlo_locked = (get_gpio_field(RX_LO_LOCKED) != 0);
return sensor_value_t("RXLO", _rxlo_locked, "locked", "unlocked");
}
@@ -766,9 +787,9 @@ private:
return sensor_value_t("Unknown", false, "locked", "unlocked");
}
- std::string set_tx_ant(const std::string &ant)
+ std::string set_tx_ant(const std::string& ant)
{
- //validate input
+ // validate input
assert_has(ubx_tx_antennas, ant, "ubx tx antenna name");
set_cpld_field(CAL_ENABLE, (ant == "CAL"));
write_cpld_reg();
@@ -776,10 +797,10 @@ private:
}
// Set RX antennas
- std::string set_rx_ant(const std::string &ant)
+ std::string set_rx_ant(const std::string& ant)
{
boost::mutex::scoped_lock lock(_mutex);
- //validate input
+ // validate input
assert_has(ubx_rx_antennas, ant, "ubx rx antenna name");
// There can be long transients on TX, so force on the TX PA
@@ -788,14 +809,18 @@ private:
// is set to TX/RX (to prevent higher noise floor on RX).
// Setting the xcvr_mode to TDD will force on the PA when
// not in powersave mode regardless of the board revision.
- if (ant == "TX/RX")
- {
+ if (ant == "TX/RX") {
set_gpio_field(RX_ANT, 0);
- // Force on TX PA for boards with high isolation or if the user sets the TDD mode
- set_cpld_field(TXDRV_FORCEON, (_power_mode == POWERSAVE ? 0 : _high_isolation or _xcvr_mode == TDD ? 1 : 0));
+ // Force on TX PA for boards with high isolation or if the user sets the TDD
+ // mode
+ set_cpld_field(TXDRV_FORCEON,
+ (_power_mode == POWERSAVE
+ ? 0
+ : _high_isolation or _xcvr_mode == TDD ? 1 : 0));
} else {
set_gpio_field(RX_ANT, 1);
- set_cpld_field(TXDRV_FORCEON, (_power_mode == POWERSAVE ? 0 : 1)); // Keep PA on
+ set_cpld_field(
+ TXDRV_FORCEON, (_power_mode == POWERSAVE ? 0 : 1)); // Keep PA on
}
write_gpio();
write_cpld_reg();
@@ -809,12 +834,14 @@ private:
double set_tx_gain(double gain)
{
boost::mutex::scoped_lock lock(_mutex);
- gain = ubx_tx_gain_range.clip(gain);
- int attn_code = int(std::floor(gain * 2));
+ gain = ubx_tx_gain_range.clip(gain);
+ int attn_code = int(std::floor(gain * 2));
_ubx_tx_atten_val = ((attn_code & 0x3F) << 10);
set_gpio_field(TX_GAIN, attn_code);
write_gpio();
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX TX Gain: %f dB, Code: %d, IO Bits 0x%04x") % gain % attn_code % _ubx_tx_atten_val ;
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX TX Gain: %f dB, Code: %d, IO Bits 0x%04x") % gain
+ % attn_code % _ubx_tx_atten_val;
_tx_gain = gain;
return gain;
}
@@ -822,26 +849,28 @@ private:
double set_rx_gain(double gain)
{
boost::mutex::scoped_lock lock(_mutex);
- gain = ubx_rx_gain_range.clip(gain);
- int attn_code = int(std::floor(gain * 2));
+ gain = ubx_rx_gain_range.clip(gain);
+ int attn_code = int(std::floor(gain * 2));
_ubx_rx_atten_val = ((attn_code & 0x3F) << 10);
set_gpio_field(RX_GAIN, attn_code);
write_gpio();
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX RX Gain: %f dB, Code: %d, IO Bits 0x%04x") % gain % attn_code % _ubx_rx_atten_val ;
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX RX Gain: %f dB, Code: %d, IO Bits 0x%04x") % gain
+ % attn_code % _ubx_rx_atten_val;
_rx_gain = gain;
return gain;
}
/***********************************************************************
- * Frequency Handling
- **********************************************************************/
+ * Frequency Handling
+ **********************************************************************/
double set_tx_freq(double freq)
{
boost::mutex::scoped_lock lock(_mutex);
double freq_lo1 = 0.0;
double freq_lo2 = 0.0;
double ref_freq = _iface->get_clock_rate(dboard_iface::UNIT_TX);
- bool is_int_n = false;
+ bool is_int_n = false;
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
@@ -849,20 +878,18 @@ private:
* performance on some mixers. The default is fractional tuning.
*/
property_tree::sptr subtree = this->get_tx_subtree();
- device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX TX: the requested frequency is %f MHz") % (freq/1e6) ;
+ device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
+ is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX TX: the requested frequency is %f MHz") % (freq / 1e6);
double target_pfd_freq = _tx_target_pfd_freq;
- if (is_int_n and tune_args.has_key("int_n_step"))
- {
+ if (is_int_n and tune_args.has_key("int_n_step")) {
target_pfd_freq = tune_args.cast<double>("int_n_step", _tx_target_pfd_freq);
- if (target_pfd_freq > _tx_target_pfd_freq)
- {
+ if (target_pfd_freq > _tx_target_pfd_freq) {
UHD_LOGGER_WARNING("UBX")
- << boost::format("Requested int_n_step of %f MHz too large, clipping to %f MHz")
- % (target_pfd_freq/1e6)
- % (_tx_target_pfd_freq/1e6)
- ;
+ << boost::format(
+ "Requested int_n_step of %f MHz too large, clipping to %f MHz")
+ % (target_pfd_freq / 1e6) % (_tx_target_pfd_freq / 1e6);
target_pfd_freq = _tx_target_pfd_freq;
}
}
@@ -873,43 +900,39 @@ private:
// Power up/down LOs
if (_txlo1->is_shutdown())
_txlo1->power_up();
- if (_txlo2->is_shutdown() and (_power_mode == PERFORMANCE or freq < (500*fMHz)))
+ if (_txlo2->is_shutdown() and (_power_mode == PERFORMANCE or freq < (500 * fMHz)))
_txlo2->power_up();
- else if (freq >= 500*fMHz and _power_mode == POWERSAVE)
+ else if (freq >= 500 * fMHz and _power_mode == POWERSAVE)
_txlo2->shutdown();
// Set up LOs for phase sync if command time is set
uhd::time_spec_t cmd_time = _iface->get_command_time();
- if (cmd_time != uhd::time_spec_t(0.0))
- {
+ if (cmd_time != uhd::time_spec_t(0.0)) {
_txlo1->config_for_sync(true);
if (not _txlo2->is_shutdown())
_txlo2->config_for_sync(true);
- }
- else
- {
+ } else {
_txlo1->config_for_sync(false);
if (not _txlo2->is_shutdown())
_txlo2->config_for_sync(false);
}
// Set up registers for the requested frequency
- if (freq < (500*fMHz))
- {
+ if (freq < (500 * fMHz)) {
set_cpld_field(TXLO1_FSEL3, 0);
set_cpld_field(TXLO1_FSEL2, 1);
set_cpld_field(TXLO1_FSEL1, 0);
set_cpld_field(TXLB_SEL, 1);
set_cpld_field(TXHB_SEL, 0);
// Set LO1 to IF of 2100 MHz (offset from RX IF to reduce leakage)
- freq_lo1 = _txlo1->set_frequency(2100*fMHz, ref_freq, target_pfd_freq, is_int_n);
+ freq_lo1 =
+ _txlo1->set_frequency(2100 * fMHz, ref_freq, target_pfd_freq, is_int_n);
_txlo1->set_output_power(max287x_iface::OUTPUT_POWER_5DBM);
// Set LO2 to IF minus desired frequency
- freq_lo2 = _txlo2->set_frequency(freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
+ freq_lo2 = _txlo2->set_frequency(
+ freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
_txlo2->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= (500*fMHz)) && (freq <= (800*fMHz)))
- {
+ } else if ((freq >= (500 * fMHz)) && (freq <= (800 * fMHz))) {
set_cpld_field(TXLO1_FSEL3, 0);
set_cpld_field(TXLO1_FSEL2, 0);
set_cpld_field(TXLO1_FSEL1, 1);
@@ -917,9 +940,7 @@ private:
set_cpld_field(TXHB_SEL, 1);
freq_lo1 = _txlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_txlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq > (800*fMHz)) && (freq <= (1000*fMHz)))
- {
+ } else if ((freq > (800 * fMHz)) && (freq <= (1000 * fMHz))) {
set_cpld_field(TXLO1_FSEL3, 0);
set_cpld_field(TXLO1_FSEL2, 0);
set_cpld_field(TXLO1_FSEL1, 1);
@@ -927,9 +948,7 @@ private:
set_cpld_field(TXHB_SEL, 1);
freq_lo1 = _txlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_txlo1->set_output_power(max287x_iface::OUTPUT_POWER_5DBM);
- }
- else if ((freq > (1000*fMHz)) && (freq <= (2200*fMHz)))
- {
+ } else if ((freq > (1000 * fMHz)) && (freq <= (2200 * fMHz))) {
set_cpld_field(TXLO1_FSEL3, 0);
set_cpld_field(TXLO1_FSEL2, 1);
set_cpld_field(TXLO1_FSEL1, 0);
@@ -937,9 +956,7 @@ private:
set_cpld_field(TXHB_SEL, 1);
freq_lo1 = _txlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_txlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq > (2200*fMHz)) && (freq <= (2500*fMHz)))
- {
+ } else if ((freq > (2200 * fMHz)) && (freq <= (2500 * fMHz))) {
set_cpld_field(TXLO1_FSEL3, 0);
set_cpld_field(TXLO1_FSEL2, 1);
set_cpld_field(TXLO1_FSEL1, 0);
@@ -947,9 +964,7 @@ private:
set_cpld_field(TXHB_SEL, 1);
freq_lo1 = _txlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_txlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq > (2500*fMHz)) && (freq <= (6000*fMHz)))
- {
+ } else if ((freq > (2500 * fMHz)) && (freq <= (6000 * fMHz))) {
set_cpld_field(TXLO1_FSEL3, 1);
set_cpld_field(TXLO1_FSEL2, 0);
set_cpld_field(TXLO1_FSEL1, 0);
@@ -962,35 +977,37 @@ private:
// To reduce the number of commands issued to the device, write to the
// SPI destination already addressed first. This avoids the writes to
// the GPIO registers to route the SPI to the same destination.
- switch (get_gpio_field(SPI_ADDR))
- {
- case TXLO1:
- _txlo1->commit();
- if (freq < (500*fMHz)) _txlo2->commit();
- write_cpld_reg();
- break;
- case TXLO2:
- if (freq < (500*fMHz)) _txlo2->commit();
- _txlo1->commit();
- write_cpld_reg();
- break;
- default:
- write_cpld_reg();
- _txlo1->commit();
- if (freq < (500*fMHz)) _txlo2->commit();
- break;
+ switch (get_gpio_field(SPI_ADDR)) {
+ case TXLO1:
+ _txlo1->commit();
+ if (freq < (500 * fMHz))
+ _txlo2->commit();
+ write_cpld_reg();
+ break;
+ case TXLO2:
+ if (freq < (500 * fMHz))
+ _txlo2->commit();
+ _txlo1->commit();
+ write_cpld_reg();
+ break;
+ default:
+ write_cpld_reg();
+ _txlo1->commit();
+ if (freq < (500 * fMHz))
+ _txlo2->commit();
+ break;
}
- if (cmd_time != uhd::time_spec_t(0.0) and _txlo1->can_sync())
- {
+ if (cmd_time != uhd::time_spec_t(0.0) and _txlo1->can_sync()) {
sync_phase(cmd_time, TX_DIRECTION);
}
- _tx_freq = freq_lo1 - freq_lo2;
+ _tx_freq = freq_lo1 - freq_lo2;
_txlo1_freq = freq_lo1;
_txlo2_freq = freq_lo2;
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX TX: the actual frequency is %f MHz") % (_tx_freq/1e6) ;
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX TX: the actual frequency is %f MHz") % (_tx_freq / 1e6);
return _tx_freq;
}
@@ -1001,24 +1018,22 @@ private:
double freq_lo1 = 0.0;
double freq_lo2 = 0.0;
double ref_freq = _iface->get_clock_rate(dboard_iface::UNIT_RX);
- bool is_int_n = false;
+ bool is_int_n = false;
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX RX: the requested frequency is %f MHz") % (freq/1e6) ;
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX RX: the requested frequency is %f MHz") % (freq / 1e6);
property_tree::sptr subtree = this->get_rx_subtree();
- device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
+ device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
+ is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
double target_pfd_freq = _rx_target_pfd_freq;
- if (is_int_n and tune_args.has_key("int_n_step"))
- {
+ if (is_int_n and tune_args.has_key("int_n_step")) {
target_pfd_freq = tune_args.cast<double>("int_n_step", _rx_target_pfd_freq);
- if (target_pfd_freq > _rx_target_pfd_freq)
- {
+ if (target_pfd_freq > _rx_target_pfd_freq) {
UHD_LOGGER_WARNING("UBX")
- << boost::format("Requested int_n_step of %f Mhz too large, clipping to %f MHz")
- % (target_pfd_freq/1e6)
- % (_rx_target_pfd_freq/1e6)
- ;
+ << boost::format(
+ "Requested int_n_step of %f Mhz too large, clipping to %f MHz")
+ % (target_pfd_freq / 1e6) % (_rx_target_pfd_freq / 1e6);
target_pfd_freq = _rx_target_pfd_freq;
}
}
@@ -1029,29 +1044,25 @@ private:
// Power up/down LOs
if (_rxlo1->is_shutdown())
_rxlo1->power_up();
- if (_rxlo2->is_shutdown() and (_power_mode == PERFORMANCE or freq < 500*fMHz))
+ if (_rxlo2->is_shutdown() and (_power_mode == PERFORMANCE or freq < 500 * fMHz))
_rxlo2->power_up();
- else if (freq >= 500*fMHz and _power_mode == POWERSAVE)
+ else if (freq >= 500 * fMHz and _power_mode == POWERSAVE)
_rxlo2->shutdown();
// Set up LOs for phase sync if command time is set
uhd::time_spec_t cmd_time = _iface->get_command_time();
- if (cmd_time != uhd::time_spec_t(0.0))
- {
+ if (cmd_time != uhd::time_spec_t(0.0)) {
_rxlo1->config_for_sync(true);
if (not _rxlo2->is_shutdown())
_rxlo2->config_for_sync(true);
- }
- else
- {
+ } else {
_rxlo1->config_for_sync(false);
if (not _rxlo2->is_shutdown())
_rxlo2->config_for_sync(false);
}
// Work with frequencies
- if (freq < 100*fMHz)
- {
+ if (freq < 100 * fMHz) {
set_cpld_field(SEL_LNA1, 0);
set_cpld_field(SEL_LNA2, 1);
set_cpld_field(RXLO1_FSEL3, 1);
@@ -1059,15 +1070,16 @@ private:
set_cpld_field(RXLO1_FSEL1, 0);
set_cpld_field(RXLB_SEL, 1);
set_cpld_field(RXHB_SEL, 0);
- // Set LO1 to IF of 2380 MHz (2440 MHz filter center minus 60 MHz offset to minimize LO leakage)
- freq_lo1 = _rxlo1->set_frequency(2380*fMHz, ref_freq, target_pfd_freq, is_int_n);
+ // Set LO1 to IF of 2380 MHz (2440 MHz filter center minus 60 MHz offset to
+ // minimize LO leakage)
+ freq_lo1 =
+ _rxlo1->set_frequency(2380 * fMHz, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_5DBM);
// Set LO2 to IF minus desired frequency
- freq_lo2 = _rxlo2->set_frequency(freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
+ freq_lo2 = _rxlo2->set_frequency(
+ freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo2->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 100*fMHz) && (freq < 500*fMHz))
- {
+ } else if ((freq >= 100 * fMHz) && (freq < 500 * fMHz)) {
set_cpld_field(SEL_LNA1, 0);
set_cpld_field(SEL_LNA2, 1);
set_cpld_field(RXLO1_FSEL3, 1);
@@ -1076,14 +1088,14 @@ private:
set_cpld_field(RXLB_SEL, 1);
set_cpld_field(RXHB_SEL, 0);
// Set LO1 to IF of 2440 (center of filter)
- freq_lo1 = _rxlo1->set_frequency(2440*fMHz, ref_freq, target_pfd_freq, is_int_n);
+ freq_lo1 =
+ _rxlo1->set_frequency(2440 * fMHz, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_5DBM);
// Set LO2 to IF minus desired frequency
- freq_lo2 = _rxlo2->set_frequency(freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
+ freq_lo2 = _rxlo2->set_frequency(
+ freq_lo1 - freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 500*fMHz) && (freq < 800*fMHz))
- {
+ } else if ((freq >= 500 * fMHz) && (freq < 800 * fMHz)) {
set_cpld_field(SEL_LNA1, 0);
set_cpld_field(SEL_LNA2, 1);
set_cpld_field(RXLO1_FSEL3, 0);
@@ -1093,9 +1105,7 @@ private:
set_cpld_field(RXHB_SEL, 1);
freq_lo1 = _rxlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 800*fMHz) && (freq < 1000*fMHz))
- {
+ } else if ((freq >= 800 * fMHz) && (freq < 1000 * fMHz)) {
set_cpld_field(SEL_LNA1, 0);
set_cpld_field(SEL_LNA2, 1);
set_cpld_field(RXLO1_FSEL3, 0);
@@ -1105,9 +1115,7 @@ private:
set_cpld_field(RXHB_SEL, 1);
freq_lo1 = _rxlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_5DBM);
- }
- else if ((freq >= 1000*fMHz) && (freq < 1500*fMHz))
- {
+ } else if ((freq >= 1000 * fMHz) && (freq < 1500 * fMHz)) {
set_cpld_field(SEL_LNA1, 0);
set_cpld_field(SEL_LNA2, 1);
set_cpld_field(RXLO1_FSEL3, 0);
@@ -1117,9 +1125,7 @@ private:
set_cpld_field(RXHB_SEL, 1);
freq_lo1 = _rxlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 1500*fMHz) && (freq < 2200*fMHz))
- {
+ } else if ((freq >= 1500 * fMHz) && (freq < 2200 * fMHz)) {
set_cpld_field(SEL_LNA1, 1);
set_cpld_field(SEL_LNA2, 0);
set_cpld_field(RXLO1_FSEL3, 0);
@@ -1129,9 +1135,7 @@ private:
set_cpld_field(RXHB_SEL, 1);
freq_lo1 = _rxlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 2200*fMHz) && (freq < 2500*fMHz))
- {
+ } else if ((freq >= 2200 * fMHz) && (freq < 2500 * fMHz)) {
set_cpld_field(SEL_LNA1, 1);
set_cpld_field(SEL_LNA2, 0);
set_cpld_field(RXLO1_FSEL3, 0);
@@ -1141,9 +1145,7 @@ private:
set_cpld_field(RXHB_SEL, 1);
freq_lo1 = _rxlo1->set_frequency(freq, ref_freq, target_pfd_freq, is_int_n);
_rxlo1->set_output_power(max287x_iface::OUTPUT_POWER_2DBM);
- }
- else if ((freq >= 2500*fMHz) && (freq <= 6000*fMHz))
- {
+ } else if ((freq >= 2500 * fMHz) && (freq <= 6000 * fMHz)) {
set_cpld_field(SEL_LNA1, 1);
set_cpld_field(SEL_LNA2, 0);
set_cpld_field(RXLO1_FSEL3, 1);
@@ -1158,47 +1160,48 @@ private:
// To reduce the number of commands issued to the device, write to the
// SPI destination already addressed first. This avoids the writes to
// the GPIO registers to route the SPI to the same destination.
- switch (get_gpio_field(SPI_ADDR))
- {
- case RXLO1:
- _rxlo1->commit();
- if (freq < (500*fMHz)) _rxlo2->commit();
- write_cpld_reg();
- break;
- case RXLO2:
- if (freq < (500*fMHz)) _rxlo2->commit();
- _rxlo1->commit();
- write_cpld_reg();
- break;
- default:
- write_cpld_reg();
- _rxlo1->commit();
- if (freq < (500*fMHz)) _rxlo2->commit();
- break;
+ switch (get_gpio_field(SPI_ADDR)) {
+ case RXLO1:
+ _rxlo1->commit();
+ if (freq < (500 * fMHz))
+ _rxlo2->commit();
+ write_cpld_reg();
+ break;
+ case RXLO2:
+ if (freq < (500 * fMHz))
+ _rxlo2->commit();
+ _rxlo1->commit();
+ write_cpld_reg();
+ break;
+ default:
+ write_cpld_reg();
+ _rxlo1->commit();
+ if (freq < (500 * fMHz))
+ _rxlo2->commit();
+ break;
}
- if (cmd_time != uhd::time_spec_t(0.0) and _rxlo1->can_sync())
- {
+ if (cmd_time != uhd::time_spec_t(0.0) and _rxlo1->can_sync()) {
sync_phase(cmd_time, RX_DIRECTION);
}
- _rx_freq = freq_lo1 - freq_lo2;
+ _rx_freq = freq_lo1 - freq_lo2;
_rxlo1_freq = freq_lo1;
_rxlo2_freq = freq_lo2;
- UHD_LOGGER_TRACE("UBX") << boost::format("UBX RX: the actual frequency is %f MHz") % (_rx_freq/1e6) ;
+ UHD_LOGGER_TRACE("UBX")
+ << boost::format("UBX RX: the actual frequency is %f MHz") % (_rx_freq / 1e6);
return _rx_freq;
}
/***********************************************************************
- * Setting Modes
- **********************************************************************/
+ * Setting Modes
+ **********************************************************************/
void set_power_mode(std::string mode)
{
boost::mutex::scoped_lock lock(_mutex);
- if (mode == "performance")
- {
+ if (mode == "performance") {
// performance mode attempts to reduce tuning and settling time
// as much as possible without adding noise.
@@ -1231,9 +1234,7 @@ private:
write_cpld_reg();
_power_mode = PERFORMANCE;
- }
- else if (mode == "powersave")
- {
+ } else if (mode == "powersave") {
// powersave mode attempts to use the least amount of power possible
// by powering on components only when needed. Longer tuning and
// settling times are expected.
@@ -1270,26 +1271,17 @@ private:
// the board is in TX, RX, or full duplex mode
// to reduce power consumption and RF noise.
boost::to_upper(mode);
- if (mode == "FDX")
- {
+ if (mode == "FDX") {
_xcvr_mode = FDX;
- }
- else if (mode == "TDD")
- {
+ } else if (mode == "TDD") {
_xcvr_mode = TDD;
set_cpld_field(TXDRV_FORCEON, 1);
write_cpld_reg();
- }
- else if (mode == "TX")
- {
+ } else if (mode == "TX") {
_xcvr_mode = TX;
- }
- else if (mode == "RX")
- {
+ } else if (mode == "RX") {
_xcvr_mode = RX;
- }
- else
- {
+ } else {
throw uhd::value_error("invalid xcvr_mode");
}
}
@@ -1321,14 +1313,14 @@ private:
}
/***********************************************************************
- * Variables
- **********************************************************************/
+ * Variables
+ **********************************************************************/
dboard_iface::sptr _iface;
boost::mutex _spi_mutex;
boost::mutex _mutex;
ubx_cpld_reg_t _cpld_reg;
uint32_t _prev_cpld_value;
- std::map<ubx_gpio_field_id_t,ubx_gpio_field_info_t> _gpio_map;
+ std::map<ubx_gpio_field_id_t, ubx_gpio_field_info_t> _gpio_map;
std::shared_ptr<max287x_iface> _txlo1;
std::shared_ptr<max287x_iface> _txlo2;
std::shared_ptr<max287x_iface> _rxlo1;
@@ -1368,12 +1360,20 @@ static dboard_base::sptr make_ubx(dboard_base::ctor_args_t args)
UHD_STATIC_BLOCK(reg_ubx_dboards)
{
- dboard_manager::register_dboard(UBX_PROTO_V3_RX_ID, UBX_PROTO_V3_TX_ID, &make_ubx, "UBX v0.3");
- dboard_manager::register_dboard(UBX_PROTO_V4_RX_ID, UBX_PROTO_V4_TX_ID, &make_ubx, "UBX v0.4");
- dboard_manager::register_dboard(UBX_V1_40MHZ_RX_ID, UBX_V1_40MHZ_TX_ID, &make_ubx, "UBX-40 v1");
- dboard_manager::register_dboard(UBX_V1_160MHZ_RX_ID, UBX_V1_160MHZ_TX_ID, &make_ubx, "UBX-160 v1");
- dboard_manager::register_dboard(UBX_V2_40MHZ_RX_ID, UBX_V2_40MHZ_TX_ID, &make_ubx, "UBX-40 v2");
- dboard_manager::register_dboard(UBX_V2_160MHZ_RX_ID, UBX_V2_160MHZ_TX_ID, &make_ubx, "UBX-160 v2");
- dboard_manager::register_dboard(UBX_LP_160MHZ_RX_ID, UBX_LP_160MHZ_TX_ID, &make_ubx, "UBX-160-LP");
- dboard_manager::register_dboard(UBX_TDD_160MHZ_RX_ID, UBX_TDD_160MHZ_TX_ID, &make_ubx, "UBX-TDD");
+ dboard_manager::register_dboard(
+ UBX_PROTO_V3_RX_ID, UBX_PROTO_V3_TX_ID, &make_ubx, "UBX v0.3");
+ dboard_manager::register_dboard(
+ UBX_PROTO_V4_RX_ID, UBX_PROTO_V4_TX_ID, &make_ubx, "UBX v0.4");
+ dboard_manager::register_dboard(
+ UBX_V1_40MHZ_RX_ID, UBX_V1_40MHZ_TX_ID, &make_ubx, "UBX-40 v1");
+ dboard_manager::register_dboard(
+ UBX_V1_160MHZ_RX_ID, UBX_V1_160MHZ_TX_ID, &make_ubx, "UBX-160 v1");
+ dboard_manager::register_dboard(
+ UBX_V2_40MHZ_RX_ID, UBX_V2_40MHZ_TX_ID, &make_ubx, "UBX-40 v2");
+ dboard_manager::register_dboard(
+ UBX_V2_160MHZ_RX_ID, UBX_V2_160MHZ_TX_ID, &make_ubx, "UBX-160 v2");
+ dboard_manager::register_dboard(
+ UBX_LP_160MHZ_RX_ID, UBX_LP_160MHZ_TX_ID, &make_ubx, "UBX-160-LP");
+ dboard_manager::register_dboard(
+ UBX_TDD_160MHZ_RX_ID, UBX_TDD_160MHZ_TX_ID, &make_ubx, "UBX-TDD");
}
diff --git a/host/lib/usrp/dboard/db_unknown.cpp b/host/lib/usrp/dboard/db_unknown.cpp
index 2640ad607..f6587b4b3 100644
--- a/host/lib/usrp/dboard/db_unknown.cpp
+++ b/host/lib/usrp/dboard/db_unknown.cpp
@@ -6,15 +6,15 @@
//
#include <uhd/types/ranges.hpp>
-#include <uhd/utils/assert_has.hpp>
-#include <uhd/utils/static.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_manager.hpp>
+#include <uhd/utils/assert_has.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/static.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
-#include <vector>
#include <tuple>
+#include <vector>
using namespace uhd;
using namespace uhd::usrp;
@@ -23,26 +23,26 @@ using namespace boost::assign;
/***********************************************************************
* Utility functions
**********************************************************************/
-static void warn_if_old_rfx(const dboard_id_t &dboard_id, const std::string &xx){
- typedef std::tuple<std::string, dboard_id_t, dboard_id_t> old_ids_t; //name, rx_id, tx_id
- static const std::vector<old_ids_t> old_rfx_ids = list_of
- (old_ids_t("Flex 400 Classic", 0x0004, 0x0008))
- (old_ids_t("Flex 900 Classic", 0x0005, 0x0009))
- (old_ids_t("Flex 1200 Classic", 0x0006, 0x000a))
- (old_ids_t("Flex 1800 Classic", 0x0030, 0x0031))
- (old_ids_t("Flex 2400 Classic", 0x0007, 0x000b))
- ;
- for(const old_ids_t &old_id: old_rfx_ids){
- std::string name; dboard_id_t rx_id, tx_id;
+static void warn_if_old_rfx(const dboard_id_t& dboard_id, const std::string& xx)
+{
+ typedef std::tuple<std::string, dboard_id_t, dboard_id_t>
+ old_ids_t; // name, rx_id, tx_id
+ static const std::vector<old_ids_t> old_rfx_ids =
+ list_of(old_ids_t("Flex 400 Classic", 0x0004, 0x0008))(
+ old_ids_t("Flex 900 Classic", 0x0005, 0x0009))(
+ old_ids_t("Flex 1200 Classic", 0x0006, 0x000a))(
+ old_ids_t("Flex 1800 Classic", 0x0030, 0x0031))(
+ old_ids_t("Flex 2400 Classic", 0x0007, 0x000b));
+ for (const old_ids_t& old_id : old_rfx_ids) {
+ std::string name;
+ dboard_id_t rx_id, tx_id;
std::tie(name, rx_id, tx_id) = old_id;
- if (
- (xx == "RX" and rx_id == dboard_id) or
- (xx == "TX" and tx_id == dboard_id)
- ) UHD_LOGGER_WARNING("unknown_db") << boost::format(
- "Detected %s daughterboard %s\n"
- "This board requires modification to use.\n"
- "See the daughterboard application notes.\n"
- ) % xx % name;
+ if ((xx == "RX" and rx_id == dboard_id) or (xx == "TX" and tx_id == dboard_id))
+ UHD_LOGGER_WARNING("unknown_db")
+ << boost::format("Detected %s daughterboard %s\n"
+ "This board requires modification to use.\n"
+ "See the daughterboard application notes.\n")
+ % xx % name;
}
}
@@ -50,12 +50,14 @@ static void warn_if_old_rfx(const dboard_id_t &dboard_id, const std::string &xx)
* The unknown boards:
* Like a basic board, but with only one subdev.
**********************************************************************/
-class unknown_rx : public rx_dboard_base{
+class unknown_rx : public rx_dboard_base
+{
public:
unknown_rx(ctor_args_t args);
};
-class unknown_tx : public tx_dboard_base{
+class unknown_tx : public tx_dboard_base
+{
public:
unknown_tx(ctor_args_t args);
};
@@ -63,15 +65,18 @@ public:
/***********************************************************************
* Register the unknown dboards
**********************************************************************/
-static dboard_base::sptr make_unknown_rx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_unknown_rx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new unknown_rx(args));
}
-static dboard_base::sptr make_unknown_tx(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_unknown_tx(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new unknown_tx(args));
}
-UHD_STATIC_BLOCK(reg_unknown_dboards){
+UHD_STATIC_BLOCK(reg_unknown_dboards)
+{
dboard_manager::register_dboard(0xfff0, &make_unknown_tx, "Unknown TX");
dboard_manager::register_dboard(0xfff1, &make_unknown_rx, "Unknown RX");
}
@@ -79,71 +84,61 @@ UHD_STATIC_BLOCK(reg_unknown_dboards){
/***********************************************************************
* Unknown RX dboard
**********************************************************************/
-unknown_rx::unknown_rx(ctor_args_t args) : rx_dboard_base(args){
+unknown_rx::unknown_rx(ctor_args_t args) : rx_dboard_base(args)
+{
warn_if_old_rfx(this->get_rx_id(), "RX");
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name").set(
- std::string(str(boost::format("%s - %s")
- % get_rx_id().to_pp_string()
- % get_subdev_name()
- )));
- this->get_rx_subtree()->create<int>("gains"); //phony property so this dir exists
- this->get_rx_subtree()->create<double>("freq/value")
- .set(double(0.0));
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
+ this->get_rx_subtree()->create<std::string>("name").set(std::string(
+ str(boost::format("%s - %s") % get_rx_id().to_pp_string() % get_subdev_name())));
+ this->get_rx_subtree()->create<int>("gains"); // phony property so this dir exists
+ this->get_rx_subtree()->create<double>("freq/value").set(double(0.0));
+ this->get_rx_subtree()
+ ->create<meta_range_t>("freq/range")
.set(freq_range_t(double(0.0), double(0.0)));
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .set("");
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()->create<std::string>("antenna/value").set("");
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(list_of(""));
- this->get_rx_subtree()->create<int>("sensors"); //phony property so this dir exists
- this->get_rx_subtree()->create<std::string>("connection")
- .set("IQ");
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
- .set(double(0.0));
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_rx_subtree()->create<int>("sensors"); // phony property so this dir exists
+ this->get_rx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()->create<double>("bandwidth/value").set(double(0.0));
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(0.0, 0.0));
}
/***********************************************************************
* Unknown TX dboard
**********************************************************************/
-unknown_tx::unknown_tx(ctor_args_t args) : tx_dboard_base(args){
+unknown_tx::unknown_tx(ctor_args_t args) : tx_dboard_base(args)
+{
warn_if_old_rfx(this->get_tx_id(), "TX");
////////////////////////////////////////////////////////////////////
// Register properties
////////////////////////////////////////////////////////////////////
- this->get_tx_subtree()->create<std::string>("name").set(
- std::string(str(boost::format("%s - %s")
- % get_tx_id().to_pp_string()
- % get_subdev_name()
- )));
- this->get_tx_subtree()->create<int>("gains"); //phony property so this dir exists
- this->get_tx_subtree()->create<double>("freq/value")
- .set(double(0.0));
- this->get_tx_subtree()->create<meta_range_t>("freq/range")
+ this->get_tx_subtree()->create<std::string>("name").set(std::string(
+ str(boost::format("%s - %s") % get_tx_id().to_pp_string() % get_subdev_name())));
+ this->get_tx_subtree()->create<int>("gains"); // phony property so this dir exists
+ this->get_tx_subtree()->create<double>("freq/value").set(double(0.0));
+ this->get_tx_subtree()
+ ->create<meta_range_t>("freq/range")
.set(freq_range_t(double(0.0), double(0.0)));
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .set("");
- this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_tx_subtree()->create<std::string>("antenna/value").set("");
+ this->get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(list_of(""));
- this->get_tx_subtree()->create<int>("sensors"); //phony property so this dir exists
- this->get_tx_subtree()->create<std::string>("connection")
- .set("IQ");
- this->get_tx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_tx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_tx_subtree()->create<double>("bandwidth/value")
- .set(double(0.0));
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_tx_subtree()->create<int>("sensors"); // phony property so this dir exists
+ this->get_tx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_tx_subtree()->create<double>("bandwidth/value").set(double(0.0));
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(freq_range_t(0.0, 0.0));
}
diff --git a/host/lib/usrp/dboard/db_wbx_common.cpp b/host/lib/usrp/dboard/db_wbx_common.cpp
index 4651de76a..df89e3779 100644
--- a/host/lib/usrp/dboard/db_wbx_common.cpp
+++ b/host/lib/usrp/dboard/db_wbx_common.cpp
@@ -22,23 +22,24 @@ using namespace boost::assign;
/***********************************************************************
* Gain-related functions
**********************************************************************/
-static int rx_pga0_gain_to_iobits(double &gain){
- //clip the input
+static int rx_pga0_gain_to_iobits(double& gain)
+{
+ // clip the input
gain = wbx_rx_gain_ranges["PGA0"].clip(gain);
- //convert to attenuation
+ // convert to attenuation
double attn = wbx_rx_gain_ranges["PGA0"].stop() - gain;
- //calculate the attenuation
- int attn_code = boost::math::iround(attn*2);
- int iobits = ((~attn_code) << RX_ATTN_SHIFT) & RX_ATTN_MASK;
+ // calculate the attenuation
+ int attn_code = boost::math::iround(attn * 2);
+ int iobits = ((~attn_code) << RX_ATTN_SHIFT) & RX_ATTN_MASK;
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX RX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x"
- ) % attn % attn_code % (iobits & RX_ATTN_MASK) % RX_ATTN_MASK ;
+ UHD_LOGGER_TRACE("WBX")
+ << boost::format("WBX RX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x")
+ % attn % attn_code % (iobits & RX_ATTN_MASK) % RX_ATTN_MASK;
- //the actual gain setting
- gain = wbx_rx_gain_ranges["PGA0"].stop() - double(attn_code)/2;
+ // the actual gain setting
+ gain = wbx_rx_gain_ranges["PGA0"].stop() - double(attn_code) / 2;
return iobits;
}
@@ -47,9 +48,9 @@ static int rx_pga0_gain_to_iobits(double &gain){
/***********************************************************************
* WBX Common Implementation
**********************************************************************/
-wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args){
-
- //enable the clocks that we need
+wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args)
+{
+ // enable the clocks that we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
@@ -59,38 +60,47 @@ wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args){
uint16_t rx_id = this->get_rx_id().to_uint16();
this->get_rx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&wbx_base::get_locked, this, dboard_iface::UNIT_RX));
- for(const std::string &name: wbx_rx_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&wbx_base::set_rx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : wbx_rx_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&wbx_base::set_rx_gain, this, std::placeholders::_1, name))
.set(wbx_rx_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(wbx_rx_gain_ranges[name]);
}
this->get_rx_subtree()->create<std::string>("connection").set("IQ");
- this->get_rx_subtree()->create<bool>("enabled")
- .add_coerced_subscriber(std::bind(&wbx_base::set_rx_enabled, this, std::placeholders::_1))
- .set(true); //start enabled
+ this->get_rx_subtree()
+ ->create<bool>("enabled")
+ .add_coerced_subscriber(
+ std::bind(&wbx_base::set_rx_enabled, this, std::placeholders::_1))
+ .set(true); // start enabled
this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
- //Value of bw low-pass dependent on board, we want complex double-sided
+ // Value of bw low-pass dependent on board, we want complex double-sided
double bw = (rx_id != 0x0081) ? 20.0e6 : 60.0e6;
- this->get_rx_subtree()->create<double>("bandwidth/value").set(2*bw);
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*bw, 2*bw));
- this->get_tx_subtree()->create<double>("bandwidth/value").set(2*bw);
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
- .set(freq_range_t(2*bw, 2*bw));
+ this->get_rx_subtree()->create<double>("bandwidth/value").set(2 * bw);
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * bw, 2 * bw));
+ this->get_tx_subtree()->create<double>("bandwidth/value").set(2 * bw);
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2 * bw, 2 * bw));
this->get_tx_subtree()->create<device_addr_t>("tune_args").set(device_addr_t());
- this->get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_tx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&wbx_base::get_locked, this, dboard_iface::UNIT_TX));
this->get_tx_subtree()->create<std::string>("connection").set("IQ");
this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
// instantiate subclass foo
- switch(rx_id) {
+ switch (rx_id) {
case 0x0053:
db_actual = wbx_versionx_sptr(new wbx_version2(this));
return;
@@ -107,49 +117,54 @@ wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args){
/* We didn't recognize the version of the board... */
UHD_THROW_INVALID_CODE_PATH();
}
-
}
-wbx_base::~wbx_base(void){
+wbx_base::~wbx_base(void)
+{
/* NOP */
}
/***********************************************************************
* Enables
**********************************************************************/
-void wbx_base::set_rx_enabled(bool enb){
+void wbx_base::set_rx_enabled(bool enb)
+{
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX,
- (enb)? RX_POWER_UP : RX_POWER_DOWN, RX_POWER_UP | RX_POWER_DOWN
- );
+ (enb) ? RX_POWER_UP : RX_POWER_DOWN,
+ RX_POWER_UP | RX_POWER_DOWN);
}
/***********************************************************************
* Gain Handling
**********************************************************************/
-double wbx_base::set_rx_gain(double gain, const std::string &name){
+double wbx_base::set_rx_gain(double gain, const std::string& name)
+{
assert_has(wbx_rx_gain_ranges.keys(), name, "wbx rx gain name");
- if(name == "PGA0"){
+ if (name == "PGA0") {
uint16_t io_bits = rx_pga0_gain_to_iobits(gain);
- _rx_gains[name] = gain;
+ _rx_gains[name] = gain;
- //write the new gain to rx gpio outputs
+ // write the new gain to rx gpio outputs
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, io_bits, RX_ATTN_MASK);
- }
- else UHD_THROW_INVALID_CODE_PATH();
- return _rx_gains[name]; //returned shadowed
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
+ return _rx_gains[name]; // returned shadowed
}
/***********************************************************************
* Tuning
**********************************************************************/
-sensor_value_t wbx_base::get_locked(dboard_iface::unit_t unit){
+sensor_value_t wbx_base::get_locked(dboard_iface::unit_t unit)
+{
const bool locked = (this->get_iface()->read_gpio(unit) & LOCKDET_MASK) != 0;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
-void wbx_base::wbx_versionx::write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs) {
- for(uint32_t reg: regs) {
+void wbx_base::wbx_versionx::write_lo_regs(
+ dboard_iface::unit_t unit, const std::vector<uint32_t>& regs)
+{
+ for (uint32_t reg : regs) {
self_base->get_iface()->write_spi(unit, spi_config_t::EDGE_RISE, reg, 32);
}
}
diff --git a/host/lib/usrp/dboard/db_wbx_common.hpp b/host/lib/usrp/dboard/db_wbx_common.hpp
index 9425b041c..e7beabd8b 100644
--- a/host/lib/usrp/dboard/db_wbx_common.hpp
+++ b/host/lib/usrp/dboard/db_wbx_common.hpp
@@ -12,96 +12,93 @@
#include <uhdlib/usrp/common/adf435x.hpp>
// LO Related
-#define ADF435X_CE (1 << 3)
-#define ADF435X_PDBRF (1 << 2)
-#define ADF435X_MUXOUT (1 << 1) // INPUT!!!
-#define LOCKDET_MASK (1 << 0) // INPUT!!!
+#define ADF435X_CE (1 << 3)
+#define ADF435X_PDBRF (1 << 2)
+#define ADF435X_MUXOUT (1 << 1) // INPUT!!!
+#define LOCKDET_MASK (1 << 0) // INPUT!!!
// TX IO Pins
-#define TX_PUP_5V (1 << 7) // enables 5.0V power supply
-#define TX_PUP_3V (1 << 6) // enables 3.3V supply
-#define TXMOD_EN (1 << 4) // on UNIT_TX, 1 enables TX Modulator
+#define TX_PUP_5V (1 << 7) // enables 5.0V power supply
+#define TX_PUP_3V (1 << 6) // enables 3.3V supply
+#define TXMOD_EN (1 << 4) // on UNIT_TX, 1 enables TX Modulator
// RX IO Pins
-#define RX_PUP_5V (1 << 7) // enables 5.0V power supply
-#define RX_PUP_3V (1 << 6) // enables 3.3V supply
-#define RXBB_PDB (1 << 4) // on UNIT_RX, 1 powers up RX baseband
+#define RX_PUP_5V (1 << 7) // enables 5.0V power supply
+#define RX_PUP_3V (1 << 6) // enables 3.3V supply
+#define RXBB_PDB (1 << 4) // on UNIT_RX, 1 powers up RX baseband
// TX Attenuator Pins (v3 only)
-#define TX_ATTN_16 (1 << 14)
-#define TX_ATTN_8 (1 << 5)
-#define TX_ATTN_4 (1 << 4)
-#define TX_ATTN_2 (1 << 3)
-#define TX_ATTN_1 (1 << 1)
-#define TX_ATTN_MASK (TX_ATTN_16|TX_ATTN_8|TX_ATTN_4|TX_ATTN_2|TX_ATTN_1) // valid bits of TX Attenuator Control
-
-#define RX_ATTN_SHIFT 8 //lsb of RX Attenuator Control
-#define RX_ATTN_MASK (63 << RX_ATTN_SHIFT) //valid bits of RX Attenuator Control
+#define TX_ATTN_16 (1 << 14)
+#define TX_ATTN_8 (1 << 5)
+#define TX_ATTN_4 (1 << 4)
+#define TX_ATTN_2 (1 << 3)
+#define TX_ATTN_1 (1 << 1)
+#define TX_ATTN_MASK \
+ (TX_ATTN_16 | TX_ATTN_8 | TX_ATTN_4 | TX_ATTN_2 \
+ | TX_ATTN_1) // valid bits of TX Attenuator Control
+
+#define RX_ATTN_SHIFT 8 // lsb of RX Attenuator Control
+#define RX_ATTN_MASK (63 << RX_ATTN_SHIFT) // valid bits of RX Attenuator Control
// Mixer functions
-#define TX_MIXER_ENB (TXMOD_EN|ADF435X_PDBRF) // for v3, TXMOD_EN tied to ADF435X_PDBRF rather than separate
-#define TX_MIXER_DIS 0
+#define TX_MIXER_ENB \
+ (TXMOD_EN \
+ | ADF435X_PDBRF) // for v3, TXMOD_EN tied to ADF435X_PDBRF rather than separate
+#define TX_MIXER_DIS 0
-#define RX_MIXER_ENB (RXBB_PDB|ADF435X_PDBRF)
-#define RX_MIXER_DIS 0
+#define RX_MIXER_ENB (RXBB_PDB | ADF435X_PDBRF)
+#define RX_MIXER_DIS 0
// Power functions
-#define TX_POWER_UP (TX_PUP_5V|TX_PUP_3V) // high enables power supply
-#define TX_POWER_DOWN 0
+#define TX_POWER_UP (TX_PUP_5V | TX_PUP_3V) // high enables power supply
+#define TX_POWER_DOWN 0
-#define RX_POWER_UP (RX_PUP_5V|RX_PUP_3V|ADF435X_CE) // high enables power supply
-#define RX_POWER_DOWN 0
+#define RX_POWER_UP (RX_PUP_5V | RX_PUP_3V | ADF435X_CE) // high enables power supply
+#define RX_POWER_DOWN 0
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
#include <uhd/types/sensors.hpp>
+#include <uhd/usrp/dboard_base.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/usrp/dboard_base.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
-#include <memory>
#include <boost/math/special_functions/round.hpp>
#include <functional>
+#include <memory>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
/***********************************************************************
* The WBX Common dboard constants
**********************************************************************/
-static const uhd::dict<std::string, gain_range_t> wbx_rx_gain_ranges = boost::assign::map_list_of
- ("PGA0", gain_range_t(0, 31.5, 0.5));
+static const uhd::dict<std::string, gain_range_t> wbx_rx_gain_ranges =
+ boost::assign::map_list_of("PGA0", gain_range_t(0, 31.5, 0.5));
-static const freq_range_t wbx_tx_lo_5dbm = boost::assign::list_of
- (range_t(0.05e9, 1.7e9))
- (range_t(1.9e9, 2.2e9))
-;
+static const freq_range_t wbx_tx_lo_5dbm =
+ boost::assign::list_of(range_t(0.05e9, 1.7e9))(range_t(1.9e9, 2.2e9));
-static const freq_range_t wbx_tx_lo_m1dbm = boost::assign::list_of
- (range_t(1.7e9, 1.9e9))
-;
+static const freq_range_t wbx_tx_lo_m1dbm = boost::assign::list_of(range_t(1.7e9, 1.9e9));
-static const freq_range_t wbx_rx_lo_5dbm = boost::assign::list_of
- (range_t(0.05e9, 1.4e9))
-;
+static const freq_range_t wbx_rx_lo_5dbm = boost::assign::list_of(range_t(0.05e9, 1.4e9));
-static const freq_range_t wbx_rx_lo_2dbm = boost::assign::list_of
- (range_t(1.4e9, 2.2e9))
-;
+static const freq_range_t wbx_rx_lo_2dbm = boost::assign::list_of(range_t(1.4e9, 2.2e9));
/***********************************************************************
* The WBX dboard base class
**********************************************************************/
-class wbx_base : public xcvr_dboard_base{
+class wbx_base : public xcvr_dboard_base
+{
public:
wbx_base(ctor_args_t args);
virtual ~wbx_base(void);
protected:
- virtual double set_rx_gain(double gain, const std::string &name);
+ virtual double set_rx_gain(double gain, const std::string& name);
virtual void set_rx_enabled(bool enb);
@@ -121,29 +118,32 @@ protected:
* This class is an abstract base class, and thus is impossible to
* instantiate.
*/
- class wbx_versionx {
+ class wbx_versionx
+ {
public:
- wbx_versionx():self_base(NULL) {}
+ wbx_versionx() : self_base(NULL) {}
virtual ~wbx_versionx(void) {}
- virtual double set_tx_gain(double gain, const std::string &name) = 0;
- virtual void set_tx_enabled(bool enb) = 0;
+ virtual double set_tx_gain(double gain, const std::string& name) = 0;
+ virtual void set_tx_enabled(bool enb) = 0;
virtual double set_lo_freq(dboard_iface::unit_t unit, double target_freq) = 0;
/*! This is the registered instance of the wrapper class, wbx_base. */
- wbx_base *self_base;
+ wbx_base* self_base;
- property_tree::sptr get_rx_subtree(void){
+ property_tree::sptr get_rx_subtree(void)
+ {
return self_base->get_rx_subtree();
}
- property_tree::sptr get_tx_subtree(void){
+ property_tree::sptr get_tx_subtree(void)
+ {
return self_base->get_tx_subtree();
}
adf435x_iface::sptr _txlo;
adf435x_iface::sptr _rxlo;
- void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs);
+ void write_lo_regs(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs);
};
@@ -152,12 +152,13 @@ protected:
*
* Basically the original release of the DB.
*/
- class wbx_version2 : public wbx_versionx {
+ class wbx_version2 : public wbx_versionx
+ {
public:
- wbx_version2(wbx_base *_self_wbx_base);
+ wbx_version2(wbx_base* _self_wbx_base);
virtual ~wbx_version2(void);
- double set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string& name);
void set_tx_enabled(bool enb);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
};
@@ -167,12 +168,13 @@ protected:
*
* Fixed a problem with the AGC from Version 2.
*/
- class wbx_version3 : public wbx_versionx {
+ class wbx_version3 : public wbx_versionx
+ {
public:
- wbx_version3(wbx_base *_self_wbx_base);
+ wbx_version3(wbx_base* _self_wbx_base);
virtual ~wbx_version3(void);
- double set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string& name);
void set_tx_enabled(bool enb);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
};
@@ -182,12 +184,13 @@ protected:
*
* Upgrades the Frequnecy Synthensizer from ADF4350 to ADF4351.
*/
- class wbx_version4 : public wbx_versionx {
+ class wbx_version4 : public wbx_versionx
+ {
public:
- wbx_version4(wbx_base *_self_wbx_base);
+ wbx_version4(wbx_base* _self_wbx_base);
virtual ~wbx_version4(void);
- double set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string& name);
void set_tx_enabled(bool enb);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
};
@@ -208,6 +211,6 @@ protected:
};
-}} //namespace uhd::usrp
+}} // namespace uhd::usrp
#endif /* INCLUDED_LIBUHD_USRP_DBOARD_DB_WBX_COMMON_HPP */
diff --git a/host/lib/usrp/dboard/db_wbx_simple.cpp b/host/lib/usrp/dboard/db_wbx_simple.cpp
index 98eb96c1f..35675a081 100644
--- a/host/lib/usrp/dboard/db_wbx_simple.cpp
+++ b/host/lib/usrp/dboard/db_wbx_simple.cpp
@@ -6,11 +6,12 @@
//
// Antenna constants
-#define ANTSW_IO ((1 << 15)) // on UNIT_TX, 0 = TX, 1 = RX, on UNIT_RX 0 = main ant, 1 = RX2
-#define ANT_TX 0 //the tx line is transmitting
-#define ANT_RX ANTSW_IO //the tx line is receiving
-#define ANT_TXRX 0 //the rx line is on txrx
-#define ANT_RX2 ANTSW_IO //the rx line in on rx2
+#define ANTSW_IO \
+ ((1 << 15)) // on UNIT_TX, 0 = TX, 1 = RX, on UNIT_RX 0 = main ant, 1 = RX2
+#define ANT_TX 0 // the tx line is transmitting
+#define ANT_RX ANTSW_IO // the tx line is receiving
+#define ANT_TXRX 0 // the rx line is on txrx
+#define ANT_RX2 ANTSW_IO // the rx line in on rx2
#include "db_wbx_common.hpp"
#include <uhd/usrp/dboard_manager.hpp>
@@ -34,122 +35,154 @@ static const std::vector<std::string> wbx_rx_antennas = list_of("TX/RX")("RX2")(
/***********************************************************************
* The WBX simple implementation
**********************************************************************/
-class wbx_simple : public wbx_base{
+class wbx_simple : public wbx_base
+{
public:
wbx_simple(ctor_args_t args);
virtual ~wbx_simple(void);
private:
- void set_rx_ant(const std::string &ant);
- void set_tx_ant(const std::string &ant);
+ void set_rx_ant(const std::string& ant);
+ void set_tx_ant(const std::string& ant);
std::string _rx_ant;
};
/***********************************************************************
* Register the WBX simple implementation
**********************************************************************/
-static dboard_base::sptr make_wbx_simple(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_wbx_simple(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new wbx_simple(args));
}
/***********************************************************************
* ID Numbers for WBX daughterboard combinations.
**********************************************************************/
-UHD_STATIC_BLOCK(reg_wbx_simple_dboards){
+UHD_STATIC_BLOCK(reg_wbx_simple_dboards)
+{
dboard_manager::register_dboard(0x0053, 0x0052, &make_wbx_simple, "WBX");
dboard_manager::register_dboard(0x0053, 0x004f, &make_wbx_simple, "WBX + Simple GDB");
dboard_manager::register_dboard(0x0057, 0x0056, &make_wbx_simple, "WBX v3");
- dboard_manager::register_dboard(0x0057, 0x004f, &make_wbx_simple, "WBX v3 + Simple GDB");
+ dboard_manager::register_dboard(
+ 0x0057, 0x004f, &make_wbx_simple, "WBX v3 + Simple GDB");
dboard_manager::register_dboard(0x0063, 0x0062, &make_wbx_simple, "WBX v4");
- dboard_manager::register_dboard(0x0063, 0x004f, &make_wbx_simple, "WBX v4 + Simple GDB");
+ dboard_manager::register_dboard(
+ 0x0063, 0x004f, &make_wbx_simple, "WBX v4 + Simple GDB");
dboard_manager::register_dboard(0x0081, 0x0080, &make_wbx_simple, "WBX-120");
- dboard_manager::register_dboard(0x0081, 0x004f, &make_wbx_simple, "WBX-120 + Simple GDB");
+ dboard_manager::register_dboard(
+ 0x0081, 0x004f, &make_wbx_simple, "WBX-120 + Simple GDB");
}
/***********************************************************************
* Structors
**********************************************************************/
-wbx_simple::wbx_simple(ctor_args_t args) : wbx_base(args){
-
+wbx_simple::wbx_simple(ctor_args_t args) : wbx_base(args)
+{
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
this->get_rx_subtree()->access<std::string>("name").set(
- std::string(str(boost::format("%s+GDB") % this->get_rx_subtree()->access<std::string>("name").get()
- )));
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&wbx_simple::set_rx_ant, this, std::placeholders::_1))
+ std::string(str(boost::format("%s+GDB")
+ % this->get_rx_subtree()->access<std::string>("name").get())));
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&wbx_simple::set_rx_ant, this, std::placeholders::_1))
.set("RX2");
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(wbx_rx_antennas);
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
this->get_tx_subtree()->access<std::string>("name").set(
- std::string(str(boost::format("%s+GDB") % this->get_tx_subtree()->access<std::string>("name").get()
- )));
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&wbx_simple::set_tx_ant, this, std::placeholders::_1))
+ std::string(str(boost::format("%s+GDB")
+ % this->get_tx_subtree()->access<std::string>("name").get())));
+ this->get_tx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&wbx_simple::set_tx_ant, this, std::placeholders::_1))
.set(wbx_tx_antennas.at(0));
- this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(wbx_tx_antennas);
- //set the gpio directions and atr controls (antenna switches all under ATR)
+ // set the gpio directions and atr controls (antenna switches all under ATR)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, ANTSW_IO, ANTSW_IO);
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, ANTSW_IO, ANTSW_IO);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, ANTSW_IO, ANTSW_IO);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, ANTSW_IO, ANTSW_IO);
- //setup ATR for the antenna switches (constant)
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, ANT_RX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, ANT_RX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_TX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TX, ANTSW_IO);
-
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, ANT_TXRX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX2, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX2, ANTSW_IO);
+ // setup ATR for the antenna switches (constant)
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, ANT_RX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, ANT_RX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_TX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TX, ANTSW_IO);
+
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, ANT_TXRX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX2, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX2, ANTSW_IO);
}
-wbx_simple::~wbx_simple(void){
+wbx_simple::~wbx_simple(void)
+{
/* NOP */
}
/***********************************************************************
* Antennas
**********************************************************************/
-void wbx_simple::set_rx_ant(const std::string &ant){
- //validate input
+void wbx_simple::set_rx_ant(const std::string& ant)
+{
+ // validate input
assert_has(wbx_rx_antennas, ant, "wbx rx antenna name");
- //shadow the setting
+ // shadow the setting
_rx_ant = ant;
- //write the new antenna setting to atr regs
+ // write the new antenna setting to atr regs
if (_rx_ant == "CAL") {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_TXRX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TXRX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, ANT_TXRX, ANTSW_IO);
- }
- else {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX2, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX2, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, ((_rx_ant == "TX/RX")? ANT_TXRX : ANT_RX2), ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_TXRX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TXRX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, ANT_TXRX, ANTSW_IO);
+ } else {
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX2, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX2, ANTSW_IO);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ ((_rx_ant == "TX/RX") ? ANT_TXRX : ANT_RX2),
+ ANTSW_IO);
}
}
-void wbx_simple::set_tx_ant(const std::string &ant){
+void wbx_simple::set_tx_ant(const std::string& ant)
+{
assert_has(wbx_tx_antennas, ant, "wbx tx antenna name");
- //write the new antenna setting to atr regs
+ // write the new antenna setting to atr regs
if (ant == "CAL") {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX, ANTSW_IO);
- }
- else {
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_TX, ANTSW_IO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_RX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_RX, ANTSW_IO);
+ } else {
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, ANT_TX, ANTSW_IO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, ANT_TX, ANTSW_IO);
}
}
diff --git a/host/lib/usrp/dboard/db_wbx_version2.cpp b/host/lib/usrp/dboard/db_wbx_version2.cpp
index a8605942b..890436cdb 100644
--- a/host/lib/usrp/dboard/db_wbx_version2.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version2.cpp
@@ -28,32 +28,32 @@ using namespace boost::assign;
/***********************************************************************
* WBX Version 2 Constants
**********************************************************************/
-static const uhd::dict<std::string, gain_range_t> wbx_v2_tx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 25, 0.05))
-;
+static const uhd::dict<std::string, gain_range_t> wbx_v2_tx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 25, 0.05));
static const freq_range_t wbx_v2_freq_range(68.75e6, 2.2e9);
/***********************************************************************
* Gain-related functions
**********************************************************************/
-static double tx_pga0_gain_to_dac_volts(double &gain){
- //clip the input
+static double tx_pga0_gain_to_dac_volts(double& gain)
+{
+ // clip the input
gain = wbx_v2_tx_gain_ranges["PGA0"].clip(gain);
- //voltage level constants
+ // voltage level constants
static const double max_volts = 0.5, min_volts = 1.4;
- static const double slope = (max_volts-min_volts)/wbx_v2_tx_gain_ranges["PGA0"].stop();
+ static const double slope =
+ (max_volts - min_volts) / wbx_v2_tx_gain_ranges["PGA0"].stop();
- //calculate the voltage for the aux dac
- double dac_volts = gain*slope + min_volts;
+ // calculate the voltage for the aux dac
+ double dac_volts = gain * slope + min_volts;
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX TX Gain: %f dB, dac_volts: %f V"
- ) % gain % dac_volts ;
+ UHD_LOGGER_TRACE("WBX") << boost::format("WBX TX Gain: %f dB, dac_volts: %f V") % gain
+ % dac_volts;
- //the actual gain setting
- gain = (dac_volts - min_volts)/slope;
+ // the actual gain setting
+ gain = (dac_volts - min_volts) / slope;
return dac_volts;
}
@@ -62,150 +62,206 @@ static double tx_pga0_gain_to_dac_volts(double &gain){
/***********************************************************************
* WBX Version 2 Implementation
**********************************************************************/
-wbx_base::wbx_version2::wbx_version2(wbx_base *_self_wbx_base) {
- //register our handle on the primary wbx_base instance
+wbx_base::wbx_version2::wbx_version2(wbx_base* _self_wbx_base)
+{
+ // register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- _txlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
this->get_rx_subtree()->create<std::string>("name").set("WBXv2 RX");
- this->get_rx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version2::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
- .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop())/2.0);
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version2::set_lo_freq,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1))
+ .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop()) / 2.0);
this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v2_freq_range);
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
this->get_tx_subtree()->create<std::string>("name").set("WBXv2 TX");
- for(const std::string &name: wbx_v2_tx_gain_ranges.keys()){
- self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&wbx_base::wbx_version2::set_tx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : wbx_v2_tx_gain_ranges.keys()) {
+ self_base->get_tx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(std::bind(
+ &wbx_base::wbx_version2::set_tx_gain, this, std::placeholders::_1, name))
.set(wbx_v2_tx_gain_ranges[name].start());
- self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ self_base->get_tx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(wbx_v2_tx_gain_ranges[name]);
}
- this->get_tx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version2::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
- .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop())/2.0);
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version2::set_lo_freq,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1))
+ .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop()) / 2.0);
this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v2_freq_range);
- this->get_tx_subtree()->create<bool>("enabled")
- .add_coerced_subscriber(std::bind(&wbx_base::wbx_version2::set_tx_enabled, this, std::placeholders::_1))
- .set(true); //start enabled
+ this->get_tx_subtree()
+ ->create<bool>("enabled")
+ .add_coerced_subscriber(std::bind(
+ &wbx_base::wbx_version2::set_tx_enabled, this, std::placeholders::_1))
+ .set(true); // start enabled
- //set attenuator control bits
+ // set attenuator control bits
int v2_iobits = ADF435X_CE;
- int v2_tx_mod = TXMOD_EN|ADF435X_PDBRF;
+ int v2_tx_mod = TXMOD_EN | ADF435X_PDBRF;
- //set the gpio directions and atr controls
+ // set the gpio directions and atr controls
self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, v2_tx_mod);
- self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, RXBB_PDB|ADF435X_PDBRF);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, TX_PUP_5V|TX_PUP_3V|v2_tx_mod|v2_iobits);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, RX_PUP_5V|RX_PUP_3V|ADF435X_CE|RXBB_PDB|ADF435X_PDBRF|RX_ATTN_MASK);
-
- //setup ATR for the mixer enables (always enabled to prevent phase slip between bursts)
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, v2_tx_mod, TX_MIXER_DIS | v2_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, v2_tx_mod, TX_MIXER_DIS | v2_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, v2_tx_mod, TX_MIXER_DIS | v2_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, v2_tx_mod, TX_MIXER_DIS | v2_tx_mod);
-
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, RXBB_PDB | ADF435X_PDBRF);
+ self_base->get_iface()->set_gpio_ddr(
+ dboard_iface::UNIT_TX, TX_PUP_5V | TX_PUP_3V | v2_tx_mod | v2_iobits);
+ self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX,
+ RX_PUP_5V | RX_PUP_3V | ADF435X_CE | RXBB_PDB | ADF435X_PDBRF | RX_ATTN_MASK);
+
+ // setup ATR for the mixer enables (always enabled to prevent phase slip between
+ // bursts)
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_IDLE,
+ v2_tx_mod,
+ TX_MIXER_DIS | v2_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ v2_tx_mod,
+ TX_MIXER_DIS | v2_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ v2_tx_mod,
+ TX_MIXER_DIS | v2_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ v2_tx_mod,
+ TX_MIXER_DIS | v2_tx_mod);
+
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_IDLE,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
}
-wbx_base::wbx_version2::~wbx_version2(void){
+wbx_base::wbx_version2::~wbx_version2(void)
+{
/* NOP */
}
/***********************************************************************
* Enables
**********************************************************************/
-void wbx_base::wbx_version2::set_tx_enabled(bool enb){
+void wbx_base::wbx_version2::set_tx_enabled(bool enb)
+{
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX,
- (enb)? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN, TX_POWER_UP | TX_POWER_DOWN | ADF435X_CE);
+ (enb) ? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN,
+ TX_POWER_UP | TX_POWER_DOWN | ADF435X_CE);
}
/***********************************************************************
* Gain Handling
**********************************************************************/
-double wbx_base::wbx_version2::set_tx_gain(double gain, const std::string &name){
+double wbx_base::wbx_version2::set_tx_gain(double gain, const std::string& name)
+{
assert_has(wbx_v2_tx_gain_ranges.keys(), name, "wbx tx gain name");
- if(name == "PGA0"){
- double dac_volts = tx_pga0_gain_to_dac_volts(gain);
+ if (name == "PGA0") {
+ double dac_volts = tx_pga0_gain_to_dac_volts(gain);
self_base->_tx_gains[name] = gain;
- //write the new voltage to the aux dac
- self_base->get_iface()->write_aux_dac(dboard_iface::UNIT_TX, dboard_iface::AUX_DAC_A, dac_volts);
- }
- else UHD_THROW_INVALID_CODE_PATH();
- return self_base->_tx_gains[name]; //shadowed
+ // write the new voltage to the aux dac
+ self_base->get_iface()->write_aux_dac(
+ dboard_iface::UNIT_TX, dboard_iface::AUX_DAC_A, dac_volts);
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
+ return self_base->_tx_gains[name]; // shadowed
}
/***********************************************************************
* Tuning
**********************************************************************/
-double wbx_base::wbx_version2::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- //clip to tuning range
+double wbx_base::wbx_version2::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ // clip to tuning range
target_freq = wbx_v2_freq_range.clip(target_freq);
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+ UHD_LOGGER_TRACE("WBX") << boost::format("WBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
- double reference_freq = self_base->get_iface()->get_clock_rate(unit);
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
+ double reference_freq = self_base->get_iface()->get_clock_rate(unit);
- //Select the LO
+ // Select the LO
adf435x_iface::sptr& lo_iface = unit == dboard_iface::UNIT_RX ? _rxlo : _txlo;
lo_iface->set_reference_freq(reference_freq);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //frequency must 2x the target frequency
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // frequency must 2x the target frequency
double synth_target_freq = target_freq * 2;
- //Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
- lo_iface->set_prescaler(synth_target_freq > 3e9 ?
- adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
+ // Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
+ lo_iface->set_prescaler(synth_target_freq > 3e9 ? adf435x_iface::PRESCALER_8_9
+ : adf435x_iface::PRESCALER_4_5);
- //The feedback of the divided frequency must be disabled whenever the target frequency
- //divided by the minimum PFD frequency cannot meet the minimum integer divider (N) value.
- //If it is disabled, additional phase ambiguity will be introduced. With a minimum PFD
- //frequency of 10 MHz, synthesizer frequencies below 230 MHz (LO frequencies below 115 MHz)
- //will have too much ambiguity to synchronize.
+ // The feedback of the divided frequency must be disabled whenever the target
+ // frequency divided by the minimum PFD frequency cannot meet the minimum integer
+ // divider (N) value. If it is disabled, additional phase ambiguity will be
+ // introduced. With a minimum PFD frequency of 10 MHz, synthesizer frequencies below
+ // 230 MHz (LO frequencies below 115 MHz) will have too much ambiguity to synchronize.
lo_iface->set_feedback_select(
- (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start() ?
- adf435x_iface::FB_SEL_DIVIDED : adf435x_iface::FB_SEL_FUNDAMENTAL));
+ (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start()
+ ? adf435x_iface::FB_SEL_DIVIDED
+ : adf435x_iface::FB_SEL_FUNDAMENTAL));
double synth_actual_freq = lo_iface->set_frequency(synth_target_freq, is_int_n);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //actual_freq must /2 the synth_actual_freq
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // actual_freq must /2 the synth_actual_freq
double actual_freq = synth_actual_freq / 2;
if (unit == dboard_iface::UNIT_RX) {
- lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_2DBM);
} else {
- lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_M1DBM);
+ lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_M1DBM);
}
- //Write to hardware
+ // Write to hardware
lo_iface->commit();
return actual_freq;
diff --git a/host/lib/usrp/dboard/db_wbx_version3.cpp b/host/lib/usrp/dboard/db_wbx_version3.cpp
index 43c1d9652..51902b3aa 100644
--- a/host/lib/usrp/dboard/db_wbx_version3.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version3.cpp
@@ -27,37 +27,34 @@ using namespace boost::assign;
/***********************************************************************
* WBX Version 3 Constants
**********************************************************************/
-static const uhd::dict<std::string, gain_range_t> wbx_v3_tx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 31, 1.0))
-;
+static const uhd::dict<std::string, gain_range_t> wbx_v3_tx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 31, 1.0));
static const freq_range_t wbx_v3_freq_range(68.75e6, 2.2e9);
/***********************************************************************
* Gain-related functions
**********************************************************************/
-static int tx_pga0_gain_to_iobits(double &gain){
- //clip the input
+static int tx_pga0_gain_to_iobits(double& gain)
+{
+ // clip the input
gain = wbx_v3_tx_gain_ranges["PGA0"].clip(gain);
- //convert to attenuation
+ // convert to attenuation
double attn = wbx_v3_tx_gain_ranges["PGA0"].stop() - gain;
- //calculate the attenuation
+ // calculate the attenuation
int attn_code = boost::math::iround(attn);
- int iobits = (
- (attn_code & 16 ? 0 : TX_ATTN_16) |
- (attn_code & 8 ? 0 : TX_ATTN_8) |
- (attn_code & 4 ? 0 : TX_ATTN_4) |
- (attn_code & 2 ? 0 : TX_ATTN_2) |
- (attn_code & 1 ? 0 : TX_ATTN_1)
- ) & TX_ATTN_MASK;
-
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x"
- ) % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK ;
-
- //the actual gain setting
+ int iobits = ((attn_code & 16 ? 0 : TX_ATTN_16) | (attn_code & 8 ? 0 : TX_ATTN_8)
+ | (attn_code & 4 ? 0 : TX_ATTN_4) | (attn_code & 2 ? 0 : TX_ATTN_2)
+ | (attn_code & 1 ? 0 : TX_ATTN_1))
+ & TX_ATTN_MASK;
+
+ UHD_LOGGER_TRACE("WBX")
+ << boost::format("WBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x")
+ % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK;
+
+ // the actual gain setting
gain = wbx_v3_tx_gain_ranges["PGA0"].stop() - double(attn_code);
return iobits;
@@ -67,85 +64,112 @@ static int tx_pga0_gain_to_iobits(double &gain){
/***********************************************************************
* WBX Common Implementation
**********************************************************************/
-wbx_base::wbx_version3::wbx_version3(wbx_base *_self_wbx_base) {
- //register our handle on the primary wbx_base instance
+wbx_base::wbx_version3::wbx_version3(wbx_base* _self_wbx_base)
+{
+ // register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- _txlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = adf435x_iface::make_adf4350(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
this->get_rx_subtree()->create<std::string>("name").set("WBXv3 RX");
- this->get_rx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version3::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
- .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop())/2.0);
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version3::set_lo_freq,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1))
+ .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop()) / 2.0);
this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v3_freq_range);
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
this->get_tx_subtree()->create<std::string>("name").set("WBXv3 TX");
- for(const std::string &name: wbx_v3_tx_gain_ranges.keys()){
- self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&wbx_base::wbx_version3::set_tx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : wbx_v3_tx_gain_ranges.keys()) {
+ self_base->get_tx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(std::bind(
+ &wbx_base::wbx_version3::set_tx_gain, this, std::placeholders::_1, name))
.set(wbx_v3_tx_gain_ranges[name].start());
- self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ self_base->get_tx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(wbx_v3_tx_gain_ranges[name]);
}
- this->get_tx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version3::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
- .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop())/2.0);
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version3::set_lo_freq,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1))
+ .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop()) / 2.0);
this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v3_freq_range);
- this->get_tx_subtree()->create<bool>("enabled")
- .add_coerced_subscriber(std::bind(&wbx_base::wbx_version3::set_tx_enabled, this, std::placeholders::_1))
- .set(true); //start enabled
+ this->get_tx_subtree()
+ ->create<bool>("enabled")
+ .add_coerced_subscriber(std::bind(
+ &wbx_base::wbx_version3::set_tx_enabled, this, std::placeholders::_1))
+ .set(true); // start enabled
- //set attenuator control bits
+ // set attenuator control bits
int v3_iobits = TX_ATTN_MASK;
int v3_tx_mod = ADF435X_PDBRF;
- //set the gpio directions and atr controls
- self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, \
- v3_tx_mod|v3_iobits);
- self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, \
- RXBB_PDB|ADF435X_PDBRF);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, \
- TX_PUP_5V|TX_PUP_3V|v3_tx_mod|v3_iobits);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, \
- RX_PUP_5V|RX_PUP_3V|ADF435X_CE|RXBB_PDB|ADF435X_PDBRF|RX_ATTN_MASK);
-
- //setup ATR for the mixer enables (always enabled to prevent phase
- //slip between bursts). set TX gain iobits to min gain (max attenuation)
- //when RX_ONLY or IDLE to suppress LO leakage
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_IDLE, v3_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_RX_ONLY, v3_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_TX_ONLY, v3_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, v3_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
-
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_IDLE, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_TX_ONLY, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_RX_ONLY, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
+ // set the gpio directions and atr controls
+ self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, v3_tx_mod | v3_iobits);
+ self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, RXBB_PDB | ADF435X_PDBRF);
+ self_base->get_iface()->set_gpio_ddr(
+ dboard_iface::UNIT_TX, TX_PUP_5V | TX_PUP_3V | v3_tx_mod | v3_iobits);
+ self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX,
+ RX_PUP_5V | RX_PUP_3V | ADF435X_CE | RXBB_PDB | ADF435X_PDBRF | RX_ATTN_MASK);
+
+ // setup ATR for the mixer enables (always enabled to prevent phase
+ // slip between bursts). set TX gain iobits to min gain (max attenuation)
+ // when RX_ONLY or IDLE to suppress LO leakage
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_IDLE,
+ v3_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ v3_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ v3_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ v3_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v3_tx_mod);
+
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_IDLE,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
}
-wbx_base::wbx_version3::~wbx_version3(void){
+wbx_base::wbx_version3::~wbx_version3(void)
+{
/* NOP */
}
@@ -153,90 +177,100 @@ wbx_base::wbx_version3::~wbx_version3(void){
/***********************************************************************
* Enables
**********************************************************************/
-void wbx_base::wbx_version3::set_tx_enabled(bool enb){
+void wbx_base::wbx_version3::set_tx_enabled(bool enb)
+{
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX,
- (enb)? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN, TX_POWER_UP | TX_POWER_DOWN | 0);
+ (enb) ? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN,
+ TX_POWER_UP | TX_POWER_DOWN | 0);
}
/***********************************************************************
* Gain Handling
**********************************************************************/
-double wbx_base::wbx_version3::set_tx_gain(double gain, const std::string &name){
+double wbx_base::wbx_version3::set_tx_gain(double gain, const std::string& name)
+{
assert_has(wbx_v3_tx_gain_ranges.keys(), name, "wbx tx gain name");
- if(name == "PGA0"){
+ if (name == "PGA0") {
uint16_t io_bits = tx_pga0_gain_to_iobits(gain);
self_base->_tx_gains[name] = gain;
- //write the new gain to tx gpio outputs
- //Update ATR with gain io_bits, only update for TX_ONLY and FULL_DUPLEX ATR states
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, io_bits, TX_ATTN_MASK);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, io_bits, TX_ATTN_MASK);
- }
- else UHD_THROW_INVALID_CODE_PATH();
- return self_base->_tx_gains[name]; //shadow
+ // write the new gain to tx gpio outputs
+ // Update ATR with gain io_bits, only update for TX_ONLY and FULL_DUPLEX ATR
+ // states
+ self_base->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, io_bits, TX_ATTN_MASK);
+ self_base->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, io_bits, TX_ATTN_MASK);
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
+ return self_base->_tx_gains[name]; // shadow
}
/***********************************************************************
* Tuning
**********************************************************************/
-double wbx_base::wbx_version3::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- //clip to tuning range
+double wbx_base::wbx_version3::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ // clip to tuning range
target_freq = wbx_v3_freq_range.clip(target_freq);
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+ UHD_LOGGER_TRACE("WBX") << boost::format("WBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
- double reference_freq = self_base->get_iface()->get_clock_rate(unit);
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
+ double reference_freq = self_base->get_iface()->get_clock_rate(unit);
- //Select the LO
+ // Select the LO
adf435x_iface::sptr& lo_iface = unit == dboard_iface::UNIT_RX ? _rxlo : _txlo;
lo_iface->set_reference_freq(reference_freq);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //frequency must 2x the target frequency
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // frequency must 2x the target frequency
double synth_target_freq = target_freq * 2;
- //Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
- lo_iface->set_prescaler(synth_target_freq > 3e9 ?
- adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
+ // Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
+ lo_iface->set_prescaler(synth_target_freq > 3e9 ? adf435x_iface::PRESCALER_8_9
+ : adf435x_iface::PRESCALER_4_5);
- //The feedback of the divided frequency must be disabled whenever the target frequency
- //divided by the minimum PFD frequency cannot meet the minimum integer divider (N) value.
- //If it is disabled, additional phase ambiguity will be introduced. With a minimum PFD
- //frequency of 10 MHz, synthesizer frequencies below 230 MHz (LO frequencies below 115 MHz)
- //will have too much ambiguity to synchronize.
+ // The feedback of the divided frequency must be disabled whenever the target
+ // frequency divided by the minimum PFD frequency cannot meet the minimum integer
+ // divider (N) value. If it is disabled, additional phase ambiguity will be
+ // introduced. With a minimum PFD frequency of 10 MHz, synthesizer frequencies below
+ // 230 MHz (LO frequencies below 115 MHz) will have too much ambiguity to synchronize.
lo_iface->set_feedback_select(
- (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start() ?
- adf435x_iface::FB_SEL_DIVIDED : adf435x_iface::FB_SEL_FUNDAMENTAL));
+ (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start()
+ ? adf435x_iface::FB_SEL_DIVIDED
+ : adf435x_iface::FB_SEL_FUNDAMENTAL));
double synth_actual_freq = lo_iface->set_frequency(synth_target_freq, is_int_n);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //actual_freq must /2 the synth_actual_freq
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // actual_freq must /2 the synth_actual_freq
double actual_freq = synth_actual_freq / 2;
if (unit == dboard_iface::UNIT_RX) {
- lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_2DBM);
} else {
- lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_M1DBM);
+ lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_M1DBM);
}
- //Write to hardware
+ // Write to hardware
lo_iface->commit();
return actual_freq;
diff --git a/host/lib/usrp/dboard/db_wbx_version4.cpp b/host/lib/usrp/dboard/db_wbx_version4.cpp
index 6755fb6eb..54c0a9c21 100644
--- a/host/lib/usrp/dboard/db_wbx_version4.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version4.cpp
@@ -27,9 +27,8 @@ using namespace boost::assign;
/***********************************************************************
* WBX Version 4 Constants
**********************************************************************/
-static const uhd::dict<std::string, gain_range_t> wbx_v4_tx_gain_ranges = map_list_of
- ("PGA0", gain_range_t(0, 31, 1.0))
-;
+static const uhd::dict<std::string, gain_range_t> wbx_v4_tx_gain_ranges =
+ map_list_of("PGA0", gain_range_t(0, 31, 1.0));
static const freq_range_t wbx_v4_freq_range(25.0e6, 2.2e9);
@@ -37,28 +36,26 @@ static const freq_range_t wbx_v4_freq_range(25.0e6, 2.2e9);
/***********************************************************************
* Gain-related functions
**********************************************************************/
-static int tx_pga0_gain_to_iobits(double &gain){
- //clip the input
+static int tx_pga0_gain_to_iobits(double& gain)
+{
+ // clip the input
gain = wbx_v4_tx_gain_ranges["PGA0"].clip(gain);
- //convert to attenuation
+ // convert to attenuation
double attn = wbx_v4_tx_gain_ranges["PGA0"].stop() - gain;
- //calculate the attenuation
+ // calculate the attenuation
int attn_code = boost::math::iround(attn);
- int iobits = (
- (attn_code & 16 ? 0 : TX_ATTN_16) |
- (attn_code & 8 ? 0 : TX_ATTN_8) |
- (attn_code & 4 ? 0 : TX_ATTN_4) |
- (attn_code & 2 ? 0 : TX_ATTN_2) |
- (attn_code & 1 ? 0 : TX_ATTN_1)
- ) & TX_ATTN_MASK;
-
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x"
- ) % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK ;
-
- //the actual gain setting
+ int iobits = ((attn_code & 16 ? 0 : TX_ATTN_16) | (attn_code & 8 ? 0 : TX_ATTN_8)
+ | (attn_code & 4 ? 0 : TX_ATTN_4) | (attn_code & 2 ? 0 : TX_ATTN_2)
+ | (attn_code & 1 ? 0 : TX_ATTN_1))
+ & TX_ATTN_MASK;
+
+ UHD_LOGGER_TRACE("WBX")
+ << boost::format("WBX TX Attenuation: %f dB, Code: %d, IO Bits %x, Mask: %x")
+ % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK;
+
+ // the actual gain setting
gain = wbx_v4_tx_gain_ranges["PGA0"].stop() - double(attn_code);
return iobits;
@@ -68,91 +65,122 @@ static int tx_pga0_gain_to_iobits(double &gain){
/***********************************************************************
* WBX Common Implementation
**********************************************************************/
-wbx_base::wbx_version4::wbx_version4(wbx_base *_self_wbx_base) {
- //register our handle on the primary wbx_base instance
+wbx_base::wbx_version4::wbx_version4(wbx_base* _self_wbx_base)
+{
+ // register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- _txlo = adf435x_iface::make_adf4351(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_TX, std::placeholders::_1));
- _rxlo = adf435x_iface::make_adf4351(std::bind(&wbx_base::wbx_versionx::write_lo_regs, this, dboard_iface::UNIT_RX, std::placeholders::_1));
+ _txlo = adf435x_iface::make_adf4351(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1));
+ _rxlo = adf435x_iface::make_adf4351(std::bind(&wbx_base::wbx_versionx::write_lo_regs,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
uint16_t rx_id = _self_wbx_base->get_rx_id().to_uint16();
- if(rx_id == 0x0063) this->get_rx_subtree()->create<std::string>("name").set("WBXv4 RX");
- else if(rx_id == 0x0081) this->get_rx_subtree()->create<std::string>("name").set("WBX-120 RX");
- this->get_rx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version4::set_lo_freq, this, dboard_iface::UNIT_RX, std::placeholders::_1))
- .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop())/2.0);
+ if (rx_id == 0x0063)
+ this->get_rx_subtree()->create<std::string>("name").set("WBXv4 RX");
+ else if (rx_id == 0x0081)
+ this->get_rx_subtree()->create<std::string>("name").set("WBX-120 RX");
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version4::set_lo_freq,
+ this,
+ dboard_iface::UNIT_RX,
+ std::placeholders::_1))
+ .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop()) / 2.0);
this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v4_freq_range);
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
- //get_tx_id() will always return GDB ID, so use RX ID to determine WBXv4 vs. WBX-120
- if(rx_id == 0x0063) this->get_tx_subtree()->create<std::string>("name").set("WBXv4 TX");
- else if(rx_id == 0x0081) this->get_tx_subtree()->create<std::string>("name").set("WBX-120 TX");
- for(const std::string &name: wbx_v4_tx_gain_ranges.keys()){
- self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&wbx_base::wbx_version4::set_tx_gain, this, std::placeholders::_1, name))
+ // get_tx_id() will always return GDB ID, so use RX ID to determine WBXv4 vs. WBX-120
+ if (rx_id == 0x0063)
+ this->get_tx_subtree()->create<std::string>("name").set("WBXv4 TX");
+ else if (rx_id == 0x0081)
+ this->get_tx_subtree()->create<std::string>("name").set("WBX-120 TX");
+ for (const std::string& name : wbx_v4_tx_gain_ranges.keys()) {
+ self_base->get_tx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(std::bind(
+ &wbx_base::wbx_version4::set_tx_gain, this, std::placeholders::_1, name))
.set(wbx_v4_tx_gain_ranges[name].start());
- self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ self_base->get_tx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(wbx_v4_tx_gain_ranges[name]);
}
- this->get_tx_subtree()->create<double>("freq/value")
- .set_coercer(std::bind(&wbx_base::wbx_version4::set_lo_freq, this, dboard_iface::UNIT_TX, std::placeholders::_1))
- .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop())/2.0);
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
+ .set_coercer(std::bind(&wbx_base::wbx_version4::set_lo_freq,
+ this,
+ dboard_iface::UNIT_TX,
+ std::placeholders::_1))
+ .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop()) / 2.0);
this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v4_freq_range);
- this->get_tx_subtree()->create<bool>("enabled")
- .add_coerced_subscriber(std::bind(&wbx_base::wbx_version4::set_tx_enabled, this, std::placeholders::_1))
- .set(true); //start enabled
+ this->get_tx_subtree()
+ ->create<bool>("enabled")
+ .add_coerced_subscriber(std::bind(
+ &wbx_base::wbx_version4::set_tx_enabled, this, std::placeholders::_1))
+ .set(true); // start enabled
- //set attenuator control bits
+ // set attenuator control bits
int v4_iobits = TX_ATTN_MASK;
int v4_tx_mod = ADF435X_PDBRF;
- //set the gpio directions and atr controls
- self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, \
- v4_tx_mod|v4_iobits);
- self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, \
- RXBB_PDB|ADF435X_PDBRF);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, \
- TX_PUP_5V|TX_PUP_3V|v4_tx_mod|v4_iobits);
- self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, \
- RX_PUP_5V|RX_PUP_3V|ADF435X_CE|RXBB_PDB|ADF435X_PDBRF|RX_ATTN_MASK);
-
- //setup ATR for the mixer enables (always enabled to prevent phase slip
- //between bursts) set TX gain iobits to min gain (max attenuation) when
- //RX_ONLY or IDLE to suppress LO leakage
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_IDLE, v4_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_RX_ONLY, v4_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_TX_ONLY, v4_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, v4_tx_mod, \
- TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
-
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_IDLE, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_TX_ONLY, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_RX_ONLY, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, \
- gpio_atr::ATR_REG_FULL_DUPLEX, \
- RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
+ // set the gpio directions and atr controls
+ self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, v4_tx_mod | v4_iobits);
+ self_base->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, RXBB_PDB | ADF435X_PDBRF);
+ self_base->get_iface()->set_gpio_ddr(
+ dboard_iface::UNIT_TX, TX_PUP_5V | TX_PUP_3V | v4_tx_mod | v4_iobits);
+ self_base->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX,
+ RX_PUP_5V | RX_PUP_3V | ADF435X_CE | RXBB_PDB | ADF435X_PDBRF | RX_ATTN_MASK);
+
+ // setup ATR for the mixer enables (always enabled to prevent phase slip
+ // between bursts) set TX gain iobits to min gain (max attenuation) when
+ // RX_ONLY or IDLE to suppress LO leakage
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_IDLE,
+ v4_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ v4_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ v4_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ v4_tx_mod,
+ TX_ATTN_MASK | TX_MIXER_DIS | v4_tx_mod);
+
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_IDLE,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
+ self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ RX_MIXER_ENB,
+ RX_MIXER_DIS | RX_MIXER_ENB);
}
-wbx_base::wbx_version4::~wbx_version4(void){
+wbx_base::wbx_version4::~wbx_version4(void)
+{
/* NOP */
}
@@ -160,29 +188,35 @@ wbx_base::wbx_version4::~wbx_version4(void){
/***********************************************************************
* Enables
**********************************************************************/
-void wbx_base::wbx_version4::set_tx_enabled(bool enb) {
+void wbx_base::wbx_version4::set_tx_enabled(bool enb)
+{
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX,
- (enb)? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN, TX_POWER_UP | TX_POWER_DOWN | 0);
+ (enb) ? TX_POWER_UP | ADF435X_CE : TX_POWER_DOWN,
+ TX_POWER_UP | TX_POWER_DOWN | 0);
}
/***********************************************************************
* Gain Handling
**********************************************************************/
-double wbx_base::wbx_version4::set_tx_gain(double gain, const std::string &name) {
+double wbx_base::wbx_version4::set_tx_gain(double gain, const std::string& name)
+{
assert_has(wbx_v4_tx_gain_ranges.keys(), name, "wbx tx gain name");
- if(name == "PGA0"){
+ if (name == "PGA0") {
uint16_t io_bits = tx_pga0_gain_to_iobits(gain);
self_base->_tx_gains[name] = gain;
- //write the new gain to tx gpio outputs
- //Update ATR with gain io_bits, only update for TX_ONLY and FULL_DUPLEX ATR states
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, io_bits, TX_ATTN_MASK);
- self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, io_bits, TX_ATTN_MASK);
+ // write the new gain to tx gpio outputs
+ // Update ATR with gain io_bits, only update for TX_ONLY and FULL_DUPLEX ATR
+ // states
+ self_base->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, io_bits, TX_ATTN_MASK);
+ self_base->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, io_bits, TX_ATTN_MASK);
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
return self_base->_tx_gains[name];
}
@@ -190,62 +224,66 @@ double wbx_base::wbx_version4::set_tx_gain(double gain, const std::string &name)
/***********************************************************************
* Tuning
**********************************************************************/
-double wbx_base::wbx_version4::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
- //clip to tuning range
+double wbx_base::wbx_version4::set_lo_freq(dboard_iface::unit_t unit, double target_freq)
+{
+ // clip to tuning range
target_freq = wbx_v4_freq_range.clip(target_freq);
- UHD_LOGGER_TRACE("WBX") << boost::format(
- "WBX tune: target frequency %f MHz"
- ) % (target_freq/1e6) ;
+ UHD_LOGGER_TRACE("WBX") << boost::format("WBX tune: target frequency %f MHz")
+ % (target_freq / 1e6);
/*
* If the user sets 'mode_n=integer' in the tuning args, the user wishes to
* tune in Integer-N mode, which can result in better spur
* performance on some mixers. The default is fractional tuning.
*/
- property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX) ? self_base->get_rx_subtree()
- : self_base->get_tx_subtree();
+ property_tree::sptr subtree = (unit == dboard_iface::UNIT_RX)
+ ? self_base->get_rx_subtree()
+ : self_base->get_tx_subtree();
device_addr_t tune_args = subtree->access<device_addr_t>("tune_args").get();
- bool is_int_n = boost::iequals(tune_args.get("mode_n",""), "integer");
- double reference_freq = self_base->get_iface()->get_clock_rate(unit);
+ bool is_int_n = boost::iequals(tune_args.get("mode_n", ""), "integer");
+ double reference_freq = self_base->get_iface()->get_clock_rate(unit);
- //Select the LO
+ // Select the LO
adf435x_iface::sptr& lo_iface = unit == dboard_iface::UNIT_RX ? _rxlo : _txlo;
lo_iface->set_reference_freq(reference_freq);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //frequency must 2x the target frequency. This introduces a 180 degree phase
- //ambiguity when trying to synchronize the phase of multiple boards.
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // frequency must 2x the target frequency. This introduces a 180 degree phase
+ // ambiguity when trying to synchronize the phase of multiple boards.
double synth_target_freq = target_freq * 2;
- //Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
- lo_iface->set_prescaler(synth_target_freq > 3.6e9 ?
- adf435x_iface::PRESCALER_8_9 : adf435x_iface::PRESCALER_4_5);
+ // Use 8/9 prescaler for vco_freq > 3 GHz (pg.18 prescaler)
+ lo_iface->set_prescaler(synth_target_freq > 3.6e9 ? adf435x_iface::PRESCALER_8_9
+ : adf435x_iface::PRESCALER_4_5);
- //The feedback of the divided frequency must be disabled whenever the target frequency
- //divided by the minimum PFD frequency cannot meet the minimum integer divider (N) value.
- //If it is disabled, additional phase ambiguity will be introduced. With a minimum PFD
- //frequency of 10 MHz, synthesizer frequencies below 230 MHz (LO frequencies below 115 MHz)
- //will have too much ambiguity to synchronize.
+ // The feedback of the divided frequency must be disabled whenever the target
+ // frequency divided by the minimum PFD frequency cannot meet the minimum integer
+ // divider (N) value. If it is disabled, additional phase ambiguity will be
+ // introduced. With a minimum PFD frequency of 10 MHz, synthesizer frequencies below
+ // 230 MHz (LO frequencies below 115 MHz) will have too much ambiguity to synchronize.
lo_iface->set_feedback_select(
- (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start() ?
- adf435x_iface::FB_SEL_DIVIDED : adf435x_iface::FB_SEL_FUNDAMENTAL));
+ (int(synth_target_freq / 10e6) >= lo_iface->get_int_range().start()
+ ? adf435x_iface::FB_SEL_DIVIDED
+ : adf435x_iface::FB_SEL_FUNDAMENTAL));
double synth_actual_freq = lo_iface->set_frequency(synth_target_freq, is_int_n);
- //The mixer has a divide-by-2 stage on the LO port so the synthesizer
- //actual_freq must /2 the synth_actual_freq
+ // The mixer has a divide-by-2 stage on the LO port so the synthesizer
+ // actual_freq must /2 the synth_actual_freq
double actual_freq = synth_actual_freq / 2;
if (unit == dboard_iface::UNIT_RX) {
- lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_output_power((actual_freq == wbx_rx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_2DBM);
} else {
- lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq)) ?
- adf435x_iface::OUTPUT_POWER_5DBM : adf435x_iface::OUTPUT_POWER_M1DBM);
+ lo_iface->set_output_power((actual_freq == wbx_tx_lo_5dbm.clip(actual_freq))
+ ? adf435x_iface::OUTPUT_POWER_5DBM
+ : adf435x_iface::OUTPUT_POWER_M1DBM);
}
- //Write to hardware
+ // Write to hardware
lo_iface->commit();
return actual_freq;
diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp
index 40fdca0a5..d42a56562 100644
--- a/host/lib/usrp/dboard/db_xcvr2450.cpp
+++ b/host/lib/usrp/dboard/db_xcvr2450.cpp
@@ -6,36 +6,38 @@
//
// TX IO Pins
-#define HB_PA_OFF_TXIO (1 << 15) // 5GHz PA, 1 = off, 0 = on
-#define LB_PA_OFF_TXIO (1 << 14) // 2.4GHz PA, 1 = off, 0 = on
-#define ANTSEL_TX1_RX2_TXIO (1 << 13) // 1 = Ant 1 to TX, Ant 2 to RX
-#define ANTSEL_TX2_RX1_TXIO (1 << 12) // 1 = Ant 2 to TX, Ant 1 to RX
-#define TX_EN_TXIO (1 << 11) // 1 = TX on, 0 = TX off
-#define AD9515DIV_TXIO (1 << 4) // 1 = Div by 3, 0 = Div by 2
+#define HB_PA_OFF_TXIO (1 << 15) // 5GHz PA, 1 = off, 0 = on
+#define LB_PA_OFF_TXIO (1 << 14) // 2.4GHz PA, 1 = off, 0 = on
+#define ANTSEL_TX1_RX2_TXIO (1 << 13) // 1 = Ant 1 to TX, Ant 2 to RX
+#define ANTSEL_TX2_RX1_TXIO (1 << 12) // 1 = Ant 2 to TX, Ant 1 to RX
+#define TX_EN_TXIO (1 << 11) // 1 = TX on, 0 = TX off
+#define AD9515DIV_TXIO (1 << 4) // 1 = Div by 3, 0 = Div by 2
-#define TXIO_MASK (HB_PA_OFF_TXIO | LB_PA_OFF_TXIO | ANTSEL_TX1_RX2_TXIO | ANTSEL_TX2_RX1_TXIO | TX_EN_TXIO | AD9515DIV_TXIO)
+#define TXIO_MASK \
+ (HB_PA_OFF_TXIO | LB_PA_OFF_TXIO | ANTSEL_TX1_RX2_TXIO | ANTSEL_TX2_RX1_TXIO \
+ | TX_EN_TXIO | AD9515DIV_TXIO)
// TX IO Functions
-#define HB_PA_TXIO LB_PA_OFF_TXIO
-#define LB_PA_TXIO HB_PA_OFF_TXIO
-#define TX_ENB_TXIO TX_EN_TXIO
-#define TX_DIS_TXIO (HB_PA_OFF_TXIO | LB_PA_OFF_TXIO)
-#define AD9515DIV_3_TXIO AD9515DIV_TXIO
-#define AD9515DIV_2_TXIO 0
+#define HB_PA_TXIO LB_PA_OFF_TXIO
+#define LB_PA_TXIO HB_PA_OFF_TXIO
+#define TX_ENB_TXIO TX_EN_TXIO
+#define TX_DIS_TXIO (HB_PA_OFF_TXIO | LB_PA_OFF_TXIO)
+#define AD9515DIV_3_TXIO AD9515DIV_TXIO
+#define AD9515DIV_2_TXIO 0
// RX IO Pins
-#define LOCKDET_RXIO (1 << 15) // This is an INPUT!!!
-#define POWER_RXIO (1 << 14) // 1 = power on, 0 = shutdown
-#define RX_EN_RXIO (1 << 13) // 1 = RX on, 0 = RX off
-#define RX_HP_RXIO (1 << 12) // 0 = Fc set by rx_hpf, 1 = 600 KHz
+#define LOCKDET_RXIO (1 << 15) // This is an INPUT!!!
+#define POWER_RXIO (1 << 14) // 1 = power on, 0 = shutdown
+#define RX_EN_RXIO (1 << 13) // 1 = RX on, 0 = RX off
+#define RX_HP_RXIO (1 << 12) // 0 = Fc set by rx_hpf, 1 = 600 KHz
#define RXIO_MASK (POWER_RXIO | RX_EN_RXIO | RX_HP_RXIO)
// RX IO Functions
-#define POWER_UP_RXIO POWER_RXIO
-#define POWER_DOWN_RXIO 0
-#define RX_ENB_RXIO RX_EN_RXIO
-#define RX_DIS_RXIO 0
+#define POWER_UP_RXIO POWER_RXIO
+#define POWER_DOWN_RXIO 0
+#define RX_ENB_RXIO RX_EN_RXIO
+#define RX_DIS_RXIO 0
#include "max2829_regs.hpp"
#include <uhd/types/dict.hpp>
@@ -63,45 +65,32 @@ using namespace boost::assign;
/***********************************************************************
* The XCVR 2450 constants
**********************************************************************/
-static const freq_range_t xcvr_freq_range = list_of
- (range_t(2.4e9, 2.5e9))
- (range_t(4.9e9, 6.0e9))
-;
-
-//Multiplied by 2.0 for conversion to complex bandpass from lowpass
-static const freq_range_t xcvr_tx_bandwidth_range = list_of
- (range_t(2.0*12e6))
- (range_t(2.0*18e6))
- (range_t(2.0*24e6))
-;
-
-//Multiplied by 2.0 for conversion to complex bandpass from lowpass
-static const freq_range_t xcvr_rx_bandwidth_range = list_of
- (range_t(2.0*0.9*7.5e6, 2.0*1.1*7.5e6))
- (range_t(2.0*0.9*9.5e6, 2.0*1.1*9.5e6))
- (range_t(2.0*0.9*14e6, 2.0*1.1*14e6))
- (range_t(2.0*0.9*18e6, 2.0*1.1*18e6))
-;
+static const freq_range_t xcvr_freq_range =
+ list_of(range_t(2.4e9, 2.5e9))(range_t(4.9e9, 6.0e9));
+
+// Multiplied by 2.0 for conversion to complex bandpass from lowpass
+static const freq_range_t xcvr_tx_bandwidth_range =
+ list_of(range_t(2.0 * 12e6))(range_t(2.0 * 18e6))(range_t(2.0 * 24e6));
+
+// Multiplied by 2.0 for conversion to complex bandpass from lowpass
+static const freq_range_t xcvr_rx_bandwidth_range =
+ list_of(range_t(2.0 * 0.9 * 7.5e6, 2.0 * 1.1 * 7.5e6))(
+ range_t(2.0 * 0.9 * 9.5e6, 2.0 * 1.1 * 9.5e6))(range_t(
+ 2.0 * 0.9 * 14e6, 2.0 * 1.1 * 14e6))(range_t(2.0 * 0.9 * 18e6, 2.0 * 1.1 * 18e6));
static const std::vector<std::string> xcvr_antennas = list_of("J1")("J2");
-static const uhd::dict<std::string, gain_range_t> xcvr_tx_gain_ranges = map_list_of
- ("VGA", gain_range_t(0, 30, 0.5))
- ("BB", gain_range_t(0, 5, 1.5))
-;
-static const uhd::dict<std::string, gain_range_t> xcvr_rx_gain_ranges = map_list_of
- ("LNA", gain_range_t(list_of
- (range_t(0))
- (range_t(15))
- (range_t(30.5))
- ))
- ("VGA", gain_range_t(0, 62, 2.0))
-;
+static const uhd::dict<std::string, gain_range_t> xcvr_tx_gain_ranges =
+ map_list_of("VGA", gain_range_t(0, 30, 0.5))("BB", gain_range_t(0, 5, 1.5));
+static const uhd::dict<std::string, gain_range_t> xcvr_rx_gain_ranges =
+ map_list_of("LNA", gain_range_t(list_of(range_t(0))(range_t(15))(range_t(30.5))))(
+ "VGA", gain_range_t(0, 62, 2.0));
/***********************************************************************
* The XCVR 2450 dboard class
**********************************************************************/
-class xcvr2450 : public xcvr_dboard_base{
+class xcvr2450 : public xcvr_dboard_base
+{
public:
xcvr2450(ctor_args_t args);
virtual ~xcvr2450(void);
@@ -116,35 +105,38 @@ private:
double set_lo_freq(double target_freq);
double set_lo_freq_core(double target_freq);
- void set_tx_ant(const std::string &ant);
- void set_rx_ant(const std::string &ant);
- double set_tx_gain(double gain, const std::string &name);
- double set_rx_gain(double gain, const std::string &name);
+ void set_tx_ant(const std::string& ant);
+ void set_rx_ant(const std::string& ant);
+ double set_tx_gain(double gain, const std::string& name);
+ double set_rx_gain(double gain, const std::string& name);
double set_rx_bandwidth(double bandwidth);
double set_tx_bandwidth(double bandwidth);
void update_atr(void);
void spi_reset(void);
- void send_reg(uint8_t addr){
+ void send_reg(uint8_t addr)
+ {
uint32_t value = _max2829_regs.get_reg(addr);
- UHD_LOGGER_TRACE("XCVR2450") << boost::format(
- "XCVR2450: send reg 0x%02x, value 0x%05x"
- ) % int(addr) % value ;
+ UHD_LOGGER_TRACE("XCVR2450")
+ << boost::format("XCVR2450: send reg 0x%02x, value 0x%05x") % int(addr)
+ % value;
this->get_iface()->write_spi(
- dboard_iface::UNIT_RX,
- spi_config_t::EDGE_RISE,
- value, 24
- );
+ dboard_iface::UNIT_RX, spi_config_t::EDGE_RISE, value, 24);
}
- static bool is_highband(double freq){return freq > 3e9;}
+ static bool is_highband(double freq)
+ {
+ return freq > 3e9;
+ }
/*!
* Get the lock detect status of the LO.
* \return sensor for locked
*/
- sensor_value_t get_locked(void){
- const bool locked = (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) & LOCKDET_RXIO) != 0;
+ sensor_value_t get_locked(void)
+ {
+ const bool locked =
+ (this->get_iface()->read_gpio(dboard_iface::UNIT_RX) & LOCKDET_RXIO) != 0;
return sensor_value_t("LO", locked, "locked", "unlocked");
}
@@ -152,22 +144,30 @@ private:
* Read the RSSI from the aux adc
* \return the rssi sensor in dBm
*/
- sensor_value_t get_rssi(void){
+ sensor_value_t get_rssi(void)
+ {
//*FIXME* RSSI depends on LNA Gain Setting (datasheet pg 16 top middle chart)
double max_power = 0.0;
- switch(_max2829_regs.rx_lna_gain){
- case 0:
- case 1: max_power = 0; break;
- case 2: max_power = -15; break;
- case 3: max_power = -30.5; break;
+ switch (_max2829_regs.rx_lna_gain) {
+ case 0:
+ case 1:
+ max_power = 0;
+ break;
+ case 2:
+ max_power = -15;
+ break;
+ case 3:
+ max_power = -30.5;
+ break;
}
- //constants for the rssi calculation
+ // constants for the rssi calculation
static const double min_v = 2.5, max_v = 0.5;
static const double rssi_dyn_range = 60.0;
- //calculate the rssi from the voltage
- double voltage = this->get_iface()->read_aux_adc(dboard_iface::UNIT_RX, dboard_iface::AUX_ADC_B);
- double rssi = max_power - rssi_dyn_range*(voltage - min_v)/(max_v - min_v);
+ // calculate the rssi from the voltage
+ double voltage = this->get_iface()->read_aux_adc(
+ dboard_iface::UNIT_RX, dboard_iface::AUX_ADC_B);
+ double rssi = max_power - rssi_dyn_range * (voltage - min_v) / (max_v - min_v);
return sensor_value_t("RSSI", rssi, "dBm");
}
};
@@ -175,12 +175,14 @@ private:
/***********************************************************************
* Register the XCVR 2450 dboard
**********************************************************************/
-static dboard_base::sptr make_xcvr2450(dboard_base::ctor_args_t args){
+static dboard_base::sptr make_xcvr2450(dboard_base::ctor_args_t args)
+{
return dboard_base::sptr(new xcvr2450(args));
}
-UHD_STATIC_BLOCK(reg_xcvr2450_dboard){
- //register the factory function for the rx and tx dbids
+UHD_STATIC_BLOCK(reg_xcvr2450_dboard)
+{
+ // register the factory function for the rx and tx dbids
dboard_manager::register_dboard(0x0061, 0x0060, &make_xcvr2450, "XCVR2450");
dboard_manager::register_dboard(0x0061, 0x0059, &make_xcvr2450, "XCVR2450 - r2.1");
}
@@ -188,13 +190,14 @@ UHD_STATIC_BLOCK(reg_xcvr2450_dboard){
/***********************************************************************
* Structors
**********************************************************************/
-xcvr2450::xcvr2450(ctor_args_t args) : xcvr_dboard_base(args){
- spi_reset(); //prepare the spi
+xcvr2450::xcvr2450(ctor_args_t args) : xcvr_dboard_base(args)
+{
+ spi_reset(); // prepare the spi
_rx_bandwidth = 9.5e6;
_tx_bandwidth = 12.0e6;
- //setup the misc max2829 registers
+ // setup the misc max2829 registers
_max2829_regs.mimo_select = max2829_regs_t::MIMO_SELECT_MIMO;
_max2829_regs.band_sel_mimo = max2829_regs_t::BAND_SEL_MIMO_MIMO;
_max2829_regs.pll_cp_select = max2829_regs_t::PLL_CP_SELECT_4MA;
@@ -212,223 +215,261 @@ xcvr2450::xcvr2450(ctor_args_t args) : xcvr_dboard_base(args){
_max2829_regs.tx_vga_linearity = max2829_regs_t::TX_VGA_LINEARITY_78;
_max2829_regs.tx_upconv_linearity = max2829_regs_t::TX_UPCONV_LINEARITY_78;
- //send initial register settings
- for(uint8_t reg = 0x2; reg <= 0xC; reg++){
+ // send initial register settings
+ for (uint8_t reg = 0x2; reg <= 0xC; reg++) {
this->send_reg(reg);
}
////////////////////////////////////////////////////////////////////
// Register RX properties
////////////////////////////////////////////////////////////////////
- this->get_rx_subtree()->create<std::string>("name")
- .set("XCVR2450 RX");
- this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_rx_subtree()->create<std::string>("name").set("XCVR2450 RX");
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&xcvr2450::get_locked, this));
- this->get_rx_subtree()->create<sensor_value_t>("sensors/rssi")
+ this->get_rx_subtree()
+ ->create<sensor_value_t>("sensors/rssi")
.set_publisher(std::bind(&xcvr2450::get_rssi, this));
- for(const std::string &name: xcvr_rx_gain_ranges.keys()){
- this->get_rx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&xcvr2450::set_rx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : xcvr_rx_gain_ranges.keys()) {
+ this->get_rx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&xcvr2450::set_rx_gain, this, std::placeholders::_1, name))
.set(xcvr_rx_gain_ranges[name].start());
- this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_rx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(xcvr_rx_gain_ranges[name]);
}
- this->get_rx_subtree()->create<double>("freq/value")
+ this->get_rx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&xcvr2450::set_lo_freq, this, std::placeholders::_1))
.set(double(2.45e9));
- this->get_rx_subtree()->create<meta_range_t>("freq/range")
- .set(xcvr_freq_range);
- this->get_rx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&xcvr2450::set_rx_ant, this, std::placeholders::_1))
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(xcvr_freq_range);
+ this->get_rx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&xcvr2450::set_rx_ant, this, std::placeholders::_1))
.set(xcvr_antennas.at(0));
- this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_rx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(xcvr_antennas);
- this->get_rx_subtree()->create<std::string>("connection")
- .set("IQ");
- this->get_rx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_rx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_rx_subtree()->create<double>("bandwidth/value")
- .set_coercer(std::bind(&xcvr2450::set_rx_bandwidth, this, std::placeholders::_1)) //complex bandpass bandwidth
- .set(2.0*_rx_bandwidth); //_rx_bandwidth in lowpass, convert to complex bandpass
- this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_rx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_rx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()
+ ->create<double>("bandwidth/value")
+ .set_coercer(std::bind(&xcvr2450::set_rx_bandwidth,
+ this,
+ std::placeholders::_1)) // complex bandpass bandwidth
+ .set(2.0 * _rx_bandwidth); //_rx_bandwidth in lowpass, convert to complex bandpass
+ this->get_rx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(xcvr_rx_bandwidth_range);
////////////////////////////////////////////////////////////////////
// Register TX properties
////////////////////////////////////////////////////////////////////
- this->get_tx_subtree()->create<std::string>("name")
- .set("XCVR2450 TX");
- this->get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ this->get_tx_subtree()->create<std::string>("name").set("XCVR2450 TX");
+ this->get_tx_subtree()
+ ->create<sensor_value_t>("sensors/lo_locked")
.set_publisher(std::bind(&xcvr2450::get_locked, this));
- for(const std::string &name: xcvr_tx_gain_ranges.keys()){
- this->get_tx_subtree()->create<double>("gains/"+name+"/value")
- .set_coercer(std::bind(&xcvr2450::set_tx_gain, this, std::placeholders::_1, name))
+ for (const std::string& name : xcvr_tx_gain_ranges.keys()) {
+ this->get_tx_subtree()
+ ->create<double>("gains/" + name + "/value")
+ .set_coercer(
+ std::bind(&xcvr2450::set_tx_gain, this, std::placeholders::_1, name))
.set(xcvr_tx_gain_ranges[name].start());
- this->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ this->get_tx_subtree()
+ ->create<meta_range_t>("gains/" + name + "/range")
.set(xcvr_tx_gain_ranges[name]);
}
- this->get_tx_subtree()->create<double>("freq/value")
+ this->get_tx_subtree()
+ ->create<double>("freq/value")
.set_coercer(std::bind(&xcvr2450::set_lo_freq, this, std::placeholders::_1))
.set(double(2.45e9));
- this->get_tx_subtree()->create<meta_range_t>("freq/range")
- .set(xcvr_freq_range);
- this->get_tx_subtree()->create<std::string>("antenna/value")
- .add_coerced_subscriber(std::bind(&xcvr2450::set_tx_ant, this, std::placeholders::_1))
+ this->get_tx_subtree()->create<meta_range_t>("freq/range").set(xcvr_freq_range);
+ this->get_tx_subtree()
+ ->create<std::string>("antenna/value")
+ .add_coerced_subscriber(
+ std::bind(&xcvr2450::set_tx_ant, this, std::placeholders::_1))
.set(xcvr_antennas.at(1));
- this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ this->get_tx_subtree()
+ ->create<std::vector<std::string>>("antenna/options")
.set(xcvr_antennas);
- this->get_tx_subtree()->create<std::string>("connection")
- .set("QI");
- this->get_tx_subtree()->create<bool>("enabled")
- .set(true); //always enabled
- this->get_tx_subtree()->create<bool>("use_lo_offset")
- .set(false);
- this->get_tx_subtree()->create<double>("bandwidth/value")
- .set_coercer(std::bind(&xcvr2450::set_tx_bandwidth, this, std::placeholders::_1)) //complex bandpass bandwidth
- .set(2.0*_tx_bandwidth); //_tx_bandwidth in lowpass, convert to complex bandpass
- this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
+ this->get_tx_subtree()->create<std::string>("connection").set("QI");
+ this->get_tx_subtree()->create<bool>("enabled").set(true); // always enabled
+ this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_tx_subtree()
+ ->create<double>("bandwidth/value")
+ .set_coercer(std::bind(&xcvr2450::set_tx_bandwidth,
+ this,
+ std::placeholders::_1)) // complex bandpass bandwidth
+ .set(2.0 * _tx_bandwidth); //_tx_bandwidth in lowpass, convert to complex bandpass
+ this->get_tx_subtree()
+ ->create<meta_range_t>("bandwidth/range")
.set(xcvr_tx_bandwidth_range);
- //enable only the clocks we need
+ // enable only the clocks we need
this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
- //set the gpio directions and atr controls (identically)
+ // set the gpio directions and atr controls (identically)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, TXIO_MASK);
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, RXIO_MASK);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_TX, TXIO_MASK);
this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, RXIO_MASK);
}
-xcvr2450::~xcvr2450(void){
+xcvr2450::~xcvr2450(void)
+{
UHD_SAFE_CALL(spi_reset();)
}
-void xcvr2450::spi_reset(void){
- //spi reset mode: global enable = off, tx and rx enable = on
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, TX_ENB_TXIO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, RX_ENB_RXIO | POWER_DOWN_RXIO);
+void xcvr2450::spi_reset(void)
+{
+ // spi reset mode: global enable = off, tx and rx enable = on
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, TX_ENB_TXIO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, RX_ENB_RXIO | POWER_DOWN_RXIO);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
- //take it back out of spi reset mode and wait a bit
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, RX_DIS_RXIO | POWER_UP_RXIO);
+ // take it back out of spi reset mode and wait a bit
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, RX_DIS_RXIO | POWER_UP_RXIO);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
/***********************************************************************
* Update ATR regs which change with Antenna or Freq
**********************************************************************/
-void xcvr2450::update_atr(void){
- //calculate tx atr pins
- int band_sel = (xcvr2450::is_highband(_lo_freq))? HB_PA_TXIO : LB_PA_TXIO;
- int tx_ant_sel = (_tx_ant == "J1")? ANTSEL_TX1_RX2_TXIO : ANTSEL_TX2_RX1_TXIO;
- int rx_ant_sel = (_rx_ant == "J2")? ANTSEL_TX1_RX2_TXIO : ANTSEL_TX2_RX1_TXIO;
- int xx_ant_sel = tx_ant_sel; //Prefer the tx antenna selection for full duplex,
- //due to the issue that USRP1 will take the value of full duplex for its TXATR.
- int ad9515div = (_ad9515div == 3)? AD9515DIV_3_TXIO : AD9515DIV_2_TXIO;
-
- //set the tx registers
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_IDLE, band_sel | ad9515div | TX_DIS_TXIO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_RX_ONLY, band_sel | ad9515div | TX_DIS_TXIO | rx_ant_sel);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_TX_ONLY, band_sel | ad9515div | TX_ENB_TXIO | tx_ant_sel);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, gpio_atr::ATR_REG_FULL_DUPLEX, band_sel | ad9515div | TX_ENB_TXIO | xx_ant_sel);
-
- //set the rx registers
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, POWER_UP_RXIO | RX_DIS_RXIO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, POWER_UP_RXIO | RX_ENB_RXIO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, POWER_UP_RXIO | RX_DIS_RXIO);
- this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, gpio_atr::ATR_REG_FULL_DUPLEX, POWER_UP_RXIO | RX_DIS_RXIO);
+void xcvr2450::update_atr(void)
+{
+ // calculate tx atr pins
+ int band_sel = (xcvr2450::is_highband(_lo_freq)) ? HB_PA_TXIO : LB_PA_TXIO;
+ int tx_ant_sel = (_tx_ant == "J1") ? ANTSEL_TX1_RX2_TXIO : ANTSEL_TX2_RX1_TXIO;
+ int rx_ant_sel = (_rx_ant == "J2") ? ANTSEL_TX1_RX2_TXIO : ANTSEL_TX2_RX1_TXIO;
+ int xx_ant_sel = tx_ant_sel; // Prefer the tx antenna selection for full duplex,
+ // due to the issue that USRP1 will take the value of full duplex for its TXATR.
+ int ad9515div = (_ad9515div == 3) ? AD9515DIV_3_TXIO : AD9515DIV_2_TXIO;
+
+ // set the tx registers
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_IDLE,
+ band_sel | ad9515div | TX_DIS_TXIO);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_RX_ONLY,
+ band_sel | ad9515div | TX_DIS_TXIO | rx_ant_sel);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_TX_ONLY,
+ band_sel | ad9515div | TX_ENB_TXIO | tx_ant_sel);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ band_sel | ad9515div | TX_ENB_TXIO | xx_ant_sel);
+
+ // set the rx registers
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_IDLE, POWER_UP_RXIO | RX_DIS_RXIO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_RX_ONLY, POWER_UP_RXIO | RX_ENB_RXIO);
+ this->get_iface()->set_atr_reg(
+ dboard_iface::UNIT_RX, gpio_atr::ATR_REG_TX_ONLY, POWER_UP_RXIO | RX_DIS_RXIO);
+ this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX,
+ gpio_atr::ATR_REG_FULL_DUPLEX,
+ POWER_UP_RXIO | RX_DIS_RXIO);
}
/***********************************************************************
* Tuning
**********************************************************************/
-double xcvr2450::set_lo_freq(double target_freq){
- //tune the LO and sleep a bit for lock
- //if not locked, try some carrier offsets
+double xcvr2450::set_lo_freq(double target_freq)
+{
+ // tune the LO and sleep a bit for lock
+ // if not locked, try some carrier offsets
double actual = 0.0;
- for (double offset = 0.0; offset <= 3e6; offset+=1e6){
+ for (double offset = 0.0; offset <= 3e6; offset += 1e6) {
actual = this->set_lo_freq_core(target_freq + offset);
std::this_thread::sleep_for(std::chrono::milliseconds(50));
- if (this->get_locked().to_bool()) break;
+ if (this->get_locked().to_bool())
+ break;
}
return actual;
}
-double xcvr2450::set_lo_freq_core(double target_freq){
-
- //clip the input to the range
+double xcvr2450::set_lo_freq_core(double target_freq)
+{
+ // clip the input to the range
target_freq = xcvr_freq_range.clip(target_freq);
- //variables used in the calculation below
- double scaler = xcvr2450::is_highband(target_freq)? (4.0/5.0) : (4.0/3.0);
+ // variables used in the calculation below
+ double scaler = xcvr2450::is_highband(target_freq) ? (4.0 / 5.0) : (4.0 / 3.0);
double ref_freq = this->get_iface()->get_codec_rate(dboard_iface::UNIT_TX);
int R, intdiv = 131, fracdiv = 0;
- //loop through values until we get a match
- for(_ad9515div = 2; _ad9515div <= 3; _ad9515div++){
- for(R = 1; R <= 7; R++){
- double N = (target_freq*scaler*R*_ad9515div)/ref_freq;
- intdiv = int(std::floor(N));
- fracdiv = boost::math::iround((N - intdiv)*double(1 << 16));
- //actual minimum is 128, but most chips seems to require higher to lock
- if (intdiv < 131 or intdiv > 255) continue;
- //constraints met: exit loop
+ // loop through values until we get a match
+ for (_ad9515div = 2; _ad9515div <= 3; _ad9515div++) {
+ for (R = 1; R <= 7; R++) {
+ double N = (target_freq * scaler * R * _ad9515div) / ref_freq;
+ intdiv = int(std::floor(N));
+ fracdiv = boost::math::iround((N - intdiv) * double(1 << 16));
+ // actual minimum is 128, but most chips seems to require higher to lock
+ if (intdiv < 131 or intdiv > 255)
+ continue;
+ // constraints met: exit loop
goto done_loop;
}
- } done_loop:
+ }
+done_loop:
- //calculate the actual freq from the values above
- double N = double(intdiv) + double(fracdiv)/double(1 << 16);
- _lo_freq = (N*ref_freq)/(scaler*R*_ad9515div);
+ // calculate the actual freq from the values above
+ double N = double(intdiv) + double(fracdiv) / double(1 << 16);
+ _lo_freq = (N * ref_freq) / (scaler * R * _ad9515div);
UHD_LOGGER_TRACE("XCVR2450")
<< boost::format("XCVR2450 tune:\n")
- << boost::format(" R=%d, N=%f, ad9515=%d, scaler=%f\n") % R % N % _ad9515div % scaler
- << boost::format(" Ref Freq=%fMHz\n") % (ref_freq/1e6)
- << boost::format(" Target Freq=%fMHz\n") % (target_freq/1e6)
- << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq/1e6)
- ;
-
- //high-high band or low-high band?
- if(_lo_freq > (5.35e9 + 5.47e9)/2.0){
- UHD_LOGGER_TRACE("XCVR2450") << "XCVR2450 tune: Using high-high band" ;
- _max2829_regs.band_select_802_11a = max2829_regs_t::BAND_SELECT_802_11A_5_47GHZ_TO_5_875GHZ;
- }else{
- UHD_LOGGER_TRACE("XCVR2450") << "XCVR2450 tune: Using low-high band" ;
- _max2829_regs.band_select_802_11a = max2829_regs_t::BAND_SELECT_802_11A_4_9GHZ_TO_5_35GHZ;
+ << boost::format(" R=%d, N=%f, ad9515=%d, scaler=%f\n") % R % N % _ad9515div
+ % scaler
+ << boost::format(" Ref Freq=%fMHz\n") % (ref_freq / 1e6)
+ << boost::format(" Target Freq=%fMHz\n") % (target_freq / 1e6)
+ << boost::format(" Actual Freq=%fMHz\n") % (_lo_freq / 1e6);
+
+ // high-high band or low-high band?
+ if (_lo_freq > (5.35e9 + 5.47e9) / 2.0) {
+ UHD_LOGGER_TRACE("XCVR2450") << "XCVR2450 tune: Using high-high band";
+ _max2829_regs.band_select_802_11a =
+ max2829_regs_t::BAND_SELECT_802_11A_5_47GHZ_TO_5_875GHZ;
+ } else {
+ UHD_LOGGER_TRACE("XCVR2450") << "XCVR2450 tune: Using low-high band";
+ _max2829_regs.band_select_802_11a =
+ max2829_regs_t::BAND_SELECT_802_11A_4_9GHZ_TO_5_35GHZ;
}
- //new band select settings and ad9515 divider
+ // new band select settings and ad9515 divider
this->update_atr();
const bool div_ext(this->get_tx_id() == 0x0059);
- if (div_ext)
- {
- this->get_iface()->set_clock_rate(dboard_iface::UNIT_TX, ref_freq/_ad9515div);
- }
- else
- {
+ if (div_ext) {
+ this->get_iface()->set_clock_rate(dboard_iface::UNIT_TX, ref_freq / _ad9515div);
+ } else {
this->get_iface()->set_clock_rate(dboard_iface::UNIT_TX, ref_freq);
}
- //load new counters into registers
+ // load new counters into registers
_max2829_regs.int_div_ratio_word = intdiv;
_max2829_regs.frac_div_ratio_lsb = fracdiv & 0x3;
_max2829_regs.frac_div_ratio_msb = fracdiv >> 2;
- this->send_reg(0x3); //integer
- this->send_reg(0x4); //fractional
+ this->send_reg(0x3); // integer
+ this->send_reg(0x4); // fractional
- //load the reference divider and band select into registers
- //toggle the bandswitch from off to automatic (which really means start)
+ // load the reference divider and band select into registers
+ // toggle the bandswitch from off to automatic (which really means start)
_max2829_regs.ref_divider = R;
- _max2829_regs.band_select = (xcvr2450::is_highband(_lo_freq))?
- max2829_regs_t::BAND_SELECT_5GHZ :
- max2829_regs_t::BAND_SELECT_2_4GHZ ;
+ _max2829_regs.band_select = (xcvr2450::is_highband(_lo_freq))
+ ? max2829_regs_t::BAND_SELECT_5GHZ
+ : max2829_regs_t::BAND_SELECT_2_4GHZ;
_max2829_regs.vco_bandswitch = max2829_regs_t::VCO_BANDSWITCH_DISABLE;
this->send_reg(0x5);
- _max2829_regs.vco_bandswitch = max2829_regs_t::VCO_BANDSWITCH_AUTOMATIC;;
+ _max2829_regs.vco_bandswitch = max2829_regs_t::VCO_BANDSWITCH_AUTOMATIC;
+ ;
this->send_reg(0x5);
return _lo_freq;
@@ -437,16 +478,18 @@ double xcvr2450::set_lo_freq_core(double target_freq){
/***********************************************************************
* Antenna Handling
**********************************************************************/
-void xcvr2450::set_tx_ant(const std::string &ant){
+void xcvr2450::set_tx_ant(const std::string& ant)
+{
assert_has(xcvr_antennas, ant, "xcvr antenna name");
- _tx_ant = ant;
- this->update_atr(); //sets the atr to the new antenna setting
+ _tx_ant = ant;
+ this->update_atr(); // sets the atr to the new antenna setting
}
-void xcvr2450::set_rx_ant(const std::string &ant){
+void xcvr2450::set_rx_ant(const std::string& ant)
+{
assert_has(xcvr_antennas, ant, "xcvr antenna name");
_rx_ant = ant;
- this->update_atr(); //sets the atr to the new antenna setting
+ this->update_atr(); // sets the atr to the new antenna setting
}
/***********************************************************************
@@ -458,16 +501,20 @@ void xcvr2450::set_rx_ant(const std::string &ant){
* \param gain the requested gain in dB
* \return 6 bit the register value
*/
-static int gain_to_tx_vga_reg(double &gain){
- //calculate the register value
- int reg = uhd::clip(boost::math::iround(gain*60/30.0) + 3, 0, 63);
+static int gain_to_tx_vga_reg(double& gain)
+{
+ // calculate the register value
+ int reg = uhd::clip(boost::math::iround(gain * 60 / 30.0) + 3, 0, 63);
- //calculate the actual gain value
- if (reg < 4) gain = 0;
- else if (reg < 48) gain = double(reg/2 - 1);
- else gain = double(reg/2.0 - 1.5);
+ // calculate the actual gain value
+ if (reg < 4)
+ gain = 0;
+ else if (reg < 48)
+ gain = double(reg / 2 - 1);
+ else
+ gain = double(reg / 2.0 - 1.5);
- //return register value
+ // return register value
return reg;
}
@@ -477,21 +524,22 @@ static int gain_to_tx_vga_reg(double &gain){
* \param gain the requested gain in dB
* \return gain enum value
*/
-static max2829_regs_t::tx_baseband_gain_t gain_to_tx_bb_reg(double &gain){
- int reg = uhd::clip(boost::math::iround(gain*3/5.0), 0, 3);
- switch(reg){
- case 0:
- gain = 0;
- return max2829_regs_t::TX_BASEBAND_GAIN_0DB;
- case 1:
- gain = 2;
- return max2829_regs_t::TX_BASEBAND_GAIN_2DB;
- case 2:
- gain = 3.5;
- return max2829_regs_t::TX_BASEBAND_GAIN_3_5DB;
- case 3:
- gain = 5;
- return max2829_regs_t::TX_BASEBAND_GAIN_5DB;
+static max2829_regs_t::tx_baseband_gain_t gain_to_tx_bb_reg(double& gain)
+{
+ int reg = uhd::clip(boost::math::iround(gain * 3 / 5.0), 0, 3);
+ switch (reg) {
+ case 0:
+ gain = 0;
+ return max2829_regs_t::TX_BASEBAND_GAIN_0DB;
+ case 1:
+ gain = 2;
+ return max2829_regs_t::TX_BASEBAND_GAIN_2DB;
+ case 2:
+ gain = 3.5;
+ return max2829_regs_t::TX_BASEBAND_GAIN_3_5DB;
+ case 3:
+ gain = 5;
+ return max2829_regs_t::TX_BASEBAND_GAIN_5DB;
}
UHD_THROW_INVALID_CODE_PATH();
}
@@ -502,9 +550,10 @@ static max2829_regs_t::tx_baseband_gain_t gain_to_tx_bb_reg(double &gain){
* \param gain the requested gain in dB
* \return 5 bit the register value
*/
-static int gain_to_rx_vga_reg(double &gain){
- int reg = uhd::clip(boost::math::iround(gain/2.0), 0, 31);
- gain = double(reg*2);
+static int gain_to_rx_vga_reg(double& gain)
+{
+ int reg = uhd::clip(boost::math::iround(gain / 2.0), 0, 31);
+ gain = double(reg * 2);
return reg;
}
@@ -514,44 +563,51 @@ static int gain_to_rx_vga_reg(double &gain){
* \param gain the requested gain in dB
* \return 2 bit the register value
*/
-static int gain_to_rx_lna_reg(double &gain){
- int reg = uhd::clip(boost::math::iround(gain*2/30.5) + 1, 0, 3);
- switch(reg){
- case 0:
- case 1: gain = 0; break;
- case 2: gain = 15; break;
- case 3: gain = 30.5; break;
+static int gain_to_rx_lna_reg(double& gain)
+{
+ int reg = uhd::clip(boost::math::iround(gain * 2 / 30.5) + 1, 0, 3);
+ switch (reg) {
+ case 0:
+ case 1:
+ gain = 0;
+ break;
+ case 2:
+ gain = 15;
+ break;
+ case 3:
+ gain = 30.5;
+ break;
}
return reg;
}
-double xcvr2450::set_tx_gain(double gain, const std::string &name){
+double xcvr2450::set_tx_gain(double gain, const std::string& name)
+{
assert_has(xcvr_tx_gain_ranges.keys(), name, "xcvr tx gain name");
- if (name == "VGA"){
+ if (name == "VGA") {
_max2829_regs.tx_vga_gain = gain_to_tx_vga_reg(gain);
send_reg(0xC);
- }
- else if(name == "BB"){
+ } else if (name == "BB") {
_max2829_regs.tx_baseband_gain = gain_to_tx_bb_reg(gain);
send_reg(0x9);
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
_tx_gains[name] = gain;
return gain;
}
-double xcvr2450::set_rx_gain(double gain, const std::string &name){
+double xcvr2450::set_rx_gain(double gain, const std::string& name)
+{
assert_has(xcvr_rx_gain_ranges.keys(), name, "xcvr rx gain name");
- if (name == "VGA"){
+ if (name == "VGA") {
_max2829_regs.rx_vga_gain = gain_to_rx_vga_reg(gain);
send_reg(0xB);
- }
- else if(name == "LNA"){
+ } else if (name == "LNA") {
_max2829_regs.rx_lna_gain = gain_to_rx_lna_reg(gain);
send_reg(0xB);
- }
- else UHD_THROW_INVALID_CODE_PATH();
+ } else
+ UHD_THROW_INVALID_CODE_PATH();
_rx_gains[name] = gain;
return gain;
@@ -561,116 +617,128 @@ double xcvr2450::set_rx_gain(double gain, const std::string &name){
/***********************************************************************
* Bandwidth Handling
**********************************************************************/
-static max2829_regs_t::tx_lpf_coarse_adj_t bandwidth_to_tx_lpf_coarse_reg(double &bandwidth){
- int reg = uhd::clip(boost::math::iround((bandwidth-6.0e6)/6.0e6), 1, 3);
-
- switch(reg){
- case 1: // bandwidth < 15MHz
- bandwidth = 12e6;
- return max2829_regs_t::TX_LPF_COARSE_ADJ_12MHZ;
- case 2: // 15MHz < bandwidth < 21MHz
- bandwidth = 18e6;
- return max2829_regs_t::TX_LPF_COARSE_ADJ_18MHZ;
- case 3: // bandwidth > 21MHz
- bandwidth = 24e6;
- return max2829_regs_t::TX_LPF_COARSE_ADJ_24MHZ;
+static max2829_regs_t::tx_lpf_coarse_adj_t bandwidth_to_tx_lpf_coarse_reg(
+ double& bandwidth)
+{
+ int reg = uhd::clip(boost::math::iround((bandwidth - 6.0e6) / 6.0e6), 1, 3);
+
+ switch (reg) {
+ case 1: // bandwidth < 15MHz
+ bandwidth = 12e6;
+ return max2829_regs_t::TX_LPF_COARSE_ADJ_12MHZ;
+ case 2: // 15MHz < bandwidth < 21MHz
+ bandwidth = 18e6;
+ return max2829_regs_t::TX_LPF_COARSE_ADJ_18MHZ;
+ case 3: // bandwidth > 21MHz
+ bandwidth = 24e6;
+ return max2829_regs_t::TX_LPF_COARSE_ADJ_24MHZ;
}
UHD_THROW_INVALID_CODE_PATH();
}
-static max2829_regs_t::rx_lpf_fine_adj_t bandwidth_to_rx_lpf_fine_reg(double &bandwidth, double requested_bandwidth){
- int reg = uhd::clip(boost::math::iround((requested_bandwidth/bandwidth)/0.05), 18, 22);
-
- switch(reg){
- case 18: // requested_bandwidth < 92.5%
- bandwidth = 0.9 * bandwidth;
- return max2829_regs_t::RX_LPF_FINE_ADJ_90;
- case 19: // 92.5% < requested_bandwidth < 97.5%
- bandwidth = 0.95 * bandwidth;
- return max2829_regs_t::RX_LPF_FINE_ADJ_95;
- case 20: // 97.5% < requested_bandwidth < 102.5%
- bandwidth = 1.0 * bandwidth;
- return max2829_regs_t::RX_LPF_FINE_ADJ_100;
- case 21: // 102.5% < requested_bandwidth < 107.5%
- bandwidth = 1.05 * bandwidth;
- return max2829_regs_t::RX_LPF_FINE_ADJ_105;
- case 22: // 107.5% < requested_bandwidth
- bandwidth = 1.1 * bandwidth;
- return max2829_regs_t::RX_LPF_FINE_ADJ_110;
+static max2829_regs_t::rx_lpf_fine_adj_t bandwidth_to_rx_lpf_fine_reg(
+ double& bandwidth, double requested_bandwidth)
+{
+ int reg =
+ uhd::clip(boost::math::iround((requested_bandwidth / bandwidth) / 0.05), 18, 22);
+
+ switch (reg) {
+ case 18: // requested_bandwidth < 92.5%
+ bandwidth = 0.9 * bandwidth;
+ return max2829_regs_t::RX_LPF_FINE_ADJ_90;
+ case 19: // 92.5% < requested_bandwidth < 97.5%
+ bandwidth = 0.95 * bandwidth;
+ return max2829_regs_t::RX_LPF_FINE_ADJ_95;
+ case 20: // 97.5% < requested_bandwidth < 102.5%
+ bandwidth = 1.0 * bandwidth;
+ return max2829_regs_t::RX_LPF_FINE_ADJ_100;
+ case 21: // 102.5% < requested_bandwidth < 107.5%
+ bandwidth = 1.05 * bandwidth;
+ return max2829_regs_t::RX_LPF_FINE_ADJ_105;
+ case 22: // 107.5% < requested_bandwidth
+ bandwidth = 1.1 * bandwidth;
+ return max2829_regs_t::RX_LPF_FINE_ADJ_110;
}
UHD_THROW_INVALID_CODE_PATH();
}
-static max2829_regs_t::rx_lpf_coarse_adj_t bandwidth_to_rx_lpf_coarse_reg(double &bandwidth){
- int reg = uhd::clip(boost::math::iround((bandwidth-7.0e6)/1.0e6), 0, 11);
-
- switch(reg){
- case 0: // bandwidth < 7.5MHz
- case 1: // 7.5MHz < bandwidth < 8.5MHz
- bandwidth = 7.5e6;
- return max2829_regs_t::RX_LPF_COARSE_ADJ_7_5MHZ;
- case 2: // 8.5MHz < bandwidth < 9.5MHz
- case 3: // 9.5MHz < bandwidth < 10.5MHz
- case 4: // 10.5MHz < bandwidth < 11.5MHz
- bandwidth = 9.5e6;
- return max2829_regs_t::RX_LPF_COARSE_ADJ_9_5MHZ;
- case 5: // 11.5MHz < bandwidth < 12.5MHz
- case 6: // 12.5MHz < bandwidth < 13.5MHz
- case 7: // 13.5MHz < bandwidth < 14.5MHz
- case 8: // 14.5MHz < bandwidth < 15.5MHz
- bandwidth = 14e6;
- return max2829_regs_t::RX_LPF_COARSE_ADJ_14MHZ;
- case 9: // 15.5MHz < bandwidth < 16.5MHz
- case 10: // 16.5MHz < bandwidth < 17.5MHz
- case 11: // 17.5MHz < bandwidth
- bandwidth = 18e6;
- return max2829_regs_t::RX_LPF_COARSE_ADJ_18MHZ;
+static max2829_regs_t::rx_lpf_coarse_adj_t bandwidth_to_rx_lpf_coarse_reg(
+ double& bandwidth)
+{
+ int reg = uhd::clip(boost::math::iround((bandwidth - 7.0e6) / 1.0e6), 0, 11);
+
+ switch (reg) {
+ case 0: // bandwidth < 7.5MHz
+ case 1: // 7.5MHz < bandwidth < 8.5MHz
+ bandwidth = 7.5e6;
+ return max2829_regs_t::RX_LPF_COARSE_ADJ_7_5MHZ;
+ case 2: // 8.5MHz < bandwidth < 9.5MHz
+ case 3: // 9.5MHz < bandwidth < 10.5MHz
+ case 4: // 10.5MHz < bandwidth < 11.5MHz
+ bandwidth = 9.5e6;
+ return max2829_regs_t::RX_LPF_COARSE_ADJ_9_5MHZ;
+ case 5: // 11.5MHz < bandwidth < 12.5MHz
+ case 6: // 12.5MHz < bandwidth < 13.5MHz
+ case 7: // 13.5MHz < bandwidth < 14.5MHz
+ case 8: // 14.5MHz < bandwidth < 15.5MHz
+ bandwidth = 14e6;
+ return max2829_regs_t::RX_LPF_COARSE_ADJ_14MHZ;
+ case 9: // 15.5MHz < bandwidth < 16.5MHz
+ case 10: // 16.5MHz < bandwidth < 17.5MHz
+ case 11: // 17.5MHz < bandwidth
+ bandwidth = 18e6;
+ return max2829_regs_t::RX_LPF_COARSE_ADJ_18MHZ;
}
UHD_THROW_INVALID_CODE_PATH();
}
-double xcvr2450::set_rx_bandwidth(double bandwidth){
+double xcvr2450::set_rx_bandwidth(double bandwidth)
+{
double requested_bandwidth = bandwidth;
- //convert complex bandpass to lowpass bandwidth
- bandwidth = bandwidth/2.0;
+ // convert complex bandpass to lowpass bandwidth
+ bandwidth = bandwidth / 2.0;
- //compute coarse low pass cutoff frequency setting
+ // compute coarse low pass cutoff frequency setting
_max2829_regs.rx_lpf_coarse_adj = bandwidth_to_rx_lpf_coarse_reg(bandwidth);
- //compute fine low pass cutoff frequency setting
- _max2829_regs.rx_lpf_fine_adj = bandwidth_to_rx_lpf_fine_reg(bandwidth, requested_bandwidth);
+ // compute fine low pass cutoff frequency setting
+ _max2829_regs.rx_lpf_fine_adj =
+ bandwidth_to_rx_lpf_fine_reg(bandwidth, requested_bandwidth);
- //shadow bandwidth setting
+ // shadow bandwidth setting
_rx_bandwidth = bandwidth;
- //update register
+ // update register
send_reg(0x7);
- UHD_LOGGER_TRACE("XCVR2450") << boost::format(
- "XCVR2450 RX Bandwidth (lp_fc): %f Hz, coarse reg: %d, fine reg: %d"
- ) % _rx_bandwidth % (int(_max2829_regs.rx_lpf_coarse_adj)) % (int(_max2829_regs.rx_lpf_fine_adj)) ;
+ UHD_LOGGER_TRACE("XCVR2450")
+ << boost::format(
+ "XCVR2450 RX Bandwidth (lp_fc): %f Hz, coarse reg: %d, fine reg: %d")
+ % _rx_bandwidth % (int(_max2829_regs.rx_lpf_coarse_adj))
+ % (int(_max2829_regs.rx_lpf_fine_adj));
- return 2.0*_rx_bandwidth;
+ return 2.0 * _rx_bandwidth;
}
-double xcvr2450::set_tx_bandwidth(double bandwidth){
- //convert complex bandpass to lowpass bandwidth
- bandwidth = bandwidth/2.0;
+double xcvr2450::set_tx_bandwidth(double bandwidth)
+{
+ // convert complex bandpass to lowpass bandwidth
+ bandwidth = bandwidth / 2.0;
- //compute coarse low pass cutoff frequency setting
+ // compute coarse low pass cutoff frequency setting
_max2829_regs.tx_lpf_coarse_adj = bandwidth_to_tx_lpf_coarse_reg(bandwidth);
- //shadow bandwidth setting
+ // shadow bandwidth setting
_tx_bandwidth = bandwidth;
- //update register
+ // update register
send_reg(0x7);
- UHD_LOGGER_TRACE("XCVR2450") << boost::format(
- "XCVR2450 TX Bandwidth (lp_fc): %f Hz, coarse reg: %d"
- ) % _tx_bandwidth % (int(_max2829_regs.tx_lpf_coarse_adj)) ;
+ UHD_LOGGER_TRACE("XCVR2450")
+ << boost::format("XCVR2450 TX Bandwidth (lp_fc): %f Hz, coarse reg: %d")
+ % _tx_bandwidth % (int(_max2829_regs.tx_lpf_coarse_adj));
- //convert lowpass back to complex bandpass bandwidth
- return 2.0*_tx_bandwidth;
+ // convert lowpass back to complex bandpass bandwidth
+ return 2.0 * _tx_bandwidth;
}
diff --git a/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
index 8b8daa681..a0d0eeb22 100644
--- a/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
+++ b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
@@ -28,162 +28,147 @@ e31x_radio_control_impl::~e31x_radio_control_impl()
/******************************************************************************
* API Calls
*****************************************************************************/
-uint32_t e31x_radio_control_impl::get_tx_switches(
- const size_t chan,
- const double freq
-) {
- RFNOC_LOG_TRACE(
- "Update all TX freq related switches. f=" << freq << " Hz, "
- );
+uint32_t e31x_radio_control_impl::get_tx_switches(const size_t chan, const double freq)
+{
+ RFNOC_LOG_TRACE("Update all TX freq related switches. f=" << freq << " Hz, ");
- size_t fe_chan = _fe_swap ? (chan ? 0 : 1): chan;
+ size_t fe_chan = _fe_swap ? (chan ? 0 : 1) : chan;
- auto tx_sw1 = TX_SW1_LB_2750; // SW1 = 0
+ auto tx_sw1 = TX_SW1_LB_2750; // SW1 = 0
auto vctxrx_sw = VCTXRX_SW_OFF;
- auto tx_bias = (fe_chan == 0) ? TX1_BIAS_LB_ON: TX2_BIAS_LB_ON;
+ auto tx_bias = (fe_chan == 0) ? TX1_BIAS_LB_ON : TX2_BIAS_LB_ON;
const auto band = e3xx_radio_control_impl::map_freq_to_tx_band(freq);
- switch(band) {
- case tx_band::LB_80:
- tx_sw1 = TX_SW1_LB_80;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_160:
- tx_sw1 = TX_SW1_LB_160;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_225:
- tx_sw1 = TX_SW1_LB_225;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_400:
- tx_sw1 = TX_SW1_LB_400;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_575:
- tx_sw1 = TX_SW1_LB_575;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_1000:
- tx_sw1 = TX_SW1_LB_1000;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_1700:
- tx_sw1 = TX_SW1_LB_1700;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::LB_2750:
- tx_sw1 = TX_SW1_LB_2750;
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
- break;
- case tx_band::HB:
- tx_sw1 = TX_SW1_LB_80;
- vctxrx_sw = VCTXRX_SW_TX_HB;
- tx_bias = (fe_chan == 0) ? TX1_BIAS_HB_ON: TX2_BIAS_HB_ON;
- break;
- case tx_band::INVALID_BAND:
- RFNOC_LOG_ERROR(
- "Cannot map TX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case tx_band::LB_80:
+ tx_sw1 = TX_SW1_LB_80;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_160:
+ tx_sw1 = TX_SW1_LB_160;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_225:
+ tx_sw1 = TX_SW1_LB_225;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_400:
+ tx_sw1 = TX_SW1_LB_400;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_575:
+ tx_sw1 = TX_SW1_LB_575;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_1000:
+ tx_sw1 = TX_SW1_LB_1000;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_1700:
+ tx_sw1 = TX_SW1_LB_1700;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_2750:
+ tx_sw1 = TX_SW1_LB_2750;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB : VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::HB:
+ tx_sw1 = TX_SW1_LB_80;
+ vctxrx_sw = VCTXRX_SW_TX_HB;
+ tx_bias = (fe_chan == 0) ? TX1_BIAS_HB_ON : TX2_BIAS_HB_ON;
+ break;
+ case tx_band::INVALID_BAND:
+ RFNOC_LOG_ERROR("Cannot map TX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
RFNOC_LOG_TRACE("TX band = " << int(band) << "TX SW1 = " << tx_sw1
<< "TX VCTXRX_SW = " << vctxrx_sw
<< "TX_BIAS = " << tx_bias);
- auto tx_regs = 0 |
- vctxrx_sw << VCTXRX_SW_SHIFT |
- tx_bias << TX_BIAS_SHIFT |
- tx_sw1 << TX_SW1_SHIFT;
+ auto tx_regs = 0 | vctxrx_sw << VCTXRX_SW_SHIFT | tx_bias << TX_BIAS_SHIFT
+ | tx_sw1 << TX_SW1_SHIFT;
return tx_regs;
}
uint32_t e31x_radio_control_impl::get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
-){
+ const size_t chan, const double freq, const std::string& ant)
+{
RFNOC_LOG_TRACE("Update all E310 RX freq related switches. f=" << freq << " Hz, ");
- size_t fe_chan = _fe_swap ? (chan ? 0 : 1): chan;
+ size_t fe_chan = _fe_swap ? (chan ? 0 : 1) : chan;
// Default to OFF
- auto rx_sw1 = RX_SW1_OFF;
- auto rx_swc = RX_SWC_OFF;
- auto rx_swb = RX_SWB_OFF;
+ auto rx_sw1 = RX_SW1_OFF;
+ auto rx_swc = RX_SWC_OFF;
+ auto rx_swb = RX_SWB_OFF;
auto vctxrx_sw = VCTXRX_SW_OFF;
- auto vcrx_sw = (ant == "TX/RX") ? VCRX_TXRX_SW_LB: VCRX_RX_SW_LB;
+ auto vcrx_sw = (ant == "TX/RX") ? VCRX_TXRX_SW_LB : VCRX_RX_SW_LB;
if (ant == "TX/RX") {
- vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_RX: VCTXRX2_SW_RX;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_RX : VCTXRX2_SW_RX;
}
const auto band = e3xx_radio_control_impl::map_freq_to_rx_band(freq);
- switch(band) {
- case rx_band::LB_B2:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B2: RX2_SW1_LB_B2;
- rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B2: RX2_SWC_LB_B2;
- rx_swb = RX_SWB_OFF;
- break;
- case rx_band::LB_B3:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B3: RX2_SW1_LB_B3;
- rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B3: RX2_SWC_LB_B3;
- rx_swb = RX_SWB_OFF;
- break;
- case rx_band::LB_B4:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B4: RX2_SW1_LB_B4;
- rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B4: RX2_SWC_LB_B4;
- rx_swb = RX_SWB_OFF;
- break;
- case rx_band::LB_B5:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B5: RX2_SW1_LB_B5;
- rx_swc = RX_SWC_OFF;
- rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B5: RX2_SWB_LB_B5;
- break;
- case rx_band::LB_B6:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B6: RX2_SW1_LB_B6;
- rx_swc = RX_SWC_OFF;
- rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B6: RX2_SWB_LB_B6;
- break;
- case rx_band::LB_B7:
- rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B7: RX2_SW1_LB_B7;
- rx_swc = RX_SWC_OFF;
- rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B7: RX2_SWB_LB_B7;
- break;
- case rx_band::HB:
- rx_sw1 = RX_SW1_OFF;
- rx_swc = RX_SWC_OFF;
- rx_swb = RX_SWB_OFF;
- vcrx_sw = (ant == "TX/RX") ? VCRX_TXRX_SW_HB: VCRX_RX_SW_HB;
- break;
- case rx_band::INVALID_BAND:
- RFNOC_LOG_ERROR("Cannot map RX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case rx_band::LB_B2:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B2 : RX2_SW1_LB_B2;
+ rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B2 : RX2_SWC_LB_B2;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B3:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B3 : RX2_SW1_LB_B3;
+ rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B3 : RX2_SWC_LB_B3;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B4:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B4 : RX2_SW1_LB_B4;
+ rx_swc = (fe_chan == 0) ? RX1_SWC_LB_B4 : RX2_SWC_LB_B4;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B5:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B5 : RX2_SW1_LB_B5;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B5 : RX2_SWB_LB_B5;
+ break;
+ case rx_band::LB_B6:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B6 : RX2_SW1_LB_B6;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B6 : RX2_SWB_LB_B6;
+ break;
+ case rx_band::LB_B7:
+ rx_sw1 = (fe_chan == 0) ? RX1_SW1_LB_B7 : RX2_SW1_LB_B7;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = (fe_chan == 0) ? RX1_SWB_LB_B7 : RX2_SWB_LB_B7;
+ break;
+ case rx_band::HB:
+ rx_sw1 = RX_SW1_OFF;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = RX_SWB_OFF;
+ vcrx_sw = (ant == "TX/RX") ? VCRX_TXRX_SW_HB : VCRX_RX_SW_HB;
+ break;
+ case rx_band::INVALID_BAND:
+ RFNOC_LOG_ERROR("Cannot map RX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
RFNOC_LOG_TRACE("RX SW1=" << rx_sw1 << " RX SWC=" << rx_swc << " RX SWB=" << rx_swb
<< " RX VCRX_SW=" << vcrx_sw
<< " RX VCTXRX_SW=" << vctxrx_sw);
- auto rx_regs = 0 |
- vcrx_sw << VCRX_SW_SHIFT |
- vctxrx_sw << VCTXRX_SW_SHIFT |
- rx_swc << RX_SWC_SHIFT |
- rx_swb << RX_SWB_SHIFT |
- rx_sw1 << RX_SW1_SHIFT;
+ auto rx_regs = 0 | vcrx_sw << VCRX_SW_SHIFT | vctxrx_sw << VCTXRX_SW_SHIFT
+ | rx_swc << RX_SWC_SHIFT | rx_swb << RX_SWB_SHIFT
+ | rx_sw1 << RX_SW1_SHIFT;
return rx_regs;
}
uint32_t e31x_radio_control_impl::get_idle_switches()
{
- uint32_t idle_regs = VCRX_SW_OFF << VCRX_SW_SHIFT |
- VCTXRX_SW_OFF << VCTXRX_SW_SHIFT |
- TX_BIAS_OFF << TX_BIAS_SHIFT |
- RX_SWC_OFF << RX_SWC_SHIFT |
- RX_SWB_OFF << RX_SWB_SHIFT |
- RX_SW1_OFF << RX_SW1_SHIFT |
- TX_SW1_LB_2750 << TX_SW1_SHIFT;
+ uint32_t idle_regs = VCRX_SW_OFF << VCRX_SW_SHIFT | VCTXRX_SW_OFF << VCTXRX_SW_SHIFT
+ | TX_BIAS_OFF << TX_BIAS_SHIFT | RX_SWC_OFF << RX_SWC_SHIFT
+ | RX_SWB_OFF << RX_SWB_SHIFT | RX_SW1_OFF << RX_SW1_SHIFT
+ | TX_SW1_LB_2750 << TX_SW1_SHIFT;
return idle_regs;
}
diff --git a/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.hpp b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.hpp
index 1c37f4077..04fa800e2 100644
--- a/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.hpp
+++ b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.hpp
@@ -6,10 +6,10 @@
//
#ifndef INCLUDED_LIBUHD_RFNOC_E31X_RADIO_CTRL_IMPL_HPP
-#define INCLUDED_LIBUHD_RFNOC_E31X_RADIO_CTRL_IMPL_HPP
+# define INCLUDED_LIBUHD_RFNOC_E31X_RADIO_CTRL_IMPL_HPP
-#include "e3xx_constants.hpp"
-#include "e3xx_radio_control_impl.hpp"
+# include "e3xx_constants.hpp"
+# include "e3xx_radio_control_impl.hpp"
namespace {
static constexpr char E31x_GPIO_BANK[] = "INT0";
@@ -41,11 +41,11 @@ private:
* ATR/ Switches Types
*************************************************************************/
enum tx_sw1_t {
- TX_SW1_LB_80 = 7,
- TX_SW1_LB_160 = 6,
- TX_SW1_LB_225 = 5,
- TX_SW1_LB_400 = 4,
- TX_SW1_LB_575 = 3,
+ TX_SW1_LB_80 = 7,
+ TX_SW1_LB_160 = 6,
+ TX_SW1_LB_225 = 5,
+ TX_SW1_LB_400 = 4,
+ TX_SW1_LB_575 = 3,
TX_SW1_LB_1000 = 2,
TX_SW1_LB_1700 = 1,
TX_SW1_LB_2750 = 0,
@@ -53,12 +53,12 @@ private:
};
enum vctxrx_sw_t {
- VCTXRX_SW_TX_HB = 3,
+ VCTXRX_SW_TX_HB = 3,
VCTXRX1_SW_TX_LB = 1,
- VCTXRX1_SW_RX = 2,
+ VCTXRX1_SW_RX = 2,
VCTXRX2_SW_TX_LB = 2,
- VCTXRX2_SW_RX = 1,
- VCTXRX_SW_OFF = 0,
+ VCTXRX2_SW_RX = 1,
+ VCTXRX_SW_OFF = 0,
};
enum rx_sw1_t {
@@ -74,7 +74,7 @@ private:
RX1_SW1_LB_B5 = 1,
RX1_SW1_LB_B6 = 3,
RX1_SW1_LB_B7 = 5,
- RX_SW1_OFF = 7
+ RX_SW1_OFF = 7
};
enum rx_swc_t {
@@ -84,7 +84,7 @@ private:
RX1_SWC_LB_B2 = 2,
RX1_SWC_LB_B3 = 3,
RX1_SWC_LB_B4 = 1,
- RX_SWC_OFF = 0
+ RX_SWC_OFF = 0
};
enum rx_swb_t {
@@ -94,15 +94,15 @@ private:
RX1_SWB_LB_B5 = 2,
RX1_SWB_LB_B6 = 3,
RX1_SWB_LB_B7 = 1,
- RX_SWB_OFF = 0
+ RX_SWB_OFF = 0
};
enum vcrx_sw_t {
- VCRX_RX_SW_LB = 1,
- VCRX_RX_SW_HB = 2,
+ VCRX_RX_SW_LB = 1,
+ VCRX_RX_SW_HB = 2,
VCRX_TXRX_SW_LB = 2,
VCRX_TXRX_SW_HB = 1,
- VCRX_SW_OFF = 0 //or 3
+ VCRX_SW_OFF = 0 // or 3
};
// (TX_ENABLEB, TX_ENABLEA)
@@ -111,7 +111,7 @@ private:
TX1_BIAS_LB_ON = 2,
TX2_BIAS_HB_ON = 1,
TX2_BIAS_LB_ON = 2,
- TX_BIAS_OFF = 0
+ TX_BIAS_OFF = 0
};
/************************************************************************
@@ -123,15 +123,9 @@ private:
};
uint32_t get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
- );
-
- uint32_t get_tx_switches(
- const size_t chan,
- const double freq
- );
+ const size_t chan, const double freq, const std::string& ant);
+
+ uint32_t get_tx_switches(const size_t chan, const double freq);
uint32_t get_idle_switches();
diff --git a/host/lib/usrp/dboard/e3xx/e31x_regs.hpp b/host/lib/usrp/dboard/e3xx/e31x_regs.hpp
index 15ce90743..11d92b953 100644
--- a/host/lib/usrp/dboard/e3xx/e31x_regs.hpp
+++ b/host/lib/usrp/dboard/e3xx/e31x_regs.hpp
@@ -10,17 +10,16 @@
#include <uhd/config.hpp>
#include <cstdint>
-static const uint32_t VCRX_SW_SHIFT = 14;
-static const uint32_t VCTXRX_SW_SHIFT = 12;
-static const uint32_t TX_BIAS_SHIFT = 10;
-static const uint32_t RX_SWC_SHIFT = 8;
-static const uint32_t RX_SWB_SHIFT = 6;
-static const uint32_t RX_SW1_SHIFT = 3;
-static const uint32_t TX_SW1_SHIFT = 0;
+static const uint32_t VCRX_SW_SHIFT = 14;
+static const uint32_t VCTXRX_SW_SHIFT = 12;
+static const uint32_t TX_BIAS_SHIFT = 10;
+static const uint32_t RX_SWC_SHIFT = 8;
+static const uint32_t RX_SWB_SHIFT = 6;
+static const uint32_t RX_SW1_SHIFT = 3;
+static const uint32_t TX_SW1_SHIFT = 0;
-static const uint32_t LED_RX_RX_SHIFT = 2;
-static const uint32_t LED_TXRX_TX_SHIFT = 1;
-static const uint32_t LED_TXRX_RX_SHIFT = 0;
+static const uint32_t LED_RX_RX_SHIFT = 2;
+static const uint32_t LED_TXRX_TX_SHIFT = 1;
+static const uint32_t LED_TXRX_RX_SHIFT = 0;
#endif /* INCLUDED_E31X_REGS_HPP */
-
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.cpp b/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.cpp
index d9cadc86f..acd0be211 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.cpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.cpp
@@ -147,10 +147,12 @@ ad9361_ctrl::sptr make_rpc(rpc_client::sptr rpcc)
/*! Helper function to convert direction and channel to the 'which' required by most
Catalina driver functions */
-std::string get_which_ad9361_chain(const direction_t dir, const size_t chan, const bool fe_swap)
+std::string get_which_ad9361_chain(
+ const direction_t dir, const size_t chan, const bool fe_swap)
{
UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
UHD_ASSERT_THROW(chan == 0 or chan == 1);
size_t ad9361_chan = fe_swap ? (chan ? 0 : 1) : chan;
- return str(boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (ad9361_chan + 1));
+ return str(
+ boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (ad9361_chan + 1));
}
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.hpp b/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.hpp
index 129015420..fe694b05c 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.hpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_ad9361_iface.hpp
@@ -5,7 +5,7 @@
//
#ifndef INCLUDED_LIBUHD_RFNOC_E3XX_AD9361_IFACE_HPP
-#define INCLUDED_LIBUHD_RFNOC_E3XX_AD9361_IFACE_HPP
+# define INCLUDED_LIBUHD_RFNOC_E3XX_AD9361_IFACE_HPP
# include <uhd/types/direction.hpp>
# include <uhd/types/filters.hpp>
@@ -22,7 +22,8 @@ using namespace uhd::usrp;
static constexpr size_t E3XX_TUNE_TIMEOUT = 60000;
static constexpr size_t E3XX_RATE_TIMEOUT = 60000;
ad9361_ctrl::sptr make_rpc(rpc_client::sptr rpcc);
-std::string get_which_ad9361_chain(const direction_t dir, const size_t chan, const bool fe_swap=false);
+std::string get_which_ad9361_chain(
+ const direction_t dir, const size_t chan, const bool fe_swap = false);
#endif /* INCLUDED_LIBUHD_RFNOC_E3XX_AD9361_IFACE_HPP */
// vim: sw=4 et:
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_bands.cpp b/host/lib/usrp/dboard/e3xx/e3xx_bands.cpp
index d3dc99fec..e28acf3b9 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_bands.cpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_bands.cpp
@@ -49,17 +49,27 @@
* E31x frequency bands:
*
* For RX: (chan here is fe_chan - swapped)
- * Band Freq RX_BSEL-210 RXC_BSEL-10 RXB_BSEL-10 RX2 TX/RX
- * VCRX_V1_V2 VCTXRX_V1_V2
- * chan1 | chan2 chan1 | chan2 chan1 | chan2 RX ant | TXRX ant chan2 | chan1
- * ----------------------------------------------------------------------------------------------------
- * LB_B2: < 450 RF5 100 RF6 101 J2 10 J1 01 -- 00 -- 00 01 10 J2 10 J1 01
- * LB_B3: 450-700 RF3 010 RF4 011 J3 11 J3 11 -- 00 -- 00 01 10 J2 10 J1 01
- * LB_B4: 700-1200 RF1 000 RF2 001 J1 01 J2 10 -- 00 -- 00 01 10 J2 10 J1 01
- * LB_B5: 1200-1800 RF2 001 RF1 000 -- 00 -- 00 J2 10 J1 01 01 10 J2 10 J1 01
- * LB_B6: 1800-2350 RF4 011 RF3 010 -- 00 -- 00 J3 11 J3 11 01 10 J2 10 J1 01
- * LB_B7: 2350-2600 RF6 101 RF5 100 -- 00 -- 00 J1 01 J2 10 01 10 J2 10 J1 01
- * HB: 2600+ --- 111 --- 111 -- 00 -- 00 -- 00 -- 00 10 01 J2 10 J1 01
+ * Band Freq RX_BSEL-210 RXC_BSEL-10 RXB_BSEL-10 RX2 TX/RX
+ * VCRX_V1_V2
+ VCTXRX_V1_V2
+ * chan1 | chan2 chan1 | chan2 chan1 | chan2 RX ant | TXRX ant
+ chan2 | chan1
+ *
+ ----------------------------------------------------------------------------------------------------
+ * LB_B2: < 450 RF5 100 RF6 101 J2 10 J1 01 -- 00 -- 00 01 10 J2 10
+ J1 01
+ * LB_B3: 450-700 RF3 010 RF4 011 J3 11 J3 11 -- 00 -- 00 01 10 J2 10
+ J1 01
+ * LB_B4: 700-1200 RF1 000 RF2 001 J1 01 J2 10 -- 00 -- 00 01 10 J2 10
+ J1 01
+ * LB_B5: 1200-1800 RF2 001 RF1 000 -- 00 -- 00 J2 10 J1 01 01 10 J2 10
+ J1 01
+ * LB_B6: 1800-2350 RF4 011 RF3 010 -- 00 -- 00 J3 11 J3 11 01 10 J2 10
+ J1 01
+ * LB_B7: 2350-2600 RF6 101 RF5 100 -- 00 -- 00 J1 01 J2 10 01 10 J2 10
+ J1 01
+ * HB: 2600+ --- 111 --- 111 -- 00 -- 00 -- 00 -- 00 10 01 J2 10
+ J1 01
*
*
* For TX:
@@ -131,7 +141,8 @@ constexpr double E3XX_TX_LB_2750_MIN_FREQ = 1842.6e6;
constexpr double E3XX_TX_HB_MIN_FREQ = 2940.0e6;
} // namespace
-e3xx_radio_control_impl::rx_band e3xx_radio_control_impl::map_freq_to_rx_band(const double freq)
+e3xx_radio_control_impl::rx_band e3xx_radio_control_impl::map_freq_to_rx_band(
+ const double freq)
{
e3xx_radio_control_impl::rx_band band;
@@ -158,7 +169,8 @@ e3xx_radio_control_impl::rx_band e3xx_radio_control_impl::map_freq_to_rx_band(co
return band;
}
-e3xx_radio_control_impl::tx_band e3xx_radio_control_impl::map_freq_to_tx_band(const double freq)
+e3xx_radio_control_impl::tx_band e3xx_radio_control_impl::map_freq_to_tx_band(
+ const double freq)
{
e3xx_radio_control_impl::tx_band band;
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.cpp b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.cpp
index bc9ed9169..49a9a9bda 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.cpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.cpp
@@ -75,7 +75,7 @@ void e3xx_radio_control_impl::deinit()
* API Calls
*****************************************************************************/
bool e3xx_radio_control_impl::check_topology(const std::vector<size_t>& connected_inputs,
- const std::vector<size_t>& connected_outputs)
+ const std::vector<size_t>& connected_outputs)
{
if (!node_t::check_topology(connected_inputs, connected_outputs)) {
return false;
@@ -112,7 +112,7 @@ bool e3xx_radio_control_impl::check_topology(const std::vector<size_t>& connecte
RFNOC_LOG_TRACE("RX FE0 Active: " << rx_fe0_active);
RFNOC_LOG_TRACE("RX FE1 Active: " << rx_fe1_active);
- //setup the active chains in the codec
+ // setup the active chains in the codec
if (connected_inputs.size() + connected_outputs.size() == 0) {
// Ensure at least one RX chain is enabled so AD9361 outputs a sample clock
this->set_streaming_mode(true, false, true, false);
@@ -252,19 +252,21 @@ void e3xx_radio_control_impl::set_rx_agc(const bool enb, const size_t chan)
_ad9361->set_agc(rx_fe, enb);
}
-double e3xx_radio_control_impl::set_rx_bandwidth(const double bandwidth, const size_t chan)
+double e3xx_radio_control_impl::set_rx_bandwidth(
+ const double bandwidth, const size_t chan)
{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw =
- _ad9361->set_bw_filter(get_which_ad9361_chain(RX_DIRECTION, chan, _fe_swap), bandwidth);
+ double clipped_bw = _ad9361->set_bw_filter(
+ get_which_ad9361_chain(RX_DIRECTION, chan, _fe_swap), bandwidth);
return radio_control_impl::set_rx_bandwidth(clipped_bw, chan);
}
-double e3xx_radio_control_impl::set_tx_bandwidth(const double bandwidth, const size_t chan)
+double e3xx_radio_control_impl::set_tx_bandwidth(
+ const double bandwidth, const size_t chan)
{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw =
- _ad9361->set_bw_filter(get_which_ad9361_chain(TX_DIRECTION, chan, _fe_swap), bandwidth);
+ double clipped_bw = _ad9361->set_bw_filter(
+ get_which_ad9361_chain(TX_DIRECTION, chan, _fe_swap), bandwidth);
return radio_control_impl::set_tx_bandwidth(clipped_bw, chan);
}
@@ -429,7 +431,7 @@ void e3xx_radio_control_impl::loopback_self_test(const size_t chan)
// Set 2R2T mode, stream on all channels
this->set_streaming_mode(true, true, true, true);
// This was in there in the E320 code, but the comments didn't make sense:
- //this->set_streaming_mode(true, true, true, true);
+ // this->set_streaming_mode(true, true, true, true);
// Set maximum rate for 2R2T mode
/* FIXME
* We're directly setting the master clock rate here because we want to
@@ -457,29 +459,34 @@ void e3xx_radio_control_impl::loopback_self_test(const size_t chan)
boost::hash_combine(hash, i);
const uint32_t word32 = uint32_t(hash) & 0xfff0fff0;
// Write test word to codec_idle idle register (on TX side)
- regs().poke32(
- regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET + regmap::REG_TX_IDLE_VALUE, word32);
+ regs().poke32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET
+ + regmap::REG_TX_IDLE_VALUE,
+ word32);
// Read back values - TX is lower 32-bits and RX is upper 32-bits
const uint32_t rb_tx =
- regs().peek32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET + regmap::REG_TX_IDLE_VALUE);
+ regs().peek32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET
+ + regmap::REG_TX_IDLE_VALUE);
const uint32_t rb_rx =
- regs().peek32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET + regmap::REG_RX_DATA);
+ regs().peek32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET
+ + regmap::REG_RX_DATA);
// Compare TX and RX values to test word
bool test_fail = word32 != rb_tx or word32 != rb_rx;
if (test_fail) {
RFNOC_LOG_WARNING(
"CODEC loopback test failed! "
- << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
- % word32 % rb_tx % rb_rx);
+ << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
+ % word32 % rb_tx % rb_rx);
throw uhd::runtime_error("CODEC loopback test failed.");
}
}
RFNOC_LOG_INFO("CODEC loopback test passed");
// Zero out the idle data.
- regs().poke32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET + regmap::REG_TX_IDLE_VALUE, 0);
+ regs().poke32(regmap::RADIO_BASE_ADDR + chan * regmap::REG_CHAN_OFFSET
+ + regmap::REG_TX_IDLE_VALUE,
+ 0);
// Take AD936x out of loopback mode
_ad9361->data_port_loopback(false);
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.hpp b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.hpp
index f49cde64a..d5714634c 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.hpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_impl.hpp
@@ -9,11 +9,11 @@
#define INCLUDED_LIBUHD_RFNOC_E3XX_RADIO_CTRL_IMPL_HPP
#include "e3xx_ad9361_iface.hpp"
+#include <uhd/rfnoc/filter_node.hpp>
#include <uhd/types/eeprom.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <uhd/rfnoc/filter_node.hpp>
#include <uhdlib/rfnoc/radio_control_impl.hpp>
#include <uhdlib/usrp/common/mpmd_mb_controller.hpp>
#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
@@ -22,22 +22,23 @@
namespace uhd { namespace rfnoc {
namespace e3xx_regs {
- constexpr uint32_t PERIPH_BASE = 0x80000;
- constexpr uint32_t PERIPH_REG_OFFSET = 8;
- constexpr uint32_t PERIPH_REG_CHAN_OFFSET = 0x800;
- constexpr uint32_t SR_LEDS = PERIPH_BASE + 176 * PERIPH_REG_OFFSET;
- constexpr uint32_t SR_FP_GPIO = PERIPH_BASE + 184 * PERIPH_REG_OFFSET;
- constexpr uint32_t SR_DB_GPIO = PERIPH_BASE + 192 * PERIPH_REG_OFFSET;
+constexpr uint32_t PERIPH_BASE = 0x80000;
+constexpr uint32_t PERIPH_REG_OFFSET = 8;
+constexpr uint32_t PERIPH_REG_CHAN_OFFSET = 0x800;
+constexpr uint32_t SR_LEDS = PERIPH_BASE + 176 * PERIPH_REG_OFFSET;
+constexpr uint32_t SR_FP_GPIO = PERIPH_BASE + 184 * PERIPH_REG_OFFSET;
+constexpr uint32_t SR_DB_GPIO = PERIPH_BASE + 192 * PERIPH_REG_OFFSET;
- constexpr uint32_t RB_DB_GPIO = PERIPH_BASE + 19 * PERIPH_REG_OFFSET;
- constexpr uint32_t RB_FP_GPIO = PERIPH_BASE + 20 * PERIPH_REG_OFFSET;
+constexpr uint32_t RB_DB_GPIO = PERIPH_BASE + 19 * PERIPH_REG_OFFSET;
+constexpr uint32_t RB_FP_GPIO = PERIPH_BASE + 20 * PERIPH_REG_OFFSET;
-}
+} // namespace e3xx_regs
/*! \brief Provide access to an E3xx radio.
*/
-class e3xx_radio_control_impl : public radio_control_impl, public uhd::rfnoc::detail::filter_node
+class e3xx_radio_control_impl : public radio_control_impl,
+ public uhd::rfnoc::detail::filter_node
{
public:
//! Frequency bands for RX. Bands are a function of the analog filter banks
@@ -78,7 +79,7 @@ public:
void deinit();
bool check_topology(const std::vector<size_t>& connected_inputs,
- const std::vector<size_t>& connected_outputs);
+ const std::vector<size_t>& connected_outputs);
/************************************************************************
* radio_control API calls
@@ -87,8 +88,8 @@ public:
uhd::meta_range_t get_rate_range() const;
// Setters
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
double set_tx_gain(const double gain, const size_t chan);
@@ -144,7 +145,10 @@ public:
/**************************************************************************
* Radio Identification API Calls
*************************************************************************/
- std::string get_slot_name() const { return "A"; }
+ std::string get_slot_name() const
+ {
+ return "A";
+ }
virtual size_t get_chan_from_dboard_fe(
const std::string& fe, const uhd::direction_t direction) const;
virtual std::string get_dboard_fe_from_chan(
diff --git a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_init.cpp b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_init.cpp
index 6ecf4ff2a..f44bdaeb7 100644
--- a/host/lib/usrp/dboard/e3xx/e3xx_radio_control_init.cpp
+++ b/host/lib/usrp/dboard/e3xx/e3xx_radio_control_init.cpp
@@ -103,8 +103,10 @@ void e3xx_radio_control_impl::_init_peripherals()
usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
RFNOC_LOG_TRACE("Initializing front-panel GPIO control...")
- _fp_gpio = usrp::gpio_atr::gpio_atr_3000::make(
- _wb_ifaces.at(0), e3xx_regs::SR_FP_GPIO, e3xx_regs::RB_FP_GPIO, e3xx_regs::PERIPH_REG_OFFSET);
+ _fp_gpio = usrp::gpio_atr::gpio_atr_3000::make(_wb_ifaces.at(0),
+ e3xx_regs::SR_FP_GPIO,
+ e3xx_regs::RB_FP_GPIO,
+ e3xx_regs::PERIPH_REG_OFFSET);
auto block_args = get_block_args();
@@ -123,9 +125,9 @@ void e3xx_radio_control_impl::_init_frontend_subtree(
{
const fs_path tx_fe_path = fs_path("tx_frontends") / chan_idx;
const fs_path rx_fe_path = fs_path("rx_frontends") / chan_idx;
- RFNOC_LOG_TRACE(
- "Adding non-RFNoC block properties for channel "
- << chan_idx << " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
+ RFNOC_LOG_TRACE("Adding non-RFNoC block properties for channel "
+ << chan_idx << " to prop tree path " << tx_fe_path << " and "
+ << rx_fe_path);
// TX Standard attributes
subtree->create<std::string>(tx_fe_path / "name").set("E3xx");
subtree->create<std::string>(tx_fe_path / "connection").set("IQ");
@@ -242,7 +244,8 @@ void e3xx_radio_control_impl::_init_frontend_subtree(
auto rx_sensor_names = get_rx_sensor_names(chan_idx);
for (const auto& rx_sensor_name : rx_sensor_names) {
RFNOC_LOG_TRACE("Adding RX sensor " << rx_sensor_name);
- get_tree()->create<sensor_value_t>(rx_fe_path / "sensors" / rx_sensor_name)
+ get_tree()
+ ->create<sensor_value_t>(rx_fe_path / "sensors" / rx_sensor_name)
.add_coerced_subscriber([](const sensor_value_t&) {
throw uhd::runtime_error("Attempting to write to sensor!");
})
@@ -253,7 +256,8 @@ void e3xx_radio_control_impl::_init_frontend_subtree(
auto tx_sensor_names = get_tx_sensor_names(chan_idx);
for (const auto& tx_sensor_name : tx_sensor_names) {
RFNOC_LOG_TRACE("Adding TX sensor " << tx_sensor_name);
- get_tree()->create<sensor_value_t>(tx_fe_path / "sensors" / tx_sensor_name)
+ get_tree()
+ ->create<sensor_value_t>(tx_fe_path / "sensors" / tx_sensor_name)
.add_coerced_subscriber([](const sensor_value_t&) {
throw uhd::runtime_error("Attempting to write to sensor!");
})
@@ -301,4 +305,3 @@ void e3xx_radio_control_impl::_init_codec()
this->set_tx_bandwidth(E3XX_DEFAULT_BANDWIDTH, chan);
}
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
index f71b1aa4e..adb93ced7 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
@@ -42,7 +42,7 @@ double magnesium_ad9371_iface::set_frequency(
const double freq, const size_t chan, const direction_t dir)
{
// Note: This sets the frequency for both channels (1 and 2).
- auto which = _get_which(dir, chan);
+ auto which = _get_which(dir, chan);
auto actual_freq =
request<double>(MAGNESIUM_TUNE_TIMEOUT, "set_freq", which, freq, false);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_freq returned " << actual_freq);
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
index 2374a4503..2cb691025 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
@@ -55,10 +55,7 @@ private:
{
UHD_LOG_TRACE(_log_prefix, "[RPC] Calling " << func_name);
return _rpcc->request_with_token<return_type>(
- timeout_ms,
- _rpc_prefix + func_name,
- std::forward<Args>(args)...
- );
+ timeout_ms, _rpc_prefix + func_name, std::forward<Args>(args)...);
};
//! Reference to the RPC client
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
index 3d670e4a3..dedb9e924 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
@@ -110,6 +110,6 @@ static constexpr uint32_t RB_MISC_IO = PERIPH_BASE + 16 * PERIPH_REG_OFFSET;
static constexpr uint32_t RB_SPI = PERIPH_BASE + 17 * PERIPH_REG_OFFSET;
static constexpr uint32_t RB_DB_GPIO = PERIPH_BASE + 19 * PERIPH_REG_OFFSET;
static constexpr uint32_t RB_FP_GPIO = PERIPH_BASE + 20 * PERIPH_REG_OFFSET;
-}
+} // namespace n310_regs
#endif /* INCLUDED_LIBUHD_MAGNESIUM_CONSTANTS_HPP */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
index 8f4ee0caa..27341673c 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
@@ -11,9 +11,9 @@
#include "adf4351_regs.hpp"
#include "magnesium_cpld_regs.hpp"
#include <uhd/types/serial.hpp>
+#include <functional>
#include <memory>
#include <mutex>
-#include <functional>
//! Controls the CPLD on a Magnesium daughterboard
//
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
index 6ba91a248..feff1d6f9 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
@@ -30,13 +30,13 @@ struct gain_tuple_t
/*! Given a gain index, return a tuple of gain-related settings (Rx)
*/
-gain_tuple_t get_rx_gain_tuple(
- const double gain_index, const uhd::rfnoc::magnesium_radio_control_impl::rx_band band_);
+gain_tuple_t get_rx_gain_tuple(const double gain_index,
+ const uhd::rfnoc::magnesium_radio_control_impl::rx_band band_);
/*! Given a gain index, return a tuple of gain-related settings (Tx)
*/
-gain_tuple_t get_tx_gain_tuple(
- const double gain_index, const uhd::rfnoc::magnesium_radio_control_impl::tx_band band_);
+gain_tuple_t get_tx_gain_tuple(const double gain_index,
+ const uhd::rfnoc::magnesium_radio_control_impl::tx_band band_);
} /* namespace magnesium */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
index 28a7b0c41..e4d446f95 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
@@ -15,12 +15,11 @@
#include <uhd/utils/algorithm.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/math.hpp>
-#include <uhd/rfnoc/registry.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
-#include <memory>
#include <cmath>
#include <cstdlib>
+#include <memory>
#include <sstream>
using namespace uhd;
@@ -206,7 +205,8 @@ double magnesium_radio_control_impl::set_rate(double requested_rate)
return _master_clock_rate;
}
-void magnesium_radio_control_impl::set_tx_antenna(const std::string& ant, const size_t chan)
+void magnesium_radio_control_impl::set_tx_antenna(
+ const std::string& ant, const size_t chan)
{
if (ant != get_tx_antenna(chan)) {
throw uhd::value_error(
@@ -216,7 +216,8 @@ void magnesium_radio_control_impl::set_tx_antenna(const std::string& ant, const
// We can't actually set the TX antenna, so let's stop here.
}
-void magnesium_radio_control_impl::set_rx_antenna(const std::string& ant, const size_t chan)
+void magnesium_radio_control_impl::set_rx_antenna(
+ const std::string& ant, const size_t chan)
{
UHD_ASSERT_THROW(chan <= MAGNESIUM_NUM_CHANS);
if (std::find(MAGNESIUM_RX_ANTENNAS.begin(), MAGNESIUM_RX_ANTENNAS.end(), ant)
@@ -233,7 +234,8 @@ void magnesium_radio_control_impl::set_rx_antenna(const std::string& ant, const
radio_control_impl::set_rx_antenna(ant, chan);
}
-double magnesium_radio_control_impl::set_tx_frequency(const double req_freq, const size_t chan)
+double magnesium_radio_control_impl::set_tx_frequency(
+ const double req_freq, const size_t chan)
{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
RFNOC_LOG_TRACE("set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
@@ -269,7 +271,8 @@ double magnesium_radio_control_impl::set_tx_frequency(const double req_freq, con
return radio_control_impl::get_tx_frequency(chan);
}
-void magnesium_radio_control_impl::_update_gain(const size_t chan, const uhd::direction_t dir)
+void magnesium_radio_control_impl::_update_gain(
+ const size_t chan, const uhd::direction_t dir)
{
const std::string fe = (dir == TX_DIRECTION) ? "tx_frontends" : "rx_frontends";
const double freq = (dir == TX_DIRECTION) ? this->get_tx_frequency(chan)
@@ -277,7 +280,8 @@ void magnesium_radio_control_impl::_update_gain(const size_t chan, const uhd::di
this->_set_all_gain(this->_get_all_gain(chan, dir), freq, chan, dir);
}
-void magnesium_radio_control_impl::_update_freq(const size_t chan, const uhd::direction_t dir)
+void magnesium_radio_control_impl::_update_freq(
+ const size_t chan, const uhd::direction_t dir)
{
const std::string ad9371_source = dir == TX_DIRECTION
? this->get_tx_lo_source(MAGNESIUM_LO1, chan)
@@ -301,7 +305,8 @@ void magnesium_radio_control_impl::_update_freq(const size_t chan, const uhd::di
}
}
-double magnesium_radio_control_impl::set_rx_frequency(const double req_freq, const size_t chan)
+double magnesium_radio_control_impl::set_rx_frequency(
+ const double req_freq, const size_t chan)
{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
RFNOC_LOG_TRACE("set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
@@ -366,8 +371,7 @@ double magnesium_radio_control_impl::set_tx_bandwidth(
void magnesium_radio_control_impl::set_tx_gain_profile(
const std::string& profile, const size_t)
{
- if (std::find(
- MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ if (std::find(MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
== MAGNESIUM_GP_OPTIONS.end()) {
RFNOC_LOG_ERROR("Invalid TX gain profile: " << profile);
throw uhd::key_error("Invalid TX gain profile!");
@@ -378,8 +382,7 @@ void magnesium_radio_control_impl::set_tx_gain_profile(
void magnesium_radio_control_impl::set_rx_gain_profile(
const std::string& profile, const size_t)
{
- if (std::find(
- MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ if (std::find(MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
== MAGNESIUM_GP_OPTIONS.end()) {
RFNOC_LOG_ERROR("Invalid RX gain profile: " << profile);
throw uhd::key_error("Invalid RX gain profile!");
@@ -592,12 +595,14 @@ uhd::freq_range_t magnesium_radio_control_impl::get_rx_frequency_range(const siz
return meta_range_t(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ, 1.0);
}
-std::vector<std::string> magnesium_radio_control_impl::get_tx_gain_names(const size_t) const
+std::vector<std::string> magnesium_radio_control_impl::get_tx_gain_names(
+ const size_t) const
{
return {MAGNESIUM_GAIN1, MAGNESIUM_GAIN2, MAGNESIUM_AMP};
}
-std::vector<std::string> magnesium_radio_control_impl::get_rx_gain_names(const size_t) const
+std::vector<std::string> magnesium_radio_control_impl::get_rx_gain_names(
+ const size_t) const
{
return {MAGNESIUM_GAIN1, MAGNESIUM_GAIN2, MAGNESIUM_AMP};
}
@@ -710,7 +715,8 @@ std::vector<std::string> magnesium_radio_control_impl::get_tx_gain_profile_names
return MAGNESIUM_GP_OPTIONS;
}
-std::vector<std::string> magnesium_radio_control_impl::get_rx_gain_profile_names(const size_t ) const
+std::vector<std::string> magnesium_radio_control_impl::get_rx_gain_profile_names(
+ const size_t) const
{
return MAGNESIUM_GP_OPTIONS;
}
@@ -761,7 +767,7 @@ std::vector<std::string> magnesium_radio_control_impl::get_rx_lo_sources(
freq_range_t magnesium_radio_control_impl::get_rx_lo_freq_range(
const std::string& name, const size_t /*chan*/
-) const
+ ) const
{
if (name == MAGNESIUM_LO1) {
return freq_range_t{ADF4351_MIN_FREQ, ADF4351_MAX_FREQ};
@@ -790,7 +796,7 @@ void magnesium_radio_control_impl::set_rx_lo_source(
const std::string magnesium_radio_control_impl::get_rx_lo_source(
const std::string& name, const size_t /*chan*/
-) const
+ ) const
{
if (name == MAGNESIUM_LO1) {
// TODO: should we use this from cache?
@@ -860,14 +866,14 @@ double magnesium_radio_control_impl::get_rx_lo_freq(
// TX LO
std::vector<std::string> magnesium_radio_control_impl::get_tx_lo_names(
const size_t /*chan*/
-) const
+ ) const
{
return std::vector<std::string>{MAGNESIUM_LO1, MAGNESIUM_LO2};
}
std::vector<std::string> magnesium_radio_control_impl::get_tx_lo_sources(
const std::string& name, const size_t /*chan*/
-) const
+ ) const
{
if (name == MAGNESIUM_LO2) {
return std::vector<std::string>{"internal"};
@@ -960,7 +966,8 @@ double magnesium_radio_control_impl::set_tx_lo_freq(
return return_freq;
}
-double magnesium_radio_control_impl::get_tx_lo_freq(const std::string& name, const size_t chan)
+double magnesium_radio_control_impl::get_tx_lo_freq(
+ const std::string& name, const size_t chan)
{
RFNOC_LOG_TRACE("get_tx_lo_freq(name=" << name << ")");
std::string source = this->get_tx_lo_source(name, chan);
@@ -1106,7 +1113,8 @@ std::vector<std::string> magnesium_radio_control_impl::get_rx_sensor_names(size_
return sensor_names;
}
-sensor_value_t magnesium_radio_control_impl::get_rx_sensor(const std::string& name, size_t chan)
+sensor_value_t magnesium_radio_control_impl::get_rx_sensor(
+ const std::string& name, size_t chan)
{
if (name == "lo_locked") {
return sensor_value_t(
@@ -1124,7 +1132,8 @@ std::vector<std::string> magnesium_radio_control_impl::get_tx_sensor_names(size_
return sensor_names;
}
-sensor_value_t magnesium_radio_control_impl::get_tx_sensor(const std::string& name, size_t chan)
+sensor_value_t magnesium_radio_control_impl::get_tx_sensor(
+ const std::string& name, size_t chan)
{
if (name == "lo_locked") {
return sensor_value_t(
@@ -1137,7 +1146,8 @@ sensor_value_t magnesium_radio_control_impl::get_tx_sensor(const std::string& na
/**************************************************************************
* node_t API Calls
*************************************************************************/
-void magnesium_radio_control_impl::set_command_time(uhd::time_spec_t time, const size_t chan)
+void magnesium_radio_control_impl::set_command_time(
+ uhd::time_spec_t time, const size_t chan)
{
node_t::set_command_time(time, chan);
_wb_ifaces.at(chan)->set_time(time);
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.hpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.hpp
index c6d8e0338..3c965866e 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.hpp
@@ -14,15 +14,15 @@
#include "magnesium_ad9371_iface.hpp"
#include "magnesium_cpld_ctrl.hpp"
#include "magnesium_cpld_regs.hpp"
-#include <iostream>
+#include <uhd/types/eeprom.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <uhd/types/eeprom.hpp>
#include <uhdlib/rfnoc/radio_control_impl.hpp>
#include <uhdlib/usrp/common/adf435x.hpp>
#include <uhdlib/usrp/common/mpmd_mb_controller.hpp>
#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
+#include <iostream>
#include <mutex>
namespace uhd { namespace rfnoc {
@@ -77,8 +77,8 @@ public:
double set_rate(double rate);
// Setters
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
double set_tx_gain(const double gain, const size_t chan);
@@ -157,13 +157,15 @@ public:
/**************************************************************************
* Radio Identification API Calls
*************************************************************************/
- std::string get_slot_name() const { return _radio_slot; }
+ std::string get_slot_name() const
+ {
+ return _radio_slot;
+ }
size_t get_chan_from_dboard_fe(
const std::string& fe, const uhd::direction_t direction) const;
std::string get_dboard_fe_from_chan(
const size_t chan, const uhd::direction_t direction) const;
- std::string get_fe_name(
- const size_t chan, const uhd::direction_t direction) const;
+ std::string get_fe_name(const size_t chan, const uhd::direction_t direction) const;
/**************************************************************************
* node_t API Calls
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_cpld.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_cpld.cpp
index 41f99cd68..a4decdaaa 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_cpld.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_cpld.cpp
@@ -120,12 +120,11 @@ void magnesium_radio_control_impl::_update_rx_freq_switches(const double freq,
const bool bypass_lnas,
const magnesium_cpld_ctrl::chan_sel_t chan_sel)
{
- RFNOC_LOG_TRACE(
- "Update all RX freq related switches. f=" << freq
- << " Hz, "
- "bypass LNAS: "
- << (bypass_lnas ? "Yes" : "No")
- << ", chan=" << chan_sel);
+ RFNOC_LOG_TRACE("Update all RX freq related switches. f="
+ << freq
+ << " Hz, "
+ "bypass LNAS: "
+ << (bypass_lnas ? "Yes" : "No") << ", chan=" << chan_sel);
auto rx_sw2 = magnesium_cpld_ctrl::RX_SW2_BYPASSPATHTOSWITCH6;
auto rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
auto rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_gain.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_gain.cpp
index f515b2e33..b06222205 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_gain.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_gain.cpp
@@ -7,8 +7,8 @@
#include "magnesium_constants.hpp"
#include "magnesium_gain_table.hpp"
#include "magnesium_radio_control.hpp"
-#include <uhd/utils/log.hpp>
#include <uhd/exception.hpp>
+#include <uhd/utils/log.hpp>
using namespace uhd;
using namespace uhd::usrp;
@@ -61,14 +61,13 @@ double magnesium_radio_control_impl::_set_all_gain(
const double ad9371_gain =
((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
- gain_tuple.ad9371_att;
- RFNOC_LOG_TRACE(
- "AD9371 attenuation==" << gain_tuple.ad9371_att
- << " dB, "
- "AD9371 gain=="
- << ad9371_gain
- << " dB, "
- "DSA attenuation == "
- << gain_tuple.dsa_att << " dB.");
+ RFNOC_LOG_TRACE("AD9371 attenuation==" << gain_tuple.ad9371_att
+ << " dB, "
+ "AD9371 gain=="
+ << ad9371_gain
+ << " dB, "
+ "DSA attenuation == "
+ << gain_tuple.dsa_att << " dB.");
_ad9371->set_gain(ad9371_gain, ad9371_chan, dir);
_dsa_set_att(gain_tuple.dsa_att, chan, dir);
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
@@ -101,9 +100,8 @@ double magnesium_radio_control_impl::_get_all_gain(
double magnesium_radio_control_impl::_dsa_set_att(
const double att, const size_t chan, const direction_t dir)
{
- RFNOC_LOG_TRACE(
- __func__ << "(att="
- << "att dB, chan=" << chan << ", dir=" << dir << ")")
+ RFNOC_LOG_TRACE(__func__ << "(att="
+ << "att dB, chan=" << chan << ", dir=" << dir << ")")
const uint32_t dsa_val = 2 * att;
_set_dsa_val(chan, dir, dsa_val);
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_init.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_init.cpp
index 6595cb113..d9bf5c3d2 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control_init.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control_init.cpp
@@ -9,8 +9,8 @@
#include <uhd/types/eeprom.hpp>
#include <uhd/types/sensors.hpp>
#include <uhd/utils/log.hpp>
-#include <uhdlib/usrp/cores/spi_core_3000.hpp>
#include <uhdlib/rfnoc/reg_iface_adapter.hpp>
+#include <uhdlib/usrp/cores/spi_core_3000.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string/split.hpp>
@@ -25,8 +25,8 @@ namespace {
enum slave_select_t { SEN_CPLD = 1, SEN_TX_LO = 2, SEN_RX_LO = 4, SEN_PHASE_DAC = 8 };
-constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
-constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
+constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
+constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
} // namespace
@@ -148,10 +148,12 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
<< chan_idx << " to prop tree path " << tx_fe_path << " and "
<< rx_fe_path);
// TX Standard attributes
- subtree->create<std::string>(tx_fe_path / "name").set(get_fe_name(chan_idx, TX_DIRECTION));
+ subtree->create<std::string>(tx_fe_path / "name")
+ .set(get_fe_name(chan_idx, TX_DIRECTION));
subtree->create<std::string>(tx_fe_path / "connection").set("IQ");
// RX Standard attributes
- subtree->create<std::string>(rx_fe_path / "name").set(get_fe_name(chan_idx, RX_DIRECTION));
+ subtree->create<std::string>(rx_fe_path / "name")
+ .set(get_fe_name(chan_idx, RX_DIRECTION));
subtree->create<std::string>(rx_fe_path / "connection").set("IQ");
// TX Antenna
subtree->create<std::string>(tx_fe_path / "antenna" / "value")
@@ -160,7 +162,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_tx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(tx_fe_path / "antenna" / "options")
- .set_publisher([this](){ return get_tx_antennas(0); })
+ .set_publisher([this]() { return get_tx_antennas(0); })
.add_coerced_subscriber([](const std::vector<std::string>&) {
throw uhd::runtime_error("Attempting to update antenna options!");
});
@@ -171,7 +173,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_rx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(rx_fe_path / "antenna" / "options")
- .set_publisher([this](){ return get_rx_antennas(0); })
+ .set_publisher([this]() { return get_rx_antennas(0); })
.add_coerced_subscriber([](const std::vector<std::string>&) {
throw uhd::runtime_error("Attempting to update antenna options!");
});
@@ -182,7 +184,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_tx_frequency(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "freq" / "range")
- .set_publisher([this, chan_idx](){ return get_tx_frequency_range(chan_idx); })
+ .set_publisher([this, chan_idx]() { return get_tx_frequency_range(chan_idx); })
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update freq range!");
});
@@ -193,7 +195,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_rx_frequency(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "freq" / "range")
- .set_publisher([this, chan_idx](){ return get_rx_frequency_range(chan_idx); })
+ .set_publisher([this, chan_idx]() { return get_rx_frequency_range(chan_idx); })
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update freq range!");
});
@@ -205,7 +207,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_tx_bandwidth(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "bandwidth" / "range")
- .set_publisher([this, chan_idx](){ return get_tx_bandwidth_range(chan_idx); })
+ .set_publisher([this, chan_idx]() { return get_tx_bandwidth_range(chan_idx); })
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update bandwidth range!");
});
@@ -217,7 +219,7 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
})
.set_publisher([this, chan_idx]() { return this->get_rx_bandwidth(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "bandwidth" / "range")
- .set_publisher([this, chan_idx](){ return get_rx_bandwidth_range(chan_idx); })
+ .set_publisher([this, chan_idx]() { return get_rx_bandwidth_range(chan_idx); })
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update bandwidth range!");
});
@@ -230,13 +232,16 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
.set_coercer([this, chan_idx, gain_name](const double gain) {
return this->set_tx_gain(gain, gain_name, chan_idx);
})
- .set_publisher(
- [this, chan_idx, gain_name]() { return get_tx_gain(gain_name, chan_idx); });
+ .set_publisher([this, chan_idx, gain_name]() {
+ return get_tx_gain(gain_name, chan_idx);
+ });
subtree->create<meta_range_t>(tx_fe_path / "gains" / gain_name / "range")
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this, gain_name, chan_idx]() { return get_tx_gain_range(gain_name, chan_idx); });
+ .set_publisher([this, gain_name, chan_idx]() {
+ return get_tx_gain_range(gain_name, chan_idx);
+ });
}
subtree->create<std::vector<std::string>>(tx_fe_path / "gains/all/profile/options")
.set_publisher(
@@ -256,13 +261,16 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
.set_coercer([this, chan_idx, gain_name](const double gain) {
return this->set_rx_gain(gain, gain_name, chan_idx);
})
- .set_publisher(
- [this, chan_idx, gain_name]() { return get_rx_gain(gain_name, chan_idx); });
+ .set_publisher([this, chan_idx, gain_name]() {
+ return get_rx_gain(gain_name, chan_idx);
+ });
subtree->create<meta_range_t>(rx_fe_path / "gains" / gain_name / "range")
.add_coerced_subscriber([](const meta_range_t&) {
throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this, gain_name, chan_idx]() { return get_rx_gain_range(gain_name, chan_idx); });
+ .set_publisher([this, gain_name, chan_idx]() {
+ return get_rx_gain_range(gain_name, chan_idx);
+ });
}
subtree->create<std::vector<std::string>>(rx_fe_path / "gains/all/profile/options")
.set_publisher(
@@ -375,7 +383,8 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
auto rx_sensor_names = get_rx_sensor_names(chan_idx);
for (const auto& sensor_name : rx_sensor_names) {
RFNOC_LOG_TRACE("Adding RX sensor " << sensor_name);
- get_tree()->create<sensor_value_t>(rx_fe_path / "sensors" / sensor_name)
+ get_tree()
+ ->create<sensor_value_t>(rx_fe_path / "sensors" / sensor_name)
.add_coerced_subscriber([](const sensor_value_t&) {
throw uhd::runtime_error("Attempting to write to sensor!");
})
@@ -386,7 +395,8 @@ void magnesium_radio_control_impl::_init_frontend_subtree(
auto tx_sensor_names = get_tx_sensor_names(chan_idx);
for (const auto& sensor_name : tx_sensor_names) {
RFNOC_LOG_TRACE("Adding TX sensor " << sensor_name);
- get_tree()->create<sensor_value_t>(tx_fe_path / "sensors" / sensor_name)
+ get_tree()
+ ->create<sensor_value_t>(tx_fe_path / "sensors" / sensor_name)
.add_coerced_subscriber([](const sensor_value_t&) {
throw uhd::runtime_error("Attempting to write to sensor!");
})
@@ -403,7 +413,8 @@ void magnesium_radio_control_impl::_init_prop_tree()
}
// DB EEPROM
- get_tree()->create<eeprom_map_t>("eeprom")
+ get_tree()
+ ->create<eeprom_map_t>("eeprom")
.add_coerced_subscriber(
[this](const eeprom_map_t& db_eeprom) { set_db_eeprom(db_eeprom); })
.set_publisher([this]() { return get_db_eeprom(); });
@@ -446,4 +457,3 @@ void magnesium_radio_control_impl::_init_mpm()
_n3xx_timekeeper->update_tick_rate(_master_clock_rate);
radio_control_impl::set_rate(_master_clock_rate);
}
-
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_bands.cpp b/host/lib/usrp/dboard/rhodium/rhodium_bands.cpp
index 9e0a1d3d3..9f72135dd 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_bands.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_bands.cpp
@@ -14,58 +14,58 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- constexpr double FREQ_COMPARE_EPSILON = 1e-5;
+constexpr double FREQ_COMPARE_EPSILON = 1e-5;
- /* Note on the RX filter bank:
- *
- * The RX path has 8 bands, which we call BAND0 through BAND7. BAND0 is the
- * lowest frequency band. BAND7 is the highest frequency band.
- *
- * The following constants define lower cutoff frequencies for each band.
- * RHODIUM_RX_BAND1_MIN_FREQ is the cutover frequency for switching from
- * BAND0 to BAND1, and so on.
- *
- * Bands 1-7 have both high- and low-pass filters (effectively band
- * passes). Band 0 has only low-pass filters. Frequencies have been
- * chosen to allow as much of the full bandwidth through unattenuated.
- *
- * Switch selection logic for these bands can be found in
- * rhodium_radio_control_impl::_update_rx_freq_switches()
- */
- constexpr double RHODIUM_RX_BAND0_MIN_FREQ = RHODIUM_MIN_FREQ;
- constexpr double RHODIUM_RX_BAND1_MIN_FREQ = 450e6;
- constexpr double RHODIUM_RX_BAND2_MIN_FREQ = 760e6;
- constexpr double RHODIUM_RX_BAND3_MIN_FREQ = 1100e6;
- constexpr double RHODIUM_RX_BAND4_MIN_FREQ = 1410e6;
- constexpr double RHODIUM_RX_BAND5_MIN_FREQ = 2050e6;
- constexpr double RHODIUM_RX_BAND6_MIN_FREQ = 3000e6;
- constexpr double RHODIUM_RX_BAND7_MIN_FREQ = 4500e6;
+/* Note on the RX filter bank:
+ *
+ * The RX path has 8 bands, which we call BAND0 through BAND7. BAND0 is the
+ * lowest frequency band. BAND7 is the highest frequency band.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * RHODIUM_RX_BAND1_MIN_FREQ is the cutover frequency for switching from
+ * BAND0 to BAND1, and so on.
+ *
+ * Bands 1-7 have both high- and low-pass filters (effectively band
+ * passes). Band 0 has only low-pass filters. Frequencies have been
+ * chosen to allow as much of the full bandwidth through unattenuated.
+ *
+ * Switch selection logic for these bands can be found in
+ * rhodium_radio_control_impl::_update_rx_freq_switches()
+ */
+constexpr double RHODIUM_RX_BAND0_MIN_FREQ = RHODIUM_MIN_FREQ;
+constexpr double RHODIUM_RX_BAND1_MIN_FREQ = 450e6;
+constexpr double RHODIUM_RX_BAND2_MIN_FREQ = 760e6;
+constexpr double RHODIUM_RX_BAND3_MIN_FREQ = 1100e6;
+constexpr double RHODIUM_RX_BAND4_MIN_FREQ = 1410e6;
+constexpr double RHODIUM_RX_BAND5_MIN_FREQ = 2050e6;
+constexpr double RHODIUM_RX_BAND6_MIN_FREQ = 3000e6;
+constexpr double RHODIUM_RX_BAND7_MIN_FREQ = 4500e6;
- /* Note on the TX filter bank:
- *
- * The TX path has 8 bands, which we call BAND0 through BAND7. BAND0 is the
- * lowest frequency band. BAND7 is the highest frequency band.
- *
- * The following constants define lower cutoff frequencies for each band.
- * RHODIUM_TX_BAND1_MIN_FREQ is the cutover frequency for switching from
- * BAND0 to BAND1, and so on.
- *
- * All filters on the TX filter bank are low pass filters (no high pass
- * filters). Frequencies have been chosen to allow as much of the full
- * bandwidth through unattenuated.
- *
- * Switch selection logic for these bands can be found in
- * rhodium_radio_control_impl::_update_tx_freq_switches()
- */
- constexpr double RHODIUM_TX_BAND0_MIN_FREQ = RHODIUM_MIN_FREQ;
- constexpr double RHODIUM_TX_BAND1_MIN_FREQ = 450e6;
- constexpr double RHODIUM_TX_BAND2_MIN_FREQ = 650e6;
- constexpr double RHODIUM_TX_BAND3_MIN_FREQ = 1000e6;
- constexpr double RHODIUM_TX_BAND4_MIN_FREQ = 1350e6;
- constexpr double RHODIUM_TX_BAND5_MIN_FREQ = 1900e6;
- constexpr double RHODIUM_TX_BAND6_MIN_FREQ = 3000e6;
- constexpr double RHODIUM_TX_BAND7_MIN_FREQ = 4100e6;
-}
+/* Note on the TX filter bank:
+ *
+ * The TX path has 8 bands, which we call BAND0 through BAND7. BAND0 is the
+ * lowest frequency band. BAND7 is the highest frequency band.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * RHODIUM_TX_BAND1_MIN_FREQ is the cutover frequency for switching from
+ * BAND0 to BAND1, and so on.
+ *
+ * All filters on the TX filter bank are low pass filters (no high pass
+ * filters). Frequencies have been chosen to allow as much of the full
+ * bandwidth through unattenuated.
+ *
+ * Switch selection logic for these bands can be found in
+ * rhodium_radio_control_impl::_update_tx_freq_switches()
+ */
+constexpr double RHODIUM_TX_BAND0_MIN_FREQ = RHODIUM_MIN_FREQ;
+constexpr double RHODIUM_TX_BAND1_MIN_FREQ = 450e6;
+constexpr double RHODIUM_TX_BAND2_MIN_FREQ = 650e6;
+constexpr double RHODIUM_TX_BAND3_MIN_FREQ = 1000e6;
+constexpr double RHODIUM_TX_BAND4_MIN_FREQ = 1350e6;
+constexpr double RHODIUM_TX_BAND5_MIN_FREQ = 1900e6;
+constexpr double RHODIUM_TX_BAND6_MIN_FREQ = 3000e6;
+constexpr double RHODIUM_TX_BAND7_MIN_FREQ = 4100e6;
+} // namespace
rhodium_radio_control_impl::rx_band rhodium_radio_control_impl::_map_freq_to_rx_band(
const double freq)
@@ -132,4 +132,3 @@ bool rhodium_radio_control_impl::_is_tx_lowband(const double freq)
{
return _map_freq_to_tx_band(freq) == tx_band::TX_BAND_0;
}
-
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_constants.hpp b/host/lib/usrp/dboard/rhodium/rhodium_constants.hpp
index 69e6bf676..cc6a70dc3 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_constants.hpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_constants.hpp
@@ -8,9 +8,9 @@
#define INCLUDED_LIBUHD_RHODIUM_CONSTANTS_HPP
#include <array>
-#include <vector>
-#include <string>
#include <cstddef>
+#include <string>
+#include <vector>
static constexpr double RHODIUM_FREQ_COMPARE_EPSILON = 1e-5;
@@ -26,37 +26,34 @@ static constexpr double RHODIUM_LO1_MIN_FREQ = 450e6; // Hz
static constexpr double RHODIUM_LO1_MAX_FREQ = 6e9; // Hz
static constexpr double RHODIUM_LO1_REF_FREQ = 122.88e6; // Hz
-static constexpr double RHODIUM_LO_0_9_GHZ_LPF_THRESHOLD_FREQ = 0.975e9; // Hz
+static constexpr double RHODIUM_LO_0_9_GHZ_LPF_THRESHOLD_FREQ = 0.975e9; // Hz
static constexpr double RHODIUM_LO_2_25_GHZ_LPF_THRESHOLD_FREQ = 2.3e9; // Hz
static constexpr double RHODIUM_LOWBAND_FREQ = 450e6; // Hz
-static constexpr double RHODIUM_RX_IF_FREQ = 2.44e9; // Hz
-static constexpr double RHODIUM_TX_IF_FREQ = 1.95e9; // Hz
+static constexpr double RHODIUM_RX_IF_FREQ = 2.44e9; // Hz
+static constexpr double RHODIUM_TX_IF_FREQ = 1.95e9; // Hz
-static constexpr double RX_MIN_GAIN = 0.0;
-static constexpr double RX_MAX_GAIN = 60.0;
+static constexpr double RX_MIN_GAIN = 0.0;
+static constexpr double RX_MAX_GAIN = 60.0;
static constexpr double RX_GAIN_STEP = 1.0;
-static constexpr double TX_MIN_GAIN = 0.0;
-static constexpr double TX_MAX_GAIN = 60.0;
+static constexpr double TX_MIN_GAIN = 0.0;
+static constexpr double TX_MAX_GAIN = 60.0;
static constexpr double TX_GAIN_STEP = 1.0;
-static constexpr double LO_MIN_GAIN = 0.0;
-static constexpr double LO_MAX_GAIN = 30.0;
+static constexpr double LO_MIN_GAIN = 0.0;
+static constexpr double LO_MAX_GAIN = 30.0;
static constexpr double LO_GAIN_STEP = 1.0;
-static constexpr double LO_MIN_POWER = 0.0;
-static constexpr double LO_MAX_POWER = 63.0;
+static constexpr double LO_MIN_POWER = 0.0;
+static constexpr double LO_MAX_POWER = 63.0;
static constexpr double LO_POWER_STEP = 1.0;
static constexpr double RHODIUM_DEFAULT_BANDWIDTH = 250e6; // Hz
static const std::vector<std::string> RHODIUM_RX_ANTENNAS = {
- "TX/RX", "RX2", "CAL", "TERM"
-};
+ "TX/RX", "RX2", "CAL", "TERM"};
-static const std::vector<std::string> RHODIUM_TX_ANTENNAS = {
- "TX/RX", "CAL", "TERM"
-};
+static const std::vector<std::string> RHODIUM_TX_ANTENNAS = {"TX/RX", "CAL", "TERM"};
// These names are taken from radio_rhodium.xml
static constexpr char SPUR_DODGING_PROP_NAME[] = "spur_dodging";
@@ -69,13 +66,13 @@ static constexpr char RHODIUM_DEFAULT_HB_SPUR_REDUCTION_MODE[] = "disabled";
static constexpr char RHODIUM_FPGPIO_BANK[] = "FP0";
static constexpr uint32_t RHODIUM_GPIO_MASK = 0x1F;
-static constexpr uint32_t SW10_GPIO_MASK = 0x3;
-static constexpr uint32_t LED_GPIO_MASK = 0x1C;
+static constexpr uint32_t SW10_GPIO_MASK = 0x3;
+static constexpr uint32_t LED_GPIO_MASK = 0x1C;
-static constexpr uint32_t SW10_FROMTXLOWBAND = 0x0;
+static constexpr uint32_t SW10_FROMTXLOWBAND = 0x0;
static constexpr uint32_t SW10_FROMTXHIGHBAND = 0x1;
-static constexpr uint32_t SW10_ISOLATION = 0x2;
-static constexpr uint32_t SW10_TORX = 0x3;
+static constexpr uint32_t SW10_ISOLATION = 0x2;
+static constexpr uint32_t SW10_TORX = 0x3;
static constexpr uint32_t LED_RX = 0x04;
static constexpr uint32_t LED_RX2 = 0x08;
@@ -95,12 +92,8 @@ static constexpr char RHODIUM_LO_POWER[] = "lo";
static constexpr char RHODIUM_FE_NAME[] = "Rhodium";
static constexpr int NUM_LO_OUTPUT_PORT_NAMES = 4;
-static constexpr std::array<const char*, NUM_LO_OUTPUT_PORT_NAMES> LO_OUTPUT_PORT_NAMES = {
- "LO_OUT_0",
- "LO_OUT_1",
- "LO_OUT_2",
- "LO_OUT_3"
-};
+static constexpr std::array<const char*, NUM_LO_OUTPUT_PORT_NAMES> LO_OUTPUT_PORT_NAMES =
+ {"LO_OUT_0", "LO_OUT_1", "LO_OUT_2", "LO_OUT_3"};
static constexpr size_t RHODIUM_NUM_CHANS = 1;
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.cpp b/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.cpp
index 8d294bc48..0617cbd94 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.cpp
@@ -6,8 +6,8 @@
#include "rhodium_cpld_ctrl.hpp"
#include "rhodium_constants.hpp"
-#include <uhd/utils/math.hpp>
#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <boost/format.hpp>
#include <chrono>
@@ -15,115 +15,100 @@ using namespace uhd;
using namespace uhd::math::fp_compare;
namespace {
- //! Address of the CPLD scratch register
- constexpr uint8_t CPLD_REGS_SCRATCH = 0x05;
- //! Address of the CPLD gain table selection register
- constexpr uint8_t CPLD_REGS_GAIN_TBL_SEL = 0x06;
-
- constexpr uint32_t MAX_GAIN_INDEX = 60;
- constexpr uint32_t MAX_LO_GAIN_INDEX = 30;
-
- //! RX Demodulator Adjustment thresholds
- constexpr double RX_DEMOD_ADJ_1500OHM_THRESHOLD = 3e9;
- constexpr double RX_DEMOD_ADJ_200OHM_THRESHOLD = 4.5e9;
-
- /*
- Unlike other CPLD fields, gain control doesn't use a register and instead
- commands are directly sent over SPI. The format of these 24-bit commands is
- as follows.
- 23:22 Table select (1 = RX, 2 = TX)
- 21:16 Gain index
- 15:14 Reserved
- 13 Write enable for DSA1
- 12:7 Reserved
- 6 Write enable for DSA2
- 5:0 Reserved
- The CPLD replies with the current attenuation settings as follows, but we
- ignore this reply in our code.
- 23:13 Reserved
- 12:7 Current attenuator setting for DSA1
- 6 Reserved
- 5:0 Current attenuator setting for DSA2
- */
- //! Gain loader constants
- constexpr size_t GAIN_CTRL_TABLE_FIELD = 22;
- constexpr size_t GAIN_CTRL_INDEX_FIELD = 16;
- constexpr size_t GAIN_CTRL_DSA1_FIELD = 13;
- constexpr size_t GAIN_CTRL_DSA2_FIELD = 6;
-
- constexpr uint32_t GAIN_CTRL_TABLE_RX = 1;
- constexpr uint32_t GAIN_CTRL_TABLE_TX = 2;
- constexpr uint32_t GAIN_CTRL_DSA1_WRITE_ENABLE = 1;
- constexpr uint32_t GAIN_CTRL_DSA2_WRITE_ENABLE = 1;
-
- /*
- Similar to gain control, LO control doesn't use a register and instead
- commands are directly sent over SPI. The format of these 24-bit commands is
- as follows:
- 23:22 Table select (Always 3 = LO)
- 21:16 Attenuator setting
- 15:14 Reserved
- 13 Write enable for RX LO DSA
- 12:7 Reserved
- 6 Write enable for TX LO DSA
- 5:0 Reserved
- The CPLD replies with the current attenuator settings as follows, but we
- ignore this reply in our code.
- 23:13 Reserved
- 12:7 Current attenuator setting for RX LO DSA
- 6 Reserved
- 5:0 Current attenuator setting for TX LO DSA
- */
- //! LO Gain loader constants
- constexpr size_t LO_GAIN_CTRL_TABLE_FIELD = 22;
- constexpr size_t LO_GAIN_CTRL_INDEX_FIELD = 16;
- constexpr size_t LO_GAIN_CTRL_RX_LO_FIELD = 13;
- constexpr size_t LO_GAIN_CTRL_TX_LO_FIELD = 6;
-
- constexpr uint32_t LO_GAIN_CTRL_TABLE_LO = 3;
- constexpr uint32_t LO_GAIN_CTRL_RX_LO_WRITE_ENABLE = 1;
- constexpr uint32_t LO_GAIN_CTRL_RX_LO_WRITE_DISABLE = 0;
- constexpr uint32_t LO_GAIN_CTRL_TX_LO_WRITE_ENABLE = 1;
- constexpr uint32_t LO_GAIN_CTRL_TX_LO_WRITE_DISABLE = 0;
-}
-
-rhodium_cpld_ctrl::rhodium_cpld_ctrl(
- write_spi_t write_fn,
- read_spi_t read_fn
-)
+//! Address of the CPLD scratch register
+constexpr uint8_t CPLD_REGS_SCRATCH = 0x05;
+//! Address of the CPLD gain table selection register
+constexpr uint8_t CPLD_REGS_GAIN_TBL_SEL = 0x06;
+
+constexpr uint32_t MAX_GAIN_INDEX = 60;
+constexpr uint32_t MAX_LO_GAIN_INDEX = 30;
+
+//! RX Demodulator Adjustment thresholds
+constexpr double RX_DEMOD_ADJ_1500OHM_THRESHOLD = 3e9;
+constexpr double RX_DEMOD_ADJ_200OHM_THRESHOLD = 4.5e9;
+
+/*
+Unlike other CPLD fields, gain control doesn't use a register and instead
+commands are directly sent over SPI. The format of these 24-bit commands is
+as follows.
+ 23:22 Table select (1 = RX, 2 = TX)
+ 21:16 Gain index
+ 15:14 Reserved
+ 13 Write enable for DSA1
+ 12:7 Reserved
+ 6 Write enable for DSA2
+ 5:0 Reserved
+The CPLD replies with the current attenuation settings as follows, but we
+ignore this reply in our code.
+ 23:13 Reserved
+ 12:7 Current attenuator setting for DSA1
+ 6 Reserved
+ 5:0 Current attenuator setting for DSA2
+*/
+//! Gain loader constants
+constexpr size_t GAIN_CTRL_TABLE_FIELD = 22;
+constexpr size_t GAIN_CTRL_INDEX_FIELD = 16;
+constexpr size_t GAIN_CTRL_DSA1_FIELD = 13;
+constexpr size_t GAIN_CTRL_DSA2_FIELD = 6;
+
+constexpr uint32_t GAIN_CTRL_TABLE_RX = 1;
+constexpr uint32_t GAIN_CTRL_TABLE_TX = 2;
+constexpr uint32_t GAIN_CTRL_DSA1_WRITE_ENABLE = 1;
+constexpr uint32_t GAIN_CTRL_DSA2_WRITE_ENABLE = 1;
+
+/*
+Similar to gain control, LO control doesn't use a register and instead
+commands are directly sent over SPI. The format of these 24-bit commands is
+as follows:
+ 23:22 Table select (Always 3 = LO)
+ 21:16 Attenuator setting
+ 15:14 Reserved
+ 13 Write enable for RX LO DSA
+ 12:7 Reserved
+ 6 Write enable for TX LO DSA
+ 5:0 Reserved
+The CPLD replies with the current attenuator settings as follows, but we
+ignore this reply in our code.
+ 23:13 Reserved
+ 12:7 Current attenuator setting for RX LO DSA
+ 6 Reserved
+ 5:0 Current attenuator setting for TX LO DSA
+*/
+//! LO Gain loader constants
+constexpr size_t LO_GAIN_CTRL_TABLE_FIELD = 22;
+constexpr size_t LO_GAIN_CTRL_INDEX_FIELD = 16;
+constexpr size_t LO_GAIN_CTRL_RX_LO_FIELD = 13;
+constexpr size_t LO_GAIN_CTRL_TX_LO_FIELD = 6;
+
+constexpr uint32_t LO_GAIN_CTRL_TABLE_LO = 3;
+constexpr uint32_t LO_GAIN_CTRL_RX_LO_WRITE_ENABLE = 1;
+constexpr uint32_t LO_GAIN_CTRL_RX_LO_WRITE_DISABLE = 0;
+constexpr uint32_t LO_GAIN_CTRL_TX_LO_WRITE_ENABLE = 1;
+constexpr uint32_t LO_GAIN_CTRL_TX_LO_WRITE_DISABLE = 0;
+} // namespace
+
+rhodium_cpld_ctrl::rhodium_cpld_ctrl(write_spi_t write_fn, read_spi_t read_fn)
{
- _write_reg_fn = [write_fn](const uint8_t addr, const uint32_t data){
+ _write_reg_fn = [write_fn](const uint8_t addr, const uint32_t data) {
UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X")
- % uint32_t(addr) % data));
- const uint32_t spi_transaction = 0
- | ((addr & 0x7F) << 17)
- | data
- ;
- UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("SPI Transaction: 0x%04X")
- % spi_transaction));
+ str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X") % uint32_t(addr)
+ % data));
+ const uint32_t spi_transaction = 0 | ((addr & 0x7F) << 17) | data;
+ UHD_LOG_TRACE(
+ "RH_CPLD", str(boost::format("SPI Transaction: 0x%04X") % spi_transaction));
write_fn(spi_transaction);
};
_write_raw_fn = [write_fn](const uint32_t data) {
- UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("Writing to CPLD: 0x%06X")
- % data));
- UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("SPI Transaction: 0x%06X")
- % data));
+ UHD_LOG_TRACE("RH_CPLD", str(boost::format("Writing to CPLD: 0x%06X") % data));
+ UHD_LOG_TRACE("RH_CPLD", str(boost::format("SPI Transaction: 0x%06X") % data));
write_fn(data);
};
- _read_reg_fn = [read_fn](const uint8_t addr){
+ _read_reg_fn = [read_fn](const uint8_t addr) {
UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("Reading from CPLD address 0x%02X")
- % uint32_t(addr)));
- const uint32_t spi_transaction = (1<<16)
- | ((addr & 0x7F) << 17)
- ;
- UHD_LOG_TRACE("RH_CPLD",
- str(boost::format("SPI Transaction: 0x%04X")
- % spi_transaction));
+ str(boost::format("Reading from CPLD address 0x%02X") % uint32_t(addr)));
+ const uint32_t spi_transaction = (1 << 16) | ((addr & 0x7F) << 17);
+ UHD_LOG_TRACE(
+ "RH_CPLD", str(boost::format("SPI Transaction: 0x%04X") % spi_transaction));
return read_fn(spi_transaction);
};
@@ -162,26 +147,23 @@ uint16_t rhodium_cpld_ctrl::get_scratch()
return get_reg(CPLD_REGS_SCRATCH);
}
-void rhodium_cpld_ctrl::set_tx_switches(
- const tx_sw2_t tx_sw2,
+void rhodium_cpld_ctrl::set_tx_switches(const tx_sw2_t tx_sw2,
const tx_sw3_sw4_t tx_sw3_sw4,
const tx_sw5_t tx_sw5,
const tx_hb_lb_sel_t tx_hb_lb_sel,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD",
- "Configuring TX band selection switches."\
- " sw2=" << tx_sw2 <<
- " sw3_sw4=" << tx_sw3_sw4 <<
- " sw5=" << tx_sw5 <<
- " hb_lb_sel=" << tx_hb_lb_sel
- );
+ "Configuring TX band selection switches."
+ " sw2="
+ << tx_sw2 << " sw3_sw4=" << tx_sw3_sw4 << " sw5=" << tx_sw5
+ << " hb_lb_sel=" << tx_hb_lb_sel);
std::lock_guard<std::mutex> l(_set_mutex);
- _regs.tx_sw2 = rhodium_cpld_regs_t::tx_sw2_t(tx_sw2);
- _regs.tx_sw3_sw4 = rhodium_cpld_regs_t::tx_sw3_sw4_t(tx_sw3_sw4);
- _regs.tx_sw5 = rhodium_cpld_regs_t::tx_sw5_t(tx_sw5);
+ _regs.tx_sw2 = rhodium_cpld_regs_t::tx_sw2_t(tx_sw2);
+ _regs.tx_sw3_sw4 = rhodium_cpld_regs_t::tx_sw3_sw4_t(tx_sw3_sw4);
+ _regs.tx_sw5 = rhodium_cpld_regs_t::tx_sw5_t(tx_sw5);
_regs.tx_hb_lb_sel = rhodium_cpld_regs_t::tx_hb_lb_sel_t(tx_hb_lb_sel);
if (not defer_commit) {
@@ -189,29 +171,25 @@ void rhodium_cpld_ctrl::set_tx_switches(
}
}
-void rhodium_cpld_ctrl::set_rx_switches(
- const rx_sw2_sw7_t rx_sw2_sw7,
+void rhodium_cpld_ctrl::set_rx_switches(const rx_sw2_sw7_t rx_sw2_sw7,
const rx_sw3_t rx_sw3,
const rx_sw4_sw5_t rx_sw4_sw5,
const rx_sw6_t rx_sw6,
const rx_hb_lb_sel_t rx_hb_lb_sel,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD",
- "Configuring RX band selection switches."\
- " sw2_sw7=" << rx_sw2_sw7 <<
- " sw3=" << rx_sw3 <<
- " sw4_sw5=" << rx_sw4_sw5 <<
- " sw6=" << rx_sw6 <<
- " hb_lb_sel=" << rx_hb_lb_sel
- );
+ "Configuring RX band selection switches."
+ " sw2_sw7="
+ << rx_sw2_sw7 << " sw3=" << rx_sw3 << " sw4_sw5=" << rx_sw4_sw5
+ << " sw6=" << rx_sw6 << " hb_lb_sel=" << rx_hb_lb_sel);
std::lock_guard<std::mutex> l(_set_mutex);
- _regs.rx_sw2_sw7 = rhodium_cpld_regs_t::rx_sw2_sw7_t(rx_sw2_sw7);
- _regs.rx_sw3 = rhodium_cpld_regs_t::rx_sw3_t(rx_sw3);
- _regs.rx_sw4_sw5 = rhodium_cpld_regs_t::rx_sw4_sw5_t(rx_sw4_sw5);
- _regs.rx_sw6 = rhodium_cpld_regs_t::rx_sw6_t(rx_sw6);
+ _regs.rx_sw2_sw7 = rhodium_cpld_regs_t::rx_sw2_sw7_t(rx_sw2_sw7);
+ _regs.rx_sw3 = rhodium_cpld_regs_t::rx_sw3_t(rx_sw3);
+ _regs.rx_sw4_sw5 = rhodium_cpld_regs_t::rx_sw4_sw5_t(rx_sw4_sw5);
+ _regs.rx_sw6 = rhodium_cpld_regs_t::rx_sw6_t(rx_sw6);
_regs.rx_hb_lb_sel = rhodium_cpld_regs_t::rx_hb_lb_sel_t(rx_hb_lb_sel);
if (not defer_commit) {
@@ -220,19 +198,16 @@ void rhodium_cpld_ctrl::set_rx_switches(
}
void rhodium_cpld_ctrl::set_rx_input_switches(
- const rx_sw1_t rx_sw1,
- const cal_iso_sw_t cal_iso_sw,
- const bool defer_commit
-) {
+ const rx_sw1_t rx_sw1, const cal_iso_sw_t cal_iso_sw, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD",
- "Configuring RX input selection switches."\
- " sw1=" << rx_sw1 <<
- " cal_iso=" << cal_iso_sw
- );
+ "Configuring RX input selection switches."
+ " sw1="
+ << rx_sw1 << " cal_iso=" << cal_iso_sw);
std::lock_guard<std::mutex> l(_set_mutex);
- _regs.rx_sw1 = rhodium_cpld_regs_t::rx_sw1_t(rx_sw1);
+ _regs.rx_sw1 = rhodium_cpld_regs_t::rx_sw1_t(rx_sw1);
_regs.cal_iso_sw = rhodium_cpld_regs_t::cal_iso_sw_t(cal_iso_sw);
if (not defer_commit) {
@@ -241,13 +216,12 @@ void rhodium_cpld_ctrl::set_rx_input_switches(
}
void rhodium_cpld_ctrl::set_tx_output_switches(
- const tx_sw1_t tx_sw1,
- const bool defer_commit
-) {
+ const tx_sw1_t tx_sw1, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD",
- "Configuring TX output selection switches."\
- " sw1=" << tx_sw1
- );
+ "Configuring TX output selection switches."
+ " sw1="
+ << tx_sw1);
std::lock_guard<std::mutex> l(_set_mutex);
@@ -259,9 +233,8 @@ void rhodium_cpld_ctrl::set_tx_output_switches(
}
void rhodium_cpld_ctrl::set_rx_lo_source(
- const rx_lo_input_sel_t rx_lo_input_sel,
- const bool defer_commit
-) {
+ const rx_lo_input_sel_t rx_lo_input_sel, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD", "Setting RX LO source to " << rx_lo_input_sel);
std::lock_guard<std::mutex> l(_set_mutex);
@@ -273,9 +246,8 @@ void rhodium_cpld_ctrl::set_rx_lo_source(
}
void rhodium_cpld_ctrl::set_tx_lo_source(
- const tx_lo_input_sel_t tx_lo_input_sel,
- const bool defer_commit
-) {
+ const tx_lo_input_sel_t tx_lo_input_sel, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD", "Setting TX LO source to " << tx_lo_input_sel);
std::lock_guard<std::mutex> l(_set_mutex);
@@ -286,29 +258,32 @@ void rhodium_cpld_ctrl::set_tx_lo_source(
}
}
-void rhodium_cpld_ctrl::set_rx_lo_path(
- const double freq,
- const bool defer_commit
-) {
+void rhodium_cpld_ctrl::set_rx_lo_path(const double freq, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD", "Configuring RX LO filter and settings. freq=" << freq);
std::lock_guard<std::mutex> l(_set_mutex);
auto freq_compare = fp_compare_epsilon<double>(freq, RHODIUM_FREQ_COMPARE_EPSILON);
if (freq_compare < RX_DEMOD_ADJ_1500OHM_THRESHOLD) {
- _regs.rx_demod_adj = rhodium_cpld_regs_t::rx_demod_adj_t::RX_DEMOD_ADJ_RES_1500_OHM;
+ _regs.rx_demod_adj =
+ rhodium_cpld_regs_t::rx_demod_adj_t::RX_DEMOD_ADJ_RES_1500_OHM;
} else if (freq_compare < RX_DEMOD_ADJ_200OHM_THRESHOLD) {
- _regs.rx_demod_adj = rhodium_cpld_regs_t::rx_demod_adj_t::RX_DEMOD_ADJ_RES_200_OHM;
+ _regs.rx_demod_adj =
+ rhodium_cpld_regs_t::rx_demod_adj_t::RX_DEMOD_ADJ_RES_200_OHM;
} else {
_regs.rx_demod_adj = rhodium_cpld_regs_t::rx_demod_adj_t::RX_DEMOD_ADJ_RES_OPEN;
}
if (freq_compare < RHODIUM_LO_0_9_GHZ_LPF_THRESHOLD_FREQ) {
- _regs.rx_lo_filter_sel = rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_0_9GHZ_LPF;
+ _regs.rx_lo_filter_sel =
+ rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_0_9GHZ_LPF;
} else if (freq_compare < RHODIUM_LO_2_25_GHZ_LPF_THRESHOLD_FREQ) {
- _regs.rx_lo_filter_sel = rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_2_25GHZ_LPF;
+ _regs.rx_lo_filter_sel =
+ rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_2_25GHZ_LPF;
} else {
- _regs.rx_lo_filter_sel = rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_5_85GHZ_LPF;
+ _regs.rx_lo_filter_sel =
+ rhodium_cpld_regs_t::rx_lo_filter_sel_t::RX_LO_FILTER_SEL_5_85GHZ_LPF;
}
if (not defer_commit) {
@@ -316,21 +291,22 @@ void rhodium_cpld_ctrl::set_rx_lo_path(
}
}
-void rhodium_cpld_ctrl::set_tx_lo_path(
- const double freq,
- const bool defer_commit
-) {
+void rhodium_cpld_ctrl::set_tx_lo_path(const double freq, const bool defer_commit)
+{
UHD_LOG_TRACE("RH_CPLD", "Configuring TX LO filter and settings. freq=" << freq);
std::lock_guard<std::mutex> l(_set_mutex);
auto freq_compare = fp_compare_epsilon<double>(freq, RHODIUM_FREQ_COMPARE_EPSILON);
if (freq_compare < RHODIUM_LO_0_9_GHZ_LPF_THRESHOLD_FREQ) {
- _regs.tx_lo_filter_sel = rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_0_9GHZ_LPF;
+ _regs.tx_lo_filter_sel =
+ rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_0_9GHZ_LPF;
} else if (freq_compare < RHODIUM_LO_2_25_GHZ_LPF_THRESHOLD_FREQ) {
- _regs.tx_lo_filter_sel = rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_2_25GHZ_LPF;
+ _regs.tx_lo_filter_sel =
+ rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_2_25GHZ_LPF;
} else {
- _regs.tx_lo_filter_sel = rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_5_85GHZ_LPF;
+ _regs.tx_lo_filter_sel =
+ rhodium_cpld_regs_t::tx_lo_filter_sel_t::TX_LO_FILTER_SEL_5_85GHZ_LPF;
}
if (not defer_commit) {
@@ -338,43 +314,35 @@ void rhodium_cpld_ctrl::set_tx_lo_path(
}
}
-void rhodium_cpld_ctrl::set_gain_index(
- const uint32_t index,
+void rhodium_cpld_ctrl::set_gain_index(const uint32_t index,
const gain_band_t band,
const uhd::direction_t dir,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
UHD_ASSERT_THROW(index <= MAX_GAIN_INDEX);
UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
- if (band == HIGH)
- {
- if (dir == RX_DIRECTION)
- {
+ if (band == HIGH) {
+ if (dir == RX_DIRECTION) {
_regs.rx_gain_tbl_sel = rhodium_cpld_regs_t::RX_GAIN_TBL_SEL_HIGHBAND;
- }
- else {
+ } else {
_regs.tx_gain_tbl_sel = rhodium_cpld_regs_t::TX_GAIN_TBL_SEL_HIGHBAND;
}
} else {
- if (dir == RX_DIRECTION)
- {
+ if (dir == RX_DIRECTION) {
_regs.rx_gain_tbl_sel = rhodium_cpld_regs_t::RX_GAIN_TBL_SEL_LOWBAND;
- }
- else {
+ } else {
_regs.tx_gain_tbl_sel = rhodium_cpld_regs_t::TX_GAIN_TBL_SEL_LOWBAND;
}
}
- const uint8_t table_id = (dir == RX_DIRECTION) ?
- GAIN_CTRL_TABLE_RX :
- GAIN_CTRL_TABLE_TX;
+ const uint8_t table_id = (dir == RX_DIRECTION) ? GAIN_CTRL_TABLE_RX
+ : GAIN_CTRL_TABLE_TX;
- const uint32_t cmd =
- (table_id << GAIN_CTRL_TABLE_FIELD) |
- (index << GAIN_CTRL_INDEX_FIELD) |
- (GAIN_CTRL_DSA1_WRITE_ENABLE << GAIN_CTRL_DSA1_FIELD) |
- (GAIN_CTRL_DSA2_WRITE_ENABLE << GAIN_CTRL_DSA2_FIELD);
+ const uint32_t cmd = (table_id << GAIN_CTRL_TABLE_FIELD)
+ | (index << GAIN_CTRL_INDEX_FIELD)
+ | (GAIN_CTRL_DSA1_WRITE_ENABLE << GAIN_CTRL_DSA1_FIELD)
+ | (GAIN_CTRL_DSA2_WRITE_ENABLE << GAIN_CTRL_DSA2_FIELD);
std::lock_guard<std::mutex> l(_set_mutex);
_gain_queue.emplace_back(cmd);
@@ -385,28 +353,25 @@ void rhodium_cpld_ctrl::set_gain_index(
}
void rhodium_cpld_ctrl::set_lo_gain(
- const uint32_t index,
- const uhd::direction_t dir,
- const bool defer_commit
-) {
+ const uint32_t index, const uhd::direction_t dir, const bool defer_commit)
+{
UHD_ASSERT_THROW(index <= MAX_LO_GAIN_INDEX);
// The DSA has 0-30 dB of attenuation in 1 dB steps
// This index directly controls the attenuation value of the LO DSA,
// so reverse the gain value to write the value
const uint32_t attenuation = MAX_LO_GAIN_INDEX - index;
- const uint8_t set_rx = (dir == RX_DIRECTION or dir == DX_DIRECTION) ?
- LO_GAIN_CTRL_RX_LO_WRITE_ENABLE :
- LO_GAIN_CTRL_RX_LO_WRITE_DISABLE;
- const uint8_t set_tx = (dir == TX_DIRECTION or dir == DX_DIRECTION) ?
- LO_GAIN_CTRL_TX_LO_WRITE_ENABLE :
- LO_GAIN_CTRL_TX_LO_WRITE_DISABLE;
-
- const uint32_t cmd =
- (LO_GAIN_CTRL_TABLE_LO << LO_GAIN_CTRL_TABLE_FIELD) |
- (attenuation << LO_GAIN_CTRL_INDEX_FIELD) |
- (set_rx << LO_GAIN_CTRL_RX_LO_FIELD) |
- (set_tx << LO_GAIN_CTRL_TX_LO_FIELD);
+ const uint8_t set_rx = (dir == RX_DIRECTION or dir == DX_DIRECTION)
+ ? LO_GAIN_CTRL_RX_LO_WRITE_ENABLE
+ : LO_GAIN_CTRL_RX_LO_WRITE_DISABLE;
+ const uint8_t set_tx = (dir == TX_DIRECTION or dir == DX_DIRECTION)
+ ? LO_GAIN_CTRL_TX_LO_WRITE_ENABLE
+ : LO_GAIN_CTRL_TX_LO_WRITE_DISABLE;
+
+ const uint32_t cmd = (LO_GAIN_CTRL_TABLE_LO << LO_GAIN_CTRL_TABLE_FIELD)
+ | (attenuation << LO_GAIN_CTRL_INDEX_FIELD)
+ | (set_rx << LO_GAIN_CTRL_RX_LO_FIELD)
+ | (set_tx << LO_GAIN_CTRL_TX_LO_FIELD);
std::lock_guard<std::mutex> l(_set_mutex);
_gain_queue.emplace_back(cmd);
@@ -431,9 +396,7 @@ void rhodium_cpld_ctrl::_loopback_test()
if (actual != random_number) {
UHD_LOGGER_ERROR("RH_CPLD")
<< "CPLD scratch loopback failed! "
- << boost::format("Expected: 0x%04X Got: 0x%04X")
- % random_number % actual
- ;
+ << boost::format("Expected: 0x%04X Got: 0x%04X") % random_number % actual;
throw uhd::runtime_error("CPLD scratch loopback failed!");
}
UHD_LOG_TRACE("RH_CPLD", "CPLD scratch loopback test passed!");
@@ -442,33 +405,27 @@ void rhodium_cpld_ctrl::_loopback_test()
void rhodium_cpld_ctrl::commit(const bool save_all)
{
UHD_LOGGER_TRACE("RH_CPLD")
- << "Storing register cache "
- << (save_all ? "completely" : "selectively")
- << " to CPLD via SPI..."
- ;
- auto changed_addrs = save_all ?
- _regs.get_all_addrs() :
- _regs.get_changed_addrs<size_t>();
- for (const auto addr: changed_addrs) {
+ << "Storing register cache " << (save_all ? "completely" : "selectively")
+ << " to CPLD via SPI...";
+ auto changed_addrs = save_all ? _regs.get_all_addrs()
+ : _regs.get_changed_addrs<size_t>();
+ for (const auto addr : changed_addrs) {
_write_reg_fn(addr, _regs.get_reg(addr));
}
_regs.save_state();
UHD_LOG_TRACE("RH_CPLD",
- "Storing cache complete: " \
- "Updated " << changed_addrs.size() << " registers.")
- ;
+ "Storing cache complete: "
+ "Updated "
+ << changed_addrs.size() << " registers.");
- UHD_LOGGER_TRACE("RH_CPLD")
- << "Writing queued gain commands "
- << "to CPLD via SPI..."
- ;
+ UHD_LOGGER_TRACE("RH_CPLD") << "Writing queued gain commands "
+ << "to CPLD via SPI...";
for (const auto cmd : _gain_queue) {
_write_raw_fn(cmd);
}
UHD_LOG_TRACE("RH_CPLD",
- "Writing queued gain commands complete: " \
- "Wrote " << _gain_queue.size() << " commands.")
- ;
+ "Writing queued gain commands complete: "
+ "Wrote "
+ << _gain_queue.size() << " commands.");
_gain_queue.clear();
}
-
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.hpp b/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.hpp
index d60ae6e66..18b0b8c78 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.hpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_cpld_ctrl.hpp
@@ -38,14 +38,14 @@ public:
};
enum tx_sw1_t {
- TX_SW1_TOLOWBAND = 0,
- TX_SW1_TOSWITCH2 = 1,
+ TX_SW1_TOLOWBAND = 0,
+ TX_SW1_TOSWITCH2 = 1,
TX_SW1_TOCALLOOPBACK = 2,
- TX_SW1_ISOLATION = 3
+ TX_SW1_ISOLATION = 3
};
enum tx_sw2_t {
- TX_SW2_FROMSWITCH3 = 0,
+ TX_SW2_FROMSWITCH3 = 0,
TX_SW2_FROMTXFILTERLP6000MHZ = 1,
TX_SW2_FROMTXFILTERLP4100MHZ = 2,
TX_SW2_FROMTXFILTERLP3000MHZ = 3
@@ -62,23 +62,23 @@ public:
TX_SW5_TOTXFILTERLP3000MHZ = 0,
TX_SW5_TOTXFILTERLP4100MHZ = 1,
TX_SW5_TOTXFILTERLP6000MHZ = 2,
- TX_SW5_TOSWITCH4 = 3
+ TX_SW5_TOSWITCH4 = 3
};
enum rx_sw1_t {
RX_SW1_FROMCALLOOPBACK = 0,
- RX_SW1_FROMRX2INPUT = 1,
- RX_SW1_ISOLATION = 2,
- RX_SW1_FROMTXRXINPUT = 3
+ RX_SW1_FROMRX2INPUT = 1,
+ RX_SW1_ISOLATION = 2,
+ RX_SW1_FROMTXRXINPUT = 3
};
enum rx_sw2_sw7_t {
- RX_SW2_SW7_LOWBANDFILTERBANK = 0,
+ RX_SW2_SW7_LOWBANDFILTERBANK = 0,
RX_SW2_SW7_HIGHBANDFILTERBANK = 1
};
enum rx_sw3_t {
- RX_SW3_TOSWITCH4 = 0,
+ RX_SW3_TOSWITCH4 = 0,
RX_SW3_TOFILTER4500X6000MHZ = 1,
RX_SW3_TOFILTER3000X4500MHZ = 2,
RX_SW3_TOFILTER2050X3000MHZ = 3
@@ -95,52 +95,33 @@ public:
RX_SW6_FROMFILTER2050X3000MHZ = 0,
RX_SW6_FROMFILTER3000X4500MHZ = 1,
RX_SW6_FROMFILTER4500X6000MHZ = 2,
- RX_SW6_FROMSWITCH5 = 3,
+ RX_SW6_FROMSWITCH5 = 3,
};
- enum cal_iso_sw_t {
- CAL_ISO_ISOLATION = 0,
- CAL_ISO_CALLOOPBACK = 1
- };
+ enum cal_iso_sw_t { CAL_ISO_ISOLATION = 0, CAL_ISO_CALLOOPBACK = 1 };
- enum tx_hb_lb_sel_t {
- TX_HB_LB_SEL_LOWBAND = 0,
- TX_HB_LB_SEL_HIGHBAND = 1
- };
+ enum tx_hb_lb_sel_t { TX_HB_LB_SEL_LOWBAND = 0, TX_HB_LB_SEL_HIGHBAND = 1 };
- enum tx_lo_input_sel_t {
- TX_LO_INPUT_SEL_INTERNAL = 0,
- TX_LO_INPUT_SEL_EXTERNAL = 1
- };
+ enum tx_lo_input_sel_t { TX_LO_INPUT_SEL_INTERNAL = 0, TX_LO_INPUT_SEL_EXTERNAL = 1 };
- enum rx_hb_lb_sel_t {
- RX_HB_LB_SEL_LOWBAND = 0,
- RX_HB_LB_SEL_HIGHBAND = 1
- };
+ enum rx_hb_lb_sel_t { RX_HB_LB_SEL_LOWBAND = 0, RX_HB_LB_SEL_HIGHBAND = 1 };
- enum rx_lo_input_sel_t {
- RX_LO_INPUT_SEL_INTERNAL = 1,
- RX_LO_INPUT_SEL_EXTERNAL = 0
- };
+ enum rx_lo_input_sel_t { RX_LO_INPUT_SEL_INTERNAL = 1, RX_LO_INPUT_SEL_EXTERNAL = 0 };
- enum rx_demod_adj {
- RX_DEMOD_OPEN = 0,
- RX_DEMOD_200OHM = 1,
- RX_DEMOD_1500OHM = 2
- };
+ enum rx_demod_adj { RX_DEMOD_OPEN = 0, RX_DEMOD_200OHM = 1, RX_DEMOD_1500OHM = 2 };
enum tx_lo_filter_sel_t {
- TX_LO_FILTER_SEL_0_9GHZ_LPF = 0,
+ TX_LO_FILTER_SEL_0_9GHZ_LPF = 0,
TX_LO_FILTER_SEL_5_85GHZ_LPF = 1,
TX_LO_FILTER_SEL_2_25GHZ_LPF = 2,
- TX_LO_FILTER_SEL_ISOLATION = 3
+ TX_LO_FILTER_SEL_ISOLATION = 3
};
enum rx_lo_filter_sel_t {
- RX_LO_FILTER_SEL_0_9GHZ_LPF = 0,
+ RX_LO_FILTER_SEL_0_9GHZ_LPF = 0,
RX_LO_FILTER_SEL_5_85GHZ_LPF = 1,
RX_LO_FILTER_SEL_2_25GHZ_LPF = 2,
- RX_LO_FILTER_SEL_ISOLATION = 3
+ RX_LO_FILTER_SEL_ISOLATION = 3
};
/*! Constructor.
@@ -148,10 +129,7 @@ public:
* \param write_spi_fn SPI write function
* \param read_spi_fn SPI read function
*/
- rhodium_cpld_ctrl(
- write_spi_t write_spi_fn,
- read_spi_t read_spi_fn
- );
+ rhodium_cpld_ctrl(write_spi_t write_spi_fn, read_spi_t read_spi_fn);
/**************************************************************************
* API
@@ -187,13 +165,11 @@ public:
* \param tx_hb_lb_sel Power on the highband or lowband amplifier
* \param tx_lo_filter_sel Select LPF filter for LO
*/
- void set_tx_switches(
- const tx_sw2_t tx_sw2,
+ void set_tx_switches(const tx_sw2_t tx_sw2,
const tx_sw3_sw4_t tx_sw3_sw4,
const tx_sw5_t tx_sw5,
const tx_hb_lb_sel_t tx_hb_lb_sel,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! Frequency-related settings, receive side
*
@@ -204,14 +180,12 @@ public:
* \param rx_hb_lb_sel Power on the highband or lowband amplifier
* \param rx_lo_filter_sel Select LPF filter for LO
*/
- void set_rx_switches(
- const rx_sw2_sw7_t rx_sw2_sw7,
+ void set_rx_switches(const rx_sw2_sw7_t rx_sw2_sw7,
const rx_sw3_t rx_sw3,
const rx_sw4_sw5_t rx_sw4_sw5,
const rx_sw6_t rx_sw6,
const rx_hb_lb_sel_t rx_hb_lb_sel,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! Input switches for RX side
*
@@ -220,91 +194,72 @@ public:
* \param rx_sw1 Input selection of RX path
* \param cal_iso_sw Terminates the calibration loopback path
*/
- void set_rx_input_switches(
- const rx_sw1_t rx_sw1,
+ void set_rx_input_switches(const rx_sw1_t rx_sw1,
const cal_iso_sw_t cal_iso_sw,
- const bool defer_commit = false
- );
-
- /*! Output switches for TX side
- *
- * Note: These are not frequency dependent.
- *
- * \param tx_sw1 Output selection of TX path
- */
- void set_tx_output_switches(
- const tx_sw1_t tx_sw1,
- const bool defer_commit = false
- );
-
- /*! Input switch for RX LO
- *
- * \param rx_lo_input_sel Selects RX LO source
- */
+ const bool defer_commit = false);
+
+ /*! Output switches for TX side
+ *
+ * Note: These are not frequency dependent.
+ *
+ * \param tx_sw1 Output selection of TX path
+ */
+ void set_tx_output_switches(const tx_sw1_t tx_sw1, const bool defer_commit = false);
+
+ /*! Input switch for RX LO
+ *
+ * \param rx_lo_input_sel Selects RX LO source
+ */
void set_rx_lo_source(
- const rx_lo_input_sel_t rx_lo_input_sel,
- const bool defer_commit = false
- );
-
- /*! Input switch for TX LO
- *
- * \param tx_lo_input_sel Selects TX LO source
- */
+ const rx_lo_input_sel_t rx_lo_input_sel, const bool defer_commit = false);
+
+ /*! Input switch for TX LO
+ *
+ * \param tx_lo_input_sel Selects TX LO source
+ */
void set_tx_lo_source(
- const tx_lo_input_sel_t tx_lo_input_sel,
- const bool defer_commit = false
- );
-
- /*! Configure RX LO filter, synth, and mixer settings
- *
- * \param freq RX LO Frequency
- */
- void set_rx_lo_path(
- const double freq,
- const bool defer_commit = false
- );
-
- /*! Configure TX LO filter, synth, and mixer settings
- *
- * \param freq TX LO Frequency
- */
- void set_tx_lo_path(
- const double freq,
- const bool defer_commit = false
- );
-
-
- /*! Gain index setting for the RF frontend
- *
- * Sets the gain index to one of the predefined values that have been
- * loaded into the CPLD by gain table loader in MPM.
- *
- * \param index Index of the gain table entry to apply (0-60)
- * \param band Selects which table to use (lowband or highband)
- * \param dir Selects which RF frontend to apply to (RX or TX)
- */
- void set_gain_index(
- const uint32_t index,
+ const tx_lo_input_sel_t tx_lo_input_sel, const bool defer_commit = false);
+
+ /*! Configure RX LO filter, synth, and mixer settings
+ *
+ * \param freq RX LO Frequency
+ */
+ void set_rx_lo_path(const double freq, const bool defer_commit = false);
+
+ /*! Configure TX LO filter, synth, and mixer settings
+ *
+ * \param freq TX LO Frequency
+ */
+ void set_tx_lo_path(const double freq, const bool defer_commit = false);
+
+
+ /*! Gain index setting for the RF frontend
+ *
+ * Sets the gain index to one of the predefined values that have been
+ * loaded into the CPLD by gain table loader in MPM.
+ *
+ * \param index Index of the gain table entry to apply (0-60)
+ * \param band Selects which table to use (lowband or highband)
+ * \param dir Selects which RF frontend to apply to (RX or TX)
+ */
+ void set_gain_index(const uint32_t index,
const gain_band_t band,
const uhd::direction_t dir,
- const bool defer_commit = false
- );
-
- /*! Gain setting for LO1
- *
- * Sets the attenuation of the RX LO1 DSA or TX LO1 DSA.
- *
- * Note: This function uses gain as a parameter, although it is
- * setting an attenuation.
- *
- * \param index Gain value to apply (0-30)
- * \param dir Selects which LO to apply to (RX, TX, or DX)
- */
- void set_lo_gain(
- const uint32_t index,
+ const bool defer_commit = false);
+
+ /*! Gain setting for LO1
+ *
+ * Sets the attenuation of the RX LO1 DSA or TX LO1 DSA.
+ *
+ * Note: This function uses gain as a parameter, although it is
+ * setting an attenuation.
+ *
+ * \param index Gain value to apply (0-30)
+ * \param dir Selects which LO to apply to (RX, TX, or DX)
+ */
+ void set_lo_gain(const uint32_t index,
const uhd::direction_t dir,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
private:
//! Write function: Take address / data pair, craft SPI transaction
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_control.cpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_control.cpp
index 54c6333bc..f8ec47c18 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_control.cpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_control.cpp
@@ -18,9 +18,9 @@
#include <uhdlib/utils/narrow.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
-#include <memory>
#include <cmath>
#include <cstdlib>
+#include <memory>
#include <sstream>
using namespace uhd;
@@ -29,16 +29,16 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- constexpr char RX_FE_CONNECTION_LOWBAND[] = "QI";
- constexpr char RX_FE_CONNECTION_HIGHBAND[] = "IQ";
- constexpr char TX_FE_CONNECTION_LOWBAND[] = "QI";
- constexpr char TX_FE_CONNECTION_HIGHBAND[] = "IQ";
+constexpr char RX_FE_CONNECTION_LOWBAND[] = "QI";
+constexpr char RX_FE_CONNECTION_HIGHBAND[] = "IQ";
+constexpr char TX_FE_CONNECTION_LOWBAND[] = "QI";
+constexpr char TX_FE_CONNECTION_HIGHBAND[] = "IQ";
- constexpr double DEFAULT_IDENTIFY_DURATION = 5.0; // seconds
+constexpr double DEFAULT_IDENTIFY_DURATION = 5.0; // seconds
- constexpr uint64_t SET_RATE_RPC_TIMEOUT_MS = 10000;
+constexpr uint64_t SET_RATE_RPC_TIMEOUT_MS = 10000;
-}
+} // namespace
/******************************************************************************
@@ -51,8 +51,7 @@ rhodium_radio_control_impl::rhodium_radio_control_impl(make_args_ptr make_args)
UHD_ASSERT_THROW(get_block_id().get_block_count() < 2);
const char radio_slot_name[] = {'A', 'B'};
_radio_slot = radio_slot_name[get_block_id().get_block_count()];
- _rpc_prefix =
- (_radio_slot == "A") ? "db_0_" : "db_1_";
+ _rpc_prefix = (_radio_slot == "A") ? "db_0_" : "db_1_";
RFNOC_LOG_TRACE("Radio slot: " << _radio_slot);
UHD_ASSERT_THROW(get_num_input_ports() == RHODIUM_NUM_CHANS);
UHD_ASSERT_THROW(get_num_output_ports() == RHODIUM_NUM_CHANS);
@@ -207,14 +206,12 @@ double rhodium_radio_control_impl::set_tx_frequency(const double freq, const siz
const bool is_highband = !_is_tx_lowband(coerced_target_freq);
- const double target_lo_freq = is_highband ?
- coerced_target_freq : _get_lowband_lo_freq() - coerced_target_freq;
- const double actual_lo_freq =
- set_tx_lo_freq(target_lo_freq, RHODIUM_LO1, chan);
- const double coerced_freq = is_highband ?
- actual_lo_freq : _get_lowband_lo_freq() - actual_lo_freq;
- const auto conn = is_highband ?
- TX_FE_CONNECTION_HIGHBAND : TX_FE_CONNECTION_LOWBAND;
+ const double target_lo_freq =
+ is_highband ? coerced_target_freq : _get_lowband_lo_freq() - coerced_target_freq;
+ const double actual_lo_freq = set_tx_lo_freq(target_lo_freq, RHODIUM_LO1, chan);
+ const double coerced_freq = is_highband ? actual_lo_freq
+ : _get_lowband_lo_freq() - actual_lo_freq;
+ const auto conn = is_highband ? TX_FE_CONNECTION_HIGHBAND : TX_FE_CONNECTION_LOWBAND;
// update the cached frequency value now so calls to set gain and update
// switches will read the new frequency
@@ -224,7 +221,8 @@ double rhodium_radio_control_impl::set_tx_frequency(const double freq, const siz
set_tx_gain(radio_control_impl::get_tx_gain(chan), 0);
if (_get_highband_spur_reduction_enabled(TX_DIRECTION)) {
- if (_get_timed_command_enabled() and _is_tx_lowband(old_freq) != not is_highband) {
+ if (_get_timed_command_enabled()
+ and _is_tx_lowband(old_freq) != not is_highband) {
RFNOC_LOG_WARNING(
"Timed tuning commands that transition between lowband and highband, 450 "
"MHz, do not function correctly when highband_spur_reduction is enabled! "
@@ -260,14 +258,12 @@ double rhodium_radio_control_impl::set_rx_frequency(const double freq, const siz
const bool is_highband = !_is_rx_lowband(coerced_target_freq);
- const double target_lo_freq = is_highband ?
- coerced_target_freq : _get_lowband_lo_freq() - coerced_target_freq;
- const double actual_lo_freq =
- set_rx_lo_freq(target_lo_freq, RHODIUM_LO1, chan);
- const double coerced_freq = is_highband ?
- actual_lo_freq : _get_lowband_lo_freq() - actual_lo_freq;
- const auto conn = is_highband ?
- RX_FE_CONNECTION_HIGHBAND : RX_FE_CONNECTION_LOWBAND;
+ const double target_lo_freq =
+ is_highband ? coerced_target_freq : _get_lowband_lo_freq() - coerced_target_freq;
+ const double actual_lo_freq = set_rx_lo_freq(target_lo_freq, RHODIUM_LO1, chan);
+ const double coerced_freq = is_highband ? actual_lo_freq
+ : _get_lowband_lo_freq() - actual_lo_freq;
+ const auto conn = is_highband ? RX_FE_CONNECTION_HIGHBAND : RX_FE_CONNECTION_LOWBAND;
// update the cached frequency value now so calls to set gain and update
// switches will read the new frequency
@@ -277,7 +273,8 @@ double rhodium_radio_control_impl::set_rx_frequency(const double freq, const siz
set_rx_gain(radio_control_impl::get_rx_gain(chan), 0);
if (_get_highband_spur_reduction_enabled(RX_DIRECTION)) {
- if (_get_timed_command_enabled() and _is_rx_lowband(old_freq) != not is_highband) {
+ if (_get_timed_command_enabled()
+ and _is_rx_lowband(old_freq) != not is_highband) {
RFNOC_LOG_WARNING(
"Timed tuning commands that transition between lowband and highband, 450 "
"MHz, do not function correctly when highband_spur_reduction is enabled! "
@@ -313,17 +310,17 @@ double rhodium_radio_control_impl::set_tx_gain(const double gain, const size_t c
RFNOC_LOG_TRACE("set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
UHD_ASSERT_THROW(chan == 0);
- auto freq = this->get_tx_frequency(chan);
+ auto freq = this->get_tx_frequency(chan);
auto index = get_tx_gain_range(chan).clip(gain);
- auto old_band = _is_tx_lowband(_tx_frequency_at_last_gain_write) ?
- rhodium_cpld_ctrl::gain_band_t::LOW :
- rhodium_cpld_ctrl::gain_band_t::HIGH;
- auto new_band = _is_tx_lowband(freq) ?
- rhodium_cpld_ctrl::gain_band_t::LOW :
- rhodium_cpld_ctrl::gain_band_t::HIGH;
+ auto old_band = _is_tx_lowband(_tx_frequency_at_last_gain_write)
+ ? rhodium_cpld_ctrl::gain_band_t::LOW
+ : rhodium_cpld_ctrl::gain_band_t::HIGH;
+ auto new_band = _is_tx_lowband(freq) ? rhodium_cpld_ctrl::gain_band_t::LOW
+ : rhodium_cpld_ctrl::gain_band_t::HIGH;
- // The CPLD requires a rewrite of the gain control command on a change of lowband or highband
+ // The CPLD requires a rewrite of the gain control command on a change of lowband or
+ // highband
if (radio_control_impl::get_tx_gain(chan) != index or old_band != new_band) {
RFNOC_LOG_TRACE("Writing new TX gain index: " << index);
_cpld->set_gain_index(index, new_band, TX_DIRECTION);
@@ -342,17 +339,17 @@ double rhodium_radio_control_impl::set_rx_gain(const double gain, const size_t c
RFNOC_LOG_TRACE("set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
UHD_ASSERT_THROW(chan == 0);
- auto freq = this->get_rx_frequency(chan);
+ auto freq = this->get_rx_frequency(chan);
auto index = get_rx_gain_range(chan).clip(gain);
- auto old_band = _is_rx_lowband(_rx_frequency_at_last_gain_write) ?
- rhodium_cpld_ctrl::gain_band_t::LOW :
- rhodium_cpld_ctrl::gain_band_t::HIGH;
- auto new_band = _is_rx_lowband(freq) ?
- rhodium_cpld_ctrl::gain_band_t::LOW :
- rhodium_cpld_ctrl::gain_band_t::HIGH;
+ auto old_band = _is_rx_lowband(_rx_frequency_at_last_gain_write)
+ ? rhodium_cpld_ctrl::gain_band_t::LOW
+ : rhodium_cpld_ctrl::gain_band_t::HIGH;
+ auto new_band = _is_rx_lowband(freq) ? rhodium_cpld_ctrl::gain_band_t::LOW
+ : rhodium_cpld_ctrl::gain_band_t::HIGH;
- // The CPLD requires a rewrite of the gain control command on a change of lowband or highband
+ // The CPLD requires a rewrite of the gain control command on a change of lowband or
+ // highband
if (radio_control_impl::get_rx_gain(chan) != index or old_band != new_band) {
RFNOC_LOG_TRACE("Writing new RX gain index: " << index);
_cpld->set_gain_index(index, new_band, RX_DIRECTION);
@@ -398,13 +395,13 @@ void rhodium_radio_control_impl::_update_atr(
const auto rx_ant = (dir == RX_DIRECTION) ? ant : get_rx_antenna(0);
const auto tx_ant = (dir == TX_DIRECTION) ? ant : get_tx_antenna(0);
- const auto sw10_tx = _is_tx_lowband(get_tx_frequency(0)) ?
- SW10_FROMTXLOWBAND : SW10_FROMTXHIGHBAND;
+ const auto sw10_tx = _is_tx_lowband(get_tx_frequency(0)) ? SW10_FROMTXLOWBAND
+ : SW10_FROMTXHIGHBAND;
const uint32_t atr_idle = SW10_ISOLATION;
- const uint32_t atr_rx = [rx_ant]{
+ const uint32_t atr_rx = [rx_ant] {
if (rx_ant == "TX/RX") {
return SW10_TORX | LED_RX;
} else if (rx_ant == "RX2") {
@@ -414,8 +411,7 @@ void rhodium_radio_control_impl::_update_atr(
}
}();
- const uint32_t atr_tx = (tx_ant == "TX/RX") ?
- (sw10_tx | LED_TX) : SW10_ISOLATION;
+ const uint32_t atr_tx = (tx_ant == "TX/RX") ? (sw10_tx | LED_TX) : SW10_ISOLATION;
const uint32_t atr_dx = [tx_ant, rx_ant, sw10_tx] {
uint32_t sw10_return;
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_control.hpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_control.hpp
index 8cee33f17..4d2bc38ad 100644
--- a/host/lib/usrp/dboard/rhodium/rhodium_radio_control.hpp
+++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_control.hpp
@@ -71,8 +71,8 @@ public:
double set_rate(double rate);
// Setters
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
void set_tx_tune_args(const uhd::device_addr_t&, const size_t chan);
@@ -163,8 +163,10 @@ public:
* ??? calls
***********************************************************************/
// LO Distribution Control
- void set_tx_lo_output_enabled(const bool enabled, const std::string& port_name, const size_t chan);
- void set_rx_lo_output_enabled(const bool enabled, const std::string& port_name, const size_t chan);
+ void set_tx_lo_output_enabled(
+ const bool enabled, const std::string& port_name, const size_t chan);
+ void set_rx_lo_output_enabled(
+ const bool enabled, const std::string& port_name, const size_t chan);
bool get_tx_lo_output_enabled(const std::string& port_name, const size_t chan);
bool get_rx_lo_output_enabled(const std::string& port_name, const size_t chan);
@@ -172,27 +174,29 @@ public:
//! Set the external gain for a TX LO
// Out of range values will be coerced
- double set_tx_lo_gain(const double gain, const std::string &name, const size_t chan);
+ double set_tx_lo_gain(const double gain, const std::string& name, const size_t chan);
//! Set the external gain for an RX LO
// Out of range values will be coerced
- double set_rx_lo_gain(const double gain, const std::string &name, const size_t chan);
+ double set_rx_lo_gain(const double gain, const std::string& name, const size_t chan);
- double get_tx_lo_gain(const std::string &name, const size_t chan);
- double get_rx_lo_gain(const std::string &name, const size_t chan);
+ double get_tx_lo_gain(const std::string& name, const size_t chan);
+ double get_rx_lo_gain(const std::string& name, const size_t chan);
// LO Output Power Control
//! Set the output power setting of a TX LO
// Out of range values will be coerced
- double set_tx_lo_power(const double power, const std::string &name, const size_t chan);
+ double set_tx_lo_power(
+ const double power, const std::string& name, const size_t chan);
//! Set the output power setting of a RX LO
// Out of range values will be coerced
- double set_rx_lo_power(const double power, const std::string &name, const size_t chan);
+ double set_rx_lo_power(
+ const double power, const std::string& name, const size_t chan);
- double get_tx_lo_power(const std::string &name, const size_t chan);
- double get_rx_lo_power(const std::string &name, const size_t chan);
+ double get_tx_lo_power(const std::string& name, const size_t chan);
+ double get_rx_lo_power(const std::string& name, const size_t chan);
private:
@@ -239,42 +243,28 @@ private:
void _init_mpm_sensors(const direction_t dir, const size_t chan_idx);
//! Get the frequency range for an LO
- freq_range_t _get_lo_freq_range(const std::string &name) const;
+ freq_range_t _get_lo_freq_range(const std::string& name) const;
//! Get the current lowband intermediate frequency
double _get_lowband_lo_freq() const;
//! Configure LO1's export
- void _set_lo1_export_enabled(
- const bool enabled,
- const direction_t dir
- );
+ void _set_lo1_export_enabled(const bool enabled, const direction_t dir);
//! Validate that port_name is valid, and that LO distribution functions
// can be called in this instance
void _validate_output_port(
- const std::string& port_name,
- const std::string& function_name
- );
+ const std::string& port_name, const std::string& function_name);
//! Configure LO Distribution board's termination switches
void _set_lo_output_enabled(
- const bool enabled,
- const std::string& port_name,
- const direction_t dir
- );
+ const bool enabled, const std::string& port_name, const direction_t dir);
- bool _get_lo_output_enabled(
- const std::string& port_name,
- const direction_t dir
- );
+ bool _get_lo_output_enabled(const std::string& port_name, const direction_t dir);
//! Configure LO1's output power
// Out of range values will be coerced to [0-63]
- double _set_lo1_power(
- const double power,
- const direction_t dir
- );
+ double _set_lo1_power(const double power, const direction_t dir);
//! Flash all front end LEDs at 1 Hz for the specified amount of time
void _identify_with_leds(double identify_duration);
@@ -328,29 +318,21 @@ private:
* Frontend Controls
*************************************************************************/
- void _set_tx_fe_connection(const std::string &conn);
- void _set_rx_fe_connection(const std::string &conn);
+ void _set_tx_fe_connection(const std::string& conn);
+ void _set_rx_fe_connection(const std::string& conn);
std::string _get_tx_fe_connection() const;
std::string _get_rx_fe_connection() const;
/**************************************************************************
* CPLD Controls (implemented in rhodium_radio_ctrl_cpld.cpp)
*************************************************************************/
- void _update_rx_freq_switches(
- const double freq
- );
+ void _update_rx_freq_switches(const double freq);
- void _update_tx_freq_switches(
- const double freq
- );
+ void _update_tx_freq_switches(const double freq);
- void _update_rx_input_switches(
- const std::string &input
- );
+ void _update_rx_input_switches(const std::string& input);
- void _update_tx_output_switches(
- const std::string &output
- );
+ void _update_tx_output_switches(const std::string& output);
/**************************************************************************
* Private attributes
@@ -412,7 +394,7 @@ private:
//! Saved frontend connection for DSP core
std::string _rx_fe_connection;
std::string _tx_fe_connection;
- //! Desired RF frequency
+ //! Desired RF frequency
std::map<direction_t, double> _desired_rf_freq = {
{RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Frequency at which gain setting was last applied. The CPLD requires a new gain
@@ -446,8 +428,8 @@ private:
bool _lo_dist_present = false;
//! LO Distribution board output status
- bool _lo_dist_rx_out_enabled[4] = { false, false, false, false };
- bool _lo_dist_tx_out_enabled[4] = { false, false, false, false };
+ bool _lo_dist_rx_out_enabled[4] = {false, false, false, false};
+ bool _lo_dist_tx_out_enabled[4] = {false, false, false, false};
std::unordered_map<uhd::direction_t, uhd::device_addr_t, std::hash<size_t>>
_tune_args{{uhd::RX_DIRECTION, uhd::device_addr_t()},
@@ -477,4 +459,3 @@ private:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_RHODIUM_RADIO_CTRL_IMPL_HPP */
-
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
index 85ed3ddb7..3752a2e70 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
@@ -7,11 +7,11 @@
#include "twinrx_ctrl.hpp"
#include "twinrx_ids.hpp"
+#include <uhd/utils/math.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <uhdlib/usrp/common/adf435x.hpp>
#include <uhdlib/usrp/common/adf535x.hpp>
#include <uhdlib/utils/narrow.hpp>
-#include <uhd/utils/math.hpp>
-#include <uhd/utils/safe_call.hpp>
#include <chrono>
#include <thread>
@@ -20,39 +20,44 @@ using namespace usrp;
using namespace dboard::twinrx;
namespace {
- typedef twinrx_cpld_regmap rm;
-
- typedef enum { LO1, LO2 } lo_t;
+typedef twinrx_cpld_regmap rm;
- inline uint32_t bool2bin(bool x) { return x ? 1 : 0; }
+typedef enum { LO1, LO2 } lo_t;
- const double TWINRX_DESIRED_REFERENCE_FREQ = 50e6;
- const double TWINRX_REV_AB_PFD_FREQ = 6.25e6;
- const double TWINRX_REV_C_PFD_FREQ = 12.5e6;
- const double TWINRX_SPI_CLOCK_FREQ = 3e6;
+inline uint32_t bool2bin(bool x)
+{
+ return x ? 1 : 0;
}
-class twinrx_ctrl_impl : public twinrx_ctrl {
+const double TWINRX_DESIRED_REFERENCE_FREQ = 50e6;
+const double TWINRX_REV_AB_PFD_FREQ = 6.25e6;
+const double TWINRX_REV_C_PFD_FREQ = 12.5e6;
+const double TWINRX_SPI_CLOCK_FREQ = 3e6;
+} // namespace
+
+class twinrx_ctrl_impl : public twinrx_ctrl
+{
public:
- twinrx_ctrl_impl(
- dboard_iface::sptr db_iface,
+ twinrx_ctrl_impl(dboard_iface::sptr db_iface,
twinrx_gpio::sptr gpio_iface,
twinrx_cpld_regmap::sptr cpld_regmap,
- const dboard_id_t rx_id
- ) : _db_iface(db_iface), _gpio_iface(gpio_iface), _cpld_regs(cpld_regmap)
+ const dboard_id_t rx_id)
+ : _db_iface(db_iface), _gpio_iface(gpio_iface), _cpld_regs(cpld_regmap)
{
// SPI configuration
_spi_config.use_custom_divider = true;
_spi_config.divider = uhd::narrow_cast<size_t>(std::ceil(
_db_iface->get_codec_rate(dboard_iface::UNIT_TX) / TWINRX_SPI_CLOCK_FREQ));
- //Initialize dboard clocks
+ // Initialize dboard clocks
bool found_rate = false;
- for(double rate: _db_iface->get_clock_rates(dboard_iface::UNIT_TX)) {
- found_rate |= uhd::math::frequencies_are_equal(rate, TWINRX_DESIRED_REFERENCE_FREQ);
+ for (double rate : _db_iface->get_clock_rates(dboard_iface::UNIT_TX)) {
+ found_rate |=
+ uhd::math::frequencies_are_equal(rate, TWINRX_DESIRED_REFERENCE_FREQ);
}
- for(double rate: _db_iface->get_clock_rates(dboard_iface::UNIT_RX)) {
- found_rate |= uhd::math::frequencies_are_equal(rate, TWINRX_DESIRED_REFERENCE_FREQ);
+ for (double rate : _db_iface->get_clock_rates(dboard_iface::UNIT_RX)) {
+ found_rate |=
+ uhd::math::frequencies_are_equal(rate, TWINRX_DESIRED_REFERENCE_FREQ);
}
if (not found_rate) {
throw uhd::runtime_error("TwinRX not supported on this motherboard");
@@ -63,7 +68,7 @@ public:
_db_iface->set_clock_enabled(dboard_iface::UNIT_TX, true);
_db_iface->set_clock_enabled(dboard_iface::UNIT_RX, true);
- //Initialize default switch and attenuator states
+ // Initialize default switch and attenuator states
set_chan_enabled(BOTH, false, false);
set_preamp1(BOTH, PREAMP_BYPASS, false);
set_preamp2(BOTH, false, false);
@@ -82,7 +87,7 @@ public:
set_crossover_cal_mode(CAL_DISABLED, false);
_cpld_regs->flush();
- //Turn on power and wait for power good
+ // Turn on power and wait for power good
_gpio_iface->set_field(twinrx_gpio::FIELD_SWPS_EN, 1);
size_t timeout_ms = 100;
while (_gpio_iface->get_field(twinrx_gpio::FIELD_SWPS_PWR_GOOD) == 0) {
@@ -98,7 +103,7 @@ public:
_gpio_iface->set_field(twinrx_gpio::FIELD_LO2_CE_CH1, 1);
_gpio_iface->set_field(twinrx_gpio::FIELD_LO2_CE_CH2, 1);
- //Initialize synthesizers
+ // Initialize synthesizers
for (size_t i = 0; i < NUM_CHANS; i++) {
// LO1
if (rx_id == twinrx::TWINRX_REV_C_ID) {
@@ -108,8 +113,7 @@ public:
},
[this](uint32_t microseconds) {
_db_iface->sleep(boost::chrono::microseconds(microseconds));
- }
- );
+ });
_lo1_iface[i]->set_pfd_freq(TWINRX_REV_C_PFD_FREQ);
} else {
_lo1_iface[i] = adf535x_iface::make_adf5355(
@@ -118,8 +122,7 @@ public:
},
[this](uint32_t microseconds) {
_db_iface->sleep(boost::chrono::microseconds(microseconds));
- }
- );
+ });
_lo1_iface[i]->set_pfd_freq(TWINRX_REV_AB_PFD_FREQ);
}
_lo1_iface[i]->set_output_power(adf535x_iface::OUTPUT_POWER_5DBM);
@@ -128,11 +131,10 @@ public:
_lo1_iface[i]->set_frequency(3e9, 1.0e3);
// LO2
- _lo2_iface[i] = adf435x_iface::make_adf4351(
- [this](const std::vector<uint32_t>& regs) {
+ _lo2_iface[i] =
+ adf435x_iface::make_adf4351([this](const std::vector<uint32_t>& regs) {
_write_lo_spi(dboard_iface::UNIT_RX, regs);
- }
- );
+ });
_lo2_iface[i]->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
_lo2_iface[i]->set_output_power(adf435x_iface::OUTPUT_POWER_5DBM);
_lo2_iface[i]->set_reference_freq(TWINRX_DESIRED_REFERENCE_FREQ);
@@ -145,10 +147,8 @@ public:
~twinrx_ctrl_impl()
{
- UHD_SAFE_CALL(
- boost::lock_guard<boost::mutex> lock(_mutex);
- _gpio_iface->set_field(twinrx_gpio::FIELD_SWPS_EN, 0);
- )
+ UHD_SAFE_CALL(boost::lock_guard<boost::mutex> lock(_mutex);
+ _gpio_iface->set_field(twinrx_gpio::FIELD_SWPS_EN, 0);)
}
void commit()
@@ -171,80 +171,117 @@ public:
_cpld_regs->if0_reg0.set(rm::if0_reg0_t::AMP_LO2_EN_CH2, bool2bin(enabled));
_chan_enabled[size_t(CH2)] = enabled;
}
- _set_lo1_amp(_chan_enabled[size_t(CH1)], _chan_enabled[size_t(CH2)], _lo1_src[size_t(CH2)]);
- if (commit) _commit();
+ _set_lo1_amp(_chan_enabled[size_t(CH1)],
+ _chan_enabled[size_t(CH2)],
+ _lo1_src[size_t(CH2)]);
+ if (commit)
+ _commit();
}
void set_preamp1(channel_t ch, preamp_state_t value, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf0_reg1.set(rm::rf0_reg1_t::SWPA1_CTL_CH1, bool2bin(value==PREAMP_HIGHBAND));
- _cpld_regs->rf2_reg2.set(rm::rf2_reg2_t::SWPA2_CTRL_CH1, bool2bin(value==PREAMP_BYPASS));
- _cpld_regs->rf0_reg1.set(rm::rf0_reg1_t::HB_PREAMP_EN_CH1, bool2bin(value==PREAMP_HIGHBAND));
- _cpld_regs->rf0_reg1.set(rm::rf0_reg1_t::LB_PREAMP_EN_CH1, bool2bin(value==PREAMP_LOWBAND));
+ _cpld_regs->rf0_reg1.set(
+ rm::rf0_reg1_t::SWPA1_CTL_CH1, bool2bin(value == PREAMP_HIGHBAND));
+ _cpld_regs->rf2_reg2.set(
+ rm::rf2_reg2_t::SWPA2_CTRL_CH1, bool2bin(value == PREAMP_BYPASS));
+ _cpld_regs->rf0_reg1.set(
+ rm::rf0_reg1_t::HB_PREAMP_EN_CH1, bool2bin(value == PREAMP_HIGHBAND));
+ _cpld_regs->rf0_reg1.set(
+ rm::rf0_reg1_t::LB_PREAMP_EN_CH1, bool2bin(value == PREAMP_LOWBAND));
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf0_reg7.set(rm::rf0_reg7_t::SWPA1_CTRL_CH2, bool2bin(value==PREAMP_HIGHBAND));
- _cpld_regs->rf2_reg5.set(rm::rf2_reg5_t::SWPA2_CTRL_CH2, bool2bin(value==PREAMP_BYPASS));
- _cpld_regs->rf0_reg5.set(rm::rf0_reg5_t::HB_PREAMP_EN_CH2, bool2bin(value==PREAMP_HIGHBAND));
- _cpld_regs->rf2_reg6.set(rm::rf2_reg6_t::LB_PREAMP_EN_CH2, bool2bin(value==PREAMP_LOWBAND));
- }
- if (commit) _commit();
+ _cpld_regs->rf0_reg7.set(
+ rm::rf0_reg7_t::SWPA1_CTRL_CH2, bool2bin(value == PREAMP_HIGHBAND));
+ _cpld_regs->rf2_reg5.set(
+ rm::rf2_reg5_t::SWPA2_CTRL_CH2, bool2bin(value == PREAMP_BYPASS));
+ _cpld_regs->rf0_reg5.set(
+ rm::rf0_reg5_t::HB_PREAMP_EN_CH2, bool2bin(value == PREAMP_HIGHBAND));
+ _cpld_regs->rf2_reg6.set(
+ rm::rf2_reg6_t::LB_PREAMP_EN_CH2, bool2bin(value == PREAMP_LOWBAND));
+ }
+ if (commit)
+ _commit();
}
void set_preamp2(channel_t ch, bool enabled, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf2_reg7.set(rm::rf2_reg7_t::SWPA4_CTRL_CH1, bool2bin(not enabled));
+ _cpld_regs->rf2_reg7.set(
+ rm::rf2_reg7_t::SWPA4_CTRL_CH1, bool2bin(not enabled));
_cpld_regs->rf2_reg3.set(rm::rf2_reg3_t::PREAMP2_EN_CH1, bool2bin(enabled));
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf0_reg6.set(rm::rf0_reg6_t::SWPA4_CTRL_CH2, bool2bin(not enabled));
+ _cpld_regs->rf0_reg6.set(
+ rm::rf0_reg6_t::SWPA4_CTRL_CH2, bool2bin(not enabled));
_cpld_regs->rf1_reg6.set(rm::rf1_reg6_t::PREAMP2_EN_CH2, bool2bin(enabled));
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lb_preamp_preselector(channel_t ch, bool enabled, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf0_reg7.set(rm::rf0_reg7_t::SWPA3_CTRL_CH1, bool2bin(not enabled));
+ _cpld_regs->rf0_reg7.set(
+ rm::rf0_reg7_t::SWPA3_CTRL_CH1, bool2bin(not enabled));
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf0_reg1.set(rm::rf0_reg1_t::SWPA3_CTRL_CH2, bool2bin(not enabled));
+ _cpld_regs->rf0_reg1.set(
+ rm::rf0_reg1_t::SWPA3_CTRL_CH2, bool2bin(not enabled));
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_signal_path(channel_t ch, signal_path_t path, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf2_reg2.set(rm::rf2_reg2_t::SW11_CTRL_CH1, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->rf1_reg2.set(rm::rf1_reg2_t::SW12_CTRL_CH1, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->rf1_reg6.set(rm::rf1_reg6_t::HB_PRESEL_PGA_EN_CH1, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::SW6_CTRL_CH1, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->if0_reg3.set(rm::if0_reg3_t::SW13_CTRL_CH1, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->if0_reg2.set(rm::if0_reg2_t::AMP_LB_IF1_EN_CH1, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->if0_reg0.set(rm::if0_reg0_t::AMP_HB_IF1_EN_CH1, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf1_reg2.set(rm::rf1_reg2_t::AMP_HB_EN_CH1, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf2_reg2.set(rm::rf2_reg2_t::AMP_LB_EN_CH1, bool2bin(path==PATH_LOWBAND));
+ _cpld_regs->rf2_reg2.set(
+ rm::rf2_reg2_t::SW11_CTRL_CH1, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->rf1_reg2.set(
+ rm::rf1_reg2_t::SW12_CTRL_CH1, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->rf1_reg6.set(
+ rm::rf1_reg6_t::HB_PRESEL_PGA_EN_CH1, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf0_reg2.set(
+ rm::rf0_reg2_t::SW6_CTRL_CH1, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->if0_reg3.set(
+ rm::if0_reg3_t::SW13_CTRL_CH1, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->if0_reg2.set(
+ rm::if0_reg2_t::AMP_LB_IF1_EN_CH1, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->if0_reg0.set(
+ rm::if0_reg0_t::AMP_HB_IF1_EN_CH1, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf1_reg2.set(
+ rm::rf1_reg2_t::AMP_HB_EN_CH1, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf2_reg2.set(
+ rm::rf2_reg2_t::AMP_LB_EN_CH1, bool2bin(path == PATH_LOWBAND));
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf2_reg7.set(rm::rf2_reg7_t::SW11_CTRL_CH2, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->rf1_reg7.set(rm::rf1_reg7_t::SW12_CTRL_CH2, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->rf1_reg2.set(rm::rf1_reg2_t::HB_PRESEL_PGA_EN_CH2, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf0_reg6.set(rm::rf0_reg6_t::SW6_CTRL_CH2, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->if0_reg6.set(rm::if0_reg6_t::SW13_CTRL_CH2, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->if0_reg2.set(rm::if0_reg2_t::AMP_LB_IF1_EN_CH2, bool2bin(path==PATH_LOWBAND));
- _cpld_regs->if0_reg6.set(rm::if0_reg6_t::AMP_HB_IF1_EN_CH2, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf1_reg7.set(rm::rf1_reg7_t::AMP_HB_EN_CH2, bool2bin(path==PATH_HIGHBAND));
- _cpld_regs->rf2_reg7.set(rm::rf2_reg7_t::AMP_LB_EN_CH2, bool2bin(path==PATH_LOWBAND));
- }
- if (commit) _commit();
+ _cpld_regs->rf2_reg7.set(
+ rm::rf2_reg7_t::SW11_CTRL_CH2, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->rf1_reg7.set(
+ rm::rf1_reg7_t::SW12_CTRL_CH2, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->rf1_reg2.set(
+ rm::rf1_reg2_t::HB_PRESEL_PGA_EN_CH2, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf0_reg6.set(
+ rm::rf0_reg6_t::SW6_CTRL_CH2, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->if0_reg6.set(
+ rm::if0_reg6_t::SW13_CTRL_CH2, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->if0_reg2.set(
+ rm::if0_reg2_t::AMP_LB_IF1_EN_CH2, bool2bin(path == PATH_LOWBAND));
+ _cpld_regs->if0_reg6.set(
+ rm::if0_reg6_t::AMP_HB_IF1_EN_CH2, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf1_reg7.set(
+ rm::rf1_reg7_t::AMP_HB_EN_CH2, bool2bin(path == PATH_HIGHBAND));
+ _cpld_regs->rf2_reg7.set(
+ rm::rf2_reg7_t::AMP_LB_EN_CH2, bool2bin(path == PATH_LOWBAND));
+ }
+ if (commit)
+ _commit();
}
void set_lb_preselector(channel_t ch, preselector_path_t path, bool commit = true)
@@ -252,11 +289,24 @@ public:
boost::lock_guard<boost::mutex> lock(_mutex);
uint32_t sw7val = 0, sw8val = 0;
switch (path) {
- case PRESEL_PATH1: sw7val = 3; sw8val = 1; break;
- case PRESEL_PATH2: sw7val = 2; sw8val = 0; break;
- case PRESEL_PATH3: sw7val = 0; sw8val = 2; break;
- case PRESEL_PATH4: sw7val = 1; sw8val = 3; break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ case PRESEL_PATH1:
+ sw7val = 3;
+ sw8val = 1;
+ break;
+ case PRESEL_PATH2:
+ sw7val = 2;
+ sw8val = 0;
+ break;
+ case PRESEL_PATH3:
+ sw7val = 0;
+ sw8val = 2;
+ break;
+ case PRESEL_PATH4:
+ sw7val = 1;
+ sw8val = 3;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
if (ch == CH1 or ch == BOTH) {
_cpld_regs->rf0_reg3.set(rm::rf0_reg3_t::SW7_CTRL_CH1, sw7val);
@@ -266,7 +316,8 @@ public:
_cpld_regs->rf0_reg7.set(rm::rf0_reg7_t::SW7_CTRL_CH2, sw7val);
_cpld_regs->rf2_reg7.set(rm::rf2_reg7_t::SW8_CTRL_CH2, sw8val);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_hb_preselector(channel_t ch, preselector_path_t path, bool commit = true)
@@ -274,11 +325,32 @@ public:
boost::lock_guard<boost::mutex> lock(_mutex);
uint32_t sw9ch1val = 0, sw10ch1val = 0, sw9ch2val = 0, sw10ch2val = 0;
switch (path) {
- case PRESEL_PATH1: sw9ch1val = 3; sw10ch1val = 0; sw9ch2val = 0; sw10ch2val = 3; break;
- case PRESEL_PATH2: sw9ch1val = 1; sw10ch1val = 2; sw9ch2val = 1; sw10ch2val = 1; break;
- case PRESEL_PATH3: sw9ch1val = 2; sw10ch1val = 1; sw9ch2val = 2; sw10ch2val = 2; break;
- case PRESEL_PATH4: sw9ch1val = 0; sw10ch1val = 3; sw9ch2val = 3; sw10ch2val = 0; break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ case PRESEL_PATH1:
+ sw9ch1val = 3;
+ sw10ch1val = 0;
+ sw9ch2val = 0;
+ sw10ch2val = 3;
+ break;
+ case PRESEL_PATH2:
+ sw9ch1val = 1;
+ sw10ch1val = 2;
+ sw9ch2val = 1;
+ sw10ch2val = 1;
+ break;
+ case PRESEL_PATH3:
+ sw9ch1val = 2;
+ sw10ch1val = 1;
+ sw9ch2val = 2;
+ sw10ch2val = 2;
+ break;
+ case PRESEL_PATH4:
+ sw9ch1val = 0;
+ sw10ch1val = 3;
+ sw9ch2val = 3;
+ sw10ch2val = 0;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
if (ch == CH1 or ch == BOTH) {
_cpld_regs->rf0_reg5.set(rm::rf0_reg5_t::SW9_CTRL_CH1, sw9ch1val);
@@ -288,104 +360,129 @@ public:
_cpld_regs->rf0_reg3.set(rm::rf0_reg3_t::SW9_CTRL_CH2, sw9ch2val);
_cpld_regs->rf1_reg7.set(rm::rf1_reg7_t::SW10_CTRL_CH2, sw10ch2val);
}
- if (commit) _commit();
-
+ if (commit)
+ _commit();
}
void set_input_atten(channel_t ch, uint8_t atten, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf0_reg0.set(rm::rf0_reg0_t::ATTEN_IN_CH1, atten&0x1F);
+ _cpld_regs->rf0_reg0.set(rm::rf0_reg0_t::ATTEN_IN_CH1, atten & 0x1F);
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf0_reg4.set(rm::rf0_reg4_t::ATTEN_IN_CH2, atten&0x1F);
+ _cpld_regs->rf0_reg4.set(rm::rf0_reg4_t::ATTEN_IN_CH2, atten & 0x1F);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lb_atten(channel_t ch, uint8_t atten, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf2_reg0.set(rm::rf2_reg0_t::ATTEN_LB_CH1, atten&0x1F);
+ _cpld_regs->rf2_reg0.set(rm::rf2_reg0_t::ATTEN_LB_CH1, atten & 0x1F);
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf2_reg4.set(rm::rf2_reg4_t::ATTEN_LB_CH2, atten&0x1F);
+ _cpld_regs->rf2_reg4.set(rm::rf2_reg4_t::ATTEN_LB_CH2, atten & 0x1F);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_hb_atten(channel_t ch, uint8_t atten, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf1_reg0.set(rm::rf1_reg0_t::ATTEN_HB_CH1, atten&0x1F);
+ _cpld_regs->rf1_reg0.set(rm::rf1_reg0_t::ATTEN_HB_CH1, atten & 0x1F);
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf1_reg4.set(rm::rf1_reg4_t::ATTEN_HB_CH2, atten&0x1F);
+ _cpld_regs->rf1_reg4.set(rm::rf1_reg4_t::ATTEN_HB_CH2, atten & 0x1F);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lo1_source(channel_t ch, lo_source_t source, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->rf1_reg5.set(rm::rf1_reg5_t::SW14_CTRL_CH2, bool2bin(source!=LO_COMPANION));
- _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::SW15_CTRL_CH1, bool2bin(source==LO_EXTERNAL||source==LO_REIMPORT));
- _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::SW16_CTRL_CH1, bool2bin(source!=LO_INTERNAL));
+ _cpld_regs->rf1_reg5.set(
+ rm::rf1_reg5_t::SW14_CTRL_CH2, bool2bin(source != LO_COMPANION));
+ _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::SW15_CTRL_CH1,
+ bool2bin(source == LO_EXTERNAL || source == LO_REIMPORT));
+ _cpld_regs->rf1_reg1.set(
+ rm::rf1_reg1_t::SW16_CTRL_CH1, bool2bin(source != LO_INTERNAL));
_lo1_src[size_t(CH1)] = source;
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::SW14_CTRL_CH1, bool2bin(source==LO_COMPANION));
- _cpld_regs->rf1_reg5.set(rm::rf1_reg5_t::SW15_CTRL_CH2, bool2bin(source!=LO_INTERNAL));
- _cpld_regs->rf1_reg6.set(rm::rf1_reg6_t::SW16_CTRL_CH2, bool2bin(source==LO_INTERNAL));
+ _cpld_regs->rf1_reg1.set(
+ rm::rf1_reg1_t::SW14_CTRL_CH1, bool2bin(source == LO_COMPANION));
+ _cpld_regs->rf1_reg5.set(
+ rm::rf1_reg5_t::SW15_CTRL_CH2, bool2bin(source != LO_INTERNAL));
+ _cpld_regs->rf1_reg6.set(
+ rm::rf1_reg6_t::SW16_CTRL_CH2, bool2bin(source == LO_INTERNAL));
_lo1_src[size_t(CH2)] = source;
- _set_lo1_amp(_chan_enabled[size_t(CH1)], _chan_enabled[size_t(CH2)], _lo1_src[size_t(CH2)]);
+ _set_lo1_amp(_chan_enabled[size_t(CH1)],
+ _chan_enabled[size_t(CH2)],
+ _lo1_src[size_t(CH2)]);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lo2_source(channel_t ch, lo_source_t source, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (ch == CH1 or ch == BOTH) {
- _cpld_regs->if0_reg0.set(rm::if0_reg0_t::SW19_CTRL_CH2, bool2bin(source==LO_COMPANION));
- _cpld_regs->if0_reg1.set(rm::if0_reg1_t::SW20_CTRL_CH1, bool2bin(source==LO_COMPANION));
- _cpld_regs->if0_reg4.set(rm::if0_reg4_t::SW21_CTRL_CH1, bool2bin(source==LO_INTERNAL));
+ _cpld_regs->if0_reg0.set(
+ rm::if0_reg0_t::SW19_CTRL_CH2, bool2bin(source == LO_COMPANION));
+ _cpld_regs->if0_reg1.set(
+ rm::if0_reg1_t::SW20_CTRL_CH1, bool2bin(source == LO_COMPANION));
+ _cpld_regs->if0_reg4.set(
+ rm::if0_reg4_t::SW21_CTRL_CH1, bool2bin(source == LO_INTERNAL));
_lo2_src[size_t(CH1)] = source;
}
if (ch == CH2 or ch == BOTH) {
- _cpld_regs->if0_reg4.set(rm::if0_reg4_t::SW19_CTRL_CH1, bool2bin(source==LO_EXTERNAL||source==LO_REIMPORT));
- _cpld_regs->if0_reg0.set(rm::if0_reg0_t::SW20_CTRL_CH2, bool2bin(source==LO_INTERNAL||source==LO_DISABLED));
- _cpld_regs->if0_reg4.set(rm::if0_reg4_t::SW21_CTRL_CH2, bool2bin(source==LO_INTERNAL));
+ _cpld_regs->if0_reg4.set(rm::if0_reg4_t::SW19_CTRL_CH1,
+ bool2bin(source == LO_EXTERNAL || source == LO_REIMPORT));
+ _cpld_regs->if0_reg0.set(rm::if0_reg0_t::SW20_CTRL_CH2,
+ bool2bin(source == LO_INTERNAL || source == LO_DISABLED));
+ _cpld_regs->if0_reg4.set(
+ rm::if0_reg4_t::SW21_CTRL_CH2, bool2bin(source == LO_INTERNAL));
_lo2_src[size_t(CH2)] = source;
}
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lo1_export_source(lo_export_source_t source, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
- //SW22 may conflict with the cal switch but this attr takes priority and we assume
- //that the cal switch is disabled (by disabling it!)
+ // SW22 may conflict with the cal switch but this attr takes priority and we
+ // assume that the cal switch is disabled (by disabling it!)
_set_cal_mode(CAL_DISABLED, source);
- _cpld_regs->rf1_reg3.set(rm::rf1_reg3_t::SW23_CTRL, bool2bin(source!=LO_CH1_SYNTH));
+ _cpld_regs->rf1_reg3.set(
+ rm::rf1_reg3_t::SW23_CTRL, bool2bin(source != LO_CH1_SYNTH));
_lo1_export = source;
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_lo2_export_source(lo_export_source_t source, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
- _cpld_regs->if0_reg7.set(rm::if0_reg7_t::SW24_CTRL_CH2, bool2bin(source==LO_CH2_SYNTH));
- _cpld_regs->if0_reg4.set(rm::if0_reg4_t::SW25_CTRL, bool2bin(source!=LO_CH1_SYNTH));
- _cpld_regs->if0_reg3.set(rm::if0_reg3_t::SW24_CTRL_CH1, bool2bin(source!=LO_CH1_SYNTH));
+ _cpld_regs->if0_reg7.set(
+ rm::if0_reg7_t::SW24_CTRL_CH2, bool2bin(source == LO_CH2_SYNTH));
+ _cpld_regs->if0_reg4.set(
+ rm::if0_reg4_t::SW25_CTRL, bool2bin(source != LO_CH1_SYNTH));
+ _cpld_regs->if0_reg3.set(
+ rm::if0_reg3_t::SW24_CTRL_CH1, bool2bin(source != LO_CH1_SYNTH));
_lo2_export = source;
- if (commit) _commit();
+ if (commit)
+ _commit();
}
void set_antenna_mapping(antenna_mapping_t mapping, bool commit = true)
@@ -396,40 +493,60 @@ public:
switch_path_t path1, path2;
switch (mapping) {
- case ANTX_NATIVE:
- path1 = CONNECT; path2 = CONNECT; break;
- case ANT1_SHARED:
- path1 = EXPORT; path2 = IMPORT; break;
- case ANT2_SHARED:
- path1 = IMPORT; path2 = EXPORT; break;
- case ANTX_SWAPPED:
- path1 = SWAP; path2 = SWAP; break;
- default:
- path1 = TERM; path2 = TERM; break;
- }
-
- _cpld_regs->rf0_reg5.set(rm::rf0_reg5_t::SW3_CTRL_CH1, bool2bin(path1==EXPORT||path1==SWAP));
- _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::SW4_CTRL_CH1, bool2bin(!(path1==IMPORT||path1==SWAP)));
- _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::SW5_CTRL_CH1, bool2bin(path1==CONNECT));
- _cpld_regs->rf0_reg7.set(rm::rf0_reg7_t::SW3_CTRL_CH2, bool2bin(path2==EXPORT||path2==SWAP));
- _cpld_regs->rf0_reg6.set(rm::rf0_reg6_t::SW4_CTRL_CH2, bool2bin(path2==IMPORT||path2==SWAP));
- _cpld_regs->rf0_reg6.set(rm::rf0_reg6_t::SW5_CTRL_CH2, bool2bin(path2==CONNECT));
-
- if (commit) _commit();
+ case ANTX_NATIVE:
+ path1 = CONNECT;
+ path2 = CONNECT;
+ break;
+ case ANT1_SHARED:
+ path1 = EXPORT;
+ path2 = IMPORT;
+ break;
+ case ANT2_SHARED:
+ path1 = IMPORT;
+ path2 = EXPORT;
+ break;
+ case ANTX_SWAPPED:
+ path1 = SWAP;
+ path2 = SWAP;
+ break;
+ default:
+ path1 = TERM;
+ path2 = TERM;
+ break;
+ }
+
+ _cpld_regs->rf0_reg5.set(
+ rm::rf0_reg5_t::SW3_CTRL_CH1, bool2bin(path1 == EXPORT || path1 == SWAP));
+ _cpld_regs->rf0_reg2.set(
+ rm::rf0_reg2_t::SW4_CTRL_CH1, bool2bin(!(path1 == IMPORT || path1 == SWAP)));
+ _cpld_regs->rf0_reg2.set(
+ rm::rf0_reg2_t::SW5_CTRL_CH1, bool2bin(path1 == CONNECT));
+ _cpld_regs->rf0_reg7.set(
+ rm::rf0_reg7_t::SW3_CTRL_CH2, bool2bin(path2 == EXPORT || path2 == SWAP));
+ _cpld_regs->rf0_reg6.set(
+ rm::rf0_reg6_t::SW4_CTRL_CH2, bool2bin(path2 == IMPORT || path2 == SWAP));
+ _cpld_regs->rf0_reg6.set(
+ rm::rf0_reg6_t::SW5_CTRL_CH2, bool2bin(path2 == CONNECT));
+
+ if (commit)
+ _commit();
}
void set_crossover_cal_mode(cal_mode_t cal_mode, bool commit = true)
{
boost::lock_guard<boost::mutex> lock(_mutex);
if (_lo1_export == LO_CH1_SYNTH && cal_mode == CAL_CH2) {
- throw uhd::runtime_error("cannot enable cal crossover on CH2 when LO1 in CH1 is exported");
+ throw uhd::runtime_error(
+ "cannot enable cal crossover on CH2 when LO1 in CH1 is exported");
}
if (_lo1_export == LO_CH2_SYNTH && cal_mode == CAL_CH1) {
- throw uhd::runtime_error("cannot enable cal crossover on CH1 when LO1 in CH2 is exported");
+ throw uhd::runtime_error(
+ "cannot enable cal crossover on CH1 when LO1 in CH2 is exported");
}
_set_cal_mode(cal_mode, _lo1_export);
- if (commit) _commit();
+ if (commit)
+ _commit();
}
double set_lo1_synth_freq(channel_t ch, double freq, bool commit = true)
@@ -439,15 +556,18 @@ public:
double coerced_freq = 0.0;
if (ch == CH1 or ch == BOTH) {
- coerced_freq = _lo1_iface[size_t(CH1)]->set_frequency(freq, RESOLUTION, false);
+ coerced_freq =
+ _lo1_iface[size_t(CH1)]->set_frequency(freq, RESOLUTION, false);
_lo1_freq[size_t(CH1)] = tune_freq_t(freq);
}
if (ch == CH2 or ch == BOTH) {
- coerced_freq = _lo1_iface[size_t(CH2)]->set_frequency(freq, RESOLUTION, false);
+ coerced_freq =
+ _lo1_iface[size_t(CH2)]->set_frequency(freq, RESOLUTION, false);
_lo1_freq[size_t(CH2)] = tune_freq_t(freq);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
return coerced_freq;
}
@@ -465,7 +585,8 @@ public:
_lo2_freq[size_t(CH2)] = tune_freq_t(freq);
}
- if (commit) _commit();
+ if (commit)
+ _commit();
return coerced_freq;
}
@@ -525,10 +646,12 @@ public:
bool locked = true;
if (ch == CH1 or ch == BOTH) {
- locked = locked && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO1_MUXOUT_CH1) == 1);
+ locked = locked
+ && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO1_MUXOUT_CH1) == 1);
}
if (ch == CH2 or ch == BOTH) {
- locked = locked && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO1_MUXOUT_CH2) == 1);
+ locked = locked
+ && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO1_MUXOUT_CH2) == 1);
}
return locked;
}
@@ -539,102 +662,124 @@ public:
bool locked = true;
if (ch == CH1 or ch == BOTH) {
- locked = locked && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO2_MUXOUT_CH1) == 1);
+ locked = locked
+ && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO2_MUXOUT_CH1) == 1);
}
if (ch == CH2 or ch == BOTH) {
- locked = locked && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO2_MUXOUT_CH2) == 1);
+ locked = locked
+ && (_gpio_iface->get_field(twinrx_gpio::FIELD_LO2_MUXOUT_CH2) == 1);
}
return locked;
}
-private: //Functions
+private: // Functions
void _set_cal_mode(cal_mode_t cal_mode, lo_export_source_t lo1_export_src)
{
- _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::SW17_CTRL_CH1, bool2bin(cal_mode!=CAL_CH1));
- _cpld_regs->rf1_reg6.set(rm::rf1_reg6_t::SW17_CTRL_CH2, bool2bin(cal_mode!=CAL_CH2));
- _cpld_regs->rf1_reg5.set(rm::rf1_reg5_t::SW18_CTRL_CH1, bool2bin(cal_mode!=CAL_CH1));
- _cpld_regs->rf2_reg3.set(rm::rf2_reg3_t::SW18_CTRL_CH2, bool2bin(cal_mode!=CAL_CH2));
- _cpld_regs->rf1_reg3.set(rm::rf1_reg3_t::SW22_CTRL_CH1, bool2bin((lo1_export_src!=LO_CH1_SYNTH)||(cal_mode==CAL_CH1)));
- _cpld_regs->rf1_reg7.set(rm::rf1_reg7_t::SW22_CTRL_CH2, bool2bin((lo1_export_src!=LO_CH2_SYNTH)||(cal_mode==CAL_CH2)));
+ _cpld_regs->rf1_reg1.set(
+ rm::rf1_reg1_t::SW17_CTRL_CH1, bool2bin(cal_mode != CAL_CH1));
+ _cpld_regs->rf1_reg6.set(
+ rm::rf1_reg6_t::SW17_CTRL_CH2, bool2bin(cal_mode != CAL_CH2));
+ _cpld_regs->rf1_reg5.set(
+ rm::rf1_reg5_t::SW18_CTRL_CH1, bool2bin(cal_mode != CAL_CH1));
+ _cpld_regs->rf2_reg3.set(
+ rm::rf2_reg3_t::SW18_CTRL_CH2, bool2bin(cal_mode != CAL_CH2));
+ _cpld_regs->rf1_reg3.set(rm::rf1_reg3_t::SW22_CTRL_CH1,
+ bool2bin((lo1_export_src != LO_CH1_SYNTH) || (cal_mode == CAL_CH1)));
+ _cpld_regs->rf1_reg7.set(rm::rf1_reg7_t::SW22_CTRL_CH2,
+ bool2bin((lo1_export_src != LO_CH2_SYNTH) || (cal_mode == CAL_CH2)));
}
void _set_lo1_amp(bool ch1_enabled, bool ch2_enabled, lo_source_t ch2_lo1_src)
{
// AMP_LO1_EN_CH1 also controls the amp for the external LO1 port,
// which could be in use by ch2
- _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::AMP_LO1_EN_CH1, bool2bin(
- ch1_enabled || (ch2_enabled && (ch2_lo1_src == LO_EXTERNAL || ch2_lo1_src == LO_REIMPORT))));
+ _cpld_regs->rf1_reg1.set(rm::rf1_reg1_t::AMP_LO1_EN_CH1,
+ bool2bin(
+ ch1_enabled
+ || (ch2_enabled
+ && (ch2_lo1_src == LO_EXTERNAL || ch2_lo1_src == LO_REIMPORT))));
}
void _config_lo_route(lo_t lo, channel_t channel)
{
- //Route SPI LEs through CPLD (will not assert them)
- _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::LO1_LE_CH1, bool2bin(lo == LO1 and (channel == CH1 or channel == BOTH)));
- _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::LO1_LE_CH2, bool2bin(lo == LO1 and (channel == CH2 or channel == BOTH)));
+ // Route SPI LEs through CPLD (will not assert them)
+ _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::LO1_LE_CH1,
+ bool2bin(lo == LO1 and (channel == CH1 or channel == BOTH)));
+ _cpld_regs->rf0_reg2.set(rm::rf0_reg2_t::LO1_LE_CH2,
+ bool2bin(lo == LO1 and (channel == CH2 or channel == BOTH)));
_cpld_regs->rf0_reg2.flush();
- _cpld_regs->if0_reg2.set(rm::if0_reg2_t::LO2_LE_CH1, bool2bin(lo == LO2 and (channel == CH1 or channel == BOTH)));
- _cpld_regs->if0_reg2.set(rm::if0_reg2_t::LO2_LE_CH2, bool2bin(lo == LO2 and (channel == CH2 or channel == BOTH)));
+ _cpld_regs->if0_reg2.set(rm::if0_reg2_t::LO2_LE_CH1,
+ bool2bin(lo == LO2 and (channel == CH1 or channel == BOTH)));
+ _cpld_regs->if0_reg2.set(rm::if0_reg2_t::LO2_LE_CH2,
+ bool2bin(lo == LO2 and (channel == CH2 or channel == BOTH)));
_cpld_regs->if0_reg2.flush();
}
- void _write_lo_spi(dboard_iface::unit_t unit, const std::vector<uint32_t> &regs)
+ void _write_lo_spi(dboard_iface::unit_t unit, const std::vector<uint32_t>& regs)
{
- for(uint32_t reg: regs) {
+ for (uint32_t reg : regs) {
_db_iface->write_spi(unit, _spi_config, reg, 32);
}
}
void _commit()
{
- //Commit everything except the LO synthesizers
+ // Commit everything except the LO synthesizers
_cpld_regs->flush();
// Disable unused LO synthesizers
- _lo1_enable[size_t(CH1)] = _lo1_src[size_t(CH1)] == LO_INTERNAL ||
- _lo1_src[size_t(CH2)] == LO_COMPANION ||
- _lo1_export == LO_CH1_SYNTH;
-
- _lo1_enable[size_t(CH2)] = _lo1_src[size_t(CH2)] == LO_INTERNAL ||
- _lo1_src[size_t(CH1)] == LO_COMPANION ||
- _lo1_export == LO_CH2_SYNTH;
- _lo2_enable[size_t(CH1)] = _lo2_src[size_t(CH1)] == LO_INTERNAL ||
- _lo2_src[size_t(CH2)] == LO_COMPANION ||
- _lo2_export == LO_CH1_SYNTH;
-
- _lo2_enable[size_t(CH2)] = _lo2_src[size_t(CH2)] == LO_INTERNAL ||
- _lo2_src[size_t(CH1)] == LO_COMPANION ||
- _lo2_export == LO_CH2_SYNTH;
-
- _lo1_iface[size_t(CH1)]->set_output_enable(adf535x_iface::RF_OUTPUT_A, _lo1_enable[size_t(CH1)].get());
- _lo1_iface[size_t(CH2)]->set_output_enable(adf535x_iface::RF_OUTPUT_A, _lo1_enable[size_t(CH2)].get());
-
- _lo2_iface[size_t(CH1)]->set_output_enable(adf435x_iface::RF_OUTPUT_A, _lo2_enable[size_t(CH1)].get());
- _lo2_iface[size_t(CH2)]->set_output_enable(adf435x_iface::RF_OUTPUT_A, _lo2_enable[size_t(CH2)].get());
-
- //Commit LO1 frequency
- // Commit Channel 1's settings to both channels simultaneously if the frequency is the same.
- bool simultaneous_commit_lo1 = _lo1_freq[size_t(CH1)].is_dirty() and
- _lo1_freq[size_t(CH2)].is_dirty() and
- _lo1_freq[size_t(CH1)].get() == _lo1_freq[size_t(CH2)].get() and
- _lo1_enable[size_t(CH1)].get() == _lo1_enable[size_t(CH2)].get();
+ _lo1_enable[size_t(CH1)] = _lo1_src[size_t(CH1)] == LO_INTERNAL
+ || _lo1_src[size_t(CH2)] == LO_COMPANION
+ || _lo1_export == LO_CH1_SYNTH;
+
+ _lo1_enable[size_t(CH2)] = _lo1_src[size_t(CH2)] == LO_INTERNAL
+ || _lo1_src[size_t(CH1)] == LO_COMPANION
+ || _lo1_export == LO_CH2_SYNTH;
+ _lo2_enable[size_t(CH1)] = _lo2_src[size_t(CH1)] == LO_INTERNAL
+ || _lo2_src[size_t(CH2)] == LO_COMPANION
+ || _lo2_export == LO_CH1_SYNTH;
+
+ _lo2_enable[size_t(CH2)] = _lo2_src[size_t(CH2)] == LO_INTERNAL
+ || _lo2_src[size_t(CH1)] == LO_COMPANION
+ || _lo2_export == LO_CH2_SYNTH;
+
+ _lo1_iface[size_t(CH1)]->set_output_enable(
+ adf535x_iface::RF_OUTPUT_A, _lo1_enable[size_t(CH1)].get());
+ _lo1_iface[size_t(CH2)]->set_output_enable(
+ adf535x_iface::RF_OUTPUT_A, _lo1_enable[size_t(CH2)].get());
+
+ _lo2_iface[size_t(CH1)]->set_output_enable(
+ adf435x_iface::RF_OUTPUT_A, _lo2_enable[size_t(CH1)].get());
+ _lo2_iface[size_t(CH2)]->set_output_enable(
+ adf435x_iface::RF_OUTPUT_A, _lo2_enable[size_t(CH2)].get());
+
+ // Commit LO1 frequency
+ // Commit Channel 1's settings to both channels simultaneously if the frequency is
+ // the same.
+ bool simultaneous_commit_lo1 =
+ _lo1_freq[size_t(CH1)].is_dirty() and _lo1_freq[size_t(CH2)].is_dirty()
+ and _lo1_freq[size_t(CH1)].get() == _lo1_freq[size_t(CH2)].get()
+ and _lo1_enable[size_t(CH1)].get() == _lo1_enable[size_t(CH2)].get();
if (simultaneous_commit_lo1) {
_config_lo_route(LO1, BOTH);
- //Only commit one of the channels. The route LO_CONFIG_BOTH
- //will ensure that the LEs for both channels are enabled
+ // Only commit one of the channels. The route LO_CONFIG_BOTH
+ // will ensure that the LEs for both channels are enabled
_lo1_iface[size_t(CH1)]->commit();
_lo1_freq[size_t(CH1)].mark_clean();
_lo1_freq[size_t(CH2)].mark_clean();
_lo1_enable[size_t(CH1)].mark_clean();
_lo1_enable[size_t(CH2)].mark_clean();
} else {
- if (_lo1_freq[size_t(CH1)].is_dirty() || _lo1_enable[size_t(CH1)].is_dirty()) {
+ if (_lo1_freq[size_t(CH1)].is_dirty()
+ || _lo1_enable[size_t(CH1)].is_dirty()) {
_config_lo_route(LO1, CH1);
_lo1_iface[size_t(CH1)]->commit();
_lo1_freq[size_t(CH1)].mark_clean();
_lo1_enable[size_t(CH1)].mark_clean();
}
- if (_lo1_freq[size_t(CH2)].is_dirty() || _lo1_enable[size_t(CH2)].is_dirty()) {
+ if (_lo1_freq[size_t(CH2)].is_dirty()
+ || _lo1_enable[size_t(CH2)].is_dirty()) {
_config_lo_route(LO1, CH2);
_lo1_iface[size_t(CH2)]->commit();
_lo1_freq[size_t(CH2)].mark_clean();
@@ -642,29 +787,31 @@ private: //Functions
}
}
- //Commit LO2 frequency
- bool simultaneous_commit_lo2 = _lo2_freq[size_t(CH1)].is_dirty() and
- _lo2_freq[size_t(CH2)].is_dirty() and
- _lo2_freq[size_t(CH1)].get() == _lo2_freq[size_t(CH2)].get() and
- _lo2_enable[size_t(CH1)].get() == _lo2_enable[size_t(CH2)].get();
+ // Commit LO2 frequency
+ bool simultaneous_commit_lo2 =
+ _lo2_freq[size_t(CH1)].is_dirty() and _lo2_freq[size_t(CH2)].is_dirty()
+ and _lo2_freq[size_t(CH1)].get() == _lo2_freq[size_t(CH2)].get()
+ and _lo2_enable[size_t(CH1)].get() == _lo2_enable[size_t(CH2)].get();
if (simultaneous_commit_lo2) {
_config_lo_route(LO2, BOTH);
- //Only commit one of the channels. The route LO_CONFIG_BOTH
- //will ensure that the LEs for both channels are enabled
+ // Only commit one of the channels. The route LO_CONFIG_BOTH
+ // will ensure that the LEs for both channels are enabled
_lo2_iface[size_t(CH1)]->commit();
_lo2_freq[size_t(CH1)].mark_clean();
_lo2_freq[size_t(CH2)].mark_clean();
_lo2_enable[size_t(CH1)].mark_clean();
_lo2_enable[size_t(CH2)].mark_clean();
} else {
- if (_lo2_freq[size_t(CH1)].is_dirty() || _lo2_enable[size_t(CH1)].is_dirty()) {
+ if (_lo2_freq[size_t(CH1)].is_dirty()
+ || _lo2_enable[size_t(CH1)].is_dirty()) {
_config_lo_route(LO2, CH1);
_lo2_iface[size_t(CH1)]->commit();
_lo2_freq[size_t(CH1)].mark_clean();
_lo2_enable[size_t(CH1)].mark_clean();
}
- if (_lo2_freq[size_t(CH2)].is_dirty() || _lo2_enable[size_t(CH2)].is_dirty()) {
+ if (_lo2_freq[size_t(CH2)].is_dirty()
+ || _lo2_enable[size_t(CH2)].is_dirty()) {
_config_lo_route(LO2, CH2);
_lo2_iface[size_t(CH2)]->commit();
_lo2_freq[size_t(CH2)].mark_clean();
@@ -673,40 +820,46 @@ private: //Functions
}
}
-private: //Members
+private: // Members
static const size_t NUM_CHANS = 2;
- struct tune_freq_t : public uhd::math::fp_compare::fp_compare_delta<double> {
- tune_freq_t() : uhd::math::fp_compare::fp_compare_delta<double>(
- 0.0, uhd::math::FREQ_COMPARISON_DELTA_HZ) {}
+ struct tune_freq_t : public uhd::math::fp_compare::fp_compare_delta<double>
+ {
+ tune_freq_t()
+ : uhd::math::fp_compare::fp_compare_delta<double>(
+ 0.0, uhd::math::FREQ_COMPARISON_DELTA_HZ)
+ {
+ }
- tune_freq_t(double freq) : uhd::math::fp_compare::fp_compare_delta<double>(
- freq, uhd::math::FREQ_COMPARISON_DELTA_HZ) {}
+ tune_freq_t(double freq)
+ : uhd::math::fp_compare::fp_compare_delta<double>(
+ freq, uhd::math::FREQ_COMPARISON_DELTA_HZ)
+ {
+ }
};
- boost::mutex _mutex;
- dboard_iface::sptr _db_iface;
- twinrx_gpio::sptr _gpio_iface;
- twinrx_cpld_regmap::sptr _cpld_regs;
- spi_config_t _spi_config;
- adf535x_iface::sptr _lo1_iface[NUM_CHANS];
- adf435x_iface::sptr _lo2_iface[NUM_CHANS];
- lo_source_t _lo1_src[NUM_CHANS];
- lo_source_t _lo2_src[NUM_CHANS];
- dirty_tracked<tune_freq_t> _lo1_freq[NUM_CHANS];
- dirty_tracked<tune_freq_t> _lo2_freq[NUM_CHANS];
- dirty_tracked<bool> _lo1_enable[NUM_CHANS];
- dirty_tracked<bool> _lo2_enable[NUM_CHANS];
- lo_export_source_t _lo1_export;
- lo_export_source_t _lo2_export;
- bool _chan_enabled[NUM_CHANS];
+ boost::mutex _mutex;
+ dboard_iface::sptr _db_iface;
+ twinrx_gpio::sptr _gpio_iface;
+ twinrx_cpld_regmap::sptr _cpld_regs;
+ spi_config_t _spi_config;
+ adf535x_iface::sptr _lo1_iface[NUM_CHANS];
+ adf435x_iface::sptr _lo2_iface[NUM_CHANS];
+ lo_source_t _lo1_src[NUM_CHANS];
+ lo_source_t _lo2_src[NUM_CHANS];
+ dirty_tracked<tune_freq_t> _lo1_freq[NUM_CHANS];
+ dirty_tracked<tune_freq_t> _lo2_freq[NUM_CHANS];
+ dirty_tracked<bool> _lo1_enable[NUM_CHANS];
+ dirty_tracked<bool> _lo2_enable[NUM_CHANS];
+ lo_export_source_t _lo1_export;
+ lo_export_source_t _lo2_export;
+ bool _chan_enabled[NUM_CHANS];
};
-twinrx_ctrl::sptr twinrx_ctrl::make(
- dboard_iface::sptr db_iface,
+twinrx_ctrl::sptr twinrx_ctrl::make(dboard_iface::sptr db_iface,
twinrx_gpio::sptr gpio_iface,
twinrx_cpld_regmap::sptr cpld_regmap,
- const dboard_id_t rx_id
-) {
+ const dboard_id_t rx_id)
+{
return std::make_shared<twinrx_ctrl_impl>(db_iface, gpio_iface, cpld_regmap, rx_id);
}
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
index dfdacde11..2f4d84ed5 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
@@ -9,22 +9,21 @@
#define INCLUDED_DBOARD_TWINRX_CTRL_HPP
#include "twinrx_io.hpp"
+#include <uhd/types/ranges.hpp>
#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/noncopyable.hpp>
-#include <uhd/types/ranges.hpp>
namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
-class twinrx_ctrl : public uhd::noncopyable {
+class twinrx_ctrl : public uhd::noncopyable
+{
public:
typedef std::shared_ptr<twinrx_ctrl> sptr;
- static sptr make(
- dboard_iface::sptr db_iface,
+ static sptr make(dboard_iface::sptr db_iface,
twinrx_gpio::sptr gpio_iface,
twinrx_cpld_regmap::sptr cpld_regmap,
- dboard_id_t rx_id
- );
+ dboard_id_t rx_id);
virtual ~twinrx_ctrl() {}
@@ -40,7 +39,13 @@ public:
enum lo_export_source_t { LO_CH1_SYNTH, LO_CH2_SYNTH, LO_EXPORT_DISABLED };
- enum antenna_mapping_t { ANTX_NATIVE, ANT1_SHARED, ANT2_SHARED, ANTX_SWAPPED, ANTX_DISABLED };
+ enum antenna_mapping_t {
+ ANTX_NATIVE,
+ ANT1_SHARED,
+ ANT2_SHARED,
+ ANTX_SWAPPED,
+ ANTX_DISABLED
+ };
enum cal_mode_t { CAL_DISABLED, CAL_CH1, CAL_CH2 };
@@ -52,13 +57,17 @@ public:
virtual void set_preamp2(channel_t ch, bool enabled, bool commit = true) = 0;
- virtual void set_lb_preamp_preselector(channel_t ch, bool enabled, bool commit = true) = 0;
+ virtual void set_lb_preamp_preselector(
+ channel_t ch, bool enabled, bool commit = true) = 0;
- virtual void set_signal_path(channel_t ch, signal_path_t path, bool commit = true) = 0;
+ virtual void set_signal_path(
+ channel_t ch, signal_path_t path, bool commit = true) = 0;
- virtual void set_lb_preselector(channel_t ch, preselector_path_t path, bool commit = true) = 0;
+ virtual void set_lb_preselector(
+ channel_t ch, preselector_path_t path, bool commit = true) = 0;
- virtual void set_hb_preselector(channel_t ch, preselector_path_t path, bool commit = true) = 0;
+ virtual void set_hb_preselector(
+ channel_t ch, preselector_path_t path, bool commit = true) = 0;
virtual void set_input_atten(channel_t ch, uint8_t atten, bool commit = true) = 0;
@@ -82,9 +91,11 @@ public:
virtual double set_lo2_synth_freq(channel_t ch, double freq, bool commit = true) = 0;
- virtual double set_lo1_charge_pump(channel_t ch, double current, bool commit = true) = 0;
+ virtual double set_lo1_charge_pump(
+ channel_t ch, double current, bool commit = true) = 0;
- virtual double set_lo2_charge_pump(channel_t ch, double current, bool commit = true) = 0;
+ virtual double set_lo2_charge_pump(
+ channel_t ch, double current, bool commit = true) = 0;
virtual uhd::meta_range_t get_lo1_charge_pump_range() = 0;
@@ -95,6 +106,6 @@ public:
virtual bool read_lo2_locked(channel_t ch) = 0;
};
-}}}} //namespaces
+}}}} // namespace uhd::usrp::dboard::twinrx
#endif /* INCLUDED_DBOARD_TWINRX_CTRL_HPP */
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
index f98521cc9..36bcc1863 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
@@ -7,12 +7,11 @@
#include "twinrx_experts.hpp"
#include "twinrx_gain_tables.hpp"
-#include <uhd/utils/math.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/exception.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
-#include <uhd/types/dict.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
@@ -37,15 +36,15 @@ void twinrx_scheduling_expert::resolve()
*/
void twinrx_freq_path_expert::resolve()
{
- //Lowband/highband switch point
+ // Lowband/highband switch point
static const double LB_HB_THRESHOLD_FREQ = 1.8e9;
static const double LB_TARGET_IF1_FREQ = 2.345e9;
static const double HB_TARGET_IF1_FREQ = 1.25e9;
static const double INJ_SIDE_THRESHOLD_FREQ = 5.1e9;
- static const double FIXED_LO1_THRESHOLD_FREQ= 50e6;
+ static const double FIXED_LO1_THRESHOLD_FREQ = 50e6;
- //Preselector filter switch point
+ // Preselector filter switch point
static const double LB_FILT1_THRESHOLD_FREQ = 0.5e9;
static const double LB_FILT2_THRESHOLD_FREQ = 0.8e9;
static const double LB_FILT3_THRESHOLD_FREQ = 1.2e9;
@@ -57,7 +56,7 @@ void twinrx_freq_path_expert::resolve()
static const double LB_PREAMP_PRESEL_THRESHOLD_FREQ = 0.8e9;
- //Misc
+ // Misc
static const double INST_BANDWIDTH = 80e6;
static const double MANUAL_LO_HYSTERESIS_PPM = 1.0;
@@ -65,8 +64,8 @@ void twinrx_freq_path_expert::resolve()
rf_freq_abs_t rf_freq(FREQ_RANGE.clip(_rf_freq_d));
// Choose low-band vs high-band depending on frequency
- _signal_path = (rf_freq > LB_HB_THRESHOLD_FREQ) ?
- twinrx_ctrl::PATH_HIGHBAND : twinrx_ctrl::PATH_LOWBAND;
+ _signal_path = (rf_freq > LB_HB_THRESHOLD_FREQ) ? twinrx_ctrl::PATH_HIGHBAND
+ : twinrx_ctrl::PATH_LOWBAND;
if (_signal_path == twinrx_ctrl::PATH_LOWBAND) {
// Choose low-band preselector filter
if (rf_freq < LB_FILT1_THRESHOLD_FREQ) {
@@ -97,41 +96,43 @@ void twinrx_freq_path_expert::resolve()
UHD_THROW_INVALID_CODE_PATH();
}
- //Choose low-band preamp preselector
+ // Choose low-band preamp preselector
_lb_preamp_presel = (rf_freq > LB_PREAMP_PRESEL_THRESHOLD_FREQ);
- //Choose LO frequencies
- const double target_if1_freq = (_signal_path == twinrx_ctrl::PATH_HIGHBAND) ?
- HB_TARGET_IF1_FREQ : LB_TARGET_IF1_FREQ;
+ // Choose LO frequencies
+ const double target_if1_freq = (_signal_path == twinrx_ctrl::PATH_HIGHBAND)
+ ? HB_TARGET_IF1_FREQ
+ : LB_TARGET_IF1_FREQ;
const double target_if2_freq = _if_freq_d;
// LO1
double lo1_freq_ideal = 0.0, lo2_freq_ideal = 0.0;
if (rf_freq <= FIXED_LO1_THRESHOLD_FREQ) {
- //LO1 Freq static
+ // LO1 Freq static
lo1_freq_ideal = target_if1_freq + FIXED_LO1_THRESHOLD_FREQ;
} else if (rf_freq <= INJ_SIDE_THRESHOLD_FREQ) {
- //High-side LO1 Injection
+ // High-side LO1 Injection
lo1_freq_ideal = rf_freq.get() + target_if1_freq;
} else {
- //Low-side LO1 Injection
+ // Low-side LO1 Injection
lo1_freq_ideal = rf_freq.get() - target_if1_freq;
}
if (_lo1_freq_d.get_author() == experts::AUTHOR_USER) {
- if (_lo1_freq_d.is_dirty()) { //Are we here because the LO frequency was set?
+ if (_lo1_freq_d.is_dirty()) { // Are we here because the LO frequency was set?
// The user explicitly requested to set the LO freq so don't touch it!
} else {
// Something else changed which may cause the LO frequency to update.
// Only commit if the frequency is stale. If the user's value is stale
// reset the author to expert.
- if (rf_freq_ppm_t(lo1_freq_ideal, MANUAL_LO_HYSTERESIS_PPM) != _lo1_freq_d.get()) {
- _lo1_freq_d = lo1_freq_ideal; //Reset author
+ if (rf_freq_ppm_t(lo1_freq_ideal, MANUAL_LO_HYSTERESIS_PPM)
+ != _lo1_freq_d.get()) {
+ _lo1_freq_d = lo1_freq_ideal; // Reset author
}
}
} else {
// The LO frequency was never set by the user. Let the expert take care of it
- _lo1_freq_d = lo1_freq_ideal; //Reset author
+ _lo1_freq_d = lo1_freq_ideal; // Reset author
}
// LO2
@@ -144,37 +145,40 @@ void twinrx_freq_path_expert::resolve()
}
if (_lo2_freq_d.get_author() == experts::AUTHOR_USER) {
- if (_lo2_freq_d.is_dirty()) { //Are we here because the LO frequency was set?
+ if (_lo2_freq_d.is_dirty()) { // Are we here because the LO frequency was set?
// The user explicitly requested to set the LO freq so don't touch it!
} else {
// Something else changed which may cause the LO frequency to update.
// Only commit if the frequency is stale. If the user's value is stale
// reset the author to expert.
- if (rf_freq_ppm_t(lo2_freq_ideal, MANUAL_LO_HYSTERESIS_PPM) != _lo2_freq_d.get()) {
- _lo2_freq_d = lo2_freq_ideal; //Reset author
+ if (rf_freq_ppm_t(lo2_freq_ideal, MANUAL_LO_HYSTERESIS_PPM)
+ != _lo2_freq_d.get()) {
+ _lo2_freq_d = lo2_freq_ideal; // Reset author
}
}
} else {
// The LO frequency was never set by the user. Let the expert take care of it
- _lo2_freq_d = lo2_freq_ideal; //Reset author
+ _lo2_freq_d = lo2_freq_ideal; // Reset author
}
// Determine injection side using the final LO frequency
- _lo1_inj_side = (_lo1_freq_d > rf_freq.get()) ? INJ_HIGH_SIDE : INJ_LOW_SIDE;
+ _lo1_inj_side = (_lo1_freq_d > rf_freq.get()) ? INJ_HIGH_SIDE : INJ_LOW_SIDE;
_lo2_inj_side = (_lo2_freq_d > target_if1_freq) ? INJ_HIGH_SIDE : INJ_LOW_SIDE;
}
lo_inj_side_t twinrx_freq_path_expert::_compute_lo2_inj_side(
- double lo1_freq, double if1_freq, double if2_freq, double bandwidth
-) {
+ double lo1_freq, double if1_freq, double if2_freq, double bandwidth)
+{
static const int MAX_SPUR_ORDER = 5;
for (int ord = MAX_SPUR_ORDER; ord >= 1; ord--) {
// Check high-side injection first
- if (not _has_mixer_spurs(lo1_freq, if1_freq + if2_freq, if2_freq, bandwidth, ord)) {
+ if (not _has_mixer_spurs(
+ lo1_freq, if1_freq + if2_freq, if2_freq, bandwidth, ord)) {
return INJ_HIGH_SIDE;
}
// Check low-side injection second
- if (not _has_mixer_spurs(lo1_freq, if1_freq - if2_freq, if2_freq, bandwidth, ord)) {
+ if (not _has_mixer_spurs(
+ lo1_freq, if1_freq - if2_freq, if2_freq, bandwidth, ord)) {
return INJ_LOW_SIDE;
}
}
@@ -183,19 +187,18 @@ lo_inj_side_t twinrx_freq_path_expert::_compute_lo2_inj_side(
}
bool twinrx_freq_path_expert::_has_mixer_spurs(
- double lo1_freq, double lo2_freq, double if2_freq,
- double bandwidth, int spur_order
-) {
+ double lo1_freq, double lo2_freq, double if2_freq, double bandwidth, int spur_order)
+{
// Iterate through all N-th order harmomic combinations
// of LOs...
for (int lo1h_i = 1; lo1h_i <= spur_order; lo1h_i++) {
double lo1harm_freq = lo1_freq * lo1h_i;
for (int lo2h_i = 1; lo2h_i <= spur_order; lo2h_i++) {
double lo2harm_freq = lo2_freq * lo2h_i;
- double hdelta = lo1harm_freq - lo2harm_freq;
+ double hdelta = lo1harm_freq - lo2harm_freq;
// .. and check if there is a mixer spur in the IF band
- if (std::abs(hdelta + if2_freq) < bandwidth/2 or
- std::abs(hdelta - if2_freq) < bandwidth/2) {
+ if (std::abs(hdelta + if2_freq) < bandwidth / 2
+ or std::abs(hdelta - if2_freq) < bandwidth / 2) {
return true;
}
}
@@ -211,11 +214,12 @@ bool twinrx_freq_path_expert::_has_mixer_spurs(
void twinrx_freq_coercion_expert::resolve()
{
const double actual_if2_freq = _if_freq_d;
- const double actual_if1_freq = (_lo2_inj_side == INJ_LOW_SIDE) ?
- (_lo2_freq_c + actual_if2_freq) : (_lo2_freq_c - actual_if2_freq);
+ const double actual_if1_freq = (_lo2_inj_side == INJ_LOW_SIDE)
+ ? (_lo2_freq_c + actual_if2_freq)
+ : (_lo2_freq_c - actual_if2_freq);
- _rf_freq_c = (_lo1_inj_side == INJ_LOW_SIDE) ?
- (_lo1_freq_c + actual_if1_freq) : (_lo1_freq_c - actual_if1_freq);
+ _rf_freq_c = (_lo1_inj_side == INJ_LOW_SIDE) ? (_lo1_freq_c + actual_if1_freq)
+ : (_lo1_freq_c - actual_if1_freq);
}
/*!---------------------------------------------------------
@@ -238,12 +242,14 @@ void twinrx_nyquist_expert::resolve()
_cached_cmd_time = _rx_frontend_time;
double if_freq_sign = 1.0;
- if (_lo1_inj_side == INJ_HIGH_SIDE) if_freq_sign *= -1.0;
- if (_lo2_inj_side == INJ_HIGH_SIDE) if_freq_sign *= -1.0;
+ if (_lo1_inj_side == INJ_HIGH_SIDE)
+ if_freq_sign *= -1.0;
+ if (_lo2_inj_side == INJ_HIGH_SIDE)
+ if_freq_sign *= -1.0;
_if_freq_c = _if_freq_d * if_freq_sign;
- _db_iface->set_fe_connection(dboard_iface::UNIT_RX, _channel,
- usrp::fe_connection_t(_codec_conn, _if_freq_c));
+ _db_iface->set_fe_connection(
+ dboard_iface::UNIT_RX, _channel, usrp::fe_connection_t(_codec_conn, _if_freq_c));
}
/*!---------------------------------------------------------
@@ -253,22 +259,22 @@ void twinrx_nyquist_expert::resolve()
void twinrx_chan_gain_expert::resolve()
{
if (_gain_profile != "default") {
- //TODO: Implement me!
+ // TODO: Implement me!
throw uhd::not_implemented_error("custom gain strategies not implemeted yet");
}
- //Lookup table using settings
- const twinrx_gain_table table = twinrx_gain_table::lookup_table(
- _signal_path,
- (_signal_path==twinrx_ctrl::PATH_HIGHBAND) ? _hb_presel : _lb_presel,
+ // Lookup table using settings
+ const twinrx_gain_table table = twinrx_gain_table::lookup_table(_signal_path,
+ (_signal_path == twinrx_ctrl::PATH_HIGHBAND) ? _hb_presel : _lb_presel,
_gain_profile);
- //Compute minimum gain. The user-specified gain value will be interpreted as
- //the gain applied on top of the minimum gain state.
- //If antennas are shared or swapped, the switch has 6dB of loss
- size_t gain_index = std::min(static_cast<size_t>(boost::math::round(_gain.get())), table.get_num_entries()-1);
+ // Compute minimum gain. The user-specified gain value will be interpreted as
+ // the gain applied on top of the minimum gain state.
+ // If antennas are shared or swapped, the switch has 6dB of loss
+ size_t gain_index = std::min(static_cast<size_t>(boost::math::round(_gain.get())),
+ table.get_num_entries() - 1);
- //Translate gain to an index in the gain table
+ // Translate gain to an index in the gain table
const twinrx_gain_config_t& config = table.find_by_index(gain_index);
_input_atten = config.atten1;
@@ -279,8 +285,10 @@ void twinrx_chan_gain_expert::resolve()
}
// Preamp 1 should use the Highband amp for frequencies above 3 GHz
- if (_signal_path == twinrx_ctrl::PATH_HIGHBAND && _hb_presel != twinrx_ctrl::PRESEL_PATH1) {
- _preamp1 = config.amp1 ? twinrx_ctrl::PREAMP_HIGHBAND : twinrx_ctrl::PREAMP_BYPASS;
+ if (_signal_path == twinrx_ctrl::PATH_HIGHBAND
+ && _hb_presel != twinrx_ctrl::PRESEL_PATH1) {
+ _preamp1 = config.amp1 ? twinrx_ctrl::PREAMP_HIGHBAND
+ : twinrx_ctrl::PREAMP_BYPASS;
} else {
_preamp1 = config.amp1 ? twinrx_ctrl::PREAMP_LOWBAND : twinrx_ctrl::PREAMP_BYPASS;
}
@@ -295,22 +303,21 @@ void twinrx_chan_gain_expert::resolve()
void twinrx_lo_config_expert::resolve()
{
static const uhd::dict<std::string, twinrx_ctrl::lo_source_t> src_lookup =
- boost::assign::map_list_of
- ("internal", twinrx_ctrl::LO_INTERNAL)
- ("external", twinrx_ctrl::LO_EXTERNAL)
- ("companion", twinrx_ctrl::LO_COMPANION)
- ("disabled", twinrx_ctrl::LO_DISABLED)
- ("reimport", twinrx_ctrl::LO_REIMPORT);
+ boost::assign::map_list_of("internal", twinrx_ctrl::LO_INTERNAL)(
+ "external", twinrx_ctrl::LO_EXTERNAL)("companion", twinrx_ctrl::LO_COMPANION)(
+ "disabled", twinrx_ctrl::LO_DISABLED)("reimport", twinrx_ctrl::LO_REIMPORT);
if (src_lookup.has_key(_lo_source_ch0)) {
_lo1_src_ch0 = _lo2_src_ch0 = src_lookup[_lo_source_ch0];
} else {
- throw uhd::value_error("Invalid LO source for channel 0.Choose from {internal, external, companion, reimport}");
+ throw uhd::value_error("Invalid LO source for channel 0.Choose from {internal, "
+ "external, companion, reimport}");
}
if (src_lookup.has_key(_lo_source_ch1)) {
_lo1_src_ch1 = _lo2_src_ch1 = src_lookup[_lo_source_ch1];
} else {
- throw uhd::value_error("Invalid LO source for channel 1.Choose from {internal, external, companion, reimport}");
+ throw uhd::value_error("Invalid LO source for channel 1.Choose from {internal, "
+ "external, companion, reimport}");
}
twinrx_ctrl::lo_export_source_t export_src = twinrx_ctrl::LO_EXPORT_DISABLED;
@@ -325,11 +332,13 @@ void twinrx_lo_config_expert::resolve()
if (_lo_export_ch0 and _lo_export_ch1) {
throw uhd::value_error("Cannot export LOs for both channels");
} else if (_lo_export_ch0) {
- export_src = (_lo1_src_ch0 == twinrx_ctrl::LO_COMPANION) ?
- twinrx_ctrl::LO_CH2_SYNTH : twinrx_ctrl::LO_CH1_SYNTH;
+ export_src = (_lo1_src_ch0 == twinrx_ctrl::LO_COMPANION)
+ ? twinrx_ctrl::LO_CH2_SYNTH
+ : twinrx_ctrl::LO_CH1_SYNTH;
} else if (_lo_export_ch1) {
- export_src = (_lo1_src_ch1 == twinrx_ctrl::LO_COMPANION) ?
- twinrx_ctrl::LO_CH1_SYNTH : twinrx_ctrl::LO_CH2_SYNTH;
+ export_src = (_lo1_src_ch1 == twinrx_ctrl::LO_COMPANION)
+ ? twinrx_ctrl::LO_CH1_SYNTH
+ : twinrx_ctrl::LO_CH2_SYNTH;
}
_lo1_export_src = _lo2_export_src = export_src;
}
@@ -348,12 +357,14 @@ void twinrx_lo_mapping_expert::resolve()
// "internal" or "reimport" -> this channel
// "companion" -> other channel
size_t synth_map[] = {0, 0};
- if (_lox_src_ch0 == twinrx_ctrl::LO_INTERNAL or _lox_src_ch0 == twinrx_ctrl::LO_REIMPORT) {
+ if (_lox_src_ch0 == twinrx_ctrl::LO_INTERNAL
+ or _lox_src_ch0 == twinrx_ctrl::LO_REIMPORT) {
synth_map[0] = synth_map[0] | CH0_MSK;
} else if (_lox_src_ch0 == twinrx_ctrl::LO_COMPANION) {
synth_map[1] = synth_map[1] | CH0_MSK;
}
- if (_lox_src_ch1 == twinrx_ctrl::LO_INTERNAL or _lox_src_ch1 == twinrx_ctrl::LO_REIMPORT) {
+ if (_lox_src_ch1 == twinrx_ctrl::LO_INTERNAL
+ or _lox_src_ch1 == twinrx_ctrl::LO_REIMPORT) {
synth_map[1] = synth_map[1] | CH1_MSK;
} else if (_lox_src_ch1 == twinrx_ctrl::LO_COMPANION) {
synth_map[0] = synth_map[0] | CH1_MSK;
@@ -365,20 +376,22 @@ void twinrx_lo_mapping_expert::resolve()
// to overlap tuning with signal dwell time.
bool hopping_enabled = false;
if (_lox_src_ch0 == twinrx_ctrl::LO_DISABLED) {
- if (_lox_src_ch1 == twinrx_ctrl::LO_INTERNAL or _lox_src_ch1 == twinrx_ctrl::LO_REIMPORT) {
- synth_map[0] = synth_map[0] | CH0_MSK;
+ if (_lox_src_ch1 == twinrx_ctrl::LO_INTERNAL
+ or _lox_src_ch1 == twinrx_ctrl::LO_REIMPORT) {
+ synth_map[0] = synth_map[0] | CH0_MSK;
hopping_enabled = true;
} else if (_lox_src_ch1 == twinrx_ctrl::LO_COMPANION) {
- synth_map[1] = synth_map[1] | CH0_MSK;
+ synth_map[1] = synth_map[1] | CH0_MSK;
hopping_enabled = true;
}
}
if (_lox_src_ch1 == twinrx_ctrl::LO_DISABLED) {
- if (_lox_src_ch0 == twinrx_ctrl::LO_INTERNAL or _lox_src_ch0 == twinrx_ctrl::LO_REIMPORT) {
- synth_map[1] = synth_map[1] | CH1_MSK;
+ if (_lox_src_ch0 == twinrx_ctrl::LO_INTERNAL
+ or _lox_src_ch0 == twinrx_ctrl::LO_REIMPORT) {
+ synth_map[1] = synth_map[1] | CH1_MSK;
hopping_enabled = true;
} else if (_lox_src_ch0 == twinrx_ctrl::LO_COMPANION) {
- synth_map[0] = synth_map[0] | CH1_MSK;
+ synth_map[0] = synth_map[0] | CH1_MSK;
hopping_enabled = true;
}
}
@@ -387,7 +400,7 @@ void twinrx_lo_mapping_expert::resolve()
for (size_t synth = 0; synth < 2; synth++) {
experts::data_writer_t<lo_synth_mapping_t>& lox_mapping =
(synth == 0) ? _lox_mapping_synth0 : _lox_mapping_synth1;
- if (synth_map[synth] == (CH0_MSK|CH1_MSK)) {
+ if (synth_map[synth] == (CH0_MSK | CH1_MSK)) {
lox_mapping = MAPPING_SHARED;
} else if (synth_map[synth] == CH0_MSK) {
lox_mapping = MAPPING_CH0;
@@ -429,18 +442,22 @@ void twinrx_antenna_expert::resolve()
} else if (_antenna_ch0 == ANT1 and _antenna_ch1 == ANT0) {
_ant_mapping = twinrx_ctrl::ANTX_SWAPPED;
} else if (_antenna_ch0 != ANT0 and _antenna_ch0 != ANT1) {
- throw uhd::value_error("Invalid antenna selection " + _antenna_ch0.get() + " for channel 0. Must be " + ANT0 + " or " + ANT1);
+ throw uhd::value_error("Invalid antenna selection " + _antenna_ch0.get()
+ + " for channel 0. Must be " + ANT0 + " or " + ANT1);
} else if (_antenna_ch1 != ANT0 and _antenna_ch1 != ANT1) {
- throw uhd::value_error("Invalid antenna selection " + _antenna_ch1.get() + " for channel 1. Must be " + ANT0 + " or " + ANT1);
+ throw uhd::value_error("Invalid antenna selection " + _antenna_ch1.get()
+ + " for channel 1. Must be " + ANT0 + " or " + ANT1);
}
- //TODO: Implement hooks for the calibration switch
+ // TODO: Implement hooks for the calibration switch
_cal_mode = twinrx_ctrl::CAL_DISABLED;
if (_cal_mode == twinrx_ctrl::CAL_CH1 and _lo_export_ch1) {
- throw uhd::value_error("Cannot calibrate channel 0 and export the LO for channel 1.");
+ throw uhd::value_error(
+ "Cannot calibrate channel 0 and export the LO for channel 1.");
} else if (_cal_mode == twinrx_ctrl::CAL_CH2 and _lo_export_ch0) {
- throw uhd::value_error("Cannot calibrate channel 1 and export the LO for channel 0.");
+ throw uhd::value_error(
+ "Cannot calibrate channel 1 and export the LO for channel 0.");
}
}
@@ -451,72 +468,72 @@ void twinrx_antenna_expert::resolve()
void twinrx_ant_gain_expert::resolve()
{
switch (_ant_mapping) {
- case twinrx_ctrl::ANTX_NATIVE:
- _ant0_input_atten = _ch0_input_atten;
- _ant0_preamp1 = _ch0_preamp1;
- _ant0_preamp2 = _ch0_preamp2;
- _ant0_lb_preamp_presel = _ch0_lb_preamp_presel;
- _ant1_input_atten = _ch1_input_atten;
- _ant1_preamp1 = _ch1_preamp1;
- _ant1_preamp2 = _ch1_preamp2;
- _ant1_lb_preamp_presel = _ch1_lb_preamp_presel;
- break;
- case twinrx_ctrl::ANTX_SWAPPED:
- _ant0_input_atten = _ch1_input_atten;
- _ant0_preamp1 = _ch1_preamp1;
- _ant0_preamp2 = _ch1_preamp2;
- _ant0_lb_preamp_presel = _ch1_lb_preamp_presel;
- _ant1_input_atten = _ch0_input_atten;
- _ant1_preamp1 = _ch0_preamp1;
- _ant1_preamp2 = _ch0_preamp2;
- _ant1_lb_preamp_presel = _ch0_lb_preamp_presel;
- break;
- case twinrx_ctrl::ANT1_SHARED:
- if ((_ch0_input_atten != _ch1_input_atten) or
- (_ch0_preamp1 != _ch1_preamp1) or
- (_ch0_preamp2 != _ch1_preamp2) or
- (_ch0_lb_preamp_presel != _ch1_lb_preamp_presel))
- {
- UHD_LOGGER_WARNING("TWINRX") << "incompatible gain settings for antenna sharing. temporarily using Ch0 settings for Ch1.";
- }
- _ant0_input_atten = _ch0_input_atten;
- _ant0_preamp1 = _ch0_preamp1;
- _ant0_preamp2 = _ch0_preamp2;
- _ant0_lb_preamp_presel = _ch0_lb_preamp_presel;
-
- _ant1_input_atten = 0;
- _ant1_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
- _ant1_preamp2 = false;
- _ant1_lb_preamp_presel = false;
- break;
- case twinrx_ctrl::ANT2_SHARED:
- if ((_ch0_input_atten != _ch1_input_atten) or
- (_ch0_preamp1 != _ch1_preamp1) or
- (_ch0_preamp2 != _ch1_preamp2) or
- (_ch0_lb_preamp_presel != _ch1_lb_preamp_presel))
- {
- UHD_LOGGER_WARNING("TWINRX") << "incompatible gain settings for antenna sharing. temporarily using Ch0 settings for Ch1.";
- }
- _ant1_input_atten = _ch0_input_atten;
- _ant1_preamp1 = _ch0_preamp1;
- _ant1_preamp2 = _ch0_preamp2;
- _ant1_lb_preamp_presel = _ch0_lb_preamp_presel;
-
- _ant0_input_atten = 0;
- _ant0_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
- _ant0_preamp2 = false;
- _ant0_lb_preamp_presel = false;
- break;
- default:
- _ant0_input_atten = 0;
- _ant0_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
- _ant0_preamp2 = false;
- _ant0_lb_preamp_presel = false;
- _ant1_input_atten = 0;
- _ant1_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
- _ant1_preamp2 = false;
- _ant1_lb_preamp_presel = false;
- break;
+ case twinrx_ctrl::ANTX_NATIVE:
+ _ant0_input_atten = _ch0_input_atten;
+ _ant0_preamp1 = _ch0_preamp1;
+ _ant0_preamp2 = _ch0_preamp2;
+ _ant0_lb_preamp_presel = _ch0_lb_preamp_presel;
+ _ant1_input_atten = _ch1_input_atten;
+ _ant1_preamp1 = _ch1_preamp1;
+ _ant1_preamp2 = _ch1_preamp2;
+ _ant1_lb_preamp_presel = _ch1_lb_preamp_presel;
+ break;
+ case twinrx_ctrl::ANTX_SWAPPED:
+ _ant0_input_atten = _ch1_input_atten;
+ _ant0_preamp1 = _ch1_preamp1;
+ _ant0_preamp2 = _ch1_preamp2;
+ _ant0_lb_preamp_presel = _ch1_lb_preamp_presel;
+ _ant1_input_atten = _ch0_input_atten;
+ _ant1_preamp1 = _ch0_preamp1;
+ _ant1_preamp2 = _ch0_preamp2;
+ _ant1_lb_preamp_presel = _ch0_lb_preamp_presel;
+ break;
+ case twinrx_ctrl::ANT1_SHARED:
+ if ((_ch0_input_atten != _ch1_input_atten) or (_ch0_preamp1 != _ch1_preamp1)
+ or (_ch0_preamp2 != _ch1_preamp2)
+ or (_ch0_lb_preamp_presel != _ch1_lb_preamp_presel)) {
+ UHD_LOGGER_WARNING("TWINRX")
+ << "incompatible gain settings for antenna sharing. temporarily "
+ "using Ch0 settings for Ch1.";
+ }
+ _ant0_input_atten = _ch0_input_atten;
+ _ant0_preamp1 = _ch0_preamp1;
+ _ant0_preamp2 = _ch0_preamp2;
+ _ant0_lb_preamp_presel = _ch0_lb_preamp_presel;
+
+ _ant1_input_atten = 0;
+ _ant1_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
+ _ant1_preamp2 = false;
+ _ant1_lb_preamp_presel = false;
+ break;
+ case twinrx_ctrl::ANT2_SHARED:
+ if ((_ch0_input_atten != _ch1_input_atten) or (_ch0_preamp1 != _ch1_preamp1)
+ or (_ch0_preamp2 != _ch1_preamp2)
+ or (_ch0_lb_preamp_presel != _ch1_lb_preamp_presel)) {
+ UHD_LOGGER_WARNING("TWINRX")
+ << "incompatible gain settings for antenna sharing. temporarily "
+ "using Ch0 settings for Ch1.";
+ }
+ _ant1_input_atten = _ch0_input_atten;
+ _ant1_preamp1 = _ch0_preamp1;
+ _ant1_preamp2 = _ch0_preamp2;
+ _ant1_lb_preamp_presel = _ch0_lb_preamp_presel;
+
+ _ant0_input_atten = 0;
+ _ant0_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
+ _ant0_preamp2 = false;
+ _ant0_lb_preamp_presel = false;
+ break;
+ default:
+ _ant0_input_atten = 0;
+ _ant0_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
+ _ant0_preamp2 = false;
+ _ant0_lb_preamp_presel = false;
+ _ant1_input_atten = 0;
+ _ant1_preamp1 = twinrx_ctrl::PREAMP_BYPASS;
+ _ant1_preamp2 = false;
+ _ant1_lb_preamp_presel = false;
+ break;
}
}
@@ -529,7 +546,7 @@ const bool twinrx_settings_expert::FORCE_COMMIT = false;
void twinrx_settings_expert::resolve()
{
for (size_t i = 0; i < 2; i++) {
- ch_settings& ch_set = (i == 1) ? _ch1 : _ch0;
+ ch_settings& ch_set = (i == 1) ? _ch1 : _ch0;
twinrx_ctrl::channel_t ch = (i == 1) ? twinrx_ctrl::CH2 : twinrx_ctrl::CH1;
_ctrl->set_chan_enabled(ch, ch_set.chan_enabled, FORCE_COMMIT);
_ctrl->set_preamp1(ch, ch_set.preamp1, FORCE_COMMIT);
@@ -550,34 +567,45 @@ void twinrx_settings_expert::resolve()
}
_resolve_lox_freq(STAGE_LO1,
- _ch0.lo1_freq_d, _ch1.lo1_freq_d, _ch0.lo1_freq_c, _ch1.lo1_freq_c,
- _ch0.lo1_source, _ch1.lo1_source, _lo1_synth0_mapping, _lo1_synth1_mapping,
+ _ch0.lo1_freq_d,
+ _ch1.lo1_freq_d,
+ _ch0.lo1_freq_c,
+ _ch1.lo1_freq_c,
+ _ch0.lo1_source,
+ _ch1.lo1_source,
+ _lo1_synth0_mapping,
+ _lo1_synth1_mapping,
_lo1_hopping_enabled);
_resolve_lox_freq(STAGE_LO2,
- _ch0.lo2_freq_d, _ch1.lo2_freq_d, _ch0.lo2_freq_c, _ch1.lo2_freq_c,
- _ch0.lo2_source, _ch1.lo2_source, _lo2_synth0_mapping, _lo2_synth1_mapping,
+ _ch0.lo2_freq_d,
+ _ch1.lo2_freq_d,
+ _ch0.lo2_freq_c,
+ _ch1.lo2_freq_c,
+ _ch0.lo2_source,
+ _ch1.lo2_source,
+ _lo2_synth0_mapping,
+ _lo2_synth1_mapping,
_lo2_hopping_enabled);
_ctrl->set_lo1_export_source(_lo1_export_src, FORCE_COMMIT);
_ctrl->set_lo2_export_source(_lo2_export_src, FORCE_COMMIT);
_ctrl->set_antenna_mapping(_ant_mapping, FORCE_COMMIT);
- //TODO: Re-enable this when we support this mode
+ // TODO: Re-enable this when we support this mode
//_ctrl->set_crossover_cal_mode(_cal_mode, FORCE_COMMIT);
_ctrl->commit();
}
-void twinrx_settings_expert::_resolve_lox_freq(
- lo_stage_t lo_stage,
+void twinrx_settings_expert::_resolve_lox_freq(lo_stage_t lo_stage,
uhd::experts::data_reader_t<double>& ch0_freq_d,
uhd::experts::data_reader_t<double>& ch1_freq_d,
uhd::experts::data_writer_t<double>& ch0_freq_c,
uhd::experts::data_writer_t<double>& ch1_freq_c,
- twinrx_ctrl::lo_source_t ch0_lo_source,
- twinrx_ctrl::lo_source_t ch1_lo_source,
- lo_synth_mapping_t synth0_mapping,
- lo_synth_mapping_t synth1_mapping,
- bool hopping_enabled)
+ twinrx_ctrl::lo_source_t ch0_lo_source,
+ twinrx_ctrl::lo_source_t ch1_lo_source,
+ lo_synth_mapping_t synth0_mapping,
+ lo_synth_mapping_t synth1_mapping,
+ bool hopping_enabled)
{
if (ch0_lo_source == twinrx_ctrl::LO_EXTERNAL) {
// If the LO is external then we don't need to program any synthesizers
@@ -594,7 +622,8 @@ void twinrx_settings_expert::_resolve_lox_freq(
ch0_freq_c = _set_lox_synth_freq(lo_stage, twinrx_ctrl::CH2, ch0_freq_d);
} else if (synth0_mapping == MAPPING_SHARED or synth1_mapping == MAPPING_SHARED) {
// If any synthesizer is being shared then we are not in hopping mode
- twinrx_ctrl::channel_t ch = (synth0_mapping == MAPPING_SHARED) ? twinrx_ctrl::CH1 : twinrx_ctrl::CH2;
+ twinrx_ctrl::channel_t ch =
+ (synth0_mapping == MAPPING_SHARED) ? twinrx_ctrl::CH1 : twinrx_ctrl::CH2;
ch0_freq_c = _set_lox_synth_freq(lo_stage, ch, ch0_freq_d);
ch1_freq_c = ch0_freq_c;
}
@@ -609,28 +638,32 @@ void twinrx_settings_expert::_resolve_lox_freq(
// hopping, then always write the frequency because other inputs might require
// an LO re-commit
const bool freq_update_request = (not hopping_enabled) or ch1_freq_d.is_dirty();
- // As an additional layer of protection from unnecessarily committing the LO, check
- // if the frequency has actually changed.
+ // As an additional layer of protection from unnecessarily committing the LO,
+ // check if the frequency has actually changed.
if (synth0_mapping == MAPPING_CH1 and freq_update_request) {
ch1_freq_c = _set_lox_synth_freq(lo_stage, twinrx_ctrl::CH1, ch1_freq_d);
} else if (synth1_mapping == MAPPING_CH1 and freq_update_request) {
ch1_freq_c = _set_lox_synth_freq(lo_stage, twinrx_ctrl::CH2, ch1_freq_d);
} else if (synth0_mapping == MAPPING_SHARED or synth1_mapping == MAPPING_SHARED) {
// If any synthesizer is being shared then we are not in hopping mode
- twinrx_ctrl::channel_t ch = (synth0_mapping == MAPPING_SHARED) ? twinrx_ctrl::CH1 : twinrx_ctrl::CH2;
+ twinrx_ctrl::channel_t ch =
+ (synth0_mapping == MAPPING_SHARED) ? twinrx_ctrl::CH1 : twinrx_ctrl::CH2;
ch0_freq_c = _set_lox_synth_freq(lo_stage, ch, ch0_freq_d);
ch1_freq_c = ch0_freq_c;
}
}
}
-double twinrx_settings_expert::_set_lox_synth_freq(lo_stage_t stage, twinrx_ctrl::channel_t ch, double freq)
+double twinrx_settings_expert::_set_lox_synth_freq(
+ lo_stage_t stage, twinrx_ctrl::channel_t ch, double freq)
{
lo_freq_cache_t* freq_cache = NULL;
if (stage == STAGE_LO1) {
- freq_cache = (ch == twinrx_ctrl::CH1) ? &_cached_lo1_synth0_freq : &_cached_lo1_synth1_freq;
+ freq_cache = (ch == twinrx_ctrl::CH1) ? &_cached_lo1_synth0_freq
+ : &_cached_lo1_synth1_freq;
} else if (stage == STAGE_LO2) {
- freq_cache = (ch == twinrx_ctrl::CH1) ? &_cached_lo2_synth0_freq : &_cached_lo2_synth1_freq;
+ freq_cache = (ch == twinrx_ctrl::CH1) ? &_cached_lo2_synth0_freq
+ : &_cached_lo2_synth1_freq;
} else {
throw uhd::assertion_error("Invalid LO stage");
}
@@ -650,4 +683,3 @@ double twinrx_settings_expert::_set_lox_synth_freq(lo_stage_t stage, twinrx_ctrl
}
return coerced_freq;
}
-
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
index 16569849c..c7e021a90 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
@@ -9,8 +9,8 @@
#define INCLUDED_DBOARD_TWINRX_EXPERTS_HPP
#include "twinrx_ctrl.hpp"
-#include <uhdlib/experts/expert_nodes.hpp>
#include <uhd/utils/math.hpp>
+#include <uhdlib/experts/expert_nodes.hpp>
namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
@@ -18,26 +18,37 @@ namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
// Misc types and definitions
//---------------------------------------------------------
-struct rf_freq_abs_t : public uhd::math::fp_compare::fp_compare_delta<double> {
- rf_freq_abs_t(double freq = 0.0, double epsilon = 1.0 /* 1Hz epsilon */) :
- uhd::math::fp_compare::fp_compare_delta<double>(freq, epsilon) {}
- inline double get() const { return _value; }
+struct rf_freq_abs_t : public uhd::math::fp_compare::fp_compare_delta<double>
+{
+ rf_freq_abs_t(double freq = 0.0, double epsilon = 1.0 /* 1Hz epsilon */)
+ : uhd::math::fp_compare::fp_compare_delta<double>(freq, epsilon)
+ {
+ }
+ inline double get() const
+ {
+ return _value;
+ }
};
-struct rf_freq_ppm_t : public rf_freq_abs_t {
- rf_freq_ppm_t(double freq = 0.0, double epsilon_ppm = 0.1 /* 1PPM epsilon */) :
- rf_freq_abs_t(freq, 1e-6 * freq * epsilon_ppm) {}
+struct rf_freq_ppm_t : public rf_freq_abs_t
+{
+ rf_freq_ppm_t(double freq = 0.0, double epsilon_ppm = 0.1 /* 1PPM epsilon */)
+ : rf_freq_abs_t(freq, 1e-6 * freq * epsilon_ppm)
+ {
+ }
};
enum lo_stage_t { STAGE_LO1, STAGE_LO2 };
enum lo_inj_side_t { INJ_LOW_SIDE, INJ_HIGH_SIDE };
enum lo_synth_mapping_t { MAPPING_NONE, MAPPING_CH0, MAPPING_CH1, MAPPING_SHARED };
-static const std::string prepend_ch(std::string name, const std::string& ch) {
+static const std::string prepend_ch(std::string name, const std::string& ch)
+{
return ch + "/" + name;
}
-static const std::string lo_stage_str(lo_stage_t stage, bool lower = false) {
+static const std::string lo_stage_str(lo_stage_t stage, bool lower = false)
+{
std::string prefix = lower ? "lo" : "LO";
return prefix + ((stage == STAGE_LO1) ? "1" : "2");
}
@@ -53,12 +64,13 @@ static const std::string lo_stage_str(lo_stage_t stage, bool lower = false) {
*
* ---------------------------------------------------------
*/
-class twinrx_scheduling_expert : public experts::worker_node_t {
+class twinrx_scheduling_expert : public experts::worker_node_t
+{
public:
twinrx_scheduling_expert(const experts::node_retriever_t& db, std::string ch)
- : experts::worker_node_t(prepend_ch("twinrx_scheduling_expert", ch)),
- _command_time (db, prepend_ch("time/cmd", ch)),
- _rx_frontend_time (db, prepend_ch("time/rx_frontend", ch))
+ : experts::worker_node_t(prepend_ch("twinrx_scheduling_expert", ch))
+ , _command_time(db, prepend_ch("time/cmd", ch))
+ , _rx_frontend_time(db, prepend_ch("time/rx_frontend", ch))
{
bind_accessor(_command_time);
bind_accessor(_rx_frontend_time);
@@ -67,11 +79,11 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<time_spec_t> _command_time;
+ // Inputs
+ experts::data_reader_t<time_spec_t> _command_time;
- //Outputs
- experts::data_writer_t<time_spec_t> _rx_frontend_time;
+ // Outputs
+ experts::data_writer_t<time_spec_t> _rx_frontend_time;
};
/*!---------------------------------------------------------
@@ -85,20 +97,21 @@ private:
* One instance of this expert is required for each channel
* ---------------------------------------------------------
*/
-class twinrx_freq_path_expert : public experts::worker_node_t {
+class twinrx_freq_path_expert : public experts::worker_node_t
+{
public:
twinrx_freq_path_expert(const experts::node_retriever_t& db, std::string ch)
- : experts::worker_node_t(prepend_ch("twinrx_freq_path_expert", ch)),
- _rf_freq_d (db, prepend_ch("freq/desired", ch)),
- _if_freq_d (db, prepend_ch("if_freq/desired", ch)),
- _signal_path (db, prepend_ch("ch/signal_path", ch)),
- _lb_presel (db, prepend_ch("ch/lb_presel", ch)),
- _hb_presel (db, prepend_ch("ch/hb_presel", ch)),
- _lb_preamp_presel (db, prepend_ch("ch/lb_preamp_presel", ch)),
- _lo1_freq_d (db, prepend_ch("los/LO1/freq/desired", ch)),
- _lo2_freq_d (db, prepend_ch("los/LO2/freq/desired", ch)),
- _lo1_inj_side (db, prepend_ch("ch/LO1/inj_side", ch)),
- _lo2_inj_side (db, prepend_ch("ch/LO2/inj_side", ch))
+ : experts::worker_node_t(prepend_ch("twinrx_freq_path_expert", ch))
+ , _rf_freq_d(db, prepend_ch("freq/desired", ch))
+ , _if_freq_d(db, prepend_ch("if_freq/desired", ch))
+ , _signal_path(db, prepend_ch("ch/signal_path", ch))
+ , _lb_presel(db, prepend_ch("ch/lb_presel", ch))
+ , _hb_presel(db, prepend_ch("ch/hb_presel", ch))
+ , _lb_preamp_presel(db, prepend_ch("ch/lb_preamp_presel", ch))
+ , _lo1_freq_d(db, prepend_ch("los/LO1/freq/desired", ch))
+ , _lo2_freq_d(db, prepend_ch("los/LO2/freq/desired", ch))
+ , _lo1_inj_side(db, prepend_ch("ch/LO1/inj_side", ch))
+ , _lo2_inj_side(db, prepend_ch("ch/LO2/inj_side", ch))
{
bind_accessor(_rf_freq_d);
bind_accessor(_if_freq_d);
@@ -115,23 +128,25 @@ public:
private:
virtual void resolve();
static lo_inj_side_t _compute_lo2_inj_side(
- double lo1_freq, double if1_freq, double if2_freq, double bandwidth);
- static bool _has_mixer_spurs(
- double lo1_freq, double lo2_freq, double if2_freq,
- double bandwidth, int spur_order);
-
- //Inputs
- experts::data_reader_t<double> _rf_freq_d;
- experts::data_reader_t<double> _if_freq_d;
- //Outputs
- experts::data_writer_t<twinrx_ctrl::signal_path_t> _signal_path;
+ double lo1_freq, double if1_freq, double if2_freq, double bandwidth);
+ static bool _has_mixer_spurs(double lo1_freq,
+ double lo2_freq,
+ double if2_freq,
+ double bandwidth,
+ int spur_order);
+
+ // Inputs
+ experts::data_reader_t<double> _rf_freq_d;
+ experts::data_reader_t<double> _if_freq_d;
+ // Outputs
+ experts::data_writer_t<twinrx_ctrl::signal_path_t> _signal_path;
experts::data_writer_t<twinrx_ctrl::preselector_path_t> _lb_presel;
experts::data_writer_t<twinrx_ctrl::preselector_path_t> _hb_presel;
- experts::data_writer_t<bool> _lb_preamp_presel;
- experts::data_writer_t<double> _lo1_freq_d;
- experts::data_writer_t<double> _lo2_freq_d;
- experts::data_writer_t<lo_inj_side_t> _lo1_inj_side;
- experts::data_writer_t<lo_inj_side_t> _lo2_inj_side;
+ experts::data_writer_t<bool> _lb_preamp_presel;
+ experts::data_writer_t<double> _lo1_freq_d;
+ experts::data_writer_t<double> _lo2_freq_d;
+ experts::data_writer_t<lo_inj_side_t> _lo1_inj_side;
+ experts::data_writer_t<lo_inj_side_t> _lo2_inj_side;
};
/*!---------------------------------------------------------
@@ -145,20 +160,21 @@ private:
* One instance of this expert is required for all channels
* ---------------------------------------------------------
*/
-class twinrx_lo_config_expert : public experts::worker_node_t {
+class twinrx_lo_config_expert : public experts::worker_node_t
+{
public:
twinrx_lo_config_expert(const experts::node_retriever_t& db)
- : experts::worker_node_t("twinrx_lo_config_expert"),
- _lo_source_ch0 (db, prepend_ch("los/all/source", "0")),
- _lo_source_ch1 (db, prepend_ch("los/all/source", "1")),
- _lo_export_ch0 (db, prepend_ch("los/all/export", "0")),
- _lo_export_ch1 (db, prepend_ch("los/all/export", "1")),
- _lo1_src_ch0 (db, prepend_ch("ch/LO1/source", "0")),
- _lo1_src_ch1 (db, prepend_ch("ch/LO1/source", "1")),
- _lo2_src_ch0 (db, prepend_ch("ch/LO2/source", "0")),
- _lo2_src_ch1 (db, prepend_ch("ch/LO2/source", "1")),
- _lo1_export_src (db, "com/LO1/export_source"),
- _lo2_export_src (db, "com/LO2/export_source")
+ : experts::worker_node_t("twinrx_lo_config_expert")
+ , _lo_source_ch0(db, prepend_ch("los/all/source", "0"))
+ , _lo_source_ch1(db, prepend_ch("los/all/source", "1"))
+ , _lo_export_ch0(db, prepend_ch("los/all/export", "0"))
+ , _lo_export_ch1(db, prepend_ch("los/all/export", "1"))
+ , _lo1_src_ch0(db, prepend_ch("ch/LO1/source", "0"))
+ , _lo1_src_ch1(db, prepend_ch("ch/LO1/source", "1"))
+ , _lo2_src_ch0(db, prepend_ch("ch/LO2/source", "0"))
+ , _lo2_src_ch1(db, prepend_ch("ch/LO2/source", "1"))
+ , _lo1_export_src(db, "com/LO1/export_source")
+ , _lo2_export_src(db, "com/LO2/export_source")
{
bind_accessor(_lo_source_ch0);
bind_accessor(_lo_source_ch1);
@@ -175,16 +191,16 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<std::string> _lo_source_ch0;
- experts::data_reader_t<std::string> _lo_source_ch1;
- experts::data_reader_t<bool> _lo_export_ch0;
- experts::data_reader_t<bool> _lo_export_ch1;
- //Outputs
- experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo1_src_ch0;
- experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo1_src_ch1;
- experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo2_src_ch0;
- experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo2_src_ch1;
+ // Inputs
+ experts::data_reader_t<std::string> _lo_source_ch0;
+ experts::data_reader_t<std::string> _lo_source_ch1;
+ experts::data_reader_t<bool> _lo_export_ch0;
+ experts::data_reader_t<bool> _lo_export_ch1;
+ // Outputs
+ experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo1_src_ch0;
+ experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo1_src_ch1;
+ experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo2_src_ch0;
+ experts::data_writer_t<twinrx_ctrl::lo_source_t> _lo2_src_ch1;
experts::data_writer_t<twinrx_ctrl::lo_export_source_t> _lo1_export_src;
experts::data_writer_t<twinrx_ctrl::lo_export_source_t> _lo2_export_src;
};
@@ -201,15 +217,20 @@ private:
* One instance of this expert is required for each LO stage
* ---------------------------------------------------------
*/
-class twinrx_lo_mapping_expert : public experts::worker_node_t {
+class twinrx_lo_mapping_expert : public experts::worker_node_t
+{
public:
twinrx_lo_mapping_expert(const experts::node_retriever_t& db, lo_stage_t stage)
- : experts::worker_node_t("twinrx_" + lo_stage_str(stage, true) + "_mapping_expert"),
- _lox_src_ch0 (db, prepend_ch("ch/" + lo_stage_str(stage) + "/source", "0")),
- _lox_src_ch1 (db, prepend_ch("ch/" + lo_stage_str(stage) + "/source", "1")),
- _lox_mapping_synth0 (db, prepend_ch("synth/" + lo_stage_str(stage) + "/mapping", "0")),
- _lox_mapping_synth1 (db, prepend_ch("synth/" + lo_stage_str(stage) + "/mapping", "1")),
- _lox_hopping_enabled (db, "com/synth/" + lo_stage_str(stage) + "/hopping_enabled")
+ : experts::worker_node_t(
+ "twinrx_" + lo_stage_str(stage, true) + "_mapping_expert")
+ , _lox_src_ch0(db, prepend_ch("ch/" + lo_stage_str(stage) + "/source", "0"))
+ , _lox_src_ch1(db, prepend_ch("ch/" + lo_stage_str(stage) + "/source", "1"))
+ , _lox_mapping_synth0(
+ db, prepend_ch("synth/" + lo_stage_str(stage) + "/mapping", "0"))
+ , _lox_mapping_synth1(
+ db, prepend_ch("synth/" + lo_stage_str(stage) + "/mapping", "1"))
+ , _lox_hopping_enabled(
+ db, "com/synth/" + lo_stage_str(stage) + "/hopping_enabled")
{
bind_accessor(_lox_src_ch0);
bind_accessor(_lox_src_ch1);
@@ -221,13 +242,13 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<twinrx_ctrl::lo_source_t> _lox_src_ch0;
- experts::data_reader_t<twinrx_ctrl::lo_source_t> _lox_src_ch1;
- //Outputs
- experts::data_writer_t<lo_synth_mapping_t> _lox_mapping_synth0;
- experts::data_writer_t<lo_synth_mapping_t> _lox_mapping_synth1;
- experts::data_writer_t<bool> _lox_hopping_enabled;
+ // Inputs
+ experts::data_reader_t<twinrx_ctrl::lo_source_t> _lox_src_ch0;
+ experts::data_reader_t<twinrx_ctrl::lo_source_t> _lox_src_ch1;
+ // Outputs
+ experts::data_writer_t<lo_synth_mapping_t> _lox_mapping_synth0;
+ experts::data_writer_t<lo_synth_mapping_t> _lox_mapping_synth1;
+ experts::data_writer_t<bool> _lox_hopping_enabled;
};
/*!---------------------------------------------------------
@@ -240,16 +261,17 @@ private:
* One instance of this expert is required for each channel
* ---------------------------------------------------------
*/
-class twinrx_freq_coercion_expert : public experts::worker_node_t {
+class twinrx_freq_coercion_expert : public experts::worker_node_t
+{
public:
twinrx_freq_coercion_expert(const experts::node_retriever_t& db, std::string ch)
- : experts::worker_node_t(prepend_ch("twinrx_freq_coercion_expert", ch)),
- _lo1_freq_c (db, prepend_ch("los/LO1/freq/coerced", ch)),
- _lo2_freq_c (db, prepend_ch("los/LO2/freq/coerced", ch)),
- _if_freq_d (db, prepend_ch("if_freq/desired", ch)),
- _lo1_inj_side (db, prepend_ch("ch/LO1/inj_side", ch)),
- _lo2_inj_side (db, prepend_ch("ch/LO2/inj_side", ch)),
- _rf_freq_c (db, prepend_ch("freq/coerced", ch))
+ : experts::worker_node_t(prepend_ch("twinrx_freq_coercion_expert", ch))
+ , _lo1_freq_c(db, prepend_ch("los/LO1/freq/coerced", ch))
+ , _lo2_freq_c(db, prepend_ch("los/LO2/freq/coerced", ch))
+ , _if_freq_d(db, prepend_ch("if_freq/desired", ch))
+ , _lo1_inj_side(db, prepend_ch("ch/LO1/inj_side", ch))
+ , _lo2_inj_side(db, prepend_ch("ch/LO2/inj_side", ch))
+ , _rf_freq_c(db, prepend_ch("freq/coerced", ch))
{
bind_accessor(_lo1_freq_c);
bind_accessor(_lo2_freq_c);
@@ -262,14 +284,14 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<double> _lo1_freq_c;
- experts::data_reader_t<double> _lo2_freq_c;
- experts::data_reader_t<double> _if_freq_d;
- experts::data_reader_t<lo_inj_side_t> _lo1_inj_side;
- experts::data_reader_t<lo_inj_side_t> _lo2_inj_side;
- //Outputs
- experts::data_writer_t<double> _rf_freq_c;
+ // Inputs
+ experts::data_reader_t<double> _lo1_freq_c;
+ experts::data_reader_t<double> _lo2_freq_c;
+ experts::data_reader_t<double> _if_freq_d;
+ experts::data_reader_t<lo_inj_side_t> _lo1_inj_side;
+ experts::data_reader_t<lo_inj_side_t> _lo2_inj_side;
+ // Outputs
+ experts::data_writer_t<double> _rf_freq_c;
};
/*!---------------------------------------------------------
@@ -281,21 +303,23 @@ private:
* One instance of this expert is required for each channel
* ---------------------------------------------------------
*/
-class twinrx_nyquist_expert : public experts::worker_node_t {
+class twinrx_nyquist_expert : public experts::worker_node_t
+{
public:
- twinrx_nyquist_expert(const experts::node_retriever_t& db, std::string ch,
- dboard_iface::sptr db_iface)
- : experts::worker_node_t(prepend_ch("twinrx_nyquist_expert", ch)),
- _channel (ch),
- _codec_conn (ch=="0"?"II":"QQ"), //Ch->ADC Port mapping
- _lo1_freq_d (db, prepend_ch("los/LO1/freq/desired", ch)),
- _lo2_freq_d (db, prepend_ch("los/LO2/freq/desired", ch)),
- _if_freq_d (db, prepend_ch("if_freq/desired", ch)),
- _lo1_inj_side (db, prepend_ch("ch/LO1/inj_side", ch)),
- _lo2_inj_side (db, prepend_ch("ch/LO2/inj_side", ch)),
- _rx_frontend_time (db, prepend_ch("time/rx_frontend", ch)),
- _if_freq_c (db, prepend_ch("if_freq/coerced", ch)),
- _db_iface (db_iface)
+ twinrx_nyquist_expert(
+ const experts::node_retriever_t& db, std::string ch, dboard_iface::sptr db_iface)
+ : experts::worker_node_t(prepend_ch("twinrx_nyquist_expert", ch))
+ , _channel(ch)
+ , _codec_conn(ch == "0" ? "II" : "QQ")
+ , // Ch->ADC Port mapping
+ _lo1_freq_d(db, prepend_ch("los/LO1/freq/desired", ch))
+ , _lo2_freq_d(db, prepend_ch("los/LO2/freq/desired", ch))
+ , _if_freq_d(db, prepend_ch("if_freq/desired", ch))
+ , _lo1_inj_side(db, prepend_ch("ch/LO1/inj_side", ch))
+ , _lo2_inj_side(db, prepend_ch("ch/LO2/inj_side", ch))
+ , _rx_frontend_time(db, prepend_ch("time/rx_frontend", ch))
+ , _if_freq_c(db, prepend_ch("if_freq/coerced", ch))
+ , _db_iface(db_iface)
{
bind_accessor(_lo1_freq_d);
bind_accessor(_lo2_freq_d);
@@ -309,22 +333,22 @@ public:
private:
virtual void resolve();
- //Inputs
- const std::string _channel;
- const std::string _codec_conn;
- experts::data_reader_t<double> _lo1_freq_d;
- experts::data_reader_t<double> _lo2_freq_d;
- experts::data_reader_t<double> _if_freq_d;
- experts::data_reader_t<lo_inj_side_t> _lo1_inj_side;
- experts::data_reader_t<lo_inj_side_t> _lo2_inj_side;
- experts::data_reader_t<time_spec_t> _rx_frontend_time;
-
- //Outputs
- experts::data_writer_t<double> _if_freq_c;
- dboard_iface::sptr _db_iface;
-
- //Misc
- time_spec_t _cached_cmd_time;
+ // Inputs
+ const std::string _channel;
+ const std::string _codec_conn;
+ experts::data_reader_t<double> _lo1_freq_d;
+ experts::data_reader_t<double> _lo2_freq_d;
+ experts::data_reader_t<double> _if_freq_d;
+ experts::data_reader_t<lo_inj_side_t> _lo1_inj_side;
+ experts::data_reader_t<lo_inj_side_t> _lo2_inj_side;
+ experts::data_reader_t<time_spec_t> _rx_frontend_time;
+
+ // Outputs
+ experts::data_writer_t<double> _if_freq_c;
+ dboard_iface::sptr _db_iface;
+
+ // Misc
+ time_spec_t _cached_cmd_time;
};
/*!---------------------------------------------------------
@@ -337,18 +361,19 @@ private:
* One instance of this expert is required for all channels
* ---------------------------------------------------------
*/
-class twinrx_antenna_expert : public experts::worker_node_t {
+class twinrx_antenna_expert : public experts::worker_node_t
+{
public:
twinrx_antenna_expert(const experts::node_retriever_t& db)
- : experts::worker_node_t("twinrx_antenna_expert"),
- _antenna_ch0 (db, prepend_ch("antenna", "0")),
- _antenna_ch1 (db, prepend_ch("antenna", "1")),
- _enabled_ch0 (db, prepend_ch("enabled", "0")),
- _enabled_ch1 (db, prepend_ch("enabled", "1")),
- _lo_export_ch0 (db, prepend_ch("los/all/export", "0")),
- _lo_export_ch1 (db, prepend_ch("los/all/export", "1")),
- _ant_mapping (db, "com/ant_mapping"),
- _cal_mode (db, "com/cal_mode")
+ : experts::worker_node_t("twinrx_antenna_expert")
+ , _antenna_ch0(db, prepend_ch("antenna", "0"))
+ , _antenna_ch1(db, prepend_ch("antenna", "1"))
+ , _enabled_ch0(db, prepend_ch("enabled", "0"))
+ , _enabled_ch1(db, prepend_ch("enabled", "1"))
+ , _lo_export_ch0(db, prepend_ch("los/all/export", "0"))
+ , _lo_export_ch1(db, prepend_ch("los/all/export", "1"))
+ , _ant_mapping(db, "com/ant_mapping")
+ , _cal_mode(db, "com/cal_mode")
{
bind_accessor(_antenna_ch0);
bind_accessor(_antenna_ch1);
@@ -363,16 +388,16 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<std::string> _antenna_ch0;
- experts::data_reader_t<std::string> _antenna_ch1;
- experts::data_reader_t<bool> _enabled_ch0;
- experts::data_reader_t<bool> _enabled_ch1;
- experts::data_reader_t<bool> _lo_export_ch0;
- experts::data_reader_t<bool> _lo_export_ch1;
- //Outputs
- experts::data_writer_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
- experts::data_writer_t<twinrx_ctrl::cal_mode_t> _cal_mode;
+ // Inputs
+ experts::data_reader_t<std::string> _antenna_ch0;
+ experts::data_reader_t<std::string> _antenna_ch1;
+ experts::data_reader_t<bool> _enabled_ch0;
+ experts::data_reader_t<bool> _enabled_ch1;
+ experts::data_reader_t<bool> _lo_export_ch0;
+ experts::data_reader_t<bool> _lo_export_ch1;
+ // Outputs
+ experts::data_writer_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
+ experts::data_writer_t<twinrx_ctrl::cal_mode_t> _cal_mode;
};
/*!---------------------------------------------------------
@@ -386,21 +411,22 @@ private:
* One instance of this expert is required for each channel
* ---------------------------------------------------------
*/
-class twinrx_chan_gain_expert : public experts::worker_node_t {
+class twinrx_chan_gain_expert : public experts::worker_node_t
+{
public:
twinrx_chan_gain_expert(const experts::node_retriever_t& db, std::string ch)
- : experts::worker_node_t(prepend_ch("twinrx_chan_gain_expert", ch)),
- _gain (db, prepend_ch("gain", ch)),
- _gain_profile (db, prepend_ch("gain_profile", ch)),
- _signal_path (db, prepend_ch("ch/signal_path", ch)),
- _lb_presel (db, prepend_ch("ch/lb_presel", ch)),
- _hb_presel (db, prepend_ch("ch/hb_presel", ch)),
- _ant_mapping (db, "com/ant_mapping"),
- _input_atten (db, prepend_ch("ch/input_atten", ch)),
- _lb_atten (db, prepend_ch("ch/lb_atten", ch)),
- _hb_atten (db, prepend_ch("ch/hb_atten", ch)),
- _preamp1 (db, prepend_ch("ch/preamp1", ch)),
- _preamp2 (db, prepend_ch("ch/preamp2", ch))
+ : experts::worker_node_t(prepend_ch("twinrx_chan_gain_expert", ch))
+ , _gain(db, prepend_ch("gain", ch))
+ , _gain_profile(db, prepend_ch("gain_profile", ch))
+ , _signal_path(db, prepend_ch("ch/signal_path", ch))
+ , _lb_presel(db, prepend_ch("ch/lb_presel", ch))
+ , _hb_presel(db, prepend_ch("ch/hb_presel", ch))
+ , _ant_mapping(db, "com/ant_mapping")
+ , _input_atten(db, prepend_ch("ch/input_atten", ch))
+ , _lb_atten(db, prepend_ch("ch/lb_atten", ch))
+ , _hb_atten(db, prepend_ch("ch/hb_atten", ch))
+ , _preamp1(db, prepend_ch("ch/preamp1", ch))
+ , _preamp2(db, prepend_ch("ch/preamp2", ch))
{
bind_accessor(_gain);
bind_accessor(_gain_profile);
@@ -418,19 +444,19 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<double> _gain;
- experts::data_reader_t<std::string> _gain_profile;
- experts::data_reader_t<twinrx_ctrl::signal_path_t> _signal_path;
+ // Inputs
+ experts::data_reader_t<double> _gain;
+ experts::data_reader_t<std::string> _gain_profile;
+ experts::data_reader_t<twinrx_ctrl::signal_path_t> _signal_path;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> _lb_presel;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> _hb_presel;
- experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
- //Outputs
- experts::data_writer_t<uint8_t> _input_atten;
- experts::data_writer_t<uint8_t> _lb_atten;
- experts::data_writer_t<uint8_t> _hb_atten;
- experts::data_writer_t<twinrx_ctrl::preamp_state_t> _preamp1;
- experts::data_writer_t<bool> _preamp2;
+ experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
+ // Outputs
+ experts::data_writer_t<uint8_t> _input_atten;
+ experts::data_writer_t<uint8_t> _lb_atten;
+ experts::data_writer_t<uint8_t> _hb_atten;
+ experts::data_writer_t<twinrx_ctrl::preamp_state_t> _preamp1;
+ experts::data_writer_t<bool> _preamp2;
};
/*!---------------------------------------------------------
@@ -443,27 +469,28 @@ private:
* One instance of this expert is required for all channels
* ---------------------------------------------------------
*/
-class twinrx_ant_gain_expert : public experts::worker_node_t {
+class twinrx_ant_gain_expert : public experts::worker_node_t
+{
public:
twinrx_ant_gain_expert(const experts::node_retriever_t& db)
- : experts::worker_node_t("twinrx_ant_gain_expert"),
- _ant_mapping (db, "com/ant_mapping"),
- _ch0_input_atten (db, prepend_ch("ch/input_atten", "0")),
- _ch0_preamp1 (db, prepend_ch("ch/preamp1", "0")),
- _ch0_preamp2 (db, prepend_ch("ch/preamp2", "0")),
- _ch0_lb_preamp_presel (db, prepend_ch("ch/lb_preamp_presel", "0")),
- _ch1_input_atten (db, prepend_ch("ch/input_atten", "1")),
- _ch1_preamp1 (db, prepend_ch("ch/preamp1", "1")),
- _ch1_preamp2 (db, prepend_ch("ch/preamp2", "1")),
- _ch1_lb_preamp_presel (db, prepend_ch("ch/lb_preamp_presel", "1")),
- _ant0_input_atten (db, prepend_ch("ant/input_atten", "0")),
- _ant0_preamp1 (db, prepend_ch("ant/preamp1", "0")),
- _ant0_preamp2 (db, prepend_ch("ant/preamp2", "0")),
- _ant0_lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", "0")),
- _ant1_input_atten (db, prepend_ch("ant/input_atten", "1")),
- _ant1_preamp1 (db, prepend_ch("ant/preamp1", "1")),
- _ant1_preamp2 (db, prepend_ch("ant/preamp2", "1")),
- _ant1_lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", "1"))
+ : experts::worker_node_t("twinrx_ant_gain_expert")
+ , _ant_mapping(db, "com/ant_mapping")
+ , _ch0_input_atten(db, prepend_ch("ch/input_atten", "0"))
+ , _ch0_preamp1(db, prepend_ch("ch/preamp1", "0"))
+ , _ch0_preamp2(db, prepend_ch("ch/preamp2", "0"))
+ , _ch0_lb_preamp_presel(db, prepend_ch("ch/lb_preamp_presel", "0"))
+ , _ch1_input_atten(db, prepend_ch("ch/input_atten", "1"))
+ , _ch1_preamp1(db, prepend_ch("ch/preamp1", "1"))
+ , _ch1_preamp2(db, prepend_ch("ch/preamp2", "1"))
+ , _ch1_lb_preamp_presel(db, prepend_ch("ch/lb_preamp_presel", "1"))
+ , _ant0_input_atten(db, prepend_ch("ant/input_atten", "0"))
+ , _ant0_preamp1(db, prepend_ch("ant/preamp1", "0"))
+ , _ant0_preamp2(db, prepend_ch("ant/preamp2", "0"))
+ , _ant0_lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", "0"))
+ , _ant1_input_atten(db, prepend_ch("ant/input_atten", "1"))
+ , _ant1_preamp1(db, prepend_ch("ant/preamp1", "1"))
+ , _ant1_preamp2(db, prepend_ch("ant/preamp2", "1"))
+ , _ant1_lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", "1"))
{
bind_accessor(_ant_mapping);
bind_accessor(_ch0_input_atten);
@@ -487,26 +514,26 @@ public:
private:
virtual void resolve();
- //Inputs
- experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
- experts::data_reader_t<uint8_t> _ch0_input_atten;
- experts::data_reader_t<twinrx_ctrl::preamp_state_t> _ch0_preamp1;
- experts::data_reader_t<bool> _ch0_preamp2;
- experts::data_reader_t<bool> _ch0_lb_preamp_presel;
- experts::data_reader_t<uint8_t> _ch1_input_atten;
- experts::data_reader_t<twinrx_ctrl::preamp_state_t> _ch1_preamp1;
- experts::data_reader_t<bool> _ch1_preamp2;
- experts::data_reader_t<bool> _ch1_lb_preamp_presel;
-
- //Outputs
- experts::data_writer_t<uint8_t> _ant0_input_atten;
- experts::data_writer_t<twinrx_ctrl::preamp_state_t> _ant0_preamp1;
- experts::data_writer_t<bool> _ant0_preamp2;
- experts::data_writer_t<bool> _ant0_lb_preamp_presel;
- experts::data_writer_t<uint8_t> _ant1_input_atten;
- experts::data_writer_t<twinrx_ctrl::preamp_state_t> _ant1_preamp1;
- experts::data_writer_t<bool> _ant1_preamp2;
- experts::data_writer_t<bool> _ant1_lb_preamp_presel;
+ // Inputs
+ experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
+ experts::data_reader_t<uint8_t> _ch0_input_atten;
+ experts::data_reader_t<twinrx_ctrl::preamp_state_t> _ch0_preamp1;
+ experts::data_reader_t<bool> _ch0_preamp2;
+ experts::data_reader_t<bool> _ch0_lb_preamp_presel;
+ experts::data_reader_t<uint8_t> _ch1_input_atten;
+ experts::data_reader_t<twinrx_ctrl::preamp_state_t> _ch1_preamp1;
+ experts::data_reader_t<bool> _ch1_preamp2;
+ experts::data_reader_t<bool> _ch1_lb_preamp_presel;
+
+ // Outputs
+ experts::data_writer_t<uint8_t> _ant0_input_atten;
+ experts::data_writer_t<twinrx_ctrl::preamp_state_t> _ant0_preamp1;
+ experts::data_writer_t<bool> _ant0_preamp2;
+ experts::data_writer_t<bool> _ant0_lb_preamp_presel;
+ experts::data_writer_t<uint8_t> _ant1_input_atten;
+ experts::data_writer_t<twinrx_ctrl::preamp_state_t> _ant1_preamp1;
+ experts::data_writer_t<bool> _ant1_preamp2;
+ experts::data_writer_t<bool> _ant1_lb_preamp_presel;
};
/*!---------------------------------------------------------
@@ -521,25 +548,27 @@ private:
* One instance of this expert is required for all channels
* ---------------------------------------------------------
*/
-class twinrx_settings_expert : public experts::worker_node_t {
+class twinrx_settings_expert : public experts::worker_node_t
+{
public:
twinrx_settings_expert(const experts::node_retriever_t& db, twinrx_ctrl::sptr ctrl)
- : experts::worker_node_t("twinrx_settings_expert"), _ctrl(ctrl),
- _ch0 (db, "0"),
- _ch1 (db, "1"),
- _lo1_synth0_mapping(db, "0/synth/LO1/mapping"),
- _lo1_synth1_mapping(db, "1/synth/LO1/mapping"),
- _lo2_synth0_mapping(db, "0/synth/LO2/mapping"),
- _lo2_synth1_mapping(db, "1/synth/LO2/mapping"),
- _lo1_hopping_enabled(db, "com/synth/LO1/hopping_enabled"),
- _lo2_hopping_enabled(db, "com/synth/LO2/hopping_enabled"),
- _lo1_export_src (db, "com/LO1/export_source"),
- _lo2_export_src (db, "com/LO2/export_source"),
- _ant_mapping (db, "com/ant_mapping"),
- _cal_mode (db, "com/cal_mode")
+ : experts::worker_node_t("twinrx_settings_expert")
+ , _ctrl(ctrl)
+ , _ch0(db, "0")
+ , _ch1(db, "1")
+ , _lo1_synth0_mapping(db, "0/synth/LO1/mapping")
+ , _lo1_synth1_mapping(db, "1/synth/LO1/mapping")
+ , _lo2_synth0_mapping(db, "0/synth/LO2/mapping")
+ , _lo2_synth1_mapping(db, "1/synth/LO2/mapping")
+ , _lo1_hopping_enabled(db, "com/synth/LO1/hopping_enabled")
+ , _lo2_hopping_enabled(db, "com/synth/LO2/hopping_enabled")
+ , _lo1_export_src(db, "com/LO1/export_source")
+ , _lo2_export_src(db, "com/LO2/export_source")
+ , _ant_mapping(db, "com/ant_mapping")
+ , _cal_mode(db, "com/cal_mode")
{
for (size_t i = 0; i < 2; i++) {
- ch_settings& ch = (i==1) ? _ch1 : _ch0;
+ ch_settings& ch = (i == 1) ? _ch1 : _ch0;
bind_accessor(ch.chan_enabled);
bind_accessor(ch.preamp1);
bind_accessor(ch.preamp2);
@@ -575,103 +604,105 @@ public:
private:
virtual void resolve();
- void _resolve_lox_freq(
- lo_stage_t lo_stage,
+ void _resolve_lox_freq(lo_stage_t lo_stage,
experts::data_reader_t<double>& ch0_freq_d,
experts::data_reader_t<double>& ch1_freq_d,
experts::data_writer_t<double>& ch0_freq_c,
experts::data_writer_t<double>& ch1_freq_c,
- twinrx_ctrl::lo_source_t ch0_lo_source,
- twinrx_ctrl::lo_source_t ch1_lo_source,
- lo_synth_mapping_t synth0_mapping,
- lo_synth_mapping_t synth1_mapping,
- bool hopping_enabled);
+ twinrx_ctrl::lo_source_t ch0_lo_source,
+ twinrx_ctrl::lo_source_t ch1_lo_source,
+ lo_synth_mapping_t synth0_mapping,
+ lo_synth_mapping_t synth1_mapping,
+ bool hopping_enabled);
double _set_lox_synth_freq(lo_stage_t stage, twinrx_ctrl::channel_t ch, double freq);
- class ch_settings {
+ class ch_settings
+ {
public:
- ch_settings(const experts::node_retriever_t& db, const std::string& ch) :
- chan_enabled (db, prepend_ch("enabled", ch)),
- preamp1 (db, prepend_ch("ant/preamp1", ch)),
- preamp2 (db, prepend_ch("ant/preamp2", ch)),
- lb_preamp_presel (db, prepend_ch("ant/lb_preamp_presel", ch)),
- signal_path (db, prepend_ch("ch/signal_path", ch)),
- lb_presel (db, prepend_ch("ch/lb_presel", ch)),
- hb_presel (db, prepend_ch("ch/hb_presel", ch)),
- input_atten (db, prepend_ch("ant/input_atten", ch)),
- lb_atten (db, prepend_ch("ch/lb_atten", ch)),
- hb_atten (db, prepend_ch("ch/hb_atten", ch)),
- lo1_source (db, prepend_ch("ch/LO1/source", ch)),
- lo2_source (db, prepend_ch("ch/LO2/source", ch)),
- lo1_freq_d (db, prepend_ch("los/LO1/freq/desired", ch)),
- lo2_freq_d (db, prepend_ch("los/LO2/freq/desired", ch)),
- lo1_charge_pump_d (db, prepend_ch("los/LO1/charge_pump/desired", ch)),
- lo2_charge_pump_d (db, prepend_ch("los/LO2/charge_pump/desired", ch)),
- lo1_freq_c (db, prepend_ch("los/LO1/freq/coerced", ch)),
- lo2_freq_c (db, prepend_ch("los/LO2/freq/coerced", ch)),
- lo1_charge_pump_c (db, prepend_ch("los/LO1/charge_pump/coerced", ch)),
- lo2_charge_pump_c (db, prepend_ch("los/LO2/charge_pump/coerced", ch))
- {}
-
- //Inputs (channel specific)
- experts::data_reader_t<bool> chan_enabled;
- experts::data_reader_t<twinrx_ctrl::preamp_state_t> preamp1;
- experts::data_reader_t<bool> preamp2;
- experts::data_reader_t<bool> lb_preamp_presel;
- experts::data_reader_t<twinrx_ctrl::signal_path_t> signal_path;
+ ch_settings(const experts::node_retriever_t& db, const std::string& ch)
+ : chan_enabled(db, prepend_ch("enabled", ch))
+ , preamp1(db, prepend_ch("ant/preamp1", ch))
+ , preamp2(db, prepend_ch("ant/preamp2", ch))
+ , lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", ch))
+ , signal_path(db, prepend_ch("ch/signal_path", ch))
+ , lb_presel(db, prepend_ch("ch/lb_presel", ch))
+ , hb_presel(db, prepend_ch("ch/hb_presel", ch))
+ , input_atten(db, prepend_ch("ant/input_atten", ch))
+ , lb_atten(db, prepend_ch("ch/lb_atten", ch))
+ , hb_atten(db, prepend_ch("ch/hb_atten", ch))
+ , lo1_source(db, prepend_ch("ch/LO1/source", ch))
+ , lo2_source(db, prepend_ch("ch/LO2/source", ch))
+ , lo1_freq_d(db, prepend_ch("los/LO1/freq/desired", ch))
+ , lo2_freq_d(db, prepend_ch("los/LO2/freq/desired", ch))
+ , lo1_charge_pump_d(db, prepend_ch("los/LO1/charge_pump/desired", ch))
+ , lo2_charge_pump_d(db, prepend_ch("los/LO2/charge_pump/desired", ch))
+ , lo1_freq_c(db, prepend_ch("los/LO1/freq/coerced", ch))
+ , lo2_freq_c(db, prepend_ch("los/LO2/freq/coerced", ch))
+ , lo1_charge_pump_c(db, prepend_ch("los/LO1/charge_pump/coerced", ch))
+ , lo2_charge_pump_c(db, prepend_ch("los/LO2/charge_pump/coerced", ch))
+ {
+ }
+
+ // Inputs (channel specific)
+ experts::data_reader_t<bool> chan_enabled;
+ experts::data_reader_t<twinrx_ctrl::preamp_state_t> preamp1;
+ experts::data_reader_t<bool> preamp2;
+ experts::data_reader_t<bool> lb_preamp_presel;
+ experts::data_reader_t<twinrx_ctrl::signal_path_t> signal_path;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> lb_presel;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> hb_presel;
- experts::data_reader_t<uint8_t> input_atten;
- experts::data_reader_t<uint8_t> lb_atten;
- experts::data_reader_t<uint8_t> hb_atten;
- experts::data_reader_t<twinrx_ctrl::lo_source_t> lo1_source;
- experts::data_reader_t<twinrx_ctrl::lo_source_t> lo2_source;
- experts::data_reader_t<double> lo1_freq_d;
- experts::data_reader_t<double> lo2_freq_d;
- experts::data_reader_t<double> lo1_charge_pump_d;
- experts::data_reader_t<double> lo2_charge_pump_d;
-
- //Output (channel specific)
- experts::data_writer_t<double> lo1_freq_c;
- experts::data_writer_t<double> lo2_freq_c;
- experts::data_writer_t<double> lo1_charge_pump_c;
- experts::data_writer_t<double> lo2_charge_pump_c;
+ experts::data_reader_t<uint8_t> input_atten;
+ experts::data_reader_t<uint8_t> lb_atten;
+ experts::data_reader_t<uint8_t> hb_atten;
+ experts::data_reader_t<twinrx_ctrl::lo_source_t> lo1_source;
+ experts::data_reader_t<twinrx_ctrl::lo_source_t> lo2_source;
+ experts::data_reader_t<double> lo1_freq_d;
+ experts::data_reader_t<double> lo2_freq_d;
+ experts::data_reader_t<double> lo1_charge_pump_d;
+ experts::data_reader_t<double> lo2_charge_pump_d;
+
+ // Output (channel specific)
+ experts::data_writer_t<double> lo1_freq_c;
+ experts::data_writer_t<double> lo2_freq_c;
+ experts::data_writer_t<double> lo1_charge_pump_c;
+ experts::data_writer_t<double> lo2_charge_pump_c;
};
- //External interface
- twinrx_ctrl::sptr _ctrl;
-
- //Inputs (channel agnostic)
- ch_settings _ch0;
- ch_settings _ch1;
- experts::data_reader_t<lo_synth_mapping_t> _lo1_synth0_mapping;
- experts::data_reader_t<lo_synth_mapping_t> _lo1_synth1_mapping;
- experts::data_reader_t<lo_synth_mapping_t> _lo2_synth0_mapping;
- experts::data_reader_t<lo_synth_mapping_t> _lo2_synth1_mapping;
- experts::data_reader_t<bool> _lo1_hopping_enabled;
- experts::data_reader_t<bool> _lo2_hopping_enabled;
+ // External interface
+ twinrx_ctrl::sptr _ctrl;
+
+ // Inputs (channel agnostic)
+ ch_settings _ch0;
+ ch_settings _ch1;
+ experts::data_reader_t<lo_synth_mapping_t> _lo1_synth0_mapping;
+ experts::data_reader_t<lo_synth_mapping_t> _lo1_synth1_mapping;
+ experts::data_reader_t<lo_synth_mapping_t> _lo2_synth0_mapping;
+ experts::data_reader_t<lo_synth_mapping_t> _lo2_synth1_mapping;
+ experts::data_reader_t<bool> _lo1_hopping_enabled;
+ experts::data_reader_t<bool> _lo2_hopping_enabled;
experts::data_reader_t<twinrx_ctrl::lo_export_source_t> _lo1_export_src;
experts::data_reader_t<twinrx_ctrl::lo_export_source_t> _lo2_export_src;
- experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
- experts::data_reader_t<twinrx_ctrl::cal_mode_t> _cal_mode;
+ experts::data_reader_t<twinrx_ctrl::antenna_mapping_t> _ant_mapping;
+ experts::data_reader_t<twinrx_ctrl::cal_mode_t> _cal_mode;
- //Outputs (channel agnostic)
- //None
+ // Outputs (channel agnostic)
+ // None
- //Misc
- struct lo_freq_cache_t {
+ // Misc
+ struct lo_freq_cache_t
+ {
rf_freq_ppm_t desired;
- double coerced;
+ double coerced;
};
- lo_freq_cache_t _cached_lo1_synth0_freq;
- lo_freq_cache_t _cached_lo2_synth0_freq;
- lo_freq_cache_t _cached_lo1_synth1_freq;
- lo_freq_cache_t _cached_lo2_synth1_freq;
+ lo_freq_cache_t _cached_lo1_synth0_freq;
+ lo_freq_cache_t _cached_lo2_synth0_freq;
+ lo_freq_cache_t _cached_lo1_synth1_freq;
+ lo_freq_cache_t _cached_lo2_synth1_freq;
static const bool FORCE_COMMIT;
};
-}}}} //namespaces
+}}}} // namespace uhd::usrp::dboard::twinrx
#endif /* INCLUDED_DBOARD_TWINRX_EXPERTS_HPP */
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.cpp b/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.cpp
index cc9336f2a..729141b35 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.cpp
@@ -796,13 +796,11 @@ static const std::vector<twinrx_gain_config_t> LOWBAND4_TABLE{
};
// clang-format on
-const twinrx_gain_table twinrx_gain_table::lookup_table
-(
+const twinrx_gain_table twinrx_gain_table::lookup_table(
twinrx_ctrl::signal_path_t signal_path,
twinrx_ctrl::preselector_path_t preselector_path,
- std::string
-) {
-
+ std::string)
+{
if (signal_path == twinrx_ctrl::PATH_HIGHBAND) {
switch (preselector_path) {
case twinrx_ctrl::PRESEL_PATH1:
@@ -829,12 +827,15 @@ const twinrx_gain_table twinrx_gain_table::lookup_table
throw runtime_error("NO GAIN TABLE SELECTED");
}
-const twinrx_gain_config_t& twinrx_gain_table::find_by_index(size_t index) const {
- if (index >= get_num_entries()) throw uhd::value_error("invalid gain table index");
+const twinrx_gain_config_t& twinrx_gain_table::find_by_index(size_t index) const
+{
+ if (index >= get_num_entries())
+ throw uhd::value_error("invalid gain table index");
return _tbl.at(index);
}
-uhd::gain_range_t twinrx_gain_table::get_gain_range() const {
+uhd::gain_range_t twinrx_gain_table::get_gain_range() const
+{
double max = std::numeric_limits<double>::min();
double min = std::numeric_limits<double>::max();
for (size_t i = 0; i < get_num_entries(); i++) {
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.hpp b/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.hpp
index 94469ab0b..f02241745 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_gain_tables.hpp
@@ -8,56 +8,65 @@
#ifndef INCLUDED_DBOARD_TWINRX_GAIN_TABLES_HPP
#define INCLUDED_DBOARD_TWINRX_GAIN_TABLES_HPP
+#include "twinrx_ctrl.hpp"
#include <uhd/config.hpp>
-#include <stdint.h>
#include <uhd/types/ranges.hpp>
-#include "twinrx_ctrl.hpp"
+#include <stdint.h>
namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
-class twinrx_gain_config_t {
+class twinrx_gain_config_t
+{
public:
- twinrx_gain_config_t(
- size_t index_, double sys_gain_,
- uint8_t atten1_, uint8_t atten2_,
- bool amp1_, bool amp2_
- ): index(index_), sys_gain(sys_gain_), atten1(atten1_), atten2(atten2_),
- amp1(amp1_), amp2(amp2_)
- {}
+ twinrx_gain_config_t(size_t index_,
+ double sys_gain_,
+ uint8_t atten1_,
+ uint8_t atten2_,
+ bool amp1_,
+ bool amp2_)
+ : index(index_)
+ , sys_gain(sys_gain_)
+ , atten1(atten1_)
+ , atten2(atten2_)
+ , amp1(amp1_)
+ , amp2(amp2_)
+ {
+ }
- twinrx_gain_config_t& operator=(const twinrx_gain_config_t& src) {
+ twinrx_gain_config_t& operator=(const twinrx_gain_config_t& src)
+ {
if (this != &src) {
- this->index = src.index;
+ this->index = src.index;
this->sys_gain = src.sys_gain;
- this->atten1 = src.atten1;
- this->atten2 = src.atten2;
- this->amp1 = src.amp1;
- this->amp2 = src.amp2;
+ this->atten1 = src.atten1;
+ this->atten2 = src.atten2;
+ this->amp1 = src.amp1;
+ this->amp2 = src.amp2;
}
return *this;
}
- size_t index;
- double sys_gain;
+ size_t index;
+ double sys_gain;
uint8_t atten1;
uint8_t atten2;
- bool amp1;
- bool amp2;
+ bool amp1;
+ bool amp2;
};
-class twinrx_gain_table {
+class twinrx_gain_table
+{
public:
- static const twinrx_gain_table lookup_table(
- twinrx_ctrl::signal_path_t signal_path,
+ static const twinrx_gain_table lookup_table(twinrx_ctrl::signal_path_t signal_path,
twinrx_ctrl::preselector_path_t presel_path,
std::string profile);
- twinrx_gain_table(const std::vector<twinrx_gain_config_t>& tbl)
- : _tbl(tbl) {}
+ twinrx_gain_table(const std::vector<twinrx_gain_config_t>& tbl) : _tbl(tbl) {}
const twinrx_gain_config_t& find_by_index(size_t index) const;
- inline size_t get_num_entries() const {
+ inline size_t get_num_entries() const
+ {
return _tbl.size();
}
@@ -68,6 +77,6 @@ private:
};
-}}}} //namespaces
+}}}} // namespace uhd::usrp::dboard::twinrx
#endif /* INCLUDED_DBOARD_TWINRX_GAIN_TABLES_HPP */
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ids.hpp b/host/lib/usrp/dboard/twinrx/twinrx_ids.hpp
index 599b1d456..118090701 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ids.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ids.hpp
@@ -8,9 +8,9 @@ using namespace uhd;
using namespace usrp;
namespace twinrx {
- const dboard_id_t TWINRX_REV_A_ID(0x91);
- const dboard_id_t TWINRX_REV_B_ID(0x93);
- const dboard_id_t TWINRX_REV_C_ID(0x95);
-}
+const dboard_id_t TWINRX_REV_A_ID(0x91);
+const dboard_id_t TWINRX_REV_B_ID(0x93);
+const dboard_id_t TWINRX_REV_C_ID(0x95);
+} // namespace twinrx
#endif
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_io.hpp b/host/lib/usrp/dboard/twinrx/twinrx_io.hpp
index e3e475148..2949138dd 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_io.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_io.hpp
@@ -19,24 +19,35 @@ namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
static const uint32_t SET_ALL_BITS = 0xFFFFFFFF;
namespace cpld {
-static wb_iface::wb_addr_type addr(uint8_t cpld_num, uint8_t cpld_addr) {
- //Decode CPLD addressing for the following bitmap:
+static wb_iface::wb_addr_type addr(uint8_t cpld_num, uint8_t cpld_addr)
+{
+ // Decode CPLD addressing for the following bitmap:
// {CPLD1_EN, CPLD2_EN, CPLD3_EN, CPLD4_EN, CPLD_ADDR[2:0]}
uint8_t addr = 0;
switch (cpld_num) {
- case 1: addr = 0x8 << 3; break;
- case 2: addr = 0x4 << 3; break;
- case 3: addr = 0x2 << 3; break;
- case 4: addr = 0x1 << 3; break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ case 1:
+ addr = 0x8 << 3;
+ break;
+ case 2:
+ addr = 0x4 << 3;
+ break;
+ case 3:
+ addr = 0x2 << 3;
+ break;
+ case 4:
+ addr = 0x1 << 3;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
return static_cast<wb_iface::wb_addr_type>(addr | (cpld_addr & 0x7));
}
-static uint32_t get_reg(wb_iface::wb_addr_type addr) {
+static uint32_t get_reg(wb_iface::wb_addr_type addr)
+{
return static_cast<uint32_t>(addr) & 0x7;
}
-}
+} // namespace cpld
class twinrx_gpio : public wb_iface
{
@@ -44,163 +55,196 @@ public:
typedef std::shared_ptr<twinrx_gpio> sptr;
//----------------------------------------------
- //Public GPIO fields
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_CE_CH1, /*width*/ 1, /*shift*/ 0); //GPIO[0] OUT
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_CE_CH2, /*width*/ 1, /*shift*/ 1); //GPIO[1] OUT
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_MUXOUT_CH1, /*width*/ 1, /*shift*/ 2); //GPIO[2] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_MUXOUT_CH2, /*width*/ 1, /*shift*/ 3); //GPIO[3] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_LD_CH1, /*width*/ 1, /*shift*/ 4); //GPIO[4] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_LD_CH2, /*width*/ 1, /*shift*/ 5); //GPIO[5] IN
- // NO CONNECT //GPIO[8:6]
- // PRIVATE //GPIO[15:9]
- // NO CONNECT //GPIO[16]
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO1_CE_CH1, /*width*/ 1, /*shift*/ 17); //GPIO[17] OUT
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO1_CE_CH2, /*width*/ 1, /*shift*/ 18); //GPIO[18] OUT
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO1_MUXOUT_CH1, /*width*/ 1, /*shift*/ 19); //GPIO[19] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO1_MUXOUT_CH2, /*width*/ 1, /*shift*/ 20); //GPIO[20] IN
- // NO CONNECT //GPIO[21:23]
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_SWPS_CLK, /*width*/ 1, /*shift*/ 24); //GPIO[24] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_SWPS_PWR_GOOD, /*width*/ 1, /*shift*/ 25); //GPIO[25] IN
- UHD_DEFINE_SOFT_REG_FIELD(FIELD_SWPS_EN, /*width*/ 1, /*shift*/ 26); //GPIO[26] OUT
- // PRIVATE //GPIO[27:31]
+ // Public GPIO fields
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_CE_CH1, /*width*/ 1, /*shift*/ 0); // GPIO[0] OUT
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_CE_CH2, /*width*/ 1, /*shift*/ 1); // GPIO[1] OUT
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO2_MUXOUT_CH1, /*width*/ 1, /*shift*/ 2); // GPIO[2] IN
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO2_MUXOUT_CH2, /*width*/ 1, /*shift*/ 3); // GPIO[3] IN
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_LD_CH1, /*width*/ 1, /*shift*/ 4); // GPIO[4] IN
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_LO2_LD_CH2, /*width*/ 1, /*shift*/ 5); // GPIO[5] IN
+ // NO CONNECT //GPIO[8:6] PRIVATE //GPIO[15:9] NO CONNECT //GPIO[16]
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO1_CE_CH1, /*width*/ 1, /*shift*/ 17); // GPIO[17] OUT
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO1_CE_CH2, /*width*/ 1, /*shift*/ 18); // GPIO[18] OUT
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO1_MUXOUT_CH1, /*width*/ 1, /*shift*/ 19); // GPIO[19] IN
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_LO1_MUXOUT_CH2, /*width*/ 1, /*shift*/ 20); // GPIO[20] IN
+ // NO CONNECT //GPIO[21:23]
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_SWPS_CLK, /*width*/ 1, /*shift*/ 24); // GPIO[24] IN
+ UHD_DEFINE_SOFT_REG_FIELD(
+ FIELD_SWPS_PWR_GOOD, /*width*/ 1, /*shift*/ 25); // GPIO[25] IN
+ UHD_DEFINE_SOFT_REG_FIELD(FIELD_SWPS_EN, /*width*/ 1, /*shift*/ 26); // GPIO[26] OUT
+ // PRIVATE //GPIO[27:31]
//----------------------------------------------
- twinrx_gpio(dboard_iface::sptr iface) : _db_iface(iface) {
+ twinrx_gpio(dboard_iface::sptr iface) : _db_iface(iface)
+ {
_db_iface->set_gpio_ddr(dboard_iface::UNIT_BOTH, GPIO_OUTPUT_MASK, SET_ALL_BITS);
_db_iface->set_pin_ctrl(dboard_iface::UNIT_BOTH, GPIO_PINCTRL_MASK, SET_ALL_BITS);
_db_iface->set_gpio_out(dboard_iface::UNIT_BOTH, 0, ~GPIO_PINCTRL_MASK);
}
- ~twinrx_gpio() {
+ ~twinrx_gpio()
+ {
_db_iface->set_gpio_ddr(dboard_iface::UNIT_BOTH, ~GPIO_OUTPUT_MASK, SET_ALL_BITS);
}
- void set_field(const uhd::soft_reg_field_t field, const uint32_t value) {
+ void set_field(const uhd::soft_reg_field_t field, const uint32_t value)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
using namespace soft_reg_field;
- _db_iface->set_gpio_out(dboard_iface::UNIT_BOTH,
- (value << shift(field)),
- mask<uint32_t>(field));
+ _db_iface->set_gpio_out(
+ dboard_iface::UNIT_BOTH, (value << shift(field)), mask<uint32_t>(field));
}
- uint32_t get_field(const uhd::soft_reg_field_t field) {
+ uint32_t get_field(const uhd::soft_reg_field_t field)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
using namespace soft_reg_field;
- return (_db_iface->read_gpio(dboard_iface::UNIT_BOTH) & mask<uint32_t>(field)) >> shift(field);
+ return (_db_iface->read_gpio(dboard_iface::UNIT_BOTH) & mask<uint32_t>(field))
+ >> shift(field);
}
// CPLD register write-only interface
- void poke32(const wb_addr_type addr, const uint32_t data) {
+ void poke32(const wb_addr_type addr, const uint32_t data)
+ {
boost::lock_guard<boost::mutex> lock(_mutex);
using namespace soft_reg_field;
- //Step 1: Write the reg offset and data to the GPIO bus and de-assert all enables
+ // Step 1: Write the reg offset and data to the GPIO bus and de-assert all enables
_db_iface->set_gpio_out(dboard_iface::UNIT_BOTH,
(cpld::get_reg(addr) << shift(CPLD_FULL_ADDR)) | (data << shift(CPLD_DATA)),
- mask<uint32_t>(CPLD_FULL_ADDR)|mask<uint32_t>(CPLD_DATA));
- //Sleep for 166ns to ensure that we don't toggle the enables too quickly
- //The underlying sleep function rounds to microsecond precision.
+ mask<uint32_t>(CPLD_FULL_ADDR) | mask<uint32_t>(CPLD_DATA));
+ // Sleep for 166ns to ensure that we don't toggle the enables too quickly
+ // The underlying sleep function rounds to microsecond precision.
_db_iface->sleep(boost::chrono::nanoseconds(166));
- //Step 2: Write the reg offset and data, and assert the necessary enable
+ // Step 2: Write the reg offset and data, and assert the necessary enable
_db_iface->set_gpio_out(dboard_iface::UNIT_BOTH,
- (static_cast<uint32_t>(addr) << shift(CPLD_FULL_ADDR)) | (data << shift(CPLD_DATA)),
- mask<uint32_t>(CPLD_FULL_ADDR)|mask<uint32_t>(CPLD_DATA));
+ (static_cast<uint32_t>(addr) << shift(CPLD_FULL_ADDR))
+ | (data << shift(CPLD_DATA)),
+ mask<uint32_t>(CPLD_FULL_ADDR) | mask<uint32_t>(CPLD_DATA));
}
-private: //Members/definitions
- static const uint32_t GPIO_OUTPUT_MASK = 0xFC06FE03;
- static const uint32_t GPIO_PINCTRL_MASK = 0x00000000;
+private: // Members/definitions
+ static const uint32_t GPIO_OUTPUT_MASK = 0xFC06FE03;
+ static const uint32_t GPIO_PINCTRL_MASK = 0x00000000;
- //Private GPIO fields
- UHD_DEFINE_SOFT_REG_FIELD(CPLD_FULL_ADDR, /*width*/ 7, /*shift*/ 9); //GPIO[15:9]
- UHD_DEFINE_SOFT_REG_FIELD(CPLD_DATA, /*width*/ 5, /*shift*/ 27); //GPIO[31:27]
+ // Private GPIO fields
+ UHD_DEFINE_SOFT_REG_FIELD(CPLD_FULL_ADDR, /*width*/ 7, /*shift*/ 9); // GPIO[15:9]
+ UHD_DEFINE_SOFT_REG_FIELD(CPLD_DATA, /*width*/ 5, /*shift*/ 27); // GPIO[31:27]
- //Members
- dboard_iface::sptr _db_iface;
- boost::mutex _mutex;
+ // Members
+ dboard_iface::sptr _db_iface;
+ boost::mutex _mutex;
};
-class twinrx_cpld_regmap : public uhd::soft_regmap_t {
+class twinrx_cpld_regmap : public uhd::soft_regmap_t
+{
public:
typedef std::shared_ptr<twinrx_cpld_regmap> sptr;
//----------------------------------------------
// IF CCA: CPLD 1
//----------------------------------------------
- class if0_reg0_t : public uhd::soft_reg32_wo_t {
+ class if0_reg0_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_IF1_EN_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LO2_EN_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LO2_EN_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW19_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(SW20_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
-
- if0_reg0_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 0), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_IF1_EN_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LO2_EN_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LO2_EN_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW19_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(SW20_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
+
+ if0_reg0_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 0), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg0;
- class if0_reg1_t : public uhd::soft_reg32_wo_t {
+ class if0_reg1_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW20_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW20_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
- if0_reg1_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 1), OPTIMIZED_FLUSH) {
+ if0_reg1_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 1), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg1;
- class if0_reg2_t : public uhd::soft_reg32_wo_t {
+ class if0_reg2_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_IF1_EN_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_IF1_EN_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(LO2_LE_CH1, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(LO2_LE_CH2, /*width*/ 1, /*shift*/ 4);
-
- if0_reg2_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 2), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_IF1_EN_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_IF1_EN_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(LO2_LE_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(LO2_LE_CH2, /*width*/ 1, /*shift*/ 4);
+
+ if0_reg2_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 2), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg2;
- class if0_reg3_t : public uhd::soft_reg32_wo_t {
+ class if0_reg3_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW24_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW13_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(IF1_IF2_EN_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(SW24_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW13_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(IF1_IF2_EN_CH1, /*width*/ 1, /*shift*/ 3);
- if0_reg3_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 3), OPTIMIZED_FLUSH) {
+ if0_reg3_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 3), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg3;
- class if0_reg4_t : public uhd::soft_reg32_wo_t {
+ class if0_reg4_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW21_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW25_CTRL, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(IF1_IF2_EN_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW19_CTRL_CH1, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(SW21_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
-
- if0_reg4_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 4), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SW21_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW25_CTRL, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(IF1_IF2_EN_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW19_CTRL_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(SW21_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
+
+ if0_reg4_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 4), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg4;
- class if0_reg6_t : public uhd::soft_reg32_wo_t {
+ class if0_reg6_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_IF1_EN_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW13_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_IF1_EN_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW13_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
- if0_reg6_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 6), OPTIMIZED_FLUSH) {
+ if0_reg6_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 6), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg6;
- class if0_reg7_t : public uhd::soft_reg32_wo_t {
+ class if0_reg7_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW24_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW24_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- if0_reg7_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 7), OPTIMIZED_FLUSH) {
+ if0_reg7_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 1, /*reg*/ 7), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} if0_reg7;
@@ -208,90 +252,114 @@ public:
//----------------------------------------------
// RF CCA: CPLD 2
//----------------------------------------------
- class rf0_reg0_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg0_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_IN_CH1, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_IN_CH1, /*width*/ 5, /*shift*/ 0);
- rf0_reg0_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 0), OPTIMIZED_FLUSH) {
+ rf0_reg0_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 0), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg0;
- class rf0_reg1_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg1_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SWPA1_CTL_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(HB_PREAMP_EN_CH1, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(LB_PREAMP_EN_CH1, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(SWPA3_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
-
- rf0_reg1_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 1), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA1_CTL_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(HB_PREAMP_EN_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(LB_PREAMP_EN_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA3_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
+
+ rf0_reg1_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 1), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg1;
- class rf0_reg2_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg2_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW6_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW5_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW4_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(LO1_LE_CH1, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(LO1_LE_CH2, /*width*/ 1, /*shift*/ 4);
-
- rf0_reg2_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 2), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SW6_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW5_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW4_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(LO1_LE_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(LO1_LE_CH2, /*width*/ 1, /*shift*/ 4);
+
+ rf0_reg2_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 2), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg2;
- class rf0_reg3_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg3_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW9_CTRL_CH2, /*width*/ 2, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW7_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW9_CTRL_CH2, /*width*/ 2, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW7_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
- rf0_reg3_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 3), OPTIMIZED_FLUSH) {
+ rf0_reg3_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 3), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg3;
- class rf0_reg4_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg4_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_IN_CH2, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_IN_CH2, /*width*/ 5, /*shift*/ 0);
- rf0_reg4_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 4), OPTIMIZED_FLUSH) {
+ rf0_reg4_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 4), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg4;
- class rf0_reg5_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg5_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW9_CTRL_CH1, /*width*/ 2, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(HB_PREAMP_EN_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW3_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
+ UHD_DEFINE_SOFT_REG_FIELD(SW9_CTRL_CH1, /*width*/ 2, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(HB_PREAMP_EN_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW3_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
- rf0_reg5_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 5), OPTIMIZED_FLUSH) {
+ rf0_reg5_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 5), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg5;
- class rf0_reg6_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg6_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW6_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW5_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW4_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SWPA4_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
-
- rf0_reg6_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 6), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SW6_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW5_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW4_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA4_CTRL_CH2, /*width*/ 1, /*shift*/ 4);
+
+ rf0_reg6_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 6), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg6;
- class rf0_reg7_t : public uhd::soft_reg32_wo_t {
+ class rf0_reg7_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SWPA1_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SWPA3_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW3_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW7_CTRL_CH2, /*width*/ 2, /*shift*/ 3);
-
- rf0_reg7_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 7), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA1_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA3_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW3_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW7_CTRL_CH2, /*width*/ 2, /*shift*/ 3);
+
+ rf0_reg7_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 2, /*reg*/ 7), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf0_reg7;
@@ -299,91 +367,115 @@ public:
//----------------------------------------------
// RF CCA: CPLD 3
//----------------------------------------------
- class rf1_reg0_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg0_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_HB_CH1, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_HB_CH1, /*width*/ 5, /*shift*/ 0);
- rf1_reg0_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 0), OPTIMIZED_FLUSH) {
+ rf1_reg0_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 0), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg0;
- class rf1_reg1_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg1_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW17_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LO1_EN_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW16_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW15_CTRL_CH1, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(SW14_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
-
- rf1_reg1_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 1), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SW17_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LO1_EN_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW16_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW15_CTRL_CH1, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(SW14_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
+
+ rf1_reg1_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 1), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg1;
- class rf1_reg2_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg2_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW12_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_EN_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW12_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_EN_CH1, /*width*/ 1, /*shift*/ 1);
UHD_DEFINE_SOFT_REG_FIELD(HB_PRESEL_PGA_EN_CH2, /*width*/ 1, /*shift*/ 2);
- rf1_reg2_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 2), OPTIMIZED_FLUSH) {
+ rf1_reg2_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 2), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg2;
- class rf1_reg3_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg3_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW23_CTRL, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW22_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW10_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW23_CTRL, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW22_CTRL_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW10_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
- rf1_reg3_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 3), OPTIMIZED_FLUSH) {
+ rf1_reg3_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 3), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg3;
- class rf1_reg4_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg4_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_HB_CH2, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_HB_CH2, /*width*/ 5, /*shift*/ 0);
- rf1_reg4_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 4), OPTIMIZED_FLUSH) {
+ rf1_reg4_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 4), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg4;
- class rf1_reg5_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg5_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LO1_EN_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW15_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW14_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW18_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
-
- rf1_reg5_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 5), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LO1_EN_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW15_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW14_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW18_CTRL_CH1, /*width*/ 1, /*shift*/ 4);
+
+ rf1_reg5_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 5), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg5;
- class rf1_reg6_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg6_t : public uhd::soft_reg32_wo_t
+ {
public:
UHD_DEFINE_SOFT_REG_FIELD(HB_PRESEL_PGA_EN_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW17_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
- UHD_DEFINE_SOFT_REG_FIELD(SW16_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(PREAMP2_EN_CH2, /*width*/ 1, /*shift*/ 4);
+ UHD_DEFINE_SOFT_REG_FIELD(SW17_CTRL_CH2, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW16_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(PREAMP2_EN_CH2, /*width*/ 1, /*shift*/ 4);
- rf1_reg6_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 6), OPTIMIZED_FLUSH) {
+ rf1_reg6_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 6), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg6;
- class rf1_reg7_t : public uhd::soft_reg32_wo_t {
+ class rf1_reg7_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW22_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW10_CTRL_CH2, /*width*/ 2, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW12_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_EN_CH2, /*width*/ 1, /*shift*/ 4);
-
- rf1_reg7_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 7), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SW22_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW10_CTRL_CH2, /*width*/ 2, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW12_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_HB_EN_CH2, /*width*/ 1, /*shift*/ 4);
+
+ rf1_reg7_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 3, /*reg*/ 7), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf1_reg7;
@@ -391,77 +483,99 @@ public:
//----------------------------------------------
// RF CCA: CPLD 4
//----------------------------------------------
- class rf2_reg0_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg0_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_LB_CH1, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_LB_CH1, /*width*/ 5, /*shift*/ 0);
- rf2_reg0_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 0), OPTIMIZED_FLUSH) {
+ rf2_reg0_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 0), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg0;
- class rf2_reg2_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg2_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SW11_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_EN_CH1, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SWPA2_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(SW11_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_EN_CH1, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA2_CTRL_CH1, /*width*/ 1, /*shift*/ 2);
- rf2_reg2_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 2), OPTIMIZED_FLUSH) {
+ rf2_reg2_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 2), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg2;
- class rf2_reg3_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg3_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(PREAMP2_EN_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW18_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW8_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
+ UHD_DEFINE_SOFT_REG_FIELD(PREAMP2_EN_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW18_CTRL_CH2, /*width*/ 1, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW8_CTRL_CH1, /*width*/ 2, /*shift*/ 2);
- rf2_reg3_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 3), OPTIMIZED_FLUSH) {
+ rf2_reg3_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 3), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg3;
- class rf2_reg4_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg4_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(ATTEN_LB_CH2, /*width*/ 5, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(ATTEN_LB_CH2, /*width*/ 5, /*shift*/ 0);
- rf2_reg4_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 4), OPTIMIZED_FLUSH) {
+ rf2_reg4_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 4), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg4;
- class rf2_reg5_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg5_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SWPA2_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA2_CTRL_CH2, /*width*/ 1, /*shift*/ 0);
- rf2_reg5_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 5), OPTIMIZED_FLUSH) {
+ rf2_reg5_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 5), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg5;
- class rf2_reg6_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg6_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(LB_PREAMP_EN_CH2, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(LB_PREAMP_EN_CH2, /*width*/ 1, /*shift*/ 0);
- rf2_reg6_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 6), OPTIMIZED_FLUSH) {
+ rf2_reg6_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 6), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg6;
- class rf2_reg7_t : public uhd::soft_reg32_wo_t {
+ class rf2_reg7_t : public uhd::soft_reg32_wo_t
+ {
public:
- UHD_DEFINE_SOFT_REG_FIELD(SWPA4_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
- UHD_DEFINE_SOFT_REG_FIELD(SW8_CTRL_CH2, /*width*/ 2, /*shift*/ 1);
- UHD_DEFINE_SOFT_REG_FIELD(SW11_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
- UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_EN_CH2, /*width*/ 1, /*shift*/ 4);
-
- rf2_reg7_t(): uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 7), OPTIMIZED_FLUSH) {
+ UHD_DEFINE_SOFT_REG_FIELD(SWPA4_CTRL_CH1, /*width*/ 1, /*shift*/ 0);
+ UHD_DEFINE_SOFT_REG_FIELD(SW8_CTRL_CH2, /*width*/ 2, /*shift*/ 1);
+ UHD_DEFINE_SOFT_REG_FIELD(SW11_CTRL_CH2, /*width*/ 1, /*shift*/ 3);
+ UHD_DEFINE_SOFT_REG_FIELD(AMP_LB_EN_CH2, /*width*/ 1, /*shift*/ 4);
+
+ rf2_reg7_t()
+ : uhd::soft_reg32_wo_t(cpld::addr(/*cpld*/ 4, /*reg*/ 7), OPTIMIZED_FLUSH)
+ {
set(REGISTER, 0);
}
} rf2_reg7;
- twinrx_cpld_regmap() : soft_regmap_t("twinrx_cpld") {
+ twinrx_cpld_regmap() : soft_regmap_t("twinrx_cpld")
+ {
// IF CCA: CPLD 1
add_to_map(if0_reg0, "if0_reg0");
add_to_map(if0_reg1, "if0_reg1");
@@ -499,6 +613,6 @@ public:
}
};
-}}}} //namespaces
+}}}} // namespace uhd::usrp::dboard::twinrx
#endif /* INCLUDED_DBOARD_TWINRX_IO_HPP */
diff --git a/host/lib/usrp/dboard_base.cpp b/host/lib/usrp/dboard_base.cpp
index 612392b69..eb9bfe880 100644
--- a/host/lib/usrp/dboard_base.cpp
+++ b/host/lib/usrp/dboard_base.cpp
@@ -15,83 +15,96 @@ using namespace uhd::usrp;
/***********************************************************************
* dboard_base dboard dboard_base class
**********************************************************************/
-struct dboard_base::impl{
+struct dboard_base::impl
+{
dboard_ctor_args_t args;
};
-dboard_base::dboard_base(ctor_args_t args){
- _impl = UHD_PIMPL_MAKE(impl, ());
+dboard_base::dboard_base(ctor_args_t args)
+{
+ _impl = UHD_PIMPL_MAKE(impl, ());
_impl->args = dboard_ctor_args_t::cast(args);
}
-std::string dboard_base::get_subdev_name(void){
+std::string dboard_base::get_subdev_name(void)
+{
return _impl->args.sd_name;
}
-dboard_iface::sptr dboard_base::get_iface(void){
+dboard_iface::sptr dboard_base::get_iface(void)
+{
return _impl->args.db_iface;
}
-dboard_id_t dboard_base::get_rx_id(void){
+dboard_id_t dboard_base::get_rx_id(void)
+{
return _impl->args.rx_eeprom.id;
}
-dboard_id_t dboard_base::get_tx_id(void){
+dboard_id_t dboard_base::get_tx_id(void)
+{
return _impl->args.tx_eeprom.id;
}
-dboard_eeprom_t dboard_base::get_rx_eeprom(void){
+dboard_eeprom_t dboard_base::get_rx_eeprom(void)
+{
return _impl->args.rx_eeprom;
}
-dboard_eeprom_t dboard_base::get_tx_eeprom(void){
+dboard_eeprom_t dboard_base::get_tx_eeprom(void)
+{
return _impl->args.tx_eeprom;
}
-property_tree::sptr dboard_base::get_rx_subtree(void){
+property_tree::sptr dboard_base::get_rx_subtree(void)
+{
return _impl->args.rx_subtree;
}
-property_tree::sptr dboard_base::get_tx_subtree(void){
+property_tree::sptr dboard_base::get_tx_subtree(void)
+{
return _impl->args.tx_subtree;
}
/***********************************************************************
* xcvr dboard dboard_base class
**********************************************************************/
-xcvr_dboard_base::xcvr_dboard_base(ctor_args_t args) : dboard_base(args){
- if (get_rx_id() == dboard_id_t::none()){
- throw uhd::runtime_error(str(boost::format(
- "cannot create xcvr board when the rx id is \"%s\""
- ) % dboard_id_t::none().to_pp_string()));
+xcvr_dboard_base::xcvr_dboard_base(ctor_args_t args) : dboard_base(args)
+{
+ if (get_rx_id() == dboard_id_t::none()) {
+ throw uhd::runtime_error(
+ str(boost::format("cannot create xcvr board when the rx id is \"%s\"")
+ % dboard_id_t::none().to_pp_string()));
}
- if (get_tx_id() == dboard_id_t::none()){
- throw uhd::runtime_error(str(boost::format(
- "cannot create xcvr board when the tx id is \"%s\""
- ) % dboard_id_t::none().to_pp_string()));
+ if (get_tx_id() == dboard_id_t::none()) {
+ throw uhd::runtime_error(
+ str(boost::format("cannot create xcvr board when the tx id is \"%s\"")
+ % dboard_id_t::none().to_pp_string()));
}
}
/***********************************************************************
* rx dboard dboard_base class
**********************************************************************/
-rx_dboard_base::rx_dboard_base(ctor_args_t args) : dboard_base(args){
- if (get_tx_id() != dboard_id_t::none()){
- throw uhd::runtime_error(str(boost::format(
- "cannot create rx board when the tx id is \"%s\""
- " -> expected a tx id of \"%s\""
- ) % get_tx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));
+rx_dboard_base::rx_dboard_base(ctor_args_t args) : dboard_base(args)
+{
+ if (get_tx_id() != dboard_id_t::none()) {
+ throw uhd::runtime_error(
+ str(boost::format("cannot create rx board when the tx id is \"%s\""
+ " -> expected a tx id of \"%s\"")
+ % get_tx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));
}
}
/***********************************************************************
* tx dboard dboard_base class
**********************************************************************/
-tx_dboard_base::tx_dboard_base(ctor_args_t args) : dboard_base(args){
- if (get_rx_id() != dboard_id_t::none()){
- throw uhd::runtime_error(str(boost::format(
- "cannot create tx board when the rx id is \"%s\""
- " -> expected a rx id of \"%s\""
- ) % get_rx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));
+tx_dboard_base::tx_dboard_base(ctor_args_t args) : dboard_base(args)
+{
+ if (get_rx_id() != dboard_id_t::none()) {
+ throw uhd::runtime_error(
+ str(boost::format("cannot create tx board when the rx id is \"%s\""
+ " -> expected a rx id of \"%s\"")
+ % get_rx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));
}
}
diff --git a/host/lib/usrp/dboard_ctor_args.hpp b/host/lib/usrp/dboard_ctor_args.hpp
index a1a6e08d2..ad471df23 100644
--- a/host/lib/usrp/dboard_ctor_args.hpp
+++ b/host/lib/usrp/dboard_ctor_args.hpp
@@ -9,25 +9,27 @@
#include <uhd/property_tree.hpp>
#include <uhd/usrp/dboard_base.hpp>
-#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
+#include <uhd/usrp/dboard_iface.hpp>
#include <string>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
- class dboard_ctor_args_t {
- public:
- std::string sd_name;
- dboard_iface::sptr db_iface;
- dboard_eeprom_t rx_eeprom, tx_eeprom;
- property_tree::sptr rx_subtree, tx_subtree;
- dboard_base::sptr rx_container, tx_container;
+class dboard_ctor_args_t
+{
+public:
+ std::string sd_name;
+ dboard_iface::sptr db_iface;
+ dboard_eeprom_t rx_eeprom, tx_eeprom;
+ property_tree::sptr rx_subtree, tx_subtree;
+ dboard_base::sptr rx_container, tx_container;
- static const dboard_ctor_args_t& cast(dboard_base::ctor_args_t args) {
- return *static_cast<dboard_ctor_args_t*>(args);
- }
- };
+ static const dboard_ctor_args_t& cast(dboard_base::ctor_args_t args)
+ {
+ return *static_cast<dboard_ctor_args_t*>(args);
+ }
+};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_LIBUHD_USRP_DBOARD_CTOR_ARGS_HPP */
diff --git a/host/lib/usrp/dboard_eeprom.cpp b/host/lib/usrp/dboard_eeprom.cpp
index 54a2ea196..7775f5300 100644
--- a/host/lib/usrp/dboard_eeprom.cpp
+++ b/host/lib/usrp/dboard_eeprom.cpp
@@ -5,9 +5,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/exception.hpp>
#include <uhd/types/byte_vector.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/exception.hpp>
#include <uhd/utils/log.hpp>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
@@ -31,97 +31,96 @@ using namespace uhd::usrp;
// ...
// 1f: .. negative of the sum of bytes [0x00, 0x1e]
-#define DB_EEPROM_MAGIC 0x00
-#define DB_EEPROM_MAGIC_VALUE 0xDB
-#define DB_EEPROM_ID_LSB 0x01
-#define DB_EEPROM_ID_MSB 0x02
-#define DB_EEPROM_REV_LSB 0x03
-#define DB_EEPROM_REV_MSB 0x04
-#define DB_EEPROM_OFFSET_0_LSB 0x05 // offset correction for ADC or DAC 0
-#define DB_EEPROM_OFFSET_0_MSB 0x06
-#define DB_EEPROM_OFFSET_1_LSB 0x07 // offset correction for ADC or DAC 1
-#define DB_EEPROM_OFFSET_1_MSB 0x08
-#define DB_EEPROM_SERIAL 0x09
-#define DB_EEPROM_SERIAL_LEN 0x09 //9 ASCII characters
-#define DB_EEPROM_CHKSUM 0x1f
-
-#define DB_EEPROM_CLEN 0x20 // length of common portion of eeprom
-
-#define DB_EEPROM_CUSTOM_BASE DB_EEPROM_CLEN // first avail offset for
- // daughterboard specific use
+#define DB_EEPROM_MAGIC 0x00
+#define DB_EEPROM_MAGIC_VALUE 0xDB
+#define DB_EEPROM_ID_LSB 0x01
+#define DB_EEPROM_ID_MSB 0x02
+#define DB_EEPROM_REV_LSB 0x03
+#define DB_EEPROM_REV_MSB 0x04
+#define DB_EEPROM_OFFSET_0_LSB 0x05 // offset correction for ADC or DAC 0
+#define DB_EEPROM_OFFSET_0_MSB 0x06
+#define DB_EEPROM_OFFSET_1_LSB 0x07 // offset correction for ADC or DAC 1
+#define DB_EEPROM_OFFSET_1_MSB 0x08
+#define DB_EEPROM_SERIAL 0x09
+#define DB_EEPROM_SERIAL_LEN 0x09 // 9 ASCII characters
+#define DB_EEPROM_CHKSUM 0x1f
+
+#define DB_EEPROM_CLEN 0x20 // length of common portion of eeprom
+
+#define DB_EEPROM_CUSTOM_BASE \
+ DB_EEPROM_CLEN // first avail offset for
+ // daughterboard specific use
////////////////////////////////////////////////////////////////////////
-//negative sum of bytes excluding checksum byte
-static uint8_t checksum(const byte_vector_t &bytes){
+// negative sum of bytes excluding checksum byte
+static uint8_t checksum(const byte_vector_t& bytes)
+{
int sum = 0;
- for (size_t i = 0; i < std::min(bytes.size(), size_t(DB_EEPROM_CHKSUM)); i++){
+ for (size_t i = 0; i < std::min(bytes.size(), size_t(DB_EEPROM_CHKSUM)); i++) {
sum -= int(bytes.at(i));
}
return uint8_t(sum);
}
-dboard_eeprom_t::dboard_eeprom_t(void){
- id = dboard_id_t::none();
+dboard_eeprom_t::dboard_eeprom_t(void)
+{
+ id = dboard_id_t::none();
serial = "";
}
-void dboard_eeprom_t::load(i2c_iface &iface, uint8_t addr){
+void dboard_eeprom_t::load(i2c_iface& iface, uint8_t addr)
+{
byte_vector_t bytes = iface.read_eeprom(addr, 0, DB_EEPROM_CLEN);
std::ostringstream ss;
- try{
+ try {
UHD_ASSERT_THROW(bytes.size() >= DB_EEPROM_CLEN);
UHD_ASSERT_THROW(bytes[DB_EEPROM_MAGIC] == DB_EEPROM_MAGIC_VALUE);
UHD_ASSERT_THROW(bytes[DB_EEPROM_CHKSUM] == checksum(bytes));
- //parse the ids
- id = dboard_id_t::from_uint16(0
- | (uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0)
- | (uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8)
- );
-
- //parse the serial
- serial = bytes_to_string(
- byte_vector_t(&bytes.at(DB_EEPROM_SERIAL),
- &bytes.at(DB_EEPROM_SERIAL+DB_EEPROM_SERIAL_LEN))
- );
-
- //parse the revision
- const uint16_t rev_num = 0
- | (uint16_t(bytes[DB_EEPROM_REV_LSB]) << 0)
- | (uint16_t(bytes[DB_EEPROM_REV_MSB]) << 8)
- ;
- if (rev_num != 0 and rev_num != 0xffff){
+ // parse the ids
+ id = dboard_id_t::from_uint16(0 | (uint16_t(bytes[DB_EEPROM_ID_LSB]) << 0)
+ | (uint16_t(bytes[DB_EEPROM_ID_MSB]) << 8));
+
+ // parse the serial
+ serial = bytes_to_string(byte_vector_t(&bytes.at(DB_EEPROM_SERIAL),
+ &bytes.at(DB_EEPROM_SERIAL + DB_EEPROM_SERIAL_LEN)));
+
+ // parse the revision
+ const uint16_t rev_num = 0 | (uint16_t(bytes[DB_EEPROM_REV_LSB]) << 0)
+ | (uint16_t(bytes[DB_EEPROM_REV_MSB]) << 8);
+ if (rev_num != 0 and rev_num != 0xffff) {
revision = std::to_string(rev_num);
}
- }catch(const uhd::assertion_error &){
- id = dboard_id_t::none();
+ } catch (const uhd::assertion_error&) {
+ id = dboard_id_t::none();
serial = "";
}
}
-void dboard_eeprom_t::store(i2c_iface &iface, uint8_t addr) const{
- byte_vector_t bytes(DB_EEPROM_CLEN, 0); //defaults to all zeros
+void dboard_eeprom_t::store(i2c_iface& iface, uint8_t addr) const
+{
+ byte_vector_t bytes(DB_EEPROM_CLEN, 0); // defaults to all zeros
bytes[DB_EEPROM_MAGIC] = DB_EEPROM_MAGIC_VALUE;
- //load the id bytes
+ // load the id bytes
bytes[DB_EEPROM_ID_LSB] = uint8_t(id.to_uint16() >> 0);
bytes[DB_EEPROM_ID_MSB] = uint8_t(id.to_uint16() >> 8);
- //load the serial bytes
+ // load the serial bytes
byte_vector_t ser_bytes = string_to_bytes(serial, DB_EEPROM_SERIAL_LEN);
std::copy(ser_bytes.begin(), ser_bytes.end(), &bytes.at(DB_EEPROM_SERIAL));
- //load the revision bytes
- if (not revision.empty()){
- const uint16_t rev_num = boost::lexical_cast<uint16_t>(revision);
+ // load the revision bytes
+ if (not revision.empty()) {
+ const uint16_t rev_num = boost::lexical_cast<uint16_t>(revision);
bytes[DB_EEPROM_REV_LSB] = uint8_t(rev_num >> 0);
bytes[DB_EEPROM_REV_MSB] = uint8_t(rev_num >> 8);
}
- //load the checksum
+ // load the checksum
bytes[DB_EEPROM_CHKSUM] = checksum(bytes);
iface.write_eeprom(addr, 0, bytes);
diff --git a/host/lib/usrp/dboard_eeprom_c.cpp b/host/lib/usrp/dboard_eeprom_c.cpp
index a3ee0a2ed..b23d80689 100644
--- a/host/lib/usrp/dboard_eeprom_c.cpp
+++ b/host/lib/usrp/dboard_eeprom_c.cpp
@@ -5,115 +5,77 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/dboard_eeprom.h>
#include <uhd/error.h>
-#include <boost/format.hpp>
-
+#include <uhd/usrp/dboard_eeprom.h>
#include <string.h>
+#include <boost/format.hpp>
-uhd_error uhd_dboard_eeprom_make(
- uhd_dboard_eeprom_handle* h
-){
- UHD_SAFE_C(
- *h = new uhd_dboard_eeprom_t;
- )
+uhd_error uhd_dboard_eeprom_make(uhd_dboard_eeprom_handle* h)
+{
+ UHD_SAFE_C(*h = new uhd_dboard_eeprom_t;)
}
-uhd_error uhd_dboard_eeprom_free(
- uhd_dboard_eeprom_handle* h
-){
- UHD_SAFE_C(
- delete *h;
- *h = NULL;
- )
+uhd_error uhd_dboard_eeprom_free(uhd_dboard_eeprom_handle* h)
+{
+ UHD_SAFE_C(delete *h; *h = NULL;)
}
uhd_error uhd_dboard_eeprom_get_id(
- uhd_dboard_eeprom_handle h,
- char* id_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string dboard_id_cpp = h->dboard_eeprom_cpp.id.to_string();
- strncpy(id_out, dboard_id_cpp.c_str(), strbuffer_len);
- )
+ uhd_dboard_eeprom_handle h, char* id_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string dboard_id_cpp = h->dboard_eeprom_cpp.id.to_string();
+ strncpy(id_out, dboard_id_cpp.c_str(), strbuffer_len);)
}
-uhd_error uhd_dboard_eeprom_set_id(
- uhd_dboard_eeprom_handle h,
- const char* id
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->dboard_eeprom_cpp.id = uhd::usrp::dboard_id_t::from_string(id);
- )
+uhd_error uhd_dboard_eeprom_set_id(uhd_dboard_eeprom_handle h, const char* id)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, h->dboard_eeprom_cpp.id = uhd::usrp::dboard_id_t::from_string(id);)
}
uhd_error uhd_dboard_eeprom_get_serial(
- uhd_dboard_eeprom_handle h,
- char* id_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string dboard_serial_cpp = h->dboard_eeprom_cpp.serial;
- strncpy(id_out, dboard_serial_cpp.c_str(), strbuffer_len);
- )
+ uhd_dboard_eeprom_handle h, char* id_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string dboard_serial_cpp = h->dboard_eeprom_cpp.serial;
+ strncpy(id_out, dboard_serial_cpp.c_str(), strbuffer_len);)
}
-uhd_error uhd_dboard_eeprom_set_serial(
- uhd_dboard_eeprom_handle h,
- const char* serial
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->dboard_eeprom_cpp.serial = serial;
- )
+uhd_error uhd_dboard_eeprom_set_serial(uhd_dboard_eeprom_handle h, const char* serial)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, h->dboard_eeprom_cpp.serial = serial;)
}
//! Convert a string into an int. If that doesn't work, craft our own exception
// instead of using the Boost exception. We need to put this separate from the
// caller function because of macro expansion.
-int _convert_rev_with_exception(const std::string &rev_str)
+int _convert_rev_with_exception(const std::string& rev_str)
{
try {
return std::stoi(rev_str);
- } catch (const std::invalid_argument &) {
- throw uhd::lookup_error(str(
- boost::format("Error retrieving revision from string `%s`")
- % rev_str
- ));
- } catch (const std::out_of_range &) {
- throw uhd::lookup_error(str(
- boost::format("Error retrieving revision from string `%s`")
- % rev_str
- ));
+ } catch (const std::invalid_argument&) {
+ throw uhd::lookup_error(
+ str(boost::format("Error retrieving revision from string `%s`") % rev_str));
+ } catch (const std::out_of_range&) {
+ throw uhd::lookup_error(
+ str(boost::format("Error retrieving revision from string `%s`") % rev_str));
}
}
-uhd_error uhd_dboard_eeprom_get_revision(
- uhd_dboard_eeprom_handle h,
- int* revision_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *revision_out = \
- _convert_rev_with_exception(h->dboard_eeprom_cpp.revision);
- )
+uhd_error uhd_dboard_eeprom_get_revision(uhd_dboard_eeprom_handle h, int* revision_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, *revision_out = _convert_rev_with_exception(h->dboard_eeprom_cpp.revision);)
}
-uhd_error uhd_dboard_eeprom_set_revision(
- uhd_dboard_eeprom_handle h,
- int revision
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->dboard_eeprom_cpp.revision = std::to_string(revision);
- )
+uhd_error uhd_dboard_eeprom_set_revision(uhd_dboard_eeprom_handle h, int revision)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, h->dboard_eeprom_cpp.revision = std::to_string(revision);)
}
uhd_error uhd_dboard_eeprom_last_error(
- uhd_dboard_eeprom_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+ uhd_dboard_eeprom_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
diff --git a/host/lib/usrp/dboard_id.cpp b/host/lib/usrp/dboard_id.cpp
index fa12c2a4c..38a7ae8f7 100644
--- a/host/lib/usrp/dboard_id.cpp
+++ b/host/lib/usrp/dboard_id.cpp
@@ -6,41 +6,52 @@
//
#include <uhd/usrp/dboard_id.hpp>
-#include <boost/lexical_cast.hpp>
#include <boost/format.hpp>
-#include <sstream>
+#include <boost/lexical_cast.hpp>
#include <iostream>
+#include <sstream>
using namespace uhd::usrp;
-dboard_id_t::dboard_id_t(uint16_t id){
+dboard_id_t::dboard_id_t(uint16_t id)
+{
_id = id;
}
-dboard_id_t dboard_id_t::none(void){
+dboard_id_t dboard_id_t::none(void)
+{
return dboard_id_t();
}
-dboard_id_t dboard_id_t::from_uint16(uint16_t uint16){
+dboard_id_t dboard_id_t::from_uint16(uint16_t uint16)
+{
return dboard_id_t(uint16);
}
-uint16_t dboard_id_t::to_uint16(void) const{
+uint16_t dboard_id_t::to_uint16(void) const
+{
return _id;
}
-//used with lexical cast to parse a hex string
-template <class T> struct to_hex{
+// used with lexical cast to parse a hex string
+template <class T>
+struct to_hex
+{
T value;
- operator T() const {return value;}
- friend std::istream& operator>>(std::istream& in, to_hex& out){
+ operator T() const
+ {
+ return value;
+ }
+ friend std::istream& operator>>(std::istream& in, to_hex& out)
+ {
in >> std::hex >> out.value;
return in;
}
};
-dboard_id_t dboard_id_t::from_string(const std::string &string){
- if (string.substr(0, 2) == "0x"){
+dboard_id_t dboard_id_t::from_string(const std::string& string)
+{
+ if (string.substr(0, 2) == "0x") {
std::stringstream interpreter(string);
to_hex<uint16_t> hh;
interpreter >> hh;
@@ -49,13 +60,15 @@ dboard_id_t dboard_id_t::from_string(const std::string &string){
return dboard_id_t::from_uint16(boost::lexical_cast<uint16_t>(string));
}
-std::string dboard_id_t::to_string(void) const{
+std::string dboard_id_t::to_string(void) const
+{
return str(boost::format("0x%04x") % this->to_uint16());
}
-//Note: to_pp_string is implemented in the dboard manager
-//because it needs access to the dboard registration table
+// Note: to_pp_string is implemented in the dboard manager
+// because it needs access to the dboard registration table
-bool uhd::usrp::operator==(const dboard_id_t &lhs, const dboard_id_t &rhs){
+bool uhd::usrp::operator==(const dboard_id_t& lhs, const dboard_id_t& rhs)
+{
return lhs.to_uint16() == rhs.to_uint16();
}
diff --git a/host/lib/usrp/dboard_iface.cpp b/host/lib/usrp/dboard_iface.cpp
index 3bda643fe..b2ff23ab9 100644
--- a/host/lib/usrp/dboard_iface.cpp
+++ b/host/lib/usrp/dboard_iface.cpp
@@ -13,11 +13,11 @@ using namespace uhd::usrp;
void dboard_iface::sleep(const boost::chrono::nanoseconds& time)
{
- //nanosleep is not really accurate in userland and it is also not very
- //cross-platform. So just sleep for the minimum amount of time in us.
- if (time < boost::chrono::microseconds(1)) {
- std::this_thread::sleep_for(std::chrono::microseconds(1));
- } else {
- std::this_thread::sleep_for(std::chrono::microseconds(time.count()));
- }
+ // nanosleep is not really accurate in userland and it is also not very
+ // cross-platform. So just sleep for the minimum amount of time in us.
+ if (time < boost::chrono::microseconds(1)) {
+ std::this_thread::sleep_for(std::chrono::microseconds(1));
+ } else {
+ std::this_thread::sleep_for(std::chrono::microseconds(time.count()));
+ }
}
diff --git a/host/lib/usrp/dboard_iface_python.hpp b/host/lib/usrp/dboard_iface_python.hpp
index 96fcc1702..0dfd5866e 100644
--- a/host/lib/usrp/dboard_iface_python.hpp
+++ b/host/lib/usrp/dboard_iface_python.hpp
@@ -8,9 +8,9 @@
#ifndef INCLUDED_UHD_USRP_DBOARD_IFACE_PYTHON_HPP
#define INCLUDED_UHD_USRP_DBOARD_IFACE_PYTHON_HPP
+#include "../include/uhdlib/usrp/gpio_defs.hpp"
#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include "../include/uhdlib/usrp/gpio_defs.hpp"
void export_dboard_iface(py::module& m)
{
@@ -18,74 +18,67 @@ void export_dboard_iface(py::module& m)
using special_props_t = uhd::usrp::dboard_iface_special_props_t;
using unit_t = dboard_iface::unit_t;
- using aux_dac_t = dboard_iface::aux_dac_t;
- using aux_adc_t = dboard_iface::aux_adc_t;
+ using aux_dac_t = dboard_iface::aux_dac_t;
+ using aux_adc_t = dboard_iface::aux_adc_t;
using gpio_atr_reg_t = uhd::usrp::gpio_atr::gpio_atr_reg_t;
using gpio_atr_mode_t = uhd::usrp::gpio_atr::gpio_atr_mode_t;
py::enum_<gpio_atr_reg_t>(m, "gpio_atr_reg")
- .value("ATR_REG_IDLE" , gpio_atr_reg_t::ATR_REG_IDLE )
- .value("ATR_REG_TX_ONLY" , gpio_atr_reg_t::ATR_REG_TX_ONLY )
- .value("ATR_REG_RX_ONLY" , gpio_atr_reg_t::ATR_REG_RX_ONLY )
- .value("ATR_REG_FULL_DUPLEX", gpio_atr_reg_t::ATR_REG_FULL_DUPLEX)
- ;
+ .value("ATR_REG_IDLE", gpio_atr_reg_t::ATR_REG_IDLE)
+ .value("ATR_REG_TX_ONLY", gpio_atr_reg_t::ATR_REG_TX_ONLY)
+ .value("ATR_REG_RX_ONLY", gpio_atr_reg_t::ATR_REG_RX_ONLY)
+ .value("ATR_REG_FULL_DUPLEX", gpio_atr_reg_t::ATR_REG_FULL_DUPLEX);
py::enum_<gpio_atr_mode_t>(m, "gpio_atr_mode")
- .value("MODE_ATR" , gpio_atr_mode_t::MODE_ATR )
- .value("MODE_GPIO", gpio_atr_mode_t::MODE_GPIO)
- ;
+ .value("MODE_ATR", gpio_atr_mode_t::MODE_ATR)
+ .value("MODE_GPIO", gpio_atr_mode_t::MODE_GPIO);
py::enum_<unit_t>(m, "unit")
- .value("UNIT_RX" , unit_t::UNIT_RX )
- .value("UNIT_TX" , unit_t::UNIT_TX )
- .value("UNIT_BOTH", unit_t::UNIT_BOTH)
- ;
+ .value("UNIT_RX", unit_t::UNIT_RX)
+ .value("UNIT_TX", unit_t::UNIT_TX)
+ .value("UNIT_BOTH", unit_t::UNIT_BOTH);
py::enum_<aux_dac_t>(m, "aux_dac")
.value("AUX_DAC_A", aux_dac_t::AUX_DAC_A)
.value("AUX_DAC_B", aux_dac_t::AUX_DAC_B)
.value("AUX_DAC_C", aux_dac_t::AUX_DAC_C)
- .value("AUX_DAC_D", aux_dac_t::AUX_DAC_D)
- ;
+ .value("AUX_DAC_D", aux_dac_t::AUX_DAC_D);
py::enum_<aux_adc_t>(m, "aux_adc")
.value("AUX_ADC_A", aux_adc_t::AUX_ADC_A)
- .value("AUX_ADC_B", aux_adc_t::AUX_ADC_B)
- ;
+ .value("AUX_ADC_B", aux_adc_t::AUX_ADC_B);
py::class_<special_props_t>(m, "special_props")
// Properties
.def_readwrite("soft_clock_divider", &special_props_t::soft_clock_divider)
- .def_readwrite("mangle_i2c_addrs" , &special_props_t::mangle_i2c_addrs )
- ;
+ .def_readwrite("mangle_i2c_addrs", &special_props_t::mangle_i2c_addrs);
py::class_<dboard_iface, dboard_iface::sptr>(m, "dboard_iface")
// Methods
.def("get_special_props", &dboard_iface::get_special_props)
- .def("write_aux_dac" , &dboard_iface::write_aux_dac )
- .def("read_aux_adc" , &dboard_iface::read_aux_adc )
- .def("set_pin_ctrl" , &dboard_iface::set_pin_ctrl )
- .def("get_pin_ctrl" , &dboard_iface::get_pin_ctrl )
- .def("set_atr_reg" , &dboard_iface::set_atr_reg )
- .def("get_atr_reg" , &dboard_iface::get_atr_reg )
- .def("set_gpio_ddr" , &dboard_iface::set_gpio_ddr )
- .def("get_gpio_ddr" , &dboard_iface::get_gpio_ddr )
- .def("get_gpio_out" , &dboard_iface::get_gpio_out )
- .def("set_gpio_out" , &dboard_iface::set_gpio_out )
- .def("read_gpio" , &dboard_iface::read_gpio )
- .def("write_spi" , &dboard_iface::write_spi )
- .def("read_write_spi" , &dboard_iface::read_write_spi )
- .def("set_clock_rate" , &dboard_iface::set_clock_rate )
- .def("get_clock_rate" , &dboard_iface::get_clock_rate )
- .def("get_clock_rates" , &dboard_iface::get_clock_rates )
+ .def("write_aux_dac", &dboard_iface::write_aux_dac)
+ .def("read_aux_adc", &dboard_iface::read_aux_adc)
+ .def("set_pin_ctrl", &dboard_iface::set_pin_ctrl)
+ .def("get_pin_ctrl", &dboard_iface::get_pin_ctrl)
+ .def("set_atr_reg", &dboard_iface::set_atr_reg)
+ .def("get_atr_reg", &dboard_iface::get_atr_reg)
+ .def("set_gpio_ddr", &dboard_iface::set_gpio_ddr)
+ .def("get_gpio_ddr", &dboard_iface::get_gpio_ddr)
+ .def("get_gpio_out", &dboard_iface::get_gpio_out)
+ .def("set_gpio_out", &dboard_iface::set_gpio_out)
+ .def("read_gpio", &dboard_iface::read_gpio)
+ .def("write_spi", &dboard_iface::write_spi)
+ .def("read_write_spi", &dboard_iface::read_write_spi)
+ .def("set_clock_rate", &dboard_iface::set_clock_rate)
+ .def("get_clock_rate", &dboard_iface::get_clock_rate)
+ .def("get_clock_rates", &dboard_iface::get_clock_rates)
.def("set_clock_enabled", &dboard_iface::set_clock_enabled)
- .def("get_codec_rate" , &dboard_iface::get_codec_rate )
+ .def("get_codec_rate", &dboard_iface::get_codec_rate)
.def("set_fe_connection", &dboard_iface::set_fe_connection)
- .def("get_command_time" , &dboard_iface::get_command_time )
- .def("set_command_time" , &dboard_iface::set_command_time )
- .def("sleep" , &dboard_iface::sleep )
- ;
+ .def("get_command_time", &dboard_iface::get_command_time)
+ .def("set_command_time", &dboard_iface::set_command_time)
+ .def("sleep", &dboard_iface::sleep);
}
#endif /* INCLUDED_UHD_USRP_DBOARD_IFACE_PYTHON_HPP */
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index a4acf2aaf..dc7ca6ac9 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -5,13 +5,12 @@
//
#include "dboard_ctor_args.hpp"
+#include <uhd/exception.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/utils/log.hpp>
-#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/exception.hpp>
-#include <uhd/types/dict.hpp>
#include <boost/format.hpp>
#include <functional>
#include <tuple>
@@ -22,34 +21,45 @@ using namespace uhd::usrp;
/***********************************************************************
* dboard key class to use for look-up
**********************************************************************/
-class dboard_key_t{
+class dboard_key_t
+{
public:
- dboard_key_t(const dboard_id_t &id = dboard_id_t::none(), bool restricted = false):
- _rx_id(id), _tx_id(id), _xcvr(false), _restricted(restricted) {}
+ dboard_key_t(const dboard_id_t& id = dboard_id_t::none(), bool restricted = false)
+ : _rx_id(id), _tx_id(id), _xcvr(false), _restricted(restricted)
+ {
+ }
- dboard_key_t(const dboard_id_t &rx_id, const dboard_id_t &tx_id, bool restricted = false):
- _rx_id(rx_id), _tx_id(tx_id), _xcvr(true), _restricted(restricted) {}
+ dboard_key_t(
+ const dboard_id_t& rx_id, const dboard_id_t& tx_id, bool restricted = false)
+ : _rx_id(rx_id), _tx_id(tx_id), _xcvr(true), _restricted(restricted)
+ {
+ }
- dboard_id_t xx_id(void) const{
+ dboard_id_t xx_id(void) const
+ {
UHD_ASSERT_THROW(not this->is_xcvr());
return this->_rx_id;
}
- dboard_id_t rx_id(void) const{
+ dboard_id_t rx_id(void) const
+ {
UHD_ASSERT_THROW(this->is_xcvr());
return this->_rx_id;
}
- dboard_id_t tx_id(void) const{
+ dboard_id_t tx_id(void) const
+ {
UHD_ASSERT_THROW(this->is_xcvr());
return this->_tx_id;
}
- bool is_xcvr(void) const{
+ bool is_xcvr(void) const
+ {
return this->_xcvr;
}
- bool is_restricted(void) const{
+ bool is_restricted(void) const
+ {
return this->_restricted;
}
@@ -59,7 +69,8 @@ private:
bool _restricted;
};
-bool operator==(const dboard_key_t &lhs, const dboard_key_t &rhs){
+bool operator==(const dboard_key_t& lhs, const dboard_key_t& rhs)
+{
if (lhs.is_xcvr() and rhs.is_xcvr())
return lhs.rx_id() == rhs.rx_id() and lhs.tx_id() == rhs.tx_id();
if (not lhs.is_xcvr() and not rhs.is_xcvr())
@@ -70,114 +81,132 @@ bool operator==(const dboard_key_t &lhs, const dboard_key_t &rhs){
/***********************************************************************
* storage and registering for dboards
**********************************************************************/
-//dboard registry tuple: dboard constructor, canonical name, subdev names, container constructor
-typedef std::tuple<dboard_manager::dboard_ctor_t, std::string, std::vector<std::string>, dboard_manager::dboard_ctor_t> args_t;
-
-//map a dboard id to a dboard constructor
+// dboard registry tuple: dboard constructor, canonical name, subdev names, container
+// constructor
+typedef std::tuple<dboard_manager::dboard_ctor_t,
+ std::string,
+ std::vector<std::string>,
+ dboard_manager::dboard_ctor_t>
+ args_t;
+
+// map a dboard id to a dboard constructor
typedef uhd::dict<dboard_key_t, args_t> id_to_args_map_t;
UHD_SINGLETON_FCN(id_to_args_map_t, get_id_to_args_map)
-static void register_dboard_key(
- const dboard_key_t &dboard_key,
+static void register_dboard_key(const dboard_key_t& dboard_key,
dboard_manager::dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names,
- dboard_manager::dboard_ctor_t db_container_ctor
-){
+ const std::string& name,
+ const std::vector<std::string>& subdev_names,
+ dboard_manager::dboard_ctor_t db_container_ctor)
+{
// UHD_LOGGER_TRACE("DBMGR") << "registering: " << name;
- if (get_id_to_args_map().has_key(dboard_key)){
-
- if (dboard_key.is_xcvr()) throw uhd::key_error(str(boost::format(
- "The dboard id pair [%s, %s] is already registered to %s."
- ) % dboard_key.rx_id().to_string() % dboard_key.tx_id().to_string() % std::get<1>(get_id_to_args_map()[dboard_key])));
-
- else throw uhd::key_error(str(boost::format(
- "The dboard id %s is already registered to %s."
- ) % dboard_key.xx_id().to_string() % std::get<1>(get_id_to_args_map()[dboard_key])));
+ if (get_id_to_args_map().has_key(dboard_key)) {
+ if (dboard_key.is_xcvr())
+ throw uhd::key_error(str(
+ boost::format("The dboard id pair [%s, %s] is already registered to %s.")
+ % dboard_key.rx_id().to_string() % dboard_key.tx_id().to_string()
+ % std::get<1>(get_id_to_args_map()[dboard_key])));
+
+ else
+ throw uhd::key_error(
+ str(boost::format("The dboard id %s is already registered to %s.")
+ % dboard_key.xx_id().to_string()
+ % std::get<1>(get_id_to_args_map()[dboard_key])));
}
- get_id_to_args_map()[dboard_key] = args_t(db_subdev_ctor, name, subdev_names, db_container_ctor);
+ get_id_to_args_map()[dboard_key] =
+ args_t(db_subdev_ctor, name, subdev_names, db_container_ctor);
}
-void dboard_manager::register_dboard(
- const dboard_id_t &dboard_id,
+void dboard_manager::register_dboard(const dboard_id_t& dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names,
- dboard_ctor_t db_container_ctor
-){
- register_dboard_key(dboard_key_t(dboard_id), db_subdev_ctor, name, subdev_names, db_container_ctor);
+ const std::string& name,
+ const std::vector<std::string>& subdev_names,
+ dboard_ctor_t db_container_ctor)
+{
+ register_dboard_key(
+ dboard_key_t(dboard_id), db_subdev_ctor, name, subdev_names, db_container_ctor);
}
-void dboard_manager::register_dboard(
- const dboard_id_t &rx_dboard_id,
- const dboard_id_t &tx_dboard_id,
+void dboard_manager::register_dboard(const dboard_id_t& rx_dboard_id,
+ const dboard_id_t& tx_dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names,
- dboard_ctor_t db_container_ctor
-){
- register_dboard_key(dboard_key_t(rx_dboard_id, tx_dboard_id), db_subdev_ctor, name, subdev_names, db_container_ctor);
+ const std::string& name,
+ const std::vector<std::string>& subdev_names,
+ dboard_ctor_t db_container_ctor)
+{
+ register_dboard_key(dboard_key_t(rx_dboard_id, tx_dboard_id),
+ db_subdev_ctor,
+ name,
+ subdev_names,
+ db_container_ctor);
}
-void dboard_manager::register_dboard_restricted(
- const dboard_id_t &dboard_id,
+void dboard_manager::register_dboard_restricted(const dboard_id_t& dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names,
- dboard_ctor_t db_container_ctor
-){
- register_dboard_key(dboard_key_t(dboard_id, true), db_subdev_ctor, name, subdev_names, db_container_ctor);
+ const std::string& name,
+ const std::vector<std::string>& subdev_names,
+ dboard_ctor_t db_container_ctor)
+{
+ register_dboard_key(dboard_key_t(dboard_id, true),
+ db_subdev_ctor,
+ name,
+ subdev_names,
+ db_container_ctor);
}
-void dboard_manager::register_dboard_restricted(
- const dboard_id_t &rx_dboard_id,
- const dboard_id_t &tx_dboard_id,
+void dboard_manager::register_dboard_restricted(const dboard_id_t& rx_dboard_id,
+ const dboard_id_t& tx_dboard_id,
dboard_ctor_t db_subdev_ctor,
- const std::string &name,
- const std::vector<std::string> &subdev_names,
- dboard_ctor_t db_container_ctor
-){
- register_dboard_key(dboard_key_t(rx_dboard_id, tx_dboard_id, true), db_subdev_ctor, name, subdev_names, db_container_ctor);
+ const std::string& name,
+ const std::vector<std::string>& subdev_names,
+ dboard_ctor_t db_container_ctor)
+{
+ register_dboard_key(dboard_key_t(rx_dboard_id, tx_dboard_id, true),
+ db_subdev_ctor,
+ name,
+ subdev_names,
+ db_container_ctor);
}
-std::string dboard_id_t::to_cname(void) const{
+std::string dboard_id_t::to_cname(void) const
+{
std::string cname;
- for(const dboard_key_t &key: get_id_to_args_map().keys()){
- if (
- (not key.is_xcvr() and *this == key.xx_id()) or
- (key.is_xcvr() and (*this == key.rx_id() or *this == key.tx_id()))
- ){
- if (not cname.empty()) cname += ", ";
+ for (const dboard_key_t& key : get_id_to_args_map().keys()) {
+ if ((not key.is_xcvr() and *this == key.xx_id())
+ or (key.is_xcvr() and (*this == key.rx_id() or *this == key.tx_id()))) {
+ if (not cname.empty())
+ cname += ", ";
cname += std::get<1>(get_id_to_args_map()[key]);
}
}
- return (cname.empty())? "Unknown" : cname;
+ return (cname.empty()) ? "Unknown" : cname;
}
-std::string dboard_id_t::to_pp_string(void) const{
+std::string dboard_id_t::to_pp_string(void) const
+{
return str(boost::format("%s (%s)") % this->to_cname() % this->to_string());
}
/***********************************************************************
* dboard manager implementation class
**********************************************************************/
-class dboard_manager_impl : public dboard_manager{
-
+class dboard_manager_impl : public dboard_manager
+{
public:
- dboard_manager_impl(
- dboard_eeprom_t rx_eeprom,
+ dboard_manager_impl(dboard_eeprom_t rx_eeprom,
dboard_eeprom_t tx_eeprom,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init
- );
+ bool defer_db_init);
virtual ~dboard_manager_impl(void);
- inline const std::vector<std::string>& get_rx_frontends() const {
+ inline const std::vector<std::string>& get_rx_frontends() const
+ {
return _rx_frontends;
}
- inline const std::vector<std::string>& get_tx_frontends() const {
+ inline const std::vector<std::string>& get_tx_frontends() const
+ {
return _tx_frontends;
}
@@ -185,15 +214,15 @@ public:
private:
void init(dboard_eeprom_t, dboard_eeprom_t, property_tree::sptr, bool);
- //list of rx and tx dboards in this dboard_manager
- //each dboard here is actually a subdevice proxy
- //the subdevice proxy is internal to the cpp file
+ // list of rx and tx dboards in this dboard_manager
+ // each dboard here is actually a subdevice proxy
+ // the subdevice proxy is internal to the cpp file
uhd::dict<std::string, dboard_base::sptr> _rx_dboards;
uhd::dict<std::string, dboard_base::sptr> _tx_dboards;
- std::vector<dboard_base::sptr> _rx_containers;
- std::vector<dboard_base::sptr> _tx_containers;
- std::vector<std::string> _rx_frontends;
- std::vector<std::string> _tx_frontends;
+ std::vector<dboard_base::sptr> _rx_containers;
+ std::vector<dboard_base::sptr> _tx_containers;
+ std::vector<std::string> _rx_frontends;
+ std::vector<std::string> _tx_frontends;
dboard_iface::sptr _iface;
void set_nice_dboard_if(void);
};
@@ -201,150 +230,154 @@ private:
/***********************************************************************
* make routine for dboard manager
**********************************************************************/
-dboard_manager::sptr dboard_manager::make(
- dboard_id_t rx_dboard_id,
+dboard_manager::sptr dboard_manager::make(dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
dboard_id_t gdboard_id,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init
-){
+ bool defer_db_init)
+{
dboard_eeprom_t rx_eeprom;
dboard_eeprom_t tx_eeprom;
rx_eeprom.id = rx_dboard_id;
tx_eeprom.id = (gdboard_id == dboard_id_t::none()) ? tx_dboard_id : gdboard_id;
return dboard_manager::sptr(
- new dboard_manager_impl(
- rx_eeprom,
- tx_eeprom,
- iface, subtree, defer_db_init
- )
- );
+ new dboard_manager_impl(rx_eeprom, tx_eeprom, iface, subtree, defer_db_init));
}
-dboard_manager::sptr dboard_manager::make(
- dboard_eeprom_t rx_eeprom,
+dboard_manager::sptr dboard_manager::make(dboard_eeprom_t rx_eeprom,
dboard_eeprom_t tx_eeprom,
dboard_eeprom_t gdb_eeprom,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init
-){
- return dboard_manager::sptr(
- new dboard_manager_impl(
- rx_eeprom,
- (gdb_eeprom.id == dboard_id_t::none())? tx_eeprom : gdb_eeprom,
- iface, subtree, defer_db_init
- )
- );
+ bool defer_db_init)
+{
+ return dboard_manager::sptr(new dboard_manager_impl(rx_eeprom,
+ (gdb_eeprom.id == dboard_id_t::none()) ? tx_eeprom : gdb_eeprom,
+ iface,
+ subtree,
+ defer_db_init));
}
/***********************************************************************
* implementation class methods
**********************************************************************/
-dboard_manager_impl::dboard_manager_impl(
- dboard_eeprom_t rx_eeprom,
+dboard_manager_impl::dboard_manager_impl(dboard_eeprom_t rx_eeprom,
dboard_eeprom_t tx_eeprom,
dboard_iface::sptr iface,
property_tree::sptr subtree,
- bool defer_db_init
-):
- _iface(iface)
+ bool defer_db_init)
+ : _iface(iface)
{
- try{
+ try {
this->init(rx_eeprom, tx_eeprom, subtree, defer_db_init);
- }
- catch(const std::exception &e){
- UHD_LOGGER_ERROR("DBMGR") << boost::format(
- "The daughterboard manager encountered a recoverable error in init.\n"
- "Loading the \"unknown\" daughterboard implementations to continue.\n"
- "The daughterboard cannot operate until this error is resolved.\n"
- ) << e.what() ;
- //clean up the stuff added by the call above
- if (subtree->exists("rx_frontends")) subtree->remove("rx_frontends");
- if (subtree->exists("tx_frontends")) subtree->remove("tx_frontends");
- if (subtree->exists("iface")) subtree->remove("iface");
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("DBMGR")
+ << boost::format(
+ "The daughterboard manager encountered a recoverable error in init.\n"
+ "Loading the \"unknown\" daughterboard implementations to continue.\n"
+ "The daughterboard cannot operate until this error is resolved.\n")
+ << e.what();
+ // clean up the stuff added by the call above
+ if (subtree->exists("rx_frontends"))
+ subtree->remove("rx_frontends");
+ if (subtree->exists("tx_frontends"))
+ subtree->remove("tx_frontends");
+ if (subtree->exists("iface"))
+ subtree->remove("iface");
dboard_eeprom_t dummy_eeprom;
dummy_eeprom.id = dboard_id_t::none();
this->init(dummy_eeprom, dummy_eeprom, subtree, false);
}
}
-void dboard_manager_impl::init(
- dboard_eeprom_t rx_eeprom,
+void dboard_manager_impl::init(dboard_eeprom_t rx_eeprom,
dboard_eeprom_t tx_eeprom,
property_tree::sptr subtree,
- bool defer_db_init
-){
- //find the dboard key matches for the dboard ids
+ bool defer_db_init)
+{
+ // find the dboard key matches for the dboard ids
dboard_key_t rx_dboard_key, tx_dboard_key, xcvr_dboard_key;
- for(const dboard_key_t &key: get_id_to_args_map().keys()){
- if (key.is_xcvr()){
- if (rx_eeprom.id == key.rx_id() and tx_eeprom.id == key.tx_id()) xcvr_dboard_key = key;
- if (rx_eeprom.id == key.rx_id()) rx_dboard_key = key; //kept to handle warning
- if (rx_eeprom.id == key.tx_id()) tx_dboard_key = key; //kept to handle warning
- }
- else{
- if (rx_eeprom.id == key.xx_id()) rx_dboard_key = key;
- if (tx_eeprom.id == key.xx_id()) tx_dboard_key = key;
+ for (const dboard_key_t& key : get_id_to_args_map().keys()) {
+ if (key.is_xcvr()) {
+ if (rx_eeprom.id == key.rx_id() and tx_eeprom.id == key.tx_id())
+ xcvr_dboard_key = key;
+ if (rx_eeprom.id == key.rx_id())
+ rx_dboard_key = key; // kept to handle warning
+ if (rx_eeprom.id == key.tx_id())
+ tx_dboard_key = key; // kept to handle warning
+ } else {
+ if (rx_eeprom.id == key.xx_id())
+ rx_dboard_key = key;
+ if (tx_eeprom.id == key.xx_id())
+ tx_dboard_key = key;
}
}
- //warn for invalid dboard id xcvr combinations
- if (not xcvr_dboard_key.is_xcvr() and (rx_dboard_key.is_xcvr() or tx_dboard_key.is_xcvr())){
- UHD_LOGGER_WARNING("DBMGR") << boost::format(
- "Unknown transceiver board ID combination.\n"
- "Is your daughter-board mounted properly?\n"
- "RX dboard ID: %s\n"
- "TX dboard ID: %s\n"
- ) % rx_eeprom.id.to_pp_string() % tx_eeprom.id.to_pp_string();
+ // warn for invalid dboard id xcvr combinations
+ if (not xcvr_dboard_key.is_xcvr()
+ and (rx_dboard_key.is_xcvr() or tx_dboard_key.is_xcvr())) {
+ UHD_LOGGER_WARNING("DBMGR")
+ << boost::format("Unknown transceiver board ID combination.\n"
+ "Is your daughter-board mounted properly?\n"
+ "RX dboard ID: %s\n"
+ "TX dboard ID: %s\n")
+ % rx_eeprom.id.to_pp_string() % tx_eeprom.id.to_pp_string();
}
- //initialize the gpio pins before creating subdevs
+ // initialize the gpio pins before creating subdevs
set_nice_dboard_if();
- //conditionally register the dboard iface in the tree
- if (not (rx_dboard_key.is_restricted() or tx_dboard_key.is_restricted() or xcvr_dboard_key.is_restricted())) {
+ // conditionally register the dboard iface in the tree
+ if (not(rx_dboard_key.is_restricted() or tx_dboard_key.is_restricted()
+ or xcvr_dboard_key.is_restricted())) {
subtree->create<dboard_iface::sptr>("iface").set(_iface);
}
- //dboard constructor args
+ // dboard constructor args
dboard_ctor_args_t db_ctor_args;
db_ctor_args.db_iface = _iface;
- //make xcvr subdevs
- if (xcvr_dboard_key.is_xcvr()){
-
- //extract data for the xcvr dboard key
- dboard_ctor_t subdev_ctor; std::string name; std::vector<std::string> subdevs; dboard_ctor_t container_ctor;
- std::tie(subdev_ctor, name, subdevs, container_ctor) = get_id_to_args_map()[xcvr_dboard_key];
-
- //create the container class.
- //a container class exists per N subdevs registered in a register_dboard* call
- db_ctor_args.sd_name = "common";
- db_ctor_args.rx_eeprom = rx_eeprom;
- db_ctor_args.tx_eeprom = tx_eeprom;
- db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
- db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
+ // make xcvr subdevs
+ if (xcvr_dboard_key.is_xcvr()) {
+ // extract data for the xcvr dboard key
+ dboard_ctor_t subdev_ctor;
+ std::string name;
+ std::vector<std::string> subdevs;
+ dboard_ctor_t container_ctor;
+ std::tie(subdev_ctor, name, subdevs, container_ctor) =
+ get_id_to_args_map()[xcvr_dboard_key];
+
+ // create the container class.
+ // a container class exists per N subdevs registered in a register_dboard* call
+ db_ctor_args.sd_name = "common";
+ db_ctor_args.rx_eeprom = rx_eeprom;
+ db_ctor_args.tx_eeprom = tx_eeprom;
+ db_ctor_args.rx_subtree =
+ subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.tx_subtree =
+ subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
if (container_ctor) {
db_ctor_args.rx_container = container_ctor(&db_ctor_args);
} else {
db_ctor_args.rx_container = dboard_base::sptr();
}
- db_ctor_args.tx_container = db_ctor_args.rx_container; //Same TX and RX container
+ db_ctor_args.tx_container = db_ctor_args.rx_container; // Same TX and RX container
- //create the xcvr object for each subdevice
- for(const std::string &subdev: subdevs){
+ // create the xcvr object for each subdevice
+ for (const std::string& subdev : subdevs) {
db_ctor_args.sd_name = subdev;
- db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
- db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.rx_subtree =
+ subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.tx_subtree =
+ subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
dboard_base::sptr xcvr_dboard = subdev_ctor(&db_ctor_args);
- _rx_dboards[subdev] = xcvr_dboard;
- _tx_dboards[subdev] = xcvr_dboard;
+ _rx_dboards[subdev] = xcvr_dboard;
+ _tx_dboards[subdev] = xcvr_dboard;
xcvr_dboard->initialize();
}
- //initialize the container after all subdevs have been created
+ // initialize the container after all subdevs have been created
if (container_ctor) {
if (defer_db_init) {
_rx_containers.push_back(db_ctor_args.rx_container);
@@ -353,30 +386,34 @@ void dboard_manager_impl::init(
}
}
- //Populate frontend names in-order.
- //We cannot use _xx_dboards.keys() here because of the ordering requirement
+ // Populate frontend names in-order.
+ // We cannot use _xx_dboards.keys() here because of the ordering requirement
_rx_frontends = subdevs;
_tx_frontends = subdevs;
}
- //make tx and rx subdevs (separate subdevs for rx and tx dboards)
- else
- {
- //force the rx key to the unknown board for bad combinations
- if (rx_dboard_key.is_xcvr() or rx_dboard_key.xx_id() == dboard_id_t::none()){
+ // make tx and rx subdevs (separate subdevs for rx and tx dboards)
+ else {
+ // force the rx key to the unknown board for bad combinations
+ if (rx_dboard_key.is_xcvr() or rx_dboard_key.xx_id() == dboard_id_t::none()) {
rx_dboard_key = dboard_key_t(0xfff1);
}
- //extract data for the rx dboard key
- dboard_ctor_t rx_dboard_ctor; std::string rx_name; std::vector<std::string> rx_subdevs; dboard_ctor_t rx_cont_ctor;
- std::tie(rx_dboard_ctor, rx_name, rx_subdevs, rx_cont_ctor) = get_id_to_args_map()[rx_dboard_key];
-
- //create the container class.
- //a container class exists per N subdevs registered in a register_dboard* call
- db_ctor_args.sd_name = "common";
- db_ctor_args.rx_eeprom = rx_eeprom;
+ // extract data for the rx dboard key
+ dboard_ctor_t rx_dboard_ctor;
+ std::string rx_name;
+ std::vector<std::string> rx_subdevs;
+ dboard_ctor_t rx_cont_ctor;
+ std::tie(rx_dboard_ctor, rx_name, rx_subdevs, rx_cont_ctor) =
+ get_id_to_args_map()[rx_dboard_key];
+
+ // create the container class.
+ // a container class exists per N subdevs registered in a register_dboard* call
+ db_ctor_args.sd_name = "common";
+ db_ctor_args.rx_eeprom = rx_eeprom;
db_ctor_args.tx_eeprom.id = dboard_id_t::none();
- db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.rx_subtree =
+ subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
db_ctor_args.tx_subtree = property_tree::sptr();
if (rx_cont_ctor) {
db_ctor_args.rx_container = rx_cont_ctor(&db_ctor_args);
@@ -384,15 +421,16 @@ void dboard_manager_impl::init(
db_ctor_args.rx_container = dboard_base::sptr();
}
- //make the rx subdevs
- for(const std::string &subdev: rx_subdevs){
+ // make the rx subdevs
+ for (const std::string& subdev : rx_subdevs) {
db_ctor_args.sd_name = subdev;
- db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.rx_subtree =
+ subtree->subtree("rx_frontends/" + db_ctor_args.sd_name);
_rx_dboards[subdev] = rx_dboard_ctor(&db_ctor_args);
_rx_dboards[subdev]->initialize();
}
- //initialize the container after all subdevs have been created
+ // initialize the container after all subdevs have been created
if (rx_cont_ctor) {
if (defer_db_init) {
_rx_containers.push_back(db_ctor_args.rx_container);
@@ -401,37 +439,43 @@ void dboard_manager_impl::init(
}
}
- //force the tx key to the unknown board for bad combinations
- if (tx_dboard_key.is_xcvr() or tx_dboard_key.xx_id() == dboard_id_t::none()){
+ // force the tx key to the unknown board for bad combinations
+ if (tx_dboard_key.is_xcvr() or tx_dboard_key.xx_id() == dboard_id_t::none()) {
tx_dboard_key = dboard_key_t(0xfff0);
}
- //extract data for the tx dboard key
- dboard_ctor_t tx_dboard_ctor; std::string tx_name; std::vector<std::string> tx_subdevs; dboard_ctor_t tx_cont_ctor;
- std::tie(tx_dboard_ctor, tx_name, tx_subdevs, tx_cont_ctor) = get_id_to_args_map()[tx_dboard_key];
-
- //create the container class.
- //a container class exists per N subdevs registered in a register_dboard* call
- db_ctor_args.sd_name = "common";
+ // extract data for the tx dboard key
+ dboard_ctor_t tx_dboard_ctor;
+ std::string tx_name;
+ std::vector<std::string> tx_subdevs;
+ dboard_ctor_t tx_cont_ctor;
+ std::tie(tx_dboard_ctor, tx_name, tx_subdevs, tx_cont_ctor) =
+ get_id_to_args_map()[tx_dboard_key];
+
+ // create the container class.
+ // a container class exists per N subdevs registered in a register_dboard* call
+ db_ctor_args.sd_name = "common";
db_ctor_args.rx_eeprom.id = dboard_id_t::none();
- db_ctor_args.tx_eeprom = tx_eeprom;
- db_ctor_args.rx_subtree = property_tree::sptr();
- db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.tx_eeprom = tx_eeprom;
+ db_ctor_args.rx_subtree = property_tree::sptr();
+ db_ctor_args.tx_subtree =
+ subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
if (tx_cont_ctor) {
db_ctor_args.tx_container = tx_cont_ctor(&db_ctor_args);
} else {
db_ctor_args.tx_container = dboard_base::sptr();
}
- //make the tx subdevs
- for(const std::string &subdev: tx_subdevs){
+ // make the tx subdevs
+ for (const std::string& subdev : tx_subdevs) {
db_ctor_args.sd_name = subdev;
- db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
+ db_ctor_args.tx_subtree =
+ subtree->subtree("tx_frontends/" + db_ctor_args.sd_name);
_tx_dboards[subdev] = tx_dboard_ctor(&db_ctor_args);
_tx_dboards[subdev]->initialize();
}
- //initialize the container after all subdevs have been created
+ // initialize the container after all subdevs have been created
if (tx_cont_ctor) {
if (defer_db_init) {
_tx_containers.push_back(db_ctor_args.tx_container);
@@ -440,39 +484,40 @@ void dboard_manager_impl::init(
}
}
- //Populate frontend names in-order.
- //We cannot use _xx_dboards.keys() here because of the ordering requirement
+ // Populate frontend names in-order.
+ // We cannot use _xx_dboards.keys() here because of the ordering requirement
_rx_frontends = rx_subdevs;
_tx_frontends = tx_subdevs;
}
}
-void dboard_manager_impl::initialize_dboards(void) {
- for(dboard_base::sptr& _rx_container: _rx_containers) {
+void dboard_manager_impl::initialize_dboards(void)
+{
+ for (dboard_base::sptr& _rx_container : _rx_containers) {
_rx_container->initialize();
}
- for(dboard_base::sptr& _tx_container: _tx_containers) {
+ for (dboard_base::sptr& _tx_container : _tx_containers) {
_tx_container->initialize();
}
}
-dboard_manager_impl::~dboard_manager_impl(void){UHD_SAFE_CALL(
- set_nice_dboard_if();
-)}
+dboard_manager_impl::~dboard_manager_impl(void)
+{
+ UHD_SAFE_CALL(set_nice_dboard_if();)
+}
-void dboard_manager_impl::set_nice_dboard_if(void){
- //make a list of possible unit types
+void dboard_manager_impl::set_nice_dboard_if(void)
+{
+ // make a list of possible unit types
const std::vector<dboard_iface::unit_t> units{
- dboard_iface::UNIT_RX,
- dboard_iface::UNIT_TX
- };
-
- //set nice settings on each unit
- for(dboard_iface::unit_t unit: units){
- _iface->set_gpio_ddr(unit, 0x0000); //all inputs
- _iface->set_gpio_out(unit, 0x0000); //all low
- _iface->set_pin_ctrl(unit, 0x0000); //all gpio
- _iface->set_clock_enabled(unit, false); //clock off
+ dboard_iface::UNIT_RX, dboard_iface::UNIT_TX};
+
+ // set nice settings on each unit
+ for (dboard_iface::unit_t unit : units) {
+ _iface->set_gpio_ddr(unit, 0x0000); // all inputs
+ _iface->set_gpio_out(unit, 0x0000); // all low
+ _iface->set_pin_ctrl(unit, 0x0000); // all gpio
+ _iface->set_clock_enabled(unit, false); // clock off
}
}
diff --git a/host/lib/usrp/fe_connection.cpp b/host/lib/usrp/fe_connection.cpp
index 8e3c0c88b..73c0020f8 100644
--- a/host/lib/usrp/fe_connection.cpp
+++ b/host/lib/usrp/fe_connection.cpp
@@ -5,35 +5,42 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/fe_connection.hpp>
#include <uhd/exception.hpp>
-#include <regex>
+#include <uhd/usrp/fe_connection.hpp>
#include <uhd/utils/math.hpp>
+#include <regex>
using namespace uhd::usrp;
-fe_connection_t::fe_connection_t(
- sampling_t sampling_mode, bool iq_swapped,
- bool i_inverted, bool q_inverted, double if_freq
-) : _sampling_mode(sampling_mode), _iq_swapped(iq_swapped),
- _i_inverted(i_inverted), _q_inverted(q_inverted), _if_freq(if_freq)
+fe_connection_t::fe_connection_t(sampling_t sampling_mode,
+ bool iq_swapped,
+ bool i_inverted,
+ bool q_inverted,
+ double if_freq)
+ : _sampling_mode(sampling_mode)
+ , _iq_swapped(iq_swapped)
+ , _i_inverted(i_inverted)
+ , _q_inverted(q_inverted)
+ , _if_freq(if_freq)
{
}
-fe_connection_t::fe_connection_t(const std::string& conn_str, double if_freq) {
+fe_connection_t::fe_connection_t(const std::string& conn_str, double if_freq)
+{
static const std::regex conn_regex("([IQ])(b?)(([IQ])(b?))?");
std::cmatch matches;
if (std::regex_match(conn_str.c_str(), matches, conn_regex)) {
if (matches[3].length() == 0) {
- //Connection in {I, Q, Ib, Qb}
+ // Connection in {I, Q, Ib, Qb}
_sampling_mode = REAL;
- _iq_swapped = (matches[1].str() == "Q");
- _i_inverted = (matches[2].length() != 0);
- _q_inverted = false; //IQ is swapped after inversion
+ _iq_swapped = (matches[1].str() == "Q");
+ _i_inverted = (matches[2].length() != 0);
+ _q_inverted = false; // IQ is swapped after inversion
} else {
- //Connection in {I(b?)Q(b?), Q(b?)I(b?), I(b?)I(b?), Q(b?)Q(b?)}
- _sampling_mode = (matches[1].str() == matches[4].str()) ? HETERODYNE : QUADRATURE;
- _iq_swapped = (matches[1].str() == "Q");
+ // Connection in {I(b?)Q(b?), Q(b?)I(b?), I(b?)I(b?), Q(b?)Q(b?)}
+ _sampling_mode = (matches[1].str() == matches[4].str()) ? HETERODYNE
+ : QUADRATURE;
+ _iq_swapped = (matches[1].str() == "Q");
size_t i_idx = _iq_swapped ? 5 : 2, q_idx = _iq_swapped ? 2 : 5;
_i_inverted = (matches[i_idx].length() != 0);
_q_inverted = (matches[q_idx].length() != 0);
@@ -48,10 +55,11 @@ fe_connection_t::fe_connection_t(const std::string& conn_str, double if_freq) {
}
}
-bool uhd::usrp::operator==(const fe_connection_t &lhs, const fe_connection_t &rhs){
- return ((lhs.get_sampling_mode() == rhs.get_sampling_mode()) and
- (lhs.is_iq_swapped() == rhs.is_iq_swapped()) and
- (lhs.is_i_inverted() == rhs.is_i_inverted()) and
- (lhs.is_q_inverted() == rhs.is_q_inverted()) and
- uhd::math::frequencies_are_equal(lhs.get_if_freq(), rhs.get_if_freq()));
+bool uhd::usrp::operator==(const fe_connection_t& lhs, const fe_connection_t& rhs)
+{
+ return ((lhs.get_sampling_mode() == rhs.get_sampling_mode())
+ and (lhs.is_iq_swapped() == rhs.is_iq_swapped())
+ and (lhs.is_i_inverted() == rhs.is_i_inverted())
+ and (lhs.is_q_inverted() == rhs.is_q_inverted())
+ and uhd::math::frequencies_are_equal(lhs.get_if_freq(), rhs.get_if_freq()));
}
diff --git a/host/lib/usrp/fe_connection_python.hpp b/host/lib/usrp/fe_connection_python.hpp
index d1304909e..247781981 100644
--- a/host/lib/usrp/fe_connection_python.hpp
+++ b/host/lib/usrp/fe_connection_python.hpp
@@ -18,8 +18,7 @@ void export_fe_connection(py::module& m)
py::enum_<sampling_t>(m, "sampling")
.value("QUADRATURE", sampling_t::QUADRATURE)
.value("HETERODYNE", sampling_t::HETERODYNE)
- .value("REAL" , sampling_t::REAL )
- ;
+ .value("REAL", sampling_t::REAL);
py::class_<fe_connection_t>(m, "fe_connection")
@@ -29,12 +28,11 @@ void export_fe_connection(py::module& m)
// Methods
.def("get_sampling_mode", &fe_connection_t::get_sampling_mode)
- .def("is_iq_swapped" , &fe_connection_t::is_iq_swapped )
- .def("is_i_inverted" , &fe_connection_t::is_i_inverted )
- .def("is_q_inverted" , &fe_connection_t::is_q_inverted )
- .def("get_if_freq" , &fe_connection_t::get_if_freq )
- .def("set_if_freq" , &fe_connection_t::set_if_freq )
- ;
+ .def("is_iq_swapped", &fe_connection_t::is_iq_swapped)
+ .def("is_i_inverted", &fe_connection_t::is_i_inverted)
+ .def("is_q_inverted", &fe_connection_t::is_q_inverted)
+ .def("get_if_freq", &fe_connection_t::get_if_freq)
+ .def("set_if_freq", &fe_connection_t::set_if_freq);
}
#endif /* INCLUDED_UHD_USRP_FE_CONNECTION_PYTHON_HPP */
diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp
index 07d7f4ec4..60866b85e 100644
--- a/host/lib/usrp/gps_ctrl.cpp
+++ b/host/lib/usrp/gps_ctrl.cpp
@@ -5,96 +5,94 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/gps_ctrl.hpp>
-
-#include <uhd/utils/log.hpp>
#include <uhd/exception.hpp>
#include <uhd/types/sensors.hpp>
+#include <uhd/usrp/gps_ctrl.hpp>
+#include <uhd/utils/log.hpp>
+#include <stdint.h>
#include <boost/algorithm/string.hpp>
-#include <boost/thread/thread.hpp>
-#include <boost/tokenizer.hpp>
+#include <boost/date_time.hpp>
#include <boost/format.hpp>
-#include <regex>
#include <boost/thread/mutex.hpp>
-#include <boost/date_time.hpp>
+#include <boost/thread/thread.hpp>
+#include <boost/tokenizer.hpp>
+#include <chrono>
#include <ctime>
+#include <regex>
#include <string>
-#include <tuple>
#include <thread>
-#include <chrono>
-#include <stdint.h>
+#include <tuple>
using namespace uhd;
using namespace boost::posix_time;
using namespace boost::algorithm;
namespace {
- constexpr int GPS_COMM_TIMEOUT_MS = 1300;
- constexpr int GPS_NMEA_NORMAL_FRESHNESS = 1000;
- constexpr int GPS_SERVO_FRESHNESS = 1000;
- constexpr int GPS_LOCK_FRESHNESS = 2500;
- constexpr int GPS_TIMEOUT_DELAY_MS = 200;
- constexpr int GPSDO_COMMAND_DELAY_MS = 200;
-}
+constexpr int GPS_COMM_TIMEOUT_MS = 1300;
+constexpr int GPS_NMEA_NORMAL_FRESHNESS = 1000;
+constexpr int GPS_SERVO_FRESHNESS = 1000;
+constexpr int GPS_LOCK_FRESHNESS = 2500;
+constexpr int GPS_TIMEOUT_DELAY_MS = 200;
+constexpr int GPSDO_COMMAND_DELAY_MS = 200;
+} // namespace
/*!
* A control for GPSDO devices
*/
-gps_ctrl::~gps_ctrl(void){
+gps_ctrl::~gps_ctrl(void)
+{
/* NOP */
}
-class gps_ctrl_impl : public gps_ctrl{
+class gps_ctrl_impl : public gps_ctrl
+{
private:
std::map<std::string, std::tuple<std::string, boost::system_time, bool>> sentences;
boost::mutex cache_mutex;
boost::system_time _last_cache_update;
- std::string get_sentence(const std::string which, const int max_age_ms, const int timeout, const bool wait_for_next = false)
+ std::string get_sentence(const std::string which,
+ const int max_age_ms,
+ const int timeout,
+ const bool wait_for_next = false)
{
std::string sentence;
- boost::system_time now = boost::get_system_time();
+ boost::system_time now = boost::get_system_time();
boost::system_time exit_time = now + milliseconds(timeout);
boost::posix_time::time_duration age;
- if (wait_for_next)
- {
+ if (wait_for_next) {
boost::lock_guard<boost::mutex> lock(cache_mutex);
update_cache();
- //mark sentence as touched
+ // mark sentence as touched
if (sentences.find(which) != sentences.end())
std::get<2>(sentences[which]) = true;
}
- while (1)
- {
- try
- {
+ while (1) {
+ try {
boost::lock_guard<boost::mutex> lock(cache_mutex);
// update cache if older than a millisecond
- if (now - _last_cache_update > milliseconds(1))
- {
+ if (now - _last_cache_update > milliseconds(1)) {
update_cache();
}
- if (sentences.find(which) == sentences.end())
- {
+ if (sentences.find(which) == sentences.end()) {
age = milliseconds(max_age_ms);
} else {
age = boost::get_system_time() - std::get<1>(sentences[which]);
}
- if (age < milliseconds(max_age_ms) and (not (wait_for_next and std::get<2>(sentences[which]))))
- {
- sentence = std::get<0>(sentences[which]);
+ if (age < milliseconds(max_age_ms)
+ and (not(wait_for_next and std::get<2>(sentences[which])))) {
+ sentence = std::get<0>(sentences[which]);
std::get<2>(sentences[which]) = true;
}
- } catch(std::exception &e) {
+ } catch (std::exception& e) {
UHD_LOGGER_DEBUG("GPS") << "get_sentence: " << e.what();
}
- if (not sentence.empty() or now > exit_time)
- {
+ if (not sentence.empty() or now > exit_time) {
break;
}
@@ -102,8 +100,7 @@ private:
now = boost::get_system_time();
}
- if (sentence.empty())
- {
+ if (sentence.empty()) {
throw uhd::value_error("gps ctrl: No " + which + " message found");
}
@@ -112,7 +109,7 @@ private:
static bool is_nmea_checksum_ok(std::string nmea)
{
- if (nmea.length() < 5 || nmea[0] != '$' || nmea[nmea.length()-3] != '*')
+ if (nmea.length() < 5 || nmea[0] != '$' || nmea[nmea.length() - 3] != '*')
return false;
std::stringstream ss;
@@ -120,310 +117,307 @@ private:
uint32_t calculated_crc = 0;
// get crc from string
- ss << std::hex << nmea.substr(nmea.length()-2, 2);
+ ss << std::hex << nmea.substr(nmea.length() - 2, 2);
ss >> string_crc;
// calculate crc
- for (size_t i = 1; i < nmea.length()-3; i++)
+ for (size_t i = 1; i < nmea.length() - 3; i++)
calculated_crc ^= nmea[i];
// return comparison
return (string_crc == calculated_crc);
}
- void update_cache() {
- if(not gps_detected()) {
- return;
- }
-
- const std::list<std::string> keys{"GPGGA", "GPRMC", "SERVO"};
- static const std::regex servo_regex("^\\d\\d-\\d\\d-\\d\\d.*$");
- static const std::regex gp_msg_regex("^\\$GP.*,\\*[0-9A-F]{2}$");
- std::map<std::string,std::string> msgs;
-
- // Get all GPSDO messages available
- // Creating a map here because we only want the latest of each message type
- for (std::string msg = _recv(0); not msg.empty(); msg = _recv(0))
+ void update_cache()
{
- // Strip any end of line characters
- erase_all(msg, "\r");
- erase_all(msg, "\n");
-
- if (msg.empty())
- {
- // Ignore empty strings
- continue;
+ if (not gps_detected()) {
+ return;
}
- if (msg.length() < 6)
- {
- UHD_LOGGER_WARNING("GPS") << __FUNCTION__ << ": Short GPSDO string: " << msg ;
- continue;
- }
+ const std::list<std::string> keys{"GPGGA", "GPRMC", "SERVO"};
+ static const std::regex servo_regex("^\\d\\d-\\d\\d-\\d\\d.*$");
+ static const std::regex gp_msg_regex("^\\$GP.*,\\*[0-9A-F]{2}$");
+ std::map<std::string, std::string> msgs;
+
+ // Get all GPSDO messages available
+ // Creating a map here because we only want the latest of each message type
+ for (std::string msg = _recv(0); not msg.empty(); msg = _recv(0)) {
+ // Strip any end of line characters
+ erase_all(msg, "\r");
+ erase_all(msg, "\n");
+
+ if (msg.empty()) {
+ // Ignore empty strings
+ continue;
+ }
- // Look for SERVO message
- if (std::regex_search(msg, servo_regex, std::regex_constants::match_continuous))
- {
- msgs["SERVO"] = msg;
- }
- else if (std::regex_match(msg, gp_msg_regex) and is_nmea_checksum_ok(msg))
- {
- msgs[msg.substr(1,5)] = msg;
- }
- else
- {
- UHD_LOGGER_WARNING("GPS") << __FUNCTION__ << ": Malformed GPSDO string: " << msg ;
+ if (msg.length() < 6) {
+ UHD_LOGGER_WARNING("GPS")
+ << __FUNCTION__ << ": Short GPSDO string: " << msg;
+ continue;
+ }
+
+ // Look for SERVO message
+ if (std::regex_search(
+ msg, servo_regex, std::regex_constants::match_continuous)) {
+ msgs["SERVO"] = msg;
+ } else if (std::regex_match(msg, gp_msg_regex) and is_nmea_checksum_ok(msg)) {
+ msgs[msg.substr(1, 5)] = msg;
+ } else {
+ UHD_LOGGER_WARNING("GPS")
+ << __FUNCTION__ << ": Malformed GPSDO string: " << msg;
+ }
}
- }
- boost::system_time time = boost::get_system_time();
+ boost::system_time time = boost::get_system_time();
- // Update sentences with newly read data
- for(std::string key: keys)
- {
- if (not msgs[key].empty())
- {
- sentences[key] = std::make_tuple(msgs[key], time, false);
+ // Update sentences with newly read data
+ for (std::string key : keys) {
+ if (not msgs[key].empty()) {
+ sentences[key] = std::make_tuple(msgs[key], time, false);
+ }
}
- }
- _last_cache_update = time;
- }
-
-public:
- gps_ctrl_impl(uart_iface::sptr uart) :
- _uart(uart),
- _gps_type(GPS_TYPE_NONE)
- {
-
- std::string reply;
- bool i_heard_some_nmea = false, i_heard_something_weird = false;
-
- //first we look for an internal GPSDO
- _flush(); //get whatever junk is in the rx buffer right now, and throw it away
-
- _send("*IDN?\r\n"); //request identity from the GPSDO
-
- //then we loop until we either timeout, or until we get a response that indicates we're a JL device
- //maximum response time was measured at ~320ms, so we set the timeout at 650ms
- const boost::system_time comm_timeout = boost::get_system_time() + milliseconds(650);
- while(boost::get_system_time() < comm_timeout) {
- reply = _recv();
- //known devices are JL "FireFly", "GPSTCXO", and "LC_XO"
- if(reply.find("FireFly") != std::string::npos
- or reply.find("LC_XO") != std::string::npos
- or reply.find("GPSTCXO") != std::string::npos) {
- _gps_type = GPS_TYPE_INTERNAL_GPSDO;
- break;
- } else if(reply.substr(0, 3) == "$GP") {
- i_heard_some_nmea = true; //but keep looking
- } else if(not reply.empty()) {
- // wrong baud rate or firmware still initializing
- i_heard_something_weird = true;
- _send("*IDN?\r\n"); //re-send identity request
- } else {
- // _recv timed out
- _send("*IDN?\r\n"); //re-send identity request
- }
+ _last_cache_update = time;
}
- if (_gps_type == GPS_TYPE_NONE)
+public:
+ gps_ctrl_impl(uart_iface::sptr uart) : _uart(uart), _gps_type(GPS_TYPE_NONE)
{
- if(i_heard_some_nmea) {
- _gps_type = GPS_TYPE_GENERIC_NMEA;
- } else if(i_heard_something_weird) {
- UHD_LOGGER_ERROR("GPS") << "GPS invalid reply \"" << reply << "\", assuming none available";
+ std::string reply;
+ bool i_heard_some_nmea = false, i_heard_something_weird = false;
+
+ // first we look for an internal GPSDO
+ _flush(); // get whatever junk is in the rx buffer right now, and throw it away
+
+ _send("*IDN?\r\n"); // request identity from the GPSDO
+
+ // then we loop until we either timeout, or until we get a response that indicates
+ // we're a JL device maximum response time was measured at ~320ms, so we set the
+ // timeout at 650ms
+ const boost::system_time comm_timeout =
+ boost::get_system_time() + milliseconds(650);
+ while (boost::get_system_time() < comm_timeout) {
+ reply = _recv();
+ // known devices are JL "FireFly", "GPSTCXO", and "LC_XO"
+ if (reply.find("FireFly") != std::string::npos
+ or reply.find("LC_XO") != std::string::npos
+ or reply.find("GPSTCXO") != std::string::npos) {
+ _gps_type = GPS_TYPE_INTERNAL_GPSDO;
+ break;
+ } else if (reply.substr(0, 3) == "$GP") {
+ i_heard_some_nmea = true; // but keep looking
+ } else if (not reply.empty()) {
+ // wrong baud rate or firmware still initializing
+ i_heard_something_weird = true;
+ _send("*IDN?\r\n"); // re-send identity request
+ } else {
+ // _recv timed out
+ _send("*IDN?\r\n"); // re-send identity request
+ }
}
- }
-
- switch(_gps_type) {
- case GPS_TYPE_INTERNAL_GPSDO:
- erase_all(reply, "\r");
- erase_all(reply, "\n");
- UHD_LOGGER_INFO("GPS") << "Found an internal GPSDO: " << reply;
- init_gpsdo();
- break;
- case GPS_TYPE_GENERIC_NMEA:
- UHD_LOGGER_INFO("GPS") << "Found a generic NMEA GPS device";
- break;
+ if (_gps_type == GPS_TYPE_NONE) {
+ if (i_heard_some_nmea) {
+ _gps_type = GPS_TYPE_GENERIC_NMEA;
+ } else if (i_heard_something_weird) {
+ UHD_LOGGER_ERROR("GPS")
+ << "GPS invalid reply \"" << reply << "\", assuming none available";
+ }
+ }
- case GPS_TYPE_NONE:
- default:
- UHD_LOGGER_INFO("GPS") << "No GPSDO found";
- break;
+ switch (_gps_type) {
+ case GPS_TYPE_INTERNAL_GPSDO:
+ erase_all(reply, "\r");
+ erase_all(reply, "\n");
+ UHD_LOGGER_INFO("GPS") << "Found an internal GPSDO: " << reply;
+ init_gpsdo();
+ break;
- }
+ case GPS_TYPE_GENERIC_NMEA:
+ UHD_LOGGER_INFO("GPS") << "Found a generic NMEA GPS device";
+ break;
- // initialize cache
- update_cache();
- }
+ case GPS_TYPE_NONE:
+ default:
+ UHD_LOGGER_INFO("GPS") << "No GPSDO found";
+ break;
+ }
- ~gps_ctrl_impl(void){
- /* NOP */
- }
-
- //return a list of supported sensors
- std::vector<std::string> get_sensors(void) {
- std::vector<std::string> ret{
- "gps_gpgga",
- "gps_gprmc",
- "gps_time",
- "gps_locked",
- "gps_servo"
- };
- return ret;
- }
-
- uhd::sensor_value_t get_sensor(std::string key) {
- if(key == "gps_gpgga"
- or key == "gps_gprmc") {
- return sensor_value_t(
- boost::to_upper_copy(key),
- get_sentence(boost::to_upper_copy(key.substr(4,8)), GPS_NMEA_NORMAL_FRESHNESS, GPS_TIMEOUT_DELAY_MS),
- "");
- }
- else if(key == "gps_time") {
- return sensor_value_t("GPS epoch time", int(get_epoch_time()), "seconds");
+ // initialize cache
+ update_cache();
}
- else if(key == "gps_locked") {
- return sensor_value_t("GPS lock status", locked(), "locked", "unlocked");
+
+ ~gps_ctrl_impl(void)
+ {
+ /* NOP */
}
- else if(key == "gps_servo") {
- return sensor_value_t(
- boost::to_upper_copy(key),
- get_sentence(boost::to_upper_copy(key.substr(4,8)), GPS_SERVO_FRESHNESS, GPS_TIMEOUT_DELAY_MS),
- "");
+
+ // return a list of supported sensors
+ std::vector<std::string> get_sensors(void)
+ {
+ std::vector<std::string> ret{
+ "gps_gpgga", "gps_gprmc", "gps_time", "gps_locked", "gps_servo"};
+ return ret;
}
- else {
- throw uhd::value_error("gps ctrl get_sensor unknown key: " + key);
+
+ uhd::sensor_value_t get_sensor(std::string key)
+ {
+ if (key == "gps_gpgga" or key == "gps_gprmc") {
+ return sensor_value_t(boost::to_upper_copy(key),
+ get_sentence(boost::to_upper_copy(key.substr(4, 8)),
+ GPS_NMEA_NORMAL_FRESHNESS,
+ GPS_TIMEOUT_DELAY_MS),
+ "");
+ } else if (key == "gps_time") {
+ return sensor_value_t("GPS epoch time", int(get_epoch_time()), "seconds");
+ } else if (key == "gps_locked") {
+ return sensor_value_t("GPS lock status", locked(), "locked", "unlocked");
+ } else if (key == "gps_servo") {
+ return sensor_value_t(boost::to_upper_copy(key),
+ get_sentence(boost::to_upper_copy(key.substr(4, 8)),
+ GPS_SERVO_FRESHNESS,
+ GPS_TIMEOUT_DELAY_MS),
+ "");
+ } else {
+ throw uhd::value_error("gps ctrl get_sensor unknown key: " + key);
+ }
}
- }
private:
- void init_gpsdo(void) {
- //issue some setup stuff so it spits out the appropriate data
- //none of these should issue replies so we don't bother looking for them
- //we have to sleep between commands because the JL device, despite not
- //acking, takes considerable time to process each command.
- const std::vector<std::string> init_cmds = {
- "SYST:COMM:SER:ECHO OFF\r\n",
- "SYST:COMM:SER:PRO OFF\r\n",
- "GPS:GPGGA 1\r\n",
- "GPS:GGAST 0\r\n",
- "GPS:GPRMC 1\r\n",
- "SERV:TRAC 1\r\n"
- };
-
- for (const auto& cmd : init_cmds) {
- _send(cmd);
- std::this_thread::sleep_for(
+ void init_gpsdo(void)
+ {
+ // issue some setup stuff so it spits out the appropriate data
+ // none of these should issue replies so we don't bother looking for them
+ // we have to sleep between commands because the JL device, despite not
+ // acking, takes considerable time to process each command.
+ const std::vector<std::string> init_cmds = {"SYST:COMM:SER:ECHO OFF\r\n",
+ "SYST:COMM:SER:PRO OFF\r\n",
+ "GPS:GPGGA 1\r\n",
+ "GPS:GGAST 0\r\n",
+ "GPS:GPRMC 1\r\n",
+ "SERV:TRAC 1\r\n"};
+
+ for (const auto& cmd : init_cmds) {
+ _send(cmd);
+ std::this_thread::sleep_for(
std::chrono::milliseconds(GPSDO_COMMAND_DELAY_MS));
- }
- }
-
- //helper function to retrieve a field from an NMEA sentence
- std::string get_token(std::string sentence, size_t offset) {
- boost::tokenizer<boost::escaped_list_separator<char> > tok(sentence);
- std::vector<std::string> toked;
- tok.assign(sentence); //this can throw
- toked.assign(tok.begin(), tok.end());
-
- if(toked.size() <= offset) {
- throw uhd::value_error(str(boost::format("Invalid response \"%s\"") % sentence));
+ }
}
- return toked[offset];
- }
-
- ptime get_time(void) {
- int error_cnt = 0;
- ptime gps_time;
- while(error_cnt < 2) {
- try {
- // wait for next GPRMC string
- std::string reply = get_sentence("GPRMC", GPS_NMEA_NORMAL_FRESHNESS, GPS_COMM_TIMEOUT_MS, true);
-
- std::string datestr = get_token(reply, 9);
- std::string timestr = get_token(reply, 1);
-
- if(datestr.size() == 0 or timestr.size() == 0) {
- throw uhd::value_error(str(boost::format("Invalid response \"%s\"") % reply));
- }
- struct tm raw_date;
- raw_date.tm_year = std::stoi(datestr.substr(4, 2)) + 2000 - 1900; // years since 1900
- raw_date.tm_mon = std::stoi(datestr.substr(2, 2)) - 1; // months since january (0-11)
- raw_date.tm_mday = std::stoi(datestr.substr(0, 2)); // dom (1-31)
- raw_date.tm_hour = std::stoi(timestr.substr(0, 2));
- raw_date.tm_min = std::stoi(timestr.substr(2, 2));
- raw_date.tm_sec = std::stoi(timestr.substr(4,2));
- gps_time = boost::posix_time::ptime_from_tm(raw_date);
-
- UHD_LOG_TRACE("GPS", "GPS time: " + boost::posix_time::to_simple_string(gps_time));
- return gps_time;
-
- } catch(std::exception &e) {
- UHD_LOGGER_DEBUG("GPS") << "get_time: " << e.what();
- error_cnt++;
+ // helper function to retrieve a field from an NMEA sentence
+ std::string get_token(std::string sentence, size_t offset)
+ {
+ boost::tokenizer<boost::escaped_list_separator<char>> tok(sentence);
+ std::vector<std::string> toked;
+ tok.assign(sentence); // this can throw
+ toked.assign(tok.begin(), tok.end());
+
+ if (toked.size() <= offset) {
+ throw uhd::value_error(
+ str(boost::format("Invalid response \"%s\"") % sentence));
}
+ return toked[offset];
}
- throw uhd::value_error("get_time: Timeout after no valid message found");
- return gps_time; //keep gcc from complaining
- }
+ ptime get_time(void)
+ {
+ int error_cnt = 0;
+ ptime gps_time;
+ while (error_cnt < 2) {
+ try {
+ // wait for next GPRMC string
+ std::string reply = get_sentence(
+ "GPRMC", GPS_NMEA_NORMAL_FRESHNESS, GPS_COMM_TIMEOUT_MS, true);
+
+ std::string datestr = get_token(reply, 9);
+ std::string timestr = get_token(reply, 1);
+
+ if (datestr.size() == 0 or timestr.size() == 0) {
+ throw uhd::value_error(
+ str(boost::format("Invalid response \"%s\"") % reply));
+ }
+
+ struct tm raw_date;
+ raw_date.tm_year =
+ std::stoi(datestr.substr(4, 2)) + 2000 - 1900; // years since 1900
+ raw_date.tm_mon =
+ std::stoi(datestr.substr(2, 2)) - 1; // months since january (0-11)
+ raw_date.tm_mday = std::stoi(datestr.substr(0, 2)); // dom (1-31)
+ raw_date.tm_hour = std::stoi(timestr.substr(0, 2));
+ raw_date.tm_min = std::stoi(timestr.substr(2, 2));
+ raw_date.tm_sec = std::stoi(timestr.substr(4, 2));
+ gps_time = boost::posix_time::ptime_from_tm(raw_date);
+
+ UHD_LOG_TRACE(
+ "GPS", "GPS time: " + boost::posix_time::to_simple_string(gps_time));
+ return gps_time;
+
+ } catch (std::exception& e) {
+ UHD_LOGGER_DEBUG("GPS") << "get_time: " << e.what();
+ error_cnt++;
+ }
+ }
+ throw uhd::value_error("get_time: Timeout after no valid message found");
- int64_t get_epoch_time(void) {
- return (get_time() - from_time_t(0)).total_seconds();
- }
+ return gps_time; // keep gcc from complaining
+ }
- bool gps_detected(void) {
- return (_gps_type != GPS_TYPE_NONE);
- }
+ int64_t get_epoch_time(void)
+ {
+ return (get_time() - from_time_t(0)).total_seconds();
+ }
+
+ bool gps_detected(void)
+ {
+ return (_gps_type != GPS_TYPE_NONE);
+ }
- bool locked(void) {
- int error_cnt = 0;
- while(error_cnt < 3) {
- try {
- std::string reply = get_sentence("GPGGA", GPS_LOCK_FRESHNESS, GPS_COMM_TIMEOUT_MS);
- if(reply.empty())
+ bool locked(void)
+ {
+ int error_cnt = 0;
+ while (error_cnt < 3) {
+ try {
+ std::string reply =
+ get_sentence("GPGGA", GPS_LOCK_FRESHNESS, GPS_COMM_TIMEOUT_MS);
+ if (reply.empty())
+ error_cnt++;
+ else
+ return (get_token(reply, 6) != "0");
+ } catch (std::exception& e) {
+ UHD_LOGGER_DEBUG("GPS") << "locked: " << e.what();
error_cnt++;
- else
- return (get_token(reply, 6) != "0");
- } catch(std::exception &e) {
- UHD_LOGGER_DEBUG("GPS") << "locked: " << e.what();
- error_cnt++;
+ }
}
+ throw uhd::value_error("locked(): unable to determine GPS lock status");
}
- throw uhd::value_error("locked(): unable to determine GPS lock status");
- }
- uart_iface::sptr _uart;
+ uart_iface::sptr _uart;
- void _flush(void){
- while (not _uart->read_uart(0.0).empty()){
- //NOP
+ void _flush(void)
+ {
+ while (not _uart->read_uart(0.0).empty()) {
+ // NOP
+ }
}
- }
- std::string _recv(double timeout = GPS_TIMEOUT_DELAY_MS/1000.){
- return _uart->read_uart(timeout);
- }
-
- void _send(const std::string &buf){
- return _uart->write_uart(buf);
- }
+ std::string _recv(double timeout = GPS_TIMEOUT_DELAY_MS / 1000.)
+ {
+ return _uart->read_uart(timeout);
+ }
- enum {
- GPS_TYPE_INTERNAL_GPSDO,
- GPS_TYPE_GENERIC_NMEA,
- GPS_TYPE_NONE
- } _gps_type;
+ void _send(const std::string& buf)
+ {
+ return _uart->write_uart(buf);
+ }
+ enum { GPS_TYPE_INTERNAL_GPSDO, GPS_TYPE_GENERIC_NMEA, GPS_TYPE_NONE } _gps_type;
};
/***********************************************************************
* Public make function for the GPS control
**********************************************************************/
-gps_ctrl::sptr gps_ctrl::make(uart_iface::sptr uart){
+gps_ctrl::sptr gps_ctrl::make(uart_iface::sptr uart)
+{
return sptr(new gps_ctrl_impl(uart));
}
diff --git a/host/lib/usrp/mboard_eeprom_c.cpp b/host/lib/usrp/mboard_eeprom_c.cpp
index f1cbaaed5..c923ac809 100644
--- a/host/lib/usrp/mboard_eeprom_c.cpp
+++ b/host/lib/usrp/mboard_eeprom_c.cpp
@@ -5,58 +5,36 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/mboard_eeprom.h>
-
#include <uhd/exception.hpp>
-
+#include <uhd/usrp/mboard_eeprom.h>
#include <string.h>
-uhd_error uhd_mboard_eeprom_make(
- uhd_mboard_eeprom_handle* h
-){
- UHD_SAFE_C(
- *h = new uhd_mboard_eeprom_t;
- )
+uhd_error uhd_mboard_eeprom_make(uhd_mboard_eeprom_handle* h)
+{
+ UHD_SAFE_C(*h = new uhd_mboard_eeprom_t;)
}
-uhd_error uhd_mboard_eeprom_free(
- uhd_mboard_eeprom_handle* h
-){
- UHD_SAFE_C(
- delete *h;
- *h = NULL;
- )
+uhd_error uhd_mboard_eeprom_free(uhd_mboard_eeprom_handle* h)
+{
+ UHD_SAFE_C(delete *h; *h = NULL;)
}
uhd_error uhd_mboard_eeprom_get_value(
- uhd_mboard_eeprom_handle h,
- const char* key,
- char* value_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string value_cpp = h->mboard_eeprom_cpp.get(key);
- strncpy(value_out, value_cpp.c_str(), strbuffer_len);
- )
+ uhd_mboard_eeprom_handle h, const char* key, char* value_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string value_cpp = h->mboard_eeprom_cpp.get(key);
+ strncpy(value_out, value_cpp.c_str(), strbuffer_len);)
}
uhd_error uhd_mboard_eeprom_set_value(
- uhd_mboard_eeprom_handle h,
- const char* key,
- const char* value
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->mboard_eeprom_cpp[key] = value;
- )
+ uhd_mboard_eeprom_handle h, const char* key, const char* value)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, h->mboard_eeprom_cpp[key] = value;)
}
uhd_error uhd_mboard_eeprom_last_error(
- uhd_mboard_eeprom_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+ uhd_mboard_eeprom_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
diff --git a/host/lib/usrp/mpmd/mpmd_find.cpp b/host/lib/usrp/mpmd/mpmd_find.cpp
index b5f20559c..501b250b0 100644
--- a/host/lib/usrp/mpmd/mpmd_find.cpp
+++ b/host/lib/usrp/mpmd/mpmd_find.cpp
@@ -93,7 +93,7 @@ device_addrs_t mpmd_find_with_addr(
// Create result to return
device_addr_t new_addr;
new_addr[MGMT_ADDR_KEY] = recv_addr;
- new_addr["type"] = "mpmd"; // hwd will overwrite this
+ new_addr["type"] = "mpmd"; // hwd will overwrite this
// remove ident string and put other informations into device_args dict
result.erase(result.begin());
// parse key-value pairs in the discovery string and add them to the
@@ -134,8 +134,7 @@ device_addrs_t mpmd_find_with_addrs(const device_addrs_t& hints)
device_addrs_t found_devices;
found_devices.reserve(hints.size());
for (const auto& hint : hints) {
- if (not(hint.has_key(xport::FIRST_ADDR_KEY)
- or hint.has_key(MGMT_ADDR_KEY))) {
+ if (not(hint.has_key(xport::FIRST_ADDR_KEY) or hint.has_key(MGMT_ADDR_KEY))) {
UHD_LOG_DEBUG("MPMD FIND", "No address given in hint " << hint.to_string());
continue;
}
diff --git a/host/lib/usrp/mpmd/mpmd_impl.cpp b/host/lib/usrp/mpmd/mpmd_impl.cpp
index cb463b3f4..d685b93b2 100644
--- a/host/lib/usrp/mpmd/mpmd_impl.cpp
+++ b/host/lib/usrp/mpmd/mpmd_impl.cpp
@@ -10,7 +10,6 @@
#include <uhd/utils/static.hpp>
#include <uhd/utils/tasks.hpp>
#include <boost/algorithm/string.hpp>
-#include <memory>
#include <boost/thread.hpp>
#include <chrono>
#include <future>
diff --git a/host/lib/usrp/mpmd/mpmd_impl.hpp b/host/lib/usrp/mpmd/mpmd_impl.hpp
index e1dde49b5..06b452724 100644
--- a/host/lib/usrp/mpmd/mpmd_impl.hpp
+++ b/host/lib/usrp/mpmd/mpmd_impl.hpp
@@ -12,8 +12,8 @@
#include <uhd/types/device_addr.hpp>
#include <uhd/types/dict.hpp>
#include <uhd/utils/tasks.hpp>
-#include <uhdlib/rfnoc/rfnoc_device.hpp>
#include <uhdlib/rfnoc/clock_iface.hpp>
+#include <uhdlib/rfnoc/rfnoc_device.hpp>
#include <uhdlib/usrp/common/mpmd_mb_controller.hpp>
#include <uhdlib/utils/rpc.hpp>
#include <boost/optional.hpp>
@@ -123,7 +123,8 @@ public:
* separate thread, and needs some kind of flag to be notified that
* something is up.
*/
- void allow_claim_failure(const bool allow) {
+ void allow_claim_failure(const bool allow)
+ {
if (allow) {
_allow_claim_failure_latch = true;
}
@@ -173,7 +174,6 @@ private:
* really need to know what it does.
*/
std::atomic<bool> _allow_claim_failure_latch{false};
-
};
diff --git a/host/lib/usrp/mpmd/mpmd_link_if_ctrl_liberio.hpp b/host/lib/usrp/mpmd/mpmd_link_if_ctrl_liberio.hpp
index 09fb24f8e..03331c576 100644
--- a/host/lib/usrp/mpmd/mpmd_link_if_ctrl_liberio.hpp
+++ b/host/lib/usrp/mpmd/mpmd_link_if_ctrl_liberio.hpp
@@ -27,15 +27,21 @@ public:
mpmd_link_if_ctrl_liberio(const uhd::device_addr_t& mb_args,
const mpmd_link_if_mgr::xport_info_list_t& xport_info);
- size_t get_num_links() const { return 1; }
+ size_t get_num_links() const
+ {
+ return 1;
+ }
- uhd::transport::both_links_t get_link(
- const size_t link_idx, const uhd::transport::link_type_t link_type,
+ uhd::transport::both_links_t get_link(const size_t link_idx,
+ const uhd::transport::link_type_t link_type,
const uhd::device_addr_t& link_args);
size_t get_mtu(const uhd::direction_t) const;
- double get_link_rate(const size_t /*link_idx*/) const { return _link_rate; }
+ double get_link_rate(const size_t /*link_idx*/) const
+ {
+ return _link_rate;
+ }
const uhd::rfnoc::chdr::chdr_packet_factory& get_packet_factory() const
{
@@ -43,7 +49,6 @@ public:
}
private:
-
const uhd::device_addr_t _mb_args;
const uhd::dict<std::string, std::string> _recv_args;
const uhd::dict<std::string, std::string> _send_args;
diff --git a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
index 9aa61a5a8..05393b017 100644
--- a/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
+++ b/host/lib/usrp/mpmd/mpmd_mb_controller.cpp
@@ -10,9 +10,9 @@ using namespace uhd::rfnoc;
using namespace uhd;
namespace {
- //! Default timeout value for tRPC calls that we know can take long (ms)
- constexpr size_t MPMD_DEFAULT_LONG_TIMEOUT = 12000; // ms
-}
+//! Default timeout value for tRPC calls that we know can take long (ms)
+constexpr size_t MPMD_DEFAULT_LONG_TIMEOUT = 12000; // ms
+} // namespace
mpmd_mb_controller::mpmd_mb_controller(
uhd::rpc_client::sptr rpcc, uhd::device_addr_t device_info)
@@ -108,7 +108,8 @@ std::vector<std::string> mpmd_mb_controller::get_clock_sources() const
return _rpc->request_with_token<std::vector<std::string>>("get_clock_sources");
}
-void mpmd_mb_controller::set_sync_source(const std::string& clock_source, const std::string& time_source)
+void mpmd_mb_controller::set_sync_source(
+ const std::string& clock_source, const std::string& time_source)
{
uhd::device_addr_t sync_source;
sync_source["clock_source"] = clock_source;
@@ -177,8 +178,7 @@ uhd::usrp::mboard_eeprom_t mpmd_mb_controller::get_eeprom()
{
auto mb_eeprom =
_rpc->request_with_token<std::map<std::string, std::string>>("get_mb_eeprom");
- uhd::usrp::mboard_eeprom_t mb_eeprom_dict(
- mb_eeprom.cbegin(), mb_eeprom.cend());
+ uhd::usrp::mboard_eeprom_t mb_eeprom_dict(mb_eeprom.cbegin(), mb_eeprom.cend());
return mb_eeprom_dict;
}
diff --git a/host/lib/usrp/mpmd/mpmd_mb_iface.cpp b/host/lib/usrp/mpmd/mpmd_mb_iface.cpp
index b474dfdc3..41b664374 100644
--- a/host/lib/usrp/mpmd/mpmd_mb_iface.cpp
+++ b/host/lib/usrp/mpmd/mpmd_mb_iface.cpp
@@ -26,9 +26,7 @@ static uhd::usrp::io_service_args_t get_default_io_srv_args()
mpmd_mboard_impl::mpmd_mb_iface::mpmd_mb_iface(
const uhd::device_addr_t& mb_args, uhd::rpc_client::sptr rpc)
- : _mb_args(mb_args)
- , _rpc(rpc)
- , _link_if_mgr(xport::mpmd_link_if_mgr::make(mb_args))
+ : _mb_args(mb_args), _rpc(rpc), _link_if_mgr(xport::mpmd_link_if_mgr::make(mb_args))
{
_remote_device_id = allocate_device_id();
UHD_LOG_TRACE("MPMD::MB_IFACE", "Assigning device_id " << _remote_device_id);
diff --git a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
index 4268a90ba..ecf503f28 100644
--- a/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
+++ b/host/lib/usrp/mpmd/mpmd_mboard_impl.cpp
@@ -11,8 +11,8 @@
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
#include <chrono>
-#include <thread>
#include <memory>
+#include <thread>
namespace {
/*************************************************************************
@@ -263,7 +263,8 @@ mpmd_mboard_impl::mpmd_mboard_impl(
, _claim_rpc(make_mpm_rpc_client(rpc_server_addr, mb_args, MPMD_CLAIMER_RPC_TIMEOUT))
{
UHD_LOGGER_TRACE("MPMD") << "Initializing mboard, connecting to RPC server address: "
- << rpc_server_addr << " mboard args: " << mb_args.to_string();
+ << rpc_server_addr
+ << " mboard args: " << mb_args.to_string();
_claimer_task = claim_device_and_make_task();
if (mb_args_.has_key(MPMD_MEAS_LATENCY_KEY)) {
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp
index 0ea25b099..c91f596cd 100644
--- a/host/lib/usrp/multi_usrp.cpp
+++ b/host/lib/usrp/multi_usrp.cpp
@@ -44,40 +44,44 @@ uhd::usrp::multi_usrp::sptr make_rfnoc_device(
using namespace uhd;
using namespace uhd::usrp;
-const size_t multi_usrp::ALL_MBOARDS = size_t(~0);
-const size_t multi_usrp::ALL_CHANS = size_t(~0);
+const size_t multi_usrp::ALL_MBOARDS = size_t(~0);
+const size_t multi_usrp::ALL_CHANS = size_t(~0);
const std::string multi_usrp::ALL_GAINS = "";
-const std::string multi_usrp::ALL_LOS = "all";
+const std::string multi_usrp::ALL_LOS = "all";
-UHD_INLINE std::string string_vector_to_string(std::vector<std::string> values, std::string delimiter = std::string(" "))
+UHD_INLINE std::string string_vector_to_string(
+ std::vector<std::string> values, std::string delimiter = std::string(" "))
{
std::string out = "";
- for (std::vector<std::string>::iterator iter = values.begin(); iter != values.end(); iter++)
- {
+ for (std::vector<std::string>::iterator iter = values.begin(); iter != values.end();
+ iter++) {
out += (iter != values.begin() ? delimiter : "") + *iter;
}
return out;
}
-#define THROW_GAIN_NAME_ERROR(name,chan,dir) throw uhd::exception::runtime_error( \
- (boost::format("%s: gain \"%s\" not found for channel %d.\nAvailable gains: %s\n") % \
- __FUNCTION__ % name % chan % string_vector_to_string(get_##dir##_gain_names(chan))).str());
+#define THROW_GAIN_NAME_ERROR(name, chan, dir) \
+ throw uhd::exception::runtime_error( \
+ (boost::format( \
+ "%s: gain \"%s\" not found for channel %d.\nAvailable gains: %s\n") \
+ % __FUNCTION__ % name % chan \
+ % string_vector_to_string(get_##dir##_gain_names(chan))) \
+ .str());
/***********************************************************************
* Helper methods
**********************************************************************/
static void do_samp_rate_warning_message(
- double target_rate,
- double actual_rate,
- const std::string &xx
-){
- static const double max_allowed_error = 1.0; //Sps
- if (std::abs(target_rate - actual_rate) > max_allowed_error){
- UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
- "The hardware does not support the requested %s sample rate:\n"
- "Target sample rate: %f MSps\n"
- "Actual sample rate: %f MSps\n"
- ) % xx % (target_rate/1e6) % (actual_rate/1e6);
+ double target_rate, double actual_rate, const std::string& xx)
+{
+ static const double max_allowed_error = 1.0; // Sps
+ if (std::abs(target_rate - actual_rate) > max_allowed_error) {
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << boost::format(
+ "The hardware does not support the requested %s sample rate:\n"
+ "Target sample rate: %f MSps\n"
+ "Actual sample rate: %f MSps\n")
+ % xx % (target_rate / 1e6) % (actual_rate / 1e6);
}
}
@@ -97,10 +101,12 @@ static void do_samp_rate_warning_message(
if (tune_req.rf_freq_policy == tune_request_t::POLICY_MANUAL) return;
if (tune_req.dsp_freq_policy == tune_request_t::POLICY_MANUAL) return;
- bool requested_freq_success = uhd::math::frequencies_are_equal(target_freq, clipped_target_freq);
- bool target_freq_success = uhd::math::frequencies_are_equal(clipped_target_freq, actual_freq);
- bool rf_lo_tune_success = uhd::math::frequencies_are_equal(target_rf_freq, actual_rf_freq);
- bool dsp_tune_success = uhd::math::frequencies_are_equal(target_dsp_freq, actual_dsp_freq);
+ bool requested_freq_success = uhd::math::frequencies_are_equal(target_freq,
+clipped_target_freq); bool target_freq_success =
+uhd::math::frequencies_are_equal(clipped_target_freq, actual_freq); bool
+rf_lo_tune_success = uhd::math::frequencies_are_equal(target_rf_freq, actual_rf_freq);
+ bool dsp_tune_success = uhd::math::frequencies_are_equal(target_dsp_freq,
+actual_dsp_freq);
if(requested_freq_success and target_freq_success and rf_lo_tune_success
and dsp_tune_success) {
@@ -134,9 +140,8 @@ static void do_samp_rate_warning_message(
if(not requested_freq_success) {
boost::format failure_message(
- " The requested %s frequency is outside of the system range, and has been clipped:\n"
- " Target Frequency: %f MHz\n"
- " Clipped Target Frequency: %f MHz\n");
+ " The requested %s frequency is outside of the system range, and has been
+clipped:\n" " Target Frequency: %f MHz\n" " Clipped Target Frequency: %f MHz\n");
failure_message % xx % (target_freq / 1e6) % (clipped_target_freq / 1e6);
results_string += failure_message.str();
@@ -192,39 +197,38 @@ static void do_samp_rate_warning_message(
* begins. This prevents the user from tuning past the point where less
* than half of the spectrum would be useful. */
static meta_range_t make_overall_tune_range(
- const meta_range_t &fe_range,
- const meta_range_t &dsp_range,
- const double bw
-){
+ const meta_range_t& fe_range, const meta_range_t& dsp_range, const double bw)
+{
meta_range_t range;
- for(const range_t &sub_range: fe_range){
- range.push_back(range_t(
- sub_range.start() + std::max(dsp_range.start(), -bw/2),
- sub_range.stop() + std::min(dsp_range.stop(), bw/2),
- dsp_range.step()
- ));
+ for (const range_t& sub_range : fe_range) {
+ range.push_back(range_t(sub_range.start() + std::max(dsp_range.start(), -bw / 2),
+ sub_range.stop() + std::min(dsp_range.stop(), bw / 2),
+ dsp_range.step()));
}
return range;
}
-
/***********************************************************************
* Gain helper functions
**********************************************************************/
-static double get_gain_value(property_tree::sptr subtree){
+static double get_gain_value(property_tree::sptr subtree)
+{
return subtree->access<double>("value").get();
}
-static void set_gain_value(property_tree::sptr subtree, const double gain){
+static void set_gain_value(property_tree::sptr subtree, const double gain)
+{
subtree->access<double>("value").set(gain);
}
-static meta_range_t get_gain_range(property_tree::sptr subtree){
+static meta_range_t get_gain_range(property_tree::sptr subtree)
+{
return subtree->access<meta_range_t>("range").get();
}
-static gain_fcns_t make_gain_fcns_from_subtree(property_tree::sptr subtree){
+static gain_fcns_t make_gain_fcns_from_subtree(property_tree::sptr subtree)
+{
gain_fcns_t gain_fcns;
gain_fcns.get_range = std::bind(&get_gain_range, subtree);
gain_fcns.get_value = std::bind(&get_gain_value, subtree);
@@ -238,23 +242,21 @@ static gain_fcns_t make_gain_fcns_from_subtree(property_tree::sptr subtree){
static const double RX_SIGN = +1.0;
static const double TX_SIGN = -1.0;
-static tune_result_t tune_xx_subdev_and_dsp(
- const double xx_sign,
+static tune_result_t tune_xx_subdev_and_dsp(const double xx_sign,
property_tree::sptr dsp_subtree,
property_tree::sptr rf_fe_subtree,
- const tune_request_t &tune_request
-){
+ const tune_request_t& tune_request)
+{
//------------------------------------------------------------------
//-- calculate the tunable frequency ranges of the system
//------------------------------------------------------------------
- freq_range_t tune_range = make_overall_tune_range(
- rf_fe_subtree->access<meta_range_t>("freq/range").get(),
+ freq_range_t tune_range =
+ make_overall_tune_range(rf_fe_subtree->access<meta_range_t>("freq/range").get(),
dsp_subtree->access<meta_range_t>("freq/range").get(),
- rf_fe_subtree->access<double>("bandwidth/value").get()
- );
+ rf_fe_subtree->access<double>("bandwidth/value").get());
freq_range_t dsp_range = dsp_subtree->access<meta_range_t>("freq/range").get();
- freq_range_t rf_range = rf_fe_subtree->access<meta_range_t>("freq/range").get();
+ freq_range_t rf_range = rf_fe_subtree->access<meta_range_t>("freq/range").get();
double clipped_requested_freq = tune_range.clip(tune_request.target_freq);
@@ -269,19 +271,20 @@ static tune_result_t tune_xx_subdev_and_dsp(
* tune_request. This lo_offset is based on the requirements of the FE, and
* does not reflect a user-requested lo_offset, which is handled later. */
double lo_offset = 0.0;
- if (rf_fe_subtree->exists("use_lo_offset") and
- rf_fe_subtree->access<bool>("use_lo_offset").get()){
+ if (rf_fe_subtree->exists("use_lo_offset")
+ and rf_fe_subtree->access<bool>("use_lo_offset").get()) {
// If the frontend has lo_offset value and range properties, trust it
// for lo_offset
if (rf_fe_subtree->exists("lo_offset/value")) {
lo_offset = rf_fe_subtree->access<double>("lo_offset/value").get();
}
- //If the local oscillator will be in the passband, use an offset.
- //But constrain the LO offset by the width of the filter bandwidth.
+ // If the local oscillator will be in the passband, use an offset.
+ // But constrain the LO offset by the width of the filter bandwidth.
const double rate = dsp_subtree->access<double>("rate/value").get();
- const double bw = rf_fe_subtree->access<double>("bandwidth/value").get();
- if (bw > rate) lo_offset = std::min((bw - rate)/2, rate/2);
+ const double bw = rf_fe_subtree->access<double>("bandwidth/value").get();
+ if (bw > rate)
+ lo_offset = std::min((bw - rate) / 2, rate / 2);
}
//------------------------------------------------------------------
@@ -296,7 +299,7 @@ static tune_result_t tune_xx_subdev_and_dsp(
//------------------------------------------------------------------
double target_rf_freq = 0.0;
- switch (tune_request.rf_freq_policy){
+ switch (tune_request.rf_freq_policy) {
case tune_request_t::POLICY_AUTO:
target_rf_freq = clipped_requested_freq + lo_offset;
break;
@@ -316,7 +319,7 @@ static tune_result_t tune_xx_subdev_and_dsp(
break;
case tune_request_t::POLICY_NONE:
- break; //does not set
+ break; // does not set
}
//------------------------------------------------------------------
@@ -341,7 +344,7 @@ static tune_result_t tune_xx_subdev_and_dsp(
* filtered baseband. */
target_dsp_freq = actual_rf_freq - clipped_requested_freq;
- //invert the sign on the dsp freq for transmit (spinning up vs down)
+ // invert the sign on the dsp freq for transmit (spinning up vs down)
target_dsp_freq *= xx_sign;
break;
@@ -355,7 +358,7 @@ static tune_result_t tune_xx_subdev_and_dsp(
break;
case tune_request_t::POLICY_NONE:
- break; //does not set
+ break; // does not set
}
//------------------------------------------------------------------
@@ -371,37 +374,38 @@ static tune_result_t tune_xx_subdev_and_dsp(
//------------------------------------------------------------------
tune_result_t tune_result;
tune_result.clipped_rf_freq = clipped_requested_freq;
- tune_result.target_rf_freq = target_rf_freq;
- tune_result.actual_rf_freq = actual_rf_freq;
+ tune_result.target_rf_freq = target_rf_freq;
+ tune_result.actual_rf_freq = actual_rf_freq;
tune_result.target_dsp_freq = target_dsp_freq;
tune_result.actual_dsp_freq = actual_dsp_freq;
return tune_result;
}
-static double derive_freq_from_xx_subdev_and_dsp(
- const double xx_sign,
+static double derive_freq_from_xx_subdev_and_dsp(const double xx_sign,
property_tree::sptr dsp_subtree,
- property_tree::sptr rf_fe_subtree
-){
- //extract actual dsp and IF frequencies
- const double actual_rf_freq = rf_fe_subtree->access<double>("freq/value").get();
+ property_tree::sptr rf_fe_subtree)
+{
+ // extract actual dsp and IF frequencies
+ const double actual_rf_freq = rf_fe_subtree->access<double>("freq/value").get();
const double actual_dsp_freq = dsp_subtree->access<double>("freq/value").get();
- //invert the sign on the dsp freq for transmit
+ // invert the sign on the dsp freq for transmit
return actual_rf_freq - actual_dsp_freq * xx_sign;
}
/***********************************************************************
* Multi USRP Implementation
**********************************************************************/
-class multi_usrp_impl : public multi_usrp{
+class multi_usrp_impl : public multi_usrp
+{
public:
multi_usrp_impl(device::sptr dev) : _dev(dev)
{
_tree = _dev->get_tree();
}
- device::sptr get_device(void){
+ device::sptr get_device(void)
+ {
return _dev;
}
@@ -410,83 +414,101 @@ public:
return _tree;
}
- dict<std::string, std::string> get_usrp_rx_info(size_t chan){
+ dict<std::string, std::string> get_usrp_rx_info(size_t chan)
+ {
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
dict<std::string, std::string> usrp_info;
const auto mb_eeprom =
_tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
- usrp_info["mboard_id"] = _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
- usrp_info["mboard_name"] = mb_eeprom.get("name", "n/a");
+ usrp_info["mboard_id"] =
+ _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
+ usrp_info["mboard_name"] = mb_eeprom.get("name", "n/a");
usrp_info["mboard_serial"] = mb_eeprom["serial"];
- usrp_info["rx_subdev_name"] = _tree->access<std::string>(rx_rf_fe_root(chan) / "name").get();
- usrp_info["rx_subdev_spec"] = _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "rx_subdev_spec").get().to_string();
- usrp_info["rx_antenna"] = _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").get();
- if (_tree->exists(rx_rf_fe_root(chan).branch_path().branch_path() / "rx_eeprom")) {
+ usrp_info["rx_subdev_name"] =
+ _tree->access<std::string>(rx_rf_fe_root(chan) / "name").get();
+ usrp_info["rx_subdev_spec"] =
+ _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "rx_subdev_spec")
+ .get()
+ .to_string();
+ usrp_info["rx_antenna"] =
+ _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").get();
+ if (_tree->exists(
+ rx_rf_fe_root(chan).branch_path().branch_path() / "rx_eeprom")) {
const auto db_eeprom =
- _tree->access<dboard_eeprom_t>(
- rx_rf_fe_root(chan).branch_path().branch_path()
- / "rx_eeprom"
- ).get();
+ _tree
+ ->access<dboard_eeprom_t>(
+ rx_rf_fe_root(chan).branch_path().branch_path() / "rx_eeprom")
+ .get();
usrp_info["rx_serial"] = db_eeprom.serial;
- usrp_info["rx_id"] = db_eeprom.id.to_pp_string();
+ usrp_info["rx_id"] = db_eeprom.id.to_pp_string();
}
const auto rfnoc_path = mb_root(mcp.mboard) / "xbar";
if (_tree->exists(rfnoc_path)) {
- const auto spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
+ const auto spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
const auto radio_index = get_radio_index(spec.db_name);
- const auto radio_path = rfnoc_path / str(boost::format("Radio_%d") % radio_index);
+ const auto radio_path =
+ rfnoc_path / str(boost::format("Radio_%d") % radio_index);
const auto eeprom_path = radio_path / "eeprom";
if (_tree->exists(eeprom_path)) {
- const auto db_eeprom = _tree->access<eeprom_map_t>(eeprom_path).get();
- usrp_info["rx_serial"] = db_eeprom.count("serial") ?
- std::string(db_eeprom.at("serial").begin(), db_eeprom.at("serial").end())
- : "n/a"
- ;
- usrp_info["rx_id"] = db_eeprom.count("pid") ?
- std::string(db_eeprom.at("pid").begin(), db_eeprom.at("pid").end())
- : "n/a"
- ;
+ const auto db_eeprom = _tree->access<eeprom_map_t>(eeprom_path).get();
+ usrp_info["rx_serial"] = db_eeprom.count("serial")
+ ? std::string(db_eeprom.at("serial").begin(),
+ db_eeprom.at("serial").end())
+ : "n/a";
+ usrp_info["rx_id"] = db_eeprom.count("pid")
+ ? std::string(db_eeprom.at("pid").begin(),
+ db_eeprom.at("pid").end())
+ : "n/a";
}
}
return usrp_info;
}
- dict<std::string, std::string> get_usrp_tx_info(size_t chan){
+ dict<std::string, std::string> get_usrp_tx_info(size_t chan)
+ {
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
dict<std::string, std::string> usrp_info;
const auto mb_eeprom =
_tree->access<mboard_eeprom_t>(mb_root(mcp.mboard) / "eeprom").get();
- usrp_info["mboard_id"] = _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
- usrp_info["mboard_name"] = mb_eeprom.get("name", "n/a");
+ usrp_info["mboard_id"] =
+ _tree->access<std::string>(mb_root(mcp.mboard) / "name").get();
+ usrp_info["mboard_name"] = mb_eeprom.get("name", "n/a");
usrp_info["mboard_serial"] = mb_eeprom["serial"];
- usrp_info["tx_subdev_name"] = _tree->access<std::string>(tx_rf_fe_root(chan) / "name").get();
- usrp_info["tx_subdev_spec"] = _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "tx_subdev_spec").get().to_string();
- usrp_info["tx_antenna"] = _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").get();
- if (_tree->exists(tx_rf_fe_root(chan).branch_path().branch_path() / "tx_eeprom")) {
+ usrp_info["tx_subdev_name"] =
+ _tree->access<std::string>(tx_rf_fe_root(chan) / "name").get();
+ usrp_info["tx_subdev_spec"] =
+ _tree->access<subdev_spec_t>(mb_root(mcp.mboard) / "tx_subdev_spec")
+ .get()
+ .to_string();
+ usrp_info["tx_antenna"] =
+ _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").get();
+ if (_tree->exists(
+ tx_rf_fe_root(chan).branch_path().branch_path() / "tx_eeprom")) {
const auto db_eeprom =
- _tree->access<dboard_eeprom_t>(
- tx_rf_fe_root(chan).branch_path().branch_path()
- / "tx_eeprom"
- ).get();
+ _tree
+ ->access<dboard_eeprom_t>(
+ tx_rf_fe_root(chan).branch_path().branch_path() / "tx_eeprom")
+ .get();
usrp_info["tx_serial"] = db_eeprom.serial;
- usrp_info["tx_id"] = db_eeprom.id.to_pp_string();
+ usrp_info["tx_id"] = db_eeprom.id.to_pp_string();
}
const auto rfnoc_path = mb_root(mcp.mboard) / "xbar";
if (_tree->exists(rfnoc_path)) {
- const auto spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
+ const auto spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
const auto radio_index = get_radio_index(spec.db_name);
- const auto radio_path = rfnoc_path / str(boost::format("Radio_%d")%radio_index);
+ const auto radio_path =
+ rfnoc_path / str(boost::format("Radio_%d") % radio_index);
const auto path = radio_path / "eeprom";
- if(_tree->exists(path)) {
- const auto db_eeprom = _tree->access<eeprom_map_t>(path).get();
- usrp_info["tx_serial"] = db_eeprom.count("serial") ?
- std::string(db_eeprom.at("serial").begin(), db_eeprom.at("serial").end())
- : "n/a"
- ;
- usrp_info["tx_id"] = db_eeprom.count("pid") ?
- std::string(db_eeprom.at("pid").begin(), db_eeprom.at("pid").end())
- : "n/a"
- ;
+ if (_tree->exists(path)) {
+ const auto db_eeprom = _tree->access<eeprom_map_t>(path).get();
+ usrp_info["tx_serial"] = db_eeprom.count("serial")
+ ? std::string(db_eeprom.at("serial").begin(),
+ db_eeprom.at("serial").end())
+ : "n/a";
+ usrp_info["tx_id"] = db_eeprom.count("pid")
+ ? std::string(db_eeprom.at("pid").begin(),
+ db_eeprom.at("pid").end())
+ : "n/a";
}
}
return usrp_info;
@@ -495,215 +517,212 @@ public:
/*******************************************************************
* Mboard methods
******************************************************************/
- void set_master_clock_rate(double rate, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_master_clock_rate(double rate, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
if (_tree->exists(mb_root(mboard) / "auto_tick_rate")
- and _tree->access<bool>(mb_root(mboard) / "auto_tick_rate").get()) {
+ and _tree->access<bool>(mb_root(mboard) / "auto_tick_rate").get()) {
_tree->access<bool>(mb_root(mboard) / "auto_tick_rate").set(false);
- UHD_LOGGER_INFO("MULTI_USRP") << "Setting master clock rate selection to 'manual'.";
+ UHD_LOGGER_INFO("MULTI_USRP")
+ << "Setting master clock rate selection to 'manual'.";
}
_tree->access<double>(mb_root(mboard) / "tick_rate").set(rate);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_master_clock_rate(rate, m);
}
}
- double get_master_clock_rate(size_t mboard){
+ double get_master_clock_rate(size_t mboard)
+ {
return _tree->access<double>(mb_root(mboard) / "tick_rate").get();
}
meta_range_t get_master_clock_rate_range(const size_t mboard)
{
if (_tree->exists(mb_root(mboard) / "tick_rate/range")) {
- return _tree->access<meta_range_t>(
- mb_root(mboard) / "tick_rate/range"
- ).get();
+ return _tree->access<meta_range_t>(mb_root(mboard) / "tick_rate/range").get();
}
// The USRP may not have a range defined, in which case we create a
// fake range with a single value:
const double tick_rate = get_master_clock_rate(mboard);
- return meta_range_t(
- tick_rate,
- tick_rate,
- 0
- );
- }
-
- std::string get_pp_string(void){
- std::string buff = str(boost::format(
- "%s USRP:\n"
- " Device: %s\n"
- )
- % ((get_num_mboards() > 1)? "Multi" : "Single")
- % (_tree->access<std::string>("/name").get())
- );
- for (size_t m = 0; m < get_num_mboards(); m++){
- buff += str(boost::format(
- " Mboard %d: %s\n"
- ) % m
- % (_tree->access<std::string>(mb_root(m) / "name").get())
- );
+ return meta_range_t(tick_rate, tick_rate, 0);
+ }
+
+ std::string get_pp_string(void)
+ {
+ std::string buff = str(boost::format("%s USRP:\n"
+ " Device: %s\n")
+ % ((get_num_mboards() > 1) ? "Multi" : "Single")
+ % (_tree->access<std::string>("/name").get()));
+ for (size_t m = 0; m < get_num_mboards(); m++) {
+ buff += str(boost::format(" Mboard %d: %s\n") % m
+ % (_tree->access<std::string>(mb_root(m) / "name").get()));
}
//----------- rx side of life ----------------------------------
- for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){
- for (; chan < (m + 1)*get_rx_subdev_spec(m).size(); chan++){
- buff += str(boost::format(
- " RX Channel: %u\n"
- " RX DSP: %s\n"
- " RX Dboard: %s\n"
- " RX Subdev: %s\n"
- ) % chan
- % rx_dsp_root(chan).leaf()
+ for (size_t m = 0, chan = 0; m < get_num_mboards(); m++) {
+ for (; chan < (m + 1) * get_rx_subdev_spec(m).size(); chan++) {
+ buff += str(
+ boost::format(" RX Channel: %u\n"
+ " RX DSP: %s\n"
+ " RX Dboard: %s\n"
+ " RX Subdev: %s\n")
+ % chan % rx_dsp_root(chan).leaf()
% rx_rf_fe_root(chan).branch_path().branch_path().leaf()
- % (_tree->access<std::string>(rx_rf_fe_root(chan) / "name").get())
- );
+ % (_tree->access<std::string>(rx_rf_fe_root(chan) / "name").get()));
}
}
//----------- tx side of life ----------------------------------
- for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){
- for (; chan < (m + 1)*get_tx_subdev_spec(m).size(); chan++){
- buff += str(boost::format(
- " TX Channel: %u\n"
- " TX DSP: %s\n"
- " TX Dboard: %s\n"
- " TX Subdev: %s\n"
- ) % chan
- % tx_dsp_root(chan).leaf()
+ for (size_t m = 0, chan = 0; m < get_num_mboards(); m++) {
+ for (; chan < (m + 1) * get_tx_subdev_spec(m).size(); chan++) {
+ buff += str(
+ boost::format(" TX Channel: %u\n"
+ " TX DSP: %s\n"
+ " TX Dboard: %s\n"
+ " TX Subdev: %s\n")
+ % chan % tx_dsp_root(chan).leaf()
% tx_rf_fe_root(chan).branch_path().branch_path().leaf()
- % (_tree->access<std::string>(tx_rf_fe_root(chan) / "name").get())
- );
+ % (_tree->access<std::string>(tx_rf_fe_root(chan) / "name").get()));
}
}
return buff;
}
- std::string get_mboard_name(size_t mboard){
+ std::string get_mboard_name(size_t mboard)
+ {
return _tree->access<std::string>(mb_root(mboard) / "name").get();
}
- time_spec_t get_time_now(size_t mboard = 0){
+ time_spec_t get_time_now(size_t mboard = 0)
+ {
return _tree->access<time_spec_t>(mb_root(mboard) / "time/now").get();
}
- time_spec_t get_time_last_pps(size_t mboard = 0){
+ time_spec_t get_time_last_pps(size_t mboard = 0)
+ {
return _tree->access<time_spec_t>(mb_root(mboard) / "time/pps").get();
}
- void set_time_now(const time_spec_t &time_spec, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_time_now(const time_spec_t& time_spec, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
_tree->access<time_spec_t>(mb_root(mboard) / "time/now").set(time_spec);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_time_now(time_spec, m);
}
}
- void set_time_next_pps(const time_spec_t &time_spec, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_time_next_pps(const time_spec_t& time_spec, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
_tree->access<time_spec_t>(mb_root(mboard) / "time/pps").set(time_spec);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_time_next_pps(time_spec, m);
}
}
- void set_time_unknown_pps(const time_spec_t &time_spec){
- UHD_LOGGER_INFO("MULTI_USRP")
- << " 1) catch time transition at pps edge";
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::milliseconds(1100);
+ void set_time_unknown_pps(const time_spec_t& time_spec)
+ {
+ UHD_LOGGER_INFO("MULTI_USRP") << " 1) catch time transition at pps edge";
+ auto end_time =
+ std::chrono::steady_clock::now() + std::chrono::milliseconds(1100);
time_spec_t time_start_last_pps = get_time_last_pps();
- while (time_start_last_pps == get_time_last_pps())
- {
+ while (time_start_last_pps == get_time_last_pps()) {
if (std::chrono::steady_clock::now() > end_time) {
- throw uhd::runtime_error(
- "Board 0 may not be getting a PPS signal!\n"
- "No PPS detected within the time interval.\n"
- "See the application notes for your device.\n"
- );
+ throw uhd::runtime_error("Board 0 may not be getting a PPS signal!\n"
+ "No PPS detected within the time interval.\n"
+ "See the application notes for your device.\n");
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
- UHD_LOGGER_INFO("MULTI_USRP")
- << " 2) set times next pps (synchronously)";
+ UHD_LOGGER_INFO("MULTI_USRP") << " 2) set times next pps (synchronously)";
set_time_next_pps(time_spec, ALL_MBOARDS);
std::this_thread::sleep_for(std::chrono::seconds(1));
- //verify that the time registers are read to be within a few RTT
- for (size_t m = 1; m < get_num_mboards(); m++){
+ // verify that the time registers are read to be within a few RTT
+ for (size_t m = 1; m < get_num_mboards(); m++) {
time_spec_t time_0 = this->get_time_now(0);
time_spec_t time_i = this->get_time_now(m);
- if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)){ //10 ms: greater than RTT but not too big
- UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
- "Detected time deviation between board %d and board 0.\n"
- "Board 0 time is %f seconds.\n"
- "Board %d time is %f seconds.\n"
- ) % m % time_0.get_real_secs() % m % time_i.get_real_secs();
+ if (time_i < time_0
+ or (time_i - time_0)
+ > time_spec_t(0.01)) { // 10 ms: greater than RTT but not too big
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << boost::format(
+ "Detected time deviation between board %d and board 0.\n"
+ "Board 0 time is %f seconds.\n"
+ "Board %d time is %f seconds.\n")
+ % m % time_0.get_real_secs() % m % time_i.get_real_secs();
}
}
}
- bool get_time_synchronized(void){
- for (size_t m = 1; m < get_num_mboards(); m++){
+ bool get_time_synchronized(void)
+ {
+ for (size_t m = 1; m < get_num_mboards(); m++) {
time_spec_t time_0 = this->get_time_now(0);
time_spec_t time_i = this->get_time_now(m);
- if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)) return false;
+ if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01))
+ return false;
}
return true;
}
- void set_command_time(const time_spec_t &time_spec, size_t mboard){
- if (mboard != ALL_MBOARDS){
- if (not _tree->exists(mb_root(mboard) / "time/cmd")){
- throw uhd::not_implemented_error("timed command feature not implemented on this hardware");
+ void set_command_time(const time_spec_t& time_spec, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
+ if (not _tree->exists(mb_root(mboard) / "time/cmd")) {
+ throw uhd::not_implemented_error(
+ "timed command feature not implemented on this hardware");
}
_tree->access<time_spec_t>(mb_root(mboard) / "time/cmd").set(time_spec);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_command_time(time_spec, m);
}
}
- void clear_command_time(size_t mboard){
- if (mboard != ALL_MBOARDS){
- _tree->access<time_spec_t>(mb_root(mboard) / "time/cmd").set(time_spec_t(0.0));
+ void clear_command_time(size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
+ _tree->access<time_spec_t>(mb_root(mboard) / "time/cmd")
+ .set(time_spec_t(0.0));
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
clear_command_time(m);
}
}
- void issue_stream_cmd(const stream_cmd_t &stream_cmd, size_t chan){
- if (chan != ALL_CHANS){
+ void issue_stream_cmd(const stream_cmd_t& stream_cmd, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
_tree->access<stream_cmd_t>(rx_dsp_root(chan) / "stream_cmd").set(stream_cmd);
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
issue_stream_cmd(stream_cmd, c);
}
}
- void set_time_source(const std::string &source, const size_t mboard){
- if (mboard != ALL_MBOARDS){
- const auto time_source_path =
- mb_root(mboard) / "time_source/value";
- const auto sync_source_path =
- mb_root(mboard) / "sync_source/value";
+ void set_time_source(const std::string& source, const size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
+ const auto time_source_path = mb_root(mboard) / "time_source/value";
+ const auto sync_source_path = mb_root(mboard) / "sync_source/value";
if (_tree->exists(time_source_path)) {
_tree->access<std::string>(time_source_path).set(source);
} else if (_tree->exists(sync_source_path)) {
- auto sync_source =
- _tree->access<device_addr_t>(sync_source_path).get();
+ auto sync_source = _tree->access<device_addr_t>(sync_source_path).get();
sync_source["time_source"] = source;
_tree->access<device_addr_t>(sync_source_path).set(sync_source);
} else {
@@ -711,18 +730,20 @@ public:
}
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
this->set_time_source(source, m);
}
}
- std::string get_time_source(const size_t mboard){
+ std::string get_time_source(const size_t mboard)
+ {
const auto time_source_path = mb_root(mboard) / "time_source/value";
if (_tree->exists(time_source_path)) {
return _tree->access<std::string>(time_source_path).get();
} else if (_tree->exists(mb_root(mboard) / "sync_source/value")) {
- auto sync_source = _tree->access<device_addr_t>(
- mb_root(mboard) / "sync_source" / "value").get();
+ auto sync_source =
+ _tree->access<device_addr_t>(mb_root(mboard) / "sync_source" / "value")
+ .get();
if (sync_source.has_key("time_source")) {
return sync_source.get("time_source");
}
@@ -730,11 +751,11 @@ public:
throw uhd::runtime_error("Cannot query time_source on this device!");
}
- std::vector<std::string> get_time_sources(const size_t mboard){
+ std::vector<std::string> get_time_sources(const size_t mboard)
+ {
const auto time_source_path = mb_root(mboard) / "time_source/options";
if (_tree->exists(time_source_path)) {
- return _tree->access<std::vector<std::string>>(time_source_path)
- .get();
+ return _tree->access<std::vector<std::string>>(time_source_path).get();
} else if (_tree->exists(mb_root(mboard) / "sync_source/options")) {
const auto sync_sources = get_sync_sources(mboard);
std::vector<std::string> time_sources;
@@ -747,38 +768,37 @@ public:
throw uhd::runtime_error("Cannot query time_source on this device!");
}
- void set_clock_source(const std::string &source, const size_t mboard){
- if (mboard != ALL_MBOARDS){
- const auto clock_source_path =
- mb_root(mboard) / "clock_source/value";
- const auto sync_source_path =
- mb_root(mboard) / "sync_source/value";
+ void set_clock_source(const std::string& source, const size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
+ const auto clock_source_path = mb_root(mboard) / "clock_source/value";
+ const auto sync_source_path = mb_root(mboard) / "sync_source/value";
if (_tree->exists(clock_source_path)) {
_tree->access<std::string>(clock_source_path).set(source);
} else if (_tree->exists(sync_source_path)) {
- auto sync_source =
- _tree->access<device_addr_t>(sync_source_path).get();
+ auto sync_source = _tree->access<device_addr_t>(sync_source_path).get();
sync_source["clock_source"] = source;
_tree->access<device_addr_t>(sync_source_path).set(sync_source);
} else {
- throw uhd::runtime_error(
- "Can't set clock source on this device.");
+ throw uhd::runtime_error("Can't set clock source on this device.");
}
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
this->set_clock_source(source, m);
}
}
- std::string get_clock_source(const size_t mboard){
+ std::string get_clock_source(const size_t mboard)
+ {
const auto clock_source_path = mb_root(mboard) / "clock_source/value";
if (_tree->exists(clock_source_path)) {
- return _tree->access<std::string>(
- mb_root(mboard) / "clock_source" / "value").get();
+ return _tree->access<std::string>(mb_root(mboard) / "clock_source" / "value")
+ .get();
} else if (_tree->exists(mb_root(mboard) / "sync_source/value")) {
- auto sync_source = _tree->access<device_addr_t>(
- mb_root(mboard) / "sync_source" / "value").get();
+ auto sync_source =
+ _tree->access<device_addr_t>(mb_root(mboard) / "sync_source" / "value")
+ .get();
if (sync_source.has_key("clock_source")) {
return sync_source.get("clock_source");
}
@@ -786,45 +806,38 @@ public:
throw uhd::runtime_error("Cannot query clock_source on this device!");
}
- void set_sync_source(
- const std::string &clock_source,
- const std::string &time_source,
- const size_t mboard
- ) {
+ void set_sync_source(const std::string& clock_source,
+ const std::string& time_source,
+ const size_t mboard)
+ {
device_addr_t sync_args;
sync_args["clock_source"] = clock_source;
- sync_args["time_source"] = time_source;
+ sync_args["time_source"] = time_source;
set_sync_source(sync_args, mboard);
}
- void set_sync_source(
- const device_addr_t& sync_source,
- const size_t mboard
- ) {
+ void set_sync_source(const device_addr_t& sync_source, const size_t mboard)
+ {
if (mboard != ALL_MBOARDS) {
- const auto sync_source_path =
- mb_root(mboard) / "sync_source/value";
+ const auto sync_source_path = mb_root(mboard) / "sync_source/value";
if (_tree->exists(sync_source_path)) {
- _tree->access<device_addr_t>(sync_source_path)
- .set(sync_source);
+ _tree->access<device_addr_t>(sync_source_path).set(sync_source);
} else if (_tree->exists(mb_root(mboard) / "clock_source/value")
- and _tree->exists(mb_root(mboard) / "time_source/value")
- and sync_source.has_key("clock_source")
- and sync_source.has_key("time_source")) {
+ and _tree->exists(mb_root(mboard) / "time_source/value")
+ and sync_source.has_key("clock_source")
+ and sync_source.has_key("time_source")) {
const std::string clock_source = sync_source["clock_source"];
- const std::string time_source = sync_source["time_source"];
+ const std::string time_source = sync_source["time_source"];
set_clock_source(clock_source, mboard);
set_time_source(time_source, mboard);
} else {
- throw uhd::runtime_error(
- "Can't set sync source on this device.");
+ throw uhd::runtime_error("Can't set sync source on this device.");
}
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
this->set_sync_source(sync_source, m);
}
-
}
device_addr_t get_sync_source(const size_t mboard)
@@ -836,10 +849,10 @@ public:
// If this path is not there, we fall back to the oldschool method and
// convert to a new-fangled sync source dictionary
const std::string clock_source = get_clock_source(mboard);
- const std::string time_source = get_time_source(mboard);
+ const std::string time_source = get_time_source(mboard);
device_addr_t sync_source;
sync_source["clock_source"] = clock_source;
- sync_source["time_source"] = time_source;
+ sync_source["time_source"] = time_source;
return sync_source;
}
@@ -852,13 +865,13 @@ public:
// If this path is not there, we fall back to the oldschool method and
// convert to a new-fangled sync source dictionary
const auto clock_sources = get_clock_sources(mboard);
- const auto time_sources = get_time_sources(mboard);
+ const auto time_sources = get_time_sources(mboard);
std::vector<device_addr_t> sync_sources;
for (const auto& clock_source : clock_sources) {
for (const auto& time_source : time_sources) {
device_addr_t sync_source;
sync_source["clock_source"] = clock_source;
- sync_source["time_source"] = time_source;
+ sync_source["time_source"] = time_source;
sync_sources.push_back(sync_source);
}
}
@@ -866,11 +879,11 @@ public:
return sync_sources;
}
- std::vector<std::string> get_clock_sources(const size_t mboard){
+ std::vector<std::string> get_clock_sources(const size_t mboard)
+ {
const auto clock_source_path = mb_root(mboard) / "clock_source/options";
if (_tree->exists(clock_source_path)) {
- return _tree->access<std::vector<std::string>>(clock_source_path)
- .get();
+ return _tree->access<std::vector<std::string>>(clock_source_path).get();
} else if (_tree->exists(mb_root(mboard) / "sync_source/options")) {
const auto sync_sources = get_sync_sources(mboard);
std::vector<std::string> clock_sources;
@@ -885,86 +898,83 @@ public:
void set_clock_source_out(const bool enb, const size_t mboard)
{
- if (mboard != ALL_MBOARDS)
- {
- if (_tree->exists(mb_root(mboard) / "clock_source" / "output"))
- {
+ if (mboard != ALL_MBOARDS) {
+ if (_tree->exists(mb_root(mboard) / "clock_source" / "output")) {
_tree->access<bool>(mb_root(mboard) / "clock_source" / "output").set(enb);
- }
- else
- {
- throw uhd::runtime_error("multi_usrp::set_clock_source_out - not supported on this device");
+ } else {
+ throw uhd::runtime_error(
+ "multi_usrp::set_clock_source_out - not supported on this device");
}
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++)
- {
+ for (size_t m = 0; m < get_num_mboards(); m++) {
this->set_clock_source_out(enb, m);
}
}
void set_time_source_out(const bool enb, const size_t mboard)
{
- if (mboard != ALL_MBOARDS)
- {
- if (_tree->exists(mb_root(mboard) / "time_source" / "output"))
- {
+ if (mboard != ALL_MBOARDS) {
+ if (_tree->exists(mb_root(mboard) / "time_source" / "output")) {
_tree->access<bool>(mb_root(mboard) / "time_source" / "output").set(enb);
- }
- else
- {
- throw uhd::runtime_error("multi_usrp::set_time_source_out - not supported on this device");
+ } else {
+ throw uhd::runtime_error(
+ "multi_usrp::set_time_source_out - not supported on this device");
}
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++)
- {
+ for (size_t m = 0; m < get_num_mboards(); m++) {
this->set_time_source_out(enb, m);
}
}
- size_t get_num_mboards(void){
+ size_t get_num_mboards(void)
+ {
return _tree->list("/mboards").size();
}
- sensor_value_t get_mboard_sensor(const std::string &name, size_t mboard){
+ sensor_value_t get_mboard_sensor(const std::string& name, size_t mboard)
+ {
return _tree->access<sensor_value_t>(mb_root(mboard) / "sensors" / name).get();
}
- std::vector<std::string> get_mboard_sensor_names(size_t mboard){
+ std::vector<std::string> get_mboard_sensor_names(size_t mboard)
+ {
if (_tree->exists(mb_root(mboard) / "sensors")) {
return _tree->list(mb_root(mboard) / "sensors");
}
return {};
}
- void set_user_register(const uint8_t addr, const uint32_t data, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_user_register(const uint8_t addr, const uint32_t data, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
typedef std::pair<uint8_t, uint32_t> user_reg_t;
- _tree->access<user_reg_t>(mb_root(mboard) / "user/regs").set(user_reg_t(addr, data));
+ _tree->access<user_reg_t>(mb_root(mboard) / "user/regs")
+ .set(user_reg_t(addr, data));
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_user_register(addr, data, m);
}
}
wb_iface::sptr get_user_settings_iface(const size_t chan)
{
- const auto user_settings_path =
- rx_rf_fe_root(chan) / "user_settings" / "iface";
+ const auto user_settings_path = rx_rf_fe_root(chan) / "user_settings" / "iface";
if (_tree->exists(user_settings_path)) {
return _tree->access<wb_iface::sptr>(user_settings_path).get();
}
- UHD_LOG_WARNING("MULTI_USRP",
- "Attempting to read back non-existent user settings iface!");
+ UHD_LOG_WARNING(
+ "MULTI_USRP", "Attempting to read back non-existent user settings iface!");
return nullptr;
}
/*******************************************************************
* RX methods
******************************************************************/
- rx_streamer::sptr get_rx_stream(const stream_args_t &args) {
+ rx_streamer::sptr get_rx_stream(const stream_args_t& args)
+ {
_check_link_rate(args, false);
stream_args_t args_ = args;
if (!args.args.has_key("spp")) {
@@ -978,56 +988,65 @@ public:
return this->get_device()->get_rx_stream(args_);
}
- void set_rx_subdev_spec(const subdev_spec_t &spec, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_rx_subdev_spec(const subdev_spec_t& spec, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
_tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").set(spec);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_rx_subdev_spec(spec, m);
}
}
subdev_spec_t get_rx_subdev_spec(size_t mboard)
{
- subdev_spec_t spec = _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").get();
- if (spec.empty())
- {
- try
- {
- const std::string db_name = _tree->list(mb_root(mboard) / "dboards").at(0);
- const std::string fe_name = _tree->list(mb_root(mboard) / "dboards" / db_name / "rx_frontends").at(0);
+ subdev_spec_t spec =
+ _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").get();
+ if (spec.empty()) {
+ try {
+ const std::string db_name =
+ _tree->list(mb_root(mboard) / "dboards").at(0);
+ const std::string fe_name =
+ _tree->list(mb_root(mboard) / "dboards" / db_name / "rx_frontends")
+ .at(0);
spec.push_back(subdev_spec_pair_t(db_name, fe_name));
- _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").set(spec);
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::get_rx_subdev_spec(%u) failed to make default spec - %s") % mboard % e.what()));
+ _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec")
+ .set(spec);
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::get_rx_subdev_spec(%u) failed to make "
+ "default spec - %s")
+ % mboard % e.what()));
}
- UHD_LOGGER_INFO("MULTI_USRP") << "Selecting default RX front end spec: " << spec.to_pp_string();
+ UHD_LOGGER_INFO("MULTI_USRP")
+ << "Selecting default RX front end spec: " << spec.to_pp_string();
}
return spec;
}
- size_t get_rx_num_channels(void){
+ size_t get_rx_num_channels(void)
+ {
size_t sum = 0;
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
sum += get_rx_subdev_spec(m).size();
}
return sum;
}
- std::string get_rx_subdev_name(size_t chan){
+ std::string get_rx_subdev_name(size_t chan)
+ {
return _tree->access<std::string>(rx_rf_fe_root(chan) / "name").get();
}
- void set_rx_rate(double rate, size_t chan){
- if (chan != ALL_CHANS){
+ void set_rx_rate(double rate, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
_tree->access<double>(rx_dsp_root(chan) / "rate" / "value").set(rate);
do_samp_rate_warning_message(rate, get_rx_rate(chan), "RX");
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
set_rx_rate(rate, c);
}
}
@@ -1037,104 +1056,129 @@ public:
_rx_spp[chan] = spp;
}
- double get_rx_rate(size_t chan){
+ double get_rx_rate(size_t chan)
+ {
return _tree->access<double>(rx_dsp_root(chan) / "rate" / "value").get();
}
- meta_range_t get_rx_rates(size_t chan){
+ meta_range_t get_rx_rates(size_t chan)
+ {
return _tree->access<meta_range_t>(rx_dsp_root(chan) / "rate" / "range").get();
}
- tune_result_t set_rx_freq(const tune_request_t &tune_request, size_t chan){
-
- // If any mixer is driven by an external LO the daughterboard assumes that no CORDIC correction is
- // necessary. Since the LO might be sourced from another daughterboard which would normally apply a
- // cordic correction a manual DSP tune policy should be used to ensure identical configurations across
- // daughterboards.
- if (tune_request.dsp_freq_policy == tune_request.POLICY_AUTO and
- tune_request.rf_freq_policy == tune_request.POLICY_AUTO)
- {
+ tune_result_t set_rx_freq(const tune_request_t& tune_request, size_t chan)
+ {
+ // If any mixer is driven by an external LO the daughterboard assumes that no
+ // CORDIC correction is necessary. Since the LO might be sourced from another
+ // daughterboard which would normally apply a cordic correction a manual DSP tune
+ // policy should be used to ensure identical configurations across daughterboards.
+ if (tune_request.dsp_freq_policy == tune_request.POLICY_AUTO
+ and tune_request.rf_freq_policy == tune_request.POLICY_AUTO) {
for (size_t c = 0; c < get_rx_num_channels(); c++) {
- const bool external_all_los = _tree->exists(rx_rf_fe_root(chan) / "los" / ALL_LOS)
- && get_rx_lo_source(ALL_LOS, c) == "external";
+ const bool external_all_los =
+ _tree->exists(rx_rf_fe_root(chan) / "los" / ALL_LOS)
+ && get_rx_lo_source(ALL_LOS, c) == "external";
if (external_all_los) {
UHD_LOGGER_WARNING("MULTI_USRP")
- << "At least one channel is using an external LO."
- << "Using a manual DSP frequency policy is recommended to ensure "
- << "the same frequency shift on all channels.";
+ << "At least one channel is using an external LO."
+ << "Using a manual DSP frequency policy is recommended to ensure "
+ << "the same frequency shift on all channels.";
break;
}
}
}
tune_result_t result = tune_xx_subdev_and_dsp(RX_SIGN,
- _tree->subtree(rx_dsp_root(chan)),
- _tree->subtree(rx_rf_fe_root(chan)),
- tune_request);
- //do_tune_freq_results_message(tune_request, result, get_rx_freq(chan), "RX");
+ _tree->subtree(rx_dsp_root(chan)),
+ _tree->subtree(rx_rf_fe_root(chan)),
+ tune_request);
+ // do_tune_freq_results_message(tune_request, result, get_rx_freq(chan), "RX");
return result;
}
- double get_rx_freq(size_t chan){
- return derive_freq_from_xx_subdev_and_dsp(RX_SIGN, _tree->subtree(rx_dsp_root(chan)), _tree->subtree(rx_rf_fe_root(chan)));
+ double get_rx_freq(size_t chan)
+ {
+ return derive_freq_from_xx_subdev_and_dsp(RX_SIGN,
+ _tree->subtree(rx_dsp_root(chan)),
+ _tree->subtree(rx_rf_fe_root(chan)));
}
- freq_range_t get_rx_freq_range(size_t chan){
+ freq_range_t get_rx_freq_range(size_t chan)
+ {
return make_overall_tune_range(
_tree->access<meta_range_t>(rx_rf_fe_root(chan) / "freq" / "range").get(),
_tree->access<meta_range_t>(rx_dsp_root(chan) / "freq" / "range").get(),
- this->get_rx_bandwidth(chan)
- );
+ this->get_rx_bandwidth(chan));
}
- freq_range_t get_fe_rx_freq_range(size_t chan){
+ freq_range_t get_fe_rx_freq_range(size_t chan)
+ {
return _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "freq" / "range").get();
}
/**************************************************************************
* LO controls
*************************************************************************/
- std::vector<std::string> get_rx_lo_names(size_t chan = 0){
+ std::vector<std::string> get_rx_lo_names(size_t chan = 0)
+ {
std::vector<std::string> lo_names;
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- for(const std::string &name: _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for (const std::string& name : _tree->list(rx_rf_fe_root(chan) / "los")) {
lo_names.push_back(name);
}
}
return lo_names;
}
- void set_rx_lo_source(const std::string &src, const std::string &name = ALL_LOS, size_t chan = 0){
+ void set_rx_lo_source(
+ const std::string& src, const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_rf_fe_root(chan) / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- _tree->access<std::string>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value").set(src);
+ // Special value ALL_LOS support atomically sets the source for all
+ // LOs
+ _tree
+ ->access<std::string>(
+ rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value")
+ .set(src);
} else {
- for(const std::string &n: _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for (const std::string& n :
+ _tree->list(rx_rf_fe_root(chan) / "los")) {
this->set_rx_lo_source(src, n, chan);
}
}
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- _tree->access<std::string>(rx_rf_fe_root(chan) / "los" / name / "source" / "value").set(src);
+ _tree
+ ->access<std::string>(
+ rx_rf_fe_root(chan) / "los" / name / "source" / "value")
+ .set(src);
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
- const std::string get_rx_lo_source(const std::string &name = ALL_LOS, size_t chan = 0){
+ const std::string get_rx_lo_source(const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- return _tree->access<std::string>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value").get();
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ return _tree
+ ->access<std::string>(
+ rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value")
+ .get();
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- return _tree->access<std::string>(rx_rf_fe_root(chan) / "los" / name / "source" / "value").get();
+ return _tree
+ ->access<std::string>(
+ rx_rf_fe_root(chan) / "los" / name / "source" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1145,18 +1189,27 @@ public:
}
}
- std::vector<std::string> get_rx_lo_sources(const std::string &name = ALL_LOS, size_t chan = 0) {
+ std::vector<std::string> get_rx_lo_sources(
+ const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_rf_fe_root(chan) / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- return _tree->access< std::vector<std::string> >(rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "options").get();
+ // Special value ALL_LOS support atomically sets the source for all
+ // LOs
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "options")
+ .get();
} else {
return std::vector<std::string>();
}
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- return _tree->access< std::vector<std::string> >(rx_rf_fe_root(chan) / "los" / name / "source" / "options").get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_rf_fe_root(chan) / "los" / name / "source" / "options")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1167,37 +1220,49 @@ public:
}
}
- void set_rx_lo_export_enabled(bool enabled, const std::string &name = ALL_LOS, size_t chan = 0){
+ void set_rx_lo_export_enabled(
+ bool enabled, const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(rx_rf_fe_root(chan) / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- _tree->access<bool>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "export").set(enabled);
+ // Special value ALL_LOS support atomically sets the source for all
+ // LOs
+ _tree->access<bool>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "export")
+ .set(enabled);
} else {
- for(const std::string &n: _tree->list(rx_rf_fe_root(chan) / "los")) {
+ for (const std::string& n :
+ _tree->list(rx_rf_fe_root(chan) / "los")) {
this->set_rx_lo_export_enabled(enabled, n, chan);
}
}
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- _tree->access<bool>(rx_rf_fe_root(chan) / "los" / name / "export").set(enabled);
+ _tree->access<bool>(rx_rf_fe_root(chan) / "los" / name / "export")
+ .set(enabled);
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
- bool get_rx_lo_export_enabled(const std::string &name = ALL_LOS, size_t chan = 0){
+ bool get_rx_lo_export_enabled(const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- return _tree->access<bool>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "export").get();
+ // Special value ALL_LOS support atomically sets the source for all LOs
+ return _tree
+ ->access<bool>(rx_rf_fe_root(chan) / "los" / ALL_LOS / "export")
+ .get();
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- return _tree->access<bool>(rx_rf_fe_root(chan) / "los" / name / "export").get();
+ return _tree
+ ->access<bool>(rx_rf_fe_root(chan) / "los" / name / "export")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1208,61 +1273,82 @@ public:
}
}
- double set_rx_lo_freq(double freq, const std::string &name = ALL_LOS, size_t chan = 0){
+ double set_rx_lo_freq(double freq, const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency must be set for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency must be set for each stage individually");
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- _tree->access<double>(rx_rf_fe_root(chan) / "los" / name / "freq" / "value").set(freq);
- return _tree->access<double>(rx_rf_fe_root(chan) / "los" / name / "freq" / "value").get();
+ _tree
+ ->access<double>(
+ rx_rf_fe_root(chan) / "los" / name / "freq" / "value")
+ .set(freq);
+ return _tree
+ ->access<double>(
+ rx_rf_fe_root(chan) / "los" / name / "freq" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
- double get_rx_lo_freq(const std::string &name = ALL_LOS, size_t chan = 0){
+ double get_rx_lo_freq(const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency must be retrieved for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency must be retrieved for each stage individually");
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- return _tree->access<double>(rx_rf_fe_root(chan) / "los" / name / "freq" / "value").get();
+ return _tree
+ ->access<double>(
+ rx_rf_fe_root(chan) / "los" / name / "freq" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
// Return actual RF frequency if the daughterboard doesn't expose it's LO(s)
- return _tree->access<double>(rx_rf_fe_root(chan) / "freq" /" value").get();
+ return _tree->access<double>(rx_rf_fe_root(chan) / "freq" / " value").get();
}
}
- freq_range_t get_rx_lo_freq_range(const std::string &name = ALL_LOS, size_t chan = 0){
+ freq_range_t get_rx_lo_freq_range(const std::string& name = ALL_LOS, size_t chan = 0)
+ {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
- throw uhd::runtime_error("LO frequency range must be retrieved for each stage individually");
+ throw uhd::runtime_error(
+ "LO frequency range must be retrieved for each stage individually");
} else {
if (_tree->exists(rx_rf_fe_root(chan) / "los")) {
- return _tree->access<freq_range_t>(rx_rf_fe_root(chan) / "los" / name / "freq" / "range").get();
+ return _tree
+ ->access<freq_range_t>(
+ rx_rf_fe_root(chan) / "los" / name / "freq" / "range")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
// Return the actual RF range if the daughterboard doesn't expose it's LO(s)
- return _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "freq" / "range").get();
+ return _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "freq" / "range")
+ .get();
}
}
- std::vector<std::string> get_tx_lo_names(const size_t chan = 0){
+ std::vector<std::string> get_tx_lo_names(const size_t chan = 0)
+ {
std::vector<std::string> lo_names;
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- for (const std::string &name : _tree->list(tx_rf_fe_root(chan) / "los")) {
+ for (const std::string& name : _tree->list(tx_rf_fe_root(chan) / "los")) {
lo_names.push_back(name);
}
}
@@ -1270,30 +1356,28 @@ public:
}
void set_tx_lo_source(
- const std::string &src,
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const std::string& src, const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(tx_rf_fe_root(chan) / "los" / ALL_LOS)) {
// Special value ALL_LOS support atomically sets the source
// for all LOs
- _tree->access<std::string>(
- tx_rf_fe_root(chan) / "los" / ALL_LOS /
- "source" / "value"
- ).set(src);
+ _tree
+ ->access<std::string>(
+ tx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "value")
+ .set(src);
} else {
- for (const auto &n : _tree->list(tx_rf_fe_root(chan) / "los")) {
+ for (const auto& n : _tree->list(tx_rf_fe_root(chan) / "los")) {
this->set_tx_lo_source(src, n, chan);
}
}
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- _tree->access<std::string>(
- tx_rf_fe_root(chan) / "los" / name / "source" /
- "value"
- ).set(src);
+ _tree
+ ->access<std::string>(
+ tx_rf_fe_root(chan) / "los" / name / "source" / "value")
+ .set(src);
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1305,14 +1389,14 @@ public:
}
const std::string get_tx_lo_source(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access<std::string>(
- tx_rf_fe_root(chan) / "los" / name / "source" / "value"
- ).get();
+ return _tree
+ ->access<std::string>(
+ tx_rf_fe_root(chan) / "los" / name / "source" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1324,24 +1408,26 @@ public:
}
std::vector<std::string> get_tx_lo_sources(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(tx_rf_fe_root(chan) / "los" / ALL_LOS)) {
// Special value ALL_LOS support atomically sets the source
// for all LOs
- return _tree->access<std::vector<std::string>>(
- tx_rf_fe_root(chan) / "los" / ALL_LOS /
- "source" / "options"
- ).get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ tx_rf_fe_root(chan) / "los" / ALL_LOS / "source" / "options")
+ .get();
} else {
return std::vector<std::string>();
}
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access< std::vector<std::string> >(tx_rf_fe_root(chan) / "los" / name / "source" / "options").get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ tx_rf_fe_root(chan) / "los" / name / "source" / "options")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1354,41 +1440,42 @@ public:
}
void set_tx_lo_export_enabled(
- const bool enabled,
- const std::string &name = ALL_LOS,
- const size_t chan=0
- ) {
+ const bool enabled, const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
if (_tree->exists(tx_rf_fe_root(chan) / "los" / ALL_LOS)) {
- //Special value ALL_LOS support atomically sets the source for all LOs
- _tree->access<bool>(tx_rf_fe_root(chan) / "los" / ALL_LOS / "export").set(enabled);
+ // Special value ALL_LOS support atomically sets the source for all
+ // LOs
+ _tree->access<bool>(tx_rf_fe_root(chan) / "los" / ALL_LOS / "export")
+ .set(enabled);
} else {
- for(const std::string &n: _tree->list(tx_rf_fe_root(chan) / "los")) {
+ for (const std::string& n :
+ _tree->list(tx_rf_fe_root(chan) / "los")) {
this->set_tx_lo_export_enabled(enabled, n, chan);
}
}
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- _tree->access<bool>(tx_rf_fe_root(chan) / "los" / name / "export").set(enabled);
+ _tree->access<bool>(tx_rf_fe_root(chan) / "los" / name / "export")
+ .set(enabled);
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
}
} else {
- throw uhd::runtime_error("This device does not support manual configuration of LOs");
+ throw uhd::runtime_error(
+ "This device does not support manual configuration of LOs");
}
}
bool get_tx_lo_export_enabled(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access<bool>(
- tx_rf_fe_root(chan) / "los" / name / "export"
- ).get();
+ return _tree->access<bool>(tx_rf_fe_root(chan) / "los" / name / "export")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1400,19 +1487,19 @@ public:
}
double set_tx_lo_freq(
- const double freq,
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const double freq, const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
throw uhd::runtime_error("LO frequency must be set for each "
"stage individually");
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access<double>(
- tx_rf_fe_root(chan) / "los" / name / "freq" / "value"
- ).set(freq).get();
+ return _tree
+ ->access<double>(
+ tx_rf_fe_root(chan) / "los" / name / "freq" / "value")
+ .set(freq)
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1423,17 +1510,18 @@ public:
}
}
- double get_tx_lo_freq(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ double get_tx_lo_freq(const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
throw uhd::runtime_error("LO frequency must be retrieved for "
"each stage individually");
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access<double>(tx_rf_fe_root(chan) / "los" / name / "freq" / "value").get();
+ return _tree
+ ->access<double>(
+ tx_rf_fe_root(chan) / "los" / name / "freq" / "value")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1441,25 +1529,23 @@ public:
} else {
// Return actual RF frequency if the daughterboard doesn't expose
// its LO(s)
- return _tree->access<double>(
- tx_rf_fe_root(chan) / "freq" /" value"
- ).get();
+ return _tree->access<double>(tx_rf_fe_root(chan) / "freq" / " value").get();
}
}
freq_range_t get_tx_lo_freq_range(
- const std::string &name = ALL_LOS,
- const size_t chan = 0
- ) {
+ const std::string& name = ALL_LOS, const size_t chan = 0)
+ {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
if (name == ALL_LOS) {
throw uhd::runtime_error("LO frequency range must be retrieved "
"for each stage individually");
} else {
if (_tree->exists(tx_rf_fe_root(chan) / "los")) {
- return _tree->access<freq_range_t>(
- tx_rf_fe_root(chan) / "los" / name / "freq" / "range"
- ).get();
+ return _tree
+ ->access<freq_range_t>(
+ tx_rf_fe_root(chan) / "los" / name / "freq" / "range")
+ .get();
} else {
throw uhd::runtime_error("Could not find LO stage " + name);
}
@@ -1467,30 +1553,37 @@ public:
} else {
// Return the actual RF range if the daughterboard doesn't expose
// its LO(s)
- return _tree->access<meta_range_t>(
- tx_rf_fe_root(chan) / "freq" / "range"
- ).get();
+ return _tree->access<meta_range_t>(tx_rf_fe_root(chan) / "freq" / "range")
+ .get();
}
}
/**************************************************************************
* Gain control
*************************************************************************/
- void set_rx_gain(double gain, const std::string &name, size_t chan){
+ void set_rx_gain(double gain, const std::string& name, size_t chan)
+ {
/* Check if any AGC mode is enable and if so warn the user */
if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "gain" / "agc")) {
- bool agc = _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").get();
- if(agc) {
- UHD_LOGGER_WARNING("MULTI_USRP") << "AGC enabled for this channel. Setting will be ignored." ;
+ bool agc =
+ _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable")
+ .get();
+ if (agc) {
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "AGC enabled for this channel. Setting will be ignored.";
}
}
} else {
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
if (_tree->exists(rx_rf_fe_root(c) / "gain" / "agc")) {
- bool agc = _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").get();
- if(agc) {
- UHD_LOGGER_WARNING("MULTI_USRP") << "AGC enabled for this channel. Setting will be ignored." ;
+ bool agc = _tree
+ ->access<bool>(
+ rx_rf_fe_root(chan) / "gain" / "agc" / "enable")
+ .get();
+ if (agc) {
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "AGC enabled for this channel. Setting will be ignored.";
}
}
}
@@ -1499,20 +1592,26 @@ public:
* If device is in AGC mode it will ignore the setting. */
try {
return rx_gain_group(chan)->set_value(gain, name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,rx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, rx);
}
}
- void set_rx_gain_profile(const std::string& profile, const size_t chan){
+ void set_rx_gain_profile(const std::string& profile, const size_t chan)
+ {
if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "gains/all/profile/value")) {
- _tree->access<std::string>(rx_rf_fe_root(chan) / "gains/all/profile/value").set(profile);
+ _tree->access<std::string>(
+ rx_rf_fe_root(chan) / "gains/all/profile/value")
+ .set(profile);
}
} else {
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
if (_tree->exists(rx_rf_fe_root(c) / "gains/all/profile/value")) {
- _tree->access<std::string>(rx_rf_fe_root(chan) / "gains/all/profile/value").set(profile);
+ _tree
+ ->access<std::string>(
+ rx_rf_fe_root(chan) / "gains/all/profile/value")
+ .set(profile);
}
}
}
@@ -1522,9 +1621,9 @@ public:
{
if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "gains/all/profile/value")) {
- return _tree->access<std::string>(
- rx_rf_fe_root(chan) / "gains/all/profile/value"
- ).get();
+ return _tree
+ ->access<std::string>(rx_rf_fe_root(chan) / "gains/all/profile/value")
+ .get();
}
} else {
throw uhd::runtime_error("Can't get RX gain profile from "
@@ -1537,9 +1636,10 @@ public:
{
if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "gains/all/profile/options")) {
- return _tree->access<std::vector<std::string>>(
- rx_rf_fe_root(chan) / "gains/all/profile/options"
- ).get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_rf_fe_root(chan) / "gains/all/profile/options")
+ .get();
}
} else {
throw uhd::runtime_error("Can't get RX gain profile names from "
@@ -1556,95 +1656,119 @@ public:
}
const gain_range_t gain_range = get_rx_gain_range(ALL_GAINS, chan);
const double abs_gain =
- (gain * (gain_range.stop() - gain_range.start()))
- + gain_range.start();
+ (gain * (gain_range.stop() - gain_range.start())) + gain_range.start();
set_rx_gain(abs_gain, ALL_GAINS, chan);
}
void set_rx_agc(bool enable, size_t chan = 0)
{
- if (chan != ALL_CHANS){
+ if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "gain" / "agc" / "enable")) {
- _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable").set(enable);
+ _tree->access<bool>(rx_rf_fe_root(chan) / "gain" / "agc" / "enable")
+ .set(enable);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "AGC is not available on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "AGC is not available on this device.";
}
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
this->set_rx_agc(enable, c);
}
-
}
- double get_rx_gain(const std::string &name, size_t chan){
+ double get_rx_gain(const std::string& name, size_t chan)
+ {
try {
return rx_gain_group(chan)->get_value(name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,rx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, rx);
}
}
double get_normalized_rx_gain(size_t chan)
{
- gain_range_t gain_range = get_rx_gain_range(ALL_GAINS, chan);
- double gain_range_width = gain_range.stop() - gain_range.start();
- // In case we have a device without a range of gains:
- if (gain_range_width == 0.0) {
- return 0;
- }
- double norm_gain = (get_rx_gain(ALL_GAINS, chan) - gain_range.start()) / gain_range_width;
- // Avoid rounding errors:
- if (norm_gain > 1.0) return 1.0;
- if (norm_gain < 0.0) return 0.0;
- return norm_gain;
+ gain_range_t gain_range = get_rx_gain_range(ALL_GAINS, chan);
+ double gain_range_width = gain_range.stop() - gain_range.start();
+ // In case we have a device without a range of gains:
+ if (gain_range_width == 0.0) {
+ return 0;
+ }
+ double norm_gain =
+ (get_rx_gain(ALL_GAINS, chan) - gain_range.start()) / gain_range_width;
+ // Avoid rounding errors:
+ if (norm_gain > 1.0)
+ return 1.0;
+ if (norm_gain < 0.0)
+ return 0.0;
+ return norm_gain;
}
- gain_range_t get_rx_gain_range(const std::string &name, size_t chan){
+ gain_range_t get_rx_gain_range(const std::string& name, size_t chan)
+ {
try {
return rx_gain_group(chan)->get_range(name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,rx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, rx);
}
}
- std::vector<std::string> get_rx_gain_names(size_t chan){
+ std::vector<std::string> get_rx_gain_names(size_t chan)
+ {
return rx_gain_group(chan)->get_names();
}
- void set_rx_antenna(const std::string &ant, size_t chan){
+ void set_rx_antenna(const std::string& ant, size_t chan)
+ {
_tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").set(ant);
}
- std::string get_rx_antenna(size_t chan){
- return _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").get();
+ std::string get_rx_antenna(size_t chan)
+ {
+ return _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value")
+ .get();
}
- std::vector<std::string> get_rx_antennas(size_t chan){
- return _tree->access<std::vector<std::string> >(rx_rf_fe_root(chan) / "antenna" / "options").get();
+ std::vector<std::string> get_rx_antennas(size_t chan)
+ {
+ return _tree
+ ->access<std::vector<std::string>>(
+ rx_rf_fe_root(chan) / "antenna" / "options")
+ .get();
}
- void set_rx_bandwidth(double bandwidth, size_t chan){
+ void set_rx_bandwidth(double bandwidth, size_t chan)
+ {
_tree->access<double>(rx_rf_fe_root(chan) / "bandwidth" / "value").set(bandwidth);
}
- double get_rx_bandwidth(size_t chan){
+ double get_rx_bandwidth(size_t chan)
+ {
return _tree->access<double>(rx_rf_fe_root(chan) / "bandwidth" / "value").get();
}
- meta_range_t get_rx_bandwidth_range(size_t chan){
- return _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "bandwidth" / "range").get();
+ meta_range_t get_rx_bandwidth_range(size_t chan)
+ {
+ return _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "bandwidth" / "range")
+ .get();
}
- dboard_iface::sptr get_rx_dboard_iface(size_t chan){
- return _tree->access<dboard_iface::sptr>(rx_rf_fe_root(chan).branch_path().branch_path() / "iface").get();
+ dboard_iface::sptr get_rx_dboard_iface(size_t chan)
+ {
+ return _tree
+ ->access<dboard_iface::sptr>(
+ rx_rf_fe_root(chan).branch_path().branch_path() / "iface")
+ .get();
}
- sensor_value_t get_rx_sensor(const std::string &name, size_t chan){
- return _tree->access<sensor_value_t>(rx_rf_fe_root(chan) / "sensors" / name).get();
+ sensor_value_t get_rx_sensor(const std::string& name, size_t chan)
+ {
+ return _tree->access<sensor_value_t>(rx_rf_fe_root(chan) / "sensors" / name)
+ .get();
}
- std::vector<std::string> get_rx_sensor_names(size_t chan){
+ std::vector<std::string> get_rx_sensor_names(size_t chan)
+ {
std::vector<std::string> sensor_names;
if (_tree->exists(rx_rf_fe_root(chan) / "sensors")) {
sensor_names = _tree->list(rx_rf_fe_root(chan) / "sensors");
@@ -1652,70 +1776,91 @@ public:
return sensor_names;
}
- void set_rx_dc_offset(const bool enb, size_t chan){
- if (chan != ALL_CHANS){
+ void set_rx_dc_offset(const bool enb, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(rx_fe_root(chan) / "dc_offset" / "enable")) {
_tree->access<bool>(rx_fe_root(chan) / "dc_offset" / "enable").set(enb);
} else if (_tree->exists(rx_rf_fe_root(chan) / "dc_offset" / "enable")) {
- /*For B2xx devices the dc-offset correction is implemented in the rf front-end*/
- _tree->access<bool>(rx_rf_fe_root(chan) / "dc_offset" / "enable").set(enb);
+ /*For B2xx devices the dc-offset correction is implemented in the rf
+ * front-end*/
+ _tree->access<bool>(rx_rf_fe_root(chan) / "dc_offset" / "enable")
+ .set(enb);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset compensation is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "Setting DC offset compensation is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
this->set_rx_dc_offset(enb, c);
}
}
- void set_rx_dc_offset(const std::complex<double> &offset, size_t chan){
- if (chan != ALL_CHANS){
+ void set_rx_dc_offset(const std::complex<double>& offset, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(rx_fe_root(chan) / "dc_offset" / "value")) {
- _tree->access<std::complex<double> >(rx_fe_root(chan) / "dc_offset" / "value").set(offset);
+ _tree
+ ->access<std::complex<double>>(
+ rx_fe_root(chan) / "dc_offset" / "value")
+ .set(offset);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "Setting DC offset is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
this->set_rx_dc_offset(offset, c);
}
}
- meta_range_t get_rx_dc_offset_range(size_t chan) {
+ meta_range_t get_rx_dc_offset_range(size_t chan)
+ {
if (_tree->exists(rx_fe_root(chan) / "dc_offset" / "range")) {
- return _tree->access<uhd::meta_range_t>(rx_fe_root(chan) / "dc_offset" / "range").get();
+ return _tree
+ ->access<uhd::meta_range_t>(rx_fe_root(chan) / "dc_offset" / "range")
+ .get();
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "This device does not support querying the RX DC offset range." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "This device does not support querying the RX DC offset range.";
return meta_range_t(0, 0);
}
}
- void set_rx_iq_balance(const bool enb, size_t chan){
- if (chan != ALL_CHANS){
+ void set_rx_iq_balance(const bool enb, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(rx_rf_fe_root(chan) / "iq_balance" / "enable")) {
- _tree->access<bool>(rx_rf_fe_root(chan) / "iq_balance" / "enable").set(enb);
+ _tree->access<bool>(rx_rf_fe_root(chan) / "iq_balance" / "enable")
+ .set(enb);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ imbalance compensation is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ imbalance compensation "
+ "is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
this->set_rx_iq_balance(enb, c);
}
}
- void set_rx_iq_balance(const std::complex<double> &offset, size_t chan){
- if (chan != ALL_CHANS){
+ void set_rx_iq_balance(const std::complex<double>& offset, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(rx_fe_root(chan) / "iq_balance" / "value")) {
- _tree->access<std::complex<double> >(rx_fe_root(chan) / "iq_balance" / "value").set(offset);
+ _tree
+ ->access<std::complex<double>>(
+ rx_fe_root(chan) / "iq_balance" / "value")
+ .set(offset);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ balance is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "Setting IQ balance is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_rx_num_channels(); c++){
+ for (size_t c = 0; c < get_rx_num_channels(); c++) {
this->set_rx_iq_balance(offset, c);
}
}
@@ -1827,115 +1972,139 @@ public:
/*******************************************************************
* TX methods
******************************************************************/
- tx_streamer::sptr get_tx_stream(const stream_args_t &args) {
+ tx_streamer::sptr get_tx_stream(const stream_args_t& args)
+ {
_check_link_rate(args, true);
return this->get_device()->get_tx_stream(args);
}
- void set_tx_subdev_spec(const subdev_spec_t &spec, size_t mboard){
- if (mboard != ALL_MBOARDS){
+ void set_tx_subdev_spec(const subdev_spec_t& spec, size_t mboard)
+ {
+ if (mboard != ALL_MBOARDS) {
_tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").set(spec);
return;
}
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
set_tx_subdev_spec(spec, m);
}
}
subdev_spec_t get_tx_subdev_spec(size_t mboard)
{
- subdev_spec_t spec = _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").get();
- if (spec.empty())
- {
- try
- {
- const std::string db_name = _tree->list(mb_root(mboard) / "dboards").at(0);
- const std::string fe_name = _tree->list(mb_root(mboard) / "dboards" / db_name / "tx_frontends").at(0);
+ subdev_spec_t spec =
+ _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").get();
+ if (spec.empty()) {
+ try {
+ const std::string db_name =
+ _tree->list(mb_root(mboard) / "dboards").at(0);
+ const std::string fe_name =
+ _tree->list(mb_root(mboard) / "dboards" / db_name / "tx_frontends")
+ .at(0);
spec.push_back(subdev_spec_pair_t(db_name, fe_name));
- _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").set(spec);
+ _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec")
+ .set(spec);
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::get_tx_subdev_spec(%u) failed to make "
+ "default spec - %s")
+ % mboard % e.what()));
}
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::get_tx_subdev_spec(%u) failed to make default spec - %s") % mboard % e.what()));
- }
- UHD_LOGGER_INFO("MULTI_USRP") << "Selecting default TX front end spec: " << spec.to_pp_string();
+ UHD_LOGGER_INFO("MULTI_USRP")
+ << "Selecting default TX front end spec: " << spec.to_pp_string();
}
return spec;
}
- size_t get_tx_num_channels(void){
+ size_t get_tx_num_channels(void)
+ {
size_t sum = 0;
- for (size_t m = 0; m < get_num_mboards(); m++){
+ for (size_t m = 0; m < get_num_mboards(); m++) {
sum += get_tx_subdev_spec(m).size();
}
return sum;
}
- std::string get_tx_subdev_name(size_t chan){
+ std::string get_tx_subdev_name(size_t chan)
+ {
return _tree->access<std::string>(tx_rf_fe_root(chan) / "name").get();
}
- void set_tx_rate(double rate, size_t chan){
- if (chan != ALL_CHANS){
+ void set_tx_rate(double rate, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
_tree->access<double>(tx_dsp_root(chan) / "rate" / "value").set(rate);
do_samp_rate_warning_message(rate, get_tx_rate(chan), "TX");
return;
}
- for (size_t c = 0; c < get_tx_num_channels(); c++){
+ for (size_t c = 0; c < get_tx_num_channels(); c++) {
set_tx_rate(rate, c);
}
}
- double get_tx_rate(size_t chan){
+ double get_tx_rate(size_t chan)
+ {
return _tree->access<double>(tx_dsp_root(chan) / "rate" / "value").get();
}
- meta_range_t get_tx_rates(size_t chan){
+ meta_range_t get_tx_rates(size_t chan)
+ {
return _tree->access<meta_range_t>(tx_dsp_root(chan) / "rate" / "range").get();
}
- tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t chan){
+ tune_result_t set_tx_freq(const tune_request_t& tune_request, size_t chan)
+ {
tune_result_t result = tune_xx_subdev_and_dsp(TX_SIGN,
- _tree->subtree(tx_dsp_root(chan)),
- _tree->subtree(tx_rf_fe_root(chan)),
- tune_request);
- //do_tune_freq_results_message(tune_request, result, get_tx_freq(chan), "TX");
+ _tree->subtree(tx_dsp_root(chan)),
+ _tree->subtree(tx_rf_fe_root(chan)),
+ tune_request);
+ // do_tune_freq_results_message(tune_request, result, get_tx_freq(chan), "TX");
return result;
}
- double get_tx_freq(size_t chan){
- return derive_freq_from_xx_subdev_and_dsp(TX_SIGN, _tree->subtree(tx_dsp_root(chan)), _tree->subtree(tx_rf_fe_root(chan)));
+ double get_tx_freq(size_t chan)
+ {
+ return derive_freq_from_xx_subdev_and_dsp(TX_SIGN,
+ _tree->subtree(tx_dsp_root(chan)),
+ _tree->subtree(tx_rf_fe_root(chan)));
}
- freq_range_t get_tx_freq_range(size_t chan){
+ freq_range_t get_tx_freq_range(size_t chan)
+ {
return make_overall_tune_range(
_tree->access<meta_range_t>(tx_rf_fe_root(chan) / "freq" / "range").get(),
_tree->access<meta_range_t>(tx_dsp_root(chan) / "freq" / "range").get(),
- this->get_tx_bandwidth(chan)
- );
+ this->get_tx_bandwidth(chan));
}
- freq_range_t get_fe_tx_freq_range(size_t chan){
+ freq_range_t get_fe_tx_freq_range(size_t chan)
+ {
return _tree->access<meta_range_t>(tx_rf_fe_root(chan) / "freq" / "range").get();
}
- void set_tx_gain(double gain, const std::string &name, size_t chan){
+ void set_tx_gain(double gain, const std::string& name, size_t chan)
+ {
try {
return tx_gain_group(chan)->set_value(gain, name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,tx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, tx);
}
}
- void set_tx_gain_profile(const std::string& profile, const size_t chan){
+ void set_tx_gain_profile(const std::string& profile, const size_t chan)
+ {
if (chan != ALL_CHANS) {
if (_tree->exists(tx_rf_fe_root(chan) / "gains/all/profile/value")) {
- _tree->access<std::string>(tx_rf_fe_root(chan) / "gains/all/profile/value").set(profile);
+ _tree->access<std::string>(
+ tx_rf_fe_root(chan) / "gains/all/profile/value")
+ .set(profile);
}
} else {
- for (size_t c = 0; c < get_tx_num_channels(); c++){
+ for (size_t c = 0; c < get_tx_num_channels(); c++) {
if (_tree->exists(tx_rf_fe_root(c) / "gains/all/profile/value")) {
- _tree->access<std::string>(tx_rf_fe_root(chan) / "gains/all/profile/value").set(profile);
+ _tree
+ ->access<std::string>(
+ tx_rf_fe_root(chan) / "gains/all/profile/value")
+ .set(profile);
}
}
}
@@ -1945,9 +2114,9 @@ public:
{
if (chan != ALL_CHANS) {
if (_tree->exists(tx_rf_fe_root(chan) / "gains/all/profile/value")) {
- return _tree->access<std::string>(
- tx_rf_fe_root(chan) / "gains/all/profile/value"
- ).get();
+ return _tree
+ ->access<std::string>(tx_rf_fe_root(chan) / "gains/all/profile/value")
+ .get();
}
} else {
throw uhd::runtime_error("Can't get TX gain profile from "
@@ -1960,9 +2129,10 @@ public:
{
if (chan != ALL_CHANS) {
if (_tree->exists(tx_rf_fe_root(chan) / "gains/all/profile/options")) {
- return _tree->access<std::vector<std::string>>(
- tx_rf_fe_root(chan) / "gains/all/profile/options"
- ).get();
+ return _tree
+ ->access<std::vector<std::string>>(
+ tx_rf_fe_root(chan) / "gains/all/profile/options")
+ .get();
}
} else {
throw uhd::runtime_error("Can't get TX gain profile names from "
@@ -1973,83 +2143,108 @@ public:
void set_normalized_tx_gain(double gain, size_t chan = 0)
{
- if (gain > 1.0 || gain < 0.0) {
- throw uhd::runtime_error("Normalized gain out of range, must be in [0, 1].");
- }
- gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
- double abs_gain = (gain * (gain_range.stop() - gain_range.start())) + gain_range.start();
- set_tx_gain(abs_gain, ALL_GAINS, chan);
+ if (gain > 1.0 || gain < 0.0) {
+ throw uhd::runtime_error("Normalized gain out of range, must be in [0, 1].");
+ }
+ gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
+ double abs_gain =
+ (gain * (gain_range.stop() - gain_range.start())) + gain_range.start();
+ set_tx_gain(abs_gain, ALL_GAINS, chan);
}
- double get_tx_gain(const std::string &name, size_t chan){
+ double get_tx_gain(const std::string& name, size_t chan)
+ {
try {
return tx_gain_group(chan)->get_value(name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,tx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, tx);
}
}
double get_normalized_tx_gain(size_t chan)
{
- gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
- double gain_range_width = gain_range.stop() - gain_range.start();
- // In case we have a device without a range of gains:
- if (gain_range_width == 0.0) {
- return 0.0;
- }
- double norm_gain = (get_tx_gain(ALL_GAINS, chan) - gain_range.start()) / gain_range_width;
- // Avoid rounding errors:
- if (norm_gain > 1.0) return 1.0;
- if (norm_gain < 0.0) return 0.0;
- return norm_gain;
- }
-
- gain_range_t get_tx_gain_range(const std::string &name, size_t chan){
+ gain_range_t gain_range = get_tx_gain_range(ALL_GAINS, chan);
+ double gain_range_width = gain_range.stop() - gain_range.start();
+ // In case we have a device without a range of gains:
+ if (gain_range_width == 0.0) {
+ return 0.0;
+ }
+ double norm_gain =
+ (get_tx_gain(ALL_GAINS, chan) - gain_range.start()) / gain_range_width;
+ // Avoid rounding errors:
+ if (norm_gain > 1.0)
+ return 1.0;
+ if (norm_gain < 0.0)
+ return 0.0;
+ return norm_gain;
+ }
+
+ gain_range_t get_tx_gain_range(const std::string& name, size_t chan)
+ {
try {
return tx_gain_group(chan)->get_range(name);
- } catch (uhd::key_error &) {
- THROW_GAIN_NAME_ERROR(name,chan,tx);
+ } catch (uhd::key_error&) {
+ THROW_GAIN_NAME_ERROR(name, chan, tx);
}
}
- std::vector<std::string> get_tx_gain_names(size_t chan){
+ std::vector<std::string> get_tx_gain_names(size_t chan)
+ {
return tx_gain_group(chan)->get_names();
}
- void set_tx_antenna(const std::string &ant, size_t chan){
+ void set_tx_antenna(const std::string& ant, size_t chan)
+ {
_tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").set(ant);
}
- std::string get_tx_antenna(size_t chan){
- return _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").get();
+ std::string get_tx_antenna(size_t chan)
+ {
+ return _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value")
+ .get();
}
- std::vector<std::string> get_tx_antennas(size_t chan){
- return _tree->access<std::vector<std::string> >(tx_rf_fe_root(chan) / "antenna" / "options").get();
+ std::vector<std::string> get_tx_antennas(size_t chan)
+ {
+ return _tree
+ ->access<std::vector<std::string>>(
+ tx_rf_fe_root(chan) / "antenna" / "options")
+ .get();
}
- void set_tx_bandwidth(double bandwidth, size_t chan){
+ void set_tx_bandwidth(double bandwidth, size_t chan)
+ {
_tree->access<double>(tx_rf_fe_root(chan) / "bandwidth" / "value").set(bandwidth);
}
- double get_tx_bandwidth(size_t chan){
+ double get_tx_bandwidth(size_t chan)
+ {
return _tree->access<double>(tx_rf_fe_root(chan) / "bandwidth" / "value").get();
}
- meta_range_t get_tx_bandwidth_range(size_t chan){
- return _tree->access<meta_range_t>(tx_rf_fe_root(chan) / "bandwidth" / "range").get();
+ meta_range_t get_tx_bandwidth_range(size_t chan)
+ {
+ return _tree->access<meta_range_t>(tx_rf_fe_root(chan) / "bandwidth" / "range")
+ .get();
}
- dboard_iface::sptr get_tx_dboard_iface(size_t chan){
- return _tree->access<dboard_iface::sptr>(tx_rf_fe_root(chan).branch_path().branch_path() / "iface").get();
+ dboard_iface::sptr get_tx_dboard_iface(size_t chan)
+ {
+ return _tree
+ ->access<dboard_iface::sptr>(
+ tx_rf_fe_root(chan).branch_path().branch_path() / "iface")
+ .get();
}
- sensor_value_t get_tx_sensor(const std::string &name, size_t chan){
- return _tree->access<sensor_value_t>(tx_rf_fe_root(chan) / "sensors" / name).get();
+ sensor_value_t get_tx_sensor(const std::string& name, size_t chan)
+ {
+ return _tree->access<sensor_value_t>(tx_rf_fe_root(chan) / "sensors" / name)
+ .get();
}
- std::vector<std::string> get_tx_sensor_names(size_t chan){
+ std::vector<std::string> get_tx_sensor_names(size_t chan)
+ {
std::vector<std::string> sensor_names;
if (_tree->exists(rx_rf_fe_root(chan) / "sensors")) {
sensor_names = _tree->list(tx_rf_fe_root(chan) / "sensors");
@@ -2057,39 +2252,53 @@ public:
return sensor_names;
}
- void set_tx_dc_offset(const std::complex<double> &offset, size_t chan){
- if (chan != ALL_CHANS){
+ void set_tx_dc_offset(const std::complex<double>& offset, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(tx_fe_root(chan) / "dc_offset" / "value")) {
- _tree->access<std::complex<double> >(tx_fe_root(chan) / "dc_offset" / "value").set(offset);
+ _tree
+ ->access<std::complex<double>>(
+ tx_fe_root(chan) / "dc_offset" / "value")
+ .set(offset);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting DC offset is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "Setting DC offset is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_tx_num_channels(); c++){
+ for (size_t c = 0; c < get_tx_num_channels(); c++) {
this->set_tx_dc_offset(offset, c);
}
}
- meta_range_t get_tx_dc_offset_range(size_t chan) {
+ meta_range_t get_tx_dc_offset_range(size_t chan)
+ {
if (_tree->exists(tx_fe_root(chan) / "dc_offset" / "range")) {
- return _tree->access<uhd::meta_range_t>(tx_fe_root(chan) / "dc_offset" / "range").get();
+ return _tree
+ ->access<uhd::meta_range_t>(tx_fe_root(chan) / "dc_offset" / "range")
+ .get();
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "This device does not support querying the TX DC offset range." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "This device does not support querying the TX DC offset range.";
return meta_range_t(0, 0);
}
}
- void set_tx_iq_balance(const std::complex<double> &offset, size_t chan){
- if (chan != ALL_CHANS){
+ void set_tx_iq_balance(const std::complex<double>& offset, size_t chan)
+ {
+ if (chan != ALL_CHANS) {
if (_tree->exists(tx_fe_root(chan) / "iq_balance" / "value")) {
- _tree->access<std::complex<double> >(tx_fe_root(chan) / "iq_balance" / "value").set(offset);
+ _tree
+ ->access<std::complex<double>>(
+ tx_fe_root(chan) / "iq_balance" / "value")
+ .set(offset);
} else {
- UHD_LOGGER_WARNING("MULTI_USRP") << "Setting IQ balance is not possible on this device." ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << "Setting IQ balance is not possible on this device.";
}
return;
}
- for (size_t c = 0; c < get_tx_num_channels(); c++){
+ for (size_t c = 0; c < get_tx_num_channels(); c++) {
this->set_tx_iq_balance(offset, c);
}
}
@@ -2100,80 +2309,77 @@ public:
std::vector<std::string> get_gpio_banks(const size_t mboard)
{
std::vector<std::string> banks;
- if (_tree->exists(mb_root(mboard) / "gpio"))
- {
- for(const std::string &name: _tree->list(mb_root(mboard) / "gpio"))
- {
+ if (_tree->exists(mb_root(mboard) / "gpio")) {
+ for (const std::string& name : _tree->list(mb_root(mboard) / "gpio")) {
banks.push_back(name);
}
}
- for(const std::string &name: _tree->list(mb_root(mboard) / "dboards"))
- {
- banks.push_back("RX"+name);
- banks.push_back("TX"+name);
+ for (const std::string& name : _tree->list(mb_root(mboard) / "dboards")) {
+ banks.push_back("RX" + name);
+ banks.push_back("TX" + name);
}
return banks;
}
- void set_gpio_attr(
- const std::string &bank,
- const std::string &attr,
+ void set_gpio_attr(const std::string& bank,
+ const std::string& attr,
const uint32_t value,
const uint32_t mask,
- const size_t mboard
- ) {
+ const size_t mboard)
+ {
std::vector<std::string> attr_value;
if (_tree->exists(mb_root(mboard) / "gpio" / bank)) {
- if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)){
+ if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) {
const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr);
switch (attr_type) {
case gpio_atr::GPIO_SRC:
throw uhd::runtime_error(
- "Can't set SRC attribute using integer value!"
- );
+ "Can't set SRC attribute using integer value!");
break;
case gpio_atr::GPIO_CTRL:
case gpio_atr::GPIO_DDR: {
- attr_value = _tree->access<std::vector<std::string>>(
- mb_root(mboard) / "gpio" / bank / attr
- ).get();
+ attr_value = _tree
+ ->access<std::vector<std::string>>(
+ mb_root(mboard) / "gpio" / bank / attr)
+ .get();
UHD_ASSERT_THROW(attr_value.size() <= 32);
- std::bitset<32> bit_mask = std::bitset<32>(mask);
+ std::bitset<32> bit_mask = std::bitset<32>(mask);
std::bitset<32> bit_value = std::bitset<32>(value);
for (size_t i = 0; i < bit_mask.size(); i++) {
if (bit_mask[i] == 1) {
- attr_value[i] = gpio_atr::attr_value_map.at(attr_type).at(bit_value[i]);
+ attr_value[i] = gpio_atr::attr_value_map.at(attr_type).at(
+ bit_value[i]);
}
}
- _tree->access<std::vector<std::string>>(
- mb_root(mboard) / "gpio" / bank / attr
- ).set(attr_value);
- }
- break;
- default:{
- const uint32_t current = _tree->access<uint32_t>(
- mb_root(mboard) / "gpio" / bank / attr).get();
+ _tree
+ ->access<std::vector<std::string>>(
+ mb_root(mboard) / "gpio" / bank / attr)
+ .set(attr_value);
+ } break;
+ default: {
+ const uint32_t current =
+ _tree->access<uint32_t>(
+ mb_root(mboard) / "gpio" / bank / attr)
+ .get();
const uint32_t new_value = (current & ~mask) | (value & mask);
- _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).set(new_value);
- }
- break;
+ _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr)
+ .set(new_value);
+ } break;
}
return;
} else {
throw uhd::runtime_error(str(
- boost::format("The hardware has no gpio attribute: `%s':\n")
- % attr
- ));
+ boost::format("The hardware has no gpio attribute: `%s':\n") % attr));
}
}
if (bank.size() > 2 and bank[1] == 'X') {
- const std::string name = bank.substr(2);
- const dboard_iface::unit_t unit =
- (bank[0] == 'R')
- ? dboard_iface::UNIT_RX
- : dboard_iface::UNIT_TX;
- auto iface = _tree->access<dboard_iface::sptr>(
- mb_root(mboard) / "dboards" / name / "iface").get();
+ const std::string name = bank.substr(2);
+ const dboard_iface::unit_t unit = (bank[0] == 'R') ? dboard_iface::UNIT_RX
+ : dboard_iface::UNIT_TX;
+ auto iface = _tree
+ ->access<dboard_iface::sptr>(
+ mb_root(mboard) / "dboards" / name / "iface")
+ .get();
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_CTRL))
iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_DDR))
@@ -2181,77 +2387,92 @@ public:
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_OUT))
iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_0X))
- iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask));
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_RX))
- iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask));
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_TX))
- iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask));
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_XX))
- iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask));
+ iface->set_atr_reg(
+ unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask));
if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_SRC)) {
- throw uhd::runtime_error("Setting gpio source does not supported in daughter board.");
+ throw uhd::runtime_error(
+ "Setting gpio source does not supported in daughter board.");
}
return;
}
- throw uhd::runtime_error(str(
- boost::format("The hardware has no GPIO bank `%s'")
- % bank
- ));
+ throw uhd::runtime_error(
+ str(boost::format("The hardware has no GPIO bank `%s'") % bank));
}
uint32_t get_gpio_attr(
- const std::string &bank,
- const std::string &attr,
- const size_t mboard
- ) {
+ const std::string& bank, const std::string& attr, const size_t mboard)
+ {
std::vector<std::string> str_val;
if (_tree->exists(mb_root(mboard) / "gpio" / bank)) {
if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) {
const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr);
- switch (attr_type){
+ switch (attr_type) {
case gpio_atr::GPIO_SRC:
- throw uhd::runtime_error("Can't set SRC attribute using integer value");
+ throw uhd::runtime_error(
+ "Can't set SRC attribute using integer value");
case gpio_atr::GPIO_CTRL:
case gpio_atr::GPIO_DDR: {
- str_val = _tree->access<std::vector<std::string>>(
- mb_root(mboard) / "gpio" / bank / attr).get();
+ str_val = _tree
+ ->access<std::vector<std::string>>(
+ mb_root(mboard) / "gpio" / bank / attr)
+ .get();
uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++) {
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr).at(str_val[i]) << i;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair.at(attr).at(
+ str_val[i])
+ << i;
}
return val;
}
default:
- return uint32_t(_tree->access<uint32_t>(
- mb_root(mboard) / "gpio" / bank / attr).get());
+ return uint32_t(
+ _tree->access<uint32_t>(
+ mb_root(mboard) / "gpio" / bank / attr)
+ .get());
}
return 0;
} else {
throw uhd::runtime_error(str(
- boost::format("The hardware has no gpio attribute: `%s'")
- % attr
- ));
+ boost::format("The hardware has no gpio attribute: `%s'") % attr));
}
}
if (bank.size() > 2 and bank[1] == 'X') {
- const std::string name = bank.substr(2);
- const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX;
- auto iface = _tree->access<dboard_iface::sptr>(
- mb_root(mboard) / "dboards" / name / "iface").get();
- if (attr == "CTRL") return iface->get_pin_ctrl(unit);
- if (attr == "DDR") return iface->get_gpio_ddr(unit);
- if (attr == "OUT") return iface->get_gpio_out(unit);
- if (attr == "ATR_0X") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_IDLE);
- if (attr == "ATR_RX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY);
- if (attr == "ATR_TX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY);
- if (attr == "ATR_XX") return iface->get_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX);
- if (attr == "READBACK") return iface->read_gpio(unit);
- }
- throw uhd::runtime_error(str(
- boost::format("The hardware has no gpio bank `%s'")
- % bank
- ));
+ const std::string name = bank.substr(2);
+ const dboard_iface::unit_t unit = (bank[0] == 'R') ? dboard_iface::UNIT_RX
+ : dboard_iface::UNIT_TX;
+ auto iface = _tree
+ ->access<dboard_iface::sptr>(
+ mb_root(mboard) / "dboards" / name / "iface")
+ .get();
+ if (attr == "CTRL")
+ return iface->get_pin_ctrl(unit);
+ if (attr == "DDR")
+ return iface->get_gpio_ddr(unit);
+ if (attr == "OUT")
+ return iface->get_gpio_out(unit);
+ if (attr == "ATR_0X")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_IDLE);
+ if (attr == "ATR_RX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY);
+ if (attr == "ATR_TX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY);
+ if (attr == "ATR_XX")
+ return iface->get_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX);
+ if (attr == "READBACK")
+ return iface->read_gpio(unit);
+ }
+ throw uhd::runtime_error(
+ str(boost::format("The hardware has no gpio bank `%s'") % bank));
}
// The next four methods are only for RFNoC devices
@@ -2286,55 +2507,63 @@ private:
//! Container for spp values set in set_rx_spp()
std::unordered_map<size_t, size_t> _rx_spp;
- struct mboard_chan_pair{
+ struct mboard_chan_pair
+ {
size_t mboard, chan;
- mboard_chan_pair(void): mboard(0), chan(0){}
+ mboard_chan_pair(void) : mboard(0), chan(0) {}
};
- mboard_chan_pair rx_chan_to_mcp(size_t chan){
+ mboard_chan_pair rx_chan_to_mcp(size_t chan)
+ {
mboard_chan_pair mcp;
mcp.chan = chan;
- for (mcp.mboard = 0; mcp.mboard < get_num_mboards(); mcp.mboard++){
+ for (mcp.mboard = 0; mcp.mboard < get_num_mboards(); mcp.mboard++) {
size_t sss = get_rx_subdev_spec(mcp.mboard).size();
- if (mcp.chan < sss) break;
+ if (mcp.chan < sss)
+ break;
mcp.chan -= sss;
}
- if (mcp.mboard >= get_num_mboards())
- {
- throw uhd::index_error(str(boost::format("multi_usrp: RX channel %u out of range for configured RX frontends") % chan));
+ if (mcp.mboard >= get_num_mboards()) {
+ throw uhd::index_error(str(
+ boost::format(
+ "multi_usrp: RX channel %u out of range for configured RX frontends")
+ % chan));
}
return mcp;
}
- mboard_chan_pair tx_chan_to_mcp(size_t chan){
+ mboard_chan_pair tx_chan_to_mcp(size_t chan)
+ {
mboard_chan_pair mcp;
mcp.chan = chan;
- for (mcp.mboard = 0; mcp.mboard < get_num_mboards(); mcp.mboard++){
+ for (mcp.mboard = 0; mcp.mboard < get_num_mboards(); mcp.mboard++) {
size_t sss = get_tx_subdev_spec(mcp.mboard).size();
- if (mcp.chan < sss) break;
+ if (mcp.chan < sss)
+ break;
mcp.chan -= sss;
}
- if (mcp.mboard >= get_num_mboards())
- {
- throw uhd::index_error(str(boost::format("multi_usrp: TX channel %u out of range for configured TX frontends") % chan));
+ if (mcp.mboard >= get_num_mboards()) {
+ throw uhd::index_error(str(
+ boost::format(
+ "multi_usrp: TX channel %u out of range for configured TX frontends")
+ % chan));
}
return mcp;
}
fs_path mb_root(const size_t mboard)
{
- try
- {
+ try {
const std::string tree_path = "/mboards/" + std::to_string(mboard);
if (_tree->exists(tree_path)) {
return tree_path;
} else {
- throw uhd::index_error(str(boost::format("multi_usrp::mb_root(%u) - path not found") % mboard));
+ throw uhd::index_error(str(
+ boost::format("multi_usrp::mb_root(%u) - path not found") % mboard));
}
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::mb_root(%u) - %s") % mboard % e.what()));
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::mb_root(%u) - %s") % mboard % e.what()));
}
}
@@ -2342,23 +2571,28 @@ private:
{
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
if (_tree->exists(mb_root(mcp.mboard) / "rx_chan_dsp_mapping")) {
- std::vector<size_t> map = _tree->access<std::vector<size_t> >(mb_root(mcp.mboard) / "rx_chan_dsp_mapping").get();
+ std::vector<size_t> map = _tree
+ ->access<std::vector<size_t>>(
+ mb_root(mcp.mboard) / "rx_chan_dsp_mapping")
+ .get();
UHD_ASSERT_THROW(map.size() > mcp.chan);
mcp.chan = map[mcp.chan];
}
- try
- {
+ try {
const std::string tree_path = mb_root(mcp.mboard) / "rx_dsps" / mcp.chan;
if (_tree->exists(tree_path)) {
return tree_path;
} else {
- throw uhd::index_error(str(boost::format("multi_usrp::rx_dsp_root(%u) - mcp(%u) - path not found") % chan % mcp.chan));
+ throw uhd::index_error(
+ str(boost::format(
+ "multi_usrp::rx_dsp_root(%u) - mcp(%u) - path not found")
+ % chan % mcp.chan));
}
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::rx_dsp_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::rx_dsp_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
@@ -2366,50 +2600,53 @@ private:
{
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
if (_tree->exists(mb_root(mcp.mboard) / "tx_chan_dsp_mapping")) {
- std::vector<size_t> map = _tree->access<std::vector<size_t> >(mb_root(mcp.mboard) / "tx_chan_dsp_mapping").get();
+ std::vector<size_t> map = _tree
+ ->access<std::vector<size_t>>(
+ mb_root(mcp.mboard) / "tx_chan_dsp_mapping")
+ .get();
UHD_ASSERT_THROW(map.size() > mcp.chan);
mcp.chan = map[mcp.chan];
}
- try
- {
+ try {
const std::string tree_path = mb_root(mcp.mboard) / "tx_dsps" / mcp.chan;
if (_tree->exists(tree_path)) {
return tree_path;
} else {
- throw uhd::index_error(str(boost::format("multi_usrp::tx_dsp_root(%u) - mcp(%u) - path not found") % chan % mcp.chan));
+ throw uhd::index_error(
+ str(boost::format(
+ "multi_usrp::tx_dsp_root(%u) - mcp(%u) - path not found")
+ % chan % mcp.chan));
}
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::tx_dsp_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::tx_dsp_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
fs_path rx_fe_root(const size_t chan)
{
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
- try
- {
+ try {
const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
return mb_root(mcp.mboard) / "rx_frontends" / spec.db_name;
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::rx_fe_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::rx_fe_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
fs_path tx_fe_root(const size_t chan)
{
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
- try
- {
+ try {
const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
return mb_root(mcp.mboard) / "tx_frontends" / spec.db_name;
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::tx_fe_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::tx_fe_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
@@ -2422,65 +2659,80 @@ private:
} else if (slot_name == "C") {
return 2;
} else if (slot_name == "D") {
- return 3;
+ return 3;
} else {
- throw uhd::key_error(str(
+ throw uhd::key_error(str(
boost::format("[multi_usrp]: radio slot name %s out of supported range.")
- % slot_name
- ));
+ % slot_name));
}
}
fs_path rx_rf_fe_root(const size_t chan)
{
mboard_chan_pair mcp = rx_chan_to_mcp(chan);
- try
- {
+ try {
const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
- return mb_root(mcp.mboard) / "dboards" / spec.db_name / "rx_frontends" / spec.sd_name;
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::rx_rf_fe_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ return mb_root(mcp.mboard) / "dboards" / spec.db_name / "rx_frontends"
+ / spec.sd_name;
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::rx_rf_fe_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
fs_path tx_rf_fe_root(const size_t chan)
{
mboard_chan_pair mcp = tx_chan_to_mcp(chan);
- try
- {
+ try {
const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
- return mb_root(mcp.mboard) / "dboards" / spec.db_name / "tx_frontends" / spec.sd_name;
- }
- catch(const std::exception &e)
- {
- throw uhd::index_error(str(boost::format("multi_usrp::tx_rf_fe_root(%u) - mcp(%u) - %s") % chan % mcp.chan % e.what()));
+ return mb_root(mcp.mboard) / "dboards" / spec.db_name / "tx_frontends"
+ / spec.sd_name;
+ } catch (const std::exception& e) {
+ throw uhd::index_error(
+ str(boost::format("multi_usrp::tx_rf_fe_root(%u) - mcp(%u) - %s") % chan
+ % mcp.chan % e.what()));
}
}
- gain_group::sptr rx_gain_group(size_t chan){
- mboard_chan_pair mcp = rx_chan_to_mcp(chan);
+ gain_group::sptr rx_gain_group(size_t chan)
+ {
+ mboard_chan_pair mcp = rx_chan_to_mcp(chan);
const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan);
- gain_group::sptr gg = gain_group::make();
- for(const std::string &name: _tree->list(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains")){
- gg->register_fcns("ADC-"+name, make_gain_fcns_from_subtree(_tree->subtree(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains" / name)), 0 /* low prio */);
- }
- for(const std::string &name: _tree->list(rx_rf_fe_root(chan) / "gains")){
- gg->register_fcns(name, make_gain_fcns_from_subtree(_tree->subtree(rx_rf_fe_root(chan) / "gains" / name)), 1 /* high prio */);
+ gain_group::sptr gg = gain_group::make();
+ for (const std::string& name :
+ _tree->list(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains")) {
+ gg->register_fcns("ADC-" + name,
+ make_gain_fcns_from_subtree(_tree->subtree(
+ mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains" / name)),
+ 0 /* low prio */);
+ }
+ for (const std::string& name : _tree->list(rx_rf_fe_root(chan) / "gains")) {
+ gg->register_fcns(name,
+ make_gain_fcns_from_subtree(
+ _tree->subtree(rx_rf_fe_root(chan) / "gains" / name)),
+ 1 /* high prio */);
}
return gg;
}
- gain_group::sptr tx_gain_group(size_t chan){
- mboard_chan_pair mcp = tx_chan_to_mcp(chan);
+ gain_group::sptr tx_gain_group(size_t chan)
+ {
+ mboard_chan_pair mcp = tx_chan_to_mcp(chan);
const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan);
- gain_group::sptr gg = gain_group::make();
- for(const std::string &name: _tree->list(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains")){
- gg->register_fcns("DAC-"+name, make_gain_fcns_from_subtree(_tree->subtree(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains" / name)), 1 /* high prio */);
- }
- for(const std::string &name: _tree->list(tx_rf_fe_root(chan) / "gains")){
- gg->register_fcns(name, make_gain_fcns_from_subtree(_tree->subtree(tx_rf_fe_root(chan) / "gains" / name)), 0 /* low prio */);
+ gain_group::sptr gg = gain_group::make();
+ for (const std::string& name :
+ _tree->list(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains")) {
+ gg->register_fcns("DAC-" + name,
+ make_gain_fcns_from_subtree(_tree->subtree(
+ mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains" / name)),
+ 1 /* high prio */);
+ }
+ for (const std::string& name : _tree->list(tx_rf_fe_root(chan) / "gains")) {
+ gg->register_fcns(name,
+ make_gain_fcns_from_subtree(
+ _tree->subtree(tx_rf_fe_root(chan) / "gains" / name)),
+ 0 /* low prio */);
}
return gg;
}
@@ -2488,27 +2740,29 @@ private:
//! \param is_tx True for tx
// Assumption is that all mboards use the same link
// and that the rate sum is evenly distributed among the mboards
- bool _check_link_rate(const stream_args_t &args, bool is_tx) {
- bool link_rate_is_ok = true;
- size_t bytes_per_sample = convert::get_bytes_per_item(args.otw_format.empty() ? "sc16" : args.otw_format);
+ bool _check_link_rate(const stream_args_t& args, bool is_tx)
+ {
+ bool link_rate_is_ok = true;
+ size_t bytes_per_sample = convert::get_bytes_per_item(
+ args.otw_format.empty() ? "sc16" : args.otw_format);
double max_link_rate = 0;
- double sum_rate = 0;
- for(const size_t chan: args.channels) {
+ double sum_rate = 0;
+ for (const size_t chan : args.channels) {
mboard_chan_pair mcp = is_tx ? tx_chan_to_mcp(chan) : rx_chan_to_mcp(chan);
if (_tree->exists(mb_root(mcp.mboard) / "link_max_rate")) {
- max_link_rate = std::max(
- max_link_rate,
- _tree->access<double>(mb_root(mcp.mboard) / "link_max_rate").get()
- );
+ max_link_rate = std::max(max_link_rate,
+ _tree->access<double>(mb_root(mcp.mboard) / "link_max_rate").get());
}
sum_rate += is_tx ? get_tx_rate(chan) : get_rx_rate(chan);
}
sum_rate /= get_num_mboards();
if (max_link_rate > 0 and (max_link_rate / bytes_per_sample) < sum_rate) {
- UHD_LOGGER_WARNING("MULTI_USRP") << boost::format(
- "The total sum of rates (%f MSps on %u channels) exceeds the maximum capacity of the connection.\n"
- "This can cause %s."
- ) % (sum_rate/1e6) % args.channels.size() % (is_tx ? "underruns (U)" : "overflows (O)") ;
+ UHD_LOGGER_WARNING("MULTI_USRP")
+ << boost::format("The total sum of rates (%f MSps on %u channels) "
+ "exceeds the maximum capacity of the connection.\n"
+ "This can cause %s.")
+ % (sum_rate / 1e6) % args.channels.size()
+ % (is_tx ? "underruns (U)" : "overflows (O)");
link_rate_is_ok = false;
}
@@ -2516,7 +2770,8 @@ private:
}
};
-multi_usrp::~multi_usrp(void){
+multi_usrp::~multi_usrp(void)
+{
/* NOP */
}
diff --git a/host/lib/usrp/multi_usrp_python.hpp b/host/lib/usrp/multi_usrp_python.hpp
index 8d25e26d4..f4e0a73e1 100644
--- a/host/lib/usrp/multi_usrp_python.hpp
+++ b/host/lib/usrp/multi_usrp_python.hpp
@@ -13,11 +13,11 @@
void export_multi_usrp(py::module& m)
{
- using multi_usrp = uhd::usrp::multi_usrp;
+ using multi_usrp = uhd::usrp::multi_usrp;
const auto ALL_MBOARDS = multi_usrp::ALL_MBOARDS;
- const auto ALL_CHANS = multi_usrp::ALL_CHANS;
- const auto ALL_LOS = multi_usrp::ALL_LOS;
+ const auto ALL_CHANS = multi_usrp::ALL_CHANS;
+ const auto ALL_LOS = multi_usrp::ALL_LOS;
py::class_<multi_usrp, multi_usrp::sptr>(m, "multi_usrp")
diff --git a/host/lib/usrp/subdev_spec.cpp b/host/lib/usrp/subdev_spec.cpp
index 70c27d1e1..0d271e832 100644
--- a/host/lib/usrp/subdev_spec.cpp
+++ b/host/lib/usrp/subdev_spec.cpp
@@ -5,11 +5,11 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <uhd/usrp/subdev_spec.hpp>
#include <uhd/exception.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
#include <boost/algorithm/string.hpp> //for split
-#include <boost/tokenizer.hpp>
#include <boost/format.hpp>
+#include <boost/tokenizer.hpp>
#include <sstream>
#include <vector>
@@ -17,61 +17,72 @@ using namespace uhd;
using namespace uhd::usrp;
#define pair_tokenizer(inp) \
- boost::tokenizer<boost::char_separator<char> > \
- (inp, boost::char_separator<char>(" "))
+ boost::tokenizer<boost::char_separator<char>>(inp, boost::char_separator<char>(" "))
subdev_spec_pair_t::subdev_spec_pair_t(
- const std::string &db_name, const std::string &sd_name
-):
- db_name(db_name),
- sd_name(sd_name)
+ const std::string& db_name, const std::string& sd_name)
+ : db_name(db_name), sd_name(sd_name)
{
/* NOP */
}
-bool usrp::operator==(const subdev_spec_pair_t &lhs, const subdev_spec_pair_t &rhs){
+bool usrp::operator==(const subdev_spec_pair_t& lhs, const subdev_spec_pair_t& rhs)
+{
return (lhs.db_name == rhs.db_name) and (lhs.sd_name == rhs.sd_name);
}
-bool subdev_spec_pair_t::operator==(const subdev_spec_pair_t &other){
+bool subdev_spec_pair_t::operator==(const subdev_spec_pair_t& other)
+{
return (other.db_name == db_name) and (other.sd_name == sd_name);
}
-bool subdev_spec_pair_t::operator!=(const subdev_spec_pair_t &other){
+bool subdev_spec_pair_t::operator!=(const subdev_spec_pair_t& other)
+{
return (other.db_name != db_name) or (other.sd_name != sd_name);
}
-subdev_spec_t::subdev_spec_t(const std::string &markup){
- for(const std::string &pair: pair_tokenizer(markup)){
- if (pair.empty()) continue;
- std::vector<std::string> db_sd; boost::split(db_sd, pair, boost::is_any_of(":"));
- switch(db_sd.size()){
- case 1: this->push_back(subdev_spec_pair_t("", db_sd.front())); break;
- case 2: this->push_back(subdev_spec_pair_t(db_sd.front(), db_sd.back())); break;
- default: throw uhd::value_error("invalid subdev-spec markup string: "+markup);
+subdev_spec_t::subdev_spec_t(const std::string& markup)
+{
+ for (const std::string& pair : pair_tokenizer(markup)) {
+ if (pair.empty())
+ continue;
+ std::vector<std::string> db_sd;
+ boost::split(db_sd, pair, boost::is_any_of(":"));
+ switch (db_sd.size()) {
+ case 1:
+ this->push_back(subdev_spec_pair_t("", db_sd.front()));
+ break;
+ case 2:
+ this->push_back(subdev_spec_pair_t(db_sd.front(), db_sd.back()));
+ break;
+ default:
+ throw uhd::value_error("invalid subdev-spec markup string: " + markup);
}
}
}
-std::string subdev_spec_t::to_pp_string(void) const{
- if (this->size() == 0) return "Empty Subdevice Specification";
+std::string subdev_spec_t::to_pp_string(void) const
+{
+ if (this->size() == 0)
+ return "Empty Subdevice Specification";
std::stringstream ss;
size_t count = 0;
ss << "Subdevice Specification:" << std::endl;
- for(const subdev_spec_pair_t &pair: *this){
- ss << boost::format(
- " Channel %d: Daughterboard %s, Subdevice %s"
- ) % (count++) % pair.db_name % pair.sd_name << std::endl;
+ for (const subdev_spec_pair_t& pair : *this) {
+ ss << boost::format(" Channel %d: Daughterboard %s, Subdevice %s") % (count++)
+ % pair.db_name % pair.sd_name
+ << std::endl;
}
return ss.str();
}
-std::string subdev_spec_t::to_string(void) const{
+std::string subdev_spec_t::to_string(void) const
+{
std::string markup;
size_t count = 0;
- for(const subdev_spec_pair_t &pair: *this){
- markup += ((count++)? " " : "") + pair.db_name + ":" + pair.sd_name;
+ for (const subdev_spec_pair_t& pair : *this) {
+ markup += ((count++) ? " " : "") + pair.db_name + ":" + pair.sd_name;
}
return markup;
}
diff --git a/host/lib/usrp/subdev_spec_c.cpp b/host/lib/usrp/subdev_spec_c.cpp
index 8142256ac..b002d6d43 100644
--- a/host/lib/usrp/subdev_spec_c.cpp
+++ b/host/lib/usrp/subdev_spec_c.cpp
@@ -6,134 +6,94 @@
//
#include <uhd/usrp/subdev_spec.h>
-
#include <string.h>
-uhd_error uhd_subdev_spec_pair_free(
- uhd_subdev_spec_pair_t *subdev_spec_pair
-){
- UHD_SAFE_C(
- if(subdev_spec_pair->db_name){
- free(subdev_spec_pair->db_name);
- subdev_spec_pair->db_name = NULL;
- }
- if(subdev_spec_pair->sd_name){
- free(subdev_spec_pair->sd_name);
- subdev_spec_pair->sd_name = NULL;
- }
- )
+uhd_error uhd_subdev_spec_pair_free(uhd_subdev_spec_pair_t* subdev_spec_pair)
+{
+ UHD_SAFE_C(if (subdev_spec_pair->db_name) {
+ free(subdev_spec_pair->db_name);
+ subdev_spec_pair->db_name = NULL;
+ } if (subdev_spec_pair->sd_name) {
+ free(subdev_spec_pair->sd_name);
+ subdev_spec_pair->sd_name = NULL;
+ })
}
-uhd_error uhd_subdev_spec_pairs_equal(
- const uhd_subdev_spec_pair_t* first,
+uhd_error uhd_subdev_spec_pairs_equal(const uhd_subdev_spec_pair_t* first,
const uhd_subdev_spec_pair_t* second,
- bool *result_out
-){
- UHD_SAFE_C(
- *result_out = (uhd_subdev_spec_pair_c_to_cpp(first) ==
- uhd_subdev_spec_pair_c_to_cpp(second));
- )
+ bool* result_out)
+{
+ UHD_SAFE_C(*result_out = (uhd_subdev_spec_pair_c_to_cpp(first)
+ == uhd_subdev_spec_pair_c_to_cpp(second));)
}
-uhd_error uhd_subdev_spec_make(
- uhd_subdev_spec_handle* h,
- const char* markup
-){
- UHD_SAFE_C(
- (*h) = new uhd_subdev_spec_t;
- std::string markup_cpp(markup);
- if(!markup_cpp.empty()){
- (*h)->subdev_spec_cpp = uhd::usrp::subdev_spec_t(markup_cpp);
- }
- )
+uhd_error uhd_subdev_spec_make(uhd_subdev_spec_handle* h, const char* markup)
+{
+ UHD_SAFE_C((*h) = new uhd_subdev_spec_t; std::string markup_cpp(markup);
+ if (!markup_cpp.empty()) {
+ (*h)->subdev_spec_cpp = uhd::usrp::subdev_spec_t(markup_cpp);
+ })
}
-uhd_error uhd_subdev_spec_free(
- uhd_subdev_spec_handle* h
-){
- UHD_SAFE_C(
- delete (*h);
- (*h) = NULL;
- )
+uhd_error uhd_subdev_spec_free(uhd_subdev_spec_handle* h)
+{
+ UHD_SAFE_C(delete (*h); (*h) = NULL;)
}
-uhd_error uhd_subdev_spec_size(
- uhd_subdev_spec_handle h,
- size_t *size_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *size_out = h->subdev_spec_cpp.size();
- )
+uhd_error uhd_subdev_spec_size(uhd_subdev_spec_handle h, size_t* size_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *size_out = h->subdev_spec_cpp.size();)
}
-uhd_error uhd_subdev_spec_push_back(
- uhd_subdev_spec_handle h,
- const char* markup
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->subdev_spec_cpp.push_back(uhd::usrp::subdev_spec_pair_t(markup));
- )
+uhd_error uhd_subdev_spec_push_back(uhd_subdev_spec_handle h, const char* markup)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, h->subdev_spec_cpp.push_back(uhd::usrp::subdev_spec_pair_t(markup));)
}
uhd_error uhd_subdev_spec_at(
- uhd_subdev_spec_handle h,
- size_t num,
- uhd_subdev_spec_pair_t *subdev_spec_pair_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd_subdev_spec_pair_cpp_to_c(
- h->subdev_spec_cpp.at(num),
- subdev_spec_pair_out
- );
- )
+ uhd_subdev_spec_handle h, size_t num, uhd_subdev_spec_pair_t* subdev_spec_pair_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ uhd_subdev_spec_pair_cpp_to_c(h->subdev_spec_cpp.at(num), subdev_spec_pair_out);)
}
uhd_error uhd_subdev_spec_to_pp_string(
- uhd_subdev_spec_handle h,
- char* pp_string_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string pp_string_cpp = h->subdev_spec_cpp.to_pp_string();
+ uhd_subdev_spec_handle h, char* pp_string_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string pp_string_cpp = h->subdev_spec_cpp.to_pp_string();
memset(pp_string_out, '\0', strbuffer_len);
- strncpy(pp_string_out, pp_string_cpp.c_str(), strbuffer_len);
- )
+ strncpy(pp_string_out, pp_string_cpp.c_str(), strbuffer_len);)
}
uhd_error uhd_subdev_spec_to_string(
- uhd_subdev_spec_handle h,
- char* string_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string string_cpp = h->subdev_spec_cpp.to_string();
- memset(string_out, '\0', strbuffer_len);
- strncpy(string_out, string_cpp.c_str(), strbuffer_len);
- )
+ uhd_subdev_spec_handle h, char* string_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string string_cpp = h->subdev_spec_cpp.to_string();
+ memset(string_out, '\0', strbuffer_len);
+ strncpy(string_out, string_cpp.c_str(), strbuffer_len);)
}
uhd_error uhd_subdev_spec_last_error(
- uhd_subdev_spec_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+ uhd_subdev_spec_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
uhd::usrp::subdev_spec_pair_t uhd_subdev_spec_pair_c_to_cpp(
- const uhd_subdev_spec_pair_t *subdev_spec_pair_c
-){
- return uhd::usrp::subdev_spec_pair_t(subdev_spec_pair_c->db_name,
- subdev_spec_pair_c->sd_name);
+ const uhd_subdev_spec_pair_t* subdev_spec_pair_c)
+{
+ return uhd::usrp::subdev_spec_pair_t(
+ subdev_spec_pair_c->db_name, subdev_spec_pair_c->sd_name);
}
void uhd_subdev_spec_pair_cpp_to_c(
- const uhd::usrp::subdev_spec_pair_t &subdev_spec_pair_cpp,
- uhd_subdev_spec_pair_t *subdev_spec_pair_c
-){
+ const uhd::usrp::subdev_spec_pair_t& subdev_spec_pair_cpp,
+ uhd_subdev_spec_pair_t* subdev_spec_pair_c)
+{
subdev_spec_pair_c->db_name = strdup(subdev_spec_pair_cpp.db_name.c_str());
subdev_spec_pair_c->sd_name = strdup(subdev_spec_pair_cpp.sd_name.c_str());
}
diff --git a/host/lib/usrp/subdev_spec_python.hpp b/host/lib/usrp/subdev_spec_python.hpp
index 61a517a6f..ddcb86da2 100644
--- a/host/lib/usrp/subdev_spec_python.hpp
+++ b/host/lib/usrp/subdev_spec_python.hpp
@@ -15,20 +15,18 @@ void export_subdev_spec(py::module& m)
using subdev_spec_pair_t = uhd::usrp::subdev_spec_pair_t;
using subdev_spec_t = uhd::usrp::subdev_spec_t;
- py::class_<subdev_spec_pair_t> (m, "subdev_spec_pair")
- .def(py::init<const std::string&, const std::string &>())
+ py::class_<subdev_spec_pair_t>(m, "subdev_spec_pair")
+ .def(py::init<const std::string&, const std::string&>())
// Properties
.def_readwrite("db_name", &subdev_spec_pair_t::db_name)
- .def_readwrite("sd_name", &subdev_spec_pair_t::sd_name)
- ;
+ .def_readwrite("sd_name", &subdev_spec_pair_t::sd_name);
py::class_<subdev_spec_t>(m, "subdev_spec")
- .def(py::init<const std::string &>())
+ .def(py::init<const std::string&>())
// Methods
- .def("__str__", &subdev_spec_t::to_pp_string)
- .def("to_string", &subdev_spec_t::to_string)
- ;
+ .def("__str__", &subdev_spec_t::to_pp_string)
+ .def("to_string", &subdev_spec_t::to_string);
}
#endif /* INCLUDED_UHD_USRP_SUBDEV_SPEC_PYTHON_HPP */
diff --git a/host/lib/usrp/usrp1/codec_ctrl.cpp b/host/lib/usrp/usrp1/codec_ctrl.cpp
index a06ded707..c75b6e03a 100644
--- a/host/lib/usrp/usrp1/codec_ctrl.cpp
+++ b/host/lib/usrp/usrp1/codec_ctrl.cpp
@@ -7,17 +7,17 @@
#include "codec_ctrl.hpp"
#include "ad9862_regs.hpp"
-#include <uhd/utils/log.hpp>
-#include <uhd/utils/safe_call.hpp>
-#include <uhd/types/dict.hpp>
#include <uhd/exception.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/utils/algorithm.hpp>
#include <uhd/utils/byteswap.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <stdint.h>
+#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
#include <boost/math/special_functions/round.hpp>
#include <boost/math/special_functions/sign.hpp>
-#include <boost/assign/list_of.hpp>
#include <iomanip>
#include <tuple>
@@ -26,34 +26,36 @@ using namespace uhd;
const gain_range_t usrp1_codec_ctrl::tx_pga_gain_range(-20, 0, double(0.1));
const gain_range_t usrp1_codec_ctrl::rx_pga_gain_range(0, 20, 1);
-usrp1_codec_ctrl::~usrp1_codec_ctrl(void){
+usrp1_codec_ctrl::~usrp1_codec_ctrl(void)
+{
/* NOP */
}
/***********************************************************************
* Codec Control Implementation
**********************************************************************/
-class usrp1_codec_ctrl_impl : public usrp1_codec_ctrl {
+class usrp1_codec_ctrl_impl : public usrp1_codec_ctrl
+{
public:
- //structors
+ // structors
usrp1_codec_ctrl_impl(spi_iface::sptr iface, int spi_slave);
~usrp1_codec_ctrl_impl(void);
- //aux adc and dac control
+ // aux adc and dac control
double read_aux_adc(aux_adc_t which);
void write_aux_dac(aux_dac_t which, double volts);
- //duc control
+ // duc control
void set_duc_freq(double freq, double);
void enable_tx_digital(bool enb);
- //pga gain control
+ // pga gain control
void set_tx_pga_gain(double);
double get_tx_pga_gain(void);
void set_rx_pga_gain(double, char);
double get_rx_pga_gain(char);
-
- //rx adc buffer control
+
+ // rx adc buffer control
void bypass_adc_buffers(bool bypass);
private:
@@ -70,119 +72,136 @@ private:
/***********************************************************************
* Codec Control Structors
**********************************************************************/
-usrp1_codec_ctrl_impl::usrp1_codec_ctrl_impl(spi_iface::sptr iface, int spi_slave){
- _iface = iface;
+usrp1_codec_ctrl_impl::usrp1_codec_ctrl_impl(spi_iface::sptr iface, int spi_slave)
+{
+ _iface = iface;
_spi_slave = spi_slave;
- //soft reset
+ // soft reset
_ad9862_regs.soft_reset = 1;
this->send_reg(0);
- //initialize the codec register settings
+ // initialize the codec register settings
_ad9862_regs.sdio_bidir = ad9862_regs_t::SDIO_BIDIR_SDIO_SDO;
- _ad9862_regs.lsb_first = ad9862_regs_t::LSB_FIRST_MSB;
+ _ad9862_regs.lsb_first = ad9862_regs_t::LSB_FIRST_MSB;
_ad9862_regs.soft_reset = 0;
- //setup rx side of codec
+ // setup rx side of codec
_ad9862_regs.byp_buffer_a = 1;
_ad9862_regs.byp_buffer_b = 1;
- _ad9862_regs.buffer_a_pd = 1;
- _ad9862_regs.buffer_b_pd = 1;
- _ad9862_regs.rx_pga_a = 0;
- _ad9862_regs.rx_pga_b = 0;
+ _ad9862_regs.buffer_a_pd = 1;
+ _ad9862_regs.buffer_b_pd = 1;
+ _ad9862_regs.rx_pga_a = 0;
+ _ad9862_regs.rx_pga_b = 0;
_ad9862_regs.rx_twos_comp = 1;
- _ad9862_regs.rx_hilbert = ad9862_regs_t::RX_HILBERT_DIS;
-
- //setup tx side of codec
- _ad9862_regs.two_data_paths = ad9862_regs_t::TWO_DATA_PATHS_BOTH;
- _ad9862_regs.interleaved = ad9862_regs_t::INTERLEAVED_INTERLEAVED;
- _ad9862_regs.tx_pga_gain = 199;
- _ad9862_regs.tx_hilbert = ad9862_regs_t::TX_HILBERT_DIS;
- _ad9862_regs.interp = ad9862_regs_t::INTERP_4;
- _ad9862_regs.tx_twos_comp = 1;
- _ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_NCO;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
+ _ad9862_regs.rx_hilbert = ad9862_regs_t::RX_HILBERT_DIS;
+
+ // setup tx side of codec
+ _ad9862_regs.two_data_paths = ad9862_regs_t::TWO_DATA_PATHS_BOTH;
+ _ad9862_regs.interleaved = ad9862_regs_t::INTERLEAVED_INTERLEAVED;
+ _ad9862_regs.tx_pga_gain = 199;
+ _ad9862_regs.tx_hilbert = ad9862_regs_t::TX_HILBERT_DIS;
+ _ad9862_regs.interp = ad9862_regs_t::INTERP_4;
+ _ad9862_regs.tx_twos_comp = 1;
+ _ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_NCO;
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
_ad9862_regs.dac_a_coarse_gain = 0x3;
_ad9862_regs.dac_b_coarse_gain = 0x3;
- //setup the dll
+ // setup the dll
_ad9862_regs.input_clk_ctrl = ad9862_regs_t::INPUT_CLK_CTRL_EXTERNAL;
- _ad9862_regs.dll_mult = ad9862_regs_t::DLL_MULT_2;
- _ad9862_regs.dll_mode = ad9862_regs_t::DLL_MODE_FAST;
+ _ad9862_regs.dll_mult = ad9862_regs_t::DLL_MULT_2;
+ _ad9862_regs.dll_mode = ad9862_regs_t::DLL_MODE_FAST;
- //setup clockout
+ // setup clockout
_ad9862_regs.clkout2_div_factor = ad9862_regs_t::CLKOUT2_DIV_FACTOR_2;
- //write the register settings to the codec
+ // write the register settings to the codec
for (uint8_t addr = 0; addr <= 25; addr++) {
this->send_reg(addr);
}
- //always start conversions for aux ADC
+ // always start conversions for aux ADC
_ad9862_regs.start_a = 1;
_ad9862_regs.start_b = 1;
- //aux adc clock
+ // aux adc clock
_ad9862_regs.clk_4 = ad9862_regs_t::CLK_4_1_4;
this->send_reg(34);
}
-usrp1_codec_ctrl_impl::~usrp1_codec_ctrl_impl(void){UHD_SAFE_CALL(
- //set aux dacs to zero
- this->write_aux_dac(AUX_DAC_A, 0);
- this->write_aux_dac(AUX_DAC_B, 0);
- this->write_aux_dac(AUX_DAC_C, 0);
- this->write_aux_dac(AUX_DAC_D, 0);
-
- //power down
- _ad9862_regs.all_rx_pd = 1;
- this->send_reg(1);
- _ad9862_regs.tx_digital_pd = 1;
- _ad9862_regs.tx_analog_pd = ad9862_regs_t::TX_ANALOG_PD_BOTH;
- this->send_reg(8);
-)}
+usrp1_codec_ctrl_impl::~usrp1_codec_ctrl_impl(void)
+{
+ UHD_SAFE_CALL(
+ // set aux dacs to zero
+ this->write_aux_dac(AUX_DAC_A, 0); this->write_aux_dac(AUX_DAC_B, 0);
+ this->write_aux_dac(AUX_DAC_C, 0);
+ this->write_aux_dac(AUX_DAC_D, 0);
+
+ // power down
+ _ad9862_regs.all_rx_pd = 1;
+ this->send_reg(1);
+ _ad9862_regs.tx_digital_pd = 1;
+ _ad9862_regs.tx_analog_pd = ad9862_regs_t::TX_ANALOG_PD_BOTH;
+ this->send_reg(8);)
+}
/***********************************************************************
* Codec Control Gain Control Methods
**********************************************************************/
-static const int mtpgw = 255; //maximum tx pga gain word
+static const int mtpgw = 255; // maximum tx pga gain word
-void usrp1_codec_ctrl_impl::set_tx_pga_gain(double gain){
- int gain_word = int(mtpgw*(gain - tx_pga_gain_range.start())/(tx_pga_gain_range.stop() - tx_pga_gain_range.start()));
+void usrp1_codec_ctrl_impl::set_tx_pga_gain(double gain)
+{
+ int gain_word = int(mtpgw * (gain - tx_pga_gain_range.start())
+ / (tx_pga_gain_range.stop() - tx_pga_gain_range.start()));
_ad9862_regs.tx_pga_gain = uhd::clip(gain_word, 0, mtpgw);
this->send_reg(16);
}
-double usrp1_codec_ctrl_impl::get_tx_pga_gain(void){
- return (_ad9862_regs.tx_pga_gain*(tx_pga_gain_range.stop() - tx_pga_gain_range.start())/mtpgw) + tx_pga_gain_range.start();
+double usrp1_codec_ctrl_impl::get_tx_pga_gain(void)
+{
+ return (_ad9862_regs.tx_pga_gain
+ * (tx_pga_gain_range.stop() - tx_pga_gain_range.start()) / mtpgw)
+ + tx_pga_gain_range.start();
}
-static const int mrpgw = 0x14; //maximum rx pga gain word
+static const int mrpgw = 0x14; // maximum rx pga gain word
-void usrp1_codec_ctrl_impl::set_rx_pga_gain(double gain, char which){
- int gain_word = int(mrpgw*(gain - rx_pga_gain_range.start())/(rx_pga_gain_range.stop() - rx_pga_gain_range.start()));
- gain_word = uhd::clip(gain_word, 0, mrpgw);
- switch(which){
- case 'A':
- _ad9862_regs.rx_pga_a = gain_word;
- this->send_reg(2);
- return;
- case 'B':
- _ad9862_regs.rx_pga_b = gain_word;
- this->send_reg(3);
- return;
- default: UHD_THROW_INVALID_CODE_PATH();
+void usrp1_codec_ctrl_impl::set_rx_pga_gain(double gain, char which)
+{
+ int gain_word = int(mrpgw * (gain - rx_pga_gain_range.start())
+ / (rx_pga_gain_range.stop() - rx_pga_gain_range.start()));
+ gain_word = uhd::clip(gain_word, 0, mrpgw);
+ switch (which) {
+ case 'A':
+ _ad9862_regs.rx_pga_a = gain_word;
+ this->send_reg(2);
+ return;
+ case 'B':
+ _ad9862_regs.rx_pga_b = gain_word;
+ this->send_reg(3);
+ return;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-double usrp1_codec_ctrl_impl::get_rx_pga_gain(char which){
+double usrp1_codec_ctrl_impl::get_rx_pga_gain(char which)
+{
int gain_word;
- switch(which){
- case 'A': gain_word = _ad9862_regs.rx_pga_a; break;
- case 'B': gain_word = _ad9862_regs.rx_pga_b; break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ switch (which) {
+ case 'A':
+ gain_word = _ad9862_regs.rx_pga_a;
+ break;
+ case 'B':
+ gain_word = _ad9862_regs.rx_pga_b;
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
- return (gain_word*(rx_pga_gain_range.stop() - rx_pga_gain_range.start())/mrpgw) + rx_pga_gain_range.start();
+ return (gain_word * (rx_pga_gain_range.stop() - rx_pga_gain_range.start()) / mrpgw)
+ + rx_pga_gain_range.start();
}
/***********************************************************************
@@ -190,38 +209,43 @@ double usrp1_codec_ctrl_impl::get_rx_pga_gain(char which){
**********************************************************************/
static double aux_adc_to_volts(uint8_t high, uint8_t low)
{
- return double(((uint16_t(high) << 2) | low)*3.3)/0x3ff;
+ return double(((uint16_t(high) << 2) | low) * 3.3) / 0x3ff;
}
-double usrp1_codec_ctrl_impl::read_aux_adc(aux_adc_t which){
- switch(which){
- case AUX_ADC_A1:
- _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC1;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(28); //read the value (2 bytes, 2 reads)
- this->recv_reg(29);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_a1_9_2, _ad9862_regs.aux_adc_a1_1_0);
-
- case AUX_ADC_A2:
- _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC2;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(26); //read the value (2 bytes, 2 reads)
- this->recv_reg(27);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_a2_9_2, _ad9862_regs.aux_adc_a2_1_0);
-
- case AUX_ADC_B1:
- _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC1;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(32); //read the value (2 bytes, 2 reads)
- this->recv_reg(33);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_b1_9_2, _ad9862_regs.aux_adc_b1_1_0);
-
- case AUX_ADC_B2:
- _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC2;
- this->send_reg(34); //start conversion and select mux
- this->recv_reg(30); //read the value (2 bytes, 2 reads)
- this->recv_reg(31);
- return aux_adc_to_volts(_ad9862_regs.aux_adc_b2_9_2, _ad9862_regs.aux_adc_b2_1_0);
+double usrp1_codec_ctrl_impl::read_aux_adc(aux_adc_t which)
+{
+ switch (which) {
+ case AUX_ADC_A1:
+ _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC1;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(28); // read the value (2 bytes, 2 reads)
+ this->recv_reg(29);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_a1_9_2, _ad9862_regs.aux_adc_a1_1_0);
+
+ case AUX_ADC_A2:
+ _ad9862_regs.select_a = ad9862_regs_t::SELECT_A_AUX_ADC2;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(26); // read the value (2 bytes, 2 reads)
+ this->recv_reg(27);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_a2_9_2, _ad9862_regs.aux_adc_a2_1_0);
+
+ case AUX_ADC_B1:
+ _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC1;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(32); // read the value (2 bytes, 2 reads)
+ this->recv_reg(33);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_b1_9_2, _ad9862_regs.aux_adc_b1_1_0);
+
+ case AUX_ADC_B2:
+ _ad9862_regs.select_b = ad9862_regs_t::SELECT_B_AUX_ADC2;
+ this->send_reg(34); // start conversion and select mux
+ this->recv_reg(30); // read the value (2 bytes, 2 reads)
+ this->recv_reg(31);
+ return aux_adc_to_volts(
+ _ad9862_regs.aux_adc_b2_9_2, _ad9862_regs.aux_adc_b2_1_0);
}
UHD_THROW_INVALID_CODE_PATH();
}
@@ -231,32 +255,31 @@ double usrp1_codec_ctrl_impl::read_aux_adc(aux_adc_t which){
**********************************************************************/
void usrp1_codec_ctrl_impl::write_aux_dac(aux_dac_t which, double volts)
{
- //special case for aux dac d (aka sigma delta word)
+ // special case for aux dac d (aka sigma delta word)
if (which == AUX_DAC_D) {
- uint16_t dac_word = uhd::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff);
+ uint16_t dac_word = uhd::clip(boost::math::iround(volts * 0xfff / 3.3), 0, 0xfff);
_ad9862_regs.sig_delt_11_4 = uint8_t(dac_word >> 4);
- _ad9862_regs.sig_delt_3_0 = uint8_t(dac_word & 0xf);
+ _ad9862_regs.sig_delt_3_0 = uint8_t(dac_word & 0xf);
this->send_reg(42);
this->send_reg(43);
return;
}
- //calculate the dac word for aux dac a, b, c
- uint8_t dac_word = uhd::clip(boost::math::iround(volts*0xff/3.3), 0, 0xff);
+ // calculate the dac word for aux dac a, b, c
+ uint8_t dac_word = uhd::clip(boost::math::iround(volts * 0xff / 3.3), 0, 0xff);
- //setup a lookup table for the aux dac params (reg ref, reg addr)
+ // setup a lookup table for the aux dac params (reg ref, reg addr)
typedef std::tuple<uint8_t*, uint8_t> dac_params_t;
- uhd::dict<aux_dac_t, dac_params_t> aux_dac_to_params = boost::assign::map_list_of
- (AUX_DAC_A, dac_params_t(&_ad9862_regs.aux_dac_a, 36))
- (AUX_DAC_B, dac_params_t(&_ad9862_regs.aux_dac_b, 37))
- (AUX_DAC_C, dac_params_t(&_ad9862_regs.aux_dac_c, 38))
- ;
+ uhd::dict<aux_dac_t, dac_params_t> aux_dac_to_params =
+ boost::assign::map_list_of(AUX_DAC_A, dac_params_t(&_ad9862_regs.aux_dac_a, 36))(
+ AUX_DAC_B, dac_params_t(&_ad9862_regs.aux_dac_b, 37))(
+ AUX_DAC_C, dac_params_t(&_ad9862_regs.aux_dac_c, 38));
- //set the aux dac register
+ // set the aux dac register
UHD_ASSERT_THROW(aux_dac_to_params.has_key(which));
uint8_t *reg_ref, reg_addr;
std::tie(reg_ref, reg_addr) = aux_dac_to_params[which];
- *reg_ref = dac_word;
+ *reg_ref = dac_word;
this->send_reg(reg_addr);
}
@@ -267,76 +290,62 @@ void usrp1_codec_ctrl_impl::send_reg(uint8_t addr)
{
uint32_t reg = _ad9862_regs.get_write_reg(addr);
- UHD_LOGGER_TRACE("USRP1")
- << "codec control write reg: 0x"
- << std::setw(8) << std::hex << reg
- ;
- _iface->write_spi(_spi_slave,
- spi_config_t::EDGE_RISE, reg, 16);
+ UHD_LOGGER_TRACE("USRP1") << "codec control write reg: 0x" << std::setw(8) << std::hex
+ << reg;
+ _iface->write_spi(_spi_slave, spi_config_t::EDGE_RISE, reg, 16);
}
void usrp1_codec_ctrl_impl::recv_reg(uint8_t addr)
{
uint32_t reg = _ad9862_regs.get_read_reg(addr);
- UHD_LOGGER_TRACE("USRP1")
- << "codec control read reg: 0x"
- << std::setw(8) << std::hex << reg
- ;
+ UHD_LOGGER_TRACE("USRP1") << "codec control read reg: 0x" << std::setw(8) << std::hex
+ << reg;
- uint32_t ret = _iface->read_spi(_spi_slave,
- spi_config_t::EDGE_RISE, reg, 16);
+ uint32_t ret = _iface->read_spi(_spi_slave, spi_config_t::EDGE_RISE, reg, 16);
- UHD_LOGGER_TRACE("USRP1")
- << "codec control read ret: 0x"
- << std::setw(8) << std::hex << ret
- ;
+ UHD_LOGGER_TRACE("USRP1") << "codec control read ret: 0x" << std::setw(8) << std::hex
+ << ret;
_ad9862_regs.set_reg(addr, uint16_t(ret));
}
/***********************************************************************
- * DUC tuning
+ * DUC tuning
**********************************************************************/
double usrp1_codec_ctrl_impl::coarse_tune(double codec_rate, double freq)
{
double coarse_freq;
- double coarse_freq_1 = codec_rate / 8;
- double coarse_freq_2 = codec_rate / 4;
+ double coarse_freq_1 = codec_rate / 8;
+ double coarse_freq_2 = codec_rate / 4;
double coarse_limit_1 = coarse_freq_1 / 2;
double coarse_limit_2 = (coarse_freq_1 + coarse_freq_2) / 2;
- double max_freq = coarse_freq_2 + .09375 * codec_rate;
-
+ double max_freq = coarse_freq_2 + .09375 * codec_rate;
+
if (freq < -max_freq) {
return false;
- }
- else if (freq < -coarse_limit_2) {
+ } else if (freq < -coarse_limit_2) {
_ad9862_regs.neg_coarse_tune = ad9862_regs_t::NEG_COARSE_TUNE_NEG_SHIFT;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_4;
- coarse_freq = -coarse_freq_2;
- }
- else if (freq < -coarse_limit_1) {
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_4;
+ coarse_freq = -coarse_freq_2;
+ } else if (freq < -coarse_limit_1) {
_ad9862_regs.neg_coarse_tune = ad9862_regs_t::NEG_COARSE_TUNE_NEG_SHIFT;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_8;
- coarse_freq = -coarse_freq_1;
- }
- else if (freq < coarse_limit_1) {
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_8;
+ coarse_freq = -coarse_freq_1;
+ } else if (freq < coarse_limit_1) {
_ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
- coarse_freq = 0;
- }
- else if (freq < coarse_limit_2) {
+ coarse_freq = 0;
+ } else if (freq < coarse_limit_2) {
_ad9862_regs.neg_coarse_tune = ad9862_regs_t::NEG_COARSE_TUNE_POS_SHIFT;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_8;
- coarse_freq = coarse_freq_1;
- }
- else if (freq <= max_freq) {
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_8;
+ coarse_freq = coarse_freq_1;
+ } else if (freq <= max_freq) {
_ad9862_regs.neg_coarse_tune = ad9862_regs_t::NEG_COARSE_TUNE_POS_SHIFT;
- _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_4;
- coarse_freq = coarse_freq_2;
- }
- else {
- return 0;
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_FDAC_4;
+ coarse_freq = coarse_freq_2;
+ } else {
+ return 0;
}
return coarse_freq;
@@ -346,23 +355,22 @@ double usrp1_codec_ctrl_impl::fine_tune(double codec_rate, double target_freq)
{
static const double scale_factor = std::pow(2.0, 24);
- uint32_t freq_word = uint32_t(
- boost::math::round(std::abs((target_freq / codec_rate) * scale_factor)));
+ uint32_t freq_word =
+ uint32_t(boost::math::round(std::abs((target_freq / codec_rate) * scale_factor)));
double actual_freq = freq_word * codec_rate / scale_factor;
if (target_freq < 0) {
_ad9862_regs.neg_fine_tune = ad9862_regs_t::NEG_FINE_TUNE_NEG_SHIFT;
- actual_freq = -actual_freq;
- }
- else {
+ actual_freq = -actual_freq;
+ } else {
_ad9862_regs.neg_fine_tune = ad9862_regs_t::NEG_FINE_TUNE_POS_SHIFT;
- }
+ }
_ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_NCO;
_ad9862_regs.ftw_23_16 = (freq_word >> 16) & 0xff;
- _ad9862_regs.ftw_15_8 = (freq_word >> 8) & 0xff;
- _ad9862_regs.ftw_7_0 = (freq_word >> 0) & 0xff;
+ _ad9862_regs.ftw_15_8 = (freq_word >> 8) & 0xff;
+ _ad9862_regs.ftw_7_0 = (freq_word >> 0) & 0xff;
return actual_freq;
}
@@ -371,22 +379,20 @@ void usrp1_codec_ctrl_impl::set_duc_freq(double freq, double rate)
{
double codec_rate = rate * 2;
- //correct for outside of rate (wrap around)
+ // correct for outside of rate (wrap around)
freq = std::fmod(freq, rate);
- if (std::abs(freq) > rate/2.0)
- freq -= boost::math::sign(freq)*rate;
+ if (std::abs(freq) > rate / 2.0)
+ freq -= boost::math::sign(freq) * rate;
double coarse_freq = coarse_tune(codec_rate, freq);
- double fine_freq = fine_tune(codec_rate / 4, freq - coarse_freq);
+ double fine_freq = fine_tune(codec_rate / 4, freq - coarse_freq);
- UHD_LOGGER_DEBUG("USRP1")
- << "ad9862 tuning result:"
- << " requested: " << freq
- << " actual: " << coarse_freq + fine_freq
- << " coarse freq: " << coarse_freq
- << " fine freq: " << fine_freq
- << " codec rate: " << codec_rate
- ;
+ UHD_LOGGER_DEBUG("USRP1") << "ad9862 tuning result:"
+ << " requested: " << freq
+ << " actual: " << coarse_freq + fine_freq
+ << " coarse freq: " << coarse_freq
+ << " fine freq: " << fine_freq
+ << " codec rate: " << codec_rate;
this->send_reg(20);
this->send_reg(21);
@@ -394,8 +400,9 @@ void usrp1_codec_ctrl_impl::set_duc_freq(double freq, double rate)
this->send_reg(23);
}
-void usrp1_codec_ctrl_impl::enable_tx_digital(bool enb){
- _ad9862_regs.tx_digital_pd = (enb)? 0 : 1;
+void usrp1_codec_ctrl_impl::enable_tx_digital(bool enb)
+{
+ _ad9862_regs.tx_digital_pd = (enb) ? 0 : 1;
this->send_reg(8);
}
@@ -404,7 +411,8 @@ void usrp1_codec_ctrl_impl::enable_tx_digital(bool enb){
* Disable this for AC-coupled daughterboards (TVRX)
* By default it is initialized TRUE.
**********************************************************************/
-void usrp1_codec_ctrl_impl::bypass_adc_buffers(bool bypass) {
+void usrp1_codec_ctrl_impl::bypass_adc_buffers(bool bypass)
+{
_ad9862_regs.byp_buffer_a = bypass;
_ad9862_regs.byp_buffer_b = bypass;
this->send_reg(2);
@@ -413,8 +421,7 @@ void usrp1_codec_ctrl_impl::bypass_adc_buffers(bool bypass) {
/***********************************************************************
* Codec Control Make
**********************************************************************/
-usrp1_codec_ctrl::sptr usrp1_codec_ctrl::make(spi_iface::sptr iface,
- int spi_slave)
+usrp1_codec_ctrl::sptr usrp1_codec_ctrl::make(spi_iface::sptr iface, int spi_slave)
{
return sptr(new usrp1_codec_ctrl_impl(iface, spi_slave));
}
diff --git a/host/lib/usrp/usrp1/codec_ctrl.hpp b/host/lib/usrp/usrp1/codec_ctrl.hpp
index c03947673..ab0924aa0 100644
--- a/host/lib/usrp/usrp1/codec_ctrl.hpp
+++ b/host/lib/usrp/usrp1/codec_ctrl.hpp
@@ -8,8 +8,8 @@
#ifndef INCLUDED_USRP1_CODEC_CTRL_HPP
#define INCLUDED_USRP1_CODEC_CTRL_HPP
-#include <uhd/types/serial.hpp>
#include <uhd/types/ranges.hpp>
+#include <uhd/types/serial.hpp>
#include <uhd/utils/noncopyable.hpp>
#include <memory>
@@ -18,7 +18,8 @@
* - Init/power down codec.
* - Read aux adc, write aux dac.
*/
-class usrp1_codec_ctrl : uhd::noncopyable{
+class usrp1_codec_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<usrp1_codec_ctrl> sptr;
@@ -35,7 +36,7 @@ public:
static sptr make(uhd::spi_iface::sptr iface, int spi_slave);
//! aux adc identifier constants
- enum aux_adc_t{
+ enum aux_adc_t {
AUX_ADC_A2 = 0xA2,
AUX_ADC_A1 = 0xA1,
AUX_ADC_B2 = 0xB2,
@@ -52,12 +53,7 @@ public:
virtual double read_aux_adc(aux_adc_t which) = 0;
//! aux dac identifier constants
- enum aux_dac_t{
- AUX_DAC_A = 0xA,
- AUX_DAC_B = 0xB,
- AUX_DAC_C = 0xC,
- AUX_DAC_D = 0xD
- };
+ enum aux_dac_t { AUX_DAC_A = 0xA, AUX_DAC_B = 0xB, AUX_DAC_C = 0xC, AUX_DAC_D = 0xD };
/*!
* Write an auxiliary dac.
diff --git a/host/lib/usrp/usrp1/dboard_iface.cpp b/host/lib/usrp/usrp1/dboard_iface.cpp
index 2f295b22b..8ad7a5466 100644
--- a/host/lib/usrp/usrp1/dboard_iface.cpp
+++ b/host/lib/usrp/usrp1/dboard_iface.cpp
@@ -5,33 +5,33 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "codec_ctrl.hpp"
#include "usrp1_iface.hpp"
#include "usrp1_impl.hpp"
-#include "codec_ctrl.hpp"
-#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/types/dict.hpp>
+#include <uhd/usrp/dboard_iface.hpp>
#include <uhd/utils/assert_has.hpp>
#include <boost/assign/list_of.hpp>
#include <iostream>
-#define FR_OE_0 5
-#define FR_OE_1 6
-#define FR_OE_2 7
-#define FR_OE_3 8
+#define FR_OE_0 5
+#define FR_OE_1 6
+#define FR_OE_2 7
+#define FR_OE_3 8
-#define FR_ATR_MASK_0 20
+#define FR_ATR_MASK_0 20
#define FR_ATR_TXVAL_0 21
#define FR_ATR_RXVAL_0 22
-#define FR_ATR_MASK_1 23
+#define FR_ATR_MASK_1 23
#define FR_ATR_TXVAL_1 24
#define FR_ATR_RXVAL_1 25
-#define FR_ATR_MASK_2 26
+#define FR_ATR_MASK_2 26
#define FR_ATR_TXVAL_2 27
#define FR_ATR_RXVAL_2 28
-#define FR_ATR_MASK_3 29
+#define FR_ATR_MASK_3 29
#define FR_ATR_TXVAL_3 30
#define FR_ATR_RXVAL_3 31
@@ -41,14 +41,14 @@
// i/o registers for pins that go to daughterboards.
// top 16 is a mask, low 16 is value
-#define FR_IO_0 9 // slot 0
-#define FR_IO_1 10
-#define FR_IO_2 11
-#define FR_IO_3 12
-#define SPI_ENABLE_TX_A 0x10 // select d'board TX A
-#define SPI_ENABLE_RX_A 0x20 // select d'board RX A
-#define SPI_ENABLE_TX_B 0x40 // select d'board TX B
-#define SPI_ENABLE_RX_B 0x80 // select d'board RX B
+#define FR_IO_0 9 // slot 0
+#define FR_IO_1 10
+#define FR_IO_2 11
+#define FR_IO_3 12
+#define SPI_ENABLE_TX_A 0x10 // select d'board TX A
+#define SPI_ENABLE_RX_A 0x20 // select d'board RX A
+#define SPI_ENABLE_TX_B 0x40 // select d'board TX B
+#define SPI_ENABLE_RX_B 0x80 // select d'board RX B
using namespace uhd;
@@ -58,27 +58,27 @@ using namespace boost::assign;
static const dboard_id_t tvrx_id(0x0040);
-class usrp1_dboard_iface : public dboard_iface {
+class usrp1_dboard_iface : public dboard_iface
+{
public:
-
usrp1_dboard_iface(usrp1_iface::sptr iface,
- usrp1_codec_ctrl::sptr codec,
- usrp1_impl::dboard_slot_t dboard_slot,
- const double &master_clock_rate,
- const dboard_id_t &rx_dboard_id
- ):
- _dboard_slot(dboard_slot),
- _master_clock_rate(master_clock_rate),
- _rx_dboard_id(rx_dboard_id)
+ usrp1_codec_ctrl::sptr codec,
+ usrp1_impl::dboard_slot_t dboard_slot,
+ const double& master_clock_rate,
+ const dboard_id_t& rx_dboard_id)
+ : _dboard_slot(dboard_slot)
+ , _master_clock_rate(master_clock_rate)
+ , _rx_dboard_id(rx_dboard_id)
{
_iface = iface;
_codec = codec;
_dbsrx_classic_div = 1;
- //yes this is evil but it's necessary for TVRX to work on USRP1
- if(_rx_dboard_id == tvrx_id) _codec->bypass_adc_buffers(false);
- //else _codec->bypass_adc_buffers(false); //don't think this is necessary
+ // yes this is evil but it's necessary for TVRX to work on USRP1
+ if (_rx_dboard_id == tvrx_id)
+ _codec->bypass_adc_buffers(false);
+ // else _codec->bypass_adc_buffers(false); //don't think this is necessary
}
~usrp1_dboard_iface()
@@ -90,7 +90,7 @@ public:
{
special_props_t props;
props.soft_clock_divider = true;
- props.mangle_i2c_addrs = (_dboard_slot == usrp1_impl::DBOARD_SLOT_B);
+ props.mangle_i2c_addrs = (_dboard_slot == usrp1_impl::DBOARD_SLOT_B);
return props;
}
@@ -99,7 +99,8 @@ public:
void set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_pin_ctrl(unit_t unit);
- void set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
+ void set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_atr_reg(unit_t unit, atr_reg_t reg);
void set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_gpio_ddr(unit_t unit);
@@ -115,49 +116,45 @@ public:
void set_command_time(const uhd::time_spec_t& t);
uhd::time_spec_t get_command_time(void);
- void write_i2c(uint16_t, const byte_vector_t &);
+ void write_i2c(uint16_t, const byte_vector_t&);
byte_vector_t read_i2c(uint16_t, size_t);
- void write_spi(unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits);
+ void write_spi(
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
- uint32_t read_write_spi(unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits);
+ uint32_t read_write_spi(
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
void set_clock_rate(unit_t, double);
std::vector<double> get_clock_rates(unit_t);
double get_clock_rate(unit_t);
void set_clock_enabled(unit_t, bool);
double get_codec_rate(unit_t);
- void set_fe_connection(unit_t unit, const std::string&, const fe_connection_t& fe_conn);
+ void set_fe_connection(
+ unit_t unit, const std::string&, const fe_connection_t& fe_conn);
private:
usrp1_iface::sptr _iface;
usrp1_codec_ctrl::sptr _codec;
unsigned _dbsrx_classic_div;
const usrp1_impl::dboard_slot_t _dboard_slot;
- const double &_master_clock_rate;
+ const double& _master_clock_rate;
const dboard_id_t _rx_dboard_id;
uhd::dict<unit_t, uint16_t> _pin_ctrl, _gpio_out, _gpio_ddr;
- uhd::dict<unit_t, uhd::dict<atr_reg_t, uint16_t> > _atr_regs;
+ uhd::dict<unit_t, uhd::dict<atr_reg_t, uint16_t>> _atr_regs;
};
/***********************************************************************
* Make Function
**********************************************************************/
dboard_iface::sptr usrp1_impl::make_dboard_iface(usrp1_iface::sptr iface,
- usrp1_codec_ctrl::sptr codec,
- usrp1_impl::dboard_slot_t dboard_slot,
- const double &master_clock_rate,
- const dboard_id_t &rx_dboard_id
-){
+ usrp1_codec_ctrl::sptr codec,
+ usrp1_impl::dboard_slot_t dboard_slot,
+ const double& master_clock_rate,
+ const dboard_id_t& rx_dboard_id)
+{
return dboard_iface::sptr(new usrp1_dboard_iface(
- iface, codec, dboard_slot, master_clock_rate, rx_dboard_id
- ));
+ iface, codec, dboard_slot, master_clock_rate, rx_dboard_id));
}
/***********************************************************************
@@ -175,16 +172,16 @@ void usrp1_dboard_iface::set_clock_rate(unit_t unit, double rate)
{
assert_has(this->get_clock_rates(unit), rate, "dboard clock rate");
- if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id){
- _dbsrx_classic_div = size_t(_master_clock_rate/rate);
- switch(_dboard_slot){
- case usrp1_impl::DBOARD_SLOT_A:
- _iface->poke32(FR_RX_A_REFCLK, (_dbsrx_classic_div & 0x7f) | 0x80);
- break;
+ if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id) {
+ _dbsrx_classic_div = size_t(_master_clock_rate / rate);
+ switch (_dboard_slot) {
+ case usrp1_impl::DBOARD_SLOT_A:
+ _iface->poke32(FR_RX_A_REFCLK, (_dbsrx_classic_div & 0x7f) | 0x80);
+ break;
- case usrp1_impl::DBOARD_SLOT_B:
- _iface->poke32(FR_RX_B_REFCLK, (_dbsrx_classic_div & 0x7f) | 0x80);
- break;
+ case usrp1_impl::DBOARD_SLOT_B:
+ _iface->poke32(FR_RX_B_REFCLK, (_dbsrx_classic_div & 0x7f) | 0x80);
+ break;
}
}
}
@@ -192,11 +189,10 @@ void usrp1_dboard_iface::set_clock_rate(unit_t unit, double rate)
std::vector<double> usrp1_dboard_iface::get_clock_rates(unit_t unit)
{
std::vector<double> rates;
- if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id){
+ if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id) {
for (size_t div = 1; div <= 127; div++)
rates.push_back(_master_clock_rate / div);
- }
- else{
+ } else {
rates.push_back(_master_clock_rate);
}
return rates;
@@ -204,18 +200,19 @@ std::vector<double> usrp1_dboard_iface::get_clock_rates(unit_t unit)
double usrp1_dboard_iface::get_clock_rate(unit_t unit)
{
- if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id){
- return _master_clock_rate/_dbsrx_classic_div;
+ if (unit == UNIT_RX && _rx_dboard_id == dbsrx_classic_id) {
+ return _master_clock_rate / _dbsrx_classic_div;
}
return _master_clock_rate;
}
void usrp1_dboard_iface::set_clock_enabled(unit_t, bool)
{
- //TODO we can only enable for special case anyway...
+ // TODO we can only enable for special case anyway...
}
-double usrp1_dboard_iface::get_codec_rate(unit_t){
+double usrp1_dboard_iface::get_codec_rate(unit_t)
+{
return _master_clock_rate;
}
@@ -223,40 +220,60 @@ double usrp1_dboard_iface::get_codec_rate(unit_t){
* GPIO
**********************************************************************/
template <typename T>
-static T shadow_it(T &shadow, const T &value, const T &mask){
+static T shadow_it(T& shadow, const T& value, const T& mask)
+{
shadow = (shadow & ~mask) | (value & mask);
return shadow;
}
-void usrp1_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask){
- _set_pin_ctrl(unit, shadow_it(_pin_ctrl[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
+void usrp1_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask)
+{
+ _set_pin_ctrl(unit,
+ shadow_it(
+ _pin_ctrl[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
}
-uint32_t usrp1_dboard_iface::get_pin_ctrl(unit_t unit){
+uint32_t usrp1_dboard_iface::get_pin_ctrl(unit_t unit)
+{
return _pin_ctrl[unit];
}
-void usrp1_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask){
- _set_atr_reg(unit, reg, shadow_it(_atr_regs[unit][reg], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
+void usrp1_dboard_iface::set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask)
+{
+ _set_atr_reg(unit,
+ reg,
+ shadow_it(_atr_regs[unit][reg],
+ static_cast<uint16_t>(value),
+ static_cast<uint16_t>(mask)));
}
-uint32_t usrp1_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg){
+uint32_t usrp1_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg)
+{
return _atr_regs[unit][reg];
}
-void usrp1_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask){
- _set_gpio_ddr(unit, shadow_it(_gpio_ddr[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
+void usrp1_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask)
+{
+ _set_gpio_ddr(unit,
+ shadow_it(
+ _gpio_ddr[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
}
-uint32_t usrp1_dboard_iface::get_gpio_ddr(unit_t unit){
+uint32_t usrp1_dboard_iface::get_gpio_ddr(unit_t unit)
+{
return _gpio_ddr[unit];
}
-void usrp1_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask){
- _set_gpio_out(unit, shadow_it(_gpio_out[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
+void usrp1_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask)
+{
+ _set_gpio_out(unit,
+ shadow_it(
+ _gpio_out[unit], static_cast<uint16_t>(value), static_cast<uint16_t>(mask)));
}
-uint32_t usrp1_dboard_iface::get_gpio_out(unit_t unit){
+uint32_t usrp1_dboard_iface::get_gpio_out(unit_t unit)
+{
return _gpio_out[unit];
}
@@ -271,110 +288,115 @@ uint32_t usrp1_dboard_iface::read_gpio(unit_t unit)
else
UHD_THROW_INVALID_CODE_PATH();
- switch(unit) {
- case UNIT_RX:
- return (uint32_t)((out_value >> 16) & 0x0000ffff);
- case UNIT_TX:
- return (uint32_t)((out_value >> 0) & 0x0000ffff);
- default: UHD_THROW_INVALID_CODE_PATH();
+ switch (unit) {
+ case UNIT_RX:
+ return (uint32_t)((out_value >> 16) & 0x0000ffff);
+ case UNIT_TX:
+ return (uint32_t)((out_value >> 0) & 0x0000ffff);
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
UHD_ASSERT_THROW(false);
}
void usrp1_dboard_iface::_set_pin_ctrl(unit_t unit, uint16_t value)
{
- switch(unit) {
- case UNIT_RX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_MASK_1, value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_MASK_3, value);
- break;
- case UNIT_TX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_MASK_0, value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_MASK_2, value);
- break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ switch (unit) {
+ case UNIT_RX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_MASK_1, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_MASK_3, value);
+ break;
+ case UNIT_TX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_MASK_0, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_MASK_2, value);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
void usrp1_dboard_iface::_set_gpio_ddr(unit_t unit, uint16_t value)
{
- switch(unit) {
- case UNIT_RX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_OE_1, 0xffff0000 | value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_OE_3, 0xffff0000 | value);
- break;
- case UNIT_TX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_OE_0, 0xffff0000 | value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_OE_2, 0xffff0000 | value);
- break;
- default: UHD_THROW_INVALID_CODE_PATH();
- }
-}
-
-void usrp1_dboard_iface::_set_gpio_out(unit_t unit, uint16_t value)
-{
- switch(unit) {
- case UNIT_RX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_IO_1, 0xffff0000 | value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_IO_3, 0xffff0000 | value);
- break;
- case UNIT_TX:
- if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_IO_0, 0xffff0000 | value);
- else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_IO_2, 0xffff0000 | value);
- break;
- default: UHD_THROW_INVALID_CODE_PATH();
- }
-}
-
-void usrp1_dboard_iface::_set_atr_reg(unit_t unit,
- atr_reg_t atr, uint16_t value)
-{
- // Ignore unsupported states
- if ((atr == ATR_REG_IDLE) || (atr == ATR_REG_TX_ONLY))
- return;
- if(atr == ATR_REG_RX_ONLY) {
- switch(unit) {
+ switch (unit) {
case UNIT_RX:
if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_RXVAL_1, value);
+ _iface->poke32(FR_OE_1, 0xffff0000 | value);
else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_RXVAL_3, value);
+ _iface->poke32(FR_OE_3, 0xffff0000 | value);
break;
case UNIT_TX:
if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_RXVAL_0, value);
+ _iface->poke32(FR_OE_0, 0xffff0000 | value);
else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_RXVAL_2, value);
+ _iface->poke32(FR_OE_2, 0xffff0000 | value);
break;
- default: UHD_THROW_INVALID_CODE_PATH();
- }
- } else if (atr == ATR_REG_FULL_DUPLEX) {
- switch(unit) {
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+
+void usrp1_dboard_iface::_set_gpio_out(unit_t unit, uint16_t value)
+{
+ switch (unit) {
case UNIT_RX:
if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_TXVAL_1, value);
+ _iface->poke32(FR_IO_1, 0xffff0000 | value);
else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_TXVAL_3, value);
+ _iface->poke32(FR_IO_3, 0xffff0000 | value);
break;
case UNIT_TX:
if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
- _iface->poke32(FR_ATR_TXVAL_0, value);
+ _iface->poke32(FR_IO_0, 0xffff0000 | value);
else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
- _iface->poke32(FR_ATR_TXVAL_2, value);
+ _iface->poke32(FR_IO_2, 0xffff0000 | value);
break;
- default: UHD_THROW_INVALID_CODE_PATH();
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+
+void usrp1_dboard_iface::_set_atr_reg(unit_t unit, atr_reg_t atr, uint16_t value)
+{
+ // Ignore unsupported states
+ if ((atr == ATR_REG_IDLE) || (atr == ATR_REG_TX_ONLY))
+ return;
+ if (atr == ATR_REG_RX_ONLY) {
+ switch (unit) {
+ case UNIT_RX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_RXVAL_1, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_RXVAL_3, value);
+ break;
+ case UNIT_TX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_RXVAL_0, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_RXVAL_2, value);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
+ }
+ } else if (atr == ATR_REG_FULL_DUPLEX) {
+ switch (unit) {
+ case UNIT_RX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_TXVAL_1, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_TXVAL_3, value);
+ break;
+ case UNIT_TX:
+ if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
+ _iface->poke32(FR_ATR_TXVAL_0, value);
+ else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
+ _iface->poke32(FR_ATR_TXVAL_2, value);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
}
@@ -387,59 +409,52 @@ void usrp1_dboard_iface::_set_atr_reg(unit_t unit,
* \param slot the side (A or B) the dboard is attached
* \return the slave device number
*/
-static uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit,
- usrp1_impl::dboard_slot_t slot)
+static uint32_t unit_to_otw_spi_dev(
+ dboard_iface::unit_t unit, usrp1_impl::dboard_slot_t slot)
{
- switch(unit) {
- case dboard_iface::UNIT_TX:
- if (slot == usrp1_impl::DBOARD_SLOT_A)
- return SPI_ENABLE_TX_A;
- else if (slot == usrp1_impl::DBOARD_SLOT_B)
- return SPI_ENABLE_TX_B;
- else
- break;
- case dboard_iface::UNIT_RX:
- if (slot == usrp1_impl::DBOARD_SLOT_A)
- return SPI_ENABLE_RX_A;
- else if (slot == usrp1_impl::DBOARD_SLOT_B)
- return SPI_ENABLE_RX_B;
- else
+ switch (unit) {
+ case dboard_iface::UNIT_TX:
+ if (slot == usrp1_impl::DBOARD_SLOT_A)
+ return SPI_ENABLE_TX_A;
+ else if (slot == usrp1_impl::DBOARD_SLOT_B)
+ return SPI_ENABLE_TX_B;
+ else
+ break;
+ case dboard_iface::UNIT_RX:
+ if (slot == usrp1_impl::DBOARD_SLOT_A)
+ return SPI_ENABLE_RX_A;
+ else if (slot == usrp1_impl::DBOARD_SLOT_B)
+ return SPI_ENABLE_RX_B;
+ else
+ break;
+ default:
break;
- default:
- break;
}
UHD_THROW_INVALID_CODE_PATH();
}
-void usrp1_dboard_iface::write_spi(unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits)
+void usrp1_dboard_iface::write_spi(
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
{
- _iface->write_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
- config, data, num_bits);
+ _iface->write_spi(unit_to_otw_spi_dev(unit, _dboard_slot), config, data, num_bits);
}
-uint32_t usrp1_dboard_iface::read_write_spi(unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits)
+uint32_t usrp1_dboard_iface::read_write_spi(
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
{
- return _iface->read_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
- config, data, num_bits);
+ return _iface->read_spi(
+ unit_to_otw_spi_dev(unit, _dboard_slot), config, data, num_bits);
}
/***********************************************************************
* I2C
**********************************************************************/
-void usrp1_dboard_iface::write_i2c(uint16_t addr,
- const byte_vector_t &bytes)
+void usrp1_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t& bytes)
{
return _iface->write_i2c(addr, bytes);
}
-byte_vector_t usrp1_dboard_iface::read_i2c(uint16_t addr,
- size_t num_bytes)
+byte_vector_t usrp1_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes)
{
return _iface->read_i2c(addr, num_bytes);
}
@@ -447,31 +462,26 @@ byte_vector_t usrp1_dboard_iface::read_i2c(uint16_t addr,
/***********************************************************************
* Aux DAX/ADC
**********************************************************************/
-void usrp1_dboard_iface::write_aux_dac(dboard_iface::unit_t,
- aux_dac_t which, double value)
+void usrp1_dboard_iface::write_aux_dac(
+ dboard_iface::unit_t, aux_dac_t which, double value)
{
- //same aux dacs for each unit
- static const uhd::dict<aux_dac_t, usrp1_codec_ctrl::aux_dac_t>
- which_to_aux_dac = map_list_of
- (AUX_DAC_A, usrp1_codec_ctrl::AUX_DAC_A)
- (AUX_DAC_B, usrp1_codec_ctrl::AUX_DAC_B)
- (AUX_DAC_C, usrp1_codec_ctrl::AUX_DAC_C)
- (AUX_DAC_D, usrp1_codec_ctrl::AUX_DAC_D);
+ // same aux dacs for each unit
+ static const uhd::dict<aux_dac_t, usrp1_codec_ctrl::aux_dac_t> which_to_aux_dac =
+ map_list_of(AUX_DAC_A, usrp1_codec_ctrl::AUX_DAC_A)(AUX_DAC_B,
+ usrp1_codec_ctrl::AUX_DAC_B)(AUX_DAC_C, usrp1_codec_ctrl::AUX_DAC_C)(
+ AUX_DAC_D, usrp1_codec_ctrl::AUX_DAC_D);
_codec->write_aux_dac(which_to_aux_dac[which], value);
}
-double usrp1_dboard_iface::read_aux_adc(dboard_iface::unit_t unit,
- aux_adc_t which)
+double usrp1_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which)
{
- static const
- uhd::dict<unit_t, uhd::dict<aux_adc_t, usrp1_codec_ctrl::aux_adc_t> >
- unit_to_which_to_aux_adc = map_list_of(UNIT_RX, map_list_of
- (AUX_ADC_A, usrp1_codec_ctrl::AUX_ADC_A1)
- (AUX_ADC_B, usrp1_codec_ctrl::AUX_ADC_B1))
- (UNIT_TX, map_list_of
- (AUX_ADC_A, usrp1_codec_ctrl::AUX_ADC_A2)
- (AUX_ADC_B, usrp1_codec_ctrl::AUX_ADC_B2));
+ static const uhd::dict<unit_t, uhd::dict<aux_adc_t, usrp1_codec_ctrl::aux_adc_t>>
+ unit_to_which_to_aux_adc = map_list_of(UNIT_RX,
+ map_list_of(AUX_ADC_A, usrp1_codec_ctrl::AUX_ADC_A1)(
+ AUX_ADC_B, usrp1_codec_ctrl::AUX_ADC_B1))(UNIT_TX,
+ map_list_of(AUX_ADC_A, usrp1_codec_ctrl::AUX_ADC_A2)(
+ AUX_ADC_B, usrp1_codec_ctrl::AUX_ADC_B2));
return _codec->read_aux_adc(unit_to_which_to_aux_adc[unit][which]);
}
@@ -490,8 +500,9 @@ uhd::time_spec_t usrp1_dboard_iface::get_command_time()
throw uhd::not_implemented_error("timed command support not implemented");
}
-void usrp1_dboard_iface::set_fe_connection(unit_t, const std::string&, const fe_connection_t&)
+void usrp1_dboard_iface::set_fe_connection(
+ unit_t, const std::string&, const fe_connection_t&)
{
- throw uhd::not_implemented_error("fe connection configuration support not implemented");
+ throw uhd::not_implemented_error(
+ "fe connection configuration support not implemented");
}
-
diff --git a/host/lib/usrp/usrp1/io_impl.cpp b/host/lib/usrp/usrp1/io_impl.cpp
index 4eb1a5c50..4788c3d9e 100644
--- a/host/lib/usrp/usrp1/io_impl.cpp
+++ b/host/lib/usrp/usrp1/io_impl.cpp
@@ -28,23 +28,23 @@
#define bmFR_RX_FORMAT_SHIFT_SHIFT 0
#define bmFR_RX_FORMAT_WIDTH_SHIFT 4
-#define bmFR_TX_FORMAT_16_IQ 0
-#define bmFR_RX_FORMAT_WANT_Q (0x1 << 9)
-#define FR_RX_FREQ_0 34
-#define FR_RX_FREQ_1 35
-#define FR_RX_FREQ_2 36
-#define FR_RX_FREQ_3 37
-#define FR_INTERP_RATE 32
-#define FR_DECIM_RATE 33
-#define FR_RX_MUX 38
-#define FR_TX_MUX 39
-#define FR_TX_FORMAT 48
-#define FR_RX_FORMAT 49
-#define FR_TX_SAMPLE_RATE_DIV 0
-#define FR_RX_SAMPLE_RATE_DIV 1
-#define GS_TX_UNDERRUN 0
-#define GS_RX_OVERRUN 1
-#define VRQ_GET_STATUS 0x80
+#define bmFR_TX_FORMAT_16_IQ 0
+#define bmFR_RX_FORMAT_WANT_Q (0x1 << 9)
+#define FR_RX_FREQ_0 34
+#define FR_RX_FREQ_1 35
+#define FR_RX_FREQ_2 36
+#define FR_RX_FREQ_3 37
+#define FR_INTERP_RATE 32
+#define FR_DECIM_RATE 33
+#define FR_RX_MUX 38
+#define FR_TX_MUX 39
+#define FR_TX_FORMAT 48
+#define FR_RX_FORMAT 49
+#define FR_TX_SAMPLE_RATE_DIV 0
+#define FR_RX_SAMPLE_RATE_DIV 1
+#define GS_TX_UNDERRUN 0
+#define GS_RX_OVERRUN 1
+#define VRQ_GET_STATUS 0x80
using namespace uhd;
using namespace uhd::usrp;
@@ -55,18 +55,20 @@ static const size_t alignment_padding = 512;
/***********************************************************************
* Helper struct to associate an offset with a buffer
**********************************************************************/
-struct offset_send_buffer{
- offset_send_buffer(void):offset(0){
+struct offset_send_buffer
+{
+ offset_send_buffer(void) : offset(0)
+ {
/* NOP */
}
- offset_send_buffer(managed_send_buffer::sptr buff, size_t offset = 0):
- buff(buff), offset(offset)
+ offset_send_buffer(managed_send_buffer::sptr buff, size_t offset = 0)
+ : buff(buff), offset(offset)
{
/* NOP */
}
- //member variables
+ // member variables
managed_send_buffer::sptr buff;
size_t offset; /* in bytes */
};
@@ -74,29 +76,28 @@ struct offset_send_buffer{
/***********************************************************************
* Reusable managed send buffer to handle aligned commits
**********************************************************************/
-class offset_managed_send_buffer : public managed_send_buffer{
+class offset_managed_send_buffer : public managed_send_buffer
+{
public:
- typedef std::function<void(offset_send_buffer&, offset_send_buffer&, size_t)> commit_cb_type;
- offset_managed_send_buffer(const commit_cb_type &commit_cb):
- _commit_cb(commit_cb)
+ typedef std::function<void(offset_send_buffer&, offset_send_buffer&, size_t)>
+ commit_cb_type;
+ offset_managed_send_buffer(const commit_cb_type& commit_cb) : _commit_cb(commit_cb)
{
/* NOP */
}
- void release(void){
+ void release(void)
+ {
this->_commit_cb(_curr_buff, _next_buff, size());
}
- sptr get_new(
- offset_send_buffer &curr_buff,
- offset_send_buffer &next_buff
- ){
+ sptr get_new(offset_send_buffer& curr_buff, offset_send_buffer& next_buff)
+ {
_curr_buff = curr_buff;
_next_buff = next_buff;
return make(this,
- _curr_buff.buff->cast<char *>() + _curr_buff.offset,
- _curr_buff.buff->size() - _curr_buff.offset
- );
+ _curr_buff.buff->cast<char*>() + _curr_buff.offset,
+ _curr_buff.buff->size() - _curr_buff.offset);
}
private:
@@ -107,66 +108,71 @@ private:
/***********************************************************************
* BS VRT packer/unpacker functions (since samples don't have headers)
**********************************************************************/
-static void usrp1_bs_vrt_packer(
- uint32_t *,
- vrt::if_packet_info_t &if_packet_info
-){
+static void usrp1_bs_vrt_packer(uint32_t*, vrt::if_packet_info_t& if_packet_info)
+{
if_packet_info.num_header_words32 = 0;
if_packet_info.num_packet_words32 = if_packet_info.num_payload_words32;
}
-static void usrp1_bs_vrt_unpacker(
- const uint32_t *,
- vrt::if_packet_info_t &if_packet_info
-){
- if_packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
+static void usrp1_bs_vrt_unpacker(const uint32_t*, vrt::if_packet_info_t& if_packet_info)
+{
+ if_packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_DATA;
if_packet_info.num_payload_words32 = if_packet_info.num_packet_words32;
- if_packet_info.num_payload_bytes = if_packet_info.num_packet_words32*sizeof(uint32_t);
+ if_packet_info.num_payload_bytes =
+ if_packet_info.num_packet_words32 * sizeof(uint32_t);
if_packet_info.num_header_words32 = 0;
- if_packet_info.packet_count = 0;
- if_packet_info.sob = false;
- if_packet_info.eob = false;
- if_packet_info.has_sid = false;
- if_packet_info.has_cid = false;
- if_packet_info.has_tsi = false;
- if_packet_info.has_tsf = false;
- if_packet_info.has_tlr = false;
+ if_packet_info.packet_count = 0;
+ if_packet_info.sob = false;
+ if_packet_info.eob = false;
+ if_packet_info.has_sid = false;
+ if_packet_info.has_cid = false;
+ if_packet_info.has_tsi = false;
+ if_packet_info.has_tsf = false;
+ if_packet_info.has_tlr = false;
}
/***********************************************************************
* IO Implementation Details
**********************************************************************/
-struct usrp1_impl::io_impl{
- io_impl(zero_copy_if::sptr data_transport):
- data_transport(data_transport),
- curr_buff(offset_send_buffer(data_transport->get_send_buff())),
- omsb(std::bind(&usrp1_impl::io_impl::commit_send_buff, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)),
- vandal_loop_exit(false)
+struct usrp1_impl::io_impl
+{
+ io_impl(zero_copy_if::sptr data_transport)
+ : data_transport(data_transport)
+ , curr_buff(offset_send_buffer(data_transport->get_send_buff()))
+ , omsb(std::bind(&usrp1_impl::io_impl::commit_send_buff,
+ this,
+ std::placeholders::_1,
+ std::placeholders::_2,
+ std::placeholders::_3))
+ , vandal_loop_exit(false)
{
/* NOP */
}
- ~io_impl(void){
+ ~io_impl(void)
+ {
vandal_loop_exit = true;
UHD_SAFE_CALL(flush_send_buff();)
}
zero_copy_if::sptr data_transport;
- //wrapper around the actual send buffer interface
- //all of this to ensure only aligned lengths are committed
- //NOTE: you must commit before getting a new buffer
- //since the vrt packet handler obeys this, we are ok
+ // wrapper around the actual send buffer interface
+ // all of this to ensure only aligned lengths are committed
+ // NOTE: you must commit before getting a new buffer
+ // since the vrt packet handler obeys this, we are ok
offset_send_buffer curr_buff;
offset_managed_send_buffer omsb;
void commit_send_buff(offset_send_buffer&, offset_send_buffer&, size_t);
void flush_send_buff(void);
- managed_send_buffer::sptr get_send_buff(double timeout){
- //try to get a new managed buffer with timeout
+ managed_send_buffer::sptr get_send_buff(double timeout)
+ {
+ // try to get a new managed buffer with timeout
offset_send_buffer next_buff(data_transport->get_send_buff(timeout));
- if (not next_buff.buff.get()) return managed_send_buffer::sptr(); /* propagate timeout here */
+ if (not next_buff.buff.get())
+ return managed_send_buffer::sptr(); /* propagate timeout here */
- //make a new managed buffer with the offset buffs
+ // make a new managed buffer with the offset buffs
return omsb.get_new(curr_buff, next_buff);
}
@@ -181,48 +187,46 @@ struct usrp1_impl::io_impl{
* Commit the current buffer at multiples of alignment.
*/
void usrp1_impl::io_impl::commit_send_buff(
- offset_send_buffer &curr,
- offset_send_buffer &next,
- size_t num_bytes
-){
- //total number of bytes now in the current buffer
+ offset_send_buffer& curr, offset_send_buffer& next, size_t num_bytes)
+{
+ // total number of bytes now in the current buffer
size_t bytes_in_curr_buffer = curr.offset + num_bytes;
- //calculate how many to commit and remainder
+ // calculate how many to commit and remainder
size_t num_bytes_remaining = bytes_in_curr_buffer % alignment_padding;
size_t num_bytes_to_commit = bytes_in_curr_buffer - num_bytes_remaining;
- //copy the remainder into the next buffer
- std::memcpy(
- next.buff->cast<char *>() + next.offset,
- curr.buff->cast<char *>() + num_bytes_to_commit,
- num_bytes_remaining
- );
+ // copy the remainder into the next buffer
+ std::memcpy(next.buff->cast<char*>() + next.offset,
+ curr.buff->cast<char*>() + num_bytes_to_commit,
+ num_bytes_remaining);
- //update the offset into the next buffer
+ // update the offset into the next buffer
next.offset += num_bytes_remaining;
- //commit the current buffer
+ // commit the current buffer
curr.buff->commit(num_bytes_to_commit);
- //store the next buffer for the next call
+ // store the next buffer for the next call
curr_buff = next;
}
/*!
* Flush the current buffer by padding out to alignment and committing.
*/
-void usrp1_impl::io_impl::flush_send_buff(void){
- //calculate the number of bytes to alignment
- size_t bytes_to_pad = (-1*curr_buff.offset)%alignment_padding;
+void usrp1_impl::io_impl::flush_send_buff(void)
+{
+ // calculate the number of bytes to alignment
+ size_t bytes_to_pad = (-1 * curr_buff.offset) % alignment_padding;
- //send at least alignment_padding to guarantee zeros are sent
- if (bytes_to_pad == 0) bytes_to_pad = alignment_padding;
+ // send at least alignment_padding to guarantee zeros are sent
+ if (bytes_to_pad == 0)
+ bytes_to_pad = alignment_padding;
- //get the buffer, clear, and commit (really current buffer)
+ // get the buffer, clear, and commit (really current buffer)
managed_send_buffer::sptr buff = this->get_send_buff(.1);
- if (buff.get() != NULL){
- std::memset(buff->cast<void *>(), 0, bytes_to_pad);
+ if (buff.get() != NULL) {
+ std::memset(buff->cast<void*>(), 0, bytes_to_pad);
buff->commit(bytes_to_pad);
}
}
@@ -230,34 +234,36 @@ void usrp1_impl::io_impl::flush_send_buff(void){
/***********************************************************************
* Initialize internals within this file
**********************************************************************/
-void usrp1_impl::io_init(void){
-
+void usrp1_impl::io_init(void)
+{
_io_impl = UHD_PIMPL_MAKE(io_impl, (_data_transport));
- //init as disabled, then call the real function (uses restore)
+ // init as disabled, then call the real function (uses restore)
this->enable_rx(false);
this->enable_tx(false);
rx_stream_on_off(false);
tx_stream_on_off(false);
_io_impl->flush_send_buff();
- //create a new vandal thread to poll xerflow conditions
+ // create a new vandal thread to poll xerflow conditions
_io_impl->vandal_task = task::make(std::bind(
- &usrp1_impl::vandal_conquest_loop, this, std::ref(_io_impl->vandal_loop_exit)
- ));
+ &usrp1_impl::vandal_conquest_loop, this, std::ref(_io_impl->vandal_loop_exit)));
}
-void usrp1_impl::rx_stream_on_off(bool enb){
+void usrp1_impl::rx_stream_on_off(bool enb)
+{
this->restore_rx(enb);
- //drain any junk in the receive transport after stop streaming command
- while(not enb and _data_transport->get_recv_buff().get() != NULL){
+ // drain any junk in the receive transport after stop streaming command
+ while (not enb and _data_transport->get_recv_buff().get() != NULL) {
/* NOP */
}
}
-void usrp1_impl::tx_stream_on_off(bool enb){
+void usrp1_impl::tx_stream_on_off(bool enb)
+{
_io_impl->last_send_time = boost::get_system_time();
- if (_tx_enabled and not enb) _io_impl->flush_send_buff();
+ if (_tx_enabled and not enb)
+ _io_impl->flush_send_buff();
this->restore_tx(enb);
}
@@ -267,91 +273,97 @@ void usrp1_impl::tx_stream_on_off(bool enb){
* On an overflow, interleave an inline message into recv and print.
* This procedure creates "soft" inline and async user messages.
*/
-void usrp1_impl::vandal_conquest_loop(std::atomic<bool> &exit_loop){
-
- //initialize the async metadata
+void usrp1_impl::vandal_conquest_loop(std::atomic<bool>& exit_loop)
+{
+ // initialize the async metadata
async_metadata_t async_metadata;
- async_metadata.channel = 0;
+ async_metadata.channel = 0;
async_metadata.has_time_spec = true;
- async_metadata.event_code = async_metadata_t::EVENT_CODE_UNDERFLOW;
+ async_metadata.event_code = async_metadata_t::EVENT_CODE_UNDERFLOW;
- //initialize the inline metadata
+ // initialize the inline metadata
rx_metadata_t inline_metadata;
inline_metadata.has_time_spec = true;
- inline_metadata.error_code = rx_metadata_t::ERROR_CODE_OVERFLOW;
-
- //start the polling loop...
- try{ while (not exit_loop){
- uint8_t underflow = 0, overflow = 0;
-
- //shutoff transmit if it has been too long since send() was called
- if (_tx_enabled and (boost::get_system_time() - _io_impl->last_send_time) > boost::posix_time::milliseconds(100)){
- this->tx_stream_on_off(false);
- }
-
- //always poll regardless of enabled so we can clear the conditions
- _fx2_ctrl->usrp_control_read(
- VRQ_GET_STATUS, 0, GS_TX_UNDERRUN, &underflow, sizeof(underflow)
- );
- _fx2_ctrl->usrp_control_read(
- VRQ_GET_STATUS, 0, GS_RX_OVERRUN, &overflow, sizeof(overflow)
- );
-
- //handle message generation for xerflow conditions
- if (_tx_enabled and underflow){
- async_metadata.time_spec = _soft_time_ctrl->get_time();
- _soft_time_ctrl->get_async_queue().push_with_pop_on_full(async_metadata);
- UHD_LOG_FASTPATH("U")
- }
- if (_rx_enabled and overflow){
- inline_metadata.time_spec = _soft_time_ctrl->get_time();
- _soft_time_ctrl->get_inline_queue().push_with_pop_on_full(inline_metadata);
- UHD_LOG_FASTPATH("O")
+ inline_metadata.error_code = rx_metadata_t::ERROR_CODE_OVERFLOW;
+
+ // start the polling loop...
+ try {
+ while (not exit_loop) {
+ uint8_t underflow = 0, overflow = 0;
+
+ // shutoff transmit if it has been too long since send() was called
+ if (_tx_enabled
+ and (boost::get_system_time() - _io_impl->last_send_time)
+ > boost::posix_time::milliseconds(100)) {
+ this->tx_stream_on_off(false);
+ }
+
+ // always poll regardless of enabled so we can clear the conditions
+ _fx2_ctrl->usrp_control_read(
+ VRQ_GET_STATUS, 0, GS_TX_UNDERRUN, &underflow, sizeof(underflow));
+ _fx2_ctrl->usrp_control_read(
+ VRQ_GET_STATUS, 0, GS_RX_OVERRUN, &overflow, sizeof(overflow));
+
+ // handle message generation for xerflow conditions
+ if (_tx_enabled and underflow) {
+ async_metadata.time_spec = _soft_time_ctrl->get_time();
+ _soft_time_ctrl->get_async_queue().push_with_pop_on_full(async_metadata);
+ UHD_LOG_FASTPATH("U")
+ }
+ if (_rx_enabled and overflow) {
+ inline_metadata.time_spec = _soft_time_ctrl->get_time();
+ _soft_time_ctrl->get_inline_queue().push_with_pop_on_full(
+ inline_metadata);
+ UHD_LOG_FASTPATH("O")
+ }
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
-
- std::this_thread::sleep_for(std::chrono::milliseconds(50));
- }}
- catch(const std::exception &e){
- UHD_LOGGER_ERROR("USRP1") << "The vandal caught an unexpected exception " << e.what() ;
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("USRP1")
+ << "The vandal caught an unexpected exception " << e.what();
}
}
/***********************************************************************
* RX streamer wrapper that talks to soft time control
**********************************************************************/
-class usrp1_recv_packet_streamer : public sph::recv_packet_handler, public rx_streamer{
+class usrp1_recv_packet_streamer : public sph::recv_packet_handler, public rx_streamer
+{
public:
- usrp1_recv_packet_streamer(const size_t max_num_samps, soft_time_ctrl::sptr stc){
+ usrp1_recv_packet_streamer(const size_t max_num_samps, soft_time_ctrl::sptr stc)
+ {
_max_num_samps = max_num_samps;
- _stc = stc;
+ _stc = stc;
}
- size_t get_num_channels(void) const{
+ size_t get_num_channels(void) const
+ {
return this->size();
}
- size_t get_max_num_samps(void) const{
+ size_t get_max_num_samps(void) const
+ {
return _max_num_samps;
}
- size_t recv(
- const rx_streamer::buffs_type &buffs,
+ size_t recv(const rx_streamer::buffs_type& buffs,
const size_t nsamps_per_buff,
- uhd::rx_metadata_t &metadata,
+ uhd::rx_metadata_t& metadata,
const double timeout,
- const bool one_packet
- ){
- //interleave a "soft" inline message into the receive stream:
- if (_stc->get_inline_queue().pop_with_haste(metadata)) return 0;
+ const bool one_packet)
+ {
+ // interleave a "soft" inline message into the receive stream:
+ if (_stc->get_inline_queue().pop_with_haste(metadata))
+ return 0;
size_t num_samps_recvd = sph::recv_packet_handler::recv(
- buffs, nsamps_per_buff, metadata, timeout, one_packet
- );
+ buffs, nsamps_per_buff, metadata, timeout, one_packet);
return _stc->recv_post(metadata, num_samps_recvd);
}
- void issue_stream_cmd(const stream_cmd_t &stream_cmd)
+ void issue_stream_cmd(const stream_cmd_t& stream_cmd)
{
_stc->issue_stream_cmd(stream_cmd);
}
@@ -364,45 +376,49 @@ private:
/***********************************************************************
* TX streamer wrapper that talks to soft time control
**********************************************************************/
-class usrp1_send_packet_streamer : public sph::send_packet_handler, public tx_streamer{
+class usrp1_send_packet_streamer : public sph::send_packet_handler, public tx_streamer
+{
public:
- usrp1_send_packet_streamer(const size_t max_num_samps, soft_time_ctrl::sptr stc, std::function<void(bool)> tx_enb_fcn){
+ usrp1_send_packet_streamer(const size_t max_num_samps,
+ soft_time_ctrl::sptr stc,
+ std::function<void(bool)> tx_enb_fcn)
+ {
_max_num_samps = max_num_samps;
this->set_max_samples_per_packet(_max_num_samps);
- _stc = stc;
+ _stc = stc;
_tx_enb_fcn = tx_enb_fcn;
}
- size_t get_num_channels(void) const{
+ size_t get_num_channels(void) const
+ {
return this->size();
}
- size_t get_max_num_samps(void) const{
+ size_t get_max_num_samps(void) const
+ {
return _max_num_samps;
}
- size_t send(
- const tx_streamer::buffs_type &buffs,
+ size_t send(const tx_streamer::buffs_type& buffs,
const size_t nsamps_per_buff,
- const uhd::tx_metadata_t &metadata,
- const double timeout_
- ){
- double timeout = timeout_; //rw copy
+ const uhd::tx_metadata_t& metadata,
+ const double timeout_)
+ {
+ double timeout = timeout_; // rw copy
_stc->send_pre(metadata, timeout);
- _tx_enb_fcn(true); //always enable (it will do the right thing)
- size_t num_samps_sent = sph::send_packet_handler::send(
- buffs, nsamps_per_buff, metadata, timeout
- );
+ _tx_enb_fcn(true); // always enable (it will do the right thing)
+ size_t num_samps_sent =
+ sph::send_packet_handler::send(buffs, nsamps_per_buff, metadata, timeout);
- //handle eob flag (commit the buffer, //disable the DACs)
- //check num samps sent to avoid flush on incomplete/timeout
- if (metadata.end_of_burst and num_samps_sent == nsamps_per_buff){
+ // handle eob flag (commit the buffer, //disable the DACs)
+ // check num samps sent to avoid flush on incomplete/timeout
+ if (metadata.end_of_burst and num_samps_sent == nsamps_per_buff) {
async_metadata_t metadata;
- metadata.channel = 0;
+ metadata.channel = 0;
metadata.has_time_spec = true;
- metadata.time_spec = _stc->get_time();
- metadata.event_code = async_metadata_t::EVENT_CODE_BURST_ACK;
+ metadata.time_spec = _stc->get_time();
+ metadata.event_code = async_metadata_t::EVENT_CODE_BURST_ACK;
_stc->get_async_queue().push_with_pop_on_full(metadata);
_tx_enb_fcn(false);
}
@@ -410,9 +426,8 @@ public:
return num_samps_sent;
}
- bool recv_async_msg(
- async_metadata_t &async_metadata, double timeout = 0.1
- ){
+ bool recv_async_msg(async_metadata_t& async_metadata, double timeout = 0.1)
+ {
return _stc->get_async_queue().pop_with_timed_wait(async_metadata, timeout);
}
@@ -425,19 +440,22 @@ private:
/***********************************************************************
* Properties callback methods below
**********************************************************************/
-void usrp1_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
-
- //sanity checking
+void usrp1_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t& spec)
+{
+ // sanity checking
validate_subdev_spec(_tree, spec, "rx");
- _rx_subdev_spec = spec; //shadow
+ _rx_subdev_spec = spec; // shadow
- //set the mux and set the number of rx channels
+ // set the mux and set the number of rx channels
std::vector<mapping_pair_t> mapping;
- for(const subdev_spec_pair_t &pair: spec){
- const std::string conn = _tree->access<std::string>(str(boost::format(
- "/mboards/0/dboards/%s/rx_frontends/%s/connection"
- ) % pair.db_name % pair.sd_name)).get();
+ for (const subdev_spec_pair_t& pair : spec) {
+ const std::string conn =
+ _tree
+ ->access<std::string>(
+ str(boost::format("/mboards/0/dboards/%s/rx_frontends/%s/connection")
+ % pair.db_name % pair.sd_name))
+ .get();
mapping.push_back(std::make_pair(pair.db_name, conn));
}
bool s = this->disable_rx();
@@ -445,19 +463,22 @@ void usrp1_impl::update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
this->restore_rx(s);
}
-void usrp1_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
-
- //sanity checking
+void usrp1_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t& spec)
+{
+ // sanity checking
validate_subdev_spec(_tree, spec, "tx");
- _tx_subdev_spec = spec; //shadow
+ _tx_subdev_spec = spec; // shadow
- //set the mux and set the number of tx channels
+ // set the mux and set the number of tx channels
std::vector<mapping_pair_t> mapping;
- for(const subdev_spec_pair_t &pair: spec){
- const std::string conn = _tree->access<std::string>(str(boost::format(
- "/mboards/0/dboards/%s/tx_frontends/%s/connection"
- ) % pair.db_name % pair.sd_name)).get();
+ for (const subdev_spec_pair_t& pair : spec) {
+ const std::string conn =
+ _tree
+ ->access<std::string>(
+ str(boost::format("/mboards/0/dboards/%s/tx_frontends/%s/connection")
+ % pair.db_name % pair.sd_name))
+ .get();
mapping.push_back(std::make_pair(pair.db_name, conn));
}
bool s = this->disable_tx();
@@ -465,52 +486,58 @@ void usrp1_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){
this->restore_tx(s);
}
-void usrp1_impl::update_tick_rate(const double rate){
- //updating this variable should:
- //update dboard iface -> it has a reference
- //update dsp freq bounds -> publisher
+void usrp1_impl::update_tick_rate(const double rate)
+{
+ // updating this variable should:
+ // update dboard iface -> it has a reference
+ // update dsp freq bounds -> publisher
_master_clock_rate = rate;
}
-uhd::meta_range_t usrp1_impl::get_rx_dsp_host_rates(void){
+uhd::meta_range_t usrp1_impl::get_rx_dsp_host_rates(void)
+{
meta_range_t range;
- const size_t div = this->has_rx_halfband()? 2 : 1;
- for (int rate = 256; rate >= 4; rate -= div){
- range.push_back(range_t(_master_clock_rate/rate));
+ const size_t div = this->has_rx_halfband() ? 2 : 1;
+ for (int rate = 256; rate >= 4; rate -= div) {
+ range.push_back(range_t(_master_clock_rate / rate));
}
return range;
}
-uhd::meta_range_t usrp1_impl::get_tx_dsp_host_rates(void){
+uhd::meta_range_t usrp1_impl::get_tx_dsp_host_rates(void)
+{
meta_range_t range;
- const size_t div = this->has_tx_halfband()? 2 : 1;
- for (int rate = 256; rate >= 8; rate -= div){
- range.push_back(range_t(_master_clock_rate/rate));
+ const size_t div = this->has_tx_halfband() ? 2 : 1;
+ for (int rate = 256; rate >= 8; rate -= div) {
+ range.push_back(range_t(_master_clock_rate / rate));
}
return range;
}
-double usrp1_impl::update_rx_samp_rate(size_t dspno, const double samp_rate){
-
- const size_t div = this->has_rx_halfband()? 2 : 1;
- const size_t rate = boost::math::iround(_master_clock_rate/this->get_rx_dsp_host_rates().clip(samp_rate, true));
-
- if (rate < 8 and this->has_rx_halfband()) UHD_LOGGER_WARNING("USRP1") <<
- "USRP1 cannot achieve decimations below 8 when the half-band filter is present.\n"
- "The usrp1_fpga_4rx.rbf file is a special FPGA image without RX half-band filters.\n"
- "To load this image, set the device address key/value pair: fpga=usrp1_fpga_4rx.rbf\n"
- ;
-
- if (dspno == 0){ //only care if dsp0 is set since its homogeneous
+double usrp1_impl::update_rx_samp_rate(size_t dspno, const double samp_rate)
+{
+ const size_t div = this->has_rx_halfband() ? 2 : 1;
+ const size_t rate = boost::math::iround(
+ _master_clock_rate / this->get_rx_dsp_host_rates().clip(samp_rate, true));
+
+ if (rate < 8 and this->has_rx_halfband())
+ UHD_LOGGER_WARNING("USRP1") << "USRP1 cannot achieve decimations below 8 when "
+ "the half-band filter is present.\n"
+ "The usrp1_fpga_4rx.rbf file is a special FPGA "
+ "image without RX half-band filters.\n"
+ "To load this image, set the device address "
+ "key/value pair: fpga=usrp1_fpga_4rx.rbf\n";
+
+ if (dspno == 0) { // only care if dsp0 is set since its homogeneous
bool s = this->disable_rx();
_iface->poke32(FR_RX_SAMPLE_RATE_DIV, div - 1);
- _iface->poke32(FR_DECIM_RATE, rate/div - 1);
+ _iface->poke32(FR_DECIM_RATE, rate / div - 1);
this->restore_rx(s);
- //update the streamer if created
+ // update the streamer if created
std::shared_ptr<usrp1_recv_packet_streamer> my_streamer =
std::dynamic_pointer_cast<usrp1_recv_packet_streamer>(_rx_streamer.lock());
- if (my_streamer.get() != NULL){
+ if (my_streamer.get() != NULL) {
my_streamer->set_samp_rate(_master_clock_rate / rate);
}
}
@@ -518,21 +545,22 @@ double usrp1_impl::update_rx_samp_rate(size_t dspno, const double samp_rate){
return _master_clock_rate / rate;
}
-double usrp1_impl::update_tx_samp_rate(size_t dspno, const double samp_rate){
-
- const size_t div = this->has_tx_halfband()? 4 : 2; //doubled for codec interp
- const size_t rate = boost::math::iround(_master_clock_rate/this->get_tx_dsp_host_rates().clip(samp_rate, true));
+double usrp1_impl::update_tx_samp_rate(size_t dspno, const double samp_rate)
+{
+ const size_t div = this->has_tx_halfband() ? 4 : 2; // doubled for codec interp
+ const size_t rate = boost::math::iround(
+ _master_clock_rate / this->get_tx_dsp_host_rates().clip(samp_rate, true));
- if (dspno == 0){ //only care if dsp0 is set since its homogeneous
+ if (dspno == 0) { // only care if dsp0 is set since its homogeneous
bool s = this->disable_tx();
_iface->poke32(FR_TX_SAMPLE_RATE_DIV, div - 1);
- _iface->poke32(FR_INTERP_RATE, rate/div - 1);
+ _iface->poke32(FR_INTERP_RATE, rate / div - 1);
this->restore_tx(s);
- //update the streamer if created
+ // update the streamer if created
std::shared_ptr<usrp1_send_packet_streamer> my_streamer =
std::dynamic_pointer_cast<usrp1_send_packet_streamer>(_tx_streamer.lock());
- if (my_streamer.get() != NULL){
+ if (my_streamer.get() != NULL) {
my_streamer->set_samp_rate(_master_clock_rate / rate);
}
}
@@ -540,123 +568,125 @@ double usrp1_impl::update_tx_samp_rate(size_t dspno, const double samp_rate){
return _master_clock_rate / rate;
}
-void usrp1_impl::update_rates(void){
+void usrp1_impl::update_rates(void)
+{
const fs_path mb_path = "/mboards/0";
this->update_tick_rate(_master_clock_rate);
- for(const std::string &name: _tree->list(mb_path / "rx_dsps")){
+ for (const std::string& name : _tree->list(mb_path / "rx_dsps")) {
_tree->access<double>(mb_path / "rx_dsps" / name / "rate" / "value").update();
}
- for(const std::string &name: _tree->list(mb_path / "tx_dsps")){
+ for (const std::string& name : _tree->list(mb_path / "tx_dsps")) {
_tree->access<double>(mb_path / "tx_dsps" / name / "rate" / "value").update();
}
}
-double usrp1_impl::update_rx_dsp_freq(const size_t dspno, const double freq_){
-
- //correct for outside of rate (wrap around)
+double usrp1_impl::update_rx_dsp_freq(const size_t dspno, const double freq_)
+{
+ // correct for outside of rate (wrap around)
double freq = std::fmod(freq_, _master_clock_rate);
- if (std::abs(freq) > _master_clock_rate/2.0)
- freq -= boost::math::sign(freq)*_master_clock_rate;
+ if (std::abs(freq) > _master_clock_rate / 2.0)
+ freq -= boost::math::sign(freq) * _master_clock_rate;
- //calculate the freq register word (signed)
- UHD_ASSERT_THROW(std::abs(freq) <= _master_clock_rate/2.0);
+ // calculate the freq register word (signed)
+ UHD_ASSERT_THROW(std::abs(freq) <= _master_clock_rate / 2.0);
static const double scale_factor = std::pow(2.0, 32);
- const int32_t freq_word = int32_t(boost::math::round((freq / _master_clock_rate) * scale_factor));
+ const int32_t freq_word =
+ int32_t(boost::math::round((freq / _master_clock_rate) * scale_factor));
static const uint32_t dsp_index_to_reg_val[4] = {
- FR_RX_FREQ_0, FR_RX_FREQ_1, FR_RX_FREQ_2, FR_RX_FREQ_3
- };
+ FR_RX_FREQ_0, FR_RX_FREQ_1, FR_RX_FREQ_2, FR_RX_FREQ_3};
_iface->poke32(dsp_index_to_reg_val[dspno], freq_word);
return (double(freq_word) / scale_factor) * _master_clock_rate;
}
-double usrp1_impl::update_tx_dsp_freq(const size_t dspno, const double freq){
+double usrp1_impl::update_tx_dsp_freq(const size_t dspno, const double freq)
+{
const subdev_spec_pair_t pair = _tx_subdev_spec.at(dspno);
- //determine the connection type and hence, the sign
- const std::string conn = _tree->access<std::string>(str(boost::format(
- "/mboards/0/dboards/%s/tx_frontends/%s/connection"
- ) % pair.db_name % pair.sd_name)).get();
- double sign = (conn == "I" or conn == "IQ")? +1.0 : -1.0;
-
- //map this DSP's subdev spec to a particular codec chip
- _dbc[pair.db_name].codec->set_duc_freq(sign*freq, _master_clock_rate);
- return freq; //assume infinite precision
+ // determine the connection type and hence, the sign
+ const std::string conn =
+ _tree
+ ->access<std::string>(
+ str(boost::format("/mboards/0/dboards/%s/tx_frontends/%s/connection")
+ % pair.db_name % pair.sd_name))
+ .get();
+ double sign = (conn == "I" or conn == "IQ") ? +1.0 : -1.0;
+
+ // map this DSP's subdev spec to a particular codec chip
+ _dbc[pair.db_name].codec->set_duc_freq(sign * freq, _master_clock_rate);
+ return freq; // assume infinite precision
}
/***********************************************************************
* Async Data
**********************************************************************/
-bool usrp1_impl::recv_async_msg(
- async_metadata_t &async_metadata, double timeout
-){
- boost::this_thread::disable_interruption di; //disable because the wait can throw
- return _soft_time_ctrl->get_async_queue().pop_with_timed_wait(async_metadata, timeout);
+bool usrp1_impl::recv_async_msg(async_metadata_t& async_metadata, double timeout)
+{
+ boost::this_thread::disable_interruption di; // disable because the wait can throw
+ return _soft_time_ctrl->get_async_queue().pop_with_timed_wait(
+ async_metadata, timeout);
}
/***********************************************************************
* Receive streamer
**********************************************************************/
-rx_streamer::sptr usrp1_impl::get_rx_stream(const uhd::stream_args_t &args_){
+rx_streamer::sptr usrp1_impl::get_rx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels.clear(); //NOTE: we have no choice about the channel mapping
- for (size_t ch = 0; ch < _rx_subdev_spec.size(); ch++){
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels.clear(); // NOTE: we have no choice about the channel mapping
+ for (size_t ch = 0; ch < _rx_subdev_spec.size(); ch++) {
args.channels.push_back(ch);
}
- if (args.otw_format == "sc16"){
- _iface->poke32(FR_RX_FORMAT, 0
- | (0 << bmFR_RX_FORMAT_SHIFT_SHIFT)
- | (16 << bmFR_RX_FORMAT_WIDTH_SHIFT)
- | bmFR_RX_FORMAT_WANT_Q
- );
- }
- else if (args.otw_format == "sc8"){
- _iface->poke32(FR_RX_FORMAT, 0
- | (8 << bmFR_RX_FORMAT_SHIFT_SHIFT)
- | (8 << bmFR_RX_FORMAT_WIDTH_SHIFT)
- | bmFR_RX_FORMAT_WANT_Q
- );
- }
- else{
- throw uhd::value_error("USRP1 RX cannot handle requested wire format: " + args.otw_format);
+ if (args.otw_format == "sc16") {
+ _iface->poke32(FR_RX_FORMAT,
+ 0 | (0 << bmFR_RX_FORMAT_SHIFT_SHIFT) | (16 << bmFR_RX_FORMAT_WIDTH_SHIFT)
+ | bmFR_RX_FORMAT_WANT_Q);
+ } else if (args.otw_format == "sc8") {
+ _iface->poke32(FR_RX_FORMAT,
+ 0 | (8 << bmFR_RX_FORMAT_SHIFT_SHIFT) | (8 << bmFR_RX_FORMAT_WIDTH_SHIFT)
+ | bmFR_RX_FORMAT_WANT_Q);
+ } else {
+ throw uhd::value_error(
+ "USRP1 RX cannot handle requested wire format: " + args.otw_format);
}
- //calculate packet size
- const size_t bpp = _data_transport->get_recv_frame_size()/args.channels.size();
- const size_t spp = bpp/convert::get_bytes_per_item(args.otw_format);
+ // calculate packet size
+ const size_t bpp = _data_transport->get_recv_frame_size() / args.channels.size();
+ const size_t spp = bpp / convert::get_bytes_per_item(args.otw_format);
- //make the new streamer given the samples per packet
+ // make the new streamer given the samples per packet
std::shared_ptr<usrp1_recv_packet_streamer> my_streamer =
std::make_shared<usrp1_recv_packet_streamer>(spp, _soft_time_ctrl);
- //init some streamer stuff
+ // init some streamer stuff
my_streamer->set_tick_rate(_master_clock_rate);
my_streamer->set_vrt_unpacker(&usrp1_bs_vrt_unpacker);
- my_streamer->set_xport_chan_get_buff(0, std::bind(
- &uhd::transport::zero_copy_if::get_recv_buff, _io_impl->data_transport, std::placeholders::_1
- ));
+ my_streamer->set_xport_chan_get_buff(0,
+ std::bind(&uhd::transport::zero_copy_if::get_recv_buff,
+ _io_impl->data_transport,
+ std::placeholders::_1));
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.otw_format + "_item16_usrp1";
- id.num_inputs = 1;
+ id.input_format = args.otw_format + "_item16_usrp1";
+ id.num_inputs = 1;
id.output_format = args.cpu_format;
- id.num_outputs = args.channels.size();
+ id.num_outputs = args.channels.size();
my_streamer->set_converter(id);
- //special scale factor change for sc8
+ // special scale factor change for sc8
if (args.otw_format == "sc8")
- my_streamer->set_scale_factor(1.0/127);
+ my_streamer->set_scale_factor(1.0 / 127);
- //save as weak ptr for update access
+ // save as weak ptr for update access
_rx_streamer = my_streamer;
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
@@ -665,51 +695,54 @@ rx_streamer::sptr usrp1_impl::get_rx_stream(const uhd::stream_args_t &args_){
/***********************************************************************
* Transmit streamer
**********************************************************************/
-tx_streamer::sptr usrp1_impl::get_tx_stream(const uhd::stream_args_t &args_){
+tx_streamer::sptr usrp1_impl::get_tx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels.clear(); //NOTE: we have no choice about the channel mapping
- for (size_t ch = 0; ch < _tx_subdev_spec.size(); ch++){
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels.clear(); // NOTE: we have no choice about the channel mapping
+ for (size_t ch = 0; ch < _tx_subdev_spec.size(); ch++) {
args.channels.push_back(ch);
}
- if (args.otw_format != "sc16"){
- throw uhd::value_error("USRP1 TX cannot handle requested wire format: " + args.otw_format);
+ if (args.otw_format != "sc16") {
+ throw uhd::value_error(
+ "USRP1 TX cannot handle requested wire format: " + args.otw_format);
}
_iface->poke32(FR_TX_FORMAT, bmFR_TX_FORMAT_16_IQ);
- //calculate packet size
- size_t bpp = _data_transport->get_send_frame_size()/args.channels.size();
- bpp -= alignment_padding - 1; //minus the max remainder after LUT commit
- const size_t spp = bpp/convert::get_bytes_per_item(args.otw_format);
+ // calculate packet size
+ size_t bpp = _data_transport->get_send_frame_size() / args.channels.size();
+ bpp -= alignment_padding - 1; // minus the max remainder after LUT commit
+ const size_t spp = bpp / convert::get_bytes_per_item(args.otw_format);
- //make the new streamer given the samples per packet
- std::function<void(bool)> tx_fcn = std::bind(&usrp1_impl::tx_stream_on_off, this, std::placeholders::_1);
+ // make the new streamer given the samples per packet
+ std::function<void(bool)> tx_fcn =
+ std::bind(&usrp1_impl::tx_stream_on_off, this, std::placeholders::_1);
std::shared_ptr<usrp1_send_packet_streamer> my_streamer =
std::make_shared<usrp1_send_packet_streamer>(spp, _soft_time_ctrl, tx_fcn);
- //init some streamer stuff
+ // init some streamer stuff
my_streamer->set_tick_rate(_master_clock_rate);
my_streamer->set_vrt_packer(&usrp1_bs_vrt_packer);
- my_streamer->set_xport_chan_get_buff(0, std::bind(
- &usrp1_impl::io_impl::get_send_buff, _io_impl.get(), std::placeholders::_1
- ));
+ my_streamer->set_xport_chan_get_buff(0,
+ std::bind(
+ &usrp1_impl::io_impl::get_send_buff, _io_impl.get(), std::placeholders::_1));
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.cpu_format;
- id.num_inputs = args.channels.size();
+ id.input_format = args.cpu_format;
+ id.num_inputs = args.channels.size();
id.output_format = args.otw_format + "_item16_usrp1";
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
- //save as weak ptr for update access
+ // save as weak ptr for update access
_tx_streamer = my_streamer;
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
diff --git a/host/lib/usrp/usrp1/mb_eeprom.cpp b/host/lib/usrp/usrp1/mb_eeprom.cpp
index 9b868fd4e..756a10395 100644
--- a/host/lib/usrp/usrp1/mb_eeprom.cpp
+++ b/host/lib/usrp/usrp1/mb_eeprom.cpp
@@ -5,22 +5,23 @@
//
#include "usrp1_impl.hpp"
-#include <uhdlib/utils/eeprom_utils.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/types/byte_vector.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhdlib/utils/eeprom_utils.hpp>
namespace {
- const uint8_t USRP1_EEPROM_ADDR = 0x50;
- const size_t USRP1_SERIAL_LEN = 8;
+const uint8_t USRP1_EEPROM_ADDR = 0x50;
+const size_t USRP1_SERIAL_LEN = 8;
- //use char array so we dont need to attribute packed
- struct usrp1_eeprom_map{
- unsigned char _r[221];
- unsigned char mcr[4];
- unsigned char name[NAME_MAX_LEN];
- unsigned char serial[USRP1_SERIAL_LEN];
- };
-}
+// use char array so we dont need to attribute packed
+struct usrp1_eeprom_map
+{
+ unsigned char _r[221];
+ unsigned char mcr[4];
+ unsigned char name[NAME_MAX_LEN];
+ unsigned char serial[USRP1_SERIAL_LEN];
+};
+} // namespace
using namespace uhd;
using uhd::usrp::mboard_eeprom_t;
@@ -29,62 +30,56 @@ mboard_eeprom_t usrp1_impl::get_mb_eeprom(uhd::i2c_iface::sptr iface)
{
mboard_eeprom_t mb_eeprom;
- //extract the serial
+ // extract the serial
mb_eeprom["serial"] = uhd::bytes_to_string(iface->read_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, serial), USRP1_SERIAL_LEN
- ));
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, serial), USRP1_SERIAL_LEN));
- //extract the name
+ // extract the name
mb_eeprom["name"] = uhd::bytes_to_string(iface->read_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, name), NAME_MAX_LEN
- ));
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, name), NAME_MAX_LEN));
- //extract master clock rate as a 32-bit uint in Hz
+ // extract master clock rate as a 32-bit uint in Hz
uint32_t master_clock_rate;
const byte_vector_t rate_bytes = iface->read_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), sizeof(master_clock_rate)
- );
- std::copy(
- rate_bytes.begin(), rate_bytes.end(), //input
- reinterpret_cast<uint8_t *>(&master_clock_rate) //output
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), sizeof(master_clock_rate));
+ std::copy(rate_bytes.begin(),
+ rate_bytes.end(), // input
+ reinterpret_cast<uint8_t*>(&master_clock_rate) // output
);
master_clock_rate = ntohl(master_clock_rate);
- if (master_clock_rate > 1e6 and master_clock_rate < 1e9){
+ if (master_clock_rate > 1e6 and master_clock_rate < 1e9) {
mb_eeprom["mcr"] = std::to_string(master_clock_rate);
- }
- else mb_eeprom["mcr"] = "";
+ } else
+ mb_eeprom["mcr"] = "";
return mb_eeprom;
}
-void usrp1_impl::set_mb_eeprom(const mboard_eeprom_t &mb_eeprom)
+void usrp1_impl::set_mb_eeprom(const mboard_eeprom_t& mb_eeprom)
{
- auto &iface = _fx2_ctrl;
+ auto& iface = _fx2_ctrl;
- //store the serial
- if (mb_eeprom.has_key("serial")) iface->write_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, serial),
- string_to_bytes(mb_eeprom["serial"], USRP1_SERIAL_LEN)
- );
+ // store the serial
+ if (mb_eeprom.has_key("serial"))
+ iface->write_eeprom(USRP1_EEPROM_ADDR,
+ offsetof(usrp1_eeprom_map, serial),
+ string_to_bytes(mb_eeprom["serial"], USRP1_SERIAL_LEN));
- //store the name
- if (mb_eeprom.has_key("name")) iface->write_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, name),
- string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
- );
+ // store the name
+ if (mb_eeprom.has_key("name"))
+ iface->write_eeprom(USRP1_EEPROM_ADDR,
+ offsetof(usrp1_eeprom_map, name),
+ string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN));
- //store the master clock rate as a 32-bit uint in Hz
- if (mb_eeprom.has_key("mcr")){
+ // store the master clock rate as a 32-bit uint in Hz
+ if (mb_eeprom.has_key("mcr")) {
uint32_t master_clock_rate = uint32_t(std::stod(mb_eeprom["mcr"]));
- master_clock_rate = htonl(master_clock_rate);
+ master_clock_rate = htonl(master_clock_rate);
const byte_vector_t rate_bytes(
- reinterpret_cast<const uint8_t *>(&master_clock_rate),
- reinterpret_cast<const uint8_t *>(&master_clock_rate)
- + sizeof(master_clock_rate)
- );
+ reinterpret_cast<const uint8_t*>(&master_clock_rate),
+ reinterpret_cast<const uint8_t*>(&master_clock_rate)
+ + sizeof(master_clock_rate));
iface->write_eeprom(
- USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), rate_bytes
- );
+ USRP1_EEPROM_ADDR, offsetof(usrp1_eeprom_map, mcr), rate_bytes);
}
}
-
diff --git a/host/lib/usrp/usrp1/soft_time_ctrl.cpp b/host/lib/usrp/usrp1/soft_time_ctrl.cpp
index eb08d0352..42a1e9712 100644
--- a/host/lib/usrp/usrp1/soft_time_ctrl.cpp
+++ b/host/lib/usrp/usrp1/soft_time_ctrl.cpp
@@ -21,106 +21,117 @@ namespace pt = boost::posix_time;
static const time_spec_t TWIDDLE(0.0011);
-soft_time_ctrl::~soft_time_ctrl(void){
+soft_time_ctrl::~soft_time_ctrl(void)
+{
/* NOP */
}
/***********************************************************************
* Soft time control implementation
**********************************************************************/
-class soft_time_ctrl_impl : public soft_time_ctrl{
+class soft_time_ctrl_impl : public soft_time_ctrl
+{
public:
-
- soft_time_ctrl_impl(const cb_fcn_type &stream_on_off):
- _nsamps_remaining(0),
- _stream_mode(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS),
- _cmd_queue(2),
- _async_msg_queue(1000),
- _inline_msg_queue(1000),
- _stream_on_off(stream_on_off)
+ soft_time_ctrl_impl(const cb_fcn_type& stream_on_off)
+ : _nsamps_remaining(0)
+ , _stream_mode(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ , _cmd_queue(2)
+ , _async_msg_queue(1000)
+ , _inline_msg_queue(1000)
+ , _stream_on_off(stream_on_off)
{
- //synchronously spawn a new thread
+ // synchronously spawn a new thread
_recv_cmd_task = task::make(std::bind(&soft_time_ctrl_impl::recv_cmd_task, this));
- //initialize the time to something
+ // initialize the time to something
this->set_time(time_spec_t(0.0));
}
/*******************************************************************
* Time control
******************************************************************/
- void set_time(const time_spec_t &time){
+ void set_time(const time_spec_t& time)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
_time_offset = uhd::get_system_time() - time;
}
- time_spec_t get_time(void){
+ time_spec_t get_time(void)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
return time_now();
}
- UHD_INLINE time_spec_t time_now(void){
- //internal get time without scoped lock
+ UHD_INLINE time_spec_t time_now(void)
+ {
+ // internal get time without scoped lock
return uhd::get_system_time() - _time_offset;
}
UHD_INLINE void sleep_until_time(
- boost::mutex::scoped_lock &lock, const time_spec_t &time
- ){
+ boost::mutex::scoped_lock& lock, const time_spec_t& time)
+ {
boost::condition_variable cond;
- //use a condition variable to unlock, sleep, lock
+ // use a condition variable to unlock, sleep, lock
double seconds_to_sleep = (time - time_now()).get_real_secs();
- cond.timed_wait(lock, pt::microseconds(long(seconds_to_sleep*1e6)));
+ cond.timed_wait(lock, pt::microseconds(long(seconds_to_sleep * 1e6)));
}
/*******************************************************************
* Receive control
******************************************************************/
- size_t recv_post(rx_metadata_t &md, const size_t nsamps){
+ size_t recv_post(rx_metadata_t& md, const size_t nsamps)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
- //Since it timed out on the receive, check for inline messages...
- //Must do a post check because recv() will not wake up for a message.
- if (md.error_code == rx_metadata_t::ERROR_CODE_TIMEOUT){
- if (_inline_msg_queue.pop_with_haste(md)) return 0;
+ // Since it timed out on the receive, check for inline messages...
+ // Must do a post check because recv() will not wake up for a message.
+ if (md.error_code == rx_metadata_t::ERROR_CODE_TIMEOUT) {
+ if (_inline_msg_queue.pop_with_haste(md))
+ return 0;
}
- //load the metadata with the expected time
+ // load the metadata with the expected time
md.has_time_spec = true;
- md.time_spec = time_now();
-
- //none of the stuff below matters in continuous streaming mode
- if (_stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS) return nsamps;
-
- //When to stop streaming:
- //The samples have been received and the stream mode is non-continuous.
- //Rewrite the sample count to clip to the requested number of samples.
- if (_nsamps_remaining <= nsamps) switch(_stream_mode){
- case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE:{
- rx_metadata_t metadata;
- metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.error_code = rx_metadata_t::ERROR_CODE_BROKEN_CHAIN;
- _inline_msg_queue.push_with_pop_on_full(metadata);
- } //continue to next case...
- UHD_FALLTHROUGH
- case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE:
- md.end_of_burst = true;
- this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
- return _nsamps_remaining;
- default: break;
- }
+ md.time_spec = time_now();
+
+ // none of the stuff below matters in continuous streaming mode
+ if (_stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS)
+ return nsamps;
+
+ // When to stop streaming:
+ // The samples have been received and the stream mode is non-continuous.
+ // Rewrite the sample count to clip to the requested number of samples.
+ if (_nsamps_remaining <= nsamps)
+ switch (_stream_mode) {
+ case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE: {
+ rx_metadata_t metadata;
+ metadata.has_time_spec = true;
+ metadata.time_spec = this->time_now();
+ metadata.error_code = rx_metadata_t::ERROR_CODE_BROKEN_CHAIN;
+ _inline_msg_queue.push_with_pop_on_full(metadata);
+ } // continue to next case...
+ UHD_FALLTHROUGH
+ case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE:
+ md.end_of_burst = true;
+ this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
+ return _nsamps_remaining;
+ default:
+ break;
+ }
- //update the consumed samples
+ // update the consumed samples
_nsamps_remaining -= nsamps;
return nsamps;
}
- void issue_stream_cmd(const stream_cmd_t &cmd){
+ void issue_stream_cmd(const stream_cmd_t& cmd)
+ {
_cmd_queue.push_with_wait(std::make_shared<stream_cmd_t>(cmd));
}
- void stream_on_off(bool enb){
+ void stream_on_off(bool enb)
+ {
_stream_on_off(enb);
_nsamps_remaining = 0;
}
@@ -128,20 +139,22 @@ public:
/*******************************************************************
* Transmit control
******************************************************************/
- void send_pre(const tx_metadata_t &md, double &timeout){
- if (not md.has_time_spec) return;
+ void send_pre(const tx_metadata_t& md, double& timeout)
+ {
+ if (not md.has_time_spec)
+ return;
boost::mutex::scoped_lock lock(_update_mutex);
time_spec_t time_at(md.time_spec - TWIDDLE);
- //handle late packets
- if (time_at < time_now()){
+ // handle late packets
+ if (time_at < time_now()) {
async_metadata_t metadata;
- metadata.channel = 0;
+ metadata.channel = 0;
metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.event_code = async_metadata_t::EVENT_CODE_TIME_ERROR;
+ metadata.time_spec = this->time_now();
+ metadata.event_code = async_metadata_t::EVENT_CODE_TIME_ERROR;
_async_msg_queue.push_with_pop_on_full(metadata);
return;
}
@@ -153,59 +166,63 @@ public:
/*******************************************************************
* Thread control
******************************************************************/
- void recv_cmd_handle_cmd(const stream_cmd_t &cmd){
+ void recv_cmd_handle_cmd(const stream_cmd_t& cmd)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
- //handle the stream at time by sleeping
- if (not cmd.stream_now){
+ // handle the stream at time by sleeping
+ if (not cmd.stream_now) {
time_spec_t time_at(cmd.time_spec - TWIDDLE);
- if (time_at < time_now()){
+ if (time_at < time_now()) {
rx_metadata_t metadata;
metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.error_code = rx_metadata_t::ERROR_CODE_LATE_COMMAND;
+ metadata.time_spec = this->time_now();
+ metadata.error_code = rx_metadata_t::ERROR_CODE_LATE_COMMAND;
_inline_msg_queue.push_with_pop_on_full(metadata);
this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
return;
- }
- else{
+ } else {
sleep_until_time(lock, time_at);
}
}
- //When to stop streaming:
- //Stop streaming when the command is a stop and streaming.
+ // When to stop streaming:
+ // Stop streaming when the command is a stop and streaming.
if (cmd.stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- and _stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- ) stream_on_off(false);
+ and _stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ stream_on_off(false);
- //When to start streaming:
- //Start streaming when the command is not a stop and not streaming.
+ // When to start streaming:
+ // Start streaming when the command is not a stop and not streaming.
if (cmd.stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- and _stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- ) stream_on_off(true);
+ and _stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ stream_on_off(true);
- //update the state
+ // update the state
_nsamps_remaining += cmd.num_samps;
_stream_mode = cmd.stream_mode;
}
- void recv_cmd_task(void){ //task is looped
+ void recv_cmd_task(void)
+ { // task is looped
std::shared_ptr<stream_cmd_t> cmd;
if (_cmd_queue.pop_with_timed_wait(cmd, 0.25)) {
recv_cmd_handle_cmd(*cmd);
}
}
- bounded_buffer<async_metadata_t> &get_async_queue(void){
+ bounded_buffer<async_metadata_t>& get_async_queue(void)
+ {
return _async_msg_queue;
}
- bounded_buffer<rx_metadata_t> &get_inline_queue(void){
+ bounded_buffer<rx_metadata_t>& get_inline_queue(void)
+ {
return _inline_msg_queue;
}
- void stop(void){
+ void stop(void)
+ {
_recv_cmd_task.reset();
}
@@ -214,7 +231,7 @@ private:
size_t _nsamps_remaining;
stream_cmd_t::stream_mode_t _stream_mode;
time_spec_t _time_offset;
- bounded_buffer<std::shared_ptr<stream_cmd_t> > _cmd_queue;
+ bounded_buffer<std::shared_ptr<stream_cmd_t>> _cmd_queue;
bounded_buffer<async_metadata_t> _async_msg_queue;
bounded_buffer<rx_metadata_t> _inline_msg_queue;
const cb_fcn_type _stream_on_off;
@@ -224,6 +241,7 @@ private:
/***********************************************************************
* Soft time control factor
**********************************************************************/
-soft_time_ctrl::sptr soft_time_ctrl::make(const cb_fcn_type &stream_on_off){
+soft_time_ctrl::sptr soft_time_ctrl::make(const cb_fcn_type& stream_on_off)
+{
return sptr(new soft_time_ctrl_impl(stream_on_off));
}
diff --git a/host/lib/usrp/usrp1/soft_time_ctrl.hpp b/host/lib/usrp/usrp1/soft_time_ctrl.hpp
index 48915499a..b346f4453 100644
--- a/host/lib/usrp/usrp1/soft_time_ctrl.hpp
+++ b/host/lib/usrp/usrp1/soft_time_ctrl.hpp
@@ -8,15 +8,15 @@
#ifndef INCLUDED_LIBUHD_USRP_USRP1_SOFT_TIME_CTRL_HPP
#define INCLUDED_LIBUHD_USRP_USRP1_SOFT_TIME_CTRL_HPP
+#include <uhd/transport/bounded_buffer.hpp>
+#include <uhd/types/metadata.hpp>
#include <uhd/types/stream_cmd.hpp>
#include <uhd/types/time_spec.hpp>
-#include <uhd/types/metadata.hpp>
-#include <uhd/transport/bounded_buffer.hpp>
#include <uhd/utils/noncopyable.hpp>
-#include <memory>
#include <functional>
+#include <memory>
-namespace uhd{ namespace usrp{
+namespace uhd { namespace usrp {
/*!
* The soft time control emulates some of the
@@ -25,7 +25,8 @@ namespace uhd{ namespace usrp{
* timed transmits, timed receive commands, device time,
* and inline and async error messages.
*/
-class soft_time_ctrl : uhd::noncopyable{
+class soft_time_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<soft_time_ctrl> sptr;
typedef std::function<void(bool)> cb_fcn_type;
@@ -37,33 +38,33 @@ public:
* \param stream_on_off a function to enable/disable rx
* \return a new soft time control object
*/
- static sptr make(const cb_fcn_type &stream_on_off);
+ static sptr make(const cb_fcn_type& stream_on_off);
//! Set the current time
- virtual void set_time(const time_spec_t &time) = 0;
+ virtual void set_time(const time_spec_t& time) = 0;
//! Get the current time
virtual time_spec_t get_time(void) = 0;
//! Call after the internal recv function
- virtual size_t recv_post(rx_metadata_t &md, const size_t nsamps) = 0;
+ virtual size_t recv_post(rx_metadata_t& md, const size_t nsamps) = 0;
//! Call before the internal send function
- virtual void send_pre(const tx_metadata_t &md, double &timeout) = 0;
+ virtual void send_pre(const tx_metadata_t& md, double& timeout) = 0;
//! Issue a stream command to receive
- virtual void issue_stream_cmd(const stream_cmd_t &cmd) = 0;
+ virtual void issue_stream_cmd(const stream_cmd_t& cmd) = 0;
//! Get access to a buffer of async metadata
- virtual transport::bounded_buffer<async_metadata_t> &get_async_queue(void) = 0;
+ virtual transport::bounded_buffer<async_metadata_t>& get_async_queue(void) = 0;
//! Get access to a buffer of inline metadata
- virtual transport::bounded_buffer<rx_metadata_t> &get_inline_queue(void) = 0;
+ virtual transport::bounded_buffer<rx_metadata_t>& get_inline_queue(void) = 0;
//! Stops threads before deconstruction to avoid race conditions
virtual void stop(void) = 0;
};
-}} //namespace
+}} // namespace uhd::usrp
#endif /* INCLUDED_LIBUHD_USRP_USRP1_SOFT_TIME_CTRL_HPP */
diff --git a/host/lib/usrp/usrp1/usrp1_calc_mux.hpp b/host/lib/usrp/usrp1/usrp1_calc_mux.hpp
index 1169f2fe8..63f00f514 100644
--- a/host/lib/usrp/usrp1/usrp1_calc_mux.hpp
+++ b/host/lib/usrp/usrp1/usrp1_calc_mux.hpp
@@ -12,14 +12,14 @@
#include <uhd/utils/log.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
+#include <string>
#include <utility>
#include <vector>
-#include <string>
#ifndef INCLUDED_USRP1_CALC_MUX_HPP
-#define INCLUDED_USRP1_CALC_MUX_HPP
+# define INCLUDED_USRP1_CALC_MUX_HPP
-//db_name, conn_type for the mux calculations below...
+// db_name, conn_type for the mux calculations below...
typedef std::pair<std::string, std::string> mapping_pair_t;
/***********************************************************************
@@ -27,7 +27,8 @@ typedef std::pair<std::string, std::string> mapping_pair_t;
* The I and Q mux values are intentionally reversed to flip I and Q
* to account for the reversal in the type conversion routines.
**********************************************************************/
-static int calc_rx_mux_pair(int adc_for_i, int adc_for_q){
+static int calc_rx_mux_pair(int adc_for_i, int adc_for_q)
+{
return (adc_for_i << 0) | (adc_for_q << 2);
}
@@ -38,48 +39,49 @@ static int calc_rx_mux_pair(int adc_for_i, int adc_for_q){
* | must be zero | Q3| I3| Q2| I2| Q1| I1| Q0| I0|Z| NCH |
* +-----------------------+-------+-------+-------+-------+-+-----+
*/
-static uint32_t calc_rx_mux(const std::vector<mapping_pair_t> &mapping){
- //create look-up-table for mapping dboard name and connection type to ADC flags
+static uint32_t calc_rx_mux(const std::vector<mapping_pair_t>& mapping)
+{
+ // create look-up-table for mapping dboard name and connection type to ADC flags
static const int ADC0 = 0, ADC1 = 1, ADC2 = 2, ADC3 = 3;
- static const uhd::dict<std::string, uhd::dict<std::string, int> > name_to_conn_to_flag = boost::assign::map_list_of
- ("A", boost::assign::map_list_of
- ("IQ", calc_rx_mux_pair(ADC0, ADC1)) //I and Q
- ("QI", calc_rx_mux_pair(ADC1, ADC0)) //I and Q
- ("I", calc_rx_mux_pair(ADC0, ADC0)) //I and Q (Q identical but ignored Z=1)
- ("Q", calc_rx_mux_pair(ADC1, ADC1)) //I and Q (Q identical but ignored Z=1)
- )
- ("B", boost::assign::map_list_of
- ("IQ", calc_rx_mux_pair(ADC2, ADC3)) //I and Q
- ("QI", calc_rx_mux_pair(ADC3, ADC2)) //I and Q
- ("I", calc_rx_mux_pair(ADC2, ADC2)) //I and Q (Q identical but ignored Z=1)
- ("Q", calc_rx_mux_pair(ADC3, ADC3)) //I and Q (Q identical but ignored Z=1)
- )
- ;
-
- //extract the number of channels
+ static const uhd::dict<std::string, uhd::dict<std::string, int>>
+ name_to_conn_to_flag = boost::assign::map_list_of("A",
+ boost::assign::map_list_of("IQ", calc_rx_mux_pair(ADC0, ADC1)) // I and Q
+ ("QI", calc_rx_mux_pair(ADC1, ADC0)) // I and Q
+ ("I", calc_rx_mux_pair(ADC0, ADC0)) // I and Q (Q identical but ignored Z=1)
+ ("Q", calc_rx_mux_pair(ADC1, ADC1)) // I and Q (Q identical but ignored Z=1)
+ )("B",
+ boost::assign::map_list_of("IQ", calc_rx_mux_pair(ADC2, ADC3)) // I and Q
+ ("QI", calc_rx_mux_pair(ADC3, ADC2)) // I and Q
+ ("I", calc_rx_mux_pair(ADC2, ADC2)) // I and Q (Q identical but ignored Z=1)
+ ("Q", calc_rx_mux_pair(ADC3, ADC3)) // I and Q (Q identical but ignored Z=1)
+ );
+
+ // extract the number of channels
const size_t nchan = mapping.size();
- //calculate the channel flags
+ // calculate the channel flags
int channel_flags = 0;
size_t num_reals = 0, num_quads = 0;
- for(const mapping_pair_t &pair: uhd::reversed(mapping)){
+ for (const mapping_pair_t& pair : uhd::reversed(mapping)) {
const std::string name = pair.first, conn = pair.second;
- if (conn == "IQ" or conn == "QI") num_quads++;
- if (conn == "I" or conn == "Q") num_reals++;
+ if (conn == "IQ" or conn == "QI")
+ num_quads++;
+ if (conn == "I" or conn == "Q")
+ num_reals++;
channel_flags = (channel_flags << 4) | name_to_conn_to_flag[name][conn];
}
- //calculate Z:
+ // calculate Z:
// for all real sources: Z = 1
// for all quadrature sources: Z = 0
// for mixed sources: warning + Z = 0
- int Z = (num_quads > 0)? 0 : 1;
- if (num_quads != 0 and num_reals != 0) UHD_LOGGER_WARNING("USRP1") << boost::format(
- "Mixing real and quadrature rx subdevices is not supported.\n"
- "The Q input to the real source(s) will be non-zero.\n"
- );
+ int Z = (num_quads > 0) ? 0 : 1;
+ if (num_quads != 0 and num_reals != 0)
+ UHD_LOGGER_WARNING("USRP1") << boost::format(
+ "Mixing real and quadrature rx subdevices is not supported.\n"
+ "The Q input to the real source(s) will be non-zero.\n");
- //calculate the rx mux value
+ // calculate the rx mux value
return ((channel_flags & 0xffff) << 4) | ((Z & 0x1) << 3) | ((nchan & 0x7) << 0);
}
@@ -88,7 +90,8 @@ static uint32_t calc_rx_mux(const std::vector<mapping_pair_t> &mapping){
* The I and Q mux values are intentionally reversed to flip I and Q
* to account for the reversal in the type conversion routines.
**********************************************************************/
-static int calc_tx_mux_pair(int chn_for_i, int chn_for_q){
+static int calc_tx_mux_pair(int chn_for_i, int chn_for_q)
+{
return (chn_for_i << 0) | (chn_for_q << 4);
}
@@ -99,48 +102,50 @@ static int calc_tx_mux_pair(int chn_for_i, int chn_for_q){
* | | DAC1Q | DAC1I | DAC0Q | DAC0I |0| NCH |
* +-----------------------------------------------+-------+-+-----+
*/
-static uint32_t calc_tx_mux(const std::vector<mapping_pair_t> &mapping){
- //create look-up-table for mapping channel number and connection type to flags
+static uint32_t calc_tx_mux(const std::vector<mapping_pair_t>& mapping)
+{
+ // create look-up-table for mapping channel number and connection type to flags
static const int ENB = 1 << 3, CHAN_I0 = 0, CHAN_Q0 = 1, CHAN_I1 = 2, CHAN_Q1 = 3;
- static const uhd::dict<size_t, uhd::dict<std::string, int> > chan_to_conn_to_flag = boost::assign::map_list_of
- (0, boost::assign::map_list_of
- ("IQ", calc_tx_mux_pair(CHAN_I0 | ENB, CHAN_Q0 | ENB))
- ("QI", calc_tx_mux_pair(CHAN_Q0 | ENB, CHAN_I0 | ENB))
- ("I", calc_tx_mux_pair(CHAN_I0 | ENB, 0 ))
- ("Q", calc_tx_mux_pair(0, CHAN_I0 | ENB))
- )
- (1, boost::assign::map_list_of
- ("IQ", calc_tx_mux_pair(CHAN_I1 | ENB, CHAN_Q1 | ENB))
- ("QI", calc_tx_mux_pair(CHAN_Q1 | ENB, CHAN_I1 | ENB))
- ("I", calc_tx_mux_pair(CHAN_I1 | ENB, 0 ))
- ("Q", calc_tx_mux_pair(0, CHAN_I1 | ENB))
- )
- ;
-
- //extract the number of channels
+ static const uhd::dict<size_t, uhd::dict<std::string, int>> chan_to_conn_to_flag =
+ boost::assign::map_list_of(0,
+ boost::assign::map_list_of(
+ "IQ", calc_tx_mux_pair(CHAN_I0 | ENB, CHAN_Q0 | ENB))(
+ "QI", calc_tx_mux_pair(CHAN_Q0 | ENB, CHAN_I0 | ENB))(
+ "I", calc_tx_mux_pair(CHAN_I0 | ENB, 0))(
+ "Q", calc_tx_mux_pair(0, CHAN_I0 | ENB)))(1,
+ boost::assign::map_list_of(
+ "IQ", calc_tx_mux_pair(CHAN_I1 | ENB, CHAN_Q1 | ENB))(
+ "QI", calc_tx_mux_pair(CHAN_Q1 | ENB, CHAN_I1 | ENB))(
+ "I", calc_tx_mux_pair(CHAN_I1 | ENB, 0))(
+ "Q", calc_tx_mux_pair(0, CHAN_I1 | ENB)));
+
+ // extract the number of channels
size_t nchan = mapping.size();
- //calculate the channel flags
+ // calculate the channel flags
int channel_flags = 0, chan = 0;
- uhd::dict<std::string, int> slot_to_chan_count = boost::assign::map_list_of("A", 0)("B", 0);
- for(const mapping_pair_t &pair: mapping){
+ uhd::dict<std::string, int> slot_to_chan_count =
+ boost::assign::map_list_of("A", 0)("B", 0);
+ for (const mapping_pair_t& pair : mapping) {
const std::string name = pair.first, conn = pair.second;
- //combine the channel flags: shift for slot A vs B
- if (name == "A") channel_flags |= chan_to_conn_to_flag[chan][conn] << 0;
- if (name == "B") channel_flags |= chan_to_conn_to_flag[chan][conn] << 8;
+ // combine the channel flags: shift for slot A vs B
+ if (name == "A")
+ channel_flags |= chan_to_conn_to_flag[chan][conn] << 0;
+ if (name == "B")
+ channel_flags |= chan_to_conn_to_flag[chan][conn] << 8;
- //sanity check, only 1 channel per slot
+ // sanity check, only 1 channel per slot
slot_to_chan_count[name]++;
- if (slot_to_chan_count[name] > 1) throw uhd::value_error(
- "cannot assign dboard slot to multiple channels: " + name
- );
+ if (slot_to_chan_count[name] > 1)
+ throw uhd::value_error(
+ "cannot assign dboard slot to multiple channels: " + name);
- //increment for the next channel
+ // increment for the next channel
chan++;
}
- //calculate the tx mux value
+ // calculate the tx mux value
return ((channel_flags & 0xffff) << 4) | ((nchan & 0x7) << 0);
}
diff --git a/host/lib/usrp/usrp1/usrp1_iface.cpp b/host/lib/usrp/usrp1/usrp1_iface.cpp
index ebc438f20..574dec51c 100644
--- a/host/lib/usrp/usrp1/usrp1_iface.cpp
+++ b/host/lib/usrp/usrp1/usrp1_iface.cpp
@@ -6,18 +6,19 @@
//
#include "usrp1_iface.hpp"
-#include <uhd/utils/log.hpp>
#include <uhd/exception.hpp>
#include <uhd/utils/byteswap.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/format.hpp>
-#include <stdexcept>
#include <iomanip>
+#include <stdexcept>
using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-class usrp1_iface_impl : public usrp1_iface{
+class usrp1_iface_impl : public usrp1_iface
+{
public:
/*******************************************************************
* Structors
@@ -39,54 +40,50 @@ public:
{
uint32_t swapped = uhd::htonx(value);
- UHD_LOGGER_TRACE("USRP1")
- << "poke32("
- << std::dec << std::setw(2) << addr << ", 0x"
- << std::hex << std::setw(8) << value << ")"
- ;
+ UHD_LOGGER_TRACE("USRP1") << "poke32(" << std::dec << std::setw(2) << addr
+ << ", 0x" << std::hex << std::setw(8) << value << ")";
uint8_t w_index_h = SPI_ENABLE_FPGA & 0xff;
uint8_t w_index_l = (SPI_FMT_MSB | SPI_FMT_HDR_1) & 0xff;
- int ret =_ctrl_transport->usrp_control_write(
- VRQ_SPI_WRITE,
- addr & 0x7f,
- (w_index_h << 8) | (w_index_l << 0),
- (unsigned char*) &swapped,
- sizeof(uint32_t));
+ int ret = _ctrl_transport->usrp_control_write(VRQ_SPI_WRITE,
+ addr & 0x7f,
+ (w_index_h << 8) | (w_index_l << 0),
+ (unsigned char*)&swapped,
+ sizeof(uint32_t));
- if (ret < 0) throw uhd::io_error("USRP1: failed control write");
+ if (ret < 0)
+ throw uhd::io_error("USRP1: failed control write");
}
uint32_t peek32(const uint32_t addr)
{
- UHD_LOGGER_TRACE("USRP1")
- << "peek32("
- << std::dec << std::setw(2) << addr << ")"
- ;
+ UHD_LOGGER_TRACE("USRP1") << "peek32(" << std::dec << std::setw(2) << addr << ")";
uint32_t value_out;
uint8_t w_index_h = SPI_ENABLE_FPGA & 0xff;
uint8_t w_index_l = (SPI_FMT_MSB | SPI_FMT_HDR_1) & 0xff;
- int ret = _ctrl_transport->usrp_control_read(
- VRQ_SPI_READ,
- 0x80 | (addr & 0x7f),
- (w_index_h << 8) | (w_index_l << 0),
- (unsigned char*) &value_out,
- sizeof(uint32_t));
+ int ret = _ctrl_transport->usrp_control_read(VRQ_SPI_READ,
+ 0x80 | (addr & 0x7f),
+ (w_index_h << 8) | (w_index_l << 0),
+ (unsigned char*)&value_out,
+ sizeof(uint32_t));
- if (ret < 0) throw uhd::io_error("USRP1: failed control read");
+ if (ret < 0)
+ throw uhd::io_error("USRP1: failed control read");
return uhd::ntohx(value_out);
}
- void poke16(const uint32_t, const uint16_t) {
+ void poke16(const uint32_t, const uint16_t)
+ {
throw uhd::not_implemented_error("Unhandled command poke16()");
}
- uint16_t peek16(const uint32_t) {
+ uint16_t peek16(const uint32_t)
+ {
throw uhd::not_implemented_error("Unhandled command peek16()");
return 0;
}
@@ -94,11 +91,13 @@ public:
/*******************************************************************
* I2C
******************************************************************/
- void write_i2c(uint16_t addr, const byte_vector_t &bytes){
+ void write_i2c(uint16_t addr, const byte_vector_t& bytes)
+ {
return _ctrl_transport->write_i2c(addr, bytes);
}
- byte_vector_t read_i2c(uint16_t addr, size_t num_bytes){
+ byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
+ {
return _ctrl_transport->read_i2c(addr, num_bytes);
}
@@ -114,70 +113,68 @@ public:
* control buffer for IN data.
******************************************************************/
uint32_t transact_spi(int which_slave,
- const spi_config_t &,
- uint32_t bits,
- size_t num_bits,
- bool readback)
+ const spi_config_t&,
+ uint32_t bits,
+ size_t num_bits,
+ bool readback)
{
UHD_LOGGER_TRACE("USRP1")
<< "transact_spi: "
- << " slave: " << which_slave
- << " bits: " << bits
- << " num_bits: " << num_bits
- << " readback: " << readback
- ;
+ << " slave: " << which_slave << " bits: " << bits
+ << " num_bits: " << num_bits << " readback: " << readback;
UHD_ASSERT_THROW((num_bits <= 32) && !(num_bits % 8));
size_t num_bytes = num_bits / 8;
if (readback) {
- unsigned char buff[4] = {
- (unsigned char)(bits & 0xff),
+ unsigned char buff[4] = {(unsigned char)(bits & 0xff),
(unsigned char)((bits >> 8) & 0xff),
(unsigned char)((bits >> 16) & 0xff),
- (unsigned char)((bits >> 24) & 0xff)
- };
- //conditions where there are two header bytes
- if (num_bytes >= 3 and buff[num_bytes-1] != 0 and buff[num_bytes-2] != 0 and buff[num_bytes-3] == 0){
- if (int(num_bytes-2) != _ctrl_transport->usrp_control_read(
- VRQ_SPI_READ, (buff[num_bytes-1] << 8) | (buff[num_bytes-2] << 0),
- (which_slave << 8) | SPI_FMT_MSB | SPI_FMT_HDR_2,
- buff, num_bytes-2
- )) throw uhd::io_error("USRP1: failed SPI readback transaction");
+ (unsigned char)((bits >> 24) & 0xff)};
+ // conditions where there are two header bytes
+ if (num_bytes >= 3 and buff[num_bytes - 1] != 0 and buff[num_bytes - 2] != 0
+ and buff[num_bytes - 3] == 0) {
+ if (int(num_bytes - 2)
+ != _ctrl_transport->usrp_control_read(VRQ_SPI_READ,
+ (buff[num_bytes - 1] << 8) | (buff[num_bytes - 2] << 0),
+ (which_slave << 8) | SPI_FMT_MSB | SPI_FMT_HDR_2,
+ buff,
+ num_bytes - 2))
+ throw uhd::io_error("USRP1: failed SPI readback transaction");
}
- //conditions where there is one header byte
- else if (num_bytes >= 2 and buff[num_bytes-1] != 0 and buff[num_bytes-2] == 0){
- if (int(num_bytes-1) != _ctrl_transport->usrp_control_read(
- VRQ_SPI_READ, buff[num_bytes-1],
- (which_slave << 8) | SPI_FMT_MSB | SPI_FMT_HDR_1,
- buff, num_bytes-1
- )) throw uhd::io_error("USRP1: failed SPI readback transaction");
- }
- else{
+ // conditions where there is one header byte
+ else if (num_bytes >= 2 and buff[num_bytes - 1] != 0
+ and buff[num_bytes - 2] == 0) {
+ if (int(num_bytes - 1)
+ != _ctrl_transport->usrp_control_read(VRQ_SPI_READ,
+ buff[num_bytes - 1],
+ (which_slave << 8) | SPI_FMT_MSB | SPI_FMT_HDR_1,
+ buff,
+ num_bytes - 1))
+ throw uhd::io_error("USRP1: failed SPI readback transaction");
+ } else {
throw uhd::io_error("USRP1: invalid input data for SPI readback");
}
- uint32_t val = (((uint32_t)buff[0]) << 0) |
- (((uint32_t)buff[1]) << 8) |
- (((uint32_t)buff[2]) << 16) |
- (((uint32_t)buff[3]) << 24);
+ uint32_t val = (((uint32_t)buff[0]) << 0) | (((uint32_t)buff[1]) << 8)
+ | (((uint32_t)buff[2]) << 16) | (((uint32_t)buff[3]) << 24);
return val;
- }
- else {
+ } else {
// Byteswap on num_bytes
- unsigned char buff[4] = { 0 };
+ unsigned char buff[4] = {0};
for (size_t i = 1; i <= num_bytes; i++)
buff[num_bytes - i] = (bits >> ((i - 1) * 8)) & 0xff;
uint8_t w_index_h = which_slave & 0xff;
uint8_t w_index_l = (SPI_FMT_MSB | SPI_FMT_HDR_0) & 0xff;
- int ret =_ctrl_transport->usrp_control_write(
- VRQ_SPI_WRITE,
- 0x00,
- (w_index_h << 8) | (w_index_l << 0),
- buff, num_bytes);
+ int ret = _ctrl_transport->usrp_control_write(VRQ_SPI_WRITE,
+ 0x00,
+ (w_index_h << 8) | (w_index_l << 0),
+ buff,
+ num_bytes);
- if (ret < 0) throw uhd::io_error("USRP1: failed SPI transaction");
+ if (ret < 0)
+ throw uhd::io_error("USRP1: failed SPI transaction");
return 0;
}
diff --git a/host/lib/usrp/usrp1/usrp1_iface.hpp b/host/lib/usrp/usrp1/usrp1_iface.hpp
index b01b2d088..efcc50b58 100644
--- a/host/lib/usrp/usrp1/usrp1_iface.hpp
+++ b/host/lib/usrp/usrp1/usrp1_iface.hpp
@@ -8,23 +8,23 @@
#ifndef INCLUDED_USRP1_IFACE_HPP
#define INCLUDED_USRP1_IFACE_HPP
-#include <uhdlib/usrp/common/fx2_ctrl.hpp>
-#include <uhd/types/wb_iface.hpp>
#include <uhd/types/serial.hpp>
-#include <memory>
+#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/noncopyable.hpp>
+#include <uhdlib/usrp/common/fx2_ctrl.hpp>
+#include <memory>
-#define SPI_ENABLE_FPGA 0x01
+#define SPI_ENABLE_FPGA 0x01
#define SPI_FMT_HDR_MASK (3 << 5)
-#define SPI_FMT_HDR_0 (0 << 5)
-#define SPI_FMT_HDR_1 (1 << 5)
-#define SPI_FMT_HDR_2 (2 << 5)
-#define SPI_FMT_LSB (1 << 7)
-#define SPI_FMT_MSB (0 << 7)
+#define SPI_FMT_HDR_0 (0 << 5)
+#define SPI_FMT_HDR_1 (1 << 5)
+#define SPI_FMT_HDR_2 (2 << 5)
+#define SPI_FMT_LSB (1 << 7)
+#define SPI_FMT_MSB (0 << 7)
#define SPI_FMT_xSB_MASK (1 << 7)
-#define VRQ_SPI_READ 0x82
-#define VRQ_SPI_WRITE 0x09
-#define VRQ_FW_COMPAT 0x83
+#define VRQ_SPI_READ 0x82
+#define VRQ_SPI_WRITE 0x09
+#define VRQ_FW_COMPAT 0x83
/*!
@@ -32,7 +32,10 @@
* Provides a set of functions to implementation layer.
* Including spi, peek, poke, control...
*/
-class usrp1_iface : public uhd::wb_iface, public uhd::i2c_iface, public uhd::spi_iface, uhd::noncopyable
+class usrp1_iface : public uhd::wb_iface,
+ public uhd::i2c_iface,
+ public uhd::spi_iface,
+ uhd::noncopyable
{
public:
typedef std::shared_ptr<usrp1_iface> sptr;
diff --git a/host/lib/usrp/usrp1/usrp1_impl.cpp b/host/lib/usrp/usrp1/usrp1_impl.cpp
index a641c008c..d86bf6d56 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.cpp
@@ -26,33 +26,34 @@ using namespace uhd::usrp;
using namespace uhd::transport;
namespace {
- constexpr uint16_t USRP1_VENDOR_ID = 0xfffe;
- constexpr uint16_t USRP1_PRODUCT_ID = 0x0002;
- constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
-}
+constexpr uint16_t USRP1_VENDOR_ID = 0xfffe;
+constexpr uint16_t USRP1_PRODUCT_ID = 0x0002;
+constexpr int64_t REENUMERATION_TIMEOUT_MS = 3000;
+} // namespace
const std::vector<usrp1_impl::dboard_slot_t> usrp1_impl::_dboard_slots{
- usrp1_impl::DBOARD_SLOT_A,
- usrp1_impl::DBOARD_SLOT_B
-};
+ usrp1_impl::DBOARD_SLOT_A, usrp1_impl::DBOARD_SLOT_B};
/***********************************************************************
* Discovery
**********************************************************************/
-static device_addrs_t usrp1_find(const device_addr_t &hint)
+static device_addrs_t usrp1_find(const device_addr_t& hint)
{
device_addrs_t usrp1_addrs;
- //return an empty list of addresses when type is set to non-usrp1
- if (hint.has_key("type") and hint["type"] != "usrp1") return usrp1_addrs;
+ // return an empty list of addresses when type is set to non-usrp1
+ if (hint.has_key("type") and hint["type"] != "usrp1")
+ return usrp1_addrs;
- //Return an empty list of addresses when an address or resource is specified,
- //since an address and resource is intended for a different, non-USB, device.
- if (hint.has_key("addr") || hint.has_key("resource")) return usrp1_addrs;
+ // Return an empty list of addresses when an address or resource is specified,
+ // since an address and resource is intended for a different, non-USB, device.
+ if (hint.has_key("addr") || hint.has_key("resource"))
+ return usrp1_addrs;
uint16_t vid, pid;
- if(hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type") && hint["type"] == "usrp1") {
+ if (hint.has_key("vid") && hint.has_key("pid") && hint.has_key("type")
+ && hint["type"] == "usrp1") {
vid = uhd::cast::hexstr_cast<uint16_t>(hint.get("vid"));
pid = uhd::cast::hexstr_cast<uint16_t>(hint.get("pid"));
} else {
@@ -66,55 +67,61 @@ static device_addrs_t usrp1_find(const device_addr_t &hint)
// so that re-enumeration after fw load can occur successfully.
// This requirement is a courtesy of libusb1.0 on windows.
- //find the usrps and load firmware
+ // find the usrps and load firmware
size_t found = 0;
- for(usb_device_handle::sptr handle: usb_device_handle::get_device_list(vid, pid)) {
- //extract the firmware path for the USRP1
+ for (usb_device_handle::sptr handle : usb_device_handle::get_device_list(vid, pid)) {
+ // extract the firmware path for the USRP1
std::string usrp1_fw_image;
- try{
+ try {
usrp1_fw_image = find_image_path(hint.get("fw", "usrp1_fw.ihx"));
+ } catch (...) {
+ UHD_LOGGER_WARNING("USRP1")
+ << boost::format("Could not locate USRP1 firmware. %s")
+ % print_utility_error("uhd_images_downloader.py");
}
- catch(...){
- UHD_LOGGER_WARNING("USRP1") << boost::format("Could not locate USRP1 firmware. %s") % print_utility_error("uhd_images_downloader.py");
- }
- UHD_LOGGER_DEBUG("USRP1") << "USRP1 firmware image: " << usrp1_fw_image ;
+ UHD_LOGGER_DEBUG("USRP1") << "USRP1 firmware image: " << usrp1_fw_image;
usb_control::sptr control;
- try{control = usb_control::make(handle, 0);}
- catch(const uhd::exception &){continue;} //ignore claimed
+ try {
+ control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue;
+ } // ignore claimed
fx2_ctrl::make(control)->usrp_load_firmware(usrp1_fw_image);
found++;
}
- //get descriptors again with serial number, but using the initialized VID/PID now since we have firmware
+ // get descriptors again with serial number, but using the initialized VID/PID now
+ // since we have firmware
vid = USRP1_VENDOR_ID;
pid = USRP1_PRODUCT_ID;
- const auto timeout_time =
- std::chrono::steady_clock::now()
- + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
+ const auto timeout_time = std::chrono::steady_clock::now()
+ + std::chrono::milliseconds(REENUMERATION_TIMEOUT_MS);
- //search for the device until found or timeout
- while (std::chrono::steady_clock::now() < timeout_time
- and usrp1_addrs.empty() and found != 0) {
- for (usb_device_handle::sptr handle : usb_device_handle::get_device_list(vid, pid)) {
+ // search for the device until found or timeout
+ while (std::chrono::steady_clock::now() < timeout_time and usrp1_addrs.empty()
+ and found != 0) {
+ for (usb_device_handle::sptr handle :
+ usb_device_handle::get_device_list(vid, pid)) {
usb_control::sptr control;
- try{control = usb_control::make(handle, 0);}
- catch(const uhd::exception &){continue;} //ignore claimed
-
- fx2_ctrl::sptr fx2_ctrl = fx2_ctrl::make(control);
- const mboard_eeprom_t mb_eeprom =
- usrp1_impl::get_mb_eeprom(fx2_ctrl);
+ try {
+ control = usb_control::make(handle, 0);
+ } catch (const uhd::exception&) {
+ continue;
+ } // ignore claimed
+
+ fx2_ctrl::sptr fx2_ctrl = fx2_ctrl::make(control);
+ const mboard_eeprom_t mb_eeprom = usrp1_impl::get_mb_eeprom(fx2_ctrl);
device_addr_t new_addr;
- new_addr["type"] = "usrp1";
- new_addr["name"] = mb_eeprom["name"];
+ new_addr["type"] = "usrp1";
+ new_addr["name"] = mb_eeprom["name"];
new_addr["serial"] = handle->get_serial();
- //this is a found usrp1 when the hint serial and name match or blank
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
- ){
+ // this is a found usrp1 when the hint serial and name match or blank
+ if ((not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial")
+ or hint["serial"] == new_addr["serial"])) {
usrp1_addrs.push_back(new_addr);
}
}
@@ -126,139 +133,150 @@ static device_addrs_t usrp1_find(const device_addr_t &hint)
/***********************************************************************
* Make
**********************************************************************/
-static device::sptr usrp1_make(const device_addr_t &device_addr){
+static device::sptr usrp1_make(const device_addr_t& device_addr)
+{
return device::sptr(new usrp1_impl(device_addr));
}
-UHD_STATIC_BLOCK(register_usrp1_device){
+UHD_STATIC_BLOCK(register_usrp1_device)
+{
device::register_device(&usrp1_find, &usrp1_make, device::USRP);
}
/***********************************************************************
* Structors
**********************************************************************/
-usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
+usrp1_impl::usrp1_impl(const device_addr_t& device_addr)
+{
UHD_LOGGER_INFO("USRP1") << "Opening a USRP1 device...";
_type = device::USRP;
- //extract the FPGA path for the USRP1
- std::string usrp1_fpga_image = find_image_path(
- device_addr.get("fpga", "usrp1_fpga.rbf")
- );
- UHD_LOGGER_DEBUG("USRP1") << "USRP1 FPGA image: " << usrp1_fpga_image ;
+ // extract the FPGA path for the USRP1
+ std::string usrp1_fpga_image =
+ find_image_path(device_addr.get("fpga", "usrp1_fpga.rbf"));
+ UHD_LOGGER_DEBUG("USRP1") << "USRP1 FPGA image: " << usrp1_fpga_image;
- //try to match the given device address with something on the USB bus
+ // try to match the given device address with something on the USB bus
std::vector<usb_device_handle::sptr> device_list =
usb_device_handle::get_device_list(USRP1_VENDOR_ID, USRP1_PRODUCT_ID);
- //locate the matching handle in the device list
+ // locate the matching handle in the device list
usb_device_handle::sptr handle;
- for(usb_device_handle::sptr dev_handle: device_list) {
- if (dev_handle->get_serial() == device_addr["serial"]){
+ for (usb_device_handle::sptr dev_handle : device_list) {
+ if (dev_handle->get_serial() == device_addr["serial"]) {
handle = dev_handle;
break;
}
}
- UHD_ASSERT_THROW(handle.get() != NULL); //better be found
+ UHD_ASSERT_THROW(handle.get() != NULL); // better be found
////////////////////////////////////////////////////////////////////
// Create controller objects
////////////////////////////////////////////////////////////////////
- //usb_control::sptr usb_ctrl = usb_control::make(handle);
+ // usb_control::sptr usb_ctrl = usb_control::make(handle);
_fx2_ctrl = fx2_ctrl::make(usb_control::make(handle, 0));
_fx2_ctrl->usrp_load_fpga(usrp1_fpga_image);
_fx2_ctrl->usrp_init();
- _data_transport = usb_zero_copy::make(
- handle, // identifier
- 2, 6, // IN interface, endpoint
- 1, 2, // OUT interface, endpoint
- device_addr // param hints
+ _data_transport = usb_zero_copy::make(handle, // identifier
+ 2,
+ 6, // IN interface, endpoint
+ 1,
+ 2, // OUT interface, endpoint
+ device_addr // param hints
);
- _iface = usrp1_iface::make(_fx2_ctrl);
+ _iface = usrp1_iface::make(_fx2_ctrl);
_soft_time_ctrl = soft_time_ctrl::make(
- std::bind(&usrp1_impl::rx_stream_on_off, this, std::placeholders::_1)
- );
- _dbc["A"]; _dbc["B"]; //ensure that keys exist
+ std::bind(&usrp1_impl::rx_stream_on_off, this, std::placeholders::_1));
+ _dbc["A"];
+ _dbc["B"]; // ensure that keys exist
// Normal mode with no loopback or Rx counting
_iface->poke32(FR_MODE, 0x00000000);
_iface->poke32(FR_DEBUG_EN, 0x00000000);
- UHD_LOGGER_DEBUG("USRP1")
- << "USRP1 Capabilities"
- << " number of duc's: " << get_num_ddcs()
- << " number of ddc's: " << get_num_ducs()
- << " rx halfband: " << has_rx_halfband()
- << " tx halfband: " << has_tx_halfband()
- ;
+ UHD_LOGGER_DEBUG("USRP1") << "USRP1 Capabilities"
+ << " number of duc's: " << get_num_ddcs()
+ << " number of ddc's: " << get_num_ducs()
+ << " rx halfband: " << has_rx_halfband()
+ << " tx halfband: " << has_tx_halfband();
////////////////////////////////////////////////////////////////////
// Initialize the properties tree
////////////////////////////////////////////////////////////////////
_rx_dc_offset_shadow = 0;
- _tree = property_tree::make();
+ _tree = property_tree::make();
_tree->create<std::string>("/name").set("USRP1 Device");
const fs_path mb_path = "/mboards/0";
_tree->create<std::string>(mb_path / "name").set("USRP1");
_tree->create<std::string>(mb_path / "load_eeprom")
- .add_coerced_subscriber(std::bind(&fx2_ctrl::usrp_load_eeprom, _fx2_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&fx2_ctrl::usrp_load_eeprom, _fx2_ctrl, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create user-defined control objects
////////////////////////////////////////////////////////////////////
- _tree->create<std::pair<uint8_t, uint32_t> >(mb_path / "user" / "regs")
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_reg, this, std::placeholders::_1));
+ _tree->create<std::pair<uint8_t, uint32_t>>(mb_path / "user" / "regs")
+ .add_coerced_subscriber(
+ std::bind(&usrp1_impl::set_reg, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// setup the mboard eeprom
////////////////////////////////////////////////////////////////////
- //const mboard_eeprom_t mb_eeprom(*_fx2_ctrl, USRP1_EEPROM_MAP_KEY);
+ // const mboard_eeprom_t mb_eeprom(*_fx2_ctrl, USRP1_EEPROM_MAP_KEY);
const mboard_eeprom_t mb_eeprom = this->get_mb_eeprom(_fx2_ctrl);
_tree->create<mboard_eeprom_t>(mb_path / "eeprom")
.set(mb_eeprom)
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_mb_eeprom, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&usrp1_impl::set_mb_eeprom, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create clock control objects
////////////////////////////////////////////////////////////////////
_master_clock_rate = 64e6;
- if (device_addr.has_key("mcr")){
- try{
+ if (device_addr.has_key("mcr")) {
+ try {
_master_clock_rate = std::stod(device_addr["mcr"]);
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("USRP1")
+ << "Error parsing FPGA clock rate from device address: " << e.what();
}
- catch(const std::exception &e){
- UHD_LOGGER_ERROR("USRP1") << "Error parsing FPGA clock rate from device address: " << e.what() ;
- }
- }
- else if (not mb_eeprom["mcr"].empty()){
- try{
+ } else if (not mb_eeprom["mcr"].empty()) {
+ try {
_master_clock_rate = std::stod(mb_eeprom["mcr"]);
- }
- catch(const std::exception &e){
- UHD_LOGGER_ERROR("USRP1") << "Error parsing FPGA clock rate from EEPROM: " << e.what() ;
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("USRP1")
+ << "Error parsing FPGA clock rate from EEPROM: " << e.what();
}
}
- UHD_LOGGER_INFO("USRP1") << boost::format("Using FPGA clock rate of %fMHz...") % (_master_clock_rate/1e6) ;
+ UHD_LOGGER_INFO("USRP1") << boost::format("Using FPGA clock rate of %fMHz...")
+ % (_master_clock_rate / 1e6);
_tree->create<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&usrp1_impl::update_tick_rate, this, std::placeholders::_1))
+ .add_coerced_subscriber(
+ std::bind(&usrp1_impl::update_tick_rate, this, std::placeholders::_1))
.set(_master_clock_rate);
////////////////////////////////////////////////////////////////////
// create codec control objects
////////////////////////////////////////////////////////////////////
- for(const std::string &db: _dbc.keys()){
- _dbc[db].codec = usrp1_codec_ctrl::make(_iface, (db == "A")? SPI_ENABLE_CODEC_A : SPI_ENABLE_CODEC_B);
+ for (const std::string& db : _dbc.keys()) {
+ _dbc[db].codec = usrp1_codec_ctrl::make(
+ _iface, (db == "A") ? SPI_ENABLE_CODEC_A : SPI_ENABLE_CODEC_B);
const fs_path rx_codec_path = mb_path / "rx_codecs" / db;
const fs_path tx_codec_path = mb_path / "tx_codecs" / db;
_tree->create<std::string>(rx_codec_path / "name").set("ad9522");
- _tree->create<meta_range_t>(rx_codec_path / "gains/pga/range").set(usrp1_codec_ctrl::rx_pga_gain_range);
+ _tree->create<meta_range_t>(rx_codec_path / "gains/pga/range")
+ .set(usrp1_codec_ctrl::rx_pga_gain_range);
_tree->create<double>(rx_codec_path / "gains/pga/value")
- .set_coercer(std::bind(&usrp1_impl::update_rx_codec_gain, this, db, std::placeholders::_1))
+ .set_coercer(std::bind(
+ &usrp1_impl::update_rx_codec_gain, this, db, std::placeholders::_1))
.set(0.0);
_tree->create<std::string>(tx_codec_path / "name").set("ad9522");
- _tree->create<meta_range_t>(tx_codec_path / "gains/pga/range").set(usrp1_codec_ctrl::tx_pga_gain_range);
+ _tree->create<meta_range_t>(tx_codec_path / "gains/pga/range")
+ .set(usrp1_codec_ctrl::tx_pga_gain_range);
_tree->create<double>(tx_codec_path / "gains/pga/value")
- .add_coerced_subscriber(std::bind(&usrp1_codec_ctrl::set_tx_pga_gain, _dbc[db].codec, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(&usrp1_codec_ctrl::set_tx_pga_gain,
+ _dbc[db].codec,
+ std::placeholders::_1))
.set_publisher(std::bind(&usrp1_codec_ctrl::get_tx_pga_gain, _dbc[db].codec))
.set(0.0);
}
@@ -266,65 +284,76 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
////////////////////////////////////////////////////////////////////
// and do the misc mboard sensors
////////////////////////////////////////////////////////////////////
- //none for now...
- _tree->create<int>(mb_path / "sensors"); //phony property so this dir exists
+ // none for now...
+ _tree->create<int>(mb_path / "sensors"); // phony property so this dir exists
////////////////////////////////////////////////////////////////////
// create frontend control objects
////////////////////////////////////////////////////////////////////
_tree->create<subdev_spec_t>(mb_path / "rx_subdev_spec")
.set(subdev_spec_t())
- .add_coerced_subscriber(std::bind(&usrp1_impl::update_rx_subdev_spec, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&usrp1_impl::update_rx_subdev_spec, this, std::placeholders::_1));
_tree->create<subdev_spec_t>(mb_path / "tx_subdev_spec")
.set(subdev_spec_t())
- .add_coerced_subscriber(std::bind(&usrp1_impl::update_tx_subdev_spec, this, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&usrp1_impl::update_tx_subdev_spec, this, std::placeholders::_1));
- for(const std::string &db: _dbc.keys()){
+ for (const std::string& db : _dbc.keys()) {
const fs_path rx_fe_path = mb_path / "rx_frontends" / db;
- _tree->create<std::complex<double> >(rx_fe_path / "dc_offset" / "value")
- .set_coercer(std::bind(&usrp1_impl::set_rx_dc_offset, this, db, std::placeholders::_1))
+ _tree->create<std::complex<double>>(rx_fe_path / "dc_offset" / "value")
+ .set_coercer(
+ std::bind(&usrp1_impl::set_rx_dc_offset, this, db, std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
_tree->create<bool>(rx_fe_path / "dc_offset" / "enable")
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_enb_rx_dc_offset, this, db, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(
+ &usrp1_impl::set_enb_rx_dc_offset, this, db, std::placeholders::_1))
.set(true);
}
////////////////////////////////////////////////////////////////////
// create rx dsp control objects
////////////////////////////////////////////////////////////////////
- _tree->create<int>(mb_path / "rx_dsps"); //dummy in case we have none
- for (size_t dspno = 0; dspno < get_num_ddcs(); dspno++){
+ _tree->create<int>(mb_path / "rx_dsps"); // dummy in case we have none
+ for (size_t dspno = 0; dspno < get_num_ddcs(); dspno++) {
fs_path rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno);
_tree->create<meta_range_t>(rx_dsp_path / "rate/range")
.set_publisher(std::bind(&usrp1_impl::get_rx_dsp_host_rates, this));
_tree->create<double>(rx_dsp_path / "rate/value")
- .set(1e6) //some default rate
- .set_coercer(std::bind(&usrp1_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1));
+ .set(1e6) // some default rate
+ .set_coercer(std::bind(
+ &usrp1_impl::update_rx_samp_rate, this, dspno, std::placeholders::_1));
_tree->create<double>(rx_dsp_path / "freq/value")
- .set_coercer(std::bind(&usrp1_impl::update_rx_dsp_freq, this, dspno, std::placeholders::_1));
+ .set_coercer(std::bind(
+ &usrp1_impl::update_rx_dsp_freq, this, dspno, std::placeholders::_1));
_tree->create<meta_range_t>(rx_dsp_path / "freq/range")
.set_publisher(std::bind(&usrp1_impl::get_rx_dsp_freq_range, this));
_tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd");
- if (dspno == 0){
- //only add_coerced_subscriber the callback for dspno 0 since it will stream all dsps
+ if (dspno == 0) {
+ // only add_coerced_subscriber the callback for dspno 0 since it will stream
+ // all dsps
_tree->access<stream_cmd_t>(rx_dsp_path / "stream_cmd")
- .add_coerced_subscriber(std::bind(&soft_time_ctrl::issue_stream_cmd, _soft_time_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&soft_time_ctrl::issue_stream_cmd,
+ _soft_time_ctrl,
+ std::placeholders::_1));
}
}
////////////////////////////////////////////////////////////////////
// create tx dsp control objects
////////////////////////////////////////////////////////////////////
- _tree->create<int>(mb_path / "tx_dsps"); //dummy in case we have none
- for (size_t dspno = 0; dspno < get_num_ducs(); dspno++){
+ _tree->create<int>(mb_path / "tx_dsps"); // dummy in case we have none
+ for (size_t dspno = 0; dspno < get_num_ducs(); dspno++) {
fs_path tx_dsp_path = mb_path / str(boost::format("tx_dsps/%u") % dspno);
_tree->create<meta_range_t>(tx_dsp_path / "rate/range")
.set_publisher(std::bind(&usrp1_impl::get_tx_dsp_host_rates, this));
_tree->create<double>(tx_dsp_path / "rate/value")
- .set(1e6) //some default rate
- .set_coercer(std::bind(&usrp1_impl::update_tx_samp_rate, this, dspno, std::placeholders::_1));
+ .set(1e6) // some default rate
+ .set_coercer(std::bind(
+ &usrp1_impl::update_tx_samp_rate, this, dspno, std::placeholders::_1));
_tree->create<double>(tx_dsp_path / "freq/value")
- .set_coercer(std::bind(&usrp1_impl::update_tx_dsp_freq, this, dspno, std::placeholders::_1));
+ .set_coercer(std::bind(
+ &usrp1_impl::update_tx_dsp_freq, this, dspno, std::placeholders::_1));
_tree->create<meta_range_t>(tx_dsp_path / "freq/range")
.set_publisher(std::bind(&usrp1_impl::get_tx_dsp_freq_range, this));
}
@@ -334,59 +363,70 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
////////////////////////////////////////////////////////////////////
_tree->create<time_spec_t>(mb_path / "time/now")
.set_publisher(std::bind(&soft_time_ctrl::get_time, _soft_time_ctrl))
- .add_coerced_subscriber(std::bind(&soft_time_ctrl::set_time, _soft_time_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(
+ std::bind(&soft_time_ctrl::set_time, _soft_time_ctrl, std::placeholders::_1));
- _tree->create<std::vector<std::string> >(mb_path / "clock_source/options").set(std::vector<std::string>(1, "internal"));
- _tree->create<std::vector<std::string> >(mb_path / "time_source/options").set(std::vector<std::string>(1, "none"));
+ _tree->create<std::vector<std::string>>(mb_path / "clock_source/options")
+ .set(std::vector<std::string>(1, "internal"));
+ _tree->create<std::vector<std::string>>(mb_path / "time_source/options")
+ .set(std::vector<std::string>(1, "none"));
_tree->create<std::string>(mb_path / "clock_source/value").set("internal");
_tree->create<std::string>(mb_path / "time_source/value").set("none");
////////////////////////////////////////////////////////////////////
// create dboard control objects
////////////////////////////////////////////////////////////////////
- for(const std::string &db: _dbc.keys()){
-
- //read the dboard eeprom to extract the dboard ids
+ for (const std::string& db : _dbc.keys()) {
+ // read the dboard eeprom to extract the dboard ids
dboard_eeprom_t rx_db_eeprom, tx_db_eeprom, gdb_eeprom;
- rx_db_eeprom.load(*_fx2_ctrl, (db == "A")? (I2C_ADDR_RX_A) : (I2C_ADDR_RX_B));
- tx_db_eeprom.load(*_fx2_ctrl, (db == "A")? (I2C_ADDR_TX_A) : (I2C_ADDR_TX_B));
- gdb_eeprom.load(*_fx2_ctrl, (db == "A")? (I2C_ADDR_TX_A ^ 5) : (I2C_ADDR_TX_B ^ 5));
-
- //disable rx dc offset if LFRX
- if (rx_db_eeprom.id == 0x000f) _tree->access<bool>(mb_path / "rx_frontends" / db / "dc_offset" / "enable").set(false);
-
- //create the properties and register subscribers
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db/ "rx_eeprom")
+ rx_db_eeprom.load(*_fx2_ctrl, (db == "A") ? (I2C_ADDR_RX_A) : (I2C_ADDR_RX_B));
+ tx_db_eeprom.load(*_fx2_ctrl, (db == "A") ? (I2C_ADDR_TX_A) : (I2C_ADDR_TX_B));
+ gdb_eeprom.load(
+ *_fx2_ctrl, (db == "A") ? (I2C_ADDR_TX_A ^ 5) : (I2C_ADDR_TX_B ^ 5));
+
+ // disable rx dc offset if LFRX
+ if (rx_db_eeprom.id == 0x000f)
+ _tree->access<bool>(mb_path / "rx_frontends" / db / "dc_offset" / "enable")
+ .set(false);
+
+ // create the properties and register subscribers
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db / "rx_eeprom")
.set(rx_db_eeprom)
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_db_eeprom, this, db, "rx", std::placeholders::_1));
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db/ "tx_eeprom")
+ .add_coerced_subscriber(std::bind(
+ &usrp1_impl::set_db_eeprom, this, db, "rx", std::placeholders::_1));
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db / "tx_eeprom")
.set(tx_db_eeprom)
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_db_eeprom, this, db, "tx", std::placeholders::_1));
- _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db/ "gdb_eeprom")
+ .add_coerced_subscriber(std::bind(
+ &usrp1_impl::set_db_eeprom, this, db, "tx", std::placeholders::_1));
+ _tree->create<dboard_eeprom_t>(mb_path / "dboards" / db / "gdb_eeprom")
.set(gdb_eeprom)
- .add_coerced_subscriber(std::bind(&usrp1_impl::set_db_eeprom, this, db, "gdb", std::placeholders::_1));
-
- //create a new dboard interface and manager
- dboard_iface::sptr dboard_iface = make_dboard_iface(
- _iface, _dbc[db].codec,
- (db == "A")? DBOARD_SLOT_A : DBOARD_SLOT_B,
- _master_clock_rate, rx_db_eeprom.id
- );
- _dbc[db].dboard_manager = dboard_manager::make(
- rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
- dboard_iface, _tree->subtree(mb_path / "dboards" / db)
- );
-
- //init the subdev specs if we have a dboard (wont leave this loop empty)
- if (rx_db_eeprom.id != dboard_id_t::none() or _rx_subdev_spec.empty()){
- _rx_subdev_spec = subdev_spec_t(db + ":" + _tree->list(mb_path / "dboards" / db / "rx_frontends").at(0));
+ .add_coerced_subscriber(std::bind(
+ &usrp1_impl::set_db_eeprom, this, db, "gdb", std::placeholders::_1));
+
+ // create a new dboard interface and manager
+ dboard_iface::sptr dboard_iface = make_dboard_iface(_iface,
+ _dbc[db].codec,
+ (db == "A") ? DBOARD_SLOT_A : DBOARD_SLOT_B,
+ _master_clock_rate,
+ rx_db_eeprom.id);
+ _dbc[db].dboard_manager = dboard_manager::make(rx_db_eeprom.id,
+ tx_db_eeprom.id,
+ gdb_eeprom.id,
+ dboard_iface,
+ _tree->subtree(mb_path / "dboards" / db));
+
+ // init the subdev specs if we have a dboard (wont leave this loop empty)
+ if (rx_db_eeprom.id != dboard_id_t::none() or _rx_subdev_spec.empty()) {
+ _rx_subdev_spec = subdev_spec_t(
+ db + ":" + _tree->list(mb_path / "dboards" / db / "rx_frontends").at(0));
}
- if (tx_db_eeprom.id != dboard_id_t::none() or _tx_subdev_spec.empty()){
- _tx_subdev_spec = subdev_spec_t(db + ":" + _tree->list(mb_path / "dboards" / db / "tx_frontends").at(0));
+ if (tx_db_eeprom.id != dboard_id_t::none() or _tx_subdev_spec.empty()) {
+ _tx_subdev_spec = subdev_spec_t(
+ db + ":" + _tree->list(mb_path / "dboards" / db / "tx_frontends").at(0));
}
}
- //initialize io handling
+ // initialize io handling
this->io_init();
////////////////////////////////////////////////////////////////////
@@ -394,8 +434,8 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
////////////////////////////////////////////////////////////////////
this->update_rates();
- //reset cordic rates and their properties to zero
- for(const std::string &name: _tree->list(mb_path / "rx_dsps")){
+ // reset cordic rates and their properties to zero
+ for (const std::string& name : _tree->list(mb_path / "rx_dsps")) {
_tree->access<double>(mb_path / "rx_dsps" / name / "freq" / "value").set(0.0);
}
@@ -406,13 +446,11 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
_tree->create<double>(mb_path / "link_max_rate").set(USRP1_MAX_RATE_USB2);
}
-usrp1_impl::~usrp1_impl(void){
- UHD_SAFE_CALL(
- this->enable_rx(false);
- this->enable_tx(false);
- )
- _soft_time_ctrl->stop(); //stops cmd task before proceeding
- _io_impl.reset(); //stops vandal before other stuff gets deconstructed
+usrp1_impl::~usrp1_impl(void)
+{
+ UHD_SAFE_CALL(this->enable_rx(false); this->enable_tx(false);)
+ _soft_time_ctrl->stop(); // stops cmd task before proceeding
+ _io_impl.reset(); // stops vandal before other stuff gets deconstructed
}
/*!
@@ -424,22 +462,26 @@ usrp1_impl::~usrp1_impl(void){
* | Reserved |T|DUCs |R|DDCs |
* +-----------------------------------------------+-+-----+-+-----+
*/
-size_t usrp1_impl::get_num_ddcs(void){
+size_t usrp1_impl::get_num_ddcs(void)
+{
uint32_t regval = _iface->peek32(FR_RB_CAPS);
return (regval >> 0) & 0x0007;
}
-size_t usrp1_impl::get_num_ducs(void){
+size_t usrp1_impl::get_num_ducs(void)
+{
uint32_t regval = _iface->peek32(FR_RB_CAPS);
return (regval >> 4) & 0x0007;
}
-bool usrp1_impl::has_rx_halfband(void){
+bool usrp1_impl::has_rx_halfband(void)
+{
uint32_t regval = _iface->peek32(FR_RB_CAPS);
return (regval >> 3) & 0x0001;
}
-bool usrp1_impl::has_tx_halfband(void){
+bool usrp1_impl::has_tx_halfband(void)
+{
uint32_t regval = _iface->peek32(FR_RB_CAPS);
return (regval >> 7) & 0x0001;
}
@@ -447,46 +489,59 @@ bool usrp1_impl::has_tx_halfband(void){
/***********************************************************************
* Properties callback methods below
**********************************************************************/
-void usrp1_impl::set_db_eeprom(const std::string &db, const std::string &type, const uhd::usrp::dboard_eeprom_t &db_eeprom){
- if (type == "rx") db_eeprom.store(*_fx2_ctrl, (db == "A")? (I2C_ADDR_RX_A) : (I2C_ADDR_RX_B));
- if (type == "tx") db_eeprom.store(*_fx2_ctrl, (db == "A")? (I2C_ADDR_TX_A) : (I2C_ADDR_TX_B));
- if (type == "gdb") db_eeprom.store(*_fx2_ctrl, (db == "A")? (I2C_ADDR_TX_A ^ 5) : (I2C_ADDR_TX_B ^ 5));
+void usrp1_impl::set_db_eeprom(const std::string& db,
+ const std::string& type,
+ const uhd::usrp::dboard_eeprom_t& db_eeprom)
+{
+ if (type == "rx")
+ db_eeprom.store(*_fx2_ctrl, (db == "A") ? (I2C_ADDR_RX_A) : (I2C_ADDR_RX_B));
+ if (type == "tx")
+ db_eeprom.store(*_fx2_ctrl, (db == "A") ? (I2C_ADDR_TX_A) : (I2C_ADDR_TX_B));
+ if (type == "gdb")
+ db_eeprom.store(
+ *_fx2_ctrl, (db == "A") ? (I2C_ADDR_TX_A ^ 5) : (I2C_ADDR_TX_B ^ 5));
}
-double usrp1_impl::update_rx_codec_gain(const std::string &db, const double gain){
- //set gain on both I and Q, readback on one
- //TODO in the future, gains should have individual control
+double usrp1_impl::update_rx_codec_gain(const std::string& db, const double gain)
+{
+ // set gain on both I and Q, readback on one
+ // TODO in the future, gains should have individual control
_dbc[db].codec->set_rx_pga_gain(gain, 'A');
_dbc[db].codec->set_rx_pga_gain(gain, 'B');
return _dbc[db].codec->get_rx_pga_gain('A');
}
-uhd::meta_range_t usrp1_impl::get_rx_dsp_freq_range(void){
- return meta_range_t(-_master_clock_rate/2, +_master_clock_rate/2);
+uhd::meta_range_t usrp1_impl::get_rx_dsp_freq_range(void)
+{
+ return meta_range_t(-_master_clock_rate / 2, +_master_clock_rate / 2);
}
-uhd::meta_range_t usrp1_impl::get_tx_dsp_freq_range(void){
- //magic scalar comes from codec control:
- return meta_range_t(-_master_clock_rate*0.6875, +_master_clock_rate*0.6875);
+uhd::meta_range_t usrp1_impl::get_tx_dsp_freq_range(void)
+{
+ // magic scalar comes from codec control:
+ return meta_range_t(-_master_clock_rate * 0.6875, +_master_clock_rate * 0.6875);
}
-void usrp1_impl::set_enb_rx_dc_offset(const std::string &db, const bool enb){
- const size_t shift = (db == "A")? 0 : 2;
- _rx_dc_offset_shadow &= ~(0x3 << shift); //clear bits
- _rx_dc_offset_shadow |= ((enb)? 0x3 : 0x0) << shift;
+void usrp1_impl::set_enb_rx_dc_offset(const std::string& db, const bool enb)
+{
+ const size_t shift = (db == "A") ? 0 : 2;
+ _rx_dc_offset_shadow &= ~(0x3 << shift); // clear bits
+ _rx_dc_offset_shadow |= ((enb) ? 0x3 : 0x0) << shift;
_iface->poke32(FR_DC_OFFSET_CL_EN, _rx_dc_offset_shadow & 0xf);
}
-std::complex<double> usrp1_impl::set_rx_dc_offset(const std::string &db, const std::complex<double> &offset){
+std::complex<double> usrp1_impl::set_rx_dc_offset(
+ const std::string& db, const std::complex<double>& offset)
+{
const int32_t i_off = boost::math::iround(offset.real() * (1ul << 31));
const int32_t q_off = boost::math::iround(offset.imag() * (1ul << 31));
- if (db == "A"){
+ if (db == "A") {
_iface->poke32(FR_ADC_OFFSET_0, i_off);
_iface->poke32(FR_ADC_OFFSET_1, q_off);
}
- if (db == "B"){
+ if (db == "B") {
_iface->poke32(FR_ADC_OFFSET_2, i_off);
_iface->poke32(FR_ADC_OFFSET_3, q_off);
}
@@ -494,7 +549,7 @@ std::complex<double> usrp1_impl::set_rx_dc_offset(const std::string &db, const s
return std::complex<double>(double(i_off) * (1ul << 31), double(q_off) * (1ul << 31));
}
-void usrp1_impl::set_reg(const std::pair<uint8_t, uint32_t> &reg)
+void usrp1_impl::set_reg(const std::pair<uint8_t, uint32_t>& reg)
{
_iface->poke32(reg.first, reg.second);
}
diff --git a/host/lib/usrp/usrp1/usrp1_impl.hpp b/host/lib/usrp/usrp1/usrp1_impl.hpp
index 9e0a97f47..336b82baa 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.hpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.hpp
@@ -24,79 +24,79 @@
#include <memory>
#ifndef INCLUDED_USRP1_IMPL_HPP
-#define INCLUDED_USRP1_IMPL_HPP
+# define INCLUDED_USRP1_IMPL_HPP
static const std::string USRP1_EEPROM_MAP_KEY = "B000";
-static const size_t USRP1_MAX_RATE_USB2 = 32000000; // bytes/s
-
-#define FR_RB_CAPS 3
-#define FR_MODE 13
-#define FR_DEBUG_EN 14
-#define FR_DC_OFFSET_CL_EN 15
-#define FR_ADC_OFFSET_0 16
-#define FR_ADC_OFFSET_1 17
-#define FR_ADC_OFFSET_2 18
-#define FR_ADC_OFFSET_3 19
-
-#define I2C_DEV_EEPROM 0x50
-#define I2C_ADDR_BOOT (I2C_DEV_EEPROM | 0x0)
-#define I2C_ADDR_TX_A (I2C_DEV_EEPROM | 0x4)
-#define I2C_ADDR_RX_A (I2C_DEV_EEPROM | 0x5)
-#define I2C_ADDR_TX_B (I2C_DEV_EEPROM | 0x6)
-#define I2C_ADDR_RX_B (I2C_DEV_EEPROM | 0x7)
-
-#define SPI_ENABLE_CODEC_A 0x02
-#define SPI_ENABLE_CODEC_B 0x04
+static const size_t USRP1_MAX_RATE_USB2 = 32000000; // bytes/s
+
+# define FR_RB_CAPS 3
+# define FR_MODE 13
+# define FR_DEBUG_EN 14
+# define FR_DC_OFFSET_CL_EN 15
+# define FR_ADC_OFFSET_0 16
+# define FR_ADC_OFFSET_1 17
+# define FR_ADC_OFFSET_2 18
+# define FR_ADC_OFFSET_3 19
+
+# define I2C_DEV_EEPROM 0x50
+# define I2C_ADDR_BOOT (I2C_DEV_EEPROM | 0x0)
+# define I2C_ADDR_TX_A (I2C_DEV_EEPROM | 0x4)
+# define I2C_ADDR_RX_A (I2C_DEV_EEPROM | 0x5)
+# define I2C_ADDR_TX_B (I2C_DEV_EEPROM | 0x6)
+# define I2C_ADDR_RX_B (I2C_DEV_EEPROM | 0x7)
+
+# define SPI_ENABLE_CODEC_A 0x02
+# define SPI_ENABLE_CODEC_B 0x04
/*!
* USRP1 implementation guts:
* The implementation details are encapsulated here.
* Handles properties on the mboard, dboard, dsps...
*/
-class usrp1_impl : public uhd::device {
+class usrp1_impl : public uhd::device
+{
public:
//! used everywhere to differentiate slots/sides...
- enum dboard_slot_t{
- DBOARD_SLOT_A = 'A',
- DBOARD_SLOT_B = 'B'
- };
- //and a way to enumerate through a list of the above...
+ enum dboard_slot_t { DBOARD_SLOT_A = 'A', DBOARD_SLOT_B = 'B' };
+ // and a way to enumerate through a list of the above...
static const std::vector<dboard_slot_t> _dboard_slots;
- //structors
- usrp1_impl(const uhd::device_addr_t &);
+ // structors
+ usrp1_impl(const uhd::device_addr_t&);
~usrp1_impl(void);
- //the io interface
- uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t &args);
- uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &args);
- bool recv_async_msg(uhd::async_metadata_t &, double);
+ // the io interface
+ uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t& args);
+ uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t& args);
+ bool recv_async_msg(uhd::async_metadata_t&, double);
static uhd::usrp::mboard_eeprom_t get_mb_eeprom(uhd::i2c_iface::sptr);
private:
- //controllers
+ // controllers
uhd::usrp::fx2_ctrl::sptr _fx2_ctrl;
usrp1_iface::sptr _iface;
uhd::usrp::soft_time_ctrl::sptr _soft_time_ctrl;
uhd::transport::usb_zero_copy::sptr _data_transport;
- struct db_container_type{
+ struct db_container_type
+ {
usrp1_codec_ctrl::sptr codec;
uhd::usrp::dboard_manager::sptr dboard_manager;
};
uhd::dict<std::string, db_container_type> _dbc;
- double _master_clock_rate; //clock rate shadow
+ double _master_clock_rate; // clock rate shadow
- //weak pointers to streamers for update purposes
+ // weak pointers to streamers for update purposes
std::weak_ptr<uhd::rx_streamer> _rx_streamer;
std::weak_ptr<uhd::tx_streamer> _tx_streamer;
- void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t &);
- void set_db_eeprom(const std::string &, const std::string &, const uhd::usrp::dboard_eeprom_t &);
- double update_rx_codec_gain(const std::string &, const double); //sets A and B at once
- void update_rx_subdev_spec(const uhd::usrp::subdev_spec_t &);
- void update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &);
+ void set_mb_eeprom(const uhd::usrp::mboard_eeprom_t&);
+ void set_db_eeprom(
+ const std::string&, const std::string&, const uhd::usrp::dboard_eeprom_t&);
+ double update_rx_codec_gain(const std::string&, const double); // sets A and B at once
+ void update_rx_subdev_spec(const uhd::usrp::subdev_spec_t&);
+ void update_tx_subdev_spec(const uhd::usrp::subdev_spec_t&);
double update_rx_samp_rate(size_t dspno, const double);
double update_tx_samp_rate(size_t dspno, const double);
void update_rates(void);
@@ -108,76 +108,80 @@ private:
uhd::meta_range_t get_rx_dsp_host_rates(void);
uhd::meta_range_t get_tx_dsp_host_rates(void);
size_t _rx_dc_offset_shadow;
- void set_enb_rx_dc_offset(const std::string &db, const bool);
- std::complex<double> set_rx_dc_offset(const std::string &db, const std::complex<double> &);
+ void set_enb_rx_dc_offset(const std::string& db, const bool);
+ std::complex<double> set_rx_dc_offset(
+ const std::string& db, const std::complex<double>&);
- static uhd::usrp::dboard_iface::sptr make_dboard_iface(
- usrp1_iface::sptr,
+ static uhd::usrp::dboard_iface::sptr make_dboard_iface(usrp1_iface::sptr,
usrp1_codec_ctrl::sptr,
dboard_slot_t,
- const double &,
- const uhd::usrp::dboard_id_t &
- );
+ const double&,
+ const uhd::usrp::dboard_id_t&);
- //handle io stuff
+ // handle io stuff
UHD_PIMPL_DECL(io_impl) _io_impl;
void io_init(void);
void rx_stream_on_off(bool);
void tx_stream_on_off(bool);
void handle_overrun(size_t);
- //channel mapping shadows
+ // channel mapping shadows
uhd::usrp::subdev_spec_t _rx_subdev_spec, _tx_subdev_spec;
- //capabilities
+ // capabilities
size_t get_num_ducs(void);
size_t get_num_ddcs(void);
bool has_rx_halfband(void);
bool has_tx_halfband(void);
- void vandal_conquest_loop(std::atomic<bool> &);
+ void vandal_conquest_loop(std::atomic<bool>&);
- void set_reg(const std::pair<uint8_t, uint32_t> &reg);
+ void set_reg(const std::pair<uint8_t, uint32_t>& reg);
- //handle the enables
+ // handle the enables
bool _rx_enabled, _tx_enabled;
- void enable_rx(bool enb){
+ void enable_rx(bool enb)
+ {
_rx_enabled = enb;
_fx2_ctrl->usrp_rx_enable(enb);
}
- void enable_tx(bool enb){
+ void enable_tx(bool enb)
+ {
_tx_enabled = enb;
_fx2_ctrl->usrp_tx_enable(enb);
- for(const std::string &key: _dbc.keys())
- {
+ for (const std::string& key : _dbc.keys()) {
_dbc[key].codec->enable_tx_digital(enb);
}
}
- //conditionally disable and enable rx
- bool disable_rx(void){
- if (_rx_enabled){
+ // conditionally disable and enable rx
+ bool disable_rx(void)
+ {
+ if (_rx_enabled) {
enable_rx(false);
return true;
}
return false;
}
- void restore_rx(bool last){
- if (last != _rx_enabled){
+ void restore_rx(bool last)
+ {
+ if (last != _rx_enabled) {
enable_rx(last);
}
}
- //conditionally disable and enable tx
- bool disable_tx(void){
- if (_tx_enabled){
+ // conditionally disable and enable tx
+ bool disable_tx(void)
+ {
+ if (_tx_enabled) {
enable_tx(false);
return true;
}
return false;
}
- void restore_tx(bool last){
- if (last != _tx_enabled){
+ void restore_tx(bool last)
+ {
+ if (last != _tx_enabled) {
enable_tx(last);
}
}
diff --git a/host/lib/usrp/usrp2/clock_ctrl.cpp b/host/lib/usrp/usrp2/clock_ctrl.cpp
index 40f7c75f6..19a7fc1c5 100644
--- a/host/lib/usrp/usrp2/clock_ctrl.cpp
+++ b/host/lib/usrp/usrp2/clock_ctrl.cpp
@@ -8,10 +8,10 @@
#include "clock_ctrl.hpp"
#include "ad9510_regs.hpp"
-#include "usrp2_regs.hpp" //spi slave constants
#include "usrp2_clk_regs.hpp"
-#include <uhd/utils/safe_call.hpp>
+#include "usrp2_regs.hpp" //spi slave constants
#include <uhd/utils/assert_has.hpp>
+#include <uhd/utils/safe_call.hpp>
#include <uhdlib/utils/narrow.hpp>
#include <stdint.h>
#include <boost/math/special_functions/round.hpp>
@@ -21,17 +21,20 @@ using namespace uhd;
static const bool enb_test_clk = false;
-usrp2_clock_ctrl::~usrp2_clock_ctrl(void){
+usrp2_clock_ctrl::~usrp2_clock_ctrl(void)
+{
/* NOP */
}
/*!
* A usrp2 clock control specific to the ad9510 ic.
*/
-class usrp2_clock_ctrl_impl : public usrp2_clock_ctrl{
+class usrp2_clock_ctrl_impl : public usrp2_clock_ctrl
+{
public:
- usrp2_clock_ctrl_impl(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface){
- _iface = iface;
+ usrp2_clock_ctrl_impl(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface)
+ {
+ _iface = iface;
_spiface = spiface;
clk_regs = usrp2_clk_regs_t(_iface->get_rev());
@@ -44,7 +47,7 @@ public:
// But why not leave it in for those who want to mess with clock settings?
// 100mhz = 10mhz/R * (P*B + A)
- _ad9510_regs.pll_power_down = ad9510_regs_t::PLL_POWER_DOWN_NORMAL;
+ _ad9510_regs.pll_power_down = ad9510_regs_t::PLL_POWER_DOWN_NORMAL;
_ad9510_regs.prescaler_value = ad9510_regs_t::PRESCALER_VALUE_DIV2;
this->write_reg(clk_regs.pll_4);
@@ -74,181 +77,213 @@ public:
this->enable_test_clock(enb_test_clk);
}
- ~usrp2_clock_ctrl_impl(void){UHD_SAFE_CALL(
- //power down clock outputs
- this->enable_external_ref(false);
- this->enable_rx_dboard_clock(false);
- this->enable_tx_dboard_clock(false);
- this->enable_dac_clock(false);
- this->enable_adc_clock(false);
- this->enable_mimo_clock_out(false);
- this->enable_test_clock(false);
- )}
-
- void enable_mimo_clock_out(bool enb){
- //calculate the low and high dividers
- size_t divider = size_t(this->get_master_clock_rate()/10e6);
- size_t high = divider/2;
- size_t low = divider - high;
-
- switch(clk_regs.exp){
- case 2: //U2 rev 3
- _ad9510_regs.power_down_lvpecl_out2 = enb?
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_NORMAL :
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_SAFE_PD;
- _ad9510_regs.output_level_lvpecl_out2 = ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT2_810MV;
- //set the registers (divider - 1)
- _ad9510_regs.divider_low_cycles_out2 = uhd::narrow_cast<uint8_t>(low - 1);
- _ad9510_regs.divider_high_cycles_out2 = uhd::narrow_cast<uint8_t>(high - 1);
- _ad9510_regs.bypass_divider_out2 = 0;
- break;
-
- case 5: //U2 rev 4
- _ad9510_regs.power_down_lvds_cmos_out5 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out5 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_LVDS;
- _ad9510_regs.output_level_lvds_out5 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
- //set the registers (divider - 1)
- _ad9510_regs.divider_low_cycles_out5 = uhd::narrow_cast<uint8_t>(low - 1);
- _ad9510_regs.divider_high_cycles_out5 = uhd::narrow_cast<uint8_t>(high - 1);
- _ad9510_regs.bypass_divider_out5 = 0;
- break;
-
- case 6: //U2+
- _ad9510_regs.power_down_lvds_cmos_out6 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out6 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_LVDS;
- _ad9510_regs.output_level_lvds_out6 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA;
- //set the registers (divider - 1)
- _ad9510_regs.divider_low_cycles_out6 = uhd::narrow_cast<uint8_t>(low - 1);
- _ad9510_regs.divider_high_cycles_out6 = uhd::narrow_cast<uint8_t>(high - 1);
- _ad9510_regs.bypass_divider_out5 = 0;
- break;
-
- default:
- break;
+ ~usrp2_clock_ctrl_impl(void)
+ {
+ UHD_SAFE_CALL(
+ // power down clock outputs
+ this->enable_external_ref(false); this->enable_rx_dboard_clock(false);
+ this->enable_tx_dboard_clock(false);
+ this->enable_dac_clock(false);
+ this->enable_adc_clock(false);
+ this->enable_mimo_clock_out(false);
+ this->enable_test_clock(false);)
+ }
+
+ void enable_mimo_clock_out(bool enb)
+ {
+ // calculate the low and high dividers
+ size_t divider = size_t(this->get_master_clock_rate() / 10e6);
+ size_t high = divider / 2;
+ size_t low = divider - high;
+
+ switch (clk_regs.exp) {
+ case 2: // U2 rev 3
+ _ad9510_regs.power_down_lvpecl_out2 =
+ enb ? ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_NORMAL
+ : ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_SAFE_PD;
+ _ad9510_regs.output_level_lvpecl_out2 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT2_810MV;
+ // set the registers (divider - 1)
+ _ad9510_regs.divider_low_cycles_out2 = uhd::narrow_cast<uint8_t>(low - 1);
+ _ad9510_regs.divider_high_cycles_out2 =
+ uhd::narrow_cast<uint8_t>(high - 1);
+ _ad9510_regs.bypass_divider_out2 = 0;
+ break;
+
+ case 5: // U2 rev 4
+ _ad9510_regs.power_down_lvds_cmos_out5 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out5 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_LVDS;
+ _ad9510_regs.output_level_lvds_out5 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
+ // set the registers (divider - 1)
+ _ad9510_regs.divider_low_cycles_out5 = uhd::narrow_cast<uint8_t>(low - 1);
+ _ad9510_regs.divider_high_cycles_out5 =
+ uhd::narrow_cast<uint8_t>(high - 1);
+ _ad9510_regs.bypass_divider_out5 = 0;
+ break;
+
+ case 6: // U2+
+ _ad9510_regs.power_down_lvds_cmos_out6 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out6 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_LVDS;
+ _ad9510_regs.output_level_lvds_out6 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA;
+ // set the registers (divider - 1)
+ _ad9510_regs.divider_low_cycles_out6 = uhd::narrow_cast<uint8_t>(low - 1);
+ _ad9510_regs.divider_high_cycles_out6 =
+ uhd::narrow_cast<uint8_t>(high - 1);
+ _ad9510_regs.bypass_divider_out5 = 0;
+ break;
+
+ default:
+ break;
}
this->write_reg(clk_regs.output(clk_regs.exp));
this->write_reg(clk_regs.div_lo(clk_regs.exp));
this->update_regs();
}
- //uses output clock 7 (cmos)
- void enable_rx_dboard_clock(bool enb){
- switch(_iface->get_rev()) {
+ // uses output clock 7 (cmos)
+ void enable_rx_dboard_clock(bool enb)
+ {
+ switch (_iface->get_rev()) {
case usrp2_iface::USRP_N200_R4:
case usrp2_iface::USRP_N210_R4:
- _ad9510_regs.power_down_lvds_cmos_out7 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out7 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_LVDS;
- _ad9510_regs.output_level_lvds_out7 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA;
+ _ad9510_regs.power_down_lvds_cmos_out7 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out7 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_LVDS;
+ _ad9510_regs.output_level_lvds_out7 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA;
this->write_reg(clk_regs.output(clk_regs.rx_db));
this->update_regs();
break;
default:
- _ad9510_regs.power_down_lvds_cmos_out7 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out7 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_CMOS;
- _ad9510_regs.output_level_lvds_out7 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA;
+ _ad9510_regs.power_down_lvds_cmos_out7 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out7 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT7_CMOS;
+ _ad9510_regs.output_level_lvds_out7 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT7_1_75MA;
this->write_reg(clk_regs.output(clk_regs.rx_db));
this->update_regs();
break;
}
}
- void set_rate_rx_dboard_clock(double rate){
+ void set_rate_rx_dboard_clock(double rate)
+ {
assert_has(get_rates_rx_dboard_clock(), rate, "rx dboard clock rate");
- size_t divider = size_t(get_master_clock_rate()/rate);
- //bypass when the divider ratio is one
- _ad9510_regs.bypass_divider_out7 = (divider == 1)? 1 : 0;
- //calculate the low and high dividers
- size_t high = divider/2;
- size_t low = divider - high;
- //set the registers (divider - 1)
- _ad9510_regs.divider_low_cycles_out7 = uhd::narrow_cast<uint8_t>(low - 1);
+ size_t divider = size_t(get_master_clock_rate() / rate);
+ // bypass when the divider ratio is one
+ _ad9510_regs.bypass_divider_out7 = (divider == 1) ? 1 : 0;
+ // calculate the low and high dividers
+ size_t high = divider / 2;
+ size_t low = divider - high;
+ // set the registers (divider - 1)
+ _ad9510_regs.divider_low_cycles_out7 = uhd::narrow_cast<uint8_t>(low - 1);
_ad9510_regs.divider_high_cycles_out7 = uhd::narrow_cast<uint8_t>(high - 1);
- //write the registers
+ // write the registers
this->write_reg(clk_regs.div_lo(clk_regs.rx_db));
this->write_reg(clk_regs.div_hi(clk_regs.rx_db));
this->update_regs();
}
- std::vector<double> get_rates_rx_dboard_clock(void){
+ std::vector<double> get_rates_rx_dboard_clock(void)
+ {
std::vector<double> rates;
- for (size_t i = 1; i <= 16+16; i++) rates.push_back(get_master_clock_rate()/i);
+ for (size_t i = 1; i <= 16 + 16; i++)
+ rates.push_back(get_master_clock_rate() / i);
return rates;
}
- //uses output clock 6 (cmos) on USRP2, output clock 5 (cmos) on N200/N210 r3,
- //and output clock 5 (lvds) on N200/N210 r4
- void enable_tx_dboard_clock(bool enb){
- switch(_iface->get_rev()) {
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _ad9510_regs.power_down_lvds_cmos_out5 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out5 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_LVDS;
- _ad9510_regs.output_level_lvds_out5 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
- break;
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- _ad9510_regs.power_down_lvds_cmos_out5 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out5 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_CMOS;
- _ad9510_regs.output_level_lvds_out5 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
- break;
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- _ad9510_regs.power_down_lvds_cmos_out6 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out6 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_CMOS;
- _ad9510_regs.output_level_lvds_out6 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA;
- break;
-
- default:
- //throw uhd::not_implemented_error("enable_tx_dboard_clock: unknown hardware version");
- break;
+ // uses output clock 6 (cmos) on USRP2, output clock 5 (cmos) on N200/N210 r3,
+ // and output clock 5 (lvds) on N200/N210 r4
+ void enable_tx_dboard_clock(bool enb)
+ {
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _ad9510_regs.power_down_lvds_cmos_out5 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out5 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_LVDS;
+ _ad9510_regs.output_level_lvds_out5 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
+ break;
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ _ad9510_regs.power_down_lvds_cmos_out5 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out5 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT5_CMOS;
+ _ad9510_regs.output_level_lvds_out5 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT5_1_75MA;
+ break;
+ case usrp2_iface::USRP2_REV3:
+ case usrp2_iface::USRP2_REV4:
+ _ad9510_regs.power_down_lvds_cmos_out6 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out6 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT6_CMOS;
+ _ad9510_regs.output_level_lvds_out6 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT6_1_75MA;
+ break;
+
+ default:
+ // throw uhd::not_implemented_error("enable_tx_dboard_clock: unknown
+ // hardware version");
+ break;
}
this->write_reg(clk_regs.output(clk_regs.tx_db));
this->update_regs();
}
- void set_rate_tx_dboard_clock(double rate){
+ void set_rate_tx_dboard_clock(double rate)
+ {
assert_has(get_rates_tx_dboard_clock(), rate, "tx dboard clock rate");
- size_t divider = size_t(get_master_clock_rate()/rate);
- //bypass when the divider ratio is one
- _ad9510_regs.bypass_divider_out6 = (divider == 1)? 1 : 0;
- //calculate the low and high dividers
- size_t high = divider/2;
- size_t low = divider - high;
-
- switch(clk_regs.tx_db) {
- case 5: //USRP2+
- _ad9510_regs.bypass_divider_out5 = (divider == 1)? 1 : 0;
- _ad9510_regs.divider_low_cycles_out5 = uhd::narrow_cast<uint8_t>(low - 1);
- _ad9510_regs.divider_high_cycles_out5 = uhd::narrow_cast<uint8_t>(high - 1);
- break;
- case 6: //USRP2
- //bypass when the divider ratio is one
- _ad9510_regs.bypass_divider_out6 = (divider == 1)? 1 : 0;
- //set the registers (divider - 1)
- _ad9510_regs.divider_low_cycles_out6 = uhd::narrow_cast<uint8_t>(low - 1);
- _ad9510_regs.divider_high_cycles_out6 = uhd::narrow_cast<uint8_t>(high - 1);
- break;
+ size_t divider = size_t(get_master_clock_rate() / rate);
+ // bypass when the divider ratio is one
+ _ad9510_regs.bypass_divider_out6 = (divider == 1) ? 1 : 0;
+ // calculate the low and high dividers
+ size_t high = divider / 2;
+ size_t low = divider - high;
+
+ switch (clk_regs.tx_db) {
+ case 5: // USRP2+
+ _ad9510_regs.bypass_divider_out5 = (divider == 1) ? 1 : 0;
+ _ad9510_regs.divider_low_cycles_out5 = uhd::narrow_cast<uint8_t>(low - 1);
+ _ad9510_regs.divider_high_cycles_out5 =
+ uhd::narrow_cast<uint8_t>(high - 1);
+ break;
+ case 6: // USRP2
+ // bypass when the divider ratio is one
+ _ad9510_regs.bypass_divider_out6 = (divider == 1) ? 1 : 0;
+ // set the registers (divider - 1)
+ _ad9510_regs.divider_low_cycles_out6 = uhd::narrow_cast<uint8_t>(low - 1);
+ _ad9510_regs.divider_high_cycles_out6 =
+ uhd::narrow_cast<uint8_t>(high - 1);
+ break;
}
- //write the registers
+ // write the registers
this->write_reg(clk_regs.div_hi(clk_regs.tx_db));
this->write_reg(clk_regs.div_lo(clk_regs.tx_db));
this->update_regs();
}
- std::vector<double> get_rates_tx_dboard_clock(void){
- return get_rates_rx_dboard_clock(); //same master clock, same dividers...
+ std::vector<double> get_rates_tx_dboard_clock(void)
+ {
+ return get_rates_rx_dboard_clock(); // same master clock, same dividers...
}
-
- void enable_test_clock(bool enb) {
- _ad9510_regs.power_down_lvpecl_out0 = enb?
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT0_NORMAL :
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT0_SAFE_PD;
- _ad9510_regs.output_level_lvpecl_out0 = ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT0_810MV;
- _ad9510_regs.divider_low_cycles_out0 = 0;
+
+ void enable_test_clock(bool enb)
+ {
+ _ad9510_regs.power_down_lvpecl_out0 =
+ enb ? ad9510_regs_t::POWER_DOWN_LVPECL_OUT0_NORMAL
+ : ad9510_regs_t::POWER_DOWN_LVPECL_OUT0_SAFE_PD;
+ _ad9510_regs.output_level_lvpecl_out0 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT0_810MV;
+ _ad9510_regs.divider_low_cycles_out0 = 0;
_ad9510_regs.divider_high_cycles_out0 = 0;
- _ad9510_regs.bypass_divider_out0 = 1;
+ _ad9510_regs.bypass_divider_out0 = 1;
this->write_reg(0x3c);
this->write_reg(0x48);
this->write_reg(0x49);
@@ -258,64 +293,69 @@ public:
* If we are to use an external reference, enable the charge pump.
* \param enb true to enable the CP
*/
- void enable_external_ref(bool enb){
- _ad9510_regs.charge_pump_mode = (enb)?
- ad9510_regs_t::CHARGE_PUMP_MODE_NORMAL :
- ad9510_regs_t::CHARGE_PUMP_MODE_3STATE ;
+ void enable_external_ref(bool enb)
+ {
+ _ad9510_regs.charge_pump_mode = (enb) ? ad9510_regs_t::CHARGE_PUMP_MODE_NORMAL
+ : ad9510_regs_t::CHARGE_PUMP_MODE_3STATE;
_ad9510_regs.pll_mux_control = ad9510_regs_t::PLL_MUX_CONTROL_DLD_HIGH;
- _ad9510_regs.pfd_polarity = ad9510_regs_t::PFD_POLARITY_POS;
+ _ad9510_regs.pfd_polarity = ad9510_regs_t::PFD_POLARITY_POS;
this->write_reg(clk_regs.pll_2);
this->update_regs();
}
- double get_master_clock_rate(void){
+ double get_master_clock_rate(void)
+ {
return 100e6;
}
-
- void set_mimo_clock_delay(double delay) {
- //delay_val is a 5-bit value (0-31) for fine control
- //the equations below determine delay for a given ramp current, # of caps and fine delay register
- //delay range:
- //range_ns = 200*((caps+3)/i_ramp_ua)*1.3286
- //offset (zero delay):
- //offset_ns = 0.34 + (1600 - i_ramp_ua)*1e-4 + ((caps-1)/ramp)*6
- //delay_ns = offset_ns + range_ns * delay / 31
-
- int delay_val = boost::math::iround(delay/9.744e-9*31);
-
- if(delay_val == 0) {
- switch(clk_regs.exp) {
- case 5:
- _ad9510_regs.delay_control_out5 = 1;
- break;
- case 6:
- _ad9510_regs.delay_control_out6 = 1;
- break;
- default:
- break; //delay not supported on U2 rev 3
+
+ void set_mimo_clock_delay(double delay)
+ {
+ // delay_val is a 5-bit value (0-31) for fine control
+ // the equations below determine delay for a given ramp current, # of caps and
+ // fine delay register delay range: range_ns = 200*((caps+3)/i_ramp_ua)*1.3286
+ // offset (zero delay):
+ // offset_ns = 0.34 + (1600 - i_ramp_ua)*1e-4 + ((caps-1)/ramp)*6
+ // delay_ns = offset_ns + range_ns * delay / 31
+
+ int delay_val = boost::math::iround(delay / 9.744e-9 * 31);
+
+ if (delay_val == 0) {
+ switch (clk_regs.exp) {
+ case 5:
+ _ad9510_regs.delay_control_out5 = 1;
+ break;
+ case 6:
+ _ad9510_regs.delay_control_out6 = 1;
+ break;
+ default:
+ break; // delay not supported on U2 rev 3
}
} else {
- switch(clk_regs.exp) {
- case 5:
- _ad9510_regs.delay_control_out5 = 0;
- _ad9510_regs.ramp_current_out5 = ad9510_regs_t::RAMP_CURRENT_OUT5_200UA;
- _ad9510_regs.ramp_capacitor_out5 = ad9510_regs_t::RAMP_CAPACITOR_OUT5_4CAPS;
- _ad9510_regs.delay_fine_adjust_out5 = delay_val;
- this->write_reg(0x34);
- this->write_reg(0x35);
- this->write_reg(0x36);
- break;
- case 6:
- _ad9510_regs.delay_control_out6 = 0;
- _ad9510_regs.ramp_current_out6 = ad9510_regs_t::RAMP_CURRENT_OUT6_200UA;
- _ad9510_regs.ramp_capacitor_out6 = ad9510_regs_t::RAMP_CAPACITOR_OUT6_4CAPS;
- _ad9510_regs.delay_fine_adjust_out6 = delay_val;
- this->write_reg(0x38);
- this->write_reg(0x39);
- this->write_reg(0x3A);
- break;
- default:
- break;
+ switch (clk_regs.exp) {
+ case 5:
+ _ad9510_regs.delay_control_out5 = 0;
+ _ad9510_regs.ramp_current_out5 =
+ ad9510_regs_t::RAMP_CURRENT_OUT5_200UA;
+ _ad9510_regs.ramp_capacitor_out5 =
+ ad9510_regs_t::RAMP_CAPACITOR_OUT5_4CAPS;
+ _ad9510_regs.delay_fine_adjust_out5 = delay_val;
+ this->write_reg(0x34);
+ this->write_reg(0x35);
+ this->write_reg(0x36);
+ break;
+ case 6:
+ _ad9510_regs.delay_control_out6 = 0;
+ _ad9510_regs.ramp_current_out6 =
+ ad9510_regs_t::RAMP_CURRENT_OUT6_200UA;
+ _ad9510_regs.ramp_capacitor_out6 =
+ ad9510_regs_t::RAMP_CAPACITOR_OUT6_4CAPS;
+ _ad9510_regs.delay_fine_adjust_out6 = delay_val;
+ this->write_reg(0x38);
+ this->write_reg(0x39);
+ this->write_reg(0x3A);
+ break;
+ default:
+ break;
}
}
}
@@ -325,7 +365,8 @@ private:
* Write a single register to the spi regs.
* \param addr the address to write
*/
- void write_reg(uint8_t addr){
+ void write_reg(uint8_t addr)
+ {
uint32_t data = _ad9510_regs.get_write_reg(addr);
_spiface->write_spi(SPI_SS_AD9510, spi_config_t::EDGE_RISE, data, 24);
}
@@ -333,45 +374,54 @@ private:
/*!
* Tells the ad9510 to latch the settings into the operational registers.
*/
- void update_regs(void){
+ void update_regs(void)
+ {
_ad9510_regs.update_registers = 1;
this->write_reg(clk_regs.update);
}
- //uses output clock 3 (pecl)
- //this is the same between USRP2 and USRP2+ and doesn't get a switch statement
- void enable_dac_clock(bool enb){
- _ad9510_regs.power_down_lvpecl_out3 = (enb)?
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT3_NORMAL :
- ad9510_regs_t::POWER_DOWN_LVPECL_OUT3_SAFE_PD;
- _ad9510_regs.output_level_lvpecl_out3 = ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT3_810MV;
+ // uses output clock 3 (pecl)
+ // this is the same between USRP2 and USRP2+ and doesn't get a switch statement
+ void enable_dac_clock(bool enb)
+ {
+ _ad9510_regs.power_down_lvpecl_out3 =
+ (enb) ? ad9510_regs_t::POWER_DOWN_LVPECL_OUT3_NORMAL
+ : ad9510_regs_t::POWER_DOWN_LVPECL_OUT3_SAFE_PD;
+ _ad9510_regs.output_level_lvpecl_out3 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT3_810MV;
_ad9510_regs.bypass_divider_out3 = 1;
this->write_reg(clk_regs.output(clk_regs.dac));
this->write_reg(clk_regs.div_hi(clk_regs.dac));
this->update_regs();
}
- //uses output clock 4 (lvds) on USRP2 and output clock 2 (lvpecl) on USRP2+
- void enable_adc_clock(bool enb){
- switch(clk_regs.adc) {
- case 2:
- _ad9510_regs.power_down_lvpecl_out2 = enb? ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_NORMAL : ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_SAFE_PD;
- _ad9510_regs.output_level_lvpecl_out2 = ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT2_500MV;
- _ad9510_regs.bypass_divider_out2 = 1;
- break;
- case 4:
- _ad9510_regs.power_down_lvds_cmos_out4 = enb? 0 : 1;
- _ad9510_regs.lvds_cmos_select_out4 = ad9510_regs_t::LVDS_CMOS_SELECT_OUT4_LVDS;
- _ad9510_regs.output_level_lvds_out4 = ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT4_1_75MA;
- _ad9510_regs.bypass_divider_out4 = 1;
- break;
+ // uses output clock 4 (lvds) on USRP2 and output clock 2 (lvpecl) on USRP2+
+ void enable_adc_clock(bool enb)
+ {
+ switch (clk_regs.adc) {
+ case 2:
+ _ad9510_regs.power_down_lvpecl_out2 =
+ enb ? ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_NORMAL
+ : ad9510_regs_t::POWER_DOWN_LVPECL_OUT2_SAFE_PD;
+ _ad9510_regs.output_level_lvpecl_out2 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVPECL_OUT2_500MV;
+ _ad9510_regs.bypass_divider_out2 = 1;
+ break;
+ case 4:
+ _ad9510_regs.power_down_lvds_cmos_out4 = enb ? 0 : 1;
+ _ad9510_regs.lvds_cmos_select_out4 =
+ ad9510_regs_t::LVDS_CMOS_SELECT_OUT4_LVDS;
+ _ad9510_regs.output_level_lvds_out4 =
+ ad9510_regs_t::OUTPUT_LEVEL_LVDS_OUT4_1_75MA;
+ _ad9510_regs.bypass_divider_out4 = 1;
+ break;
}
this->write_reg(clk_regs.output(clk_regs.adc));
this->write_reg(clk_regs.div_hi(clk_regs.adc));
this->update_regs();
}
-
+
usrp2_iface::sptr _iface;
uhd::spi_iface::sptr _spiface;
usrp2_clk_regs_t clk_regs;
@@ -381,6 +431,8 @@ private:
/***********************************************************************
* Public make function for the ad9510 clock control
**********************************************************************/
-usrp2_clock_ctrl::sptr usrp2_clock_ctrl::make(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface){
+usrp2_clock_ctrl::sptr usrp2_clock_ctrl::make(
+ usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface)
+{
return sptr(new usrp2_clock_ctrl_impl(iface, spiface));
}
diff --git a/host/lib/usrp/usrp2/clock_ctrl.hpp b/host/lib/usrp/usrp2/clock_ctrl.hpp
index b82dd4723..d1e8ee551 100644
--- a/host/lib/usrp/usrp2/clock_ctrl.hpp
+++ b/host/lib/usrp/usrp2/clock_ctrl.hpp
@@ -13,7 +13,8 @@
#include <memory>
#include <vector>
-class usrp2_clock_ctrl : uhd::noncopyable{
+class usrp2_clock_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<usrp2_clock_ctrl> sptr;
@@ -76,7 +77,7 @@ public:
* \param enb true to enable
*/
virtual void enable_external_ref(bool enb) = 0;
-
+
/*!
* Enable/disable test clock output.
* \param enb true to enable
@@ -88,7 +89,7 @@ public:
* \param enb true to enable
*/
virtual void enable_mimo_clock_out(bool enb) = 0;
-
+
/*!
* Set the output delay of the mimo clock
* Used to synchronise daisy-chained USRPs over the MIMO cable
@@ -96,7 +97,6 @@ public:
* \param delay the clock delay in seconds
*/
virtual void set_mimo_clock_delay(double delay) = 0;
-
};
#endif /* INCLUDED_CLOCK_CTRL_HPP */
diff --git a/host/lib/usrp/usrp2/codec_ctrl.cpp b/host/lib/usrp/usrp2/codec_ctrl.cpp
index 88f6007e8..6fe91da9e 100644
--- a/host/lib/usrp/usrp2/codec_ctrl.cpp
+++ b/host/lib/usrp/usrp2/codec_ctrl.cpp
@@ -9,173 +9,197 @@
#include "ad9777_regs.hpp"
#include "ads62p44_regs.hpp"
#include "usrp2_regs.hpp"
+#include <uhd/exception.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
-#include <uhd/exception.hpp>
#include <stdint.h>
using namespace uhd;
-usrp2_codec_ctrl::~usrp2_codec_ctrl(void){
+usrp2_codec_ctrl::~usrp2_codec_ctrl(void)
+{
/* NOP */
}
/*!
* A usrp2 codec control specific to the ad9777 ic.
*/
-class usrp2_codec_ctrl_impl : public usrp2_codec_ctrl{
+class usrp2_codec_ctrl_impl : public usrp2_codec_ctrl
+{
public:
- usrp2_codec_ctrl_impl(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface){
- _iface = iface;
+ usrp2_codec_ctrl_impl(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface)
+ {
+ _iface = iface;
_spiface = spiface;
- //setup the ad9777 dac
- _ad9777_regs.x_1r_2r_mode = ad9777_regs_t::X_1R_2R_MODE_1R;
+ // setup the ad9777 dac
+ _ad9777_regs.x_1r_2r_mode = ad9777_regs_t::X_1R_2R_MODE_1R;
_ad9777_regs.filter_interp_rate = ad9777_regs_t::FILTER_INTERP_RATE_4X;
- _ad9777_regs.mix_mode = ad9777_regs_t::MIX_MODE_COMPLEX;
- _ad9777_regs.pll_divide_ratio = ad9777_regs_t::PLL_DIVIDE_RATIO_DIV1;
- _ad9777_regs.pll_state = ad9777_regs_t::PLL_STATE_ON;
- _ad9777_regs.auto_cp_control = ad9777_regs_t::AUTO_CP_CONTROL_AUTO;
- //I dac values
- _ad9777_regs.idac_fine_gain_adjust = 0;
+ _ad9777_regs.mix_mode = ad9777_regs_t::MIX_MODE_COMPLEX;
+ _ad9777_regs.pll_divide_ratio = ad9777_regs_t::PLL_DIVIDE_RATIO_DIV1;
+ _ad9777_regs.pll_state = ad9777_regs_t::PLL_STATE_ON;
+ _ad9777_regs.auto_cp_control = ad9777_regs_t::AUTO_CP_CONTROL_AUTO;
+ // I dac values
+ _ad9777_regs.idac_fine_gain_adjust = 0;
_ad9777_regs.idac_coarse_gain_adjust = 0xf;
- _ad9777_regs.idac_offset_adjust_lsb = 0;
- _ad9777_regs.idac_offset_adjust_msb = 0;
- //Q dac values
- _ad9777_regs.qdac_fine_gain_adjust = 0;
+ _ad9777_regs.idac_offset_adjust_lsb = 0;
+ _ad9777_regs.idac_offset_adjust_msb = 0;
+ // Q dac values
+ _ad9777_regs.qdac_fine_gain_adjust = 0;
_ad9777_regs.qdac_coarse_gain_adjust = 0xf;
- _ad9777_regs.qdac_offset_adjust_lsb = 0;
- _ad9777_regs.qdac_offset_adjust_msb = 0;
- //write all regs
- for(uint8_t addr = 0; addr <= 0xC; addr++){
+ _ad9777_regs.qdac_offset_adjust_lsb = 0;
+ _ad9777_regs.qdac_offset_adjust_msb = 0;
+ // write all regs
+ for (uint8_t addr = 0; addr <= 0xC; addr++) {
this->send_ad9777_reg(addr);
}
set_tx_mod_mode(0);
- //power-up adc
- switch(_iface->get_rev()){
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- _iface->poke32(U2_REG_MISC_CTRL_ADC, U2_FLAG_MISC_CTRL_ADC_ON);
- break;
-
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- _ads62p44_regs.reset = 1;
- this->send_ads62p44_reg(0x00); //issue a reset to the ADC
- //everything else should be pretty much default, i think
- //_ads62p44_regs.decimation = DECIMATION_DECIMATE_1;
- _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_NORMAL;
- this->send_ads62p44_reg(0x14);
- this->set_rx_analog_gain(1);
- break;
-
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _ads62p44_regs.reset = 1;
- this->send_ads62p44_reg(0x00); //issue a reset to the ADC
- //everything else should be pretty much default, i think
- //_ads62p44_regs.decimation = DECIMATION_DECIMATE_1;
- _ads62p44_regs.override = 1;
- this->send_ads62p44_reg(0x14);
- _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_NORMAL;
- _ads62p44_regs.output_interface = ads62p44_regs_t::OUTPUT_INTERFACE_LVDS;
- _ads62p44_regs.lvds_current = ads62p44_regs_t::LVDS_CURRENT_2_5MA;
- _ads62p44_regs.lvds_data_term = ads62p44_regs_t::LVDS_DATA_TERM_100;
- this->send_ads62p44_reg(0x11);
- this->send_ads62p44_reg(0x12);
- this->send_ads62p44_reg(0x14);
- this->set_rx_analog_gain(1);
- break;
-
- case usrp2_iface::USRP_NXXX: break;
+ // power-up adc
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP2_REV3:
+ case usrp2_iface::USRP2_REV4:
+ _iface->poke32(U2_REG_MISC_CTRL_ADC, U2_FLAG_MISC_CTRL_ADC_ON);
+ break;
+
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ _ads62p44_regs.reset = 1;
+ this->send_ads62p44_reg(0x00); // issue a reset to the ADC
+ // everything else should be pretty much default, i think
+ //_ads62p44_regs.decimation = DECIMATION_DECIMATE_1;
+ _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_NORMAL;
+ this->send_ads62p44_reg(0x14);
+ this->set_rx_analog_gain(1);
+ break;
+
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _ads62p44_regs.reset = 1;
+ this->send_ads62p44_reg(0x00); // issue a reset to the ADC
+ // everything else should be pretty much default, i think
+ //_ads62p44_regs.decimation = DECIMATION_DECIMATE_1;
+ _ads62p44_regs.override = 1;
+ this->send_ads62p44_reg(0x14);
+ _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_NORMAL;
+ _ads62p44_regs.output_interface = ads62p44_regs_t::OUTPUT_INTERFACE_LVDS;
+ _ads62p44_regs.lvds_current = ads62p44_regs_t::LVDS_CURRENT_2_5MA;
+ _ads62p44_regs.lvds_data_term = ads62p44_regs_t::LVDS_DATA_TERM_100;
+ this->send_ads62p44_reg(0x11);
+ this->send_ads62p44_reg(0x12);
+ this->send_ads62p44_reg(0x14);
+ this->set_rx_analog_gain(1);
+ break;
+
+ case usrp2_iface::USRP_NXXX:
+ break;
}
}
- ~usrp2_codec_ctrl_impl(void){UHD_SAFE_CALL(
- //power-down dac
- _ad9777_regs.power_down_mode = 1;
- this->send_ad9777_reg(0);
-
- //power-down adc
- switch(_iface->get_rev()){
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- _iface->poke32(U2_REG_MISC_CTRL_ADC, U2_FLAG_MISC_CTRL_ADC_OFF);
- break;
-
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- //send a global power-down to the ADC here... it will get lifted on reset
- _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_GLOBAL_PD;
- this->send_ads62p44_reg(0x14);
- break;
-
- case usrp2_iface::USRP_NXXX: break;
- }
- )}
-
- void set_tx_mod_mode(int mod_mode){
- //set the sign of the frequency shift
- _ad9777_regs.modulation_form = (mod_mode > 0)?
- ad9777_regs_t::MODULATION_FORM_E_PLUS_JWT:
- ad9777_regs_t::MODULATION_FORM_E_MINUS_JWT
- ;
-
- //set the frequency shift
- switch(std::abs(mod_mode)){
- case 0:
- case 1: _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_NONE; break;
- case 2: _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_2; break;
- case 4: _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_4; break;
- case 8: _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_8; break;
- default: throw uhd::value_error("unknown modulation mode for ad9777");
+ ~usrp2_codec_ctrl_impl(void)
+ {
+ UHD_SAFE_CALL(
+ // power-down dac
+ _ad9777_regs.power_down_mode = 1; this->send_ad9777_reg(0);
+
+ // power-down adc
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP2_REV3:
+ case usrp2_iface::USRP2_REV4:
+ _iface->poke32(U2_REG_MISC_CTRL_ADC, U2_FLAG_MISC_CTRL_ADC_OFF);
+ break;
+
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ // send a global power-down to the ADC here... it will get lifted on
+ // reset
+ _ads62p44_regs.power_down = ads62p44_regs_t::POWER_DOWN_GLOBAL_PD;
+ this->send_ads62p44_reg(0x14);
+ break;
+
+ case usrp2_iface::USRP_NXXX:
+ break;
+ })
+ }
+
+ void set_tx_mod_mode(int mod_mode)
+ {
+ // set the sign of the frequency shift
+ _ad9777_regs.modulation_form = (mod_mode > 0)
+ ? ad9777_regs_t::MODULATION_FORM_E_PLUS_JWT
+ : ad9777_regs_t::MODULATION_FORM_E_MINUS_JWT;
+
+ // set the frequency shift
+ switch (std::abs(mod_mode)) {
+ case 0:
+ case 1:
+ _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_NONE;
+ break;
+ case 2:
+ _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_2;
+ break;
+ case 4:
+ _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_4;
+ break;
+ case 8:
+ _ad9777_regs.modulation_mode = ad9777_regs_t::MODULATION_MODE_FS_8;
+ break;
+ default:
+ throw uhd::value_error("unknown modulation mode for ad9777");
}
- this->send_ad9777_reg(0x01); //set the register
+ this->send_ad9777_reg(0x01); // set the register
}
- void set_rx_digital_gain(double gain) { //fine digital gain
- switch(_iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _ads62p44_regs.fine_gain = int(gain/0.5);
- this->send_ads62p44_reg(0x17);
- break;
-
- default: UHD_THROW_INVALID_CODE_PATH();
+ void set_rx_digital_gain(double gain)
+ { // fine digital gain
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _ads62p44_regs.fine_gain = int(gain / 0.5);
+ this->send_ads62p44_reg(0x17);
+ break;
+
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
- void set_rx_digital_fine_gain(double gain) { //gain correction
- switch(_iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _ads62p44_regs.gain_correction = int(gain / 0.05);
- this->send_ads62p44_reg(0x1A);
- break;
-
- default: UHD_THROW_INVALID_CODE_PATH();
+ void set_rx_digital_fine_gain(double gain)
+ { // gain correction
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _ads62p44_regs.gain_correction = int(gain / 0.05);
+ this->send_ads62p44_reg(0x1A);
+ break;
+
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
- void set_rx_analog_gain(bool /*gain*/) { //turns on/off analog 3.5dB preamp
- switch(_iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _ads62p44_regs.coarse_gain = ads62p44_regs_t::COARSE_GAIN_3_5DB;//gain ? ads62p44_regs_t::COARSE_GAIN_3_5DB : ads62p44_regs_t::COARSE_GAIN_0DB;
- this->send_ads62p44_reg(0x14);
- break;
-
- default: UHD_THROW_INVALID_CODE_PATH();
+ void set_rx_analog_gain(bool /*gain*/)
+ { // turns on/off analog 3.5dB preamp
+ switch (_iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _ads62p44_regs.coarse_gain = ads62p44_regs_t::
+ COARSE_GAIN_3_5DB; // gain ? ads62p44_regs_t::COARSE_GAIN_3_5DB :
+ // ads62p44_regs_t::COARSE_GAIN_0DB;
+ this->send_ads62p44_reg(0x14);
+ break;
+
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
@@ -190,27 +214,25 @@ private:
usrp2_iface::sptr _iface;
uhd::spi_iface::sptr _spiface;
- void send_ad9777_reg(uint8_t addr){
+ void send_ad9777_reg(uint8_t addr)
+ {
uint16_t reg = _ad9777_regs.get_write_reg(addr);
UHD_LOG_TRACE("USRP2", "send_ad9777_reg: 0x" << std::hex << reg);
- _spiface->write_spi(
- SPI_SS_AD9777, spi_config_t::EDGE_RISE,
- reg, 16
- );
+ _spiface->write_spi(SPI_SS_AD9777, spi_config_t::EDGE_RISE, reg, 16);
}
- void send_ads62p44_reg(uint8_t addr) {
+ void send_ads62p44_reg(uint8_t addr)
+ {
uint16_t reg = _ads62p44_regs.get_write_reg(addr);
- _spiface->write_spi(
- SPI_SS_ADS62P44, spi_config_t::EDGE_FALL,
- reg, 16
- );
+ _spiface->write_spi(SPI_SS_ADS62P44, spi_config_t::EDGE_FALL, reg, 16);
}
};
/***********************************************************************
* Public make function for the usrp2 codec control
**********************************************************************/
-usrp2_codec_ctrl::sptr usrp2_codec_ctrl::make(usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface){
+usrp2_codec_ctrl::sptr usrp2_codec_ctrl::make(
+ usrp2_iface::sptr iface, uhd::spi_iface::sptr spiface)
+{
return sptr(new usrp2_codec_ctrl_impl(iface, spiface));
}
diff --git a/host/lib/usrp/usrp2/codec_ctrl.hpp b/host/lib/usrp/usrp2/codec_ctrl.hpp
index c769d102a..550e7208a 100644
--- a/host/lib/usrp/usrp2/codec_ctrl.hpp
+++ b/host/lib/usrp/usrp2/codec_ctrl.hpp
@@ -9,10 +9,11 @@
#define INCLUDED_CODEC_CTRL_HPP
#include "usrp2_iface.hpp"
-#include <memory>
#include <uhd/utils/noncopyable.hpp>
+#include <memory>
-class usrp2_codec_ctrl : uhd::noncopyable{
+class usrp2_codec_ctrl : uhd::noncopyable
+{
public:
typedef std::shared_ptr<usrp2_codec_ctrl> sptr;
@@ -62,7 +63,6 @@ public:
* modulation.
*/
virtual size_t get_tx_interpolation() const = 0;
-
};
#endif /* INCLUDED_CODEC_CTRL_HPP */
diff --git a/host/lib/usrp/usrp2/dboard_iface.cpp b/host/lib/usrp/usrp2/dboard_iface.cpp
index a245705df..55325dafc 100644
--- a/host/lib/usrp/usrp2/dboard_iface.cpp
+++ b/host/lib/usrp/usrp2/dboard_iface.cpp
@@ -5,39 +5,39 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "ad5623_regs.hpp" //aux dac
+#include "ad7922_regs.hpp" //aux adc
#include "clock_ctrl.hpp"
-#include "usrp2_regs.hpp" //wishbone address constants
#include "usrp2_fifo_ctrl.hpp"
-#include "ad7922_regs.hpp" //aux adc
-#include "ad5623_regs.hpp" //aux dac
-#include <uhdlib/usrp/cores/gpio_core_200.hpp>
+#include "usrp2_regs.hpp" //wishbone address constants
+#include <uhd/exception.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_iface.hpp>
-#include <uhd/types/dict.hpp>
-#include <uhd/exception.hpp>
#include <uhd/utils/algorithm.hpp>
-#include <boost/assign/list_of.hpp>
+#include <uhdlib/usrp/cores/gpio_core_200.hpp>
#include <boost/asio.hpp> //htonl and ntohl
+#include <boost/assign/list_of.hpp>
#include <boost/math/special_functions/round.hpp>
using namespace uhd;
using namespace uhd::usrp;
using namespace boost::assign;
-class usrp2_dboard_iface : public dboard_iface{
+class usrp2_dboard_iface : public dboard_iface
+{
public:
- usrp2_dboard_iface(
- timed_wb_iface::sptr wb_iface,
+ usrp2_dboard_iface(timed_wb_iface::sptr wb_iface,
uhd::i2c_iface::sptr i2c_iface,
uhd::spi_iface::sptr spi_iface,
- usrp2_clock_ctrl::sptr clock_ctrl
- );
+ usrp2_clock_ctrl::sptr clock_ctrl);
~usrp2_dboard_iface(void);
- special_props_t get_special_props(void){
+ special_props_t get_special_props(void)
+ {
special_props_t props;
props.soft_clock_divider = false;
- props.mangle_i2c_addrs = false;
+ props.mangle_i2c_addrs = false;
return props;
}
@@ -46,7 +46,8 @@ public:
void set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_pin_ctrl(unit_t unit);
- void set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
+ void set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_atr_reg(unit_t unit, atr_reg_t reg);
void set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask = 0xffffffff);
uint32_t get_gpio_ddr(unit_t unit);
@@ -57,7 +58,7 @@ public:
void set_command_time(const uhd::time_spec_t& t);
uhd::time_spec_t get_command_time(void);
- void write_i2c(uint16_t, const byte_vector_t &);
+ void write_i2c(uint16_t, const byte_vector_t&);
byte_vector_t read_i2c(uint16_t, size_t);
void set_clock_rate(unit_t, double);
@@ -65,21 +66,14 @@ public:
std::vector<double> get_clock_rates(unit_t);
void set_clock_enabled(unit_t, bool);
double get_codec_rate(unit_t);
- void set_fe_connection(unit_t unit, const std::string&, const fe_connection_t& fe_conn);
+ void set_fe_connection(
+ unit_t unit, const std::string&, const fe_connection_t& fe_conn);
void write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
uint32_t read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
- );
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits);
private:
timed_wb_iface::sptr _wb_iface;
@@ -96,241 +90,264 @@ private:
/***********************************************************************
* Make Function
**********************************************************************/
-dboard_iface::sptr make_usrp2_dboard_iface(
- timed_wb_iface::sptr wb_iface,
+dboard_iface::sptr make_usrp2_dboard_iface(timed_wb_iface::sptr wb_iface,
uhd::i2c_iface::sptr i2c_iface,
uhd::spi_iface::sptr spi_iface,
- usrp2_clock_ctrl::sptr clock_ctrl
-){
- return dboard_iface::sptr(new usrp2_dboard_iface(wb_iface, i2c_iface, spi_iface, clock_ctrl));
+ usrp2_clock_ctrl::sptr clock_ctrl)
+{
+ return dboard_iface::sptr(
+ new usrp2_dboard_iface(wb_iface, i2c_iface, spi_iface, clock_ctrl));
}
/***********************************************************************
* Structors
**********************************************************************/
-usrp2_dboard_iface::usrp2_dboard_iface(
- timed_wb_iface::sptr wb_iface,
+usrp2_dboard_iface::usrp2_dboard_iface(timed_wb_iface::sptr wb_iface,
uhd::i2c_iface::sptr i2c_iface,
uhd::spi_iface::sptr spi_iface,
- usrp2_clock_ctrl::sptr clock_ctrl
-):
- _wb_iface(wb_iface),
- _i2c_iface(i2c_iface),
- _spi_iface(spi_iface),
- _clock_ctrl(clock_ctrl)
+ usrp2_clock_ctrl::sptr clock_ctrl)
+ : _wb_iface(wb_iface)
+ , _i2c_iface(i2c_iface)
+ , _spi_iface(spi_iface)
+ , _clock_ctrl(clock_ctrl)
{
_gpio = gpio_core_200::make(wb_iface, U2_REG_SR_ADDR(SR_GPIO), U2_REG_GPIO_RB);
- //reset the aux dacs
+ // reset the aux dacs
_dac_regs[UNIT_RX] = ad5623_regs_t();
_dac_regs[UNIT_TX] = ad5623_regs_t();
- for(unit_t unit: _dac_regs.keys()){
+ for (unit_t unit : _dac_regs.keys()) {
_dac_regs[unit].data = 1;
_dac_regs[unit].addr = ad5623_regs_t::ADDR_ALL;
_dac_regs[unit].cmd = ad5623_regs_t::CMD_RESET;
this->_write_aux_dac(unit);
}
- //init the clock rate shadows with max rate clock
+ // init the clock rate shadows with max rate clock
this->set_clock_rate(UNIT_RX, sorted(this->get_clock_rates(UNIT_RX)).back());
this->set_clock_rate(UNIT_TX, sorted(this->get_clock_rates(UNIT_TX)).back());
}
-usrp2_dboard_iface::~usrp2_dboard_iface(void){
+usrp2_dboard_iface::~usrp2_dboard_iface(void)
+{
/* NOP */
}
/***********************************************************************
* Clocks
**********************************************************************/
-void usrp2_dboard_iface::set_clock_rate(unit_t unit, double rate){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- _clock_rates[unit] = rate; //set to shadow
- switch(unit){
- case UNIT_RX: _clock_ctrl->set_rate_rx_dboard_clock(rate); return;
- case UNIT_TX: _clock_ctrl->set_rate_tx_dboard_clock(rate); return;
- default: UHD_THROW_INVALID_CODE_PATH();
+void usrp2_dboard_iface::set_clock_rate(unit_t unit, double rate)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ _clock_rates[unit] = rate; // set to shadow
+ switch (unit) {
+ case UNIT_RX:
+ _clock_ctrl->set_rate_rx_dboard_clock(rate);
+ return;
+ case UNIT_TX:
+ _clock_ctrl->set_rate_tx_dboard_clock(rate);
+ return;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-double usrp2_dboard_iface::get_clock_rate(unit_t unit){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- return _clock_rates[unit]; //get from shadow
+double usrp2_dboard_iface::get_clock_rate(unit_t unit)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ return _clock_rates[unit]; // get from shadow
}
-std::vector<double> usrp2_dboard_iface::get_clock_rates(unit_t unit){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- switch(unit){
- case UNIT_RX: return _clock_ctrl->get_rates_rx_dboard_clock();
- case UNIT_TX: return _clock_ctrl->get_rates_tx_dboard_clock();
- default: UHD_THROW_INVALID_CODE_PATH();
+std::vector<double> usrp2_dboard_iface::get_clock_rates(unit_t unit)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ switch (unit) {
+ case UNIT_RX:
+ return _clock_ctrl->get_rates_rx_dboard_clock();
+ case UNIT_TX:
+ return _clock_ctrl->get_rates_tx_dboard_clock();
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-void usrp2_dboard_iface::set_clock_enabled(unit_t unit, bool enb){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
- switch(unit){
- case UNIT_RX: _clock_ctrl->enable_rx_dboard_clock(enb); return;
- case UNIT_TX: _clock_ctrl->enable_tx_dboard_clock(enb); return;
- default: UHD_THROW_INVALID_CODE_PATH();
+void usrp2_dboard_iface::set_clock_enabled(unit_t unit, bool enb)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
+ switch (unit) {
+ case UNIT_RX:
+ _clock_ctrl->enable_rx_dboard_clock(enb);
+ return;
+ case UNIT_TX:
+ _clock_ctrl->enable_tx_dboard_clock(enb);
+ return;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
-double usrp2_dboard_iface::get_codec_rate(unit_t unit){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+double usrp2_dboard_iface::get_codec_rate(unit_t unit)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
return _clock_ctrl->get_master_clock_rate();
}
/***********************************************************************
* GPIO
**********************************************************************/
-void usrp2_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask){
+void usrp2_dboard_iface::set_pin_ctrl(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_pin_ctrl(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t usrp2_dboard_iface::get_pin_ctrl(unit_t unit){
+uint32_t usrp2_dboard_iface::get_pin_ctrl(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_pin_ctrl(unit));
}
-void usrp2_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask){
- _gpio->set_atr_reg(unit, reg, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
+void usrp2_dboard_iface::set_atr_reg(
+ unit_t unit, atr_reg_t reg, uint32_t value, uint32_t mask)
+{
+ _gpio->set_atr_reg(
+ unit, reg, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t usrp2_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg){
+uint32_t usrp2_dboard_iface::get_atr_reg(unit_t unit, atr_reg_t reg)
+{
return static_cast<uint32_t>(_gpio->get_atr_reg(unit, reg));
}
-void usrp2_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask){
+void usrp2_dboard_iface::set_gpio_ddr(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_gpio_ddr(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t usrp2_dboard_iface::get_gpio_ddr(unit_t unit){
+uint32_t usrp2_dboard_iface::get_gpio_ddr(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_gpio_ddr(unit));
}
-void usrp2_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask){
+void usrp2_dboard_iface::set_gpio_out(unit_t unit, uint32_t value, uint32_t mask)
+{
_gpio->set_gpio_out(unit, static_cast<uint16_t>(value), static_cast<uint16_t>(mask));
}
-uint32_t usrp2_dboard_iface::get_gpio_out(unit_t unit){
+uint32_t usrp2_dboard_iface::get_gpio_out(unit_t unit)
+{
return static_cast<uint32_t>(_gpio->get_gpio_out(unit));
}
-uint32_t usrp2_dboard_iface::read_gpio(unit_t unit){
+uint32_t usrp2_dboard_iface::read_gpio(unit_t unit)
+{
return _gpio->read_gpio(unit);
}
/***********************************************************************
* SPI
**********************************************************************/
-static const uhd::dict<dboard_iface::unit_t, int> unit_to_spi_dev = map_list_of
- (dboard_iface::UNIT_TX, SPI_SS_TX_DB)
- (dboard_iface::UNIT_RX, SPI_SS_RX_DB)
-;
+static const uhd::dict<dboard_iface::unit_t, int> unit_to_spi_dev =
+ map_list_of(dboard_iface::UNIT_TX, SPI_SS_TX_DB)(dboard_iface::UNIT_RX, SPI_SS_RX_DB);
void usrp2_dboard_iface::write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
_spi_iface->write_spi(unit_to_spi_dev[unit], config, data, num_bits);
}
uint32_t usrp2_dboard_iface::read_write_spi(
- unit_t unit,
- const spi_config_t &config,
- uint32_t data,
- size_t num_bits
-){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ unit_t unit, const spi_config_t& config, uint32_t data, size_t num_bits)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
return _spi_iface->read_spi(unit_to_spi_dev[unit], config, data, num_bits);
}
/***********************************************************************
* I2C
**********************************************************************/
-void usrp2_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t &bytes){
+void usrp2_dboard_iface::write_i2c(uint16_t addr, const byte_vector_t& bytes)
+{
return _i2c_iface->write_i2c(addr, bytes);
}
-byte_vector_t usrp2_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes){
+byte_vector_t usrp2_dboard_iface::read_i2c(uint16_t addr, size_t num_bytes)
+{
return _i2c_iface->read_i2c(addr, num_bytes);
}
/***********************************************************************
* Aux DAX/ADC
**********************************************************************/
-void usrp2_dboard_iface::_write_aux_dac(unit_t unit){
- static const uhd::dict<unit_t, int> unit_to_spi_dac = map_list_of
- (UNIT_RX, SPI_SS_RX_DAC)
- (UNIT_TX, SPI_SS_TX_DAC)
- ;
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+void usrp2_dboard_iface::_write_aux_dac(unit_t unit)
+{
+ static const uhd::dict<unit_t, int> unit_to_spi_dac =
+ map_list_of(UNIT_RX, SPI_SS_RX_DAC)(UNIT_TX, SPI_SS_TX_DAC);
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
_spi_iface->write_spi(
- unit_to_spi_dac[unit], spi_config_t::EDGE_FALL,
- _dac_regs[unit].get_reg(), 24
- );
+ unit_to_spi_dac[unit], spi_config_t::EDGE_FALL, _dac_regs[unit].get_reg(), 24);
}
-void usrp2_dboard_iface::write_aux_dac(unit_t unit, aux_dac_t which, double value){
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+void usrp2_dboard_iface::write_aux_dac(unit_t unit, aux_dac_t which, double value)
+{
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
- _dac_regs[unit].data = boost::math::iround(4095*value/3.3);
- _dac_regs[unit].cmd = ad5623_regs_t::CMD_WR_UP_DAC_CHAN_N;
+ _dac_regs[unit].data = boost::math::iround(4095 * value / 3.3);
+ _dac_regs[unit].cmd = ad5623_regs_t::CMD_WR_UP_DAC_CHAN_N;
typedef uhd::dict<aux_dac_t, ad5623_regs_t::addr_t> aux_dac_to_addr;
- static const uhd::dict<unit_t, aux_dac_to_addr> unit_to_which_to_addr = map_list_of
- (UNIT_RX, map_list_of
- (AUX_DAC_A, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_B, ad5623_regs_t::ADDR_DAC_A)
- (AUX_DAC_C, ad5623_regs_t::ADDR_DAC_A)
- (AUX_DAC_D, ad5623_regs_t::ADDR_DAC_B)
- )
- (UNIT_TX, map_list_of
- (AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)
- (AUX_DAC_B, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)
- (AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A)
- )
- ;
+ static const uhd::dict<unit_t, aux_dac_to_addr> unit_to_which_to_addr =
+ map_list_of(UNIT_RX,
+ map_list_of(AUX_DAC_A, ad5623_regs_t::ADDR_DAC_B)(AUX_DAC_B,
+ ad5623_regs_t::ADDR_DAC_A)(AUX_DAC_C, ad5623_regs_t::ADDR_DAC_A)(
+ AUX_DAC_D, ad5623_regs_t::ADDR_DAC_B))(UNIT_TX,
+ map_list_of(AUX_DAC_A, ad5623_regs_t::ADDR_DAC_A)(AUX_DAC_B,
+ ad5623_regs_t::ADDR_DAC_B)(AUX_DAC_C, ad5623_regs_t::ADDR_DAC_B)(
+ AUX_DAC_D, ad5623_regs_t::ADDR_DAC_A));
_dac_regs[unit].addr = unit_to_which_to_addr[unit][which];
this->_write_aux_dac(unit);
}
-double usrp2_dboard_iface::read_aux_adc(unit_t unit, aux_adc_t which){
- static const uhd::dict<unit_t, int> unit_to_spi_adc = map_list_of
- (UNIT_RX, SPI_SS_RX_ADC)
- (UNIT_TX, SPI_SS_TX_ADC)
- ;
+double usrp2_dboard_iface::read_aux_adc(unit_t unit, aux_adc_t which)
+{
+ static const uhd::dict<unit_t, int> unit_to_spi_adc =
+ map_list_of(UNIT_RX, SPI_SS_RX_ADC)(UNIT_TX, SPI_SS_TX_ADC);
- if (unit == UNIT_BOTH) throw uhd::runtime_error("UNIT_BOTH not supported.");
+ if (unit == UNIT_BOTH)
+ throw uhd::runtime_error("UNIT_BOTH not supported.");
- //setup spi config args
+ // setup spi config args
spi_config_t config;
config.mosi_edge = spi_config_t::EDGE_FALL;
config.miso_edge = spi_config_t::EDGE_RISE;
- //setup the spi registers
+ // setup the spi registers
ad7922_regs_t ad7922_regs;
- switch(which){
- case AUX_ADC_A: ad7922_regs.mod = 0; break;
- case AUX_ADC_B: ad7922_regs.mod = 1; break;
- } ad7922_regs.chn = ad7922_regs.mod; //normal mode: mod == chn
+ switch (which) {
+ case AUX_ADC_A:
+ ad7922_regs.mod = 0;
+ break;
+ case AUX_ADC_B:
+ ad7922_regs.mod = 1;
+ break;
+ }
+ ad7922_regs.chn = ad7922_regs.mod; // normal mode: mod == chn
- //write and read spi
- _spi_iface->write_spi(
- unit_to_spi_adc[unit], config,
- ad7922_regs.get_reg(), 16
- );
- ad7922_regs.set_reg(uint16_t(_spi_iface->read_spi(
- unit_to_spi_adc[unit], config,
- ad7922_regs.get_reg(), 16
- )));
-
- //convert to voltage and return
- return 3.3*ad7922_regs.result/4095;
+ // write and read spi
+ _spi_iface->write_spi(unit_to_spi_adc[unit], config, ad7922_regs.get_reg(), 16);
+ ad7922_regs.set_reg(uint16_t(
+ _spi_iface->read_spi(unit_to_spi_adc[unit], config, ad7922_regs.get_reg(), 16)));
+
+ // convert to voltage and return
+ return 3.3 * ad7922_regs.result / 4095;
}
uhd::time_spec_t usrp2_dboard_iface::get_command_time()
@@ -343,7 +360,9 @@ void usrp2_dboard_iface::set_command_time(const uhd::time_spec_t& t)
_wb_iface->set_time(t);
}
-void usrp2_dboard_iface::set_fe_connection(unit_t, const std::string&, const fe_connection_t&)
+void usrp2_dboard_iface::set_fe_connection(
+ unit_t, const std::string&, const fe_connection_t&)
{
- throw uhd::not_implemented_error("fe connection configuration support not implemented");
+ throw uhd::not_implemented_error(
+ "fe connection configuration support not implemented");
}
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 1f8540c16..792b4721b 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -32,13 +32,14 @@ using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
namespace asio = boost::asio;
-namespace pt = boost::posix_time;
+namespace pt = boost::posix_time;
/***********************************************************************
* helpers
**********************************************************************/
-static UHD_INLINE pt::time_duration to_time_dur(double timeout){
- return pt::microseconds(long(timeout*1e6));
+static UHD_INLINE pt::time_duration to_time_dur(double timeout)
+{
+ return pt::microseconds(long(timeout * 1e6));
}
/***********************************************************************
@@ -51,7 +52,8 @@ static const size_t vrt_send_header_offset_words32 = 1;
* - the pirate thread calls update
* - the get send buffer calls check
**********************************************************************/
-class flow_control_monitor{
+class flow_control_monitor
+{
public:
typedef uint32_t seq_type;
typedef std::shared_ptr<flow_control_monitor> sptr;
@@ -60,13 +62,15 @@ public:
* Make a new flow control monitor.
* \param max_seqs_out num seqs before throttling
*/
- flow_control_monitor(seq_type max_seqs_out):_max_seqs_out(max_seqs_out){
+ flow_control_monitor(seq_type max_seqs_out) : _max_seqs_out(max_seqs_out)
+ {
this->clear();
_ready_fcn = std::bind(&flow_control_monitor::ready, this);
}
//! Clear the monitor, Ex: when a streamer is created
- void clear(void){
+ void clear(void)
+ {
_last_seq_out = 0;
_last_seq_ack = 0;
}
@@ -76,7 +80,8 @@ public:
* Increments the sequence for the next call
* \return the sequence to be sent to the dsp
*/
- UHD_INLINE seq_type get_curr_seq_out(void){
+ UHD_INLINE seq_type get_curr_seq_out(void)
+ {
return _last_seq_out++;
}
@@ -85,10 +90,12 @@ public:
* \param timeout the timeout in seconds
* \return false on timeout
*/
- UHD_INLINE bool check_fc_condition(double timeout){
+ UHD_INLINE bool check_fc_condition(double timeout)
+ {
boost::mutex::scoped_lock lock(_fc_mutex);
- if (this->ready()) return true;
- boost::this_thread::disable_interruption di; //disable because the wait can throw
+ if (this->ready())
+ return true;
+ boost::this_thread::disable_interruption di; // disable because the wait can throw
return _fc_cond.timed_wait(lock, to_time_dur(timeout), _ready_fcn);
}
@@ -96,7 +103,8 @@ public:
* Update the flow control condition.
* \param seq the last sequence number to be ACK'd
*/
- UHD_INLINE void update_fc_condition(seq_type seq){
+ UHD_INLINE void update_fc_condition(seq_type seq)
+ {
boost::mutex::scoped_lock lock(_fc_mutex);
_last_seq_ack = seq;
lock.unlock();
@@ -104,8 +112,9 @@ public:
}
private:
- bool ready(void){
- return seq_type(_last_seq_out -_last_seq_ack) < _max_seqs_out;
+ bool ready(void)
+ {
+ return seq_type(_last_seq_out - _last_seq_ack) < _max_seqs_out;
}
boost::mutex _fc_mutex;
@@ -122,41 +131,44 @@ private:
* - thread loop
* - vrt packet handler states
**********************************************************************/
-struct usrp2_impl::io_impl{
-
- io_impl(void):
- async_msg_fifo(1000/*messages deep*/),
- tick_rate(1 /*non-zero default*/)
+struct usrp2_impl::io_impl
+{
+ io_impl(void)
+ : async_msg_fifo(1000 /*messages deep*/), tick_rate(1 /*non-zero default*/)
{
/* NOP */
}
- ~io_impl(void){
- //Manually deconstuct the tasks, since this was not happening automatically.
+ ~io_impl(void)
+ {
+ // Manually deconstuct the tasks, since this was not happening automatically.
pirate_tasks.clear();
}
- managed_send_buffer::sptr get_send_buff(size_t chan, double timeout){
- flow_control_monitor &fc_mon = *fc_mons[chan];
+ managed_send_buffer::sptr get_send_buff(size_t chan, double timeout)
+ {
+ flow_control_monitor& fc_mon = *fc_mons[chan];
- //wait on flow control w/ timeout
- if (not fc_mon.check_fc_condition(timeout)) return managed_send_buffer::sptr();
+ // wait on flow control w/ timeout
+ if (not fc_mon.check_fc_condition(timeout))
+ return managed_send_buffer::sptr();
- //get a buffer from the transport w/ timeout
+ // get a buffer from the transport w/ timeout
managed_send_buffer::sptr buff = tx_xports[chan]->get_send_buff(timeout);
- //write the flow control word into the buffer
- if (buff.get()) buff->cast<uint32_t *>()[0] = uhd::htonx(fc_mon.get_curr_seq_out());
+ // write the flow control word into the buffer
+ if (buff.get())
+ buff->cast<uint32_t*>()[0] = uhd::htonx(fc_mon.get_curr_seq_out());
return buff;
}
- //tx dsp: xports and flow control monitors
+ // tx dsp: xports and flow control monitors
std::vector<zero_copy_if::sptr> tx_xports;
std::vector<flow_control_monitor::sptr> fc_mons;
- //methods and variables for the pirate crew
- void recv_pirate_loop(zero_copy_if::sptr, size_t, const std::atomic<bool> &);
+ // methods and variables for the pirate crew
+ void recv_pirate_loop(zero_copy_if::sptr, size_t, const std::atomic<bool>&);
std::list<task::sptr> pirate_tasks;
bounded_buffer<async_metadata_t> async_msg_fifo;
double tick_rate;
@@ -169,47 +181,54 @@ struct usrp2_impl::io_impl{
* - put async message packets into queue
**********************************************************************/
void usrp2_impl::io_impl::recv_pirate_loop(
- zero_copy_if::sptr err_xport, size_t index, const std::atomic<bool> &exit_loop
-){
+ zero_copy_if::sptr err_xport, size_t index, const std::atomic<bool>& exit_loop)
+{
set_thread_priority_safe();
- //store a reference to the flow control monitor (offset by max dsps)
- flow_control_monitor &fc_mon = *(this->fc_mons[index]);
+ // store a reference to the flow control monitor (offset by max dsps)
+ flow_control_monitor& fc_mon = *(this->fc_mons[index]);
- while (not exit_loop){
+ while (not exit_loop) {
managed_recv_buffer::sptr buff = err_xport->get_recv_buff();
- if (not buff.get()) continue; //ignore timeout/error buffers
+ if (not buff.get())
+ continue; // ignore timeout/error buffers
- try{
- //extract the vrt header packet info
+ try {
+ // extract the vrt header packet info
vrt::if_packet_info_t if_packet_info;
- if_packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
- const uint32_t *vrt_hdr = buff->cast<const uint32_t *>();
+ if_packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
+ const uint32_t* vrt_hdr = buff->cast<const uint32_t*>();
vrt::if_hdr_unpack_be(vrt_hdr, if_packet_info);
- //handle a tx async report message
- if (if_packet_info.sid == USRP2_TX_ASYNC_SID and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){
-
- //fill in the async metadata
+ // handle a tx async report message
+ if (if_packet_info.sid == USRP2_TX_ASYNC_SID
+ and if_packet_info.packet_type
+ != vrt::if_packet_info_t::PACKET_TYPE_DATA) {
+ // fill in the async metadata
async_metadata_t metadata;
- load_metadata_from_buff(uhd::ntohx<uint32_t>, metadata, if_packet_info, vrt_hdr, tick_rate, index);
-
- //catch the flow control packets and react
- if (metadata.event_code == 0){
+ load_metadata_from_buff(uhd::ntohx<uint32_t>,
+ metadata,
+ if_packet_info,
+ vrt_hdr,
+ tick_rate,
+ index);
+
+ // catch the flow control packets and react
+ if (metadata.event_code == 0) {
uint32_t fc_word32 = (vrt_hdr + if_packet_info.num_header_words32)[1];
fc_mon.update_fc_condition(uhd::ntohx(fc_word32));
continue;
}
- //else UHD_LOGGER_DEBUG("USRP2") << "metadata.event_code " << metadata.event_code;
+ // else UHD_LOGGER_DEBUG("USRP2") << "metadata.event_code " <<
+ // metadata.event_code;
async_msg_fifo.push_with_pop_on_full(metadata);
standard_async_msg_prints(metadata);
+ } else {
+ // TODO unknown received packet, may want to print error...
}
- else{
- //TODO unknown received packet, may want to print error...
- }
- }catch(const std::exception &e){
- UHD_LOGGER_ERROR("USRP2") << "Error in recv pirate loop: " << e.what() ;
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("USRP2") << "Error in recv pirate loop: " << e.what();
}
}
}
@@ -217,137 +236,166 @@ void usrp2_impl::io_impl::recv_pirate_loop(
/***********************************************************************
* Helper Functions
**********************************************************************/
-void usrp2_impl::io_init(void){
- //create new io impl
+void usrp2_impl::io_init(void)
+{
+ // create new io impl
_io_impl = UHD_PIMPL_MAKE(io_impl, ());
- //init first so we dont have an access race
- for(const std::string &mb: _mbc.keys()){
- //init the tx xport and flow control monitor
+ // init first so we dont have an access race
+ for (const std::string& mb : _mbc.keys()) {
+ // init the tx xport and flow control monitor
_io_impl->tx_xports.push_back(_mbc[mb].tx_dsp_xport);
- _io_impl->fc_mons.push_back(flow_control_monitor::sptr(new flow_control_monitor(
- device_addr.cast("send_buff_size", USRP2_SRAM_BYTES) /
- _mbc[mb].tx_dsp_xport->get_send_frame_size()
- )));
+ _io_impl->fc_mons.push_back(flow_control_monitor::sptr(
+ new flow_control_monitor(device_addr.cast("send_buff_size", USRP2_SRAM_BYTES)
+ / _mbc[mb].tx_dsp_xport->get_send_frame_size())));
}
- //allocate streamer weak ptrs containers
- for(const std::string &mb: _mbc.keys()){
+ // allocate streamer weak ptrs containers
+ for (const std::string& mb : _mbc.keys()) {
_mbc[mb].rx_streamers.resize(_mbc[mb].rx_dsps.size());
- _mbc[mb].tx_streamers.resize(1/*known to be 1 dsp*/);
+ _mbc[mb].tx_streamers.resize(1 /*known to be 1 dsp*/);
}
- //create a new pirate thread for each zc if (yarr!!)
+ // create a new pirate thread for each zc if (yarr!!)
size_t index = 0;
- for(const std::string &mb: _mbc.keys()){
- //spawn a new pirate to plunder the recv booty
- _io_impl->pirate_tasks.push_back(task::make(std::bind(
- &usrp2_impl::io_impl::recv_pirate_loop, _io_impl.get(),
- _mbc[mb].tx_dsp_xport, index++,
- std::ref(_pirate_task_exit)
- )));
+ for (const std::string& mb : _mbc.keys()) {
+ // spawn a new pirate to plunder the recv booty
+ _io_impl->pirate_tasks.push_back(
+ task::make(std::bind(&usrp2_impl::io_impl::recv_pirate_loop,
+ _io_impl.get(),
+ _mbc[mb].tx_dsp_xport,
+ index++,
+ std::ref(_pirate_task_exit))));
}
}
-void usrp2_impl::update_tick_rate(const double rate){
- _io_impl->tick_rate = rate; //shadow for async msg
+void usrp2_impl::update_tick_rate(const double rate)
+{
+ _io_impl->tick_rate = rate; // shadow for async msg
- //update the tick rate on all existing streamers -> thread safe
- for(const std::string &mb: _mbc.keys()){
- for (size_t i = 0; i < _mbc[mb].rx_streamers.size(); i++){
+ // update the tick rate on all existing streamers -> thread safe
+ for (const std::string& mb : _mbc.keys()) {
+ for (size_t i = 0; i < _mbc[mb].rx_streamers.size(); i++) {
std::shared_ptr<sph::recv_packet_streamer> my_streamer =
- std::dynamic_pointer_cast<sph::recv_packet_streamer>(_mbc[mb].rx_streamers[i].lock());
- if (my_streamer.get() == NULL) continue;
+ std::dynamic_pointer_cast<sph::recv_packet_streamer>(
+ _mbc[mb].rx_streamers[i].lock());
+ if (my_streamer.get() == NULL)
+ continue;
my_streamer->set_tick_rate(rate);
}
- for (size_t i = 0; i < _mbc[mb].tx_streamers.size(); i++){
+ for (size_t i = 0; i < _mbc[mb].tx_streamers.size(); i++) {
std::shared_ptr<sph::send_packet_streamer> my_streamer =
- std::dynamic_pointer_cast<sph::send_packet_streamer>(_mbc[mb].tx_streamers[i].lock());
- if (my_streamer.get() == NULL) continue;
+ std::dynamic_pointer_cast<sph::send_packet_streamer>(
+ _mbc[mb].tx_streamers[i].lock());
+ if (my_streamer.get() == NULL)
+ continue;
my_streamer->set_tick_rate(rate);
}
}
}
-void usrp2_impl::update_rx_samp_rate(const std::string &mb, const size_t dsp, const double rate){
+void usrp2_impl::update_rx_samp_rate(
+ const std::string& mb, const size_t dsp, const double rate)
+{
std::shared_ptr<sph::recv_packet_streamer> my_streamer =
- std::dynamic_pointer_cast<sph::recv_packet_streamer>(_mbc[mb].rx_streamers[dsp].lock());
- if (my_streamer.get() == NULL) return;
+ std::dynamic_pointer_cast<sph::recv_packet_streamer>(
+ _mbc[mb].rx_streamers[dsp].lock());
+ if (my_streamer.get() == NULL)
+ return;
my_streamer->set_samp_rate(rate);
const double adj = _mbc[mb].rx_dsps[dsp]->get_scaling_adjustment();
my_streamer->set_scale_factor(adj);
}
-void usrp2_impl::update_tx_samp_rate(const std::string &mb, const size_t dsp, const double rate){
+void usrp2_impl::update_tx_samp_rate(
+ const std::string& mb, const size_t dsp, const double rate)
+{
std::shared_ptr<sph::send_packet_streamer> my_streamer =
- std::dynamic_pointer_cast<sph::send_packet_streamer>(_mbc[mb].tx_streamers[dsp].lock());
- if (my_streamer.get() == NULL) return;
+ std::dynamic_pointer_cast<sph::send_packet_streamer>(
+ _mbc[mb].tx_streamers[dsp].lock());
+ if (my_streamer.get() == NULL)
+ return;
my_streamer->set_samp_rate(rate);
const double adj = _mbc[mb].tx_dsp->get_scaling_adjustment();
my_streamer->set_scale_factor(adj);
}
-void usrp2_impl::update_rates(void){
- for(const std::string &mb: _mbc.keys()){
+void usrp2_impl::update_rates(void)
+{
+ for (const std::string& mb : _mbc.keys()) {
fs_path root = "/mboards/" + mb;
_tree->access<double>(root / "tick_rate").update();
- //and now that the tick rate is set, init the host rates to something
- for(const std::string &name: _tree->list(root / "rx_dsps")){
+ // and now that the tick rate is set, init the host rates to something
+ for (const std::string& name : _tree->list(root / "rx_dsps")) {
_tree->access<double>(root / "rx_dsps" / name / "rate" / "value").update();
}
- for(const std::string &name: _tree->list(root / "tx_dsps")){
+ for (const std::string& name : _tree->list(root / "tx_dsps")) {
_tree->access<double>(root / "tx_dsps" / name / "rate" / "value").update();
}
}
}
-void usrp2_impl::update_rx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec){
+void usrp2_impl::update_rx_subdev_spec(
+ const std::string& which_mb, const subdev_spec_t& spec)
+{
fs_path root = "/mboards/" + which_mb + "/dboards";
- //sanity checking
+ // sanity checking
validate_subdev_spec(_tree, spec, "rx", which_mb);
- //setup mux for this spec
+ // setup mux for this spec
bool fe_swapped = false;
- for (size_t i = 0; i < spec.size(); i++){
- const std::string conn = _tree->access<std::string>(root / spec[i].db_name / "rx_frontends" / spec[i].sd_name / "connection").get();
- if (i == 0 and (conn == "QI" or conn == "Q")) fe_swapped = true;
+ for (size_t i = 0; i < spec.size(); i++) {
+ const std::string conn =
+ _tree
+ ->access<std::string>(root / spec[i].db_name / "rx_frontends"
+ / spec[i].sd_name / "connection")
+ .get();
+ if (i == 0 and (conn == "QI" or conn == "Q"))
+ fe_swapped = true;
_mbc[which_mb].rx_dsps[i]->set_mux(conn, fe_swapped);
}
_mbc[which_mb].rx_fe->set_mux(fe_swapped);
- //compute the new occupancy and resize
+ // compute the new occupancy and resize
_mbc[which_mb].rx_chan_occ = spec.size();
- size_t nchan = 0;
- for(const std::string &mb: _mbc.keys()) nchan += _mbc[mb].rx_chan_occ;
+ size_t nchan = 0;
+ for (const std::string& mb : _mbc.keys())
+ nchan += _mbc[mb].rx_chan_occ;
}
-void usrp2_impl::update_tx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec){
+void usrp2_impl::update_tx_subdev_spec(
+ const std::string& which_mb, const subdev_spec_t& spec)
+{
fs_path root = "/mboards/" + which_mb + "/dboards";
- //sanity checking
+ // sanity checking
validate_subdev_spec(_tree, spec, "tx", which_mb);
- //set the mux for this spec
- const std::string conn = _tree->access<std::string>(root / spec[0].db_name / "tx_frontends" / spec[0].sd_name / "connection").get();
+ // set the mux for this spec
+ const std::string conn =
+ _tree
+ ->access<std::string>(
+ root / spec[0].db_name / "tx_frontends" / spec[0].sd_name / "connection")
+ .get();
_mbc[which_mb].tx_fe->set_mux(conn);
- //compute the new occupancy and resize
+ // compute the new occupancy and resize
_mbc[which_mb].tx_chan_occ = spec.size();
- size_t nchan = 0;
- for(const std::string &mb: _mbc.keys()) nchan += _mbc[mb].tx_chan_occ;
+ size_t nchan = 0;
+ for (const std::string& mb : _mbc.keys())
+ nchan += _mbc[mb].tx_chan_occ;
}
/***********************************************************************
* Async Data
**********************************************************************/
-bool usrp2_impl::recv_async_msg(
- async_metadata_t &async_metadata, double timeout
-){
- boost::this_thread::disable_interruption di; //disable because the wait can throw
+bool usrp2_impl::recv_async_msg(async_metadata_t& async_metadata, double timeout)
+{
+ boost::this_thread::disable_interruption di; // disable because the wait can throw
return _io_impl->async_msg_fifo.pop_with_timed_wait(async_metadata, timeout);
}
@@ -355,120 +403,132 @@ bool usrp2_impl::recv_async_msg(
* Stream destination programmer
**********************************************************************/
void usrp2_impl::program_stream_dest(
- zero_copy_if::sptr &xport, const uhd::stream_args_t &args
-){
- //perform an initial flush of transport
- while (xport->get_recv_buff(0.0)){}
+ zero_copy_if::sptr& xport, const uhd::stream_args_t& args)
+{
+ // perform an initial flush of transport
+ while (xport->get_recv_buff(0.0)) {
+ }
- //program the stream command
+ // program the stream command
usrp2_stream_ctrl_t stream_ctrl = usrp2_stream_ctrl_t();
- stream_ctrl.sequence = uhd::htonx(uint32_t(0 /* don't care seq num */));
- stream_ctrl.vrt_hdr = uhd::htonx(uint32_t(USRP2_INVALID_VRT_HEADER));
+ stream_ctrl.sequence = uhd::htonx(uint32_t(0 /* don't care seq num */));
+ stream_ctrl.vrt_hdr = uhd::htonx(uint32_t(USRP2_INVALID_VRT_HEADER));
- //user has provided an alternative address and port for destination
- if (args.args.has_key("addr") and args.args.has_key("port")){
- UHD_LOGGER_INFO("USRP2") << boost::format(
- "Programming streaming destination for custom address. "
- "IPv4 Address: %s, UDP Port: %s"
- ) % args.args["addr"] % args.args["port"];
+ // user has provided an alternative address and port for destination
+ if (args.args.has_key("addr") and args.args.has_key("port")) {
+ UHD_LOGGER_INFO("USRP2")
+ << boost::format("Programming streaming destination for custom address. "
+ "IPv4 Address: %s, UDP Port: %s")
+ % args.args["addr"] % args.args["port"];
asio::io_service io_service;
asio::ip::udp::resolver resolver(io_service);
- asio::ip::udp::resolver::query query(asio::ip::udp::v4(), args.args["addr"], args.args["port"]);
+ asio::ip::udp::resolver::query query(
+ asio::ip::udp::v4(), args.args["addr"], args.args["port"]);
asio::ip::udp::endpoint endpoint = *resolver.resolve(query);
stream_ctrl.ip_addr = uhd::htonx(uint32_t(endpoint.address().to_v4().to_ulong()));
stream_ctrl.udp_port = uhd::htonx(uint32_t(endpoint.port()));
- for (size_t i = 0; i < 3; i++){
+ for (size_t i = 0; i < 3; i++) {
UHD_LOGGER_INFO("USRP2") << "ARP attempt " << i;
managed_send_buffer::sptr send_buff = xport->get_send_buff();
- std::memcpy(send_buff->cast<void *>(), &stream_ctrl, sizeof(stream_ctrl));
+ std::memcpy(send_buff->cast<void*>(), &stream_ctrl, sizeof(stream_ctrl));
send_buff->commit(sizeof(stream_ctrl));
send_buff.reset();
std::this_thread::sleep_for(std::chrono::milliseconds(300));
managed_recv_buffer::sptr recv_buff = xport->get_recv_buff(0.0);
- if (recv_buff and recv_buff->size() >= sizeof(uint32_t)){
- const uint32_t result = uhd::ntohx(recv_buff->cast<const uint32_t *>()[0]);
- if (result == 0){
+ if (recv_buff and recv_buff->size() >= sizeof(uint32_t)) {
+ const uint32_t result = uhd::ntohx(recv_buff->cast<const uint32_t*>()[0]);
+ if (result == 0) {
UHD_LOGGER_INFO("USRP2") << "Success! ";
return;
}
}
}
- throw uhd::runtime_error("Device failed to ARP when programming alternative streaming destination.");
+ throw uhd::runtime_error(
+ "Device failed to ARP when programming alternative streaming destination.");
}
- else{
- //send the partial stream control without destination
+ else {
+ // send the partial stream control without destination
managed_send_buffer::sptr send_buff = xport->get_send_buff();
- std::memcpy(send_buff->cast<void *>(), &stream_ctrl, sizeof(stream_ctrl));
- send_buff->commit(sizeof(stream_ctrl)/2);
+ std::memcpy(send_buff->cast<void*>(), &stream_ctrl, sizeof(stream_ctrl));
+ send_buff->commit(sizeof(stream_ctrl) / 2);
}
}
/***********************************************************************
* Receive streamer
**********************************************************************/
-rx_streamer::sptr usrp2_impl::get_rx_stream(const uhd::stream_args_t &args_){
+rx_streamer::sptr usrp2_impl::get_rx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels = args.channels.empty()? std::vector<size_t>(1, 0) : args.channels;
-
- //calculate packet size
- static const size_t hdr_size = 0
- + vrt::max_if_hdr_words32*sizeof(uint32_t)
- + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
- - sizeof(vrt::if_packet_info_t().tsi) //no int time ever used
- ;
- const size_t bpp = _mbc[_mbc.keys().front()].rx_dsp_xports[0]->get_recv_frame_size() - hdr_size;
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels = args.channels.empty() ? std::vector<size_t>(1, 0) : args.channels;
+
+ // calculate packet size
+ static const size_t hdr_size =
+ 0 + vrt::max_if_hdr_words32 * sizeof(uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) // forced to have trailer
+ - sizeof(vrt::if_packet_info_t().cid) // no class id ever used
+ - sizeof(vrt::if_packet_info_t().tsi) // no int time ever used
+ ;
+ const size_t bpp =
+ _mbc[_mbc.keys().front()].rx_dsp_xports[0]->get_recv_frame_size() - hdr_size;
const size_t bpi = convert::get_bytes_per_item(args.otw_format);
- const size_t spp = args.args.cast<size_t>("spp", bpp/bpi);
+ const size_t spp = args.args.cast<size_t>("spp", bpp / bpi);
- //make the new streamer given the samples per packet
- std::shared_ptr<sph::recv_packet_streamer> my_streamer = std::make_shared<sph::recv_packet_streamer>(spp);
+ // make the new streamer given the samples per packet
+ std::shared_ptr<sph::recv_packet_streamer> my_streamer =
+ std::make_shared<sph::recv_packet_streamer>(spp);
- //init some streamer stuff
+ // init some streamer stuff
my_streamer->resize(args.channels.size());
my_streamer->set_vrt_unpacker(&vrt::if_hdr_unpack_be);
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.otw_format + "_item32_be";
- id.num_inputs = 1;
+ id.input_format = args.otw_format + "_item32_be";
+ id.num_inputs = 1;
id.output_format = args.cpu_format;
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
- //bind callbacks for the handler
- for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++){
- const size_t chan = args.channels[chan_i];
+ // bind callbacks for the handler
+ for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++) {
+ const size_t chan = args.channels[chan_i];
size_t num_chan_so_far = 0;
- for(const std::string &mb: _mbc.keys()){
+ for (const std::string& mb : _mbc.keys()) {
num_chan_so_far += _mbc[mb].rx_chan_occ;
- if (chan < num_chan_so_far){
+ if (chan < num_chan_so_far) {
const size_t dsp = chan + _mbc[mb].rx_chan_occ - num_chan_so_far;
- _mbc[mb].rx_dsps[dsp]->set_nsamps_per_packet(spp); //seems to be a good place to set this
+ _mbc[mb].rx_dsps[dsp]->set_nsamps_per_packet(
+ spp); // seems to be a good place to set this
_mbc[mb].rx_dsps[dsp]->setup(args);
this->program_stream_dest(_mbc[mb].rx_dsp_xports[dsp], args);
- my_streamer->set_xport_chan_get_buff(chan_i, std::bind(
- &zero_copy_if::get_recv_buff, _mbc[mb].rx_dsp_xports[dsp], std::placeholders::_1
- ), true /*flush*/);
- my_streamer->set_issue_stream_cmd(chan_i, std::bind(
- &rx_dsp_core_200::issue_stream_command, _mbc[mb].rx_dsps[dsp], std::placeholders::_1));
- _mbc[mb].rx_streamers[dsp] = my_streamer; //store weak pointer
+ my_streamer->set_xport_chan_get_buff(chan_i,
+ std::bind(&zero_copy_if::get_recv_buff,
+ _mbc[mb].rx_dsp_xports[dsp],
+ std::placeholders::_1),
+ true /*flush*/);
+ my_streamer->set_issue_stream_cmd(chan_i,
+ std::bind(&rx_dsp_core_200::issue_stream_command,
+ _mbc[mb].rx_dsps[dsp],
+ std::placeholders::_1));
+ _mbc[mb].rx_streamers[dsp] = my_streamer; // store weak pointer
break;
}
}
}
- //set the packet threshold to be an entire socket buffer's worth
- const size_t packets_per_sock_buff = size_t(50e6/_mbc[_mbc.keys().front()].rx_dsp_xports[0]->get_recv_frame_size());
+ // set the packet threshold to be an entire socket buffer's worth
+ const size_t packets_per_sock_buff =
+ size_t(50e6 / _mbc[_mbc.keys().front()].rx_dsp_xports[0]->get_recv_frame_size());
my_streamer->set_alignment_failure_threshold(packets_per_sock_buff);
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
@@ -477,65 +537,74 @@ rx_streamer::sptr usrp2_impl::get_rx_stream(const uhd::stream_args_t &args_){
/***********************************************************************
* Transmit streamer
**********************************************************************/
-tx_streamer::sptr usrp2_impl::get_tx_stream(const uhd::stream_args_t &args_){
+tx_streamer::sptr usrp2_impl::get_tx_stream(const uhd::stream_args_t& args_)
+{
stream_args_t args = args_;
- //setup defaults for unspecified values
- args.otw_format = args.otw_format.empty()? "sc16" : args.otw_format;
- args.channels = args.channels.empty()? std::vector<size_t>(1, 0) : args.channels;
-
- //calculate packet size
- static const size_t hdr_size = 0
- + vrt_send_header_offset_words32*sizeof(uint32_t)
- + vrt::max_if_hdr_words32*sizeof(uint32_t)
- + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
- - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
- - sizeof(vrt::if_packet_info_t().sid) //no stream id ever used
- - sizeof(vrt::if_packet_info_t().tsi) //no int time ever used
- ;
- const size_t bpp = _mbc[_mbc.keys().front()].tx_dsp_xport->get_send_frame_size() - hdr_size;
- const size_t spp = bpp/convert::get_bytes_per_item(args.otw_format);
-
- //make the new streamer given the samples per packet
- std::shared_ptr<sph::send_packet_streamer> my_streamer = std::make_shared<sph::send_packet_streamer>(spp);
-
- //init some streamer stuff
+ // setup defaults for unspecified values
+ args.otw_format = args.otw_format.empty() ? "sc16" : args.otw_format;
+ args.channels = args.channels.empty() ? std::vector<size_t>(1, 0) : args.channels;
+
+ // calculate packet size
+ static const size_t hdr_size =
+ 0 + vrt_send_header_offset_words32 * sizeof(uint32_t)
+ + vrt::max_if_hdr_words32 * sizeof(uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) // forced to have trailer
+ - sizeof(vrt::if_packet_info_t().cid) // no class id ever used
+ - sizeof(vrt::if_packet_info_t().sid) // no stream id ever used
+ - sizeof(vrt::if_packet_info_t().tsi) // no int time ever used
+ ;
+ const size_t bpp =
+ _mbc[_mbc.keys().front()].tx_dsp_xport->get_send_frame_size() - hdr_size;
+ const size_t spp = bpp / convert::get_bytes_per_item(args.otw_format);
+
+ // make the new streamer given the samples per packet
+ std::shared_ptr<sph::send_packet_streamer> my_streamer =
+ std::make_shared<sph::send_packet_streamer>(spp);
+
+ // init some streamer stuff
my_streamer->resize(args.channels.size());
my_streamer->set_vrt_packer(&vrt::if_hdr_pack_be, vrt_send_header_offset_words32);
- //set the converter
+ // set the converter
uhd::convert::id_type id;
- id.input_format = args.cpu_format;
- id.num_inputs = 1;
+ id.input_format = args.cpu_format;
+ id.num_inputs = 1;
id.output_format = args.otw_format + "_item32_be";
- id.num_outputs = 1;
+ id.num_outputs = 1;
my_streamer->set_converter(id);
- //bind callbacks for the handler
- for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++){
- const size_t chan = args.channels[chan_i];
+ // bind callbacks for the handler
+ for (size_t chan_i = 0; chan_i < args.channels.size(); chan_i++) {
+ const size_t chan = args.channels[chan_i];
size_t num_chan_so_far = 0;
- size_t abs = 0;
- for(const std::string &mb: _mbc.keys()){
+ size_t abs = 0;
+ for (const std::string& mb : _mbc.keys()) {
num_chan_so_far += _mbc[mb].tx_chan_occ;
- if (chan < num_chan_so_far){
+ if (chan < num_chan_so_far) {
const size_t dsp = chan + _mbc[mb].tx_chan_occ - num_chan_so_far;
- if (not args.args.has_key("noclear")){
+ if (not args.args.has_key("noclear")) {
_io_impl->fc_mons[abs]->clear();
}
_mbc[mb].tx_dsp->setup(args);
- my_streamer->set_xport_chan_get_buff(chan_i, std::bind(
- &usrp2_impl::io_impl::get_send_buff, _io_impl.get(), abs, std::placeholders::_1
- ));
- my_streamer->set_async_receiver(std::bind(&bounded_buffer<async_metadata_t>::pop_with_timed_wait, &(_io_impl->async_msg_fifo), std::placeholders::_1, std::placeholders::_2));
- _mbc[mb].tx_streamers[dsp] = my_streamer; //store weak pointer
+ my_streamer->set_xport_chan_get_buff(chan_i,
+ std::bind(&usrp2_impl::io_impl::get_send_buff,
+ _io_impl.get(),
+ abs,
+ std::placeholders::_1));
+ my_streamer->set_async_receiver(
+ std::bind(&bounded_buffer<async_metadata_t>::pop_with_timed_wait,
+ &(_io_impl->async_msg_fifo),
+ std::placeholders::_1,
+ std::placeholders::_2));
+ _mbc[mb].tx_streamers[dsp] = my_streamer; // store weak pointer
break;
}
- abs += 1; //assume 1 tx dsp
+ abs += 1; // assume 1 tx dsp
}
}
- //sets all tick and samp rates on this streamer
+ // sets all tick and samp rates on this streamer
this->update_rates();
return my_streamer;
diff --git a/host/lib/usrp/usrp2/mb_eeprom.cpp b/host/lib/usrp/usrp2/mb_eeprom.cpp
index bd91b527c..7bfe6159d 100644
--- a/host/lib/usrp/usrp2/mb_eeprom.cpp
+++ b/host/lib/usrp/usrp2/mb_eeprom.cpp
@@ -5,98 +5,105 @@
//
#include "usrp2_impl.hpp"
-#include <uhdlib/utils/eeprom_utils.hpp>
-#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/types/byte_vector.hpp>
#include <uhd/types/mac_addr.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhdlib/utils/eeprom_utils.hpp>
#include <boost/asio/ip/address_v4.hpp>
namespace {
- const uint8_t N200_EEPROM_ADDR = 0x50;
-
- struct n200_eeprom_map{
- uint16_t hardware;
- uint8_t mac_addr[6];
- uint32_t subnet;
- uint32_t ip_addr;
- uint16_t _pad0;
- uint16_t revision;
- uint16_t product;
- unsigned char _pad1;
- unsigned char gpsdo;
- unsigned char serial[SERIAL_LEN];
- unsigned char name[NAME_MAX_LEN];
- uint32_t gateway;
- };
-
- enum n200_gpsdo_type{
- N200_GPSDO_NONE = 0,
- N200_GPSDO_INTERNAL = 1,
- N200_GPSDO_ONBOARD = 2
- };
-}
+const uint8_t N200_EEPROM_ADDR = 0x50;
+
+struct n200_eeprom_map
+{
+ uint16_t hardware;
+ uint8_t mac_addr[6];
+ uint32_t subnet;
+ uint32_t ip_addr;
+ uint16_t _pad0;
+ uint16_t revision;
+ uint16_t product;
+ unsigned char _pad1;
+ unsigned char gpsdo;
+ unsigned char serial[SERIAL_LEN];
+ unsigned char name[NAME_MAX_LEN];
+ uint32_t gateway;
+};
+
+enum n200_gpsdo_type {
+ N200_GPSDO_NONE = 0,
+ N200_GPSDO_INTERNAL = 1,
+ N200_GPSDO_ONBOARD = 2
+};
+} // namespace
using namespace uhd;
using uhd::usrp::mboard_eeprom_t;
-mboard_eeprom_t usrp2_impl::get_mb_eeprom(usrp2_iface &iface)
+mboard_eeprom_t usrp2_impl::get_mb_eeprom(usrp2_iface& iface)
{
uhd::usrp::mboard_eeprom_t mb_eeprom;
- //extract the hardware number
+ // extract the hardware number
mb_eeprom["hardware"] = uint16_bytes_to_string(
- iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, hardware), 2)
- );
+ iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, hardware), 2));
- //extract the revision number
+ // extract the revision number
mb_eeprom["revision"] = uint16_bytes_to_string(
- iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, revision), 2)
- );
+ iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, revision), 2));
- //extract the product code
+ // extract the product code
mb_eeprom["product"] = uint16_bytes_to_string(
- iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, product), 2)
- );
+ iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, product), 2));
- //extract the addresses
- mb_eeprom["mac-addr"] = mac_addr_t::from_bytes(iface.read_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, mac_addr), 6
- )).to_string();
+ // extract the addresses
+ mb_eeprom["mac-addr"] = mac_addr_t::from_bytes(
+ iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, mac_addr), 6))
+ .to_string();
boost::asio::ip::address_v4::bytes_type ip_addr_bytes;
- byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, ip_addr), 4), ip_addr_bytes);
+ byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, ip_addr), 4),
+ ip_addr_bytes);
mb_eeprom["ip-addr"] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
- byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, subnet), 4), ip_addr_bytes);
+ byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, subnet), 4),
+ ip_addr_bytes);
mb_eeprom["subnet"] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
- byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gateway), 4), ip_addr_bytes);
+ byte_copy(iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gateway), 4),
+ ip_addr_bytes);
mb_eeprom["gateway"] = boost::asio::ip::address_v4(ip_addr_bytes).to_string();
- //gpsdo capabilities
- uint8_t gpsdo_byte = iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gpsdo), 1).at(0);
- switch(n200_gpsdo_type(gpsdo_byte)){
- case N200_GPSDO_INTERNAL: mb_eeprom["gpsdo"] = "internal"; break;
- case N200_GPSDO_ONBOARD: mb_eeprom["gpsdo"] = "onboard"; break;
- default: mb_eeprom["gpsdo"] = "none";
+ // gpsdo capabilities
+ uint8_t gpsdo_byte =
+ iface.read_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gpsdo), 1).at(0);
+ switch (n200_gpsdo_type(gpsdo_byte)) {
+ case N200_GPSDO_INTERNAL:
+ mb_eeprom["gpsdo"] = "internal";
+ break;
+ case N200_GPSDO_ONBOARD:
+ mb_eeprom["gpsdo"] = "onboard";
+ break;
+ default:
+ mb_eeprom["gpsdo"] = "none";
}
- //extract the serial
+ // extract the serial
mb_eeprom["serial"] = bytes_to_string(iface.read_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, serial), SERIAL_LEN
- ));
+ N200_EEPROM_ADDR, offsetof(n200_eeprom_map, serial), SERIAL_LEN));
- //extract the name
+ // extract the name
mb_eeprom["name"] = bytes_to_string(iface.read_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, name), NAME_MAX_LEN
- ));
-
- //Empty serial correction: use the mac address to determine serial.
- //Older usrp2 models don't have a serial burned into EEPROM.
- //The lower mac address bits will function as the serial number.
- if (mb_eeprom["serial"].empty()){
- byte_vector_t mac_addr_bytes = mac_addr_t::from_string(mb_eeprom["mac-addr"]).to_bytes();
- unsigned serial = mac_addr_bytes.at(5) | (unsigned(mac_addr_bytes.at(4) & 0x0f) << 8);
+ N200_EEPROM_ADDR, offsetof(n200_eeprom_map, name), NAME_MAX_LEN));
+
+ // Empty serial correction: use the mac address to determine serial.
+ // Older usrp2 models don't have a serial burned into EEPROM.
+ // The lower mac address bits will function as the serial number.
+ if (mb_eeprom["serial"].empty()) {
+ byte_vector_t mac_addr_bytes =
+ mac_addr_t::from_string(mb_eeprom["mac-addr"]).to_bytes();
+ unsigned serial = mac_addr_bytes.at(5)
+ | (unsigned(mac_addr_bytes.at(4) & 0x0f) << 8);
mb_eeprom["serial"] = std::to_string(serial);
}
@@ -104,72 +111,82 @@ mboard_eeprom_t usrp2_impl::get_mb_eeprom(usrp2_iface &iface)
}
-void usrp2_impl::set_mb_eeprom(
- const std::string &mb,
- const mboard_eeprom_t &mb_eeprom
-) {
- auto &iface = _mbc[mb].iface;
-
- //parse the revision number
- if (mb_eeprom.has_key("hardware")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, hardware),
- string_to_uint16_bytes(mb_eeprom["hardware"])
- );
-
- //parse the revision number
- if (mb_eeprom.has_key("revision")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, revision),
- string_to_uint16_bytes(mb_eeprom["revision"])
- );
-
- //parse the product code
- if (mb_eeprom.has_key("product")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, product),
- string_to_uint16_bytes(mb_eeprom["product"])
- );
-
- //store the addresses
- if (mb_eeprom.has_key("mac-addr")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, mac_addr),
- mac_addr_t::from_string(mb_eeprom["mac-addr"]).to_bytes()
- );
-
- if (mb_eeprom.has_key("ip-addr")){
+void usrp2_impl::set_mb_eeprom(const std::string& mb, const mboard_eeprom_t& mb_eeprom)
+{
+ auto& iface = _mbc[mb].iface;
+
+ // parse the revision number
+ if (mb_eeprom.has_key("hardware"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, hardware),
+ string_to_uint16_bytes(mb_eeprom["hardware"]));
+
+ // parse the revision number
+ if (mb_eeprom.has_key("revision"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, revision),
+ string_to_uint16_bytes(mb_eeprom["revision"]));
+
+ // parse the product code
+ if (mb_eeprom.has_key("product"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, product),
+ string_to_uint16_bytes(mb_eeprom["product"]));
+
+ // store the addresses
+ if (mb_eeprom.has_key("mac-addr"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, mac_addr),
+ mac_addr_t::from_string(mb_eeprom["mac-addr"]).to_bytes());
+
+ if (mb_eeprom.has_key("ip-addr")) {
byte_vector_t ip_addr_bytes(4);
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["ip-addr"]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, ip_addr), ip_addr_bytes);
+ byte_copy(
+ boost::asio::ip::address_v4::from_string(mb_eeprom["ip-addr"]).to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(
+ N200_EEPROM_ADDR, offsetof(n200_eeprom_map, ip_addr), ip_addr_bytes);
}
- if (mb_eeprom.has_key("subnet")){
+ if (mb_eeprom.has_key("subnet")) {
byte_vector_t ip_addr_bytes(4);
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["subnet"]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, subnet), ip_addr_bytes);
+ byte_copy(
+ boost::asio::ip::address_v4::from_string(mb_eeprom["subnet"]).to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(
+ N200_EEPROM_ADDR, offsetof(n200_eeprom_map, subnet), ip_addr_bytes);
}
- if (mb_eeprom.has_key("gateway")){
+ if (mb_eeprom.has_key("gateway")) {
byte_vector_t ip_addr_bytes(4);
- byte_copy(boost::asio::ip::address_v4::from_string(mb_eeprom["gateway"]).to_bytes(), ip_addr_bytes);
- iface->write_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gateway), ip_addr_bytes);
+ byte_copy(
+ boost::asio::ip::address_v4::from_string(mb_eeprom["gateway"]).to_bytes(),
+ ip_addr_bytes);
+ iface->write_eeprom(
+ N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gateway), ip_addr_bytes);
}
- //gpsdo capabilities
- if (mb_eeprom.has_key("gpsdo")){
+ // gpsdo capabilities
+ if (mb_eeprom.has_key("gpsdo")) {
uint8_t gpsdo_byte = N200_GPSDO_NONE;
- if (mb_eeprom["gpsdo"] == "internal") gpsdo_byte = N200_GPSDO_INTERNAL;
- if (mb_eeprom["gpsdo"] == "onboard") gpsdo_byte = N200_GPSDO_ONBOARD;
- iface->write_eeprom(N200_EEPROM_ADDR, offsetof(n200_eeprom_map, gpsdo), byte_vector_t(1, gpsdo_byte));
+ if (mb_eeprom["gpsdo"] == "internal")
+ gpsdo_byte = N200_GPSDO_INTERNAL;
+ if (mb_eeprom["gpsdo"] == "onboard")
+ gpsdo_byte = N200_GPSDO_ONBOARD;
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, gpsdo),
+ byte_vector_t(1, gpsdo_byte));
}
- //store the serial
- if (mb_eeprom.has_key("serial")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, serial),
- string_to_bytes(mb_eeprom["serial"], SERIAL_LEN)
- );
-
- //store the name
- if (mb_eeprom.has_key("name")) iface->write_eeprom(
- N200_EEPROM_ADDR, offsetof(n200_eeprom_map, name),
- string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
- );
+ // store the serial
+ if (mb_eeprom.has_key("serial"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, serial),
+ string_to_bytes(mb_eeprom["serial"], SERIAL_LEN));
+
+ // store the name
+ if (mb_eeprom.has_key("name"))
+ iface->write_eeprom(N200_EEPROM_ADDR,
+ offsetof(n200_eeprom_map, name),
+ string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN));
}
-
diff --git a/host/lib/usrp/usrp2/n200_image_loader.cpp b/host/lib/usrp/usrp2/n200_image_loader.cpp
index 36da357e4..55b441c8b 100644
--- a/host/lib/usrp/usrp2/n200_image_loader.cpp
+++ b/host/lib/usrp/usrp2/n200_image_loader.cpp
@@ -5,30 +5,27 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include <cstring>
-#include <iostream>
-#include <fstream>
-
-#include <boost/asio/ip/address_v4.hpp>
-#include <boost/assign.hpp>
-#include <boost/filesystem.hpp>
-#include <boost/format.hpp>
-#include <boost/thread.hpp>
-#include <boost/algorithm/string/erase.hpp>
-
+#include "fw_common.h"
+#include "usrp2_iface.hpp"
+#include "usrp2_impl.hpp"
#include <uhd/config.hpp>
-#include <uhd/image_loader.hpp>
#include <uhd/exception.hpp>
+#include <uhd/image_loader.hpp>
#include <uhd/transport/if_addrs.hpp>
#include <uhd/transport/udp_simple.hpp>
+#include <uhd/types/dict.hpp>
#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/paths.hpp>
#include <uhd/utils/static.hpp>
-#include <uhd/types/dict.hpp>
-
-#include "fw_common.h"
-#include "usrp2_iface.hpp"
-#include "usrp2_impl.hpp"
+#include <boost/algorithm/string/erase.hpp>
+#include <boost/asio/ip/address_v4.hpp>
+#include <boost/assign.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/format.hpp>
+#include <boost/thread.hpp>
+#include <cstring>
+#include <fstream>
+#include <iostream>
typedef boost::asio::ip::address_v4 ip_v4;
@@ -48,12 +45,12 @@ using namespace uhd::transport;
#define UDP_TIMEOUT 0.5
#define N200_FW_MAX_SIZE_BYTES 31744
-#define N200_PROD_FW_IMAGE_ADDR 0x00300000
-#define N200_SAFE_FW_IMAGE_ADDR 0x003F0000
+#define N200_PROD_FW_IMAGE_ADDR 0x00300000
+#define N200_SAFE_FW_IMAGE_ADDR 0x003F0000
#define N200_FPGA_MAX_SIZE_BYTES 1572864
-#define N200_PROD_FPGA_IMAGE_ADDR 0x00180000
-#define N200_SAFE_FPGA_IMAGE_ADDR 0x00000000
+#define N200_PROD_FPGA_IMAGE_ADDR 0x00180000
+#define N200_SAFE_FPGA_IMAGE_ADDR 0x00000000
/*
* Packet codes
@@ -62,7 +59,7 @@ typedef enum {
UNKNOWN = ' ',
N200_QUERY = 'a',
- N200_ACK = 'A',
+ N200_ACK = 'A',
GET_FLASH_INFO_CMD = 'f',
GET_FLASH_INFO_ACK = 'F',
@@ -71,8 +68,8 @@ typedef enum {
ERASE_FLASH_ACK = 'E',
CHECK_ERASING_DONE_CMD = 'd',
- DONE_ERASING_ACK = 'D',
- NOT_DONE_ERASING_ACK = 'B',
+ DONE_ERASING_ACK = 'D',
+ NOT_DONE_ERASING_ACK = 'B',
WRITE_FLASH_CMD = 'w',
WRITE_FLASH_ACK = 'W',
@@ -90,30 +87,30 @@ typedef enum {
/*
* Mapping revision numbers to names
*/
-static const uhd::dict<uint32_t, std::string> n200_filename_map = boost::assign::map_list_of
- (0, "n2xx") // Is an N-Series, but the EEPROM value is invalid
- (0xa, "n200_r3")
- (0x100a, "n200_r4")
- (0x10a, "n210_r3")
- (0x110a, "n210_r4")
-;
+static const uhd::dict<uint32_t, std::string> n200_filename_map =
+ boost::assign::map_list_of(
+ 0, "n2xx") // Is an N-Series, but the EEPROM value is invalid
+ (0xa, "n200_r3")(0x100a, "n200_r4")(0x10a, "n210_r3")(0x110a, "n210_r4");
/*
* Packet structure
*/
-typedef struct {
+typedef struct
+{
uint32_t proto_ver;
uint32_t id;
uint32_t seq;
union {
uint32_t ip_addr;
uint32_t hw_rev;
- struct {
+ struct
+ {
uint32_t flash_addr;
uint32_t length;
- uint8_t data[256];
+ uint8_t data[256];
} flash_args;
- struct {
+ struct
+ {
uint32_t sector_size_bytes;
uint32_t memory_size_bytes;
} flash_info_args;
@@ -123,90 +120,97 @@ typedef struct {
/*
* N-Series burn session
*/
-typedef struct {
- bool fw;
- bool overwrite_safe;
- bool reset;
+typedef struct
+{
+ bool fw;
+ bool overwrite_safe;
+ bool reset;
uhd::device_addr_t dev_addr;
- std::string burn_type;
- std::string filepath;
- uint8_t data_in[udp_simple::mtu];
- uint32_t size;
- uint32_t max_size;
- uint32_t flash_addr;
- udp_simple::sptr xport;
+ std::string burn_type;
+ std::string filepath;
+ uint8_t data_in[udp_simple::mtu];
+ uint32_t size;
+ uint32_t max_size;
+ uint32_t flash_addr;
+ udp_simple::sptr xport;
} n200_session_t;
/***********************************************************************
* uhd::image_loader functionality
**********************************************************************/
-static void print_usrp2_error(const image_loader::image_loader_args_t &image_loader_args){
- #ifdef UHD_PLATFORM_WIN32
+static void print_usrp2_error(const image_loader::image_loader_args_t& image_loader_args)
+{
+#ifdef UHD_PLATFORM_WIN32
std::string usrp2_card_burner_gui = "\"";
- const std::string nl = " ^\n ";
- #else
+ const std::string nl = " ^\n ";
+#else
std::string usrp2_card_burner_gui = "sudo \"";
- const std::string nl = " \\\n ";
- #endif
+ const std::string nl = " \\\n ";
+#endif
usrp2_card_burner_gui += find_utility("usrp2_card_burner_gui.py");
usrp2_card_burner_gui += "\"";
- if(image_loader_args.load_firmware){
- usrp2_card_burner_gui += str(boost::format("%s--fw=\"%s\"")
- % nl
+ if (image_loader_args.load_firmware) {
+ usrp2_card_burner_gui += str(boost::format("%s--fw=\"%s\"") % nl
% ((image_loader_args.firmware_path == "")
- ? find_image_path("usrp2_fw.bin")
- : image_loader_args.firmware_path));
+ ? find_image_path("usrp2_fw.bin")
+ : image_loader_args.firmware_path));
}
- if(image_loader_args.load_fpga){
- usrp2_card_burner_gui += str(boost::format("%s--fpga=\"%s\"")
- % nl
- % ((image_loader_args.fpga_path == "")
- ? find_image_path("usrp2_fpga.bin")
- : image_loader_args.fpga_path));
+ if (image_loader_args.load_fpga) {
+ usrp2_card_burner_gui +=
+ str(boost::format("%s--fpga=\"%s\"") % nl
+ % ((image_loader_args.fpga_path == "") ? find_image_path("usrp2_fpga.bin")
+ : image_loader_args.fpga_path));
}
- throw uhd::runtime_error(str(boost::format("The specified device is a USRP2, which is not supported by this utility.\n"
- "Instead, plug the device's SD card into your machine and run this command:\n\n"
- "%s"
- ) % usrp2_card_burner_gui));
+ throw uhd::runtime_error(str(
+ boost::format(
+ "The specified device is a USRP2, which is not supported by this utility.\n"
+ "Instead, plug the device's SD card into your machine and run this "
+ "command:\n\n"
+ "%s")
+ % usrp2_card_burner_gui));
}
/*
* Ethernet communication functions
*/
static UHD_INLINE size_t n200_send_and_recv(udp_simple::sptr xport,
- n200_fw_update_id_t pkt_code,
- n200_fw_update_data_t *pkt_out,
- uint8_t* data){
+ n200_fw_update_id_t pkt_code,
+ n200_fw_update_data_t* pkt_out,
+ uint8_t* data)
+{
pkt_out->proto_ver = htonx<uint32_t>(USRP2_FW_COMPAT_NUM);
- pkt_out->id = htonx<uint32_t>(pkt_code);
+ pkt_out->id = htonx<uint32_t>(pkt_code);
xport->send(boost::asio::buffer(pkt_out, sizeof(*pkt_out)));
return xport->recv(boost::asio::buffer(data, udp_simple::mtu), UDP_TIMEOUT);
}
-static UHD_INLINE bool n200_response_matches(const n200_fw_update_data_t *pkt_in,
- n200_fw_update_id_t pkt_code,
- size_t len){
- return (len > offsetof(n200_fw_update_data_t, data) and
- ntohl(pkt_in->id) == (unsigned)pkt_code);
+static UHD_INLINE bool n200_response_matches(
+ const n200_fw_update_data_t* pkt_in, n200_fw_update_id_t pkt_code, size_t len)
+{
+ return (len > offsetof(n200_fw_update_data_t, data)
+ and ntohl(pkt_in->id) == (unsigned)pkt_code);
}
-static uhd::device_addr_t n200_find(const image_loader::image_loader_args_t &image_loader_args){
- bool user_specified = image_loader_args.args.has_key("addr") or
- image_loader_args.args.has_key("serial") or
- image_loader_args.args.has_key("name");
+static uhd::device_addr_t n200_find(
+ const image_loader::image_loader_args_t& image_loader_args)
+{
+ bool user_specified = image_loader_args.args.has_key("addr")
+ or image_loader_args.args.has_key("serial")
+ or image_loader_args.args.has_key("name");
uhd::device_addrs_t found = usrp2_find(image_loader_args.args);
- if(found.size() > 0){
+ if (found.size() > 0) {
uhd::device_addrs_t n200_found;
udp_simple::sptr rev_xport;
n200_fw_update_data_t pkt_out;
uint8_t data_in[udp_simple::mtu];
- const n200_fw_update_data_t *pkt_in = reinterpret_cast<const n200_fw_update_data_t*>(data_in);
+ const n200_fw_update_data_t* pkt_in =
+ reinterpret_cast<const n200_fw_update_data_t*>(data_in);
size_t len = 0;
/*
@@ -215,45 +219,43 @@ static uhd::device_addr_t n200_find(const image_loader::image_loader_args_t &ima
* this query. If the user supplied specific arguments that
* led to a USRP2, throw an error.
*/
- for(const uhd::device_addr_t &dev: found){
+ for (const uhd::device_addr_t& dev : found) {
rev_xport = udp_simple::make_connected(
- dev.get("addr"),
- BOOST_STRINGIZE(N200_UDP_FW_UPDATE_PORT)
- );
+ dev.get("addr"), BOOST_STRINGIZE(N200_UDP_FW_UPDATE_PORT));
len = n200_send_and_recv(rev_xport, GET_HW_REV_CMD, &pkt_out, data_in);
- if(n200_response_matches(pkt_in, GET_HW_REV_ACK, len)){
- uint32_t rev = ntohl(pkt_in->data.hw_rev);
+ if (n200_response_matches(pkt_in, GET_HW_REV_ACK, len)) {
+ uint32_t rev = ntohl(pkt_in->data.hw_rev);
std::string hw_rev = n200_filename_map.get(rev, "n2xx");
n200_found.push_back(dev);
- n200_found[n200_found.size()-1]["hw_rev"] = hw_rev;
- }
- else if(len > offsetof(n200_fw_update_data_t, data) and ntohl(pkt_in->id) != GET_HW_REV_ACK){
- throw uhd::runtime_error(str(boost::format("Received invalid reply %d from device.")
- % ntohl(pkt_in->id)));
- }
- else if(user_specified){
+ n200_found[n200_found.size() - 1]["hw_rev"] = hw_rev;
+ } else if (len > offsetof(n200_fw_update_data_t, data)
+ and ntohl(pkt_in->id) != GET_HW_REV_ACK) {
+ throw uhd::runtime_error(
+ str(boost::format("Received invalid reply %d from device.")
+ % ntohl(pkt_in->id)));
+ } else if (user_specified) {
// At this point, we haven't received any response, so assume it's a USRP2
print_usrp2_error(image_loader_args);
}
}
// At this point, we should have a single N-Series device
- if(n200_found.size() == 1){
+ if (n200_found.size() == 1) {
return n200_found[0];
- }
- else if(n200_found.size() > 1){
- std::string err_msg = "Could not resolve given args to a single N-Series device.\n"
- "Applicable devices:\n";
+ } else if (n200_found.size() > 1) {
+ std::string err_msg =
+ "Could not resolve given args to a single N-Series device.\n"
+ "Applicable devices:\n";
- for(const uhd::device_addr_t &dev: n200_found){
- err_msg += str(boost::format("* %s (addr=%s)\n")
- % dev.get("hw_rev")
+ for (const uhd::device_addr_t& dev : n200_found) {
+ err_msg += str(boost::format("* %s (addr=%s)\n") % dev.get("hw_rev")
% dev.get("addr"));
}
- err_msg += "\nSpecify one of these devices with the given args to load an image onto it.";
+ err_msg += "\nSpecify one of these devices with the given args to load an "
+ "image onto it.";
throw uhd::runtime_error(err_msg);
}
@@ -265,47 +267,53 @@ static uhd::device_addr_t n200_find(const image_loader::image_loader_args_t &ima
/*
* Validate and read firmware image
*/
-static void n200_validate_firmware_image(n200_session_t &session){
- if(not fs::exists(session.filepath)){
- throw uhd::runtime_error(str(boost::format("Could not find image at path \"%s\".")
- % session.filepath));
+static void n200_validate_firmware_image(n200_session_t& session)
+{
+ if (not fs::exists(session.filepath)) {
+ throw uhd::runtime_error(str(
+ boost::format("Could not find image at path \"%s\".") % session.filepath));
}
session.size = fs::file_size(session.filepath);
session.max_size = N200_FW_MAX_SIZE_BYTES;
- if(session.size > session.max_size){
- throw uhd::runtime_error(str(boost::format("The specified firmware image is too large: %d vs. %d")
- % session.size % session.max_size));
+ if (session.size > session.max_size) {
+ throw uhd::runtime_error(
+ str(boost::format("The specified firmware image is too large: %d vs. %d")
+ % session.size % session.max_size));
}
// File must have proper header
std::ifstream image_file(session.filepath.c_str(), std::ios::binary);
uint8_t test_bytes[4];
image_file.seekg(0, std::ios::beg);
- image_file.read((char*)test_bytes,4);
+ image_file.read((char*)test_bytes, 4);
image_file.close();
- for(int i = 0; i < 4; i++) if(test_bytes[i] != 11){
- throw uhd::runtime_error(str(boost::format("The file at path \"%s\" is not a valid firmware image.")
- % session.filepath));
- }
+ for (int i = 0; i < 4; i++)
+ if (test_bytes[i] != 11) {
+ throw uhd::runtime_error(str(
+ boost::format("The file at path \"%s\" is not a valid firmware image.")
+ % session.filepath));
+ }
}
/*
* Validate and validate FPGA image
*/
-static void n200_validate_fpga_image(n200_session_t &session){
- if(not fs::exists(session.filepath)){
- throw uhd::runtime_error(str(boost::format("Could not find image at path \"%s\".")
- % session.filepath));
+static void n200_validate_fpga_image(n200_session_t& session)
+{
+ if (not fs::exists(session.filepath)) {
+ throw uhd::runtime_error(str(
+ boost::format("Could not find image at path \"%s\".") % session.filepath));
}
session.size = fs::file_size(session.filepath);
session.max_size = N200_FPGA_MAX_SIZE_BYTES;
- if(session.size > session.max_size){
- throw uhd::runtime_error(str(boost::format("The specified FPGA image is too large: %d vs. %d")
- % session.size % session.max_size));
+ if (session.size > session.max_size) {
+ throw uhd::runtime_error(
+ str(boost::format("The specified FPGA image is too large: %d vs. %d")
+ % session.size % session.max_size));
}
// File must have proper header
@@ -314,18 +322,19 @@ static void n200_validate_fpga_image(n200_session_t &session){
image_file.seekg(0, std::ios::beg);
image_file.read((char*)test_bytes, 63);
bool is_good = false;
- for(int i = 0; i < 62; i++){
- if(test_bytes[i] == 255) continue;
- else if(test_bytes[i] == 170 and
- test_bytes[i+1] == 153){
+ for (int i = 0; i < 62; i++) {
+ if (test_bytes[i] == 255)
+ continue;
+ else if (test_bytes[i] == 170 and test_bytes[i + 1] == 153) {
is_good = true;
break;
}
}
image_file.close();
- if(not is_good){
- throw uhd::runtime_error(str(boost::format("The file at path \"%s\" is not a valid FPGA image.")
- % session.filepath));
+ if (not is_good) {
+ throw uhd::runtime_error(
+ str(boost::format("The file at path \"%s\" is not a valid FPGA image.")
+ % session.filepath));
}
}
@@ -333,12 +342,11 @@ static void n200_validate_fpga_image(n200_session_t &session){
* Set up a session for burning an N-Series image. This session info
* will be passed into the erase, burn, and verify functions.
*/
-static void n200_setup_session(n200_session_t &session,
- const image_loader::image_loader_args_t &image_loader_args,
- bool fw){
-
-
- session.fw = fw;
+static void n200_setup_session(n200_session_t& session,
+ const image_loader::image_loader_args_t& image_loader_args,
+ bool fw)
+{
+ session.fw = fw;
session.reset = image_loader_args.args.has_key("reset");
/*
@@ -347,156 +355,162 @@ static void n200_setup_session(n200_session_t &session,
* EEPROM or is otherwise unable to provide its revision, this is
* impossible, and the user must manually provide a firmware file.
*/
- if((session.fw and image_loader_args.firmware_path == "") or
- image_loader_args.fpga_path == ""){
- if(session.dev_addr["hw_rev"] == "n2xx"){
+ if ((session.fw and image_loader_args.firmware_path == "")
+ or image_loader_args.fpga_path == "") {
+ if (session.dev_addr["hw_rev"] == "n2xx") {
throw uhd::runtime_error("This device's revision cannot be determined. "
"You must manually specify a filepath.");
+ } else {
+ session.filepath =
+ session.fw ? find_image_path(
+ str(boost::format("usrp_%s_fw.bin")
+ % erase_tail_copy(session.dev_addr["hw_rev"], 3)))
+ : find_image_path(str(boost::format("usrp_%s_fpga.bin")
+ % session.dev_addr["hw_rev"]));
}
- else{
- session.filepath = session.fw ? find_image_path(str(boost::format("usrp_%s_fw.bin")
- % erase_tail_copy(session.dev_addr["hw_rev"],3)))
- : find_image_path(str(boost::format("usrp_%s_fpga.bin")
- % session.dev_addr["hw_rev"]));
- }
- }
- else{
+ } else {
session.filepath = session.fw ? image_loader_args.firmware_path
: image_loader_args.fpga_path;
}
- if(session.fw) n200_validate_firmware_image(session);
- else n200_validate_fpga_image(session);
+ if (session.fw)
+ n200_validate_firmware_image(session);
+ else
+ n200_validate_fpga_image(session);
session.overwrite_safe = image_loader_args.args.has_key("overwrite-safe");
- if(session.overwrite_safe){
+ if (session.overwrite_safe) {
session.flash_addr = session.fw ? N200_SAFE_FW_IMAGE_ADDR
: N200_SAFE_FPGA_IMAGE_ADDR;
- session.burn_type = session.fw ? "firmware safe"
- : "FPGA safe";
- }
- else{
+ session.burn_type = session.fw ? "firmware safe" : "FPGA safe";
+ } else {
session.flash_addr = session.fw ? N200_PROD_FW_IMAGE_ADDR
: N200_PROD_FPGA_IMAGE_ADDR;
- session.burn_type = session.fw ? "firmware"
- : "FPGA";
+ session.burn_type = session.fw ? "firmware" : "FPGA";
}
- session.xport = udp_simple::make_connected(session.dev_addr["addr"],
- BOOST_STRINGIZE(N200_UDP_FW_UPDATE_PORT));
+ session.xport = udp_simple::make_connected(
+ session.dev_addr["addr"], BOOST_STRINGIZE(N200_UDP_FW_UPDATE_PORT));
}
-static void n200_erase_image(n200_session_t &session){
-
+static void n200_erase_image(n200_session_t& session)
+{
// UDP receive buffer
n200_fw_update_data_t pkt_out;
- const n200_fw_update_data_t *pkt_in = reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
+ const n200_fw_update_data_t* pkt_in =
+ reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
// Setting up UDP packet
pkt_out.data.flash_args.flash_addr = htonx<uint32_t>(session.flash_addr);
- pkt_out.data.flash_args.length = htonx<uint32_t>(session.size);
+ pkt_out.data.flash_args.length = htonx<uint32_t>(session.size);
// Begin erasing
- size_t len = n200_send_and_recv(session.xport, ERASE_FLASH_CMD, &pkt_out, session.data_in);
- if(n200_response_matches(pkt_in, ERASE_FLASH_ACK, len)){
- std::cout << boost::format("-- Erasing %s image...") % session.burn_type << std::flush;
- }
- else if(len < offsetof(n200_fw_update_data_t, data)){
+ size_t len =
+ n200_send_and_recv(session.xport, ERASE_FLASH_CMD, &pkt_out, session.data_in);
+ if (n200_response_matches(pkt_in, ERASE_FLASH_ACK, len)) {
+ std::cout << boost::format("-- Erasing %s image...") % session.burn_type
+ << std::flush;
+ } else if (len < offsetof(n200_fw_update_data_t, data)) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if(ntohl(pkt_in->id) != ERASE_FLASH_ACK){
+ } else if (ntohl(pkt_in->id) != ERASE_FLASH_ACK) {
std::cout << "failed." << std::endl;
- throw uhd::runtime_error(str(boost::format("Received invalid reply %d from device.\n")
- % ntohl(pkt_in->id)));
- }
- else{
+ throw uhd::runtime_error(
+ str(boost::format("Received invalid reply %d from device.\n")
+ % ntohl(pkt_in->id)));
+ } else {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Did not receive response from device.");
}
// Check for erase completion
- while(true){
- len = n200_send_and_recv(session.xport, CHECK_ERASING_DONE_CMD, &pkt_out, session.data_in);
- if(n200_response_matches(pkt_in, DONE_ERASING_ACK, len)){
+ while (true) {
+ len = n200_send_and_recv(
+ session.xport, CHECK_ERASING_DONE_CMD, &pkt_out, session.data_in);
+ if (n200_response_matches(pkt_in, DONE_ERASING_ACK, len)) {
std::cout << "successful." << std::endl;
break;
- }
- else if(len < offsetof(n200_fw_update_data_t, data)){
+ } else if (len < offsetof(n200_fw_update_data_t, data)) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if(ntohl(pkt_in->id) != NOT_DONE_ERASING_ACK){
+ } else if (ntohl(pkt_in->id) != NOT_DONE_ERASING_ACK) {
std::cout << "failed." << std::endl;
- throw uhd::runtime_error(str(boost::format("Received invalid reply %d from device.\n")
- % ntohl(pkt_in->id)));
+ throw uhd::runtime_error(
+ str(boost::format("Received invalid reply %d from device.\n")
+ % ntohl(pkt_in->id)));
}
}
}
-static void n200_write_image(n200_session_t &session){
-
+static void n200_write_image(n200_session_t& session)
+{
// UDP receive buffer
n200_fw_update_data_t pkt_out;
- const n200_fw_update_data_t *pkt_in = reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
+ const n200_fw_update_data_t* pkt_in =
+ reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
size_t len = 0;
// Write image
std::ifstream image(session.filepath.c_str(), std::ios::binary);
- uint32_t current_addr = session.flash_addr;
+ uint32_t current_addr = session.flash_addr;
pkt_out.data.flash_args.length = htonx<uint32_t>(N200_FLASH_DATA_PACKET_SIZE);
- for(size_t i = 0; i < ((session.size/N200_FLASH_DATA_PACKET_SIZE)+1); i++){
+ for (size_t i = 0; i < ((session.size / N200_FLASH_DATA_PACKET_SIZE) + 1); i++) {
pkt_out.data.flash_args.flash_addr = htonx<uint32_t>(current_addr);
memset(pkt_out.data.flash_args.data, 0x0, N200_FLASH_DATA_PACKET_SIZE);
image.read((char*)pkt_out.data.flash_args.data, N200_FLASH_DATA_PACKET_SIZE);
- len = n200_send_and_recv(session.xport, WRITE_FLASH_CMD, &pkt_out, session.data_in);
- if(n200_response_matches(pkt_in, WRITE_FLASH_ACK, len)){
- std::cout << boost::format("\r-- Writing %s image (%d%%)")
- % session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ len =
+ n200_send_and_recv(session.xport, WRITE_FLASH_CMD, &pkt_out, session.data_in);
+ if (n200_response_matches(pkt_in, WRITE_FLASH_ACK, len)) {
+ std::cout << boost::format("\r-- Writing %s image (%d%%)") % session.burn_type
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::flush;
- }
- else if(len < offsetof(n200_fw_update_data_t, data)){
+ } else if (len < offsetof(n200_fw_update_data_t, data)) {
image.close();
std::cout << boost::format("\r--Writing %s image..failed at %d%%.")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if(ntohl(pkt_in->id) != WRITE_FLASH_ACK){
+ } else if (ntohl(pkt_in->id) != WRITE_FLASH_ACK) {
image.close();
std::cout << boost::format("\r--Writing %s image..failed at %d%%.")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::endl;
- throw uhd::runtime_error(str(boost::format("Received invalid reply %d from device.\n")
- % ntohl(pkt_in->id)));
+ throw uhd::runtime_error(
+ str(boost::format("Received invalid reply %d from device.\n")
+ % ntohl(pkt_in->id)));
}
current_addr += N200_FLASH_DATA_PACKET_SIZE;
}
- std::cout << boost::format("\r-- Writing %s image...successful.")
- % session.burn_type
+ std::cout << boost::format("\r-- Writing %s image...successful.") % session.burn_type
<< std::endl;
image.close();
}
-static void n200_verify_image(n200_session_t &session){
-
+static void n200_verify_image(n200_session_t& session)
+{
// UDP receive buffer
n200_fw_update_data_t pkt_out;
- const n200_fw_update_data_t *pkt_in = reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
+ const n200_fw_update_data_t* pkt_in =
+ reinterpret_cast<const n200_fw_update_data_t*>(session.data_in);
size_t len = 0;
// Read and verify image
std::ifstream image(session.filepath.c_str(), std::ios::binary);
uint8_t image_part[N200_FLASH_DATA_PACKET_SIZE];
- uint32_t current_addr = session.flash_addr;
+ uint32_t current_addr = session.flash_addr;
pkt_out.data.flash_args.length = htonx<uint32_t>(N200_FLASH_DATA_PACKET_SIZE);
- uint16_t cmp_len = 0;
- for(size_t i = 0; i < ((session.size/N200_FLASH_DATA_PACKET_SIZE)+1); i++){
+ uint16_t cmp_len = 0;
+ for (size_t i = 0; i < ((session.size / N200_FLASH_DATA_PACKET_SIZE) + 1); i++) {
memset(image_part, 0x0, N200_FLASH_DATA_PACKET_SIZE);
memset((void*)pkt_in->data.flash_args.data, 0x0, N200_FLASH_DATA_PACKET_SIZE);
@@ -504,57 +518,66 @@ static void n200_verify_image(n200_session_t &session){
image.read((char*)image_part, N200_FLASH_DATA_PACKET_SIZE);
cmp_len = image.gcount();
- len = n200_send_and_recv(session.xport, READ_FLASH_CMD, &pkt_out, session.data_in);
- if(n200_response_matches(pkt_in, READ_FLASH_ACK, len)){
+ len =
+ n200_send_and_recv(session.xport, READ_FLASH_CMD, &pkt_out, session.data_in);
+ if (n200_response_matches(pkt_in, READ_FLASH_ACK, len)) {
std::cout << boost::format("\r-- Verifying %s image (%d%%)")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::flush;
- if(memcmp(image_part, pkt_in->data.flash_args.data, cmp_len)){
+ if (memcmp(image_part, pkt_in->data.flash_args.data, cmp_len)) {
std::cout << boost::format("\r-- Verifying %s image...failed at %d%%.")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::endl;
- throw uhd::runtime_error(str(boost::format("Failed to verify %s image.")
- % session.burn_type));
+ throw uhd::runtime_error(
+ str(boost::format("Failed to verify %s image.") % session.burn_type));
}
- }
- else if(len < offsetof(n200_fw_update_data_t, data)){
+ } else if (len < offsetof(n200_fw_update_data_t, data)) {
image.close();
std::cout << boost::format("\r-- Verifying %s image...failed at %d%%.")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::endl;
throw uhd::runtime_error("Timed out waiting for reply from device.");
- }
- else if(ntohl(pkt_in->id) != READ_FLASH_ACK){
+ } else if (ntohl(pkt_in->id) != READ_FLASH_ACK) {
image.close();
std::cout << boost::format("\r-- Verifying %s image...failed at %d%%.")
% session.burn_type
- % int((double(current_addr-session.flash_addr)/double(session.size))*100)
+ % int((double(current_addr - session.flash_addr)
+ / double(session.size))
+ * 100)
<< std::endl;
- throw uhd::runtime_error(str(boost::format("Received invalid reply %d from device.\n")
- % ntohl(pkt_in->id)));
+ throw uhd::runtime_error(
+ str(boost::format("Received invalid reply %d from device.\n")
+ % ntohl(pkt_in->id)));
}
current_addr += N200_FLASH_DATA_PACKET_SIZE;
}
- std::cout << boost::format("\r-- Verifying %s image...successful.") % session.burn_type
+ std::cout << boost::format("\r-- Verifying %s image...successful.")
+ % session.burn_type
<< std::endl;
image.close();
}
-static void n200_reset(n200_session_t &session){
-
+static void n200_reset(n200_session_t& session)
+{
// UDP receive buffer
n200_fw_update_data_t pkt_out;
// There should be no response
std::cout << "-- Resetting device..." << std::flush;
size_t len = n200_send_and_recv(session.xport, RESET_CMD, &pkt_out, session.data_in);
- if(len > 0){
+ if (len > 0) {
std::cout << "failed." << std::endl;
throw uhd::runtime_error("Failed to reset N200.");
}
@@ -562,20 +585,22 @@ static void n200_reset(n200_session_t &session){
}
// n210_r4 -> N210 r4
-static std::string nice_name(const std::string &fw_rev){
+static std::string nice_name(const std::string& fw_rev)
+{
std::string ret = fw_rev;
- ret[0] = ::toupper(ret[0]);
+ ret[0] = ::toupper(ret[0]);
size_t pos = 0;
- if((pos = fw_rev.find("_")) != std::string::npos){
+ if ((pos = fw_rev.find("_")) != std::string::npos) {
ret[pos] = ' ';
}
return ret;
}
-static bool n200_image_loader(const image_loader::image_loader_args_t &image_loader_args){
- if(!image_loader_args.load_firmware and !image_loader_args.load_fpga){
+static bool n200_image_loader(const image_loader::image_loader_args_t& image_loader_args)
+{
+ if (!image_loader_args.load_firmware and !image_loader_args.load_fpga) {
return false;
}
@@ -583,43 +608,36 @@ static bool n200_image_loader(const image_loader::image_loader_args_t &image_loa
// This will throw if specific args lead to a USRP2
n200_session_t session;
session.dev_addr = n200_find(image_loader_args);
- if(session.dev_addr.size() == 0){
+ if (session.dev_addr.size() == 0) {
return false;
}
std::cout << boost::format("Unit: USRP %s (%s, %s)")
- % nice_name(session.dev_addr.get("hw_rev"))
- % session.dev_addr.get("serial")
- % session.dev_addr.get("addr")
- << std::endl;
+ % nice_name(session.dev_addr.get("hw_rev"))
+ % session.dev_addr.get("serial") % session.dev_addr.get("addr")
+ << std::endl;
- if(image_loader_args.load_firmware){
- n200_setup_session(session,
- image_loader_args,
- true
- );
+ if (image_loader_args.load_firmware) {
+ n200_setup_session(session, image_loader_args, true);
std::cout << "Firmware image: " << session.filepath << std::endl;
n200_erase_image(session);
n200_write_image(session);
n200_verify_image(session);
- if(session.reset and !image_loader_args.load_fpga){
+ if (session.reset and !image_loader_args.load_fpga) {
n200_reset(session);
}
}
- if(image_loader_args.load_fpga){
- n200_setup_session(session,
- image_loader_args,
- false
- );
+ if (image_loader_args.load_fpga) {
+ n200_setup_session(session, image_loader_args, false);
std::cout << "FPGA image: " << session.filepath << std::endl;
n200_erase_image(session);
n200_write_image(session);
n200_verify_image(session);
- if(session.reset){
+ if (session.reset) {
n200_reset(session);
}
}
@@ -627,10 +645,13 @@ static bool n200_image_loader(const image_loader::image_loader_args_t &image_loa
return true;
}
-UHD_STATIC_BLOCK(register_n200_image_loader){
- std::string recovery_instructions = "Aborting. Your USRP-N Series unit will likely be unusable.\n"
- "Refer to http://files.ettus.com/manual/page_usrp2.html#usrp2_loadflash_brick\n"
- "for details on restoring your device.";
+UHD_STATIC_BLOCK(register_n200_image_loader)
+{
+ std::string recovery_instructions =
+ "Aborting. Your USRP-N Series unit will likely be unusable.\n"
+ "Refer to http://files.ettus.com/manual/page_usrp2.html#usrp2_loadflash_brick\n"
+ "for details on restoring your device.";
- image_loader::register_image_loader("usrp2", n200_image_loader, recovery_instructions);
+ image_loader::register_image_loader(
+ "usrp2", n200_image_loader, recovery_instructions);
}
diff --git a/host/lib/usrp/usrp2/usrp2_clk_regs.hpp b/host/lib/usrp/usrp2/usrp2_clk_regs.hpp
index ac58decc0..c85bdf35d 100644
--- a/host/lib/usrp/usrp2/usrp2_clk_regs.hpp
+++ b/host/lib/usrp/usrp2/usrp2_clk_regs.hpp
@@ -10,78 +10,84 @@
#include "usrp2_iface.hpp"
-class usrp2_clk_regs_t {
+class usrp2_clk_regs_t
+{
public:
- usrp2_clk_regs_t(void):
- test(0),
- fpga(0),
- adc(0),
- dac(0),
- serdes(0),
- exp(0),
- tx_db(0),
- rx_db(0) {}
+ usrp2_clk_regs_t(void)
+ : test(0), fpga(0), adc(0), dac(0), serdes(0), exp(0), tx_db(0), rx_db(0)
+ {
+ }
- usrp2_clk_regs_t(usrp2_iface::rev_type rev) {
- fpga = adc = serdes = exp = tx_db = 0;
- test = 0;
- fpga = 1;
- dac = 3;
+ usrp2_clk_regs_t(usrp2_iface::rev_type rev)
+ {
+ fpga = adc = serdes = exp = tx_db = 0;
+ test = 0;
+ fpga = 1;
+ dac = 3;
- switch(rev) {
- case usrp2_iface::USRP2_REV3:
- exp = 2;
- adc = 4;
- serdes = 2;
- tx_db = 6;
- break;
- case usrp2_iface::USRP2_REV4:
- exp = 5;
- adc = 4;
- serdes = 2;
- tx_db = 6;
- break;
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- exp = 6;
- adc = 2;
- serdes = 4;
- tx_db = 5;
- break;
- case usrp2_iface::USRP_NXXX:
- //dont throw, it may be unitialized
- break;
- }
+ switch (rev) {
+ case usrp2_iface::USRP2_REV3:
+ exp = 2;
+ adc = 4;
+ serdes = 2;
+ tx_db = 6;
+ break;
+ case usrp2_iface::USRP2_REV4:
+ exp = 5;
+ adc = 4;
+ serdes = 2;
+ tx_db = 6;
+ break;
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ exp = 6;
+ adc = 2;
+ serdes = 4;
+ tx_db = 5;
+ break;
+ case usrp2_iface::USRP_NXXX:
+ // dont throw, it may be unitialized
+ break;
+ }
- rx_db = 7;
- }
+ rx_db = 7;
+ }
- static int output(int clknum) { return 0x3C + clknum; }
- static int div_lo(int clknum) { return 0x48 + 2 * clknum; }
- static int div_hi(int clknum) { return 0x49 + 2 * clknum; }
+ static int output(int clknum)
+ {
+ return 0x3C + clknum;
+ }
+ static int div_lo(int clknum)
+ {
+ return 0x48 + 2 * clknum;
+ }
+ static int div_hi(int clknum)
+ {
+ return 0x49 + 2 * clknum;
+ }
- const static int acounter = 0x04;
- const static int bcounter_msb = 0x05;
- const static int bcounter_lsb = 0x06;
- const static int pll_1 = 0x07;
- const static int pll_2 = 0x08;
- const static int pll_3 = 0x09;
- const static int pll_4 = 0x0A;
- const static int ref_counter_msb = 0x0B;
- const static int ref_counter_lsb = 0x0C;
- const static int pll_5 = 0x0D;
- const static int update = 0x5A;
+ const static int acounter = 0x04;
+ const static int bcounter_msb = 0x05;
+ const static int bcounter_lsb = 0x06;
+ const static int pll_1 = 0x07;
+ const static int pll_2 = 0x08;
+ const static int pll_3 = 0x09;
+ const static int pll_4 = 0x0A;
+ const static int ref_counter_msb = 0x0B;
+ const static int ref_counter_lsb = 0x0C;
+ const static int pll_5 = 0x0D;
+ const static int update = 0x5A;
- int test;
- int fpga;
- int adc;
- int dac;
- int serdes;
- int exp;
- int tx_db;
- int rx_db;
+ int test;
+ int fpga;
+ int adc;
+ int dac;
+ int serdes;
+ int exp;
+ int tx_db;
+ int rx_db;
};
-#endif //INCLUDED_USRP2_CLK_REGS_HPP
+#endif // INCLUDED_USRP2_CLK_REGS_HPP
diff --git a/host/lib/usrp/usrp2/usrp2_fifo_ctrl.cpp b/host/lib/usrp/usrp2/usrp2_fifo_ctrl.cpp
index 0c0a21851..ca3a79ca5 100644
--- a/host/lib/usrp/usrp2/usrp2_fifo_ctrl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_fifo_ctrl.cpp
@@ -5,24 +5,24 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "usrp2_fifo_ctrl.hpp"
#include "usrp2_regs.hpp"
#include <uhd/exception.hpp>
+#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/safe_call.hpp>
-#include <uhd/transport/vrt_if_packet.hpp>
-#include "usrp2_fifo_ctrl.hpp"
-#include <boost/thread/mutex.hpp>
-#include <boost/thread/thread.hpp>
#include <boost/asio.hpp> //htonl
#include <boost/format.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
using namespace uhd;
using namespace uhd::transport;
-static const size_t POKE32_CMD = (1 << 8);
-static const size_t PEEK32_CMD = 0;
+static const size_t POKE32_CMD = (1 << 8);
+static const size_t PEEK32_CMD = 0;
static const double ACK_TIMEOUT = 0.5;
-static const double MASSIVE_TIMEOUT = 10.0; //for when we wait on a timed command
+static const double MASSIVE_TIMEOUT = 10.0; // for when we wait on a timed command
static const uint32_t MAX_SEQS_OUT = 63;
#define SPI_DIV SR_SPI_CORE + 0
@@ -32,43 +32,44 @@ static const uint32_t MAX_SEQS_OUT = 63;
// spi clock rate = master_clock/(div+1)/2 (10MHz in this case)
#define SPI_DIVIDER 4
-class usrp2_fifo_ctrl_impl : public usrp2_fifo_ctrl{
+class usrp2_fifo_ctrl_impl : public usrp2_fifo_ctrl
+{
public:
-
- usrp2_fifo_ctrl_impl(zero_copy_if::sptr xport):
- _xport(xport),
- _seq_out(0),
- _seq_ack(0),
- _timeout(ACK_TIMEOUT)
+ usrp2_fifo_ctrl_impl(zero_copy_if::sptr xport)
+ : _xport(xport), _seq_out(0), _seq_ack(0), _timeout(ACK_TIMEOUT)
{
- while (_xport->get_recv_buff(0.0)){} //flush
+ while (_xport->get_recv_buff(0.0)) {
+ } // flush
this->set_time(uhd::time_spec_t(0.0));
- this->set_tick_rate(1.0); //something possible but bogus
+ this->set_tick_rate(1.0); // something possible but bogus
this->init_spi();
}
- ~usrp2_fifo_ctrl_impl(void){
- _timeout = ACK_TIMEOUT; //reset timeout to something small
+ ~usrp2_fifo_ctrl_impl(void)
+ {
+ _timeout = ACK_TIMEOUT; // reset timeout to something small
UHD_SAFE_CALL(
- this->peek32(0); //dummy peek with the purpose of ack'ing all packets
+ this->peek32(0); // dummy peek with the purpose of ack'ing all packets
)
}
/*******************************************************************
* Peek and poke 32 bit implementation
******************************************************************/
- void poke32(const wb_addr_type addr, const uint32_t data){
+ void poke32(const wb_addr_type addr, const uint32_t data)
+ {
boost::mutex::scoped_lock lock(_mutex);
- this->send_pkt((addr - SETTING_REGS_BASE)/4, data, POKE32_CMD);
+ this->send_pkt((addr - SETTING_REGS_BASE) / 4, data, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
}
- uint32_t peek32(const wb_addr_type addr){
+ uint32_t peek32(const wb_addr_type addr)
+ {
boost::mutex::scoped_lock lock(_mutex);
- this->send_pkt((addr - READBACK_BASE)/4, 0, PEEK32_CMD);
+ this->send_pkt((addr - READBACK_BASE) / 4, 0, PEEK32_CMD);
return this->wait_for_ack(_seq_out);
}
@@ -76,58 +77,62 @@ public:
/*******************************************************************
* Peek and poke 16 bit not implemented
******************************************************************/
- void poke16(const wb_addr_type, const uint16_t){
+ void poke16(const wb_addr_type, const uint16_t)
+ {
throw uhd::not_implemented_error("poke16 not implemented in fifo ctrl module");
}
- uint16_t peek16(const wb_addr_type){
+ uint16_t peek16(const wb_addr_type)
+ {
throw uhd::not_implemented_error("peek16 not implemented in fifo ctrl module");
}
/*******************************************************************
* FIFO controlled SPI implementation
******************************************************************/
- void init_spi(void){
+ void init_spi(void)
+ {
boost::mutex::scoped_lock lock(_mutex);
this->send_pkt(SPI_DIV, SPI_DIVIDER, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
_ctrl_word_cache = 0; // force update first time around
}
- uint32_t transact_spi(
- int which_slave,
- const spi_config_t &config,
+ uint32_t transact_spi(int which_slave,
+ const spi_config_t& config,
uint32_t data,
size_t num_bits,
- bool readback
- ){
+ bool readback)
+ {
boost::mutex::scoped_lock lock(_mutex);
- //load control word
+ // load control word
uint32_t ctrl_word = 0;
ctrl_word |= ((which_slave & 0xffffff) << 0);
ctrl_word |= ((num_bits & 0x3ff) << 24);
- if (config.mosi_edge == spi_config_t::EDGE_FALL) ctrl_word |= (1 << 31);
- if (config.miso_edge == spi_config_t::EDGE_RISE) ctrl_word |= (1 << 30);
+ if (config.mosi_edge == spi_config_t::EDGE_FALL)
+ ctrl_word |= (1 << 31);
+ if (config.miso_edge == spi_config_t::EDGE_RISE)
+ ctrl_word |= (1 << 30);
- //load data word (must be in upper bits)
+ // load data word (must be in upper bits)
const uint32_t data_out = data << (32 - num_bits);
- //conditionally send control word
- if (_ctrl_word_cache != ctrl_word){
+ // conditionally send control word
+ if (_ctrl_word_cache != ctrl_word) {
this->send_pkt(SPI_CTRL, ctrl_word, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
_ctrl_word_cache = ctrl_word;
}
- //send data word
+ // send data word
this->send_pkt(SPI_DATA, data_out, POKE32_CMD);
- this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
+ this->wait_for_ack(_seq_out - MAX_SEQS_OUT);
- //conditional readback
- if (readback){
+ // conditional readback
+ if (readback) {
this->send_pkt(SPI_READBACK, 0, PEEK32_CMD);
return this->wait_for_ack(_seq_out);
}
@@ -138,11 +143,13 @@ public:
/*******************************************************************
* Update methods for time
******************************************************************/
- void set_time(const uhd::time_spec_t &time){
+ void set_time(const uhd::time_spec_t& time)
+ {
boost::mutex::scoped_lock lock(_mutex);
- _time = time;
+ _time = time;
_use_time = _time != uhd::time_spec_t(0.0);
- if (_use_time) _timeout = MASSIVE_TIMEOUT; //permanently sets larger timeout
+ if (_use_time)
+ _timeout = MASSIVE_TIMEOUT; // permanently sets larger timeout
}
uhd::time_spec_t get_time()
@@ -151,72 +158,75 @@ public:
return _time;
}
- void set_tick_rate(const double rate){
+ void set_tick_rate(const double rate)
+ {
boost::mutex::scoped_lock lock(_mutex);
_tick_rate = rate;
}
private:
-
/*******************************************************************
* Primary control and interaction private methods
******************************************************************/
- UHD_INLINE void send_pkt(wb_addr_type addr, uint32_t data, int cmd){
+ UHD_INLINE void send_pkt(wb_addr_type addr, uint32_t data, int cmd)
+ {
managed_send_buffer::sptr buff = _xport->get_send_buff(0.0);
- if (not buff){
+ if (not buff) {
throw uhd::runtime_error("fifo ctrl timed out getting a send buffer");
}
- uint32_t *trans = buff->cast<uint32_t *>();
- trans[0] = htonl(++_seq_out);
- uint32_t *pkt = trans + 1;
+ uint32_t* trans = buff->cast<uint32_t*>();
+ trans[0] = htonl(++_seq_out);
+ uint32_t* pkt = trans + 1;
- //load packet info
+ // load packet info
vrt::if_packet_info_t packet_info;
- packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
+ packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
packet_info.num_payload_words32 = 2;
- packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(uint32_t);
+ packet_info.num_payload_bytes =
+ packet_info.num_payload_words32 * sizeof(uint32_t);
packet_info.packet_count = _seq_out;
- packet_info.tsf = _time.to_ticks(_tick_rate);
- packet_info.sob = false;
- packet_info.eob = false;
- packet_info.has_sid = false;
- packet_info.has_cid = false;
- packet_info.has_tsi = false;
- packet_info.has_tsf = _use_time;
- packet_info.has_tlr = false;
-
- //load header
+ packet_info.tsf = _time.to_ticks(_tick_rate);
+ packet_info.sob = false;
+ packet_info.eob = false;
+ packet_info.has_sid = false;
+ packet_info.has_cid = false;
+ packet_info.has_tsi = false;
+ packet_info.has_tsf = _use_time;
+ packet_info.has_tlr = false;
+
+ // load header
vrt::if_hdr_pack_be(pkt, packet_info);
- //load payload
- const uint32_t ctrl_word = (addr & 0xff) | cmd | (_seq_out << 16);
- pkt[packet_info.num_header_words32+0] = htonl(ctrl_word);
- pkt[packet_info.num_header_words32+1] = htonl(data);
+ // load payload
+ const uint32_t ctrl_word = (addr & 0xff) | cmd | (_seq_out << 16);
+ pkt[packet_info.num_header_words32 + 0] = htonl(ctrl_word);
+ pkt[packet_info.num_header_words32 + 1] = htonl(data);
- //send the buffer over the interface
- buff->commit(sizeof(uint32_t)*(packet_info.num_packet_words32+1));
+ // send the buffer over the interface
+ buff->commit(sizeof(uint32_t) * (packet_info.num_packet_words32 + 1));
}
- UHD_INLINE bool wraparound_lt16(const int16_t i0, const int16_t i1){
- if (((i0 ^ i1) & 0x8000) == 0) //same sign bits
+ UHD_INLINE bool wraparound_lt16(const int16_t i0, const int16_t i1)
+ {
+ if (((i0 ^ i1) & 0x8000) == 0) // same sign bits
return uint16_t(i0) < uint16_t(i1);
return int16_t(i1 - i0) > 0;
}
- UHD_INLINE uint32_t wait_for_ack(const uint16_t seq_to_ack){
-
- while (wraparound_lt16(_seq_ack, seq_to_ack)){
+ UHD_INLINE uint32_t wait_for_ack(const uint16_t seq_to_ack)
+ {
+ while (wraparound_lt16(_seq_ack, seq_to_ack)) {
managed_recv_buffer::sptr buff = _xport->get_recv_buff(_timeout);
- if (not buff){
+ if (not buff) {
throw uhd::runtime_error("fifo ctrl timed out looking for acks");
}
- const uint32_t *pkt = buff->cast<const uint32_t *>();
+ const uint32_t* pkt = buff->cast<const uint32_t*>();
vrt::if_packet_info_t packet_info;
- packet_info.num_packet_words32 = buff->size()/sizeof(uint32_t);
+ packet_info.num_packet_words32 = buff->size() / sizeof(uint32_t);
vrt::if_hdr_unpack_be(pkt, packet_info);
- _seq_ack = ntohl(pkt[packet_info.num_header_words32+0]) >> 16;
- if (_seq_ack == seq_to_ack){
- return ntohl(pkt[packet_info.num_header_words32+1]);
+ _seq_ack = ntohl(pkt[packet_info.num_header_words32 + 0]) >> 16;
+ if (_seq_ack == seq_to_ack) {
+ return ntohl(pkt[packet_info.num_header_words32 + 1]);
}
}
@@ -235,6 +245,7 @@ private:
};
-usrp2_fifo_ctrl::sptr usrp2_fifo_ctrl::make(zero_copy_if::sptr xport){
+usrp2_fifo_ctrl::sptr usrp2_fifo_ctrl::make(zero_copy_if::sptr xport)
+{
return sptr(new usrp2_fifo_ctrl_impl(xport));
}
diff --git a/host/lib/usrp/usrp2/usrp2_fifo_ctrl.hpp b/host/lib/usrp/usrp2/usrp2_fifo_ctrl.hpp
index cbb243a79..5f8cdb264 100644
--- a/host/lib/usrp/usrp2/usrp2_fifo_ctrl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_fifo_ctrl.hpp
@@ -8,12 +8,12 @@
#ifndef INCLUDED_USRP2_FIFO_CTRL_HPP
#define INCLUDED_USRP2_FIFO_CTRL_HPP
-#include <uhd/types/time_spec.hpp>
-#include <uhd/types/serial.hpp>
#include <uhd/transport/zero_copy.hpp>
-#include <memory>
-#include <boost/utility.hpp>
+#include <uhd/types/serial.hpp>
+#include <uhd/types/time_spec.hpp>
#include <uhd/types/wb_iface.hpp>
+#include <boost/utility.hpp>
+#include <memory>
#include <string>
/*!
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index 962ead769..029d2b30a 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -36,13 +36,12 @@ namespace fs = boost::filesystem;
static const double CTRL_RECV_TIMEOUT = 1.0;
static const size_t CTRL_RECV_RETRIES = 3;
-//custom timeout error for retry logic to catch/retry
+// custom timeout error for retry logic to catch/retry
struct timeout_error : uhd::runtime_error
{
- timeout_error(const std::string &what):
- uhd::runtime_error(what)
+ timeout_error(const std::string& what) : uhd::runtime_error(what)
{
- //NOP
+ // NOP
}
};
@@ -51,24 +50,25 @@ static const uint32_t MIN_PROTO_COMPAT_I2C = 7;
// The register compat number must reflect the protocol compatibility
// and the compatibility of the register mapping (more likely to change).
static const uint32_t MIN_PROTO_COMPAT_REG = 10;
-//static const uint32_t MIN_PROTO_COMPAT_UART = 7;
+// static const uint32_t MIN_PROTO_COMPAT_UART = 7;
-class usrp2_iface_impl : public usrp2_iface{
+class usrp2_iface_impl : public usrp2_iface
+{
public:
-/***********************************************************************
- * Structors
- **********************************************************************/
- usrp2_iface_impl(udp_simple::sptr ctrl_transport):
- _ctrl_transport(ctrl_transport),
- _ctrl_seq_num(0),
- _protocol_compat(0) //initialized below...
+ /***********************************************************************
+ * Structors
+ **********************************************************************/
+ usrp2_iface_impl(udp_simple::sptr ctrl_transport)
+ : _ctrl_transport(ctrl_transport)
+ , _ctrl_seq_num(0)
+ , _protocol_compat(0) // initialized below...
{
- //Obtain the firmware's compat number.
- //Save the response compat number for communication.
- //TODO can choose to reject certain older compat numbers
+ // Obtain the firmware's compat number.
+ // Save the response compat number for communication.
+ // TODO can choose to reject certain older compat numbers
usrp2_ctrl_data_t ctrl_data = usrp2_ctrl_data_t();
- ctrl_data.id = htonl(USRP2_CTRL_ID_WAZZUP_BRO);
- ctrl_data = ctrl_send_and_recv(ctrl_data, 0, ~0);
+ ctrl_data.id = htonl(USRP2_CTRL_ID_WAZZUP_BRO);
+ ctrl_data = ctrl_send_and_recv(ctrl_data, 0, ~0);
if (ntohl(ctrl_data.id) != USRP2_CTRL_ID_WAZZUP_DUDE)
throw uhd::runtime_error("firmware not responding");
_protocol_compat = ntohl(ctrl_data.proto_ver);
@@ -76,71 +76,82 @@ public:
mb_eeprom = usrp2_impl::get_mb_eeprom(*this);
}
- ~usrp2_iface_impl(void){UHD_SAFE_CALL(
- this->lock_device(false);
- )}
+ ~usrp2_iface_impl(void)
+ {
+ UHD_SAFE_CALL(this->lock_device(false);)
+ }
-/***********************************************************************
- * Device locking
- **********************************************************************/
+ /***********************************************************************
+ * Device locking
+ **********************************************************************/
- void lock_device(bool lock){
- if (lock){
+ void lock_device(bool lock)
+ {
+ if (lock) {
this->pokefw(U2_FW_REG_LOCK_GPID, get_process_hash());
_lock_task = task::make(std::bind(&usrp2_iface_impl::lock_task, this));
- }
- else{
- _lock_task.reset(); //shutdown the task
- this->pokefw(U2_FW_REG_LOCK_TIME, 0); //unlock
+ } else {
+ _lock_task.reset(); // shutdown the task
+ this->pokefw(U2_FW_REG_LOCK_TIME, 0); // unlock
}
}
- bool is_device_locked(void){
- //never assume lock with fpga image mismatch
- if ((this->peek32(U2_REG_COMPAT_NUM_RB) >> 16) != USRP2_FPGA_COMPAT_NUM) return false;
+ bool is_device_locked(void)
+ {
+ // never assume lock with fpga image mismatch
+ if ((this->peek32(U2_REG_COMPAT_NUM_RB) >> 16) != USRP2_FPGA_COMPAT_NUM)
+ return false;
uint32_t lock_time = this->peekfw(U2_FW_REG_LOCK_TIME);
uint32_t lock_gpid = this->peekfw(U2_FW_REG_LOCK_GPID);
- //may not be the right tick rate, but this is ok for locking purposes
- const uint32_t lock_timeout_time = uint32_t(3*100e6);
+ // may not be the right tick rate, but this is ok for locking purposes
+ const uint32_t lock_timeout_time = uint32_t(3 * 100e6);
- //if the difference is larger, assume not locked anymore
- if ((lock_time & 1) == 0) return false; //bit0 says unlocked
+ // if the difference is larger, assume not locked anymore
+ if ((lock_time & 1) == 0)
+ return false; // bit0 says unlocked
const uint32_t time_diff = this->get_curr_time() - lock_time;
- if (time_diff >= lock_timeout_time) return false;
+ if (time_diff >= lock_timeout_time)
+ return false;
- //otherwise only lock if the device hash is different that ours
+ // otherwise only lock if the device hash is different that ours
return lock_gpid != get_process_hash();
}
- void lock_task(void){
- //re-lock in task
+ void lock_task(void)
+ {
+ // re-lock in task
this->pokefw(U2_FW_REG_LOCK_TIME, this->get_curr_time());
- //sleep for a bit
+ // sleep for a bit
std::this_thread::sleep_for(std::chrono::milliseconds(1500));
}
- uint32_t get_curr_time(void){
- return this->peek32(U2_REG_TIME64_LO_RB_IMM) | 1; //bit 1 says locked
+ uint32_t get_curr_time(void)
+ {
+ return this->peek32(U2_REG_TIME64_LO_RB_IMM) | 1; // bit 1 says locked
}
-/***********************************************************************
- * Peek and Poke
- **********************************************************************/
- void poke32(const wb_addr_type addr, const uint32_t data){
+ /***********************************************************************
+ * Peek and Poke
+ **********************************************************************/
+ void poke32(const wb_addr_type addr, const uint32_t data)
+ {
this->get_reg<uint32_t, USRP2_REG_ACTION_FPGA_POKE32>(addr, data);
}
- uint32_t peek32(const wb_addr_type addr){
+ uint32_t peek32(const wb_addr_type addr)
+ {
return this->get_reg<uint32_t, USRP2_REG_ACTION_FPGA_PEEK32>(addr);
}
- void poke16(const wb_addr_type addr, const uint16_t data){
+ void poke16(const wb_addr_type addr, const uint16_t data)
+ {
this->get_reg<uint16_t, USRP2_REG_ACTION_FPGA_POKE16>(addr, data);
}
- uint16_t peek16(const wb_addr_type addr){
+ uint16_t peek16(const wb_addr_type addr)
+ {
return this->get_reg<uint16_t, USRP2_REG_ACTION_FPGA_PEEK16>(addr);
}
@@ -155,236 +166,294 @@ public:
}
template <class T, usrp2_reg_action_t action>
- T get_reg(wb_addr_type addr, T data = 0){
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_GET_THIS_REGISTER_FOR_ME_BRO);
- out_data.data.reg_args.addr = htonl(addr);
- out_data.data.reg_args.data = htonl(uint32_t(data));
+ T get_reg(wb_addr_type addr, T data = 0)
+ {
+ // setup the out data
+ usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
+ out_data.id = htonl(USRP2_CTRL_ID_GET_THIS_REGISTER_FOR_ME_BRO);
+ out_data.data.reg_args.addr = htonl(addr);
+ out_data.data.reg_args.data = htonl(uint32_t(data));
out_data.data.reg_args.action = action;
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_REG);
+ // send and recv
+ usrp2_ctrl_data_t in_data =
+ this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_REG);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_OMG_GOT_REGISTER_SO_BAD_DUDE);
return T(ntohl(in_data.data.reg_args.data));
}
-/***********************************************************************
- * SPI
- **********************************************************************/
- uint32_t transact_spi(
- int which_slave,
- const spi_config_t &config,
+ /***********************************************************************
+ * SPI
+ **********************************************************************/
+ uint32_t transact_spi(int which_slave,
+ const spi_config_t& config,
uint32_t data,
size_t num_bits,
- bool readback
- ){
- static const uhd::dict<spi_config_t::edge_t, int> spi_edge_to_otw = boost::assign::map_list_of
- (spi_config_t::EDGE_RISE, USRP2_CLK_EDGE_RISE)
- (spi_config_t::EDGE_FALL, USRP2_CLK_EDGE_FALL)
- ;
-
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO);
- out_data.data.spi_args.dev = htonl(which_slave);
+ bool readback)
+ {
+ static const uhd::dict<spi_config_t::edge_t, int> spi_edge_to_otw =
+ boost::assign::map_list_of(spi_config_t::EDGE_RISE, USRP2_CLK_EDGE_RISE)(
+ spi_config_t::EDGE_FALL, USRP2_CLK_EDGE_FALL);
+
+ // setup the out data
+ usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
+ out_data.id = htonl(USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO);
+ out_data.data.spi_args.dev = htonl(which_slave);
out_data.data.spi_args.miso_edge = spi_edge_to_otw[config.miso_edge];
out_data.data.spi_args.mosi_edge = spi_edge_to_otw[config.mosi_edge];
- out_data.data.spi_args.readback = (readback)? 1 : 0;
- out_data.data.spi_args.num_bits = num_bits;
- out_data.data.spi_args.data = htonl(data);
+ out_data.data.spi_args.readback = (readback) ? 1 : 0;
+ out_data.data.spi_args.num_bits = num_bits;
+ out_data.data.spi_args.data = htonl(data);
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_SPI);
+ // send and recv
+ usrp2_ctrl_data_t in_data =
+ this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_SPI);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE);
return ntohl(in_data.data.spi_args.data);
}
-/***********************************************************************
- * I2C
- **********************************************************************/
- void write_i2c(uint16_t addr, const byte_vector_t &buf){
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_WRITE_THESE_I2C_VALUES_BRO);
- out_data.data.i2c_args.addr = uint8_t(addr);
+ /***********************************************************************
+ * I2C
+ **********************************************************************/
+ void write_i2c(uint16_t addr, const byte_vector_t& buf)
+ {
+ // setup the out data
+ usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
+ out_data.id = htonl(USRP2_CTRL_ID_WRITE_THESE_I2C_VALUES_BRO);
+ out_data.data.i2c_args.addr = uint8_t(addr);
out_data.data.i2c_args.bytes = buf.size();
- //limitation of i2c transaction size
+ // limitation of i2c transaction size
UHD_ASSERT_THROW(buf.size() <= sizeof(out_data.data.i2c_args.data));
- //copy in the data
+ // copy in the data
std::copy(buf.begin(), buf.end(), out_data.data.i2c_args.data);
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
+ // send and recv
+ usrp2_ctrl_data_t in_data =
+ this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_COOL_IM_DONE_I2C_WRITE_DUDE);
}
- byte_vector_t read_i2c(uint16_t addr, size_t num_bytes){
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_DO_AN_I2C_READ_FOR_ME_BRO);
- out_data.data.i2c_args.addr = uint8_t(addr);
+ byte_vector_t read_i2c(uint16_t addr, size_t num_bytes)
+ {
+ // setup the out data
+ usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
+ out_data.id = htonl(USRP2_CTRL_ID_DO_AN_I2C_READ_FOR_ME_BRO);
+ out_data.data.i2c_args.addr = uint8_t(addr);
out_data.data.i2c_args.bytes = num_bytes;
- //limitation of i2c transaction size
+ // limitation of i2c transaction size
UHD_ASSERT_THROW(num_bytes <= sizeof(out_data.data.i2c_args.data));
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
+ // send and recv
+ usrp2_ctrl_data_t in_data =
+ this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_HERES_THE_I2C_DATA_DUDE);
UHD_ASSERT_THROW(in_data.data.i2c_args.bytes == num_bytes);
- //copy out the data
+ // copy out the data
byte_vector_t result(num_bytes);
- std::copy(in_data.data.i2c_args.data, in_data.data.i2c_args.data + num_bytes, result.begin());
+ std::copy(in_data.data.i2c_args.data,
+ in_data.data.i2c_args.data + num_bytes,
+ result.begin());
return result;
}
-/***********************************************************************
- * Send/Recv over control
- **********************************************************************/
- usrp2_ctrl_data_t ctrl_send_and_recv(
- const usrp2_ctrl_data_t &out_data,
+ /***********************************************************************
+ * Send/Recv over control
+ **********************************************************************/
+ usrp2_ctrl_data_t ctrl_send_and_recv(const usrp2_ctrl_data_t& out_data,
uint32_t lo = USRP2_FW_COMPAT_NUM,
- uint32_t hi = USRP2_FW_COMPAT_NUM
- ){
+ uint32_t hi = USRP2_FW_COMPAT_NUM)
+ {
boost::mutex::scoped_lock lock(_ctrl_mutex);
- for (size_t i = 0; i < CTRL_RECV_RETRIES; i++){
- try{
- return ctrl_send_and_recv_internal(out_data, lo, hi, CTRL_RECV_TIMEOUT/CTRL_RECV_RETRIES);
- }
- catch(const timeout_error &e){
+ for (size_t i = 0; i < CTRL_RECV_RETRIES; i++) {
+ try {
+ return ctrl_send_and_recv_internal(
+ out_data, lo, hi, CTRL_RECV_TIMEOUT / CTRL_RECV_RETRIES);
+ } catch (const timeout_error& e) {
UHD_LOGGER_ERROR("USRP2")
- << "Control packet attempt " << i
- << ", sequence number " << _ctrl_seq_num
- << ":\n" << e.what() ;
+ << "Control packet attempt " << i << ", sequence number "
+ << _ctrl_seq_num << ":\n"
+ << e.what();
}
}
throw uhd::runtime_error("link dead: timeout waiting for control packet ACK");
}
usrp2_ctrl_data_t ctrl_send_and_recv_internal(
- const usrp2_ctrl_data_t &out_data,
- uint32_t lo, uint32_t hi,
- const double timeout
- ){
- //fill in the seq number and send
+ const usrp2_ctrl_data_t& out_data, uint32_t lo, uint32_t hi, const double timeout)
+ {
+ // fill in the seq number and send
usrp2_ctrl_data_t out_copy = out_data;
- out_copy.proto_ver = htonl(_protocol_compat);
- out_copy.seq = htonl(++_ctrl_seq_num);
+ out_copy.proto_ver = htonl(_protocol_compat);
+ out_copy.seq = htonl(++_ctrl_seq_num);
_ctrl_transport->send(boost::asio::buffer(&out_copy, sizeof(usrp2_ctrl_data_t)));
- //loop until we get the packet or timeout
- uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; //allocate max bytes for recv
- const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
- while(true){
- size_t len = _ctrl_transport->recv(boost::asio::buffer(usrp2_ctrl_data_in_mem), timeout);
+ // loop until we get the packet or timeout
+ uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; // allocate max bytes for recv
+ const usrp2_ctrl_data_t* ctrl_data_in =
+ reinterpret_cast<const usrp2_ctrl_data_t*>(usrp2_ctrl_data_in_mem);
+ while (true) {
+ size_t len = _ctrl_transport->recv(
+ boost::asio::buffer(usrp2_ctrl_data_in_mem), timeout);
uint32_t compat = ntohl(ctrl_data_in->proto_ver);
- if(len >= sizeof(uint32_t) and (hi < compat or lo > compat)){
- throw uhd::runtime_error(str(boost::format(
- "\nPlease update the firmware and FPGA images for your device.\n"
- "See the application notes for USRP2/N-Series for instructions.\n"
- "Expected protocol compatibility number %s, but got %d:\n"
- "The firmware build is not compatible with the host code build.\n"
- "%s\n"
- ) % ((lo == hi)? (boost::format("%d") % hi) : (boost::format("[%d to %d]") % lo % hi))
- % compat % this->images_warn_help_message()));
+ if (len >= sizeof(uint32_t) and (hi < compat or lo > compat)) {
+ throw uhd::runtime_error(str(
+ boost::format(
+ "\nPlease update the firmware and FPGA images for your device.\n"
+ "See the application notes for USRP2/N-Series for instructions.\n"
+ "Expected protocol compatibility number %s, but got %d:\n"
+ "The firmware build is not compatible with the host code build.\n"
+ "%s\n")
+ % ((lo == hi) ? (boost::format("%d") % hi)
+ : (boost::format("[%d to %d]") % lo % hi))
+ % compat % this->images_warn_help_message()));
}
- if (len >= sizeof(usrp2_ctrl_data_t) and ntohl(ctrl_data_in->seq) == _ctrl_seq_num){
+ if (len >= sizeof(usrp2_ctrl_data_t)
+ and ntohl(ctrl_data_in->seq) == _ctrl_seq_num) {
return *ctrl_data_in;
}
- if (len == 0) break; //timeout
- //didnt get seq or bad packet, continue looking...
+ if (len == 0)
+ break; // timeout
+ // didnt get seq or bad packet, continue looking...
}
throw timeout_error("no control response, possible packet loss");
}
- rev_type get_rev(void){
+ rev_type get_rev(void)
+ {
std::string hw = mb_eeprom["hardware"];
- if (hw.empty()) return USRP_NXXX;
- switch (boost::lexical_cast<uint16_t>(hw)){
- case 0x0300:
- case 0x0301: return USRP2_REV3;
- case 0x0400: return USRP2_REV4;
- case 0x0A00: return USRP_N200;
- case 0x0A01: return USRP_N210;
- case 0x0A10: return USRP_N200_R4;
- case 0x0A11: return USRP_N210_R4;
+ if (hw.empty())
+ return USRP_NXXX;
+ switch (boost::lexical_cast<uint16_t>(hw)) {
+ case 0x0300:
+ case 0x0301:
+ return USRP2_REV3;
+ case 0x0400:
+ return USRP2_REV4;
+ case 0x0A00:
+ return USRP_N200;
+ case 0x0A01:
+ return USRP_N210;
+ case 0x0A10:
+ return USRP_N200_R4;
+ case 0x0A11:
+ return USRP_N210_R4;
}
- return USRP_NXXX; //unknown type
+ return USRP_NXXX; // unknown type
}
- const std::string get_cname(void){
- switch(this->get_rev()){
- case USRP2_REV3: return "USRP2 r3";
- case USRP2_REV4: return "USRP2 r4";
- case USRP_N200: return "N200";
- case USRP_N210: return "N210";
- case USRP_N200_R4: return "N200r4";
- case USRP_N210_R4: return "N210r4";
- case USRP_NXXX: return "N???";
+ const std::string get_cname(void)
+ {
+ switch (this->get_rev()) {
+ case USRP2_REV3:
+ return "USRP2 r3";
+ case USRP2_REV4:
+ return "USRP2 r4";
+ case USRP_N200:
+ return "N200";
+ case USRP_N210:
+ return "N210";
+ case USRP_N200_R4:
+ return "N200r4";
+ case USRP_N210_R4:
+ return "N210r4";
+ case USRP_NXXX:
+ return "N???";
}
UHD_THROW_INVALID_CODE_PATH();
}
- const std::string get_fw_version_string(void){
- uint32_t minor = this->get_reg<uint32_t, USRP2_REG_ACTION_FW_PEEK32>(U2_FW_REG_VER_MINOR);
+ const std::string get_fw_version_string(void)
+ {
+ uint32_t minor =
+ this->get_reg<uint32_t, USRP2_REG_ACTION_FW_PEEK32>(U2_FW_REG_VER_MINOR);
return str(boost::format("%u.%u") % _protocol_compat % minor);
}
- std::string images_warn_help_message(void){
- //determine the images names
+ std::string images_warn_help_message(void)
+ {
+ // determine the images names
std::string fw_image, fpga_image;
- switch(this->get_rev()){
- case USRP2_REV3: fpga_image = "usrp2_fpga.bin"; fw_image = "usrp2_fw.bin"; break;
- case USRP2_REV4: fpga_image = "usrp2_fpga.bin"; fw_image = "usrp2_fw.bin"; break;
- case USRP_N200: fpga_image = "usrp_n200_r2_fpga.bin"; fw_image = "usrp_n200_fw.bin"; break;
- case USRP_N210: fpga_image = "usrp_n210_r2_fpga.bin"; fw_image = "usrp_n210_fw.bin"; break;
- case USRP_N200_R4: fpga_image = "usrp_n200_r4_fpga.bin"; fw_image = "usrp_n200_fw.bin"; break;
- case USRP_N210_R4: fpga_image = "usrp_n210_r4_fpga.bin"; fw_image = "usrp_n210_fw.bin"; break;
- default: break;
+ switch (this->get_rev()) {
+ case USRP2_REV3:
+ fpga_image = "usrp2_fpga.bin";
+ fw_image = "usrp2_fw.bin";
+ break;
+ case USRP2_REV4:
+ fpga_image = "usrp2_fpga.bin";
+ fw_image = "usrp2_fw.bin";
+ break;
+ case USRP_N200:
+ fpga_image = "usrp_n200_r2_fpga.bin";
+ fw_image = "usrp_n200_fw.bin";
+ break;
+ case USRP_N210:
+ fpga_image = "usrp_n210_r2_fpga.bin";
+ fw_image = "usrp_n210_fw.bin";
+ break;
+ case USRP_N200_R4:
+ fpga_image = "usrp_n200_r4_fpga.bin";
+ fw_image = "usrp_n200_fw.bin";
+ break;
+ case USRP_N210_R4:
+ fpga_image = "usrp_n210_r4_fpga.bin";
+ fw_image = "usrp_n210_fw.bin";
+ break;
+ default:
+ break;
}
- if (fw_image.empty() or fpga_image.empty()) return "";
+ if (fw_image.empty() or fpga_image.empty())
+ return "";
- //does your platform use sudo?
+ // does your platform use sudo?
std::string sudo;
- #if defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_MACOS)
- sudo = "sudo ";
- #endif
+#if defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_MACOS)
+ sudo = "sudo ";
+#endif
- //look up the real FS path to the images
+ // look up the real FS path to the images
std::string fw_image_path, fpga_image_path;
- try{
- fw_image_path = uhd::find_image_path(fw_image);
+ try {
+ fw_image_path = uhd::find_image_path(fw_image);
fpga_image_path = uhd::find_image_path(fpga_image);
- }
- catch(const std::exception &){
- return str(boost::format("Could not find %s and %s in your images path!\n%s") % fw_image % fpga_image % print_utility_error("uhd_images_downloader.py"));
+ } catch (const std::exception&) {
+ return str(boost::format("Could not find %s and %s in your images path!\n%s")
+ % fw_image % fpga_image
+ % print_utility_error("uhd_images_downloader.py"));
}
- //escape char for multi-line cmd + newline + indent?
- #ifdef UHD_PLATFORM_WIN32
- const std::string ml = "^\n ";
- #else
- const std::string ml = "\\\n ";
- #endif
+// escape char for multi-line cmd + newline + indent?
+#ifdef UHD_PLATFORM_WIN32
+ const std::string ml = "^\n ";
+#else
+ const std::string ml = "\\\n ";
+#endif
- //create the burner commands
- if (this->get_rev() == USRP2_REV3 or this->get_rev() == USRP2_REV4){
+ // create the burner commands
+ if (this->get_rev() == USRP2_REV3 or this->get_rev() == USRP2_REV4) {
const std::string card_burner = uhd::find_utility("usrp2_card_burner_gui.py");
- const std::string card_burner_cmd = str(boost::format(" %s\"%s\" %s--fpga=\"%s\" %s--fw=\"%s\"") % sudo % card_burner % ml % fpga_image_path % ml % fw_image_path);
- return str(boost::format("%s\n%s") % print_utility_error("uhd_images_downloader.py") % card_burner_cmd);
- }
- else{
+ const std::string card_burner_cmd =
+ str(boost::format(" %s\"%s\" %s--fpga=\"%s\" %s--fw=\"%s\"") % sudo
+ % card_burner % ml % fpga_image_path % ml % fw_image_path);
+ return str(boost::format("%s\n%s")
+ % print_utility_error("uhd_images_downloader.py")
+ % card_burner_cmd);
+ } else {
const std::string addr = _ctrl_transport->get_recv_addr();
- const std::string image_loader_path = (fs::path(uhd::get_pkg_path()) / "bin" / "uhd_image_loader").string();
- const std::string image_loader_cmd = str(boost::format(" \"%s\" %s--args=\"type=usrp2,addr=%s\"") % image_loader_path % ml % addr);
- return str(boost::format("%s\n%s") % print_utility_error("uhd_images_downloader.py") % image_loader_cmd);
+ const std::string image_loader_path =
+ (fs::path(uhd::get_pkg_path()) / "bin" / "uhd_image_loader").string();
+ const std::string image_loader_cmd =
+ str(boost::format(" \"%s\" %s--args=\"type=usrp2,addr=%s\"")
+ % image_loader_path % ml % addr);
+ return str(boost::format("%s\n%s")
+ % print_utility_error("uhd_images_downloader.py")
+ % image_loader_cmd);
}
}
@@ -399,22 +468,22 @@ public:
}
private:
- //this lovely lady makes it all possible
+ // this lovely lady makes it all possible
udp_simple::sptr _ctrl_transport;
- //used in send/recv
+ // used in send/recv
boost::mutex _ctrl_mutex;
uint32_t _ctrl_seq_num;
uint32_t _protocol_compat;
- //lock thread stuff
+ // lock thread stuff
task::sptr _lock_task;
};
/***********************************************************************
* Public make function for usrp2 interface
**********************************************************************/
-usrp2_iface::sptr usrp2_iface::make(udp_simple::sptr ctrl_transport){
+usrp2_iface::sptr usrp2_iface::make(udp_simple::sptr ctrl_transport)
+{
return usrp2_iface::sptr(new usrp2_iface_impl(ctrl_transport));
}
-
diff --git a/host/lib/usrp/usrp2/usrp2_iface.hpp b/host/lib/usrp/usrp2/usrp2_iface.hpp
index b602dab53..8d1700974 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.hpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.hpp
@@ -8,14 +8,14 @@
#ifndef INCLUDED_USRP2_IFACE_HPP
#define INCLUDED_USRP2_IFACE_HPP
+#include "usrp2_regs.hpp"
#include <uhd/transport/udp_simple.hpp>
#include <uhd/types/serial.hpp>
+#include <uhd/types/wb_iface.hpp>
#include <uhd/usrp/mboard_eeprom.hpp>
-#include <memory>
#include <boost/utility.hpp>
#include <functional>
-#include "usrp2_regs.hpp"
-#include <uhd/types/wb_iface.hpp>
+#include <memory>
#include <string>
/*!
@@ -23,7 +23,9 @@
* Provides a set of functions to implementation layer.
* Including spi, peek, poke, control...
*/
-class usrp2_iface : public uhd::timed_wb_iface, public uhd::spi_iface, public uhd::i2c_iface
+class usrp2_iface : public uhd::timed_wb_iface,
+ public uhd::spi_iface,
+ public uhd::i2c_iface
{
public:
typedef std::shared_ptr<usrp2_iface> sptr;
@@ -42,13 +44,13 @@ public:
//! The list of possible revision types
enum rev_type {
- USRP2_REV3 = 3,
- USRP2_REV4 = 4,
- USRP_N200 = 200,
+ USRP2_REV3 = 3,
+ USRP2_REV4 = 4,
+ USRP_N200 = 200,
USRP_N200_R4 = 201,
- USRP_N210 = 210,
+ USRP_N210 = 210,
USRP_N210_R4 = 211,
- USRP_NXXX = 0
+ USRP_NXXX = 0
};
//! Get the revision type for this device
@@ -69,7 +71,7 @@ public:
//! Construct a helpful warning message for images
virtual std::string images_warn_help_message(void) = 0;
- //motherboard eeprom map structure
+ // motherboard eeprom map structure
uhd::usrp::mboard_eeprom_t mb_eeprom;
};
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index fd35f3a1d..6fed1521a 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -26,151 +26,155 @@ using namespace uhd::usrp;
using namespace uhd::transport;
namespace asio = boost::asio;
-//A reasonable number of frames for send/recv and async/sync
+// A reasonable number of frames for send/recv and async/sync
static const size_t DEFAULT_NUM_FRAMES = 32;
/***********************************************************************
* Discovery over the udp transport
**********************************************************************/
-device_addrs_t usrp2_find(const device_addr_t &hint_){
- //handle the multi-device discovery
+device_addrs_t usrp2_find(const device_addr_t& hint_)
+{
+ // handle the multi-device discovery
device_addrs_t hints = separate_device_addr(hint_);
- if (hints.size() > 1){
+ if (hints.size() > 1) {
device_addrs_t found_devices;
std::string error_msg;
- for(const device_addr_t &hint_i: hints){
+ for (const device_addr_t& hint_i : hints) {
device_addrs_t found_devices_i = usrp2_find(hint_i);
- if (found_devices_i.size() != 1) error_msg += str(boost::format(
- "Could not resolve device hint \"%s\" to a single device."
- ) % hint_i.to_string());
- else found_devices.push_back(found_devices_i[0]);
+ if (found_devices_i.size() != 1)
+ error_msg +=
+ str(boost::format(
+ "Could not resolve device hint \"%s\" to a single device.")
+ % hint_i.to_string());
+ else
+ found_devices.push_back(found_devices_i[0]);
}
- if (found_devices.empty()) return device_addrs_t();
- if (not error_msg.empty()) throw uhd::value_error(error_msg);
+ if (found_devices.empty())
+ return device_addrs_t();
+ if (not error_msg.empty())
+ throw uhd::value_error(error_msg);
return device_addrs_t(1, combine_device_addrs(found_devices));
}
- //initialize the hint for a single device case
+ // initialize the hint for a single device case
UHD_ASSERT_THROW(hints.size() <= 1);
- hints.resize(1); //in case it was empty
+ hints.resize(1); // in case it was empty
device_addr_t hint = hints[0];
device_addrs_t usrp2_addrs;
- //return an empty list of addresses when type is set to non-usrp2
- if (hint.has_key("type") and hint["type"] != "usrp2") return usrp2_addrs;
+ // return an empty list of addresses when type is set to non-usrp2
+ if (hint.has_key("type") and hint["type"] != "usrp2")
+ return usrp2_addrs;
- //Return an empty list of addresses when a resource is specified,
- //since a resource is intended for a different, non-USB, device.
- if (hint.has_key("resource")) return usrp2_addrs;
+ // Return an empty list of addresses when a resource is specified,
+ // since a resource is intended for a different, non-USB, device.
+ if (hint.has_key("resource"))
+ return usrp2_addrs;
- //if no address was specified, send a broadcast on each interface
- if (not hint.has_key("addr")){
- for(const if_addrs_t &if_addrs: get_if_addrs()){
- //avoid the loopback device
- if (if_addrs.inet == asio::ip::address_v4::loopback().to_string()) continue;
+ // if no address was specified, send a broadcast on each interface
+ if (not hint.has_key("addr")) {
+ for (const if_addrs_t& if_addrs : get_if_addrs()) {
+ // avoid the loopback device
+ if (if_addrs.inet == asio::ip::address_v4::loopback().to_string())
+ continue;
- //create a new hint with this broadcast address
+ // create a new hint with this broadcast address
device_addr_t new_hint = hint;
- new_hint["addr"] = if_addrs.bcast;
+ new_hint["addr"] = if_addrs.bcast;
- //call discover with the new hint and append results
+ // call discover with the new hint and append results
device_addrs_t new_usrp2_addrs = usrp2_find(new_hint);
- usrp2_addrs.insert(usrp2_addrs.begin(),
- new_usrp2_addrs.begin(), new_usrp2_addrs.end()
- );
+ usrp2_addrs.insert(
+ usrp2_addrs.begin(), new_usrp2_addrs.begin(), new_usrp2_addrs.end());
}
return usrp2_addrs;
}
- //Create a UDP transport to communicate:
- //Some devices will cause a throw when opened for a broadcast address.
- //We print and recover so the caller can loop through all bcast addrs.
+ // Create a UDP transport to communicate:
+ // Some devices will cause a throw when opened for a broadcast address.
+ // We print and recover so the caller can loop through all bcast addrs.
udp_simple::sptr udp_transport;
- try{
- udp_transport = udp_simple::make_broadcast(hint["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT));
- }
- catch(const std::exception &e){
- UHD_LOGGER_ERROR("USRP2") << boost::format("Cannot open UDP transport on %s\n%s") % hint["addr"] % e.what() ;
- return usrp2_addrs; //dont throw, but return empty address so caller can insert
+ try {
+ udp_transport = udp_simple::make_broadcast(
+ hint["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT));
+ } catch (const std::exception& e) {
+ UHD_LOGGER_ERROR("USRP2") << boost::format("Cannot open UDP transport on %s\n%s")
+ % hint["addr"] % e.what();
+ return usrp2_addrs; // dont throw, but return empty address so caller can insert
}
- //send a hello control packet
+ // send a hello control packet
usrp2_ctrl_data_t ctrl_data_out = usrp2_ctrl_data_t();
- ctrl_data_out.proto_ver = uhd::htonx<uint32_t>(USRP2_FW_COMPAT_NUM);
- ctrl_data_out.id = uhd::htonx<uint32_t>(USRP2_CTRL_ID_WAZZUP_BRO);
- try
- {
+ ctrl_data_out.proto_ver = uhd::htonx<uint32_t>(USRP2_FW_COMPAT_NUM);
+ ctrl_data_out.id = uhd::htonx<uint32_t>(USRP2_CTRL_ID_WAZZUP_BRO);
+ try {
udp_transport->send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out)));
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("USRP2") << "USRP2 Network discovery error " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("USRP2") << "USRP2 Network discovery unknown error " ;
+ } catch (const std::exception& ex) {
+ UHD_LOGGER_ERROR("USRP2") << "USRP2 Network discovery error " << ex.what();
+ } catch (...) {
+ UHD_LOGGER_ERROR("USRP2") << "USRP2 Network discovery unknown error ";
}
- //loop and recieve until the timeout
- uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; //allocate max bytes for recv
- const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
- while(true){
+ // loop and recieve until the timeout
+ uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; // allocate max bytes for recv
+ const usrp2_ctrl_data_t* ctrl_data_in =
+ reinterpret_cast<const usrp2_ctrl_data_t*>(usrp2_ctrl_data_in_mem);
+ while (true) {
size_t len = udp_transport->recv(asio::buffer(usrp2_ctrl_data_in_mem));
- if (len > offsetof(usrp2_ctrl_data_t, data) and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE){
-
- //make a boost asio ipv4 with the raw addr in host byte order
+ if (len > offsetof(usrp2_ctrl_data_t, data)
+ and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE) {
+ // make a boost asio ipv4 with the raw addr in host byte order
device_addr_t new_addr;
new_addr["type"] = "usrp2";
- //We used to get the address from the control packet.
- //Now now uses the socket itself to yield the address.
- //boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr));
- //new_addr["addr"] = ip_addr.to_string();
+ // We used to get the address from the control packet.
+ // Now now uses the socket itself to yield the address.
+ // boost::asio::ip::address_v4 ip_addr(ntohl(ctrl_data_in->data.ip_addr));
+ // new_addr["addr"] = ip_addr.to_string();
new_addr["addr"] = udp_transport->get_recv_addr();
- //Attempt a simple 2-way communication with a connected socket.
- //Reason: Although the USRP will respond the broadcast above,
- //we may not be able to communicate directly (non-broadcast).
+ // Attempt a simple 2-way communication with a connected socket.
+ // Reason: Although the USRP will respond the broadcast above,
+ // we may not be able to communicate directly (non-broadcast).
udp_simple::sptr ctrl_xport = udp_simple::make_connected(
- new_addr["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT)
- );
+ new_addr["addr"], BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT));
ctrl_xport->send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out)));
size_t len = ctrl_xport->recv(asio::buffer(usrp2_ctrl_data_in_mem));
- if (len > offsetof(usrp2_ctrl_data_t, data) and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE){
- //found the device, open up for communication!
- }
- else{
- //otherwise we don't find it...
+ if (len > offsetof(usrp2_ctrl_data_t, data)
+ and ntohl(ctrl_data_in->id) == USRP2_CTRL_ID_WAZZUP_DUDE) {
+ // found the device, open up for communication!
+ } else {
+ // otherwise we don't find it...
continue;
}
- //Attempt to read the name from the EEPROM and perform filtering.
- //This operation can throw due to compatibility mismatch.
- try{
+ // Attempt to read the name from the EEPROM and perform filtering.
+ // This operation can throw due to compatibility mismatch.
+ try {
usrp2_iface::sptr iface = usrp2_iface::make(ctrl_xport);
- if (iface->is_device_locked()) continue; //ignore locked devices
+ if (iface->is_device_locked())
+ continue; // ignore locked devices
mboard_eeprom_t mb_eeprom = iface->mb_eeprom;
- new_addr["name"] = mb_eeprom["name"];
- new_addr["serial"] = mb_eeprom["serial"];
- }
- catch(const std::exception &){
- //set these values as empty string so the device may still be found
- //and the filter's below can still operate on the discovered device
- new_addr["name"] = "";
+ new_addr["name"] = mb_eeprom["name"];
+ new_addr["serial"] = mb_eeprom["serial"];
+ } catch (const std::exception&) {
+ // set these values as empty string so the device may still be found
+ // and the filter's below can still operate on the discovered device
+ new_addr["name"] = "";
new_addr["serial"] = "";
}
- //filter the discovered device below by matching optional keys
- if (
- (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
- (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
- ){
+ // filter the discovered device below by matching optional keys
+ if ((not hint.has_key("name") or hint["name"] == new_addr["name"])
+ and (not hint.has_key("serial")
+ or hint["serial"] == new_addr["serial"])) {
usrp2_addrs.push_back(new_addr);
}
- //dont break here, it will exit the while loop
- //just continue on to the next loop iteration
+ // dont break here, it will exit the while loop
+ // just continue on to the next loop iteration
}
- if (len == 0) break; //timeout
+ if (len == 0)
+ break; // timeout
}
return usrp2_addrs;
@@ -179,36 +183,39 @@ device_addrs_t usrp2_find(const device_addr_t &hint_){
/***********************************************************************
* Make
**********************************************************************/
-static device::sptr usrp2_make(const device_addr_t &device_addr){
+static device::sptr usrp2_make(const device_addr_t& device_addr)
+{
return device::sptr(new usrp2_impl(device_addr));
}
-UHD_STATIC_BLOCK(register_usrp2_device){
+UHD_STATIC_BLOCK(register_usrp2_device)
+{
device::register_device(&usrp2_find, &usrp2_make, device::USRP);
}
/***********************************************************************
* MTU Discovery
**********************************************************************/
-struct mtu_result_t{
+struct mtu_result_t
+{
size_t recv_mtu, send_mtu;
};
-static mtu_result_t determine_mtu(const std::string &addr, const mtu_result_t &user_mtu){
- udp_simple::sptr udp_sock = udp_simple::make_connected(
- addr, BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT)
- );
+static mtu_result_t determine_mtu(const std::string& addr, const mtu_result_t& user_mtu)
+{
+ udp_simple::sptr udp_sock =
+ udp_simple::make_connected(addr, BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT));
- //The FPGA offers 4K buffers, and the user may manually request this.
- //However, multiple simultaneous receives (2DSP slave + 2DSP master),
- //require that buffering to be used internally, and this is a safe setting.
+ // The FPGA offers 4K buffers, and the user may manually request this.
+ // However, multiple simultaneous receives (2DSP slave + 2DSP master),
+ // require that buffering to be used internally, and this is a safe setting.
std::vector<uint8_t> buffer(std::max(user_mtu.recv_mtu, user_mtu.send_mtu));
- usrp2_ctrl_data_t *ctrl_data = reinterpret_cast<usrp2_ctrl_data_t *>(&buffer.front());
- static const double echo_timeout = 0.020; //20 ms
+ usrp2_ctrl_data_t* ctrl_data = reinterpret_cast<usrp2_ctrl_data_t*>(&buffer.front());
+ static const double echo_timeout = 0.020; // 20 ms
- //test holler - check if its supported in this fw version
- ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
- ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
+ // test holler - check if its supported in this fw version
+ ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
+ ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
ctrl_data->data.echo_args.len = htonl(sizeof(usrp2_ctrl_data_t));
udp_sock->send(boost::asio::buffer(buffer, sizeof(usrp2_ctrl_data_t)));
udp_sock->recv(boost::asio::buffer(buffer), echo_timeout);
@@ -218,36 +225,38 @@ static mtu_result_t determine_mtu(const std::string &addr, const mtu_result_t &u
size_t min_recv_mtu = sizeof(usrp2_ctrl_data_t), max_recv_mtu = user_mtu.recv_mtu;
size_t min_send_mtu = sizeof(usrp2_ctrl_data_t), max_send_mtu = user_mtu.send_mtu;
- while (min_recv_mtu < max_recv_mtu){
+ while (min_recv_mtu < max_recv_mtu) {
+ size_t test_mtu = (max_recv_mtu / 2 + min_recv_mtu / 2 + 3) & ~3;
- size_t test_mtu = (max_recv_mtu/2 + min_recv_mtu/2 + 3) & ~3;
-
- ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
- ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
+ ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
+ ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
ctrl_data->data.echo_args.len = htonl(test_mtu);
udp_sock->send(boost::asio::buffer(buffer, sizeof(usrp2_ctrl_data_t)));
size_t len = udp_sock->recv(boost::asio::buffer(buffer), echo_timeout);
- if (len >= test_mtu) min_recv_mtu = test_mtu;
- else max_recv_mtu = test_mtu - 4;
-
+ if (len >= test_mtu)
+ min_recv_mtu = test_mtu;
+ else
+ max_recv_mtu = test_mtu - 4;
}
- while (min_send_mtu < max_send_mtu){
-
- size_t test_mtu = (max_send_mtu/2 + min_send_mtu/2 + 3) & ~3;
+ while (min_send_mtu < max_send_mtu) {
+ size_t test_mtu = (max_send_mtu / 2 + min_send_mtu / 2 + 3) & ~3;
- ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
- ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
+ ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
+ ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
ctrl_data->data.echo_args.len = htonl(sizeof(usrp2_ctrl_data_t));
udp_sock->send(boost::asio::buffer(buffer, test_mtu));
size_t len = udp_sock->recv(boost::asio::buffer(buffer), echo_timeout);
- if (len >= sizeof(usrp2_ctrl_data_t)) len = ntohl(ctrl_data->data.echo_args.len);
+ if (len >= sizeof(usrp2_ctrl_data_t))
+ len = ntohl(ctrl_data->data.echo_args.len);
- if (len >= test_mtu) min_send_mtu = test_mtu;
- else max_send_mtu = test_mtu - 4;
+ if (len >= test_mtu)
+ min_send_mtu = test_mtu;
+ else
+ max_send_mtu = test_mtu - 4;
}
mtu_result_t mtu;
@@ -259,17 +268,16 @@ static mtu_result_t determine_mtu(const std::string &addr, const mtu_result_t &u
/***********************************************************************
* Helpers
**********************************************************************/
-static zero_copy_if::sptr make_xport(
- const std::string &addr,
- const std::string &port,
- const device_addr_t &hints,
- const std::string &filter
-){
-
- //only copy hints that contain the filter word
+static zero_copy_if::sptr make_xport(const std::string& addr,
+ const std::string& port,
+ const device_addr_t& hints,
+ const std::string& filter)
+{
+ // only copy hints that contain the filter word
device_addr_t filtered_hints;
- for(const std::string &key: hints.keys()){
- if (key.find(filter) == std::string::npos) continue;
+ for (const std::string& key : hints.keys()) {
+ if (key.find(filter) == std::string::npos)
+ continue;
filtered_hints[key] = hints[key];
}
@@ -279,17 +287,16 @@ static zero_copy_if::sptr make_xport(
default_buff_args.num_send_frames = DEFAULT_NUM_FRAMES;
default_buff_args.num_recv_frames = DEFAULT_NUM_FRAMES;
- //make the transport object with the filtered hints
+ // make the transport object with the filtered hints
udp_zero_copy::buff_params ignored_params;
- zero_copy_if::sptr xport = udp_zero_copy::make(addr, port, default_buff_args, ignored_params, filtered_hints);
-
- //Send a small data packet so the usrp2 knows the udp source port.
- //This setup must happen before further initialization occurs
- //or the async update packets will cause ICMP destination unreachable.
- static const uint32_t data[2] = {
- uhd::htonx(uint32_t(0 /* don't care seq num */)),
- uhd::htonx(uint32_t(USRP2_INVALID_VRT_HEADER))
- };
+ zero_copy_if::sptr xport = udp_zero_copy::make(
+ addr, port, default_buff_args, ignored_params, filtered_hints);
+
+ // Send a small data packet so the usrp2 knows the udp source port.
+ // This setup must happen before further initialization occurs
+ // or the async update packets will cause ICMP destination unreachable.
+ static const uint32_t data[2] = {uhd::htonx(uint32_t(0 /* don't care seq num */)),
+ uhd::htonx(uint32_t(USRP2_INVALID_VRT_HEADER))};
transport::managed_send_buffer::sptr send_buff = xport->get_send_buff();
std::memcpy(send_buff->cast<void*>(), &data, sizeof(data));
send_buff->commit(sizeof(data));
@@ -300,157 +307,161 @@ static zero_copy_if::sptr make_xport(
/***********************************************************************
* Structors
**********************************************************************/
-usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
- device_addr(_device_addr),
- _pirate_task_exit(false)
+usrp2_impl::usrp2_impl(const device_addr_t& _device_addr)
+ : device_addr(_device_addr), _pirate_task_exit(false)
{
UHD_LOGGER_INFO("USRP2") << "Opening a USRP2/N-Series device...";
- //setup the dsp transport hints (default to a large recv buff)
- if (not device_addr.has_key("recv_buff_size")){
- #if defined(UHD_PLATFORM_MACOS) || defined(UHD_PLATFORM_BSD)
- //limit buffer resize on macos or it will error
- device_addr["recv_buff_size"] = "1e6";
- #elif defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)
- //set to half-a-second of buffering at max rate
- device_addr["recv_buff_size"] = "50e6";
- #endif
+ // setup the dsp transport hints (default to a large recv buff)
+ if (not device_addr.has_key("recv_buff_size")) {
+#if defined(UHD_PLATFORM_MACOS) || defined(UHD_PLATFORM_BSD)
+ // limit buffer resize on macos or it will error
+ device_addr["recv_buff_size"] = "1e6";
+#elif defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)
+ // set to half-a-second of buffering at max rate
+ device_addr["recv_buff_size"] = "50e6";
+#endif
}
- if (not device_addr.has_key("send_buff_size")){
- //The buffer should be the size of the SRAM on the device,
- //because we will never commit more than the SRAM can hold.
+ if (not device_addr.has_key("send_buff_size")) {
+ // The buffer should be the size of the SRAM on the device,
+ // because we will never commit more than the SRAM can hold.
device_addr["send_buff_size"] = std::to_string(USRP2_SRAM_BYTES);
}
device_addrs_t device_args = separate_device_addr(device_addr);
- //extract the user's requested MTU size or default
+ // extract the user's requested MTU size or default
mtu_result_t user_mtu;
- user_mtu.recv_mtu = size_t(device_addr.cast<double>("recv_frame_size", udp_simple::mtu));
- user_mtu.send_mtu = size_t(device_addr.cast<double>("send_frame_size", udp_simple::mtu));
+ user_mtu.recv_mtu =
+ size_t(device_addr.cast<double>("recv_frame_size", udp_simple::mtu));
+ user_mtu.send_mtu =
+ size_t(device_addr.cast<double>("send_frame_size", udp_simple::mtu));
- try{
- //calculate the minimum send and recv mtu of all devices
+ try {
+ // calculate the minimum send and recv mtu of all devices
mtu_result_t mtu = determine_mtu(device_args[0]["addr"], user_mtu);
- for (size_t i = 1; i < device_args.size(); i++){
+ for (size_t i = 1; i < device_args.size(); i++) {
mtu_result_t mtu_i = determine_mtu(device_args[i]["addr"], user_mtu);
- mtu.recv_mtu = std::min(mtu.recv_mtu, mtu_i.recv_mtu);
- mtu.send_mtu = std::min(mtu.send_mtu, mtu_i.send_mtu);
+ mtu.recv_mtu = std::min(mtu.recv_mtu, mtu_i.recv_mtu);
+ mtu.send_mtu = std::min(mtu.send_mtu, mtu_i.send_mtu);
}
device_addr["recv_frame_size"] = std::to_string(mtu.recv_mtu);
device_addr["send_frame_size"] = std::to_string(mtu.send_mtu);
- UHD_LOGGER_INFO("USRP2") << boost::format("Current recv frame size: %d bytes") % mtu.recv_mtu;
- UHD_LOGGER_INFO("USRP2") << boost::format("Current send frame size: %d bytes") % mtu.send_mtu;
- }
- catch(const uhd::not_implemented_error &){
- //just ignore this error, makes older fw work...
+ UHD_LOGGER_INFO("USRP2")
+ << boost::format("Current recv frame size: %d bytes") % mtu.recv_mtu;
+ UHD_LOGGER_INFO("USRP2")
+ << boost::format("Current send frame size: %d bytes") % mtu.send_mtu;
+ } catch (const uhd::not_implemented_error&) {
+ // just ignore this error, makes older fw work...
}
- device_args = separate_device_addr(device_addr); //update args for new frame sizes
+ device_args = separate_device_addr(device_addr); // update args for new frame sizes
////////////////////////////////////////////////////////////////////
// create controller objects and initialize the properties tree
////////////////////////////////////////////////////////////////////
- _tree = property_tree::make();
- _type = device::USRP;
+ _tree = property_tree::make();
+ _type = device::USRP;
_ignore_cal_file = device_addr.has_key("ignore-cal-file");
_tree->create<std::string>("/name").set("USRP2 / N-Series Device");
- for (size_t mbi = 0; mbi < device_args.size(); mbi++){
+ for (size_t mbi = 0; mbi < device_args.size(); mbi++) {
const device_addr_t device_args_i = device_args[mbi];
- const std::string mb = std::to_string(mbi);
- const std::string addr = device_args_i["addr"];
- const fs_path mb_path = "/mboards/" + mb;
+ const std::string mb = std::to_string(mbi);
+ const std::string addr = device_args_i["addr"];
+ const fs_path mb_path = "/mboards/" + mb;
////////////////////////////////////////////////////////////////
// create the iface that controls i2c, spi, uart, and wb
////////////////////////////////////////////////////////////////
- _mbc[mb].iface = usrp2_iface::make(udp_simple::make_connected(
- addr, BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT)
- ));
+ _mbc[mb].iface = usrp2_iface::make(
+ udp_simple::make_connected(addr, BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT)));
_tree->create<std::string>(mb_path / "name").set(_mbc[mb].iface->get_cname());
- _tree->create<std::string>(mb_path / "fw_version").set(_mbc[mb].iface->get_fw_version_string());
+ _tree->create<std::string>(mb_path / "fw_version")
+ .set(_mbc[mb].iface->get_fw_version_string());
- //check the fpga compatibility number
+ // check the fpga compatibility number
const uint32_t fpga_compat_num = _mbc[mb].iface->peek32(U2_REG_COMPAT_NUM_RB);
- uint16_t fpga_major = fpga_compat_num >> 16, fpga_minor = fpga_compat_num & 0xffff;
- if (fpga_major == 0){ //old version scheme
+ uint16_t fpga_major = fpga_compat_num >> 16,
+ fpga_minor = fpga_compat_num & 0xffff;
+ if (fpga_major == 0) { // old version scheme
fpga_major = fpga_minor;
fpga_minor = 0;
}
- int expected_fpga_compat_num = std::min(USRP2_FPGA_COMPAT_NUM, N200_FPGA_COMPAT_NUM);
- switch (_mbc[mb].iface->get_rev())
- {
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- expected_fpga_compat_num = USRP2_FPGA_COMPAT_NUM;
- break;
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N210_R4:
- expected_fpga_compat_num = N200_FPGA_COMPAT_NUM;
- break;
- default:
- // handle case where the MB EEPROM is not programmed
- if (fpga_major == USRP2_FPGA_COMPAT_NUM or fpga_major == N200_FPGA_COMPAT_NUM)
- {
- UHD_LOGGER_WARNING("USRP2") << "Unable to identify device - assuming USRP2/N-Series device" ;
- expected_fpga_compat_num = fpga_major;
- }
+ int expected_fpga_compat_num =
+ std::min(USRP2_FPGA_COMPAT_NUM, N200_FPGA_COMPAT_NUM);
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP2_REV3:
+ case usrp2_iface::USRP2_REV4:
+ expected_fpga_compat_num = USRP2_FPGA_COMPAT_NUM;
+ break;
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N210_R4:
+ expected_fpga_compat_num = N200_FPGA_COMPAT_NUM;
+ break;
+ default:
+ // handle case where the MB EEPROM is not programmed
+ if (fpga_major == USRP2_FPGA_COMPAT_NUM
+ or fpga_major == N200_FPGA_COMPAT_NUM) {
+ UHD_LOGGER_WARNING("USRP2")
+ << "Unable to identify device - assuming USRP2/N-Series device";
+ expected_fpga_compat_num = fpga_major;
+ }
}
- if (fpga_major != expected_fpga_compat_num){
- throw uhd::runtime_error(str(boost::format(
- "\nPlease update the firmware and FPGA images for your device.\n"
- "See the application notes for USRP2/N-Series for instructions.\n"
- "Expected FPGA compatibility number %d, but got %d:\n"
- "The FPGA build is not compatible with the host code build.\n"
- "%s\n"
- ) % expected_fpga_compat_num % fpga_major % _mbc[mb].iface->images_warn_help_message()));
+ if (fpga_major != expected_fpga_compat_num) {
+ throw uhd::runtime_error(
+ str(boost::format(
+ "\nPlease update the firmware and FPGA images for your device.\n"
+ "See the application notes for USRP2/N-Series for instructions.\n"
+ "Expected FPGA compatibility number %d, but got %d:\n"
+ "The FPGA build is not compatible with the host code build.\n"
+ "%s\n")
+ % expected_fpga_compat_num % fpga_major
+ % _mbc[mb].iface->images_warn_help_message()));
}
- _tree->create<std::string>(mb_path / "fpga_version").set(str(boost::format("%u.%u") % fpga_major % fpga_minor));
+ _tree->create<std::string>(mb_path / "fpga_version")
+ .set(str(boost::format("%u.%u") % fpga_major % fpga_minor));
- //lock the device/motherboard to this process
+ // lock the device/motherboard to this process
_mbc[mb].iface->lock_device(true);
////////////////////////////////////////////////////////////////
// construct transports for RX and TX DSPs
////////////////////////////////////////////////////////////////
- UHD_LOGGER_TRACE("USRP2") << "Making transport for RX DSP0..." ;
+ UHD_LOGGER_TRACE("USRP2") << "Making transport for RX DSP0...";
_mbc[mb].rx_dsp_xports.push_back(make_xport(
- addr, BOOST_STRINGIZE(USRP2_UDP_RX_DSP0_PORT), device_args_i, "recv"
- ));
- UHD_LOGGER_TRACE("USRP2") << "Making transport for RX DSP1..." ;
+ addr, BOOST_STRINGIZE(USRP2_UDP_RX_DSP0_PORT), device_args_i, "recv"));
+ UHD_LOGGER_TRACE("USRP2") << "Making transport for RX DSP1...";
_mbc[mb].rx_dsp_xports.push_back(make_xport(
- addr, BOOST_STRINGIZE(USRP2_UDP_RX_DSP1_PORT), device_args_i, "recv"
- ));
- UHD_LOGGER_TRACE("USRP2") << "Making transport for TX DSP0..." ;
+ addr, BOOST_STRINGIZE(USRP2_UDP_RX_DSP1_PORT), device_args_i, "recv"));
+ UHD_LOGGER_TRACE("USRP2") << "Making transport for TX DSP0...";
_mbc[mb].tx_dsp_xport = make_xport(
- addr, BOOST_STRINGIZE(USRP2_UDP_TX_DSP0_PORT), device_args_i, "send"
- );
- UHD_LOGGER_TRACE("USRP2") << "Making transport for Control..." ;
+ addr, BOOST_STRINGIZE(USRP2_UDP_TX_DSP0_PORT), device_args_i, "send");
+ UHD_LOGGER_TRACE("USRP2") << "Making transport for Control...";
_mbc[mb].fifo_ctrl_xport = make_xport(
- addr, BOOST_STRINGIZE(USRP2_UDP_FIFO_CRTL_PORT), device_addr_t(), ""
- );
- //set the filter on the router to take dsp data from this port
- _mbc[mb].iface->poke32(U2_REG_ROUTER_CTRL_PORTS, (USRP2_UDP_FIFO_CRTL_PORT << 16) | USRP2_UDP_TX_DSP0_PORT);
+ addr, BOOST_STRINGIZE(USRP2_UDP_FIFO_CRTL_PORT), device_addr_t(), "");
+ // set the filter on the router to take dsp data from this port
+ _mbc[mb].iface->poke32(U2_REG_ROUTER_CTRL_PORTS,
+ (USRP2_UDP_FIFO_CRTL_PORT << 16) | USRP2_UDP_TX_DSP0_PORT);
- //create the fifo control interface for high speed register access
+ // create the fifo control interface for high speed register access
_mbc[mb].fifo_ctrl = usrp2_fifo_ctrl::make(_mbc[mb].fifo_ctrl_xport);
- switch(_mbc[mb].iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _mbc[mb].wbiface = _mbc[mb].fifo_ctrl;
- _mbc[mb].spiface = _mbc[mb].fifo_ctrl;
- break;
- default:
- _mbc[mb].wbiface = _mbc[mb].iface;
- _mbc[mb].spiface = _mbc[mb].iface;
- break;
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _mbc[mb].wbiface = _mbc[mb].fifo_ctrl;
+ _mbc[mb].spiface = _mbc[mb].fifo_ctrl;
+ break;
+ default:
+ _mbc[mb].wbiface = _mbc[mb].iface;
+ _mbc[mb].spiface = _mbc[mb].iface;
+ break;
}
_tree->create<double>(mb_path / "link_max_rate").set(USRP2_LINK_RATE_BPS);
@@ -467,39 +478,51 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
////////////////////////////////////////////////////////////////
_mbc[mb].clock = usrp2_clock_ctrl::make(_mbc[mb].iface, _mbc[mb].spiface);
_tree->create<double>(mb_path / "tick_rate")
- .set_publisher(std::bind(&usrp2_clock_ctrl::get_master_clock_rate, _mbc[mb].clock))
- .add_coerced_subscriber(std::bind(&usrp2_impl::update_tick_rate, this, std::placeholders::_1));
+ .set_publisher(
+ std::bind(&usrp2_clock_ctrl::get_master_clock_rate, _mbc[mb].clock))
+ .add_coerced_subscriber(
+ std::bind(&usrp2_impl::update_tick_rate, this, std::placeholders::_1));
////////////////////////////////////////////////////////////////
// create codec control objects
////////////////////////////////////////////////////////////////
const fs_path rx_codec_path = mb_path / "rx_codecs/A";
const fs_path tx_codec_path = mb_path / "tx_codecs/A";
- _tree->create<int>(rx_codec_path / "gains"); //phony property so this dir exists
- _tree->create<int>(tx_codec_path / "gains"); //phony property so this dir exists
+ _tree->create<int>(rx_codec_path / "gains"); // phony property so this dir exists
+ _tree->create<int>(tx_codec_path / "gains"); // phony property so this dir exists
_mbc[mb].codec = usrp2_codec_ctrl::make(_mbc[mb].iface, _mbc[mb].spiface);
- switch(_mbc[mb].iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:{
- _tree->create<std::string>(rx_codec_path / "name").set("ads62p44");
- _tree->create<meta_range_t>(rx_codec_path / "gains/digital/range").set(meta_range_t(0, 6.0, 0.5));
- _tree->create<double>(rx_codec_path / "gains/digital/value")
- .add_coerced_subscriber(std::bind(&usrp2_codec_ctrl::set_rx_digital_gain, _mbc[mb].codec, std::placeholders::_1)).set(0);
- _tree->create<meta_range_t>(rx_codec_path / "gains/fine/range").set(meta_range_t(0, 0.5, 0.05));
- _tree->create<double>(rx_codec_path / "gains/fine/value")
- .add_coerced_subscriber(std::bind(&usrp2_codec_ctrl::set_rx_digital_fine_gain, _mbc[mb].codec, std::placeholders::_1)).set(0);
- }break;
-
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- _tree->create<std::string>(rx_codec_path / "name").set("ltc2284");
- break;
-
- case usrp2_iface::USRP_NXXX:
- _tree->create<std::string>(rx_codec_path / "name").set("??????");
- break;
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4: {
+ _tree->create<std::string>(rx_codec_path / "name").set("ads62p44");
+ _tree->create<meta_range_t>(rx_codec_path / "gains/digital/range")
+ .set(meta_range_t(0, 6.0, 0.5));
+ _tree->create<double>(rx_codec_path / "gains/digital/value")
+ .add_coerced_subscriber(
+ std::bind(&usrp2_codec_ctrl::set_rx_digital_gain,
+ _mbc[mb].codec,
+ std::placeholders::_1))
+ .set(0);
+ _tree->create<meta_range_t>(rx_codec_path / "gains/fine/range")
+ .set(meta_range_t(0, 0.5, 0.05));
+ _tree->create<double>(rx_codec_path / "gains/fine/value")
+ .add_coerced_subscriber(
+ std::bind(&usrp2_codec_ctrl::set_rx_digital_fine_gain,
+ _mbc[mb].codec,
+ std::placeholders::_1))
+ .set(0);
+ } break;
+
+ case usrp2_iface::USRP2_REV3:
+ case usrp2_iface::USRP2_REV4:
+ _tree->create<std::string>(rx_codec_path / "name").set("ltc2284");
+ break;
+
+ case usrp2_iface::USRP_NXXX:
+ _tree->create<std::string>(rx_codec_path / "name").set("??????");
+ break;
}
_tree->create<std::string>(tx_codec_path / "name").set("ad9777");
@@ -508,39 +531,35 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
////////////////////////////////////////////////////////////////////
static const uint32_t dont_look_for_gpsdo = 0x1234abcdul;
- //disable check for internal GPSDO when not the following:
- switch(_mbc[mb].iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- break;
- default:
- _mbc[mb].iface->pokefw(U2_FW_REG_HAS_GPSDO, dont_look_for_gpsdo);
+ // disable check for internal GPSDO when not the following:
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ break;
+ default:
+ _mbc[mb].iface->pokefw(U2_FW_REG_HAS_GPSDO, dont_look_for_gpsdo);
}
- //otherwise if not disabled, look for the internal GPSDO
- if (_mbc[mb].iface->peekfw(U2_FW_REG_HAS_GPSDO) != dont_look_for_gpsdo)
- {
+ // otherwise if not disabled, look for the internal GPSDO
+ if (_mbc[mb].iface->peekfw(U2_FW_REG_HAS_GPSDO) != dont_look_for_gpsdo) {
UHD_LOGGER_INFO("USRP2") << "Detecting internal GPSDO.... ";
- try{
- _mbc[mb].gps = gps_ctrl::make(udp_simple::make_uart(udp_simple::make_connected(
- addr, BOOST_STRINGIZE(USRP2_UDP_UART_GPS_PORT)
- )));
- }
- catch(std::exception &e){
- UHD_LOGGER_ERROR("USRP2") << "An error occurred making GPSDO control: " << e.what() ;
+ try {
+ _mbc[mb].gps =
+ gps_ctrl::make(udp_simple::make_uart(udp_simple::make_connected(
+ addr, BOOST_STRINGIZE(USRP2_UDP_UART_GPS_PORT))));
+ } catch (std::exception& e) {
+ UHD_LOGGER_ERROR("USRP2")
+ << "An error occurred making GPSDO control: " << e.what();
}
- if (_mbc[mb].gps and _mbc[mb].gps->gps_detected())
- {
- for(const std::string &name: _mbc[mb].gps->get_sensors())
- {
+ if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()) {
+ for (const std::string& name : _mbc[mb].gps->get_sensors()) {
_tree->create<sensor_value_t>(mb_path / "sensors" / name)
- .set_publisher(std::bind(&gps_ctrl::get_sensor, _mbc[mb].gps, name));
+ .set_publisher(
+ std::bind(&gps_ctrl::get_sensor, _mbc[mb].gps, name));
}
- }
- else
- {
+ } else {
_mbc[mb].iface->pokefw(U2_FW_REG_HAS_GPSDO, dont_look_for_gpsdo);
}
}
@@ -556,116 +575,134 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
////////////////////////////////////////////////////////////////
// create frontend control objects
////////////////////////////////////////////////////////////////
- _mbc[mb].rx_fe = rx_frontend_core_200::make(
- _mbc[mb].wbiface, U2_REG_SR_ADDR(SR_RX_FRONT)
- );
- _mbc[mb].tx_fe = tx_frontend_core_200::make(
- _mbc[mb].wbiface, U2_REG_SR_ADDR(SR_TX_FRONT)
- );
+ _mbc[mb].rx_fe =
+ rx_frontend_core_200::make(_mbc[mb].wbiface, U2_REG_SR_ADDR(SR_RX_FRONT));
+ _mbc[mb].tx_fe =
+ tx_frontend_core_200::make(_mbc[mb].wbiface, U2_REG_SR_ADDR(SR_TX_FRONT));
_tree->create<subdev_spec_t>(mb_path / "rx_subdev_spec")
- .add_coerced_subscriber(std::bind(&usrp2_impl::update_rx_subdev_spec, this, mb, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::update_rx_subdev_spec, this, mb, std::placeholders::_1));
_tree->create<subdev_spec_t>(mb_path / "tx_subdev_spec")
- .add_coerced_subscriber(std::bind(&usrp2_impl::update_tx_subdev_spec, this, mb, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::update_tx_subdev_spec, this, mb, std::placeholders::_1));
const fs_path rx_fe_path = mb_path / "rx_frontends" / "A";
const fs_path tx_fe_path = mb_path / "tx_frontends" / "A";
- _tree->create<std::complex<double> >(rx_fe_path / "dc_offset" / "value")
- .set_coercer(std::bind(&rx_frontend_core_200::set_dc_offset, _mbc[mb].rx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(rx_fe_path / "dc_offset" / "value")
+ .set_coercer(std::bind(&rx_frontend_core_200::set_dc_offset,
+ _mbc[mb].rx_fe,
+ std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
_tree->create<bool>(rx_fe_path / "dc_offset" / "enable")
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_dc_offset_auto, _mbc[mb].rx_fe, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_dc_offset_auto,
+ _mbc[mb].rx_fe,
+ std::placeholders::_1))
.set(true);
- _tree->create<std::complex<double> >(rx_fe_path / "iq_balance" / "value")
- .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_iq_balance, _mbc[mb].rx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(rx_fe_path / "iq_balance" / "value")
+ .add_coerced_subscriber(std::bind(&rx_frontend_core_200::set_iq_balance,
+ _mbc[mb].rx_fe,
+ std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
- _tree->create<std::complex<double> >(tx_fe_path / "dc_offset" / "value")
- .set_coercer(std::bind(&tx_frontend_core_200::set_dc_offset, _mbc[mb].tx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(tx_fe_path / "dc_offset" / "value")
+ .set_coercer(std::bind(&tx_frontend_core_200::set_dc_offset,
+ _mbc[mb].tx_fe,
+ std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
- _tree->create<std::complex<double> >(tx_fe_path / "iq_balance" / "value")
- .add_coerced_subscriber(std::bind(&tx_frontend_core_200::set_iq_balance, _mbc[mb].tx_fe, std::placeholders::_1))
+ _tree->create<std::complex<double>>(tx_fe_path / "iq_balance" / "value")
+ .add_coerced_subscriber(std::bind(&tx_frontend_core_200::set_iq_balance,
+ _mbc[mb].tx_fe,
+ std::placeholders::_1))
.set(std::complex<double>(0.0, 0.0));
////////////////////////////////////////////////////////////////
// create rx dsp control objects
////////////////////////////////////////////////////////////////
- _mbc[mb].rx_dsps.push_back(rx_dsp_core_200::make(
- _mbc[mb].wbiface, U2_REG_SR_ADDR(SR_RX_DSP0), U2_REG_SR_ADDR(SR_RX_CTRL0), USRP2_RX_SID_BASE + 0, true
- ));
- _mbc[mb].rx_dsps.push_back(rx_dsp_core_200::make(
- _mbc[mb].wbiface, U2_REG_SR_ADDR(SR_RX_DSP1), U2_REG_SR_ADDR(SR_RX_CTRL1), USRP2_RX_SID_BASE + 1, true
- ));
- for (size_t dspno = 0; dspno < _mbc[mb].rx_dsps.size(); dspno++){
+ _mbc[mb].rx_dsps.push_back(rx_dsp_core_200::make(_mbc[mb].wbiface,
+ U2_REG_SR_ADDR(SR_RX_DSP0),
+ U2_REG_SR_ADDR(SR_RX_CTRL0),
+ USRP2_RX_SID_BASE + 0,
+ true));
+ _mbc[mb].rx_dsps.push_back(rx_dsp_core_200::make(_mbc[mb].wbiface,
+ U2_REG_SR_ADDR(SR_RX_DSP1),
+ U2_REG_SR_ADDR(SR_RX_CTRL1),
+ USRP2_RX_SID_BASE + 1,
+ true));
+ for (size_t dspno = 0; dspno < _mbc[mb].rx_dsps.size(); dspno++) {
_mbc[mb].rx_dsps[dspno]->set_link_rate(USRP2_LINK_RATE_BPS);
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&rx_dsp_core_200::set_tick_rate, _mbc[mb].rx_dsps[dspno], std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&rx_dsp_core_200::set_tick_rate,
+ _mbc[mb].rx_dsps[dspno],
+ std::placeholders::_1));
fs_path rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno);
_tree->create<meta_range_t>(rx_dsp_path / "rate/range")
- .set_publisher(std::bind(&rx_dsp_core_200::get_host_rates, _mbc[mb].rx_dsps[dspno]));
+ .set_publisher(
+ std::bind(&rx_dsp_core_200::get_host_rates, _mbc[mb].rx_dsps[dspno]));
_tree->create<double>(rx_dsp_path / "rate/value")
- .set(1e6) //some default
- .set_coercer(std::bind(&rx_dsp_core_200::set_host_rate, _mbc[mb].rx_dsps[dspno], std::placeholders::_1))
- .add_coerced_subscriber(std::bind(&usrp2_impl::update_rx_samp_rate, this, mb, dspno, std::placeholders::_1));
+ .set(1e6) // some default
+ .set_coercer(std::bind(&rx_dsp_core_200::set_host_rate,
+ _mbc[mb].rx_dsps[dspno],
+ std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(&usrp2_impl::update_rx_samp_rate,
+ this,
+ mb,
+ dspno,
+ std::placeholders::_1));
_tree->create<double>(rx_dsp_path / "freq/value")
- .set_coercer(std::bind(&rx_dsp_core_200::set_freq, _mbc[mb].rx_dsps[dspno], std::placeholders::_1));
+ .set_coercer(std::bind(&rx_dsp_core_200::set_freq,
+ _mbc[mb].rx_dsps[dspno],
+ std::placeholders::_1));
_tree->create<meta_range_t>(rx_dsp_path / "freq/range")
- .set_publisher(std::bind(&rx_dsp_core_200::get_freq_range, _mbc[mb].rx_dsps[dspno]));
+ .set_publisher(
+ std::bind(&rx_dsp_core_200::get_freq_range, _mbc[mb].rx_dsps[dspno]));
_tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd")
- .add_coerced_subscriber(std::bind(&rx_dsp_core_200::issue_stream_command, _mbc[mb].rx_dsps[dspno], std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&rx_dsp_core_200::issue_stream_command,
+ _mbc[mb].rx_dsps[dspno],
+ std::placeholders::_1));
}
////////////////////////////////////////////////////////////////
// create tx dsp control objects
////////////////////////////////////////////////////////////////
- _mbc[mb].tx_dsp = tx_dsp_core_200::make(
- _mbc[mb].wbiface,
+ _mbc[mb].tx_dsp = tx_dsp_core_200::make(_mbc[mb].wbiface,
U2_REG_SR_ADDR(SR_TX_DSP),
U2_REG_SR_ADDR(SR_TX_CTRL),
- USRP2_TX_ASYNC_SID
- );
+ USRP2_TX_ASYNC_SID);
_mbc[mb].tx_dsp->set_link_rate(USRP2_LINK_RATE_BPS);
{ // This scope can be removed once we're able to do named captures
- auto this_tx_dsp = _mbc[mb].tx_dsp; // This can then also go away
- _tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber([this_tx_dsp](const double rate){
- this_tx_dsp->set_tick_rate(rate);
- })
- ;
- _tree->create<meta_range_t>(mb_path / "tx_dsps/0/rate/range")
- .set_publisher([this_tx_dsp](){
- return this_tx_dsp->get_host_rates();
- })
- ;
- _tree->create<double>(mb_path / "tx_dsps/0/rate/value")
- .set(1e6) //some default
- .set_coercer([this_tx_dsp](const double rate){
- return this_tx_dsp->set_host_rate(rate);
- })
- .add_coerced_subscriber([this, mb](const double rate){
- this->update_tx_samp_rate(mb, 0, rate);
- })
- ;
+ auto this_tx_dsp = _mbc[mb].tx_dsp; // This can then also go away
+ _tree->access<double>(mb_path / "tick_rate")
+ .add_coerced_subscriber([this_tx_dsp](const double rate) {
+ this_tx_dsp->set_tick_rate(rate);
+ });
+ _tree->create<meta_range_t>(mb_path / "tx_dsps/0/rate/range")
+ .set_publisher([this_tx_dsp]() { return this_tx_dsp->get_host_rates(); });
+ _tree->create<double>(mb_path / "tx_dsps/0/rate/value")
+ .set(1e6) // some default
+ .set_coercer([this_tx_dsp](const double rate) {
+ return this_tx_dsp->set_host_rate(rate);
+ })
+ .add_coerced_subscriber([this, mb](const double rate) {
+ this->update_tx_samp_rate(mb, 0, rate);
+ });
} // End of non-C++14 scope (to release reference to this_tx_dsp)
_tree->create<double>(mb_path / "tx_dsps/0/freq/value")
- .set_coercer([this, mb](const double rate){
+ .set_coercer([this, mb](const double rate) {
return this->set_tx_dsp_freq(mb, rate);
- })
- ;
+ });
_tree->create<meta_range_t>(mb_path / "tx_dsps/0/freq/range")
- .set_publisher([this, mb](){
- return this->get_tx_dsp_freq_range(mb);
- })
- ;
+ .set_publisher([this, mb]() { return this->get_tx_dsp_freq_range(mb); });
- //setup dsp flow control
- const double ups_per_sec = device_args_i.cast<double>("ups_per_sec", 20);
+ // setup dsp flow control
+ const double ups_per_sec = device_args_i.cast<double>("ups_per_sec", 20);
const size_t send_frame_size = _mbc[mb].tx_dsp_xport->get_send_frame_size();
- const double ups_per_fifo = device_args_i.cast<double>("ups_per_fifo", 8.0);
+ const double ups_per_fifo = device_args_i.cast<double>("ups_per_fifo", 8.0);
_mbc[mb].tx_dsp->set_updates(
- (ups_per_sec > 0.0)? size_t(100e6/*approx tick rate*//ups_per_sec) : 0,
- (ups_per_fifo > 0.0)? size_t(USRP2_SRAM_BYTES/ups_per_fifo/send_frame_size) : 0
- );
+ (ups_per_sec > 0.0) ? size_t(100e6 /*approx tick rate*/ / ups_per_sec) : 0,
+ (ups_per_fifo > 0.0)
+ ? size_t(USRP2_SRAM_BYTES / ups_per_fifo / send_frame_size)
+ : 0);
////////////////////////////////////////////////////////////////
// create time control objects
@@ -675,26 +712,36 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
time64_rb_bases.rb_lo_now = U2_REG_TIME64_LO_RB_IMM;
time64_rb_bases.rb_hi_pps = U2_REG_TIME64_HI_RB_PPS;
time64_rb_bases.rb_lo_pps = U2_REG_TIME64_LO_RB_PPS;
- _mbc[mb].time64 = time64_core_200::make(
- _mbc[mb].wbiface, U2_REG_SR_ADDR(SR_TIME64), time64_rb_bases, mimo_clock_sync_delay_cycles
- );
+ _mbc[mb].time64 = time64_core_200::make(_mbc[mb].wbiface,
+ U2_REG_SR_ADDR(SR_TIME64),
+ time64_rb_bases,
+ mimo_clock_sync_delay_cycles);
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&time64_core_200::set_tick_rate, _mbc[mb].time64, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &time64_core_200::set_tick_rate, _mbc[mb].time64, std::placeholders::_1));
_tree->create<time_spec_t>(mb_path / "time/now")
.set_publisher(std::bind(&time64_core_200::get_time_now, _mbc[mb].time64))
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_now, _mbc[mb].time64, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &time64_core_200::set_time_now, _mbc[mb].time64, std::placeholders::_1));
_tree->create<time_spec_t>(mb_path / "time/pps")
- .set_publisher(std::bind(&time64_core_200::get_time_last_pps, _mbc[mb].time64))
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_next_pps, _mbc[mb].time64, std::placeholders::_1));
- //setup time source props
+ .set_publisher(
+ std::bind(&time64_core_200::get_time_last_pps, _mbc[mb].time64))
+ .add_coerced_subscriber(std::bind(&time64_core_200::set_time_next_pps,
+ _mbc[mb].time64,
+ std::placeholders::_1));
+ // setup time source props
_tree->create<std::string>(mb_path / "time_source/value")
- .add_coerced_subscriber(std::bind(&time64_core_200::set_time_source, _mbc[mb].time64, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(&time64_core_200::set_time_source,
+ _mbc[mb].time64,
+ std::placeholders::_1))
.set("none");
- _tree->create<std::vector<std::string> >(mb_path / "time_source/options")
- .set_publisher(std::bind(&time64_core_200::get_time_sources, _mbc[mb].time64));
- //setup reference source props
+ _tree->create<std::vector<std::string>>(mb_path / "time_source/options")
+ .set_publisher(
+ std::bind(&time64_core_200::get_time_sources, _mbc[mb].time64));
+ // setup reference source props
_tree->create<std::string>(mb_path / "clock_source/value")
- .add_coerced_subscriber(std::bind(&usrp2_impl::update_clock_source, this, mb, std::placeholders::_1))
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::update_clock_source, this, mb, std::placeholders::_1))
.set("internal");
std::vector<std::string> clock_sources{"internal", "external", "mimo"};
if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()) {
@@ -702,229 +749,269 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr) :
}
_tree->create<std::vector<std::string>>(mb_path / "clock_source/options")
.set(clock_sources);
- //plug timed commands into tree here
- switch(_mbc[mb].iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- _tree->create<time_spec_t>(mb_path / "time/cmd")
- .add_coerced_subscriber(std::bind(&usrp2_fifo_ctrl::set_time, _mbc[mb].fifo_ctrl, std::placeholders::_1));
- default: break; //otherwise, do not register
+ // plug timed commands into tree here
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _tree->create<time_spec_t>(mb_path / "time/cmd")
+ .add_coerced_subscriber(std::bind(&usrp2_fifo_ctrl::set_time,
+ _mbc[mb].fifo_ctrl,
+ std::placeholders::_1));
+ default:
+ break; // otherwise, do not register
}
_tree->access<double>(mb_path / "tick_rate")
- .add_coerced_subscriber(std::bind(&usrp2_fifo_ctrl::set_tick_rate, _mbc[mb].fifo_ctrl, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(&usrp2_fifo_ctrl::set_tick_rate,
+ _mbc[mb].fifo_ctrl,
+ std::placeholders::_1));
////////////////////////////////////////////////////////////////////
// create user-defined control objects
////////////////////////////////////////////////////////////////////
- _mbc[mb].user = user_settings_core_200::make(_mbc[mb].wbiface, U2_REG_SR_ADDR(SR_USER_REGS));
+ _mbc[mb].user =
+ user_settings_core_200::make(_mbc[mb].wbiface, U2_REG_SR_ADDR(SR_USER_REGS));
_tree->create<user_settings_core_200::user_reg_t>(mb_path / "user/regs")
- .add_coerced_subscriber(std::bind(&user_settings_core_200::set_reg, _mbc[mb].user, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &user_settings_core_200::set_reg, _mbc[mb].user, std::placeholders::_1));
////////////////////////////////////////////////////////////////
// create dboard control objects
////////////////////////////////////////////////////////////////
- //read the dboard eeprom to extract the dboard ids
+ // read the dboard eeprom to extract the dboard ids
dboard_eeprom_t rx_db_eeprom, tx_db_eeprom, gdb_eeprom;
rx_db_eeprom.load(*_mbc[mb].iface, USRP2_I2C_ADDR_RX_DB);
tx_db_eeprom.load(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB);
gdb_eeprom.load(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB ^ 5);
- //disable rx dc offset if LFRX
- if (rx_db_eeprom.id == 0x000f) _tree->access<bool>(rx_fe_path / "dc_offset" / "enable").set(false);
+ // disable rx dc offset if LFRX
+ if (rx_db_eeprom.id == 0x000f)
+ _tree->access<bool>(rx_fe_path / "dc_offset" / "enable").set(false);
- //create the properties and register subscribers
+ // create the properties and register subscribers
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/rx_eeprom")
.set(rx_db_eeprom)
- .add_coerced_subscriber(std::bind(&usrp2_impl::set_db_eeprom, this, mb, "rx", std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::set_db_eeprom, this, mb, "rx", std::placeholders::_1));
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/tx_eeprom")
.set(tx_db_eeprom)
- .add_coerced_subscriber(std::bind(&usrp2_impl::set_db_eeprom, this, mb, "tx", std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::set_db_eeprom, this, mb, "tx", std::placeholders::_1));
_tree->create<dboard_eeprom_t>(mb_path / "dboards/A/gdb_eeprom")
.set(gdb_eeprom)
- .add_coerced_subscriber(std::bind(&usrp2_impl::set_db_eeprom, this, mb, "gdb", std::placeholders::_1));
-
- //create a new dboard interface and manager
- _mbc[mb].dboard_manager = dboard_manager::make(
- rx_db_eeprom, tx_db_eeprom, gdb_eeprom,
- make_usrp2_dboard_iface(_mbc[mb].wbiface, _mbc[mb].iface/*i2c*/, _mbc[mb].spiface, _mbc[mb].clock),
- _tree->subtree(mb_path / "dboards/A")
- );
-
- //bind frontend corrections to the dboard freq props
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::set_db_eeprom, this, mb, "gdb", std::placeholders::_1));
+
+ // create a new dboard interface and manager
+ _mbc[mb].dboard_manager = dboard_manager::make(rx_db_eeprom,
+ tx_db_eeprom,
+ gdb_eeprom,
+ make_usrp2_dboard_iface(_mbc[mb].wbiface,
+ _mbc[mb].iface /*i2c*/,
+ _mbc[mb].spiface,
+ _mbc[mb].clock),
+ _tree->subtree(mb_path / "dboards/A"));
+
+ // bind frontend corrections to the dboard freq props
const fs_path db_tx_fe_path = mb_path / "dboards" / "A" / "tx_frontends";
- for(const std::string &name: _tree->list(db_tx_fe_path)){
+ for (const std::string& name : _tree->list(db_tx_fe_path)) {
_tree->access<double>(db_tx_fe_path / name / "freq" / "value")
- .add_coerced_subscriber(std::bind(&usrp2_impl::set_tx_fe_corrections, this, mb, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::set_tx_fe_corrections, this, mb, std::placeholders::_1));
}
const fs_path db_rx_fe_path = mb_path / "dboards" / "A" / "rx_frontends";
- for(const std::string &name: _tree->list(db_rx_fe_path)){
+ for (const std::string& name : _tree->list(db_rx_fe_path)) {
_tree->access<double>(db_rx_fe_path / name / "freq" / "value")
- .add_coerced_subscriber(std::bind(&usrp2_impl::set_rx_fe_corrections, this, mb, std::placeholders::_1));
+ .add_coerced_subscriber(std::bind(
+ &usrp2_impl::set_rx_fe_corrections, this, mb, std::placeholders::_1));
}
}
- //initialize io handling
+ // initialize io handling
this->io_init();
- //do some post-init tasks
+ // do some post-init tasks
this->update_rates();
- for(const std::string &mb: _mbc.keys()){
+ for (const std::string& mb : _mbc.keys()) {
fs_path root = "/mboards/" + mb;
- //reset cordic rates and their properties to zero
- for(const std::string &name: _tree->list(root / "rx_dsps")){
+ // reset cordic rates and their properties to zero
+ for (const std::string& name : _tree->list(root / "rx_dsps")) {
_tree->access<double>(root / "rx_dsps" / name / "freq" / "value").set(0.0);
}
- for(const std::string &name: _tree->list(root / "tx_dsps")){
+ for (const std::string& name : _tree->list(root / "tx_dsps")) {
_tree->access<double>(root / "tx_dsps" / name / "freq" / "value").set(0.0);
}
- _tree->access<subdev_spec_t>(root / "rx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(root / "dboards/A/rx_frontends").at(0)));
- _tree->access<subdev_spec_t>(root / "tx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(root / "dboards/A/tx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(root / "rx_subdev_spec")
+ .set(
+ subdev_spec_t("A:" + _tree->list(root / "dboards/A/rx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(root / "tx_subdev_spec")
+ .set(
+ subdev_spec_t("A:" + _tree->list(root / "dboards/A/tx_frontends").at(0)));
_tree->access<std::string>(root / "clock_source/value").set("internal");
_tree->access<std::string>(root / "time_source/value").set("none");
- //GPS installed: use external ref, time, and init time spec
- if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()){
+ // GPS installed: use external ref, time, and init time spec
+ if (_mbc[mb].gps and _mbc[mb].gps->gps_detected()) {
_mbc[mb].time64->enable_gpsdo();
- UHD_LOGGER_INFO("USRP2") << "Setting references to the internal GPSDO" ;
+ UHD_LOGGER_INFO("USRP2") << "Setting references to the internal GPSDO";
_tree->access<std::string>(root / "time_source/value").set("gpsdo");
_tree->access<std::string>(root / "clock_source/value").set("gpsdo");
}
}
-
}
-usrp2_impl::~usrp2_impl(void){UHD_SAFE_CALL(
- _pirate_task_exit = true;
- for(const std::string &mb: _mbc.keys()){
- _mbc[mb].tx_dsp->set_updates(0, 0);
- }
-)}
+usrp2_impl::~usrp2_impl(void)
+{
+ UHD_SAFE_CALL(_pirate_task_exit = true;
+ for (const std::string& mb
+ : _mbc.keys()) { _mbc[mb].tx_dsp->set_updates(0, 0); })
+}
-void usrp2_impl::set_db_eeprom(const std::string &mb, const std::string &type, const uhd::usrp::dboard_eeprom_t &db_eeprom){
- if (type == "rx") db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_RX_DB);
- if (type == "tx") db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB);
- if (type == "gdb") db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB ^ 5);
+void usrp2_impl::set_db_eeprom(const std::string& mb,
+ const std::string& type,
+ const uhd::usrp::dboard_eeprom_t& db_eeprom)
+{
+ if (type == "rx")
+ db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_RX_DB);
+ if (type == "tx")
+ db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB);
+ if (type == "gdb")
+ db_eeprom.store(*_mbc[mb].iface, USRP2_I2C_ADDR_TX_DB ^ 5);
}
-sensor_value_t usrp2_impl::get_mimo_locked(const std::string &mb){
- const bool lock = (_mbc[mb].wbiface->peek32(U2_REG_IRQ_RB) & (1<<10)) != 0;
+sensor_value_t usrp2_impl::get_mimo_locked(const std::string& mb)
+{
+ const bool lock = (_mbc[mb].wbiface->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 std::string &mb){
- const bool lock = (_mbc[mb].wbiface->peek32(U2_REG_IRQ_RB) & (1<<11)) != 0;
+sensor_value_t usrp2_impl::get_ref_locked(const std::string& mb)
+{
+ const bool lock = (_mbc[mb].wbiface->peek32(U2_REG_IRQ_RB) & (1 << 11)) != 0;
return sensor_value_t("Ref", lock, "locked", "unlocked");
}
-void usrp2_impl::set_rx_fe_corrections(const std::string &mb, const double lo_freq){
- if(not _ignore_cal_file){
- apply_rx_fe_corrections(this->get_tree()->subtree("/mboards/" + mb), "A", lo_freq);
+void usrp2_impl::set_rx_fe_corrections(const std::string& mb, const double lo_freq)
+{
+ if (not _ignore_cal_file) {
+ apply_rx_fe_corrections(
+ this->get_tree()->subtree("/mboards/" + mb), "A", lo_freq);
}
}
-void usrp2_impl::set_tx_fe_corrections(const std::string &mb, const double lo_freq){
- if(not _ignore_cal_file){
- apply_tx_fe_corrections(this->get_tree()->subtree("/mboards/" + mb), "A", lo_freq);
+void usrp2_impl::set_tx_fe_corrections(const std::string& mb, const double lo_freq)
+{
+ if (not _ignore_cal_file) {
+ apply_tx_fe_corrections(
+ this->get_tree()->subtree("/mboards/" + mb), "A", lo_freq);
}
}
-double usrp2_impl::set_tx_dsp_freq(
- const std::string &mb,
- const double freq_
-) {
- double new_freq = freq_;
- const double tick_rate =
- _tree->access<double>("/mboards/"+mb+"/tick_rate").get();
-
- //calculate the DAC shift (multiples of rate)
- const int sign = boost::math::sign(new_freq);
- const int zone = std::min(boost::math::iround(new_freq/tick_rate), 2);
- const double dac_shift = sign*zone*tick_rate;
- new_freq -= dac_shift; //update FPGA DSP target freq
+double usrp2_impl::set_tx_dsp_freq(const std::string& mb, const double freq_)
+{
+ double new_freq = freq_;
+ const double tick_rate = _tree->access<double>("/mboards/" + mb + "/tick_rate").get();
+
+ // calculate the DAC shift (multiples of rate)
+ const int sign = boost::math::sign(new_freq);
+ const int zone = std::min(boost::math::iround(new_freq / tick_rate), 2);
+ const double dac_shift = sign * zone * tick_rate;
+ new_freq -= dac_shift; // update FPGA DSP target freq
UHD_LOG_TRACE("USRP2",
- "DSP Tuning: Requested " + std::to_string(freq_/1e6) + " MHz, Using "
- "Nyquist zone " + std::to_string(sign*zone) + ", leftover DSP tuning: "
- + std::to_string(new_freq/1e6) + " MHz.");
+ "DSP Tuning: Requested " + std::to_string(freq_ / 1e6)
+ + " MHz, Using "
+ "Nyquist zone "
+ + std::to_string(sign * zone)
+ + ", leftover DSP tuning: " + std::to_string(new_freq / 1e6) + " MHz.");
- //set the DAC shift (modulation mode)
+ // set the DAC shift (modulation mode)
if (zone == 0) {
- _mbc[mb].codec->set_tx_mod_mode(0); //no shift
+ _mbc[mb].codec->set_tx_mod_mode(0); // no shift
} else {
- _mbc[mb].codec->set_tx_mod_mode(sign*4/zone); //DAC interp = 4
+ _mbc[mb].codec->set_tx_mod_mode(sign * 4 / zone); // DAC interp = 4
}
- return _mbc[mb].tx_dsp->set_freq(new_freq) + dac_shift; //actual freq
+ return _mbc[mb].tx_dsp->set_freq(new_freq) + dac_shift; // actual freq
}
-meta_range_t usrp2_impl::get_tx_dsp_freq_range(const std::string &mb)
+meta_range_t usrp2_impl::get_tx_dsp_freq_range(const std::string& mb)
{
- const double dac_rate =
- _tree->access<double>("/mboards/" + mb + "/tick_rate").get()
- * _mbc[mb].codec->get_tx_interpolation();
+ const double dac_rate = _tree->access<double>("/mboards/" + mb + "/tick_rate").get()
+ * _mbc[mb].codec->get_tx_interpolation();
const auto dsp_range_step = _mbc[mb].tx_dsp->get_freq_range().step();
// The DSP tuning rate is the entire range of the DAC clock rate. The step
// size is determined by the FPGA IP, however.
- return meta_range_t(
- -dac_rate / 2,
- +dac_rate / 2,
- dsp_range_step
- );
+ return meta_range_t(-dac_rate / 2, +dac_rate / 2, dsp_range_step);
}
#include <boost/math/special_functions/round.hpp>
#include <boost/math/special_functions/sign.hpp>
-void usrp2_impl::update_clock_source(const std::string &mb, const std::string &source){
- //NOTICE: U2_REG_MISC_CTRL_CLOCK is on the wb clock, and cannot be set from fifo_ctrl
- //clock source ref 10mhz
- switch(_mbc[mb].iface->get_rev()){
- case usrp2_iface::USRP_N200:
- case usrp2_iface::USRP_N210:
- case usrp2_iface::USRP_N200_R4:
- case usrp2_iface::USRP_N210_R4:
- if (source == "internal") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x12);
- else if (source == "external") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
- else if (source == "gpsdo") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
- else if (source == "mimo") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x15);
- else throw uhd::value_error("unhandled clock configuration reference source: " + source);
- _mbc[mb].clock->enable_external_ref(true); //USRP2P has an internal 10MHz TCXO
- break;
-
- case usrp2_iface::USRP2_REV3:
- case usrp2_iface::USRP2_REV4:
- if (source == "internal") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x10);
- else if (source == "external") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
- else if (source == "mimo") _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x15);
- else throw uhd::value_error("unhandled clock configuration reference source: " + source);
- _mbc[mb].clock->enable_external_ref(source != "internal");
- break;
-
- case usrp2_iface::USRP_NXXX: break;
- }
-
- //always drive the clock over serdes if not locking to it
- _mbc[mb].clock->enable_mimo_clock_out(source != "mimo");
-
- //set the mimo clock delay over the serdes
- if (source != "mimo"){
- switch(_mbc[mb].iface->get_rev()){
+void usrp2_impl::update_clock_source(const std::string& mb, const std::string& source)
+{
+ // NOTICE: U2_REG_MISC_CTRL_CLOCK is on the wb clock, and cannot be set from fifo_ctrl
+ // clock source ref 10mhz
+ switch (_mbc[mb].iface->get_rev()) {
case usrp2_iface::USRP_N200:
case usrp2_iface::USRP_N210:
case usrp2_iface::USRP_N200_R4:
case usrp2_iface::USRP_N210_R4:
- _mbc[mb].clock->set_mimo_clock_delay(mimo_clock_delay_usrp_n2xx);
+ if (source == "internal")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x12);
+ else if (source == "external")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
+ else if (source == "gpsdo")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
+ else if (source == "mimo")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x15);
+ else
+ throw uhd::value_error(
+ "unhandled clock configuration reference source: " + source);
+ _mbc[mb].clock->enable_external_ref(true); // USRP2P has an internal 10MHz
+ // TCXO
break;
+ case usrp2_iface::USRP2_REV3:
case usrp2_iface::USRP2_REV4:
- _mbc[mb].clock->set_mimo_clock_delay(mimo_clock_delay_usrp2_rev4);
+ if (source == "internal")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x10);
+ else if (source == "external")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x1C);
+ else if (source == "mimo")
+ _mbc[mb].iface->poke32(U2_REG_MISC_CTRL_CLOCK, 0x15);
+ else
+ throw uhd::value_error(
+ "unhandled clock configuration reference source: " + source);
+ _mbc[mb].clock->enable_external_ref(source != "internal");
break;
- default: break; //not handled
+ case usrp2_iface::USRP_NXXX:
+ break;
+ }
+
+ // always drive the clock over serdes if not locking to it
+ _mbc[mb].clock->enable_mimo_clock_out(source != "mimo");
+
+ // set the mimo clock delay over the serdes
+ if (source != "mimo") {
+ switch (_mbc[mb].iface->get_rev()) {
+ case usrp2_iface::USRP_N200:
+ case usrp2_iface::USRP_N210:
+ case usrp2_iface::USRP_N200_R4:
+ case usrp2_iface::USRP_N210_R4:
+ _mbc[mb].clock->set_mimo_clock_delay(mimo_clock_delay_usrp_n2xx);
+ break;
+
+ case usrp2_iface::USRP2_REV4:
+ _mbc[mb].clock->set_mimo_clock_delay(mimo_clock_delay_usrp2_rev4);
+ break;
+
+ default:
+ break; // not handled
}
}
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 9e4e507de..792c38a11 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -8,71 +8,71 @@
#ifndef INCLUDED_USRP2_IMPL_HPP
#define INCLUDED_USRP2_IMPL_HPP
-#include "usrp2_iface.hpp"
-#include "usrp2_fifo_ctrl.hpp"
#include "clock_ctrl.hpp"
#include "codec_ctrl.hpp"
-#include <uhdlib/usrp/cores/rx_frontend_core_200.hpp>
-#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
-#include <uhdlib/usrp/cores/rx_dsp_core_200.hpp>
-#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
-#include <uhdlib/usrp/cores/time64_core_200.hpp>
-#include <uhdlib/usrp/cores/user_settings_core_200.hpp>
-#include <uhdlib/usrp/cores/gpio_core_200.hpp>
-#include <uhd/property_tree.hpp>
-#include <uhd/usrp/gps_ctrl.hpp>
+#include "usrp2_fifo_ctrl.hpp"
+#include "usrp2_iface.hpp"
#include <uhd/device.hpp>
-#include <uhd/utils/pimpl.hpp>
-#include <uhd/types/dict.hpp>
-#include <uhd/types/stream_cmd.hpp>
-#include <uhd/usrp/dboard_eeprom.hpp>
-#include <uhd/transport/vrt_if_packet.hpp>
+#include <uhd/property_tree.hpp>
#include <uhd/transport/udp_simple.hpp>
#include <uhd/transport/udp_zero_copy.hpp>
+#include <uhd/transport/vrt_if_packet.hpp>
#include <uhd/types/device_addr.hpp>
+#include <uhd/types/dict.hpp>
+#include <uhd/types/stream_cmd.hpp>
+#include <uhd/usrp/dboard_eeprom.hpp>
#include <uhd/usrp/dboard_manager.hpp>
+#include <uhd/usrp/gps_ctrl.hpp>
#include <uhd/usrp/subdev_spec.hpp>
-#include <memory>
-#include <functional>
+#include <uhd/utils/pimpl.hpp>
+#include <uhdlib/usrp/cores/gpio_core_200.hpp>
+#include <uhdlib/usrp/cores/rx_dsp_core_200.hpp>
+#include <uhdlib/usrp/cores/rx_frontend_core_200.hpp>
+#include <uhdlib/usrp/cores/time64_core_200.hpp>
+#include <uhdlib/usrp/cores/tx_dsp_core_200.hpp>
+#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
+#include <uhdlib/usrp/cores/user_settings_core_200.hpp>
#include <atomic>
+#include <functional>
+#include <memory>
-static const double USRP2_LINK_RATE_BPS = 1000e6/8;
-static const double mimo_clock_delay_usrp2_rev4 = 4.18e-9;
-static const double mimo_clock_delay_usrp_n2xx = 4.10e-9;
+static const double USRP2_LINK_RATE_BPS = 1000e6 / 8;
+static const double mimo_clock_delay_usrp2_rev4 = 4.18e-9;
+static const double mimo_clock_delay_usrp_n2xx = 4.10e-9;
static const size_t mimo_clock_sync_delay_cycles = 138;
-static const size_t USRP2_SRAM_BYTES = size_t(1 << 20);
-static const uint32_t USRP2_TX_ASYNC_SID = 2;
-static const uint32_t USRP2_RX_SID_BASE = 3;
+static const size_t USRP2_SRAM_BYTES = size_t(1 << 20);
+static const uint32_t USRP2_TX_ASYNC_SID = 2;
+static const uint32_t USRP2_RX_SID_BASE = 3;
-uhd::device_addrs_t usrp2_find(const uhd::device_addr_t &hint_);
+uhd::device_addrs_t usrp2_find(const uhd::device_addr_t& hint_);
//! Make a usrp2 dboard interface.
-uhd::usrp::dboard_iface::sptr make_usrp2_dboard_iface(
- uhd::timed_wb_iface::sptr wb_iface,
+uhd::usrp::dboard_iface::sptr make_usrp2_dboard_iface(uhd::timed_wb_iface::sptr wb_iface,
uhd::i2c_iface::sptr i2c_iface,
uhd::spi_iface::sptr spi_iface,
- usrp2_clock_ctrl::sptr clk_ctrl
-);
+ usrp2_clock_ctrl::sptr clk_ctrl);
/*!
* USRP2 implementation guts:
* The implementation details are encapsulated here.
* Handles device properties and streaming...
*/
-class usrp2_impl : public uhd::device{
+class usrp2_impl : public uhd::device
+{
public:
- usrp2_impl(const uhd::device_addr_t &);
+ usrp2_impl(const uhd::device_addr_t&);
~usrp2_impl(void);
- //the io interface
- uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t &args);
- uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t &args);
- bool recv_async_msg(uhd::async_metadata_t &, double);
+ // the io interface
+ uhd::rx_streamer::sptr get_rx_stream(const uhd::stream_args_t& args);
+ uhd::tx_streamer::sptr get_tx_stream(const uhd::stream_args_t& args);
+ bool recv_async_msg(uhd::async_metadata_t&, double);
- static uhd::usrp::mboard_eeprom_t get_mb_eeprom(usrp2_iface &);
+ static uhd::usrp::mboard_eeprom_t get_mb_eeprom(usrp2_iface&);
private:
- struct mb_container_type{
+ struct mb_container_type
+ {
usrp2_iface::sptr iface;
usrp2_fifo_ctrl::sptr fifo_ctrl;
uhd::spi_iface::sptr spiface;
@@ -83,8 +83,8 @@ private:
rx_frontend_core_200::sptr rx_fe;
tx_frontend_core_200::sptr tx_fe;
std::vector<rx_dsp_core_200::sptr> rx_dsps;
- std::vector<std::weak_ptr<uhd::rx_streamer> > rx_streamers;
- std::vector<std::weak_ptr<uhd::tx_streamer> > tx_streamers;
+ std::vector<std::weak_ptr<uhd::rx_streamer>> rx_streamers;
+ std::vector<std::weak_ptr<uhd::tx_streamer>> tx_streamers;
tx_dsp_core_200::sptr tx_dsp;
time64_core_200::sptr time64;
user_settings_core_200::sptr user;
@@ -93,36 +93,38 @@ private:
uhd::transport::zero_copy_if::sptr fifo_ctrl_xport;
uhd::usrp::dboard_manager::sptr dboard_manager;
size_t rx_chan_occ, tx_chan_occ;
- mb_container_type(void): rx_chan_occ(0), tx_chan_occ(0){}
+ mb_container_type(void) : rx_chan_occ(0), tx_chan_occ(0) {}
};
uhd::dict<std::string, mb_container_type> _mbc;
- void set_mb_eeprom(const std::string &, const uhd::usrp::mboard_eeprom_t &);
- void set_db_eeprom(const std::string &, const std::string &, const uhd::usrp::dboard_eeprom_t &);
+ void set_mb_eeprom(const std::string&, const uhd::usrp::mboard_eeprom_t&);
+ void set_db_eeprom(
+ const std::string&, const std::string&, const uhd::usrp::dboard_eeprom_t&);
- uhd::sensor_value_t get_mimo_locked(const std::string &);
- uhd::sensor_value_t get_ref_locked(const std::string &);
+ uhd::sensor_value_t get_mimo_locked(const std::string&);
+ uhd::sensor_value_t get_ref_locked(const std::string&);
- void set_rx_fe_corrections(const std::string &mb, const double);
- void set_tx_fe_corrections(const std::string &mb, const double);
+ void set_rx_fe_corrections(const std::string& mb, const double);
+ void set_tx_fe_corrections(const std::string& mb, const double);
bool _ignore_cal_file;
- //io impl methods and members
+ // io impl methods and members
uhd::device_addr_t device_addr;
UHD_PIMPL_DECL(io_impl) _io_impl;
std::atomic<bool> _pirate_task_exit;
void io_init(void);
void update_tick_rate(const double rate);
- void update_rx_samp_rate(const std::string &, const size_t, const double rate);
- void update_tx_samp_rate(const std::string &, const size_t, const double rate);
+ void update_rx_samp_rate(const std::string&, const size_t, const double rate);
+ void update_tx_samp_rate(const std::string&, const size_t, const double rate);
void update_rates(void);
- //update spec methods are coercers until we only accept db_name == A
- void update_rx_subdev_spec(const std::string &, const uhd::usrp::subdev_spec_t &);
- void update_tx_subdev_spec(const std::string &, const uhd::usrp::subdev_spec_t &);
- double set_tx_dsp_freq(const std::string &, const double);
- uhd::meta_range_t get_tx_dsp_freq_range(const std::string &);
- void update_clock_source(const std::string &, const std::string &);
- void program_stream_dest(uhd::transport::zero_copy_if::sptr &, const uhd::stream_args_t &);
+ // update spec methods are coercers until we only accept db_name == A
+ void update_rx_subdev_spec(const std::string&, const uhd::usrp::subdev_spec_t&);
+ void update_tx_subdev_spec(const std::string&, const uhd::usrp::subdev_spec_t&);
+ double set_tx_dsp_freq(const std::string&, const double);
+ uhd::meta_range_t get_tx_dsp_freq_range(const std::string&);
+ void update_clock_source(const std::string&, const std::string&);
+ void program_stream_dest(
+ uhd::transport::zero_copy_if::sptr&, const uhd::stream_args_t&);
};
#endif /* INCLUDED_USRP2_IMPL_HPP */
diff --git a/host/lib/usrp/usrp2/usrp2_regs.hpp b/host/lib/usrp/usrp2/usrp2_regs.hpp
index f26b33ecb..6fc973cdf 100644
--- a/host/lib/usrp/usrp2/usrp2_regs.hpp
+++ b/host/lib/usrp/usrp2/usrp2_regs.hpp
@@ -11,37 +11,37 @@
////////////////////////////////////////////////////////////////////////
// Define slave bases
////////////////////////////////////////////////////////////////////////
-#define ROUTER_RAM_BASE 0x4000
-#define SPI_BASE 0x5000
-#define I2C_BASE 0x5400
-#define GPIO_BASE 0x5800
-#define READBACK_BASE 0x5C00
-#define ETH_BASE 0x6000
-#define SETTING_REGS_BASE 0x7000
-#define PIC_BASE 0x8000
-#define UART_BASE 0x8800
-#define ATR_BASE 0x8C00
+#define ROUTER_RAM_BASE 0x4000
+#define SPI_BASE 0x5000
+#define I2C_BASE 0x5400
+#define GPIO_BASE 0x5800
+#define READBACK_BASE 0x5C00
+#define ETH_BASE 0x6000
+#define SETTING_REGS_BASE 0x7000
+#define PIC_BASE 0x8000
+#define UART_BASE 0x8800
+#define ATR_BASE 0x8C00
////////////////////////////////////////////////////////////////////////
// Setting register offsets
////////////////////////////////////////////////////////////////////////
-#define SR_MISC 0 // 7 regs
-#define SR_USER_REGS 8 // 2
-#define SR_TIME64 10 // 6
-#define SR_BUF_POOL 16 // 4
-#define SR_SPI_CORE 20 // 3
-#define SR_RX_FRONT 24 // 5
-#define SR_RX_CTRL0 32 // 9
-#define SR_RX_DSP0 48 // 7
-#define SR_RX_CTRL1 80 // 9
-#define SR_RX_DSP1 96 // 7
+#define SR_MISC 0 // 7 regs
+#define SR_USER_REGS 8 // 2
+#define SR_TIME64 10 // 6
+#define SR_BUF_POOL 16 // 4
+#define SR_SPI_CORE 20 // 3
+#define SR_RX_FRONT 24 // 5
+#define SR_RX_CTRL0 32 // 9
+#define SR_RX_DSP0 48 // 7
+#define SR_RX_CTRL1 80 // 9
+#define SR_RX_DSP1 96 // 7
-#define SR_TX_FRONT 128 // ?
-#define SR_TX_CTRL 144 // 6
-#define SR_TX_DSP 160 // 5
+#define SR_TX_FRONT 128 // ?
+#define SR_TX_CTRL 144 // 6
+#define SR_TX_DSP 160 // 5
-#define SR_GPIO 184
-#define SR_UDP_SM 192 // 64
+#define SR_GPIO 184
+#define SR_UDP_SM 192 // 64
#define U2_REG_SR_ADDR(sr) (SETTING_REGS_BASE + (4 * (sr)))
@@ -51,15 +51,15 @@
// SPI Slave Constants
////////////////////////////////////////////////
// Masks for controlling different peripherals
-#define SPI_SS_AD9510 1
-#define SPI_SS_AD9777 2
-#define SPI_SS_RX_DAC 4
-#define SPI_SS_RX_ADC 8
-#define SPI_SS_RX_DB 16
-#define SPI_SS_TX_DAC 32
-#define SPI_SS_TX_ADC 64
-#define SPI_SS_TX_DB 128
-#define SPI_SS_ADS62P44 256 //for usrp2p
+#define SPI_SS_AD9510 1
+#define SPI_SS_AD9777 2
+#define SPI_SS_RX_DAC 4
+#define SPI_SS_RX_ADC 8
+#define SPI_SS_RX_DB 16
+#define SPI_SS_TX_DAC 32
+#define SPI_SS_TX_ADC 64
+#define SPI_SS_TX_DB 128
+#define SPI_SS_ADS62P44 256 // for usrp2p
/////////////////////////////////////////////////
// Misc Control
@@ -77,21 +77,21 @@
#define U2_FLAG_MISC_CTRL_SERDES_ENABLE 8
#define U2_FLAG_MISC_CTRL_SERDES_PRBSEN 4
#define U2_FLAG_MISC_CTRL_SERDES_LOOPEN 2
-#define U2_FLAG_MISC_CTRL_SERDES_RXEN 1
+#define U2_FLAG_MISC_CTRL_SERDES_RXEN 1
-#define U2_FLAG_MISC_CTRL_ADC_ON 0x0F
+#define U2_FLAG_MISC_CTRL_ADC_ON 0x0F
#define U2_FLAG_MISC_CTRL_ADC_OFF 0x00
/////////////////////////////////////////////////
// Readback regs
////////////////////////////////////////////////
-#define U2_REG_STATUS READBACK_BASE + 4*8
-#define U2_REG_GPIO_RB READBACK_BASE + 4*9
-#define U2_REG_TIME64_HI_RB_IMM READBACK_BASE + 4*10
-#define U2_REG_TIME64_LO_RB_IMM READBACK_BASE + 4*11
-#define U2_REG_COMPAT_NUM_RB READBACK_BASE + 4*12
-#define U2_REG_IRQ_RB READBACK_BASE + 4*13
-#define U2_REG_TIME64_HI_RB_PPS READBACK_BASE + 4*14
-#define U2_REG_TIME64_LO_RB_PPS READBACK_BASE + 4*15
+#define U2_REG_STATUS READBACK_BASE + 4 * 8
+#define U2_REG_GPIO_RB READBACK_BASE + 4 * 9
+#define U2_REG_TIME64_HI_RB_IMM READBACK_BASE + 4 * 10
+#define U2_REG_TIME64_LO_RB_IMM READBACK_BASE + 4 * 11
+#define U2_REG_COMPAT_NUM_RB READBACK_BASE + 4 * 12
+#define U2_REG_IRQ_RB READBACK_BASE + 4 * 13
+#define U2_REG_TIME64_HI_RB_PPS READBACK_BASE + 4 * 14
+#define U2_REG_TIME64_LO_RB_PPS READBACK_BASE + 4 * 15
#endif /* INCLUDED_USRP2_REGS_HPP */
diff --git a/host/lib/usrp/usrp_c.cpp b/host/lib/usrp/usrp_c.cpp
index 9d1704181..e94b49fc8 100644
--- a/host/lib/usrp/usrp_c.cpp
+++ b/host/lib/usrp/usrp_c.cpp
@@ -7,40 +7,40 @@
/* C-Interface for multi_usrp */
-#include <uhd/utils/static.hpp>
-#include <uhd/usrp/multi_usrp.hpp>
-
#include <uhd/error.h>
+#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/usrp/usrp.h>
-
-#include <boost/thread/mutex.hpp>
-
+#include <uhd/utils/static.hpp>
#include <string.h>
+#include <boost/thread/mutex.hpp>
#include <map>
/****************************************************************************
* Helpers
***************************************************************************/
-uhd::stream_args_t stream_args_c_to_cpp(const uhd_stream_args_t *stream_args_c)
+uhd::stream_args_t stream_args_c_to_cpp(const uhd_stream_args_t* stream_args_c)
{
std::string otw_format(stream_args_c->otw_format);
std::string cpu_format(stream_args_c->cpu_format);
std::string args(stream_args_c->args);
- std::vector<size_t> channels(stream_args_c->channel_list, stream_args_c->channel_list + stream_args_c->n_channels);
+ std::vector<size_t> channels(stream_args_c->channel_list,
+ stream_args_c->channel_list + stream_args_c->n_channels);
uhd::stream_args_t stream_args_cpp(cpu_format, otw_format);
- stream_args_cpp.args = args;
+ stream_args_cpp.args = args;
stream_args_cpp.channels = channels;
return stream_args_cpp;
}
-uhd::stream_cmd_t stream_cmd_c_to_cpp(const uhd_stream_cmd_t *stream_cmd_c)
+uhd::stream_cmd_t stream_cmd_c_to_cpp(const uhd_stream_cmd_t* stream_cmd_c)
{
- uhd::stream_cmd_t stream_cmd_cpp(uhd::stream_cmd_t::stream_mode_t(stream_cmd_c->stream_mode));
- stream_cmd_cpp.num_samps = stream_cmd_c->num_samps;
- stream_cmd_cpp.stream_now = stream_cmd_c->stream_now;
- stream_cmd_cpp.time_spec = uhd::time_spec_t(stream_cmd_c->time_spec_full_secs, stream_cmd_c->time_spec_frac_secs);
+ uhd::stream_cmd_t stream_cmd_cpp(
+ uhd::stream_cmd_t::stream_mode_t(stream_cmd_c->stream_mode));
+ stream_cmd_cpp.num_samps = stream_cmd_c->num_samps;
+ stream_cmd_cpp.stream_now = stream_cmd_c->stream_now;
+ stream_cmd_cpp.time_spec = uhd::time_spec_t(
+ stream_cmd_c->time_spec_full_secs, stream_cmd_c->time_spec_frac_secs);
return stream_cmd_cpp;
}
@@ -48,25 +48,29 @@ uhd::stream_cmd_t stream_cmd_c_to_cpp(const uhd_stream_cmd_t *stream_cmd_c)
* Registry / Pointer Management
***************************************************************************/
/* Public structs */
-struct uhd_usrp {
+struct uhd_usrp
+{
size_t usrp_index;
std::string last_error;
};
-struct uhd_tx_streamer {
+struct uhd_tx_streamer
+{
size_t usrp_index;
uhd::tx_streamer::sptr streamer;
std::string last_error;
};
-struct uhd_rx_streamer {
+struct uhd_rx_streamer
+{
size_t usrp_index;
uhd::rx_streamer::sptr streamer;
std::string last_error;
};
/* Not public: We use this for our internal registry */
-struct usrp_ptr {
+struct usrp_ptr
+{
uhd::usrp::multi_usrp::sptr ptr;
static size_t usrp_counter;
};
@@ -83,264 +87,204 @@ UHD_SINGLETON_FCN(usrp_ptrs, get_usrp_ptrs);
* RX Streamer
***************************************************************************/
static boost::mutex _rx_streamer_make_mutex;
-uhd_error uhd_rx_streamer_make(uhd_rx_streamer_handle* h){
- UHD_SAFE_C(
- boost::mutex::scoped_lock lock(_rx_streamer_make_mutex);
- (*h) = new uhd_rx_streamer;
- )
+uhd_error uhd_rx_streamer_make(uhd_rx_streamer_handle* h)
+{
+ UHD_SAFE_C(boost::mutex::scoped_lock lock(_rx_streamer_make_mutex);
+ (*h) = new uhd_rx_streamer;)
}
static boost::mutex _rx_streamer_free_mutex;
-uhd_error uhd_rx_streamer_free(uhd_rx_streamer_handle* h){
- UHD_SAFE_C(
- boost::mutex::scoped_lock lock(_rx_streamer_free_mutex);
- delete (*h);
- (*h) = NULL;
- )
+uhd_error uhd_rx_streamer_free(uhd_rx_streamer_handle* h)
+{
+ UHD_SAFE_C(boost::mutex::scoped_lock lock(_rx_streamer_free_mutex); delete (*h);
+ (*h) = NULL;)
}
-uhd_error uhd_rx_streamer_num_channels(uhd_rx_streamer_handle h,
- size_t *num_channels_out){
- UHD_SAFE_C_SAVE_ERROR(h,
- *num_channels_out = h->streamer->get_num_channels();
- )
+uhd_error uhd_rx_streamer_num_channels(uhd_rx_streamer_handle h, size_t* num_channels_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *num_channels_out = h->streamer->get_num_channels();)
}
-uhd_error uhd_rx_streamer_max_num_samps(uhd_rx_streamer_handle h,
- size_t *max_num_samps_out){
- UHD_SAFE_C_SAVE_ERROR(h,
- *max_num_samps_out = h->streamer->get_max_num_samps();
- )
+uhd_error uhd_rx_streamer_max_num_samps(
+ uhd_rx_streamer_handle h, size_t* max_num_samps_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *max_num_samps_out = h->streamer->get_max_num_samps();)
}
-uhd_error uhd_rx_streamer_recv(
- uhd_rx_streamer_handle h,
- void **buffs,
+uhd_error uhd_rx_streamer_recv(uhd_rx_streamer_handle h,
+ void** buffs,
size_t samps_per_buff,
- uhd_rx_metadata_handle *md,
+ uhd_rx_metadata_handle* md,
double timeout,
bool one_packet,
- size_t *items_recvd
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::rx_streamer::buffs_type buffs_cpp(buffs, h->streamer->get_num_channels());
- *items_recvd = h->streamer->recv(buffs_cpp, samps_per_buff, (*md)->rx_metadata_cpp, timeout, one_packet);
- )
+ size_t* items_recvd)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::rx_streamer::buffs_type buffs_cpp(buffs, h->streamer->get_num_channels());
+ *items_recvd = h->streamer->recv(
+ buffs_cpp, samps_per_buff, (*md)->rx_metadata_cpp, timeout, one_packet);)
}
uhd_error uhd_rx_streamer_issue_stream_cmd(
- uhd_rx_streamer_handle h,
- const uhd_stream_cmd_t *stream_cmd
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- h->streamer->issue_stream_cmd(stream_cmd_c_to_cpp(stream_cmd));
- )
+ uhd_rx_streamer_handle h, const uhd_stream_cmd_t* stream_cmd)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, h->streamer->issue_stream_cmd(stream_cmd_c_to_cpp(stream_cmd));)
}
uhd_error uhd_rx_streamer_last_error(
- uhd_rx_streamer_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+ uhd_rx_streamer_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
/****************************************************************************
* TX Streamer
***************************************************************************/
static boost::mutex _tx_streamer_make_mutex;
-uhd_error uhd_tx_streamer_make(
- uhd_tx_streamer_handle* h
-){
- UHD_SAFE_C(
- boost::mutex::scoped_lock lock(_tx_streamer_make_mutex);
- (*h) = new uhd_tx_streamer;
- )
+uhd_error uhd_tx_streamer_make(uhd_tx_streamer_handle* h)
+{
+ UHD_SAFE_C(boost::mutex::scoped_lock lock(_tx_streamer_make_mutex);
+ (*h) = new uhd_tx_streamer;)
}
static boost::mutex _tx_streamer_free_mutex;
-uhd_error uhd_tx_streamer_free(
- uhd_tx_streamer_handle* h
-){
- UHD_SAFE_C(
- boost::mutex::scoped_lock lock(_tx_streamer_free_mutex);
- delete *h;
- *h = NULL;
- )
+uhd_error uhd_tx_streamer_free(uhd_tx_streamer_handle* h)
+{
+ UHD_SAFE_C(boost::mutex::scoped_lock lock(_tx_streamer_free_mutex); delete *h;
+ *h = NULL;)
}
-uhd_error uhd_tx_streamer_num_channels(
- uhd_tx_streamer_handle h,
- size_t *num_channels_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *num_channels_out = h->streamer->get_num_channels();
- )
+uhd_error uhd_tx_streamer_num_channels(uhd_tx_streamer_handle h, size_t* num_channels_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *num_channels_out = h->streamer->get_num_channels();)
}
uhd_error uhd_tx_streamer_max_num_samps(
- uhd_tx_streamer_handle h,
- size_t *max_num_samps_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *max_num_samps_out = h->streamer->get_max_num_samps();
- )
+ uhd_tx_streamer_handle h, size_t* max_num_samps_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *max_num_samps_out = h->streamer->get_max_num_samps();)
}
-uhd_error uhd_tx_streamer_send(
- uhd_tx_streamer_handle h,
- const void **buffs,
+uhd_error uhd_tx_streamer_send(uhd_tx_streamer_handle h,
+ const void** buffs,
size_t samps_per_buff,
- uhd_tx_metadata_handle *md,
+ uhd_tx_metadata_handle* md,
double timeout,
- size_t *items_sent
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::tx_streamer::buffs_type buffs_cpp(buffs, h->streamer->get_num_channels());
+ size_t* items_sent)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::tx_streamer::buffs_type buffs_cpp(buffs, h->streamer->get_num_channels());
*items_sent = h->streamer->send(
- buffs_cpp,
- samps_per_buff,
- (*md)->tx_metadata_cpp,
- timeout
- );
- )
+ buffs_cpp, samps_per_buff, (*md)->tx_metadata_cpp, timeout);)
}
-uhd_error uhd_tx_streamer_recv_async_msg(
- uhd_tx_streamer_handle h,
- uhd_async_metadata_handle *md,
+uhd_error uhd_tx_streamer_recv_async_msg(uhd_tx_streamer_handle h,
+ uhd_async_metadata_handle* md,
const double timeout,
- bool *valid
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *valid = h->streamer->recv_async_msg((*md)->async_metadata_cpp, timeout);
- )
+ bool* valid)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, *valid = h->streamer->recv_async_msg((*md)->async_metadata_cpp, timeout);)
}
uhd_error uhd_tx_streamer_last_error(
- uhd_tx_streamer_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+ uhd_tx_streamer_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
/****************************************************************************
* Generate / Destroy API calls
***************************************************************************/
static boost::mutex _usrp_find_mutex;
-uhd_error uhd_usrp_find(
- const char* args,
- uhd_string_vector_handle *strings_out
-){
+uhd_error uhd_usrp_find(const char* args, uhd_string_vector_handle* strings_out)
+{
UHD_SAFE_C(
boost::mutex::scoped_lock _lock(_usrp_find_mutex);
- uhd::device_addrs_t devs = uhd::device::find(std::string(args), uhd::device::USRP);
+ uhd::device_addrs_t devs =
+ uhd::device::find(std::string(args), uhd::device::USRP);
(*strings_out)->string_vector_cpp.clear();
- for(const uhd::device_addr_t &dev: devs){
- (*strings_out)->string_vector_cpp.push_back(dev.to_string());
- }
- )
+ for (const uhd::device_addr_t& dev
+ : devs) { (*strings_out)->string_vector_cpp.push_back(dev.to_string()); })
}
static boost::mutex _usrp_make_mutex;
-uhd_error uhd_usrp_make(
- uhd_usrp_handle *h,
- const char *args
-){
- UHD_SAFE_C(
- boost::mutex::scoped_lock lock(_usrp_make_mutex);
+uhd_error uhd_usrp_make(uhd_usrp_handle* h, const char* args)
+{
+ UHD_SAFE_C(boost::mutex::scoped_lock lock(_usrp_make_mutex);
- size_t usrp_count = usrp_ptr::usrp_counter;
- usrp_ptr::usrp_counter++;
+ size_t usrp_count = usrp_ptr::usrp_counter;
+ usrp_ptr::usrp_counter++;
- // Initialize USRP
- uhd::device_addr_t device_addr(args);
- usrp_ptr P;
- P.ptr = uhd::usrp::multi_usrp::make(device_addr);
+ // Initialize USRP
+ uhd::device_addr_t device_addr(args);
+ usrp_ptr P;
+ P.ptr = uhd::usrp::multi_usrp::make(device_addr);
- // Dump into registry
- get_usrp_ptrs()[usrp_count] = P;
+ // Dump into registry
+ get_usrp_ptrs()[usrp_count] = P;
- // Update handle
- (*h) = new uhd_usrp;
- (*h)->usrp_index = usrp_count;
- )
+ // Update handle
+ (*h) = new uhd_usrp;
+ (*h)->usrp_index = usrp_count;)
}
static boost::mutex _usrp_free_mutex;
-uhd_error uhd_usrp_free(
- uhd_usrp_handle *h
-){
+uhd_error uhd_usrp_free(uhd_usrp_handle* h)
+{
UHD_SAFE_C(
boost::mutex::scoped_lock lock(_usrp_free_mutex);
- if(!get_usrp_ptrs().count((*h)->usrp_index)){
- return UHD_ERROR_INVALID_DEVICE;
- }
+ if (!get_usrp_ptrs().count((*h)->usrp_index)) { return UHD_ERROR_INVALID_DEVICE; }
- get_usrp_ptrs().erase((*h)->usrp_index);
+ get_usrp_ptrs()
+ .erase((*h)->usrp_index);
delete *h;
- *h = NULL;
- )
+ *h = NULL;)
}
-uhd_error uhd_usrp_last_error(
- uhd_usrp_handle h,
- char* error_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C(
- memset(error_out, '\0', strbuffer_len);
- strncpy(error_out, h->last_error.c_str(), strbuffer_len);
- )
+uhd_error uhd_usrp_last_error(uhd_usrp_handle h, char* error_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C(memset(error_out, '\0', strbuffer_len);
+ strncpy(error_out, h->last_error.c_str(), strbuffer_len);)
}
static boost::mutex _usrp_get_rx_stream_mutex;
uhd_error uhd_usrp_get_rx_stream(
- uhd_usrp_handle h_u,
- uhd_stream_args_t *stream_args,
- uhd_rx_streamer_handle h_s
-){
- UHD_SAFE_C_SAVE_ERROR(h_s,
- boost::mutex::scoped_lock lock(_usrp_get_rx_stream_mutex);
-
- if(!get_usrp_ptrs().count(h_u->usrp_index)){
+ uhd_usrp_handle h_u, uhd_stream_args_t* stream_args, uhd_rx_streamer_handle h_s)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h_s, boost::mutex::scoped_lock lock(_usrp_get_rx_stream_mutex);
+
+ if (!get_usrp_ptrs().count(h_u->usrp_index)) {
h_s->last_error = "Streamer's device is invalid or expired.";
return UHD_ERROR_INVALID_DEVICE;
}
- usrp_ptr &usrp = get_usrp_ptrs()[h_u->usrp_index];
- h_s->streamer = usrp.ptr->get_rx_stream(stream_args_c_to_cpp(stream_args));
- h_s->usrp_index = h_u->usrp_index;
- )
+ usrp_ptr& usrp = get_usrp_ptrs()[h_u->usrp_index];
+ h_s->streamer = usrp.ptr->get_rx_stream(stream_args_c_to_cpp(stream_args));
+ h_s->usrp_index = h_u->usrp_index;)
}
static boost::mutex _usrp_get_tx_stream_mutex;
uhd_error uhd_usrp_get_tx_stream(
- uhd_usrp_handle h_u,
- uhd_stream_args_t *stream_args,
- uhd_tx_streamer_handle h_s
-){
- UHD_SAFE_C_SAVE_ERROR(h_s,
- boost::mutex::scoped_lock lock(_usrp_get_tx_stream_mutex);
-
- if(!get_usrp_ptrs().count(h_u->usrp_index)){
+ uhd_usrp_handle h_u, uhd_stream_args_t* stream_args, uhd_tx_streamer_handle h_s)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h_s, boost::mutex::scoped_lock lock(_usrp_get_tx_stream_mutex);
+
+ if (!get_usrp_ptrs().count(h_u->usrp_index)) {
h_s->last_error = "Streamer's device is invalid or expired.";
return UHD_ERROR_INVALID_DEVICE;
}
- usrp_ptr &usrp = get_usrp_ptrs()[h_u->usrp_index];
- h_s->streamer = usrp.ptr->get_tx_stream(stream_args_c_to_cpp(stream_args));
- h_s->usrp_index = h_u->usrp_index;
- )
+ usrp_ptr& usrp = get_usrp_ptrs()[h_u->usrp_index];
+ h_s->streamer = usrp.ptr->get_tx_stream(stream_args_c_to_cpp(stream_args));
+ h_s->usrp_index = h_u->usrp_index;)
}
/****************************************************************************
@@ -351,12 +295,10 @@ uhd_error uhd_usrp_get_tx_stream(
out->field = strdup(dict.get(BOOST_STRINGIZE(field)).c_str())
uhd_error uhd_usrp_get_rx_info(
- uhd_usrp_handle h,
- size_t chan,
- uhd_usrp_rx_info_t *info_out
-) {
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::dict<std::string, std::string> rx_info = USRP(h)->get_usrp_rx_info(chan);
+ uhd_usrp_handle h, size_t chan, uhd_usrp_rx_info_t* info_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::dict<std::string, std::string> rx_info = USRP(h)->get_usrp_rx_info(chan);
COPY_INFO_FIELD(info_out, rx_info, mboard_id);
COPY_INFO_FIELD(info_out, rx_info, mboard_name);
@@ -365,17 +307,14 @@ uhd_error uhd_usrp_get_rx_info(
COPY_INFO_FIELD(info_out, rx_info, rx_subdev_name);
COPY_INFO_FIELD(info_out, rx_info, rx_subdev_spec);
COPY_INFO_FIELD(info_out, rx_info, rx_serial);
- COPY_INFO_FIELD(info_out, rx_info, rx_antenna);
- )
+ COPY_INFO_FIELD(info_out, rx_info, rx_antenna);)
}
uhd_error uhd_usrp_get_tx_info(
- uhd_usrp_handle h,
- size_t chan,
- uhd_usrp_tx_info_t *info_out
-) {
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::dict<std::string, std::string> tx_info = USRP(h)->get_usrp_tx_info(chan);
+ uhd_usrp_handle h, size_t chan, uhd_usrp_tx_info_t* info_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::dict<std::string, std::string> tx_info = USRP(h)->get_usrp_tx_info(chan);
COPY_INFO_FIELD(info_out, tx_info, mboard_id);
COPY_INFO_FIELD(info_out, tx_info, mboard_name);
@@ -384,268 +323,178 @@ uhd_error uhd_usrp_get_tx_info(
COPY_INFO_FIELD(info_out, tx_info, tx_subdev_name);
COPY_INFO_FIELD(info_out, tx_info, tx_subdev_spec);
COPY_INFO_FIELD(info_out, tx_info, tx_serial);
- COPY_INFO_FIELD(info_out, tx_info, tx_antenna);
- )
+ COPY_INFO_FIELD(info_out, tx_info, tx_antenna);)
}
/****************************************************************************
* Motherboard methods
***************************************************************************/
-uhd_error uhd_usrp_set_master_clock_rate(
- uhd_usrp_handle h,
- double rate,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_master_clock_rate(rate, mboard);
- )
+uhd_error uhd_usrp_set_master_clock_rate(uhd_usrp_handle h, double rate, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_master_clock_rate(rate, mboard);)
}
uhd_error uhd_usrp_get_master_clock_rate(
- uhd_usrp_handle h,
- size_t mboard,
- double *clock_rate_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *clock_rate_out = USRP(h)->get_master_clock_rate(mboard);
- )
+ uhd_usrp_handle h, size_t mboard, double* clock_rate_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *clock_rate_out = USRP(h)->get_master_clock_rate(mboard);)
}
uhd_error uhd_usrp_get_pp_string(
- uhd_usrp_handle h,
- char* pp_string_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(pp_string_out, USRP(h)->get_pp_string().c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, char* pp_string_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, strncpy(pp_string_out, USRP(h)->get_pp_string().c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_mboard_name(
- uhd_usrp_handle h,
- size_t mboard,
- char* mboard_name_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(mboard_name_out, USRP(h)->get_mboard_name(mboard).c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t mboard, char* mboard_name_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ strncpy(
+ mboard_name_out, USRP(h)->get_mboard_name(mboard).c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_time_now(
- uhd_usrp_handle h,
- size_t mboard,
- int64_t *full_secs_out,
- double *frac_secs_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp = USRP(h)->get_time_now(mboard);
+ uhd_usrp_handle h, size_t mboard, int64_t* full_secs_out, double* frac_secs_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::time_spec_t time_spec_cpp = USRP(h)->get_time_now(mboard);
*full_secs_out = time_spec_cpp.get_full_secs();
- *frac_secs_out = time_spec_cpp.get_frac_secs();
- )
+ *frac_secs_out = time_spec_cpp.get_frac_secs();)
}
uhd_error uhd_usrp_get_time_last_pps(
- uhd_usrp_handle h,
- size_t mboard,
- int64_t *full_secs_out,
- double *frac_secs_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp = USRP(h)->get_time_last_pps(mboard);
+ uhd_usrp_handle h, size_t mboard, int64_t* full_secs_out, double* frac_secs_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::time_spec_t time_spec_cpp = USRP(h)->get_time_last_pps(mboard);
*full_secs_out = time_spec_cpp.get_full_secs();
- *frac_secs_out = time_spec_cpp.get_frac_secs();
- )
+ *frac_secs_out = time_spec_cpp.get_frac_secs();)
}
uhd_error uhd_usrp_set_time_now(
- uhd_usrp_handle h,
- int64_t full_secs,
- double frac_secs,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
- USRP(h)->set_time_now(time_spec_cpp, mboard);
- )
+ uhd_usrp_handle h, int64_t full_secs, double frac_secs, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
+ USRP(h)->set_time_now(time_spec_cpp, mboard);)
}
uhd_error uhd_usrp_set_time_next_pps(
- uhd_usrp_handle h,
- int64_t full_secs,
- double frac_secs,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
- USRP(h)->set_time_next_pps(time_spec_cpp, mboard);
- )
+ uhd_usrp_handle h, int64_t full_secs, double frac_secs, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
+ USRP(h)->set_time_next_pps(time_spec_cpp, mboard);)
}
uhd_error uhd_usrp_set_time_unknown_pps(
- uhd_usrp_handle h,
- int64_t full_secs,
- double frac_secs
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
- USRP(h)->set_time_unknown_pps(time_spec_cpp);
- )
+ uhd_usrp_handle h, int64_t full_secs, double frac_secs)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
+ USRP(h)->set_time_unknown_pps(time_spec_cpp);)
}
-uhd_error uhd_usrp_get_time_synchronized(
- uhd_usrp_handle h,
- bool *result_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *result_out = USRP(h)->get_time_synchronized();
- return UHD_ERROR_NONE;
- )
+uhd_error uhd_usrp_get_time_synchronized(uhd_usrp_handle h, bool* result_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *result_out = USRP(h)->get_time_synchronized();
+ return UHD_ERROR_NONE;)
}
uhd_error uhd_usrp_set_command_time(
- uhd_usrp_handle h,
- int64_t full_secs,
- double frac_secs,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
- USRP(h)->set_command_time(time_spec_cpp, mboard);
- )
+ uhd_usrp_handle h, int64_t full_secs, double frac_secs, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, uhd::time_spec_t time_spec_cpp(full_secs, frac_secs);
+ USRP(h)->set_command_time(time_spec_cpp, mboard);)
}
-uhd_error uhd_usrp_clear_command_time(
- uhd_usrp_handle h,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->clear_command_time(mboard);
- )
+uhd_error uhd_usrp_clear_command_time(uhd_usrp_handle h, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->clear_command_time(mboard);)
}
uhd_error uhd_usrp_set_time_source(
- uhd_usrp_handle h,
- const char* time_source,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_time_source(std::string(time_source), mboard);
- )
+ uhd_usrp_handle h, const char* time_source, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_time_source(std::string(time_source), mboard);)
}
uhd_error uhd_usrp_get_time_source(
- uhd_usrp_handle h,
- size_t mboard,
- char* time_source_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(time_source_out, USRP(h)->get_time_source(mboard).c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t mboard, char* time_source_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ strncpy(
+ time_source_out, USRP(h)->get_time_source(mboard).c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_time_sources(
- uhd_usrp_handle h,
- size_t mboard,
- uhd_string_vector_handle *time_sources_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*time_sources_out)->string_vector_cpp = USRP(h)->get_time_sources(mboard);
- )
+ uhd_usrp_handle h, size_t mboard, uhd_string_vector_handle* time_sources_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*time_sources_out)->string_vector_cpp = USRP(h)->get_time_sources(mboard);)
}
uhd_error uhd_usrp_set_clock_source(
- uhd_usrp_handle h,
- const char* clock_source,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_clock_source(std::string(clock_source), mboard);
- )
+ uhd_usrp_handle h, const char* clock_source, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, USRP(h)->set_clock_source(std::string(clock_source), mboard);)
}
uhd_error uhd_usrp_get_clock_source(
- uhd_usrp_handle h,
- size_t mboard,
- char* clock_source_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(clock_source_out, USRP(h)->get_clock_source(mboard).c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t mboard, char* clock_source_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ strncpy(
+ clock_source_out, USRP(h)->get_clock_source(mboard).c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_clock_sources(
- uhd_usrp_handle h,
- size_t mboard,
- uhd_string_vector_handle *clock_sources_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*clock_sources_out)->string_vector_cpp = USRP(h)->get_clock_sources(mboard);
- )
+ uhd_usrp_handle h, size_t mboard, uhd_string_vector_handle* clock_sources_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*clock_sources_out)->string_vector_cpp = USRP(h)->get_clock_sources(mboard);)
}
-uhd_error uhd_usrp_set_clock_source_out(
- uhd_usrp_handle h,
- bool enb,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_clock_source_out(enb, mboard);
- )
+uhd_error uhd_usrp_set_clock_source_out(uhd_usrp_handle h, bool enb, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_clock_source_out(enb, mboard);)
}
-uhd_error uhd_usrp_set_time_source_out(
- uhd_usrp_handle h,
- bool enb,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_time_source_out(enb, mboard);
- )
+uhd_error uhd_usrp_set_time_source_out(uhd_usrp_handle h, bool enb, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_time_source_out(enb, mboard);)
}
-uhd_error uhd_usrp_get_num_mboards(
- uhd_usrp_handle h,
- size_t *num_mboards_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *num_mboards_out = USRP(h)->get_num_mboards();
- )
+uhd_error uhd_usrp_get_num_mboards(uhd_usrp_handle h, size_t* num_mboards_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *num_mboards_out = USRP(h)->get_num_mboards();)
}
-uhd_error uhd_usrp_get_mboard_sensor(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_mboard_sensor(uhd_usrp_handle h,
const char* name,
size_t mboard,
- uhd_sensor_value_handle *sensor_value_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- delete (*sensor_value_out)->sensor_value_cpp;
- (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(USRP(h)->get_mboard_sensor(name, mboard));
- )
+ uhd_sensor_value_handle* sensor_value_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, delete (*sensor_value_out)->sensor_value_cpp;
+ (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(
+ USRP(h)->get_mboard_sensor(name, mboard));)
}
uhd_error uhd_usrp_get_mboard_sensor_names(
- uhd_usrp_handle h,
- size_t mboard,
- uhd_string_vector_handle *mboard_sensor_names_out
-){
+ uhd_usrp_handle h, size_t mboard, uhd_string_vector_handle* mboard_sensor_names_out)
+{
UHD_SAFE_C_SAVE_ERROR(h,
- (*mboard_sensor_names_out)->string_vector_cpp = USRP(h)->get_mboard_sensor_names(mboard);
- )
+ (*mboard_sensor_names_out)->string_vector_cpp =
+ USRP(h)->get_mboard_sensor_names(mboard);)
}
uhd_error uhd_usrp_set_user_register(
- uhd_usrp_handle h,
- uint8_t addr,
- uint32_t data,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_user_register(addr, data, mboard);
- )
+ uhd_usrp_handle h, uint8_t addr, uint32_t data, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_user_register(addr, data, mboard);)
}
/****************************************************************************
@@ -653,63 +502,57 @@ uhd_error uhd_usrp_set_user_register(
***************************************************************************/
uhd_error uhd_usrp_get_mboard_eeprom(
- uhd_usrp_handle h,
- uhd_mboard_eeprom_handle mb_eeprom,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/eeprom")
- % mboard);
+ uhd_usrp_handle h, uhd_mboard_eeprom_handle mb_eeprom, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/eeprom") % mboard);
uhd::property_tree::sptr ptree = USRP(h)->get_device()->get_tree();
- mb_eeprom->mboard_eeprom_cpp = ptree->access<uhd::usrp::mboard_eeprom_t>(eeprom_path).get();
- )
+ mb_eeprom->mboard_eeprom_cpp =
+ ptree->access<uhd::usrp::mboard_eeprom_t>(eeprom_path).get();)
}
uhd_error uhd_usrp_set_mboard_eeprom(
- uhd_usrp_handle h,
- uhd_mboard_eeprom_handle mb_eeprom,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/eeprom")
- % mboard);
+ uhd_usrp_handle h, uhd_mboard_eeprom_handle mb_eeprom, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/eeprom") % mboard);
uhd::property_tree::sptr ptree = USRP(h)->get_device()->get_tree();
- ptree->access<uhd::usrp::mboard_eeprom_t>(eeprom_path).set(mb_eeprom->mboard_eeprom_cpp);
- )
+ ptree->access<uhd::usrp::mboard_eeprom_t>(eeprom_path)
+ .set(mb_eeprom->mboard_eeprom_cpp);)
}
-uhd_error uhd_usrp_get_dboard_eeprom(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_dboard_eeprom(uhd_usrp_handle h,
uhd_dboard_eeprom_handle db_eeprom,
const char* unit,
const char* slot,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/dboards/%s/%s_eeprom")
- % mboard % slot % unit);
+ size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ uhd::fs_path eeprom_path =
+ str(boost::format("/mboards/%d/dboards/%s/%s_eeprom") % mboard % slot % unit);
uhd::property_tree::sptr ptree = USRP(h)->get_device()->get_tree();
- db_eeprom->dboard_eeprom_cpp = ptree->access<uhd::usrp::dboard_eeprom_t>(eeprom_path).get();
- )
+ db_eeprom->dboard_eeprom_cpp =
+ ptree->access<uhd::usrp::dboard_eeprom_t>(eeprom_path).get();)
}
-uhd_error uhd_usrp_set_dboard_eeprom(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_set_dboard_eeprom(uhd_usrp_handle h,
uhd_dboard_eeprom_handle db_eeprom,
const char* unit,
const char* slot,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::fs_path eeprom_path = str(boost::format("/mboards/%d/dboards/%s/%s_eeprom")
- % mboard % slot % unit);
+ size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ uhd::fs_path eeprom_path =
+ str(boost::format("/mboards/%d/dboards/%s/%s_eeprom") % mboard % slot % unit);
uhd::property_tree::sptr ptree = USRP(h)->get_device()->get_tree();
- ptree->access<uhd::usrp::dboard_eeprom_t>(eeprom_path).set(db_eeprom->dboard_eeprom_cpp);
- )
+ ptree->access<uhd::usrp::dboard_eeprom_t>(eeprom_path)
+ .set(db_eeprom->dboard_eeprom_cpp);)
}
/****************************************************************************
@@ -717,395 +560,252 @@ uhd_error uhd_usrp_set_dboard_eeprom(
***************************************************************************/
uhd_error uhd_usrp_set_rx_subdev_spec(
- uhd_usrp_handle h,
- uhd_subdev_spec_handle subdev_spec,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_subdev_spec(subdev_spec->subdev_spec_cpp, mboard);
- )
+ uhd_usrp_handle h, uhd_subdev_spec_handle subdev_spec, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, USRP(h)->set_rx_subdev_spec(subdev_spec->subdev_spec_cpp, mboard);)
}
uhd_error uhd_usrp_get_rx_subdev_spec(
- uhd_usrp_handle h,
- size_t mboard,
- uhd_subdev_spec_handle subdev_spec_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- subdev_spec_out->subdev_spec_cpp = USRP(h)->get_rx_subdev_spec(mboard);
- )
+ uhd_usrp_handle h, size_t mboard, uhd_subdev_spec_handle subdev_spec_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, subdev_spec_out->subdev_spec_cpp = USRP(h)->get_rx_subdev_spec(mboard);)
}
-uhd_error uhd_usrp_get_rx_num_channels(
- uhd_usrp_handle h,
- size_t *num_channels_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *num_channels_out = USRP(h)->get_rx_num_channels();
- )
+uhd_error uhd_usrp_get_rx_num_channels(uhd_usrp_handle h, size_t* num_channels_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *num_channels_out = USRP(h)->get_rx_num_channels();)
}
uhd_error uhd_usrp_get_rx_subdev_name(
- uhd_usrp_handle h,
- size_t chan,
- char* rx_subdev_name_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string rx_subdev_name = USRP(h)->get_rx_subdev_name(chan);
- strncpy(rx_subdev_name_out, rx_subdev_name.c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t chan, char* rx_subdev_name_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string rx_subdev_name = USRP(h)->get_rx_subdev_name(chan);
+ strncpy(rx_subdev_name_out, rx_subdev_name.c_str(), strbuffer_len);)
}
-uhd_error uhd_usrp_set_rx_rate(
- uhd_usrp_handle h,
- double rate,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_rate(rate, chan);
- )
+uhd_error uhd_usrp_set_rx_rate(uhd_usrp_handle h, double rate, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_rate(rate, chan);)
}
-uhd_error uhd_usrp_get_rx_rate(
- uhd_usrp_handle h,
- size_t chan,
- double *rate_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *rate_out = USRP(h)->get_rx_rate(chan);
- )
+uhd_error uhd_usrp_get_rx_rate(uhd_usrp_handle h, size_t chan, double* rate_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *rate_out = USRP(h)->get_rx_rate(chan);)
}
uhd_error uhd_usrp_get_rx_rates(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle rates_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- rates_out->meta_range_cpp = USRP(h)->get_rx_rates(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle rates_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, rates_out->meta_range_cpp = USRP(h)->get_rx_rates(chan);)
}
-uhd_error uhd_usrp_set_rx_freq(
- uhd_usrp_handle h,
- uhd_tune_request_t *tune_request,
+uhd_error uhd_usrp_set_rx_freq(uhd_usrp_handle h,
+ uhd_tune_request_t* tune_request,
size_t chan,
- uhd_tune_result_t *tune_result
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::tune_request_t tune_request_cpp = uhd_tune_request_c_to_cpp(tune_request);
+ uhd_tune_result_t* tune_result)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::tune_request_t tune_request_cpp = uhd_tune_request_c_to_cpp(tune_request);
uhd::tune_result_t tune_result_cpp = USRP(h)->set_rx_freq(tune_request_cpp, chan);
- uhd_tune_result_cpp_to_c(tune_result_cpp, tune_result);
- )
+ uhd_tune_result_cpp_to_c(tune_result_cpp, tune_result);)
}
-uhd_error uhd_usrp_get_rx_freq(
- uhd_usrp_handle h,
- size_t chan,
- double *freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *freq_out = USRP(h)->get_rx_freq(chan);
- )
+uhd_error uhd_usrp_get_rx_freq(uhd_usrp_handle h, size_t chan, double* freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *freq_out = USRP(h)->get_rx_freq(chan);)
}
uhd_error uhd_usrp_get_rx_freq_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle freq_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- freq_range_out->meta_range_cpp = USRP(h)->get_rx_freq_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle freq_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, freq_range_out->meta_range_cpp = USRP(h)->get_rx_freq_range(chan);)
}
uhd_error uhd_usrp_get_fe_rx_freq_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle freq_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- freq_range_out->meta_range_cpp = USRP(h)->get_fe_rx_freq_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle freq_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, freq_range_out->meta_range_cpp = USRP(h)->get_fe_rx_freq_range(chan);)
}
UHD_API uhd_error uhd_usrp_get_rx_lo_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *rx_lo_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*rx_lo_names_out)->string_vector_cpp = USRP(h)->get_rx_lo_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* rx_lo_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*rx_lo_names_out)->string_vector_cpp = USRP(h)->get_rx_lo_names(chan);)
}
UHD_API uhd_error uhd_usrp_set_rx_lo_source(
- uhd_usrp_handle h,
- const char* src,
- const char* name,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_lo_source(src, name, chan);
- )
+ uhd_usrp_handle h, const char* src, const char* name, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_lo_source(src, name, chan);)
}
-UHD_API uhd_error uhd_usrp_get_rx_lo_source(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_get_rx_lo_source(uhd_usrp_handle h,
const char* name,
size_t chan,
char* rx_lo_source_out,
- size_t strbuffer_len
-){
+ size_t strbuffer_len)
+{
UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(rx_lo_source_out, USRP(h)->get_rx_lo_source(name, chan).c_str(), strbuffer_len);
- )
+ strncpy(rx_lo_source_out,
+ USRP(h)->get_rx_lo_source(name, chan).c_str(),
+ strbuffer_len);)
}
-UHD_API uhd_error uhd_usrp_get_rx_lo_sources(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_get_rx_lo_sources(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_string_vector_handle *rx_lo_sources_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*rx_lo_sources_out)->string_vector_cpp = USRP(h)->get_rx_lo_sources(name, chan);
- )
+ uhd_string_vector_handle* rx_lo_sources_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ (*rx_lo_sources_out)->string_vector_cpp = USRP(h)->get_rx_lo_sources(name, chan);)
}
UHD_API uhd_error uhd_usrp_set_rx_lo_export_enabled(
- uhd_usrp_handle h,
- bool enabled,
- const char* name,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_lo_export_enabled(enabled, name, chan);
- )
+ uhd_usrp_handle h, bool enabled, const char* name, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_lo_export_enabled(enabled, name, chan);)
}
UHD_API uhd_error uhd_usrp_get_rx_lo_export_enabled(
- uhd_usrp_handle h,
- const char* name,
- size_t chan,
- bool* result_out
-) {
- UHD_SAFE_C_SAVE_ERROR(h,
- *result_out = USRP(h)->get_rx_lo_export_enabled(name, chan);
- )
+ uhd_usrp_handle h, const char* name, size_t chan, bool* result_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *result_out = USRP(h)->get_rx_lo_export_enabled(name, chan);)
}
-UHD_API uhd_error uhd_usrp_set_rx_lo_freq(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_set_rx_lo_freq(uhd_usrp_handle h,
double freq,
const char* name,
size_t chan,
- double* coerced_freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *coerced_freq_out = USRP(h)->set_rx_lo_freq(freq, name, chan);
- )
+ double* coerced_freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, *coerced_freq_out = USRP(h)->set_rx_lo_freq(freq, name, chan);)
}
UHD_API uhd_error uhd_usrp_get_rx_lo_freq(
- uhd_usrp_handle h,
- const char* name,
- size_t chan,
- double* rx_lo_freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *rx_lo_freq_out = USRP(h)->get_rx_lo_freq(name, chan);
- )
+ uhd_usrp_handle h, const char* name, size_t chan, double* rx_lo_freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *rx_lo_freq_out = USRP(h)->get_rx_lo_freq(name, chan);)
}
uhd_error uhd_usrp_set_rx_gain(
- uhd_usrp_handle h,
- double gain,
- size_t chan,
- const char *gain_name
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string name(gain_name);
- if(name.empty()){
- USRP(h)->set_rx_gain(gain, chan);
- }
- else{
- USRP(h)->set_rx_gain(gain, name, chan);
- }
- )
+ uhd_usrp_handle h, double gain, size_t chan, const char* gain_name)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string name(gain_name);
+ if (name.empty()) { USRP(h)->set_rx_gain(gain, chan); } else {
+ USRP(h)->set_rx_gain(gain, name, chan);
+ })
}
-uhd_error uhd_usrp_set_normalized_rx_gain(
- uhd_usrp_handle h,
- double gain,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_normalized_rx_gain(gain, chan);
- )
+uhd_error uhd_usrp_set_normalized_rx_gain(uhd_usrp_handle h, double gain, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_normalized_rx_gain(gain, chan);)
}
-uhd_error uhd_usrp_set_rx_agc(
- uhd_usrp_handle h,
- bool enable,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_agc(enable, chan);
- )
+uhd_error uhd_usrp_set_rx_agc(uhd_usrp_handle h, bool enable, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_agc(enable, chan);)
}
uhd_error uhd_usrp_get_rx_gain(
- uhd_usrp_handle h,
- size_t chan,
- const char *gain_name,
- double *gain_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string name(gain_name);
- if(name.empty()){
+ uhd_usrp_handle h, size_t chan, const char* gain_name, double* gain_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string name(gain_name); if (name.empty()) {
*gain_out = USRP(h)->get_rx_gain(chan);
- }
- else{
- *gain_out = USRP(h)->get_rx_gain(name, chan);
- }
- )
+ } else { *gain_out = USRP(h)->get_rx_gain(name, chan); })
}
uhd_error uhd_usrp_get_normalized_rx_gain(
- uhd_usrp_handle h,
- size_t chan,
- double *gain_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *gain_out = USRP(h)->get_normalized_rx_gain(chan);
- )
+ uhd_usrp_handle h, size_t chan, double* gain_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *gain_out = USRP(h)->get_normalized_rx_gain(chan);)
}
-uhd_error uhd_usrp_get_rx_gain_range(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_rx_gain_range(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_meta_range_handle gain_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- gain_range_out->meta_range_cpp = USRP(h)->get_rx_gain_range(name, chan);
- )
+ uhd_meta_range_handle gain_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, gain_range_out->meta_range_cpp = USRP(h)->get_rx_gain_range(name, chan);)
}
uhd_error uhd_usrp_get_rx_gain_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *gain_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*gain_names_out)->string_vector_cpp = USRP(h)->get_rx_gain_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* gain_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*gain_names_out)->string_vector_cpp = USRP(h)->get_rx_gain_names(chan);)
}
-uhd_error uhd_usrp_set_rx_antenna(
- uhd_usrp_handle h,
- const char* ant,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_antenna(std::string(ant), chan);
- )
+uhd_error uhd_usrp_set_rx_antenna(uhd_usrp_handle h, const char* ant, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_antenna(std::string(ant), chan);)
}
uhd_error uhd_usrp_get_rx_antenna(
- uhd_usrp_handle h,
- size_t chan,
- char* ant_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string rx_antenna = USRP(h)->get_rx_antenna(chan);
- strncpy(ant_out, rx_antenna.c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t chan, char* ant_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string rx_antenna = USRP(h)->get_rx_antenna(chan);
+ strncpy(ant_out, rx_antenna.c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_rx_antennas(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *antennas_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*antennas_out)->string_vector_cpp = USRP(h)->get_rx_antennas(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* antennas_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*antennas_out)->string_vector_cpp = USRP(h)->get_rx_antennas(chan);)
}
-uhd_error uhd_usrp_set_rx_bandwidth(
- uhd_usrp_handle h,
- double bandwidth,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_bandwidth(bandwidth, chan);
- )
+uhd_error uhd_usrp_set_rx_bandwidth(uhd_usrp_handle h, double bandwidth, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_bandwidth(bandwidth, chan);)
}
-uhd_error uhd_usrp_get_rx_bandwidth(
- uhd_usrp_handle h,
- size_t chan,
- double *bandwidth_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *bandwidth_out = USRP(h)->get_rx_bandwidth(chan);
- )
+uhd_error uhd_usrp_get_rx_bandwidth(uhd_usrp_handle h, size_t chan, double* bandwidth_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *bandwidth_out = USRP(h)->get_rx_bandwidth(chan);)
}
uhd_error uhd_usrp_get_rx_bandwidth_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle bandwidth_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- bandwidth_range_out->meta_range_cpp = USRP(h)->get_rx_bandwidth_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle bandwidth_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, bandwidth_range_out->meta_range_cpp = USRP(h)->get_rx_bandwidth_range(chan);)
}
-uhd_error uhd_usrp_get_rx_sensor(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_rx_sensor(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_sensor_value_handle *sensor_value_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- delete (*sensor_value_out)->sensor_value_cpp;
- (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(USRP(h)->get_rx_sensor(name, chan));
- )
+ uhd_sensor_value_handle* sensor_value_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, delete (*sensor_value_out)->sensor_value_cpp;
+ (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(
+ USRP(h)->get_rx_sensor(name, chan));)
}
uhd_error uhd_usrp_get_rx_sensor_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *sensor_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*sensor_names_out)->string_vector_cpp = USRP(h)->get_rx_sensor_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* sensor_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*sensor_names_out)->string_vector_cpp = USRP(h)->get_rx_sensor_names(chan);)
}
-uhd_error uhd_usrp_set_rx_dc_offset_enabled(
- uhd_usrp_handle h,
- bool enb,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_dc_offset(enb, chan);
- )
+uhd_error uhd_usrp_set_rx_dc_offset_enabled(uhd_usrp_handle h, bool enb, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_dc_offset(enb, chan);)
}
-uhd_error uhd_usrp_set_rx_iq_balance_enabled(
- uhd_usrp_handle h,
- bool enb,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_rx_iq_balance(enb, chan);
- )
+uhd_error uhd_usrp_set_rx_iq_balance_enabled(uhd_usrp_handle h, bool enb, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_rx_iq_balance(enb, chan);)
}
/****************************************************************************
@@ -1113,366 +813,238 @@ uhd_error uhd_usrp_set_rx_iq_balance_enabled(
***************************************************************************/
uhd_error uhd_usrp_set_tx_subdev_spec(
- uhd_usrp_handle h,
- uhd_subdev_spec_handle subdev_spec,
- size_t mboard
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_subdev_spec(subdev_spec->subdev_spec_cpp, mboard);
- )
+ uhd_usrp_handle h, uhd_subdev_spec_handle subdev_spec, size_t mboard)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, USRP(h)->set_tx_subdev_spec(subdev_spec->subdev_spec_cpp, mboard);)
}
uhd_error uhd_usrp_get_tx_subdev_spec(
- uhd_usrp_handle h,
- size_t mboard,
- uhd_subdev_spec_handle subdev_spec_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- subdev_spec_out->subdev_spec_cpp = USRP(h)->get_tx_subdev_spec(mboard);
- )
+ uhd_usrp_handle h, size_t mboard, uhd_subdev_spec_handle subdev_spec_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, subdev_spec_out->subdev_spec_cpp = USRP(h)->get_tx_subdev_spec(mboard);)
}
-uhd_error uhd_usrp_get_tx_num_channels(
- uhd_usrp_handle h,
- size_t *num_channels_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *num_channels_out = USRP(h)->get_tx_num_channels();
- )
+uhd_error uhd_usrp_get_tx_num_channels(uhd_usrp_handle h, size_t* num_channels_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *num_channels_out = USRP(h)->get_tx_num_channels();)
}
uhd_error uhd_usrp_get_tx_subdev_name(
- uhd_usrp_handle h,
- size_t chan,
- char* tx_subdev_name_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string tx_subdev_name = USRP(h)->get_tx_subdev_name(chan);
- strncpy(tx_subdev_name_out, tx_subdev_name.c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t chan, char* tx_subdev_name_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string tx_subdev_name = USRP(h)->get_tx_subdev_name(chan);
+ strncpy(tx_subdev_name_out, tx_subdev_name.c_str(), strbuffer_len);)
}
-uhd_error uhd_usrp_set_tx_rate(
- uhd_usrp_handle h,
- double rate,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_rate(rate, chan);
- )
+uhd_error uhd_usrp_set_tx_rate(uhd_usrp_handle h, double rate, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_tx_rate(rate, chan);)
}
-uhd_error uhd_usrp_get_tx_rate(
- uhd_usrp_handle h,
- size_t chan,
- double *rate_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *rate_out = USRP(h)->get_tx_rate(chan);
- )
+uhd_error uhd_usrp_get_tx_rate(uhd_usrp_handle h, size_t chan, double* rate_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *rate_out = USRP(h)->get_tx_rate(chan);)
}
uhd_error uhd_usrp_get_tx_rates(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle rates_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- rates_out->meta_range_cpp = USRP(h)->get_tx_rates(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle rates_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, rates_out->meta_range_cpp = USRP(h)->get_tx_rates(chan);)
}
-uhd_error uhd_usrp_set_tx_freq(
- uhd_usrp_handle h,
- uhd_tune_request_t *tune_request,
+uhd_error uhd_usrp_set_tx_freq(uhd_usrp_handle h,
+ uhd_tune_request_t* tune_request,
size_t chan,
- uhd_tune_result_t *tune_result
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- uhd::tune_request_t tune_request_cpp = uhd_tune_request_c_to_cpp(tune_request);
+ uhd_tune_result_t* tune_result)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, uhd::tune_request_t tune_request_cpp = uhd_tune_request_c_to_cpp(tune_request);
uhd::tune_result_t tune_result_cpp = USRP(h)->set_tx_freq(tune_request_cpp, chan);
- uhd_tune_result_cpp_to_c(tune_result_cpp, tune_result);
- )
+ uhd_tune_result_cpp_to_c(tune_result_cpp, tune_result);)
}
-uhd_error uhd_usrp_get_tx_freq(
- uhd_usrp_handle h,
- size_t chan,
- double *freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *freq_out = USRP(h)->get_tx_freq(chan);
- )
+uhd_error uhd_usrp_get_tx_freq(uhd_usrp_handle h, size_t chan, double* freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *freq_out = USRP(h)->get_tx_freq(chan);)
}
uhd_error uhd_usrp_get_tx_freq_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle freq_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- freq_range_out->meta_range_cpp = USRP(h)->get_tx_freq_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle freq_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, freq_range_out->meta_range_cpp = USRP(h)->get_tx_freq_range(chan);)
}
uhd_error uhd_usrp_get_fe_tx_freq_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle freq_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- freq_range_out->meta_range_cpp = USRP(h)->get_fe_tx_freq_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle freq_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, freq_range_out->meta_range_cpp = USRP(h)->get_fe_tx_freq_range(chan);)
}
UHD_API uhd_error uhd_usrp_get_tx_lo_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *tx_lo_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*tx_lo_names_out)->string_vector_cpp = USRP(h)->get_tx_lo_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* tx_lo_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*tx_lo_names_out)->string_vector_cpp = USRP(h)->get_tx_lo_names(chan);)
}
UHD_API uhd_error uhd_usrp_set_tx_lo_source(
- uhd_usrp_handle h,
- const char* src,
- const char* name,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_lo_source(src, name, chan);
- )
+ uhd_usrp_handle h, const char* src, const char* name, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_tx_lo_source(src, name, chan);)
}
-UHD_API uhd_error uhd_usrp_get_tx_lo_source(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_get_tx_lo_source(uhd_usrp_handle h,
const char* name,
size_t chan,
char* tx_lo_source_out,
- size_t strbuffer_len
-){
+ size_t strbuffer_len)
+{
UHD_SAFE_C_SAVE_ERROR(h,
- strncpy(tx_lo_source_out, USRP(h)->get_tx_lo_source(name, chan).c_str(), strbuffer_len);
- )
+ strncpy(tx_lo_source_out,
+ USRP(h)->get_tx_lo_source(name, chan).c_str(),
+ strbuffer_len);)
}
-UHD_API uhd_error uhd_usrp_get_tx_lo_sources(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_get_tx_lo_sources(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_string_vector_handle *tx_lo_sources_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*tx_lo_sources_out)->string_vector_cpp = USRP(h)->get_tx_lo_sources(name, chan);
- )
+ uhd_string_vector_handle* tx_lo_sources_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ (*tx_lo_sources_out)->string_vector_cpp = USRP(h)->get_tx_lo_sources(name, chan);)
}
UHD_API uhd_error uhd_usrp_set_tx_lo_export_enabled(
- uhd_usrp_handle h,
- bool enabled,
- const char* name,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_lo_export_enabled(enabled, name, chan);
- )
+ uhd_usrp_handle h, bool enabled, const char* name, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_tx_lo_export_enabled(enabled, name, chan);)
}
UHD_API uhd_error uhd_usrp_get_tx_lo_export_enabled(
- uhd_usrp_handle h,
- const char* name,
- size_t chan,
- bool* result_out
-) {
- UHD_SAFE_C_SAVE_ERROR(h,
- *result_out = USRP(h)->get_tx_lo_export_enabled(name, chan);
- )
+ uhd_usrp_handle h, const char* name, size_t chan, bool* result_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *result_out = USRP(h)->get_tx_lo_export_enabled(name, chan);)
}
-UHD_API uhd_error uhd_usrp_set_tx_lo_freq(
- uhd_usrp_handle h,
+UHD_API uhd_error uhd_usrp_set_tx_lo_freq(uhd_usrp_handle h,
double freq,
const char* name,
size_t chan,
- double* coerced_freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *coerced_freq_out = USRP(h)->set_tx_lo_freq(freq, name, chan);
- )
+ double* coerced_freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, *coerced_freq_out = USRP(h)->set_tx_lo_freq(freq, name, chan);)
}
UHD_API uhd_error uhd_usrp_get_tx_lo_freq(
- uhd_usrp_handle h,
- const char* name,
- size_t chan,
- double* tx_lo_freq_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *tx_lo_freq_out = USRP(h)->get_tx_lo_freq(name, chan);
- )
+ uhd_usrp_handle h, const char* name, size_t chan, double* tx_lo_freq_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *tx_lo_freq_out = USRP(h)->get_tx_lo_freq(name, chan);)
}
uhd_error uhd_usrp_set_tx_gain(
- uhd_usrp_handle h,
- double gain,
- size_t chan,
- const char *gain_name
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string name(gain_name);
- if(name.empty()){
- USRP(h)->set_tx_gain(gain, chan);
- }
- else{
- USRP(h)->set_tx_gain(gain, name, chan);
- }
- )
+ uhd_usrp_handle h, double gain, size_t chan, const char* gain_name)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string name(gain_name);
+ if (name.empty()) { USRP(h)->set_tx_gain(gain, chan); } else {
+ USRP(h)->set_tx_gain(gain, name, chan);
+ })
}
-uhd_error uhd_usrp_set_normalized_tx_gain(
- uhd_usrp_handle h,
- double gain,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_normalized_tx_gain(gain, chan);
- )
+uhd_error uhd_usrp_set_normalized_tx_gain(uhd_usrp_handle h, double gain, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_normalized_tx_gain(gain, chan);)
}
uhd_error uhd_usrp_get_tx_gain(
- uhd_usrp_handle h,
- size_t chan,
- const char *gain_name,
- double *gain_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string name(gain_name);
- if(name.empty()){
+ uhd_usrp_handle h, size_t chan, const char* gain_name, double* gain_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, std::string name(gain_name); if (name.empty()) {
*gain_out = USRP(h)->get_tx_gain(chan);
- }
- else{
- *gain_out = USRP(h)->get_tx_gain(name, chan);
- }
- )
+ } else { *gain_out = USRP(h)->get_tx_gain(name, chan); })
}
uhd_error uhd_usrp_get_normalized_tx_gain(
- uhd_usrp_handle h,
- size_t chan,
- double *gain_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *gain_out = USRP(h)->get_normalized_tx_gain(chan);
- )
+ uhd_usrp_handle h, size_t chan, double* gain_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *gain_out = USRP(h)->get_normalized_tx_gain(chan);)
}
-uhd_error uhd_usrp_get_tx_gain_range(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_tx_gain_range(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_meta_range_handle gain_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- gain_range_out->meta_range_cpp = USRP(h)->get_tx_gain_range(name, chan);
- )
+ uhd_meta_range_handle gain_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, gain_range_out->meta_range_cpp = USRP(h)->get_tx_gain_range(name, chan);)
}
uhd_error uhd_usrp_get_tx_gain_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *gain_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*gain_names_out)->string_vector_cpp = USRP(h)->get_tx_gain_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* gain_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*gain_names_out)->string_vector_cpp = USRP(h)->get_tx_gain_names(chan);)
}
-uhd_error uhd_usrp_set_tx_antenna(
- uhd_usrp_handle h,
- const char* ant,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_antenna(std::string(ant), chan);
- )
+uhd_error uhd_usrp_set_tx_antenna(uhd_usrp_handle h, const char* ant, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_tx_antenna(std::string(ant), chan);)
}
uhd_error uhd_usrp_get_tx_antenna(
- uhd_usrp_handle h,
- size_t chan,
- char* ant_out,
- size_t strbuffer_len
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- std::string tx_antenna = USRP(h)->get_tx_antenna(chan);
- strncpy(ant_out, tx_antenna.c_str(), strbuffer_len);
- )
+ uhd_usrp_handle h, size_t chan, char* ant_out, size_t strbuffer_len)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, std::string tx_antenna = USRP(h)->get_tx_antenna(chan);
+ strncpy(ant_out, tx_antenna.c_str(), strbuffer_len);)
}
uhd_error uhd_usrp_get_tx_antennas(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *antennas_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*antennas_out)->string_vector_cpp = USRP(h)->get_tx_antennas(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* antennas_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*antennas_out)->string_vector_cpp = USRP(h)->get_tx_antennas(chan);)
}
-uhd_error uhd_usrp_set_tx_bandwidth(
- uhd_usrp_handle h,
- double bandwidth,
- size_t chan
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_tx_bandwidth(bandwidth, chan);
- )
+uhd_error uhd_usrp_set_tx_bandwidth(uhd_usrp_handle h, double bandwidth, size_t chan)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, USRP(h)->set_tx_bandwidth(bandwidth, chan);)
}
-uhd_error uhd_usrp_get_tx_bandwidth(
- uhd_usrp_handle h,
- size_t chan,
- double *bandwidth_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *bandwidth_out = USRP(h)->get_tx_bandwidth(chan);
- )
+uhd_error uhd_usrp_get_tx_bandwidth(uhd_usrp_handle h, size_t chan, double* bandwidth_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, *bandwidth_out = USRP(h)->get_tx_bandwidth(chan);)
}
uhd_error uhd_usrp_get_tx_bandwidth_range(
- uhd_usrp_handle h,
- size_t chan,
- uhd_meta_range_handle bandwidth_range_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- bandwidth_range_out->meta_range_cpp = USRP(h)->get_tx_bandwidth_range(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_meta_range_handle bandwidth_range_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, bandwidth_range_out->meta_range_cpp = USRP(h)->get_tx_bandwidth_range(chan);)
}
-uhd_error uhd_usrp_get_tx_sensor(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_tx_sensor(uhd_usrp_handle h,
const char* name,
size_t chan,
- uhd_sensor_value_handle *sensor_value_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- delete (*sensor_value_out)->sensor_value_cpp;
- (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(USRP(h)->get_tx_sensor(name, chan));
- )
+ uhd_sensor_value_handle* sensor_value_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(h, delete (*sensor_value_out)->sensor_value_cpp;
+ (*sensor_value_out)->sensor_value_cpp = new uhd::sensor_value_t(
+ USRP(h)->get_tx_sensor(name, chan));)
}
uhd_error uhd_usrp_get_tx_sensor_names(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *sensor_names_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*sensor_names_out)->string_vector_cpp = USRP(h)->get_tx_sensor_names(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* sensor_names_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*sensor_names_out)->string_vector_cpp = USRP(h)->get_tx_sensor_names(chan);)
}
/****************************************************************************
@@ -1480,38 +1052,31 @@ uhd_error uhd_usrp_get_tx_sensor_names(
***************************************************************************/
uhd_error uhd_usrp_get_gpio_banks(
- uhd_usrp_handle h,
- size_t chan,
- uhd_string_vector_handle *gpio_banks_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- (*gpio_banks_out)->string_vector_cpp = USRP(h)->get_gpio_banks(chan);
- )
+ uhd_usrp_handle h, size_t chan, uhd_string_vector_handle* gpio_banks_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h, (*gpio_banks_out)->string_vector_cpp = USRP(h)->get_gpio_banks(chan);)
}
-uhd_error uhd_usrp_set_gpio_attr(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_set_gpio_attr(uhd_usrp_handle h,
const char* bank,
const char* attr,
uint32_t value,
uint32_t mask,
- size_t mboard
-){
+ size_t mboard)
+{
UHD_SAFE_C_SAVE_ERROR(h,
- USRP(h)->set_gpio_attr(std::string(bank), std::string(attr),
- value, mask, mboard);
- )
+ USRP(h)->set_gpio_attr(
+ std::string(bank), std::string(attr), value, mask, mboard);)
}
-uhd_error uhd_usrp_get_gpio_attr(
- uhd_usrp_handle h,
+uhd_error uhd_usrp_get_gpio_attr(uhd_usrp_handle h,
const char* bank,
const char* attr,
size_t mboard,
- uint32_t *attr_out
-){
- UHD_SAFE_C_SAVE_ERROR(h,
- *attr_out = USRP(h)->get_gpio_attr(std::string(bank), std::string(attr), mboard);
- )
+ uint32_t* attr_out)
+{
+ UHD_SAFE_C_SAVE_ERROR(
+ h,
+ *attr_out = USRP(h)->get_gpio_attr(std::string(bank), std::string(attr), mboard);)
}
-
diff --git a/host/lib/usrp/x300/x300_defaults.hpp b/host/lib/usrp/x300/x300_defaults.hpp
index ae10bf243..8b1be15c7 100644
--- a/host/lib/usrp/x300/x300_defaults.hpp
+++ b/host/lib/usrp/x300/x300_defaults.hpp
@@ -15,21 +15,21 @@ namespace uhd { namespace usrp { namespace x300 {
static constexpr size_t NIUSRPRIO_DEFAULT_RPC_PORT = 5444;
-static constexpr size_t XB_DST_E0 = 0;
-static constexpr size_t XB_DST_E1 = 1;
-static constexpr size_t XB_DST_PCI = 2;
-static constexpr size_t XB_DST_R0 = 3; // Radio 0 -> Slot A
-static constexpr size_t XB_DST_R1 = 4; // Radio 1 -> Slot B
-static constexpr size_t XB_DST_CE0 = 5;
+static constexpr size_t XB_DST_E0 = 0;
+static constexpr size_t XB_DST_E1 = 1;
+static constexpr size_t XB_DST_PCI = 2;
+static constexpr size_t XB_DST_R0 = 3; // Radio 0 -> Slot A
+static constexpr size_t XB_DST_R1 = 4; // Radio 1 -> Slot B
+static constexpr size_t XB_DST_CE0 = 5;
static constexpr size_t SRC_ADDR0 = 0;
static constexpr size_t SRC_ADDR1 = 1;
static constexpr size_t DST_ADDR = 2;
-static constexpr double DEFAULT_TICK_RATE = 200e6; // Hz
-static constexpr double MAX_TICK_RATE = 200e6; // Hz
-static constexpr double MIN_TICK_RATE = 184.32e6; // Hz
-static constexpr double BUS_CLOCK_RATE = 187.5e6; // Hz
+static constexpr double DEFAULT_TICK_RATE = 200e6; // Hz
+static constexpr double MAX_TICK_RATE = 200e6; // Hz
+static constexpr double MIN_TICK_RATE = 184.32e6; // Hz
+static constexpr double BUS_CLOCK_RATE = 187.5e6; // Hz
static constexpr double DEFAULT_SYSREF_RATE = 10e6;
static const std::string FW_FILE_NAME = "usrp_x300_fw.bin";
@@ -43,8 +43,7 @@ static const std::vector<std::string> CLOCK_SOURCE_OPTIONS{
"internal", "external", "gpsdo"};
static const std::vector<std::string> TIME_SOURCE_OPTIONS{
"internal", "external", "gpsdo"};
-static const std::vector<double> EXTERNAL_FREQ_OPTIONS{
- 10e6, 11.52e6, 23.04e6, 30.72e6};
+static const std::vector<double> EXTERNAL_FREQ_OPTIONS{10e6, 11.52e6, 23.04e6, 30.72e6};
// Limit the number of initialization threads
static const size_t MAX_INIT_THREADS = 10;
diff --git a/host/lib/usrp/x300/x300_device_args.hpp b/host/lib/usrp/x300/x300_device_args.hpp
index 9e9e328a9..6c6680c4f 100644
--- a/host/lib/usrp/x300/x300_device_args.hpp
+++ b/host/lib/usrp/x300/x300_device_args.hpp
@@ -257,8 +257,8 @@ private:
#ifdef HAVE_DPDK
_use_dpdk.set(true);
#else
- UHD_LOG_WARNING("DPDK",
- "Detected use_dpdk argument, but DPDK support not built in.");
+ UHD_LOG_WARNING(
+ "DPDK", "Detected use_dpdk argument, but DPDK support not built in.");
#endif
}
PARSE_DEFAULT(_recv_frame_size)
diff --git a/host/lib/usrp/x300/x300_image_loader.cpp b/host/lib/usrp/x300/x300_image_loader.cpp
index ccd3761df..c8690465b 100644
--- a/host/lib/usrp/x300/x300_image_loader.cpp
+++ b/host/lib/usrp/x300/x300_image_loader.cpp
@@ -233,9 +233,8 @@ static void x300_setup_session(x300_session_t& session,
if (fpga_file_type == "ni-2974") {
fpga_file_type = "x310";
}
- session.filepath = find_image_path(
- str(boost::format("usrp_%s_fpga_%s.bit")
- % fpga_file_type % session.fpga_type));
+ session.filepath = find_image_path(str(boost::format("usrp_%s_fpga_%s.bit")
+ % fpga_file_type % session.fpga_type));
}
} else
session.filepath = filepath;
diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp
index 273485577..a414fd0f1 100644
--- a/host/lib/usrp/x300/x300_impl.cpp
+++ b/host/lib/usrp/x300/x300_impl.cpp
@@ -9,8 +9,8 @@
#include "x300_impl.hpp"
#include "x300_claim.hpp"
#include "x300_eth_mgr.hpp"
-#include "x300_mb_eeprom.hpp"
#include "x300_mb_controller.hpp"
+#include "x300_mb_eeprom.hpp"
#include "x300_mb_eeprom_iface.hpp"
#include "x300_mboard_type.hpp"
#include "x300_pcie_mgr.hpp"
@@ -179,8 +179,7 @@ static void x300_load_fw(wb_iface::sptr fw_reg_ctrl, const std::string& file_nam
UHD_LOGGER_INFO("X300") << "Firmware loaded!";
}
-x300_impl::x300_impl(const uhd::device_addr_t& dev_addr)
- : rfnoc_device()
+x300_impl::x300_impl(const uhd::device_addr_t& dev_addr) : rfnoc_device()
{
UHD_LOGGER_INFO("X300") << "X300 initialization sequence...";
@@ -215,8 +214,8 @@ x300_impl::x300_impl(const uhd::device_addr_t& dev_addr)
void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t& dev_addr)
{
- const fs_path mb_path = fs_path("/mboards") / mb_i;
- mboard_members_t& mb = _mb[mb_i];
+ const fs_path mb_path = fs_path("/mboards") / mb_i;
+ mboard_members_t& mb = _mb[mb_i];
mb.args.parse(dev_addr);
mb.xport_path = dev_addr.has_key("resource") ? xport_path_t::NIRIO
: xport_path_t::ETH;
@@ -483,4 +482,3 @@ void x300_impl::check_fpga_compat(const fs_path& mb_path, const mboard_members_t
"Using FPGA version: " << compat_major << "." << compat_minor
<< " git hash: " << git_hash_str);
}
-
diff --git a/host/lib/usrp/x300/x300_mb_controller.hpp b/host/lib/usrp/x300/x300_mb_controller.hpp
index 92844f1b9..f33d629c7 100644
--- a/host/lib/usrp/x300/x300_mb_controller.hpp
+++ b/host/lib/usrp/x300/x300_mb_controller.hpp
@@ -54,17 +54,26 @@ public:
}
//! Reference to the ZPU peek/poke interface
- uhd::wb_iface::sptr get_zpu_ctrl() { return _zpu_ctrl; }
+ uhd::wb_iface::sptr get_zpu_ctrl()
+ {
+ return _zpu_ctrl;
+ }
//! Return reference to LMK clock controller
- x300_clock_ctrl::sptr get_clock_ctrl() { return _clock_ctrl; }
+ x300_clock_ctrl::sptr get_clock_ctrl()
+ {
+ return _clock_ctrl;
+ }
void register_reset_codec_cb(std::function<void(void)>&& reset_cb)
{
_reset_cbs.push_back(std::move(reset_cb));
}
- void set_initialization_done() { _initialization_done = true; }
+ void set_initialization_done()
+ {
+ _initialization_done = true;
+ }
void register_radio(uhd::usrp::x300::x300_radio_mbc_iface* radio)
{
@@ -80,7 +89,8 @@ public:
class x300_timekeeper : public mb_controller::timekeeper
{
public:
- x300_timekeeper(const size_t tk_idx, uhd::wb_iface::sptr zpu_ctrl, const double tick_rate)
+ x300_timekeeper(
+ const size_t tk_idx, uhd::wb_iface::sptr zpu_ctrl, const double tick_rate)
: _tk_idx(tk_idx), _zpu_ctrl(zpu_ctrl)
{
set_tick_rate(tick_rate);
diff --git a/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp b/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
index 2d08d5711..935f6302d 100644
--- a/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
+++ b/host/lib/usrp/x300/x300_mb_eeprom_iface.hpp
@@ -11,8 +11,8 @@
#include <uhd/config.hpp>
#include <uhd/types/serial.hpp>
#include <uhd/types/wb_iface.hpp>
-#include <memory>
#include <boost/utility.hpp>
+#include <memory>
class x300_mb_eeprom_iface : public uhd::i2c_iface
{
diff --git a/host/lib/usrp/x300/x300_pcie_mgr.cpp b/host/lib/usrp/x300/x300_pcie_mgr.cpp
index d2aad7e3c..d3f4eba27 100644
--- a/host/lib/usrp/x300/x300_pcie_mgr.cpp
+++ b/host/lib/usrp/x300/x300_pcie_mgr.cpp
@@ -29,9 +29,9 @@ using namespace uhd::niusrprio;
namespace {
-//uint32_t extract_sid_from_pkt(void* pkt, size_t)
+// uint32_t extract_sid_from_pkt(void* pkt, size_t)
//{
- //return uhd::sid_t(uhd::wtohx(static_cast<const uint32_t*>(pkt)[1])).get_dst();
+// return uhd::sid_t(uhd::wtohx(static_cast<const uint32_t*>(pkt)[1])).get_dst();
//}
constexpr uint32_t RADIO_DEST_PREFIX_TX = 0;
@@ -42,13 +42,13 @@ constexpr uint32_t RADIO_DEST_PREFIX_TX = 0;
// 64 frames * 256 bytes each aligns with the typical page size of 4096 bytes. Since most
// page sizes are 4096 bytes or some multiple of that, keep the number of frames * frame
// size aligned to it.
-constexpr size_t PCIE_RX_DATA_FRAME_SIZE = 4096; // bytes
-constexpr size_t PCIE_RX_DATA_NUM_FRAMES = 4096;
-constexpr size_t PCIE_TX_DATA_FRAME_SIZE = 4096; // bytes
-constexpr size_t PCIE_TX_DATA_NUM_FRAMES = 4096;
-constexpr size_t PCIE_MSG_FRAME_SIZE = 256; // bytes
-constexpr size_t PCIE_MSG_NUM_FRAMES = 64;
-constexpr size_t PCIE_MAX_CHANNELS = 6;
+constexpr size_t PCIE_RX_DATA_FRAME_SIZE = 4096; // bytes
+constexpr size_t PCIE_RX_DATA_NUM_FRAMES = 4096;
+constexpr size_t PCIE_TX_DATA_FRAME_SIZE = 4096; // bytes
+constexpr size_t PCIE_TX_DATA_NUM_FRAMES = 4096;
+constexpr size_t PCIE_MSG_FRAME_SIZE = 256; // bytes
+constexpr size_t PCIE_MSG_NUM_FRAMES = 64;
+constexpr size_t PCIE_MAX_CHANNELS = 6;
// constexpr size_t MAX_RATE_PCIE = 800000000; // bytes/s
diff --git a/host/lib/usrp/x300/x300_prop_tree.cpp b/host/lib/usrp/x300/x300_prop_tree.cpp
index 21597beea..4f40f3514 100644
--- a/host/lib/usrp/x300/x300_prop_tree.cpp
+++ b/host/lib/usrp/x300/x300_prop_tree.cpp
@@ -14,8 +14,7 @@ using namespace uhd::rfnoc;
namespace uhd { namespace usrp { namespace x300 {
-void init_prop_tree(
- const size_t mb_idx, x300_mb_controller* mbc, property_tree::sptr pt)
+void init_prop_tree(const size_t mb_idx, x300_mb_controller* mbc, property_tree::sptr pt)
{
const fs_path mb_path = fs_path("/mboards") / mb_idx;
try {
@@ -42,17 +41,15 @@ void init_prop_tree(
////////////////////////////////////////////////////////////////////
pt->create<std::string>(mb_path / "time_source" / "value")
.set(mbc->get_time_source())
- .add_coerced_subscriber([mbc](const std::string& time_source) {
- mbc->set_time_source(time_source);
- });
+ .add_coerced_subscriber(
+ [mbc](const std::string& time_source) { mbc->set_time_source(time_source); });
pt->create<std::vector<std::string>>(mb_path / "time_source" / "options")
.set(mbc->get_time_sources());
// setup the time output, default to ON
pt->create<bool>(mb_path / "time_source" / "output")
- .add_coerced_subscriber([mbc](const bool time_output) {
- mbc->set_time_source_out(time_output);
- })
+ .add_coerced_subscriber(
+ [mbc](const bool time_output) { mbc->set_time_source_out(time_output); })
.set(true);
////////////////////////////////////////////////////////////////////
@@ -69,9 +66,8 @@ void init_prop_tree(
// setup external reference options. default to 10 MHz input reference
pt->create<std::string>(mb_path / "clock_source" / "external");
- pt
- ->create<std::vector<double>>(
- mb_path / "clock_source" / "external" / "freq" / "options")
+ pt->create<std::vector<double>>(
+ mb_path / "clock_source" / "external" / "freq" / "options")
.set(EXTERNAL_FREQ_OPTIONS);
pt->create<double>(mb_path / "clock_source" / "external" / "value")
.set(mbc->get_clock_ctrl()->get_sysref_clock_rate())
diff --git a/host/lib/usrp/x300/x300_radio_control.cpp b/host/lib/usrp/x300/x300_radio_control.cpp
index 48b484467..1bd88164a 100644
--- a/host/lib/usrp/x300/x300_radio_control.cpp
+++ b/host/lib/usrp/x300/x300_radio_control.cpp
@@ -28,11 +28,11 @@
#include <uhdlib/usrp/cores/spi_core_3000.hpp>
#include <uhdlib/usrp/cores/tx_frontend_core_200.hpp>
#include <boost/algorithm/string.hpp>
-#include <memory>
#include <algorithm>
#include <chrono>
#include <functional>
#include <iostream>
+#include <memory>
#include <thread>
using namespace uhd;
@@ -869,26 +869,19 @@ public:
constexpr uint16_t mask = 0xFFFF;
if (attr == "CTRL") {
_db_iface->set_pin_ctrl(unit, value, mask);
- }
- else if (attr == "DDR") {
+ } else if (attr == "DDR") {
_db_iface->set_gpio_ddr(unit, value, mask);
- }
- else if (attr == "OUT") {
+ } else if (attr == "OUT") {
_db_iface->set_gpio_out(unit, value, mask);
- }
- else if (attr == "ATR_0X") {
+ } else if (attr == "ATR_0X") {
_db_iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, value, mask);
- }
- else if (attr == "ATR_RX") {
+ } else if (attr == "ATR_RX") {
_db_iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, value, mask);
- }
- else if (attr == "ATR_TX") {
+ } else if (attr == "ATR_TX") {
_db_iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, value, mask);
- }
- else if (attr == "ATR_XX") {
+ } else if (attr == "ATR_XX") {
_db_iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, value, mask);
- }
- else {
+ } else {
RFNOC_LOG_ERROR("Invalid GPIO attribute name: " << attr);
throw uhd::key_error(std::string("Invalid GPIO attribute name: ") + attr);
}
diff --git a/host/lib/usrp/x300/x300_regs.hpp b/host/lib/usrp/x300/x300_regs.hpp
index 86ffd46c4..5e9876507 100644
--- a/host/lib/usrp/x300/x300_regs.hpp
+++ b/host/lib/usrp/x300/x300_regs.hpp
@@ -27,14 +27,14 @@ static const int BL_DATA = 1;
// I2C1 device addresses
#define MBOARD_EEPROM_ADDR 0x50
-static const int ZPU_SR_LEDS = 00;
-static const int ZPU_SR_SW_RST = 01;
-static const int ZPU_SR_CLOCK_CTRL = 02;
-static const int ZPU_SR_XB_LOCAL = 03;
-static const int ZPU_SR_REF_FREQ = 04;
-static const int ZPU_SR_SPI = 32;
-static const int ZPU_SR_ETHINT0 = 40;
-static const int ZPU_SR_ETHINT1 = 56;
+static const int ZPU_SR_LEDS = 00;
+static const int ZPU_SR_SW_RST = 01;
+static const int ZPU_SR_CLOCK_CTRL = 02;
+static const int ZPU_SR_XB_LOCAL = 03;
+static const int ZPU_SR_REF_FREQ = 04;
+static const int ZPU_SR_SPI = 32;
+static const int ZPU_SR_ETHINT0 = 40;
+static const int ZPU_SR_ETHINT1 = 56;
static const int ZPU_SR_FP_GPIO_SRC = 72;
// reset bits
@@ -43,13 +43,13 @@ static const int ZPU_SR_FP_GPIO_SRC = 72;
#define ZPU_SR_SW_RST_RADIO_CLK_PLL (1 << 2)
#define ZPU_SR_SW_RST_ADC_IDELAYCTRL (1 << 3)
-static const int ZPU_RB_SPI = 2;
-static const int ZPU_RB_CLK_STATUS = 3;
-static const int ZPU_RB_COMPAT_NUM = 6;
-static const int ZPU_RB_NUM_CE = 7;
-static const int ZPU_RB_GIT_HASH = 10;
-static const int ZPU_RB_SFP0_TYPE = 4;
-static const int ZPU_RB_SFP1_TYPE = 5;
+static const int ZPU_RB_SPI = 2;
+static const int ZPU_RB_CLK_STATUS = 3;
+static const int ZPU_RB_COMPAT_NUM = 6;
+static const int ZPU_RB_NUM_CE = 7;
+static const int ZPU_RB_GIT_HASH = 10;
+static const int ZPU_RB_SFP0_TYPE = 4;
+static const int ZPU_RB_SFP1_TYPE = 5;
static const int ZPU_RB_FP_GPIO_SRC = 13;
static const uint32_t RB_SFP_1G_ETH = 0;