diff options
| -rw-r--r-- | host/lib/usrp/b100/b100_impl.cpp | 19 | ||||
| -rw-r--r-- | host/lib/usrp/common/fx2_ctrl.cpp | 9 | ||||
| -rw-r--r-- | host/lib/usrp/common/fx2_ctrl.hpp | 3 | 
3 files changed, 31 insertions, 0 deletions
diff --git a/host/lib/usrp/b100/b100_impl.cpp b/host/lib/usrp/b100/b100_impl.cpp index af10590ac..8b55494c5 100644 --- a/host/lib/usrp/b100/b100_impl.cpp +++ b/host/lib/usrp/b100/b100_impl.cpp @@ -150,6 +150,10 @@ UHD_STATIC_BLOCK(register_b100_device){   * Structors   **********************************************************************/  b100_impl::b100_impl(const device_addr_t &device_addr){ +    size_t initialization_count = 0; +    b100_impl_constructor_begin: +    initialization_count++; +      _tree = property_tree::make();      //extract the FPGA path for the B100 @@ -205,6 +209,21 @@ b100_impl::b100_impl(const device_addr_t &device_addr){      ////////////////////////////////////////////////////////////////////      _fpga_ctrl = b100_ctrl::make(_ctrl_transport);      _fpga_ctrl->poke32(B100_REG_GLOBAL_RESET, 0); //global fpga reset +    //perform a test peek operation +    try{ +        _fpga_ctrl->peek32(0); +    } +    //try reset once in the case of failure +    catch(const uhd::exception &e){ +        if (initialization_count > 1) throw; +        UHD_MSG(warning) << +            "The control endpoint was left in a bad state.\n" +            "Attempting endpoint re-enumeration...\n" << std::endl; +        _fpga_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      //////////////////////////////////////////////////////////////////// diff --git a/host/lib/usrp/common/fx2_ctrl.cpp b/host/lib/usrp/common/fx2_ctrl.cpp index baf8f5e68..7b8920eb1 100644 --- a/host/lib/usrp/common/fx2_ctrl.cpp +++ b/host/lib/usrp/common/fx2_ctrl.cpp @@ -139,6 +139,15 @@ public:          _ctrl_transport = ctrl_transport;      } +    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 +        boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); +    } +      void usrp_load_firmware(std::string filestring, bool force)      {          const char *filename = filestring.c_str(); diff --git a/host/lib/usrp/common/fx2_ctrl.hpp b/host/lib/usrp/common/fx2_ctrl.hpp index 5e28e8081..f2e060862 100644 --- a/host/lib/usrp/common/fx2_ctrl.hpp +++ b/host/lib/usrp/common/fx2_ctrl.hpp @@ -39,6 +39,9 @@ public:      //! Call init after the fpga is loaded      virtual void usrp_init(void) = 0; +    //! For emergency situations +    virtual void usrp_fx2_reset(void) = 0; +      /*!       * Load firmware in Intel HEX Format onto device        * \param filename name of firmware file  | 
