diff options
| author | Josh Blum <josh@joshknows.com> | 2011-05-12 15:34:24 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-05-12 15:34:24 -0700 | 
| commit | b60418e93a8c473372d14cd5fdf430afa6e8fed4 (patch) | |
| tree | 30e9ad77044d07440df21343f7baab6f8e662e19 | |
| parent | d11bb4e7ba957f14c6449f519576ab7cd85b60bd (diff) | |
| download | uhd-b60418e93a8c473372d14cd5fdf430afa6e8fed4.tar.gz uhd-b60418e93a8c473372d14cd5fdf430afa6e8fed4.tar.bz2 uhd-b60418e93a8c473372d14cd5fdf430afa6e8fed4.zip | |
usrp-e100: created device address arg for master clock rate, removed eeprom hack
| -rw-r--r-- | host/docs/usrp_e1xx.rst | 15 | ||||
| -rw-r--r-- | host/lib/usrp/mboard_eeprom.cpp | 29 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/clock_ctrl.cpp | 28 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/clock_ctrl.hpp | 3 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/mboard_impl.cpp | 3 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/usrp_e100_impl.cpp | 3 | 
6 files changed, 19 insertions, 62 deletions
| diff --git a/host/docs/usrp_e1xx.rst b/host/docs/usrp_e1xx.rst index 036d2c02c..fcaa57716 100644 --- a/host/docs/usrp_e1xx.rst +++ b/host/docs/usrp_e1xx.rst @@ -35,12 +35,7 @@ To use the 61.44MHz clock rate, the USRP embedded will require two jumpers to be  * J16 is a two pin header, remove the jumper (or leave it on pin1 only)  * J15 is a three pin header, move the jumper to (pin1, pin2) -Then run the following commands to record the setting into the EEPROM: -:: - -    cd <install-path>/share/uhd/utils -    ./usrp_burn_mb_eeprom --key=mcr --val=61.44e6 - +**Note:** See instructions below to communicate the desired clock rate into the UHD.  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  Set other rates - uses internal VCO @@ -50,11 +45,13 @@ To use other clock rates, the jumpers will need to be in the default position.  * J16 is a two pin header, move the jumper to (pin1, pin2)  * J15 is a three pin header, move the jumper to (pin2, pin3) -Then run the following commands to record the setting into the EEPROM: +To communicate the desired clock rate into the UHD, +specify the a special device address argument, +where the key is "master_clock_rate" and the value is a rate in Hz. +Example:  :: -    cd <install-path>/share/uhd/utils -    ./usrp_burn_mb_eeprom --key=mcr --val=<rate> +    uhd_usrp_probe --args="master_clock_rate=52e6"  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  Clock rate recovery - unbricking diff --git a/host/lib/usrp/mboard_eeprom.cpp b/host/lib/usrp/mboard_eeprom.cpp index 297de990f..2ee4a9284 100644 --- a/host/lib/usrp/mboard_eeprom.cpp +++ b/host/lib/usrp/mboard_eeprom.cpp @@ -252,8 +252,7 @@ struct e100_eeprom_map{      unsigned char env_var[16];      unsigned char env_setting[64];      unsigned char serial[10]; -    unsigned char name[16]; -    unsigned char mcr[sizeof(float)]; +    unsigned char name[NAME_MAX_LEN];  };  template <typename T> static const byte_vector_t to_bytes(const T &item){ @@ -285,20 +284,6 @@ static void load_e100(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){      load_e100_string_xx(env_setting);      load_e100_string_xx(serial);      load_e100_string_xx(name); - -    //extract the master clock rate -    float master_clock_rate = 0; -    const byte_vector_t rate_bytes = iface.read_eeprom( -        E100_EEPROM_ADDR, offsetof(e100_eeprom_map, mcr), sizeof(master_clock_rate) -    ); -    std::copy( -        rate_bytes.begin(), rate_bytes.end(), //source -        reinterpret_cast<boost::uint8_t *>(&master_clock_rate) //destination -    ); -    if (master_clock_rate > 1e6 and master_clock_rate < 1e9){ -        mb_eeprom["mcr"] = boost::lexical_cast<std::string>(master_clock_rate); -    } -    else mb_eeprom["mcr"] = "";  }  static void store_e100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){ @@ -333,18 +318,6 @@ static void store_e100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){      store_e100_string_xx(env_setting);      store_e100_string_xx(serial);      store_e100_string_xx(name); - -    //store the master clock rate -    if (mb_eeprom.has_key("mcr")){ -        const float master_clock_rate = float(boost::lexical_cast<double>(mb_eeprom["mcr"])); -        const byte_vector_t rate_bytes( -            reinterpret_cast<const boost::uint8_t *>(&master_clock_rate), -            reinterpret_cast<const boost::uint8_t *>(&master_clock_rate) + sizeof(master_clock_rate) -        ); -        iface.write_eeprom( -            E100_EEPROM_ADDR, offsetof(e100_eeprom_map, mcr), rate_bytes -        ); -    }  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp_e100/clock_ctrl.cpp b/host/lib/usrp/usrp_e100/clock_ctrl.cpp index 968c2ea04..49ce0c742 100644 --- a/host/lib/usrp/usrp_e100/clock_ctrl.cpp +++ b/host/lib/usrp/usrp_e100/clock_ctrl.cpp @@ -37,7 +37,6 @@ using namespace uhd;   **********************************************************************/  static const bool ENABLE_THE_TEST_OUT = true;  static const double REFERENCE_INPUT_RATE = 10e6; -static const double DEFAULT_OUTPUT_RATE = 64e6;  /***********************************************************************   * Helpers @@ -168,7 +167,7 @@ static clock_settings_type get_clock_settings(double rate){   **********************************************************************/  class usrp_e100_clock_ctrl_impl : public usrp_e100_clock_ctrl{  public: -    usrp_e100_clock_ctrl_impl(usrp_e100_iface::sptr iface){ +    usrp_e100_clock_ctrl_impl(usrp_e100_iface::sptr iface, double master_clock_rate){          _iface = iface;          _chan_rate = 0.0;          _out_rate = 0.0; @@ -185,24 +184,9 @@ public:          this->use_internal_ref(); -        //initialize the FPGA clock to something -        bool fpga_clock_initialized = false; -        try{ -            if (not _iface->mb_eeprom["mcr"].empty()){ -                UHD_MSG(status) << "Read FPGA clock rate from EEPROM setting." << std::endl; -                const double master_clock_rate = boost::lexical_cast<double>(_iface->mb_eeprom["mcr"]); -                UHD_MSG(status) << boost::format("Initializing FPGA clock to %fMHz...") % (master_clock_rate/1e6) << std::endl; -                this->set_fpga_clock_rate(master_clock_rate); -                fpga_clock_initialized = true; -            } -        } -        catch(const std::exception &e){ -            UHD_MSG(error) << "Error setting FPGA clock rate from EEPROM: " << e.what() << std::endl; -        } -        if (not fpga_clock_initialized){ //was not set... use the default rate -            UHD_MSG(status) << boost::format("Initializing FPGA clock to %fMHz...") % (DEFAULT_OUTPUT_RATE/1e6) << std::endl; -            this->set_fpga_clock_rate(DEFAULT_OUTPUT_RATE); -        } +        //initialize the FPGA clock rate +        UHD_MSG(status) << boost::format("Initializing FPGA clock to %fMHz...") % (master_clock_rate/1e6) << std::endl; +        this->set_fpga_clock_rate(master_clock_rate);          this->enable_test_clock(ENABLE_THE_TEST_OUT);          this->enable_rx_dboard_clock(false); @@ -518,6 +502,6 @@ private:  /***********************************************************************   * Clock Control Make   **********************************************************************/ -usrp_e100_clock_ctrl::sptr usrp_e100_clock_ctrl::make(usrp_e100_iface::sptr iface){ -    return sptr(new usrp_e100_clock_ctrl_impl(iface)); +usrp_e100_clock_ctrl::sptr usrp_e100_clock_ctrl::make(usrp_e100_iface::sptr iface, double master_clock_rate){ +    return sptr(new usrp_e100_clock_ctrl_impl(iface, master_clock_rate));  } diff --git a/host/lib/usrp/usrp_e100/clock_ctrl.hpp b/host/lib/usrp/usrp_e100/clock_ctrl.hpp index 507f914f3..6f16bc6ed 100644 --- a/host/lib/usrp/usrp_e100/clock_ctrl.hpp +++ b/host/lib/usrp/usrp_e100/clock_ctrl.hpp @@ -35,9 +35,10 @@ public:      /*!       * Make a new clock control object.       * \param iface the usrp_e100 iface object +     * \param master clock rate the FPGA rate       * \return the clock control object       */ -    static sptr make(usrp_e100_iface::sptr iface); +    static sptr make(usrp_e100_iface::sptr iface, double master_clock_rate);      /*!       * Set the rate of the fpga clock line. diff --git a/host/lib/usrp/usrp_e100/mboard_impl.cpp b/host/lib/usrp/usrp_e100/mboard_impl.cpp index d31662eb5..b2533e7ee 100644 --- a/host/lib/usrp/usrp_e100/mboard_impl.cpp +++ b/host/lib/usrp/usrp_e100/mboard_impl.cpp @@ -209,7 +209,8 @@ void usrp_e100_impl::mboard_set(const wax::obj &key, const wax::obj &val){      case MBOARD_PROP_CLOCK_RATE:          UHD_MSG(warning)              << "I see that you are setting the master clock rate from the API.\n" -            << "You may find it more convenient to burn this setting into the EEPROM.\n" +            << "You may want to pass this into the device address as mcr=<rate>.\n" +            << "This way, the clock rate is guaranteed to be initialized first.\n"              << "See the application notes for USRP-E1XX for further instructions.\n"          ;          _clock_ctrl->set_fpga_clock_rate(val.as<double>()); diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp index 4247746ab..5fba0c153 100644 --- a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp +++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp @@ -156,7 +156,8 @@ usrp_e100_impl::usrp_e100_impl(  {      //setup interfaces into hardware -    _clock_ctrl = usrp_e100_clock_ctrl::make(_iface); +    const double master_clock_rate = device_addr.cast<double>("master_clock_rate", 64e6); +    _clock_ctrl = usrp_e100_clock_ctrl::make(_iface, master_clock_rate);      _codec_ctrl = usrp_e100_codec_ctrl::make(_iface);      //initialize the mboard | 
