diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/mboard_eeprom.cpp | 25 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/clock_ctrl.cpp | 19 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e100/mboard_impl.cpp | 4 | 
3 files changed, 47 insertions, 1 deletions
| diff --git a/host/lib/usrp/mboard_eeprom.cpp b/host/lib/usrp/mboard_eeprom.cpp index 869a38478..03096691e 100644 --- a/host/lib/usrp/mboard_eeprom.cpp +++ b/host/lib/usrp/mboard_eeprom.cpp @@ -223,6 +223,7 @@ struct e100_eeprom_map{      unsigned char env_setting[64];      unsigned char serial[10];      unsigned char name[NAME_MAX_LEN]; +    float master_clock_rate;  };  template <typename T> static const byte_vector_t to_bytes(const T &item){ @@ -254,6 +255,19 @@ 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, master_clock_rate), 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["master_clock_rate"] = boost::lexical_cast<std::string>(master_clock_rate); +    }  }  static void store_e100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){ @@ -289,6 +303,17 @@ static void store_e100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){      store_e100_string_xx(serial);      store_e100_string_xx(name); +    //store the master clock rate +    if (mb_eeprom.has_key("master_clock_rate")){ +        const float master_clock_rate = float(boost::lexical_cast<double>(mb_eeprom["master_clock_rate"])); +        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, master_clock_rate), rate_bytes +        ); +    }  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp_e100/clock_ctrl.cpp b/host/lib/usrp/usrp_e100/clock_ctrl.cpp index 1ac2b804c..851ce29b0 100644 --- a/host/lib/usrp/usrp_e100/clock_ctrl.cpp +++ b/host/lib/usrp/usrp_e100/clock_ctrl.cpp @@ -184,7 +184,24 @@ public:          this->use_internal_ref(); -        this->set_fpga_clock_rate(DEFAULT_OUTPUT_RATE); //initialize to something +        //initialize the FPGA clock to something +        bool fpga_clock_initialized = false; +        try{ +            if (_iface->mb_eeprom.has_key("master_clock_rate")){ +                std::cout << "Read FPGA clock rate from EEPROM setting." << std::endl; +                const double master_clock_rate = boost::lexical_cast<double>(_iface->mb_eeprom["master_clock_rate"]); +                std::cout << 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){ +            std::cerr << "Error setting FPGA clock rate from EEPROM: " << e.what() << std::endl; +        } +        if (not fpga_clock_initialized){ //was not set... use the default rate +            std::cout << boost::format("Initializing FPGA clock to %fMHz...") % (DEFAULT_OUTPUT_RATE/1e6) << std::endl; +            this->set_fpga_clock_rate(DEFAULT_OUTPUT_RATE); +        }          this->enable_test_clock(ENABLE_THE_TEST_OUT);          this->enable_rx_dboard_clock(false); diff --git a/host/lib/usrp/usrp_e100/mboard_impl.cpp b/host/lib/usrp/usrp_e100/mboard_impl.cpp index 29e3c5da2..5f4a208d3 100644 --- a/host/lib/usrp/usrp_e100/mboard_impl.cpp +++ b/host/lib/usrp/usrp_e100/mboard_impl.cpp @@ -207,6 +207,10 @@ void usrp_e100_impl::mboard_set(const wax::obj &key, const wax::obj &val){          return;      case MBOARD_PROP_CLOCK_RATE: +        std::cerr << "Helpful message:" << std::endl; +        std::cerr << "    I see that you are setting the master clock rate from the API." << std::endl; +        std::cerr << "    You may find it more convenient to burn this setting into the EEPROM." << std::endl; +        std::cerr << "    See the application notes for USRP-E1XX for further instructions." << std::endl;          _clock_ctrl->set_fpga_clock_rate(val.as<double>());          return; | 
