From 1bb2525e77284f5387325d5a34934518c1833731 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 13 Jun 2011 19:59:13 +0100 Subject: e100: dual dsp working, cleanup for io impl, needs more testing --- host/lib/usrp/usrp_e100/io_impl.cpp | 111 ++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/host/lib/usrp/usrp_e100/io_impl.cpp b/host/lib/usrp/usrp_e100/io_impl.cpp index a87f53048..d85beca8b 100644 --- a/host/lib/usrp/usrp_e100/io_impl.cpp +++ b/host/lib/usrp/usrp_e100/io_impl.cpp @@ -39,7 +39,25 @@ using namespace uhd::transport; * Constants **********************************************************************/ static const int underflow_flags = async_metadata_t::EVENT_CODE_UNDERFLOW | async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET; -#define fp_recv_debug false + +/*********************************************************************** + * Helpers + **********************************************************************/ +#if 0 +# define debug_print_buff(...) +#else +static void debug_print_buff(const std::string &what, managed_recv_buffer::sptr buff){ + std::ostringstream ss; + ss << boost::format( + "This is a %s packet, %u bytes.\n" + ) % what % buff->size(); + for (size_t i = 0; i < 9; i++){ + ss << boost::format(" buff[%u] = 0x%08x\n") % i % buff->cast()[i]; + } + ss << std::endl << std::endl; + UHD_MSG(status) << ss.str(); +} +#endif /*********************************************************************** * io impl details (internal to this file) @@ -60,7 +78,6 @@ struct usrp_e100_impl::io_impl{ } ~io_impl(void){ - recv_pirate_crew_raiding = false; recv_pirate_crew.interrupt_all(); recv_pirate_crew.join_all(); for (size_t i = 0; i < recv_pirate_booty.size(); i++){ @@ -90,7 +107,6 @@ struct usrp_e100_impl::io_impl{ std::vector *> recv_pirate_booty; bounded_buffer async_msg_fifo; boost::thread_group recv_pirate_crew; - bool recv_pirate_crew_raiding; }; /*********************************************************************** @@ -101,64 +117,51 @@ struct usrp_e100_impl::io_impl{ void usrp_e100_impl::io_impl::recv_pirate_loop( boost::barrier &spawn_barrier, usrp_e100_clock_ctrl::sptr clock_ctrl ){ - recv_pirate_crew_raiding = true; spawn_barrier.wait(); set_thread_priority_safe(); - while(recv_pirate_crew_raiding){ + while (not boost::this_thread::interruption_requested()){ managed_recv_buffer::sptr buff = this->data_xport->get_recv_buff(); - if (not buff.get()) continue; //ignore timeout/error buffers - - if (fp_recv_debug){ - std::ostringstream ss; - ss << "len " << buff->size() << std::endl; - for (size_t i = 0; i < 9; i++){ - ss << boost::format(" 0x%08x") % buff->cast()[i] << std::endl; - } - ss << std::endl << std::endl; - UHD_LOGV(always) << ss.str(); + if (buff.get() == NULL) continue; //ignore timeout buffers + + //handle an rx data packet or inline message + const boost::uint32_t *vrt_hdr = buff->cast(); + const size_t rx_index = vrt_hdr[1] - E100_DSP_SID_BASE; + if (rx_index < E100_NUM_RX_DSPS){ + debug_print_buff("data", buff); + recv_pirate_booty[rx_index]->push_with_wait(buff); + continue; + } + + //otherwise, unpack the vrt header and process below... + vrt::if_packet_info_t if_packet_info; + if_packet_info.num_packet_words32 = buff->size()/sizeof(boost::uint32_t); + try{vrt::if_hdr_unpack_le(vrt_hdr, if_packet_info);} + catch(const std::exception &e){ + UHD_MSG(error) << "Error unpacking vrt header:\n" << e.what() << std::endl; + continue; } - try{ - //handle an rx data packet or inline message - const boost::uint32_t *vrt_hdr = buff->cast(); - const size_t rx_index = uhd::ntohx(vrt_hdr[1]); - if (rx_index < E100_NUM_RX_DSPS){ - if (fp_recv_debug) UHD_LOGV(always) << "this is rx_data_inline_sid\n"; - recv_pirate_booty[rx_index]->push_with_wait(buff); - continue; - } - - //unpack the vrt header and process below... - vrt::if_packet_info_t if_packet_info; - if_packet_info.num_packet_words32 = buff->size()/sizeof(boost::uint32_t); - vrt::if_hdr_unpack_le(vrt_hdr, if_packet_info); - - //handle a tx async report message - if (if_packet_info.sid == E100_ASYNC_SID and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){ - if (fp_recv_debug) UHD_LOGV(always) << "this is tx_async_report_sid\n"; - - //fill in the async metadata - async_metadata_t metadata; - metadata.channel = 0; - metadata.has_time_spec = if_packet_info.has_tsi and if_packet_info.has_tsf; - metadata.time_spec = time_spec_t( - time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), clock_ctrl->get_fpga_clock_rate() - ); - metadata.event_code = async_metadata_t::event_code_t(sph::get_context_code(vrt_hdr, if_packet_info)); - - //print the famous U, and push the metadata into the message queue - if (metadata.event_code & underflow_flags) UHD_MSG(fastpath) << "U"; - async_msg_fifo.push_with_pop_on_full(metadata); - continue; - } - - //TODO replace this below with a UHD_MSG(error) - if (fp_recv_debug) UHD_LOGV(always) << "this is unknown packet\n"; - - }catch(const std::exception &e){ - UHD_MSG(error) << "Error (usrp-e recv pirate loop): " << e.what() << std::endl; + //handle a tx async report message + if (if_packet_info.sid == E100_ASYNC_SID and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){ + debug_print_buff("async", buff); + + //fill in the async metadata + async_metadata_t metadata; + metadata.channel = 0; + metadata.has_time_spec = if_packet_info.has_tsi and if_packet_info.has_tsf; + metadata.time_spec = time_spec_t( + time_t(if_packet_info.tsi), long(if_packet_info.tsf), clock_ctrl->get_fpga_clock_rate() + ); + metadata.event_code = async_metadata_t::event_code_t(sph::get_context_code(vrt_hdr, if_packet_info)); + + //print the famous U, and push the metadata into the message queue + if (metadata.event_code & underflow_flags) UHD_MSG(fastpath) << "U"; + async_msg_fifo.push_with_pop_on_full(metadata); + continue; } + + debug_print_buff("unknown", buff); } } -- cgit v1.2.3