diff options
author | Nick Foster <nick@ettus.com> | 2011-08-24 16:18:21 -0700 |
---|---|---|
committer | Nick Foster <nick@ettus.com> | 2011-08-24 16:19:06 -0700 |
commit | 544f80129f62d3fcf9ffd2af22f09b4cb27c5390 (patch) | |
tree | 6df71f2e50a96a5685634c1ccaeca08afae6a85c | |
parent | 1d842e0767040fca346abcdc52861b214225ea13 (diff) | |
download | uhd-544f80129f62d3fcf9ffd2af22f09b4cb27c5390.tar.gz uhd-544f80129f62d3fcf9ffd2af22f09b4cb27c5390.tar.bz2 uhd-544f80129f62d3fcf9ffd2af22f09b4cb27c5390.zip |
B100: reset FPGA GPIF fifos correctly so no garbage data on startup
-rw-r--r-- | host/lib/usrp/b100/b100_impl.cpp | 47 | ||||
-rw-r--r-- | host/lib/usrp/b100/io_impl.cpp | 5 |
2 files changed, 34 insertions, 18 deletions
diff --git a/host/lib/usrp/b100/b100_impl.cpp b/host/lib/usrp/b100/b100_impl.cpp index ea9c91c50..06ea0bb78 100644 --- a/host/lib/usrp/b100/b100_impl.cpp +++ b/host/lib/usrp/b100/b100_impl.cpp @@ -158,7 +158,7 @@ b100_impl::b100_impl(const device_addr_t &device_addr){ } UHD_ASSERT_THROW(handle.get() != NULL); //better be found - //create control objects and a data transport + //create control objects usb_control::sptr fx2_transport = usb_control::make(handle); _fx2_ctrl = fx2_ctrl::make(fx2_transport); this->check_fw_compat(); //check after making fx2 @@ -166,21 +166,6 @@ b100_impl::b100_impl(const device_addr_t &device_addr){ _clock_ctrl = b100_clock_ctrl::make(_fx2_ctrl, device_addr.cast<double>("master_clock_rate", B100_DEFAULT_TICK_RATE)); _fx2_ctrl->usrp_load_fpga(b100_fpga_image); - device_addr_t data_xport_args; - data_xport_args["recv_frame_size"] = device_addr.get("recv_frame_size", "16384"); - data_xport_args["num_recv_frames"] = device_addr.get("num_recv_frames", "16"); - data_xport_args["send_frame_size"] = device_addr.get("send_frame_size", "16384"); - data_xport_args["num_send_frames"] = device_addr.get("num_send_frames", "16"); - - _data_transport = usb_zero_copy::make_wrapper( - usb_zero_copy::make( - handle, // identifier - 6, // IN endpoint - 2, // OUT endpoint - data_xport_args // param hints - ) - ); - //create the control transport device_addr_t ctrl_xport_args; ctrl_xport_args["recv_frame_size"] = boost::lexical_cast<std::string>(CTRL_PACKET_LENGTH); @@ -205,6 +190,36 @@ b100_impl::b100_impl(const device_addr_t &device_addr){ _fpga_spi_ctrl = spi_core_100::make(_fpga_ctrl, B100_REG_SLAVE(2)); //////////////////////////////////////////////////////////////////// + // Reset buffers in data path + //////////////////////////////////////////////////////////////////// + _fpga_ctrl->poke32(B100_REG_GLOBAL_RESET, 0); + _fpga_ctrl->poke32(B100_REG_CLEAR_RX, 0); + _fpga_ctrl->poke32(B100_REG_CLEAR_TX, 0); + this->reset_gpif(6); + this->reset_gpif(2); + + //////////////////////////////////////////////////////////////////// + // Create data transport + // This happens after FPGA ctrl instantiated so any junk that might + // be in the FPGAs buffers doesn't get pulled into the transport + // before being cleared. + //////////////////////////////////////////////////////////////////// + device_addr_t data_xport_args; + data_xport_args["recv_frame_size"] = device_addr.get("recv_frame_size", "16384"); + data_xport_args["num_recv_frames"] = device_addr.get("num_recv_frames", "16"); + data_xport_args["send_frame_size"] = device_addr.get("send_frame_size", "16384"); + data_xport_args["num_send_frames"] = device_addr.get("num_send_frames", "16"); + + _data_transport = usb_zero_copy::make_wrapper( + usb_zero_copy::make( + handle, // identifier + 6, // IN endpoint + 2, // OUT endpoint + data_xport_args // param hints + ) + ); + + //////////////////////////////////////////////////////////////////// // Initialize the properties tree //////////////////////////////////////////////////////////////////// _tree = property_tree::make(); diff --git a/host/lib/usrp/b100/io_impl.cpp b/host/lib/usrp/b100/io_impl.cpp index 34535217a..d2eee4f7c 100644 --- a/host/lib/usrp/b100/io_impl.cpp +++ b/host/lib/usrp/b100/io_impl.cpp @@ -65,8 +65,9 @@ void b100_impl::io_init(void){ _tx_otw_type.shift = 0; _tx_otw_type.byteorder = uhd::otw_type_t::BO_LITTLE_ENDIAN; - //TODO best place to put this? - this->reset_gpif(6); + //clear state machines + _fpga_ctrl->poke32(B100_REG_CLEAR_RX, 0); + _fpga_ctrl->poke32(B100_REG_CLEAR_TX, 0); //set the expected packet size in USB frames _fpga_ctrl->poke32(B100_REG_MISC_RX_LEN, 4); |