diff --git a/grc/gen_bladerf_blocks.py b/grc/gen_bladerf_blocks.py index 749cb7b0d45af6aa1b1f71a2f245acd5e7f51728..e9f59572087145a7945b43243eb170741160bc38 100644 --- a/grc/gen_bladerf_blocks.py +++ b/grc/gen_bladerf_blocks.py @@ -149,6 +149,14 @@ parameters: option_labels: ['Disabled', 'Bypassed'] hide: part +- id: dc_calibration + label: 'DC calibration' + category: x40/x115 + dtype: enum + default: 'LPF_TUNING' + options: ['LPF_TUNING', 'TX_LPF', 'RX_LPF', 'RXVGA2'] + hide: part + @@ -207,6 +215,7 @@ templates: + ",tamer=" + '${'$'}{tamer}' + ",sampling=" + '${'$'}{sampling}' + ",lpf_mode="+'${'$'}{lpf_mode}' + + ",dc_calibration="+'${'$'}{dc_calibration}' + ",trigger0="+'${'$'}{trigger0}' + ",trigger_role0="+'${'$'}{trigger_role0}' + ",trigger_signal0="+'${'$'}{trigger_signal0}' diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc index 37c4c9653d25dd7a3b91773716ec20951b5f076f..cfad5ee1fbe1043efba5f5297ccd5de911dbc8ac 100644 --- a/lib/bladerf/bladerf_common.cc +++ b/lib/bladerf/bladerf_common.cc @@ -130,9 +130,21 @@ size_t num_streams(bladerf_channel_layout layout) #endif } +template<typename T> +T get_enum_value(const std::vector<std::pair<std::string, T>> & values, + const std::string& name) +{ + for(const auto & v: values) + { + if(v.first == name) + return v.second; + } + return T(-1); +} + bladerf_trigger_signal get_signal(const std::string & name) { - const std::vector<std::pair<std::string, bladerf_trigger_signal>> signals + return get_enum_value<bladerf_trigger_signal>( { {"J71_4",BLADERF_TRIGGER_J71_4}, {"J51_1",BLADERF_TRIGGER_J51_1}, @@ -145,15 +157,21 @@ bladerf_trigger_signal get_signal(const std::string & name) {"USER_5",BLADERF_TRIGGER_USER_5}, {"USER_6",BLADERF_TRIGGER_USER_6}, {"USER_7",BLADERF_TRIGGER_USER_7}, - }; - for(const auto & s: signals) + }, name); +} + +bladerf_cal_module get_calibrate_module(const std::string & module) +{ + return get_enum_value<bladerf_cal_module>( { - if(s.first == name) - return s.second; - } - return BLADERF_TRIGGER_INVALID; + {"LPF_TUNING",BLADERF_DC_CAL_LPF_TUNING}, + {"TX_LPF",BLADERF_DC_CAL_TX_LPF}, + {"RX_LP",BLADERF_DC_CAL_RX_LPF}, + {"RXVGA2",BLADERF_DC_CAL_RXVGA2}, + },module); } + /****************************************************************************** * Public methods ******************************************************************************/ @@ -428,6 +446,15 @@ void bladerf_common::init_bladerf1(const dict_t &dict, bladerf_direction directi } } + if (dict.count("dc_calibration")) { + bladerf_cal_module module = get_calibrate_module( _get(dict, "dc_calibration")); + auto status = bladerf_calibrate_dc(_dev.get(), module); + if(status != 0) + { + BLADERF_THROW_STATUS(status, "Failed to calibrate"); + } + } + bladerf_channel ch = (direction == BLADERF_RX) ? BLADERF_CHANNEL_RX(0) : BLADERF_CHANNEL_TX(0); if (dict.count("lpf_mode")) {