summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Blossom2009-09-04 15:51:52 -0700
committerEric Blossom2009-09-04 15:51:52 -0700
commita1d9c0b4de66eadfdd3f6a217af80f7eb4e22772 (patch)
tree3616fe6e717db881ae98041be8daeb22260c2705
parent6528672f2db205b6127f05ad7c7b9da66661b498 (diff)
parent7cb806f71a3bcc52c3c2e5688a9b6b48e3401615 (diff)
downloadgnuradio-a1d9c0b4de66eadfdd3f6a217af80f7eb4e22772.tar.gz
gnuradio-a1d9c0b4de66eadfdd3f6a217af80f7eb4e22772.tar.bz2
gnuradio-a1d9c0b4de66eadfdd3f6a217af80f7eb4e22772.zip
Merge branch 'new_eth' of http://gnuradio.org/git/matt into new_eth
* 'new_eth' of http://gnuradio.org/git/matt: properly set the address filter stop sending short ethernet command packets. Fix problem with commands timing out (specifically stop_rx_streaming) Fix race condition that caused commands such as stop_rx_streaming to fail. Fixing a line in the clock recovery algorithm. This works with a bit larger error than there proably should be. Better fix for broken AC_PROG_F77 macro Fix Python header check failure due to invalid cached state waterfall and fft use a common autoscale function Fix so that the waterfall texture is initialized with a buffer of the same size. Modifications to usrp2 source and sink so that set center freq is called afer set lo offset. Modifications to the usrp blocks and wrapper so that the lo offset is set with the lo frequency. Removed subversion related configuration info. Expand frequency ranges to match hardware capability. Modified log power fft block so ref scale is peak to peak. Adding clock sync algorithm using PFB. This works, but needs a bit more work.
-rw-r--r--config/gr_fortran.m41
-rw-r--r--configure.ac3
-rw-r--r--gnuradio-core/src/lib/filter/Makefile.am7
-rw-r--r--gnuradio-core/src/lib/filter/filter.i2
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc258
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h106
-rw-r--r--gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i49
-rw-r--r--gnuradio-core/src/lib/general/gr_constants.cc.in12
-rw-r--r--gnuradio-core/src/lib/general/gr_constants.h10
-rw-r--r--gnuradio-core/src/lib/general/gr_constants.i4
-rw-r--r--gnuradio-core/src/lib/gnuradio-config-info.cc8
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py4
-rw-r--r--gr-wxgui/src/python/common.py25
-rw-r--r--gr-wxgui/src/python/fft_window.py14
-rw-r--r--gr-wxgui/src/python/plotter/waterfall_plotter.py2
-rw-r--r--gr-wxgui/src/python/scopesink_gl.py2
-rw-r--r--gr-wxgui/src/python/waterfall_window.py12
-rw-r--r--grc/blocks/usrp2_sink_xxxx.xml13
-rw-r--r--grc/blocks/usrp2_source_xxxx.xml13
-rw-r--r--grc/blocks/usrp_dual_sink_x.xml26
-rw-r--r--grc/blocks/usrp_dual_source_x.xml28
-rw-r--r--grc/blocks/usrp_simple_sink_x.xml16
-rw-r--r--grc/blocks/usrp_simple_source_x.xml16
-rw-r--r--grc/grc_gnuradio/usrp/dual_usrp.py16
-rw-r--r--grc/grc_gnuradio/usrp/simple_usrp.py8
-rw-r--r--usrp/host/lib/db_flexrf.cc12
-rw-r--r--usrp2/firmware/lib/db_rfx.c24
-rw-r--r--usrp2/firmware/lib/eth_mac.c47
-rw-r--r--usrp2/firmware/lib/eth_mac_regs.h8
29 files changed, 578 insertions, 168 deletions
diff --git a/config/gr_fortran.m4 b/config/gr_fortran.m4
index b5b0470f4..a558b2f7e 100644
--- a/config/gr_fortran.m4
+++ b/config/gr_fortran.m4
@@ -28,5 +28,6 @@ AC_DEFUN([GR_FORTRAN],[
then
AC_PROG_F77
AC_F77_LIBRARY_LDFLAGS
+ AC_PROG_CC dnl bux fix to restore $ac_ext
fi
])
diff --git a/configure.ac b/configure.ac
index 1764b46ab..2bb37935e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -286,9 +286,6 @@ dnl AX_BOOST_TEST_EXEC_MONITOR
dnl AX_BOOST_UNIT_TEST_FRAMEWORK
dnl AX_BOOST_WSERIALIZATION
-
-dnl If this is being done from a subversion tree, create variables
-GR_SUBVERSION
BUILD_DATE=`date -R -u`
AC_SUBST(BUILD_DATE)
diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am
index 838f69b92..d5afd571b 100644
--- a/gnuradio-core/src/lib/filter/Makefile.am
+++ b/gnuradio-core/src/lib/filter/Makefile.am
@@ -205,7 +205,8 @@ libfilter_la_common_SOURCES = \
gr_pfb_channelizer_ccf.cc \
gr_pfb_decimator_ccf.cc \
gr_pfb_interpolator_ccf.cc \
- gr_pfb_arb_resampler_ccf.cc
+ gr_pfb_arb_resampler_ccf.cc \
+ gr_pfb_clock_sync_ccf.cc
libfilter_qa_la_common_SOURCES = \
qa_filter.cc \
@@ -284,7 +285,8 @@ grinclude_HEADERS = \
gr_pfb_channelizer_ccf.h \
gr_pfb_decimator_ccf.h \
gr_pfb_interpolator_ccf.h \
- gr_pfb_arb_resampler_ccf.h
+ gr_pfb_arb_resampler_ccf.h \
+ gr_pfb_clock_sync_ccf.h
noinst_HEADERS = \
assembly.h \
@@ -339,6 +341,7 @@ swiginclude_HEADERS = \
gr_pfb_decimator_ccf.i \
gr_pfb_interpolator_ccf.i \
gr_pfb_arb_resampler_ccf.i \
+ gr_pfb_clock_sync_ccf.i \
$(GENERATED_I)
endif
diff --git a/gnuradio-core/src/lib/filter/filter.i b/gnuradio-core/src/lib/filter/filter.i
index 16b8005be..91f55c514 100644
--- a/gnuradio-core/src/lib/filter/filter.i
+++ b/gnuradio-core/src/lib/filter/filter.i
@@ -36,6 +36,7 @@
#include <gr_pfb_decimator_ccf.h>
#include <gr_pfb_interpolator_ccf.h>
#include <gr_pfb_arb_resampler_ccf.h>
+#include <gr_pfb_clock_sync_ccf.h>
%}
%include "gr_iir_filter_ffd.i"
@@ -56,5 +57,6 @@
%include "gr_pfb_decimator_ccf.i"
%include "gr_pfb_interpolator_ccf.i"
%include "gr_pfb_arb_resampler_ccf.i"
+%include "gr_pfb_clock_sync_ccf.i"
%include "filter_generated.i"
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
new file mode 100644
index 000000000..91cbf74c6
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.cc
@@ -0,0 +1,258 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2009 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <cstdio>
+#include <cmath>
+
+#include <gr_pfb_clock_sync_ccf.h>
+#include <gr_fir_ccf.h>
+#include <gr_fir_util.h>
+#include <gr_io_signature.h>
+#include <gr_math.h>
+
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size,
+ float init_phase)
+{
+ return gr_pfb_clock_sync_ccf_sptr (new gr_pfb_clock_sync_ccf (sps, gain, taps,
+ filter_size,
+ init_phase));
+}
+
+
+gr_pfb_clock_sync_ccf::gr_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size,
+ float init_phase)
+ : gr_block ("pfb_clock_sync_ccf",
+ gr_make_io_signature (1, 1, sizeof(gr_complex)),
+ gr_make_io_signature2 (2, 2, sizeof(gr_complex), sizeof(float))),
+ d_updated (false), d_sps(sps), d_alpha(gain)
+{
+ d_nfilters = filter_size;
+
+ // Store the last filter between calls to work
+ // The accumulator keeps track of overflow to increment the stride correctly.
+ // set it here to the fractional difference based on the initial phaes
+ // assert(init_phase <= 2*M_PI);
+ float x = init_phase / (2*M_PI); //normalize initial phase
+ d_acc = x*(d_nfilters-1);
+ d_last_filter = (int)floor(d_acc);
+ d_acc = fmodf(d_acc, 1);
+ d_start_count = 0;
+
+
+ d_filters = std::vector<gr_fir_ccf*>(d_nfilters);
+ d_diff_filters = std::vector<gr_fir_ccf*>(d_nfilters);
+
+ // Create an FIR filter for each channel and zero out the taps
+ std::vector<float> vtaps(0, d_nfilters);
+ for(unsigned int i = 0; i < d_nfilters; i++) {
+ d_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
+ d_diff_filters[i] = gr_fir_util::create_gr_fir_ccf(vtaps);
+ }
+
+ // Now, actually set the filters' taps
+ std::vector<float> dtaps;
+ create_diff_taps(taps, dtaps);
+ set_taps(taps, d_taps, d_filters);
+ set_taps(dtaps, d_dtaps, d_diff_filters);
+}
+
+gr_pfb_clock_sync_ccf::~gr_pfb_clock_sync_ccf ()
+{
+ for(unsigned int i = 0; i < d_nfilters; i++) {
+ delete d_filters[i];
+ }
+}
+
+void
+gr_pfb_clock_sync_ccf::set_taps (const std::vector<float> &newtaps,
+ std::vector< std::vector<float> > &ourtaps,
+ std::vector<gr_fir_ccf*> &ourfilter)
+{
+ unsigned int i,j;
+
+ unsigned int ntaps = newtaps.size();
+ d_taps_per_filter = (unsigned int)ceil((double)ntaps/(double)d_nfilters);
+
+ // Create d_numchan vectors to store each channel's taps
+ ourtaps.resize(d_nfilters);
+
+ // Make a vector of the taps plus fill it out with 0's to fill
+ // each polyphase filter with exactly d_taps_per_filter
+ std::vector<float> tmp_taps;
+ tmp_taps = newtaps;
+ while((float)(tmp_taps.size()) < d_nfilters*d_taps_per_filter) {
+ tmp_taps.push_back(0.0);
+ }
+
+ // Partition the filter
+ for(i = 0; i < d_nfilters; i++) {
+ // Each channel uses all d_taps_per_filter with 0's if not enough taps to fill out
+ ourtaps[i] = std::vector<float>(d_taps_per_filter, 0);
+ for(j = 0; j < d_taps_per_filter; j++) {
+ ourtaps[i][j] = tmp_taps[i + j*d_nfilters]; // add taps to channels in reverse order
+ }
+
+ // Build a filter for each channel and add it's taps to it
+ ourfilter[i]->set_taps(ourtaps[i]);
+ }
+
+ // Set the history to ensure enough input items for each filter
+ set_history (d_taps_per_filter + d_sps);
+
+ d_updated = true;
+}
+
+void
+gr_pfb_clock_sync_ccf::create_diff_taps(const std::vector<float> &newtaps,
+ std::vector<float> &difftaps)
+{
+ difftaps.clear();
+ difftaps.push_back(0); //newtaps[0]);
+ for(unsigned int i = 1; i < newtaps.size()-1; i++) {
+ difftaps.push_back(newtaps[i+1] - newtaps[i-1]);
+ }
+ difftaps.push_back(0);//-newtaps[newtaps.size()-1]);
+}
+
+void
+gr_pfb_clock_sync_ccf::print_taps()
+{
+ unsigned int i, j;
+ for(i = 0; i < d_nfilters; i++) {
+ printf("filter[%d]: [%.4e, ", i, d_taps[i][0]);
+ for(j = 1; j < d_taps_per_filter-1; j++) {
+ printf("%.4e,", d_taps[i][j]);
+ }
+ printf("%.4e]\n", d_taps[i][j]);
+ }
+}
+
+void
+gr_pfb_clock_sync_ccf::print_diff_taps()
+{
+ unsigned int i, j;
+ for(i = 0; i < d_nfilters; i++) {
+ printf("filter[%d]: [%.4e, ", i, d_dtaps[i][0]);
+ for(j = 1; j < d_taps_per_filter-1; j++) {
+ printf("%.4e,", d_dtaps[i][j]);
+ }
+ printf("%.4e]\n", d_dtaps[i][j]);
+ }
+}
+
+
+std::vector<float>
+gr_pfb_clock_sync_ccf::channel_taps(int channel)
+{
+ std::vector<float> taps;
+ unsigned int i;
+ for(i = 0; i < d_taps_per_filter; i++) {
+ taps.push_back(d_taps[channel][i]);
+ }
+ return taps;
+}
+
+std::vector<float>
+gr_pfb_clock_sync_ccf::diff_channel_taps(int channel)
+{
+ std::vector<float> taps;
+ unsigned int i;
+ for(i = 0; i < d_taps_per_filter; i++) {
+ taps.push_back(d_dtaps[channel][i]);
+ }
+ return taps;
+}
+
+
+int
+gr_pfb_clock_sync_ccf::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+{
+ gr_complex *in = (gr_complex *) input_items[0];
+ gr_complex *out = (gr_complex *) output_items[0];
+ float *err = (float *) output_items[1];
+
+ if (d_updated) {
+ d_updated = false;
+ return 0; // history requirements may have changed.
+ }
+
+ // We need this many to process one output
+ int nrequired = ninput_items[0] - d_taps_per_filter;
+
+ int i = 0, count = d_start_count;
+ float error = 0;
+
+ // produce output as long as we can and there are enough input samples
+ while((i < noutput_items) && (count < nrequired)) {
+ out[i] = d_filters[d_last_filter]->filter(&in[count]);
+ error = (out[i] * d_diff_filters[d_last_filter]->filter(&in[count])).real();
+ err[i] = error;
+
+ d_acc += d_alpha*error;
+ gr_branchless_clip(d_acc, 1);
+
+ int newfilter;
+ newfilter = (int)((float)d_last_filter + d_acc);
+ if(newfilter != (int)d_last_filter)
+ d_acc = 0.5;
+
+ if(newfilter >= (int)d_nfilters) {
+ d_last_filter = newfilter - d_nfilters;
+ count++;
+ }
+ else if(newfilter < 0) {
+ d_last_filter = d_nfilters + newfilter;
+ count--;
+ }
+ else {
+ d_last_filter = newfilter;
+ }
+
+ i++;
+ count += d_sps;
+ }
+
+ // Set the start index at the next entrance to the work function
+ // if we stop because we run out of input items, jump ahead in the
+ // next call to work. Otherwise, we can start at zero.
+ if(count > nrequired) {
+ d_start_count = count - (nrequired);
+ consume_each(ninput_items[0]-d_taps_per_filter);
+ }
+ else {
+ d_start_count = 0;
+ consume_each(count);
+ }
+
+ return i;
+}
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
new file mode 100644
index 000000000..1a04e55c7
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.h
@@ -0,0 +1,106 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2009 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef INCLUDED_GR_PFB_CLOCK_SYNC_CCF_H
+#define INCLUDED_GR_PFB_CLOCK_SYNC_CCF_H
+
+#include <gr_block.h>
+
+class gr_pfb_clock_sync_ccf;
+typedef boost::shared_ptr<gr_pfb_clock_sync_ccf> gr_pfb_clock_sync_ccf_sptr;
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size=32,
+ float init_phase=0);
+
+class gr_fir_ccf;
+
+/*!
+ * \class gr_pfb_clock_sync_ccf
+ *
+ * \brief Timing synchronizer using polyphase filterbanks
+ *
+ * \ingroup filter_blk
+ *
+ */
+
+class gr_pfb_clock_sync_ccf : public gr_block
+{
+ private:
+ /*!
+ * Build the polyphase filterbank timing synchronizer.
+ */
+ friend gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size,
+ float init_phase);
+
+ bool d_updated;
+ unsigned int d_sps;
+ float d_alpha;
+ unsigned int d_nfilters;
+ std::vector<gr_fir_ccf*> d_filters;
+ std::vector<gr_fir_ccf*> d_diff_filters;
+ std::vector< std::vector<float> > d_taps;
+ std::vector< std::vector<float> > d_dtaps;
+ float d_acc;
+ unsigned int d_last_filter;
+ unsigned int d_start_count;
+ unsigned int d_taps_per_filter;
+
+ /*!
+ * Build the polyphase filterbank timing synchronizer.
+ */
+ gr_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size,
+ float init_phase);
+
+ void create_diff_taps(const std::vector<float> &newtaps,
+ std::vector<float> &difftaps);
+
+public:
+ ~gr_pfb_clock_sync_ccf ();
+
+ /*!
+ * Resets the filterbank's filter taps with the new prototype filter
+ */
+ void set_taps (const std::vector<float> &taps,
+ std::vector< std::vector<float> > &ourtaps,
+ std::vector<gr_fir_ccf*> &ourfilter);
+ std::vector<float> channel_taps(int channel);
+ std::vector<float> diff_channel_taps(int channel);
+
+ /*!
+ * Print all of the filterbank taps to screen.
+ */
+ void print_taps();
+ void print_diff_taps();
+
+ int general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+};
+
+#endif
diff --git a/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
new file mode 100644
index 000000000..729d4a1aa
--- /dev/null
+++ b/gnuradio-core/src/lib/filter/gr_pfb_clock_sync_ccf.i
@@ -0,0 +1,49 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2009 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+GR_SWIG_BLOCK_MAGIC(gr,pfb_clock_sync_ccf);
+
+gr_pfb_clock_sync_ccf_sptr gr_make_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size=32,
+ float init_phase=0);
+
+class gr_pfb_clock_sync_ccf : public gr_block
+{
+ private:
+ gr_pfb_clock_sync_ccf (float sps, float gain,
+ const std::vector<float> &taps,
+ unsigned int filter_size,
+ float init_phase);
+
+ public:
+ ~gr_pfb_clock_sync_ccf ();
+
+ void set_taps (const std::vector<float> &taps,
+ std::vector< std::vector<float> > &ourtaps,
+ std::vector<gr_fir_ccf*> &ourfilter);
+
+ std::vector<float> channel_taps(int channel);
+ std::vector<float> diff_channel_taps(int channel);
+ void print_taps();
+ void print_diff_taps();
+};
diff --git a/gnuradio-core/src/lib/general/gr_constants.cc.in b/gnuradio-core/src/lib/general/gr_constants.cc.in
index efb0f1c77..71a47eb51 100644
--- a/gnuradio-core/src/lib/general/gr_constants.cc.in
+++ b/gnuradio-core/src/lib/general/gr_constants.cc.in
@@ -51,18 +51,6 @@ gr_build_date()
}
const std::string
-gr_svn_date()
-{
- return "@SVNDATE@";
-}
-
-const std::string
-gr_svn_version()
-{
- return "@SVNVERSION@";
-}
-
-const std::string
gr_version()
{
return "@VERSION@";
diff --git a/gnuradio-core/src/lib/general/gr_constants.h b/gnuradio-core/src/lib/general/gr_constants.h
index e44890be0..449d41c17 100644
--- a/gnuradio-core/src/lib/general/gr_constants.h
+++ b/gnuradio-core/src/lib/general/gr_constants.h
@@ -45,16 +45,6 @@ const std::string gr_prefsdir();
const std::string gr_build_date();
/*!
- * \brief return repository date as set when 'bootstrap' is run
- */
-const std::string gr_svn_date();
-
-/*!
- * \brief return repository version as set when 'bootstrap' is run
- */
-const std::string gr_svn_version();
-
-/*!
* \brief return version string defined in configure.ac
*/
const std::string gr_version();
diff --git a/gnuradio-core/src/lib/general/gr_constants.i b/gnuradio-core/src/lib/general/gr_constants.i
index 156af4a36..a5aef1492 100644
--- a/gnuradio-core/src/lib/general/gr_constants.i
+++ b/gnuradio-core/src/lib/general/gr_constants.i
@@ -4,14 +4,10 @@
%rename(sysconfdir) gr_sysconfdir;
%rename(prefsdir) gr_prefsdir;
%rename(build_date) gr_build_date;
-%rename(svn_date) gr_svn_date;
-%rename(svn_version) gr_svn_version;
%rename(version) gr_version;
const std::string gr_prefix();
const std::string gr_sysconfdir();
const std::string gr_prefsdir();
const std::string gr_build_date();
-const std::string gr_svn_date();
-const std::string gr_svn_version();
const std::string gr_version();
diff --git a/gnuradio-core/src/lib/gnuradio-config-info.cc b/gnuradio-core/src/lib/gnuradio-config-info.cc
index df78ea2dd..6fa53b877 100644
--- a/gnuradio-core/src/lib/gnuradio-config-info.cc
+++ b/gnuradio-core/src/lib/gnuradio-config-info.cc
@@ -43,8 +43,6 @@ main(int argc, char **argv)
("prefsdir", "print gnuradio preferences directory")
("builddate", "print gnuradio build date (RFC2822 format)")
("version,v", "print gnuradio version")
- ("svnversion", "print SVN repository version (SVN format)")
- ("svndate", "print SVN repository date")
;
po::store(po::parse_command_line(argc, argv, desc), vm);
@@ -70,11 +68,5 @@ main(int argc, char **argv)
if (vm.count("version"))
std::cout << gr_version() << std::endl;
- if (vm.count("svnversion"))
- std::cout << gr_svn_version() << std::endl;
-
- if (vm.count("svndate"))
- std::cout << gr_svn_date() << std::endl;
-
return 0;
}
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py b/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py
index cf8eb1be7..7ef40be40 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/logpwrfft.py
@@ -55,9 +55,9 @@ class _logpwrfft_base(gr.hier_block2):
c2mag = gr.complex_to_mag(fft_size)
self._avg = gr.single_pole_iir_filter_ff(1.0, fft_size)
self._log = gr.nlog10_ff(20, fft_size,
- -10*math.log10(fft_size) # Adjust for number of bins
+ -20*math.log10(fft_size) # Adjust for number of bins
-10*math.log10(window_power/fft_size) # Adjust for windowing loss
- -20*math.log10(ref_scale/2)) # Adjust for reference scale
+ -20*math.log10(ref_scale/2)+3.0) # Adjust for reference scale
self.connect(self, self._sd, fft, c2mag, self._avg, self._log, self)
self._average = average
diff --git a/gr-wxgui/src/python/common.py b/gr-wxgui/src/python/common.py
index d555a1f05..9c97ce1ec 100644
--- a/gr-wxgui/src/python/common.py
+++ b/gr-wxgui/src/python/common.py
@@ -137,6 +137,25 @@ def get_min_max(samples):
scale_factor = 3
mean = numpy.average(samples)
rms = numpy.max([scale_factor*((numpy.sum((samples-mean)**2)/len(samples))**.5), .1])
- min = mean - rms
- max = mean + rms
- return min, max
+ min_val = mean - rms
+ max_val = mean + rms
+ return min_val, max_val
+
+def get_min_max_fft(fft_samps):
+ """
+ Get the minimum and maximum bounds for an array of fft samples.
+ @param samples the array of real values
+ @return a tuple of min, max
+ """
+ #get the peak level (max of the samples)
+ peak_level = numpy.max(fft_samps)
+ #separate noise samples
+ noise_samps = numpy.sort(fft_samps)[:len(fft_samps)/2]
+ #get the noise floor
+ noise_floor = numpy.average(noise_samps)
+ #get the noise deviation
+ noise_dev = numpy.std(noise_samps)
+ #determine the maximum and minimum levels
+ max_level = peak_level
+ min_level = noise_floor - abs(2*noise_dev)
+ return min_level, max_level
diff --git a/gr-wxgui/src/python/fft_window.py b/gr-wxgui/src/python/fft_window.py
index 0529e6a5d..237c8940c 100644
--- a/gr-wxgui/src/python/fft_window.py
+++ b/gr-wxgui/src/python/fft_window.py
@@ -254,17 +254,11 @@ class fft_window(wx.Panel, pubsub.pubsub):
Set the dynamic range and reference level.
"""
if not len(self.samples): return
- #get the peak level (max of the samples)
- peak_level = numpy.max(self.samples)
- #get the noise floor (averge the smallest samples)
- noise_floor = numpy.average(numpy.sort(self.samples)[:len(self.samples)/4])
- #padding
- noise_floor -= abs(noise_floor)*.5
- peak_level += abs(peak_level)*.1
- #set the reference level to a multiple of y divs
- self[REF_LEVEL_KEY] = self[Y_DIVS_KEY]*math.ceil(peak_level/self[Y_DIVS_KEY])
+ min_level, max_level = common.get_min_max_fft(self.samples)
#set the range to a clean number of the dynamic range
- self[Y_PER_DIV_KEY] = common.get_clean_num((peak_level - noise_floor)/self[Y_DIVS_KEY])
+ self[Y_PER_DIV_KEY] = common.get_clean_num(1+(max_level - min_level)/self[Y_DIVS_KEY])
+ #set the reference level to a multiple of y per div
+ self[REF_LEVEL_KEY] = self[Y_PER_DIV_KEY]*round(.5+max_level/self[Y_PER_DIV_KEY])
def _reset_peak_vals(self, *args): self.peak_vals = EMPTY_TRACE
diff --git a/gr-wxgui/src/python/plotter/waterfall_plotter.py b/gr-wxgui/src/python/plotter/waterfall_plotter.py
index 2e0669961..d32b0ca0a 100644
--- a/gr-wxgui/src/python/plotter/waterfall_plotter.py
+++ b/gr-wxgui/src/python/plotter/waterfall_plotter.py
@@ -209,7 +209,7 @@ class waterfall_plotter(grid_plotter_base):
self._pointer = 0
if self._num_lines and self._fft_size:
GL.glBindTexture(GL.GL_TEXTURE_2D, self._waterfall_texture)
- data = numpy.zeros(self._num_lines*self._fft_size*4, numpy.uint8).tostring()
+ data = numpy.zeros(self._num_lines*ceil_log2(self._fft_size)*4, numpy.uint8).tostring()
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, ceil_log2(self._fft_size), self._num_lines, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, data)
self._resize_texture_flag = False
diff --git a/gr-wxgui/src/python/scopesink_gl.py b/gr-wxgui/src/python/scopesink_gl.py
index b4ae0f339..a5e3ca3ce 100644
--- a/gr-wxgui/src/python/scopesink_gl.py
+++ b/gr-wxgui/src/python/scopesink_gl.py
@@ -50,7 +50,7 @@ class ac_couple_block(gr.hier_block2):
self.connect(self, lpf, mute, (sub, 1))
#subscribe
controller.subscribe(ac_couple_key, lambda x: mute.set_mute(not x))
- controller.subscribe(sample_rate_key, lambda x: lpf.set_taps(2.0/x))
+ controller.subscribe(sample_rate_key, lambda x: lpf.set_taps(0.05))
#initialize
controller[ac_couple_key] = ac_couple
controller[sample_rate_key] = controller[sample_rate_key]
diff --git a/gr-wxgui/src/python/waterfall_window.py b/gr-wxgui/src/python/waterfall_window.py
index c00992e14..28e67a830 100644
--- a/gr-wxgui/src/python/waterfall_window.py
+++ b/gr-wxgui/src/python/waterfall_window.py
@@ -237,16 +237,10 @@ class waterfall_window(wx.Panel, pubsub.pubsub):
Does not affect the current data in the waterfall.
"""
if not len(self.samples): return
- #get the peak level (max of the samples)
- peak_level = numpy.max(self.samples)
- #get the noise floor (averge the smallest samples)
- noise_floor = numpy.average(numpy.sort(self.samples)[:len(self.samples)/4])
- #padding
- noise_floor -= abs(noise_floor)*.5
- peak_level += abs(peak_level)*.1
+ min_level, max_level = common.get_min_max_fft(self.samples)
#set the range and level
- self[REF_LEVEL_KEY] = peak_level
- self[DYNAMIC_RANGE_KEY] = peak_level - noise_floor
+ self[REF_LEVEL_KEY] = max_level
+ self[DYNAMIC_RANGE_KEY] = max_level - min_level
def handle_msg(self, msg):
"""
diff --git a/grc/blocks/usrp2_sink_xxxx.xml b/grc/blocks/usrp2_sink_xxxx.xml
index 639f96cf4..f2ee4d151 100644
--- a/grc/blocks/usrp2_sink_xxxx.xml
+++ b/grc/blocks/usrp2_sink_xxxx.xml
@@ -2,6 +2,7 @@
<!--
###################################################
##USRP2 Sink
+## Note: the center freq must be set after the lo offset
###################################################
-->
<block>
@@ -16,14 +17,16 @@ usrp2.sink_$(type.fcn)($interface)
usrp2.sink_$(type.fcn)($interface, $mac_addr)
#end if
self.$(id).set_interp($interpolation)
-self.$(id).set_center_freq($frequency)
-self.$(id).set_gain($gain)
#if $lo_offset() != float('inf')
self.$(id).set_lo_offset($lo_offset)
-#end if</make>
- <callback>set_lo_offset($lo_offset)</callback>
+#end if
+self.$(id).set_center_freq($frequency)
+self.$(id).set_gain($gain)</make>
<callback>set_interp($interpolation)</callback>
- <callback>set_center_freq($frequency)</callback>
+ <callback>#if $lo_offset() != float('inf')
+self.$(id).set_lo_offset($lo_offset)
+#end if
+self.$(id).set_center_freq($frequency)</callback>
<callback>set_gain($gain)</callback>
<param>
<name>Output Type</name>
diff --git a/grc/blocks/usrp2_source_xxxx.xml b/grc/blocks/usrp2_source_xxxx.xml
index 6c776d0ad..02046e609 100644
--- a/grc/blocks/usrp2_source_xxxx.xml
+++ b/grc/blocks/usrp2_source_xxxx.xml
@@ -2,6 +2,7 @@
<!--
###################################################
##USRP2 Source
+## Note: the center freq must be set after the lo offset
###################################################
-->
<block>
@@ -16,14 +17,16 @@ usrp2.source_$(type.fcn)($interface)
usrp2.source_$(type.fcn)($interface, $mac_addr)
#end if
self.$(id).set_decim($decimation)
-self.$(id).set_center_freq($frequency)
-self.$(id).set_gain($gain)
#if $lo_offset() != float('inf')
self.$(id).set_lo_offset($lo_offset)
-#end if</make>
- <callback>set_lo_offset($lo_offset)</callback>
+#end if
+self.$(id).set_center_freq($frequency)
+self.$(id).set_gain($gain)</make>
<callback>set_decim($decimation)</callback>
- <callback>set_center_freq($frequency)</callback>
+ <callback>#if $lo_offset() != float('inf')
+self.$(id).set_lo_offset($lo_offset)
+#end if
+self.$(id).set_center_freq($frequency)</callback>
<callback>set_gain($gain)</callback>
<param>
<name>Output Type</name>
diff --git a/grc/blocks/usrp_dual_sink_x.xml b/grc/blocks/usrp_dual_sink_x.xml
index 8f418becd..4539b62f9 100644
--- a/grc/blocks/usrp_dual_sink_x.xml
+++ b/grc/blocks/usrp_dual_sink_x.xml
@@ -10,16 +10,18 @@
<import>from grc_gnuradio import usrp as grc_usrp</import>
<make>grc_usrp.dual_sink_$(type.fcn)(which=$which)
self.$(id).set_interp_rate($interpolation)
-self.$(id).set_frequency_a($frequency_a, verbose=True)
-self.$(id).set_frequency_b($frequency_b, verbose=True)
-self.$(id).set_gain_a($gain_a)
-self.$(id).set_gain_b($gain_b)
+self.$(id).set_frequency_a($frequency_a, verbose=True#slurp
#if $lo_offset_a() != float('inf')
-self.$(id).set_lo_offset_a($lo_offset_a)
+, lo_offset=$lo_offset_a#slurp
#end if
+)
+self.$(id).set_frequency_b($frequency_b, verbose=True#slurp
#if $lo_offset_b() != float('inf')
-self.$(id).set_lo_offset_b($lo_offset_b)
+, lo_offset=$lo_offset_b#slurp
#end if
+)
+self.$(id).set_gain_a($gain_a)
+self.$(id).set_gain_b($gain_b)
##################################################
## Flex RF A
##################################################
@@ -39,8 +41,16 @@ self.$(id).set_enable_b(True)
self.$(id).set_auto_tr_b(True)
#end if</make>
<callback>set_interp_rate($interpolation)</callback>
- <callback>set_frequency_a($frequency_a)</callback>
- <callback>set_frequency_b($frequency_b)</callback>
+ <callback>set_frequency_a($frequency_a#slurp
+#if $lo_offset_a() != float('inf')
+, lo_offset=$lo_offset_a#slurp
+#end if
+)</callback>
+ <callback>set_frequency_b($frequency_b#slurp
+#if $lo_offset_b() != float('inf')
+, lo_offset=$lo_offset_b#slurp
+#end if
+)</callback>
<callback>set_gain_a($gain_a)</callback>
<callback>set_gain_b($gain_b)</callback>
<param>
diff --git a/grc/blocks/usrp_dual_source_x.xml b/grc/blocks/usrp_dual_source_x.xml
index 740895d42..ad9a860ac 100644
--- a/grc/blocks/usrp_dual_source_x.xml
+++ b/grc/blocks/usrp_dual_source_x.xml
@@ -13,19 +13,29 @@
self.$(id).set_format(width=$format.width, shift=$format.shift)
#end if
self.$(id).set_decim_rate($decimation)
-self.$(id).set_frequency_a($frequency_a, verbose=True)
-self.$(id).set_frequency_b($frequency_b, verbose=True)
-self.$(id).set_gain_a($gain_a)
-self.$(id).set_gain_b($gain_b)
+self.$(id).set_frequency_a($frequency_a, verbose=True#slurp
#if $lo_offset_a() != float('inf')
-self.$(id).set_lo_offset_a($lo_offset_a)
+, lo_offset=$lo_offset_a#slurp
#end if
+)
+self.$(id).set_frequency_b($frequency_b, verbose=True#slurp
#if $lo_offset_b() != float('inf')
-self.$(id).set_lo_offset_b($lo_offset_b)
-#end if</make>
+, lo_offset=$lo_offset_b#slurp
+#end if
+)
+self.$(id).set_gain_a($gain_a)
+self.$(id).set_gain_b($gain_b)</make>
<callback>set_decim_rate($decimation)</callback>
- <callback>set_frequency_a($frequency_a)</callback>
- <callback>set_frequency_b($frequency_b)</callback>
+ <callback>set_frequency_a($frequency_a#slurp
+#if $lo_offset_a() != float('inf')
+, lo_offset=$lo_offset_a#slurp
+#end if
+)</callback>
+ <callback>set_frequency_b($frequency_b#slurp
+#if $lo_offset_b() != float('inf')
+, lo_offset=$lo_offset_b#slurp
+#end if
+)</callback>
<callback>set_gain_a($gain_a)</callback>
<callback>set_gain_b($gain_b)</callback>
<param>
diff --git a/grc/blocks/usrp_simple_sink_x.xml b/grc/blocks/usrp_simple_sink_x.xml
index f3ccf1263..b52cd4880 100644
--- a/grc/blocks/usrp_simple_sink_x.xml
+++ b/grc/blocks/usrp_simple_sink_x.xml
@@ -10,20 +10,24 @@
<import>from grc_gnuradio import usrp as grc_usrp</import>
<make>grc_usrp.simple_sink_$(type.fcn)(which=$which, side=$side)
self.$(id).set_interp_rate($interpolation)
-self.$(id).set_frequency($frequency, verbose=True)
+self.$(id).set_frequency($frequency, verbose=True#slurp
+#if $lo_offset() != float('inf')
+, lo_offset=$lo_offset#slurp
+#end if
+)
self.$(id).set_gain($gain)
#if $transmit.tx_enb
self.$(id).set_enable(True)
#end if
#if $transmit.auto_tr
self.$(id).set_auto_tr(True)
-#end if
-#if $lo_offset() != float('inf')
-self.$(id).set_lo_offset($lo_offset)
#end if</make>
- <callback>set_lo_offset($lo_offset)</callback>
<callback>set_interp_rate($interpolation)</callback>
- <callback>set_frequency($frequency)</callback>
+ <callback>set_frequency($frequency#slurp
+#if $lo_offset() != float('inf')
+, lo_offset=$lo_offset#slurp
+#end if
+)</callback>
<callback>set_gain($gain)</callback>
<param>
<name>Input Type</name>
diff --git a/grc/blocks/usrp_simple_source_x.xml b/grc/blocks/usrp_simple_source_x.xml
index 1a777bd63..7fcc7a22c 100644
--- a/grc/blocks/usrp_simple_source_x.xml
+++ b/grc/blocks/usrp_simple_source_x.xml
@@ -13,14 +13,18 @@
self.$(id).set_format(width=$format.width, shift=$format.shift)
#end if
self.$(id).set_decim_rate($decimation)
-self.$(id).set_frequency($frequency, verbose=True)
-self.$(id).set_gain($gain)
+self.$(id).set_frequency($frequency, verbose=True#slurp
#if $lo_offset() != float('inf')
-self.$(id).set_lo_offset($lo_offset)
-#end if</make>
- <callback>set_lo_offset($lo_offset)</callback>
+, lo_offset=$lo_offset#slurp
+#end if
+)
+self.$(id).set_gain($gain)</make>
<callback>set_decim_rate($decimation)</callback>
- <callback>set_frequency($frequency)</callback>
+ <callback>set_frequency($frequency#slurp
+#if $lo_offset() != float('inf')
+, lo_offset=$lo_offset#slurp
+#end if
+)</callback>
<callback>set_gain($gain)</callback>
<param>
<name>Output Type</name>
diff --git a/grc/grc_gnuradio/usrp/dual_usrp.py b/grc/grc_gnuradio/usrp/dual_usrp.py
index 1ecf7c47f..3692e1760 100644
--- a/grc/grc_gnuradio/usrp/dual_usrp.py
+++ b/grc/grc_gnuradio/usrp/dual_usrp.py
@@ -53,22 +53,22 @@ class _dual_source(gr.hier_block2):
for i in range(2): self.connect((deinter, i), (self, i))
def set_decim_rate(self, decim): self._get_u().set_decim_rate(int(decim))
- def set_frequency_a(self, frequency, verbose=False):
+ def set_frequency_a(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev_a.set_lo_offset(lo_offset)
self._set_frequency(
chan=0, #ddc0
subdev=self._subdev_a,
frequency=frequency,
verbose=verbose,
)
- def set_frequency_b(self, frequency, verbose=False):
+ def set_frequency_b(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev_b.set_lo_offset(lo_offset)
self._set_frequency(
chan=1, #ddc1
subdev=self._subdev_b,
frequency=frequency,
verbose=verbose,
)
- def set_lo_offset_a(self, lo_offset): self._subdev_a.set_lo_offset(lo_offset)
- def set_lo_offset_b(self, lo_offset): self._subdev_b.set_lo_offset(lo_offset)
def set_gain_a(self, gain): self._subdev_a.set_gain(gain)
def set_gain_b(self, gain): self._subdev_b.set_gain(gain)
@@ -105,22 +105,22 @@ class _dual_sink(gr.hier_block2):
for i in range(2): self.connect((self, i), (inter, i))
def set_interp_rate(self, interp): self._get_u().set_interp_rate(int(interp))
- def set_frequency_a(self, frequency, verbose=False):
+ def set_frequency_a(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev_a.set_lo_offset(lo_offset)
self._set_frequency(
chan=self._subdev_a.which(),
subdev=self._subdev_a,
frequency=frequency,
verbose=verbose,
)
- def set_frequency_b(self, frequency, verbose=False):
+ def set_frequency_b(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev_b.set_lo_offset(lo_offset)
self._set_frequency(
chan=self._subdev_b.which(),
subdev=self._subdev_b,
frequency=frequency,
verbose=verbose,
)
- def set_lo_offset_a(self, lo_offset): self._subdev_a.set_lo_offset(lo_offset)
- def set_lo_offset_b(self, lo_offset): self._subdev_b.set_lo_offset(lo_offset)
def set_gain_a(self, gain): self._subdev_a.set_gain(gain)
def set_gain_b(self, gain): self._subdev_b.set_gain(gain)
def set_enable_a(self, enable): self._subdev_a.set_enable(enable)
diff --git a/grc/grc_gnuradio/usrp/simple_usrp.py b/grc/grc_gnuradio/usrp/simple_usrp.py
index 9065c7fe9..fc4c75bf0 100644
--- a/grc/grc_gnuradio/usrp/simple_usrp.py
+++ b/grc/grc_gnuradio/usrp/simple_usrp.py
@@ -56,8 +56,8 @@ class _simple_source(gr.hier_block2):
self._get_u().set_decim_rate(int(decim))
if self._no_hb: #set the BW to half the sample rate
self._subdev.set_bw(self._get_u().converter_rate()/decim/2)
- def set_lo_offset(self, lo_offset): self._subdev.set_lo_offset(lo_offset)
- def set_frequency(self, frequency, verbose=False):
+ def set_frequency(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev.set_lo_offset(lo_offset)
self._set_frequency(
chan=0, #ddc0
subdev=self._subdev,
@@ -96,14 +96,14 @@ class _simple_sink(gr.hier_block2):
self.connect(self, self._get_u())
def set_interp_rate(self, interp): self._get_u().set_interp_rate(int(interp))
- def set_frequency(self, frequency, verbose=False):
+ def set_frequency(self, frequency, verbose=False, lo_offset=None):
+ if lo_offset is not None: self._subdev.set_lo_offset(lo_offset)
self._set_frequency(
chan=self._subdev.which(),
subdev=self._subdev,
frequency=frequency,
verbose=verbose,
)
- def set_lo_offset(self, lo_offset): self._subdev.set_lo_offset(lo_offset)
def set_gain(self, gain): self._subdev.set_gain(gain)
def set_enable(self, enable): self._subdev.set_enable(enable)
def set_auto_tr(self, auto_tr): self._subdev.set_auto_tr(auto_tr)
diff --git a/usrp/host/lib/db_flexrf.cc b/usrp/host/lib/db_flexrf.cc
index a8f4684b5..2d2bfabbb 100644
--- a/usrp/host/lib/db_flexrf.cc
+++ b/usrp/host/lib/db_flexrf.cc
@@ -668,7 +668,7 @@ _2400_common::freq_min()
double
_2400_common::freq_max()
{
- return 2700e6;
+ return 2900e6;
}
//----------------------------------------------------------------------
@@ -700,7 +700,7 @@ _1200_common::freq_min()
double
_1200_common::freq_max()
{
- return 1350e6;
+ return 1450e6;
}
//-------------------------------------------------------------------------
@@ -726,13 +726,13 @@ _1800_common::_1800_common()
double
_1800_common::freq_min()
{
- return 1600e6;
+ return 1500e6;
}
double
_1800_common::freq_max()
{
- return 2000e6;
+ return 2100e6;
}
//-------------------------------------------------------------------------
@@ -758,13 +758,13 @@ _900_common::_900_common()
double
_900_common::freq_min()
{
- return 800e6;
+ return 750e6;
}
double
_900_common::freq_max()
{
- return 1000e6;
+ return 1050e6;
}
//-------------------------------------------------------------------------
diff --git a/usrp2/firmware/lib/db_rfx.c b/usrp2/firmware/lib/db_rfx.c
index 2f950016f..ff12f9e32 100644
--- a/usrp2/firmware/lib/db_rfx.c
+++ b/usrp2/firmware/lib/db_rfx.c
@@ -200,8 +200,8 @@ struct db_rfx_900_rx db_rfx_900_rx = {
.base.is_tx = false,
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
- .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(800e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1000e6),
+ .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(750e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1050e6),
.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(70),
.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(0.034),
@@ -231,8 +231,8 @@ struct db_rfx_900_tx db_rfx_900_tx = {
.base.is_tx = true,
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
- .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(800e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1000e6),
+ .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(750e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1050e6),
//.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(xxx),
@@ -262,7 +262,7 @@ struct db_rfx_1200_rx db_rfx_1200_rx = {
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
.base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1150e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1350e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1450e6),
.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(70),
.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(0.034),
@@ -293,7 +293,7 @@ struct db_rfx_1200_tx db_rfx_1200_tx = {
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
.base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1150e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1350e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(1450e6),
//.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(xxx),
@@ -322,8 +322,8 @@ struct db_rfx_1800_rx db_rfx_1800_rx = {
.base.is_tx = false,
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
- .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1600e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2000e6),
+ .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1500e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2100e6),
.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(70),
.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(0.034),
@@ -353,8 +353,8 @@ struct db_rfx_1800_tx db_rfx_1800_tx = {
.base.is_tx = true,
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
- .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1600e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2000e6),
+ .base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(1500e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2100e6),
//.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(xxx),
@@ -385,7 +385,7 @@ struct db_rfx_2400_rx db_rfx_2400_rx = {
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
.base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(2300e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2700e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2900e6),
.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(0),
.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(70),
.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(0.034),
@@ -416,7 +416,7 @@ struct db_rfx_2400_tx db_rfx_2400_tx = {
.base.output_enables = 0x00E0,
.base.used_pins = 0x00FF,
.base.freq_min = U2_DOUBLE_TO_FXPT_FREQ(2300e6),
- .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2700e6),
+ .base.freq_max = U2_DOUBLE_TO_FXPT_FREQ(2900e6),
//.base.gain_min = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_max = U2_DOUBLE_TO_FXPT_GAIN(xxx),
//.base.gain_step_size = U2_DOUBLE_TO_FXPT_GAIN(xxx),
diff --git a/usrp2/firmware/lib/eth_mac.c b/usrp2/firmware/lib/eth_mac.c
index f38ea65f9..becd93644 100644
--- a/usrp2/firmware/lib/eth_mac.c
+++ b/usrp2/firmware/lib/eth_mac.c
@@ -28,37 +28,15 @@
void
eth_mac_set_addr(const u2_mac_addr_t *src)
{
- int i;
- eth_mac->ucast_hi = ((unsigned int)src->addr[0])<<8 + ((unsigned int)src->addr[1]);
- eth_mac->ucast_lo = ((unsigned int)src->addr[2])<<24 + ((unsigned int)src->addr[3])<<16 +
- ((unsigned int)src->addr[4])<<8 +((unsigned int)src->addr[5]);
-
- /*
- // tell mac our source address and enable automatic insertion on Tx.
- eth_mac->mac_tx_add_prom_wr = 0; // just in case
- for (i = 0; i < 6; i++){
- eth_mac->mac_tx_add_prom_add = i;
- eth_mac->mac_tx_add_prom_data = src->addr[i];
- eth_mac->mac_tx_add_prom_wr = 1;
- mdelay(1);
- eth_mac->mac_tx_add_prom_wr = 0;
- mdelay(1);
- }
- eth_mac->mac_tx_add_en = 1; // overwrite pkt src addr field with this stuff
-
- // set up receive destination address filter
- eth_mac->mac_rx_add_prom_wr = 0; // just in case
- for (i = 0; i < 6; i++){
- eth_mac->mac_rx_add_prom_add = i;
- eth_mac->mac_rx_add_prom_data = src->addr[i];
- eth_mac->mac_rx_add_prom_wr = 1;
- mdelay(1);
- eth_mac->mac_rx_add_prom_wr = 0;
- mdelay(1);
- }
- // eth_mac->mac_rx_add_chk_en = 1; // FIXME enable when everything's working
-
- */
+ eth_mac->ucast_hi =
+ (((unsigned int)src->addr[0])<<8) +
+ ((unsigned int)src->addr[1]);
+ eth_mac->ucast_lo =
+ (((unsigned int)src->addr[2])<<24) +
+ (((unsigned int)src->addr[3])<<16) +
+ (((unsigned int)src->addr[4])<<8) +
+ (((unsigned int)src->addr[5]));
+ printf("RDBK %x:%x\n",eth_mac->ucast_hi,eth_mac->ucast_lo);
}
@@ -68,7 +46,8 @@ eth_mac_init(const u2_mac_addr_t *src)
eth_mac->miimoder = 25; // divider from CPU clock (50MHz/25 = 2MHz)
eth_mac_set_addr(src);
- eth_mac->settings = 0x39;
+ eth_mac->settings = MAC_SET_PAUSE_EN | MAC_SET_PASS_BCAST | MAC_SET_PASS_UCAST; // 0x39;
+
// set rx flow control high and low water marks
// unsigned int lwmark = (2*2048 + 64)/4; // 2 * 2048-byte frames + 1 * 64-byte pause frame
// eth_mac->fc_hwmark = lwmark + 2048/4; // plus a 2048-byte frame
@@ -119,7 +98,7 @@ eth_mac_miim_read(int addr)
;
int r = eth_mac->miirx_data;
- printf("MIIM-READ ADDR 0x%x DATA 0x%x\n",addr, r);
+ //printf("MIIM-READ ADDR 0x%x DATA 0x%x\n",addr, r);
return r;
}
@@ -131,7 +110,7 @@ eth_mac_miim_write(int addr, int value)
eth_mac->miitx_data = value;
eth_mac->miicommand = MIIC_WCTRLDATA;
- printf("MIIM-WRITE ADDR 0x%x VAL 0x%x\n",addr,value);
+ //printf("MIIM-WRITE ADDR 0x%x VAL 0x%x\n",addr,value);
while((eth_mac->miistatus & MIIS_BUSY) != 0)
;
}
diff --git a/usrp2/firmware/lib/eth_mac_regs.h b/usrp2/firmware/lib/eth_mac_regs.h
index 3c866e471..a14c00641 100644
--- a/usrp2/firmware/lib/eth_mac_regs.h
+++ b/usrp2/firmware/lib/eth_mac_regs.h
@@ -37,6 +37,14 @@ typedef struct {
volatile int miirx_data;
} eth_mac_regs_t;
+// settings register
+#define MAC_SET_PAUSE_EN (1 << 0) // Makes us respect received pause frames (normally on)
+#define MAC_SET_PASS_ALL (1 << 1) // Enables promiscuous mode, currently broken
+#define MAC_SET_PASS_PAUSE (1 << 2) // Sends pause frames through (normally off)
+#define MAC_SET_PASS_BCAST (1 << 3) // Sends broadcast frames through (normally on)
+#define MAC_SET_PASS_MCAST (1 << 4) // Sends multicast frames that match mcast addr (normally off)
+#define MAC_SET_PASS_UCAST (1 << 5) // Sends unicast (normal) frames through if they hit in address filter (normally on)
+
// miicommand register
#define MIIC_SCANSSTAT (1 << 0) // Scan status
#define MIIC_RSTAT (1 << 1) // Read status