diff options
author | Josh Blum <josh@joshknows.com> | 2010-07-07 03:40:25 +0000 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2010-07-07 03:40:25 +0000 |
commit | 416f720e56ff4542d5ba4b8c9c145f0a09bf341b (patch) | |
tree | 41c4b32cdecc4b50ec982288087824a5f4e363b3 /host/lib/usrp | |
parent | f2e9d3ed0941dc5738149dd82d1eac158bdf0a0f (diff) | |
download | uhd-416f720e56ff4542d5ba4b8c9c145f0a09bf341b.tar.gz uhd-416f720e56ff4542d5ba4b8c9c145f0a09bf341b.tar.bz2 uhd-416f720e56ff4542d5ba4b8c9c145f0a09bf341b.zip |
uhd: updated code to build with latest api, not tested
Diffstat (limited to 'host/lib/usrp')
-rw-r--r-- | host/lib/usrp/usrp_e/io_impl.cpp | 112 | ||||
-rw-r--r-- | host/lib/usrp/usrp_e/mboard_impl.cpp | 4 | ||||
-rw-r--r-- | host/lib/usrp/usrp_e/usrp_e_impl.hpp | 4 |
3 files changed, 74 insertions, 46 deletions
diff --git a/host/lib/usrp/usrp_e/io_impl.cpp b/host/lib/usrp/usrp_e/io_impl.cpp index c168d6304..a77a73b38 100644 --- a/host/lib/usrp/usrp_e/io_impl.cpp +++ b/host/lib/usrp/usrp_e/io_impl.cpp @@ -24,6 +24,7 @@ #include <stddef.h> //offsetof #include <poll.h> #include <boost/format.hpp> +#include <boost/assign.hpp> #include <iostream> using namespace uhd; @@ -127,10 +128,11 @@ private: * IO Implementation Details **********************************************************************/ struct usrp_e_impl::io_impl{ - vrt_packet_handler::recv_state recv_state; - vrt_packet_handler::send_state send_state; + //state management for the vrt packet handler code + vrt_packet_handler::recv_state packet_handler_recv_state; + vrt_packet_handler::send_state packet_handler_send_state; data_transport transport; - io_impl(int fd): transport(fd){} + io_impl(int fd): packet_handler_recv_state(1), transport(fd){} }; void usrp_e_impl::io_init(void){ @@ -150,35 +152,56 @@ void usrp_e_impl::io_init(void){ _io_impl = UHD_PIMPL_MAKE(io_impl, (_iface->get_file_descriptor())); } -static boost::uint32_t make_stream_cmd(bool now, bool chain, boost::uint32_t nsamps){ - return (((now)? 1 : 0) << 31) | (((chain)? 1 : 0) << 30) | nsamps; +static boost::uint32_t make_stream_cmd(bool now, bool chain, bool reload, boost::uint32_t nsamps){ + return (((now)? 1 : 0) << 31) | (((chain)? 1 : 0) << 30) | (((reload)? 1 : 0) << 29) | nsamps; } void usrp_e_impl::issue_stream_cmd(const stream_cmd_t &stream_cmd){ - boost::uint32_t cmd = 0; - switch(stream_cmd.stream_mode){ - case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE: - cmd = make_stream_cmd(stream_cmd.stream_now, false, stream_cmd.num_samps); - break; + UHD_ASSERT_THROW(stream_cmd.num_samps <= 0x3fffffff); - case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE: - cmd = make_stream_cmd(stream_cmd.stream_now, true, stream_cmd.num_samps); - break; + //setup the mode to instruction flags + typedef boost::tuple<bool, bool, bool> inst_t; + static const uhd::dict<stream_cmd_t::stream_mode_t, inst_t> mode_to_inst = boost::assign::map_list_of + //reload, chain, samps + (stream_cmd_t::STREAM_MODE_START_CONTINUOUS, inst_t(true, true, false)) + (stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS, inst_t(false, false, false)) + (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE, inst_t(false, false, true)) + (stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE, inst_t(false, true, true)) + ; + + //setup the instruction flag values + bool inst_reload, inst_chain, inst_samps; + boost::tie(inst_reload, inst_chain, inst_samps) = mode_to_inst[stream_cmd.stream_mode]; + + //issue the stream command + _iface->poke32(UE_REG_CTRL_RX_STREAM_CMD, make_stream_cmd( + (inst_samps)? stream_cmd.num_samps : ((inst_chain)? get_max_recv_samps_per_packet() : 1), + (stream_cmd.stream_now)? 1 : 0, + (inst_chain)? 1 : 0, + (inst_reload)? 1 : 0 + )); + _iface->poke32(UE_REG_CTRL_RX_TIME_SECS, boost::uint32_t(stream_cmd.time_spec.get_full_secs())); + _iface->poke32(UE_REG_CTRL_RX_TIME_TICKS, stream_cmd.time_spec.get_tick_count(MASTER_CLOCK_RATE)); - default: throw std::runtime_error("stream mode not implemented"); - } - _iface->poke32(UE_REG_CTRL_RX_STREAM_CMD, cmd); - _iface->poke32(UE_REG_CTRL_RX_TIME_SECS, stream_cmd.time_spec.secs); - _iface->poke32(UE_REG_CTRL_RX_TIME_TICKS, stream_cmd.time_spec.get_ticks(MASTER_CLOCK_RATE)); } /*********************************************************************** * Data Send **********************************************************************/ +bool get_send_buffs( + data_transport *trans, + vrt_packet_handler::managed_send_buffs_t &buffs +){ + UHD_ASSERT_THROW(buffs.size() == 1); + buffs[0] = trans->get_send_buff(); + return buffs[0].get() != NULL; +} + size_t usrp_e_impl::send( - const boost::asio::const_buffer &buff, - const uhd::tx_metadata_t &metadata, - const io_type_t & io_type, + const std::vector<const void *> &buffs, + size_t num_samps, + const tx_metadata_t &metadata, + const io_type_t &io_type, send_mode_t send_mode ){ otw_type_t send_otw_type; @@ -187,15 +210,13 @@ size_t usrp_e_impl::send( send_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; return vrt_packet_handler::send( - _io_impl->send_state, - buff, - metadata, - send_mode, - io_type, - send_otw_type, //TODO - MASTER_CLOCK_RATE, - uhd::transport::vrt::pack_le, - boost::bind(&data_transport::get_send_buff, &_io_impl->transport), + _io_impl->packet_handler_send_state, //last state of the send handler + buffs, num_samps, //buffer to fill + metadata, send_mode, //samples metadata + io_type, send_otw_type, //input and output types to convert + MASTER_CLOCK_RATE, //master clock tick rate + uhd::transport::vrt::if_hdr_pack_le, + boost::bind(&get_send_buffs, &_io_impl->transport, _1), get_max_send_samps_per_packet(), vrt_header_offset_words32 ); @@ -204,9 +225,19 @@ size_t usrp_e_impl::send( /*********************************************************************** * Data Recv **********************************************************************/ +bool get_recv_buffs( + data_transport *trans, + vrt_packet_handler::managed_recv_buffs_t &buffs +){ + UHD_ASSERT_THROW(buffs.size() == 1); + buffs[0] = trans->get_recv_buff(); + return buffs[0].get() != NULL; +} + size_t usrp_e_impl::recv( - const boost::asio::mutable_buffer &buff, - uhd::rx_metadata_t &metadata, + const std::vector<void *> &buffs, + size_t num_samps, + rx_metadata_t &metadata, const io_type_t &io_type, recv_mode_t recv_mode ){ @@ -216,15 +247,12 @@ size_t usrp_e_impl::recv( recv_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; return vrt_packet_handler::recv( - _io_impl->recv_state, - buff, - metadata, - recv_mode, - io_type, - recv_otw_type, //TODO - MASTER_CLOCK_RATE, - uhd::transport::vrt::unpack_le, - boost::bind(&data_transport::get_recv_buff, &_io_impl->transport), - vrt_header_offset_words32 + _io_impl->packet_handler_recv_state, //last state of the recv handler + buffs, num_samps, //buffer to fill + metadata, recv_mode, //samples metadata + io_type, recv_otw_type, //input and output types to convert + MASTER_CLOCK_RATE, //master clock tick rate + uhd::transport::vrt::if_hdr_unpack_le, + boost::bind(get_recv_buffs, &_io_impl->transport, _1) ); } diff --git a/host/lib/usrp/usrp_e/mboard_impl.cpp b/host/lib/usrp/usrp_e/mboard_impl.cpp index e4a0e81af..e27c1964a 100644 --- a/host/lib/usrp/usrp_e/mboard_impl.cpp +++ b/host/lib/usrp/usrp_e/mboard_impl.cpp @@ -116,10 +116,10 @@ void usrp_e_impl::mboard_set(const wax::obj &key, const wax::obj &val){ case MBOARD_PROP_TIME_NOW: case MBOARD_PROP_TIME_NEXT_PPS:{ time_spec_t time_spec = val.as<time_spec_t>(); - _iface->poke32(UE_REG_TIME64_TICKS, time_spec.get_ticks(MASTER_CLOCK_RATE)); + _iface->poke32(UE_REG_TIME64_TICKS, time_spec.get_tick_count(MASTER_CLOCK_RATE)); boost::uint32_t imm_flags = (key.as<mboard_prop_t>() == MBOARD_PROP_TIME_NOW)? 1 : 0; _iface->poke32(UE_REG_TIME64_IMM, imm_flags); - _iface->poke32(UE_REG_TIME64_SECS, time_spec.secs); + _iface->poke32(UE_REG_TIME64_SECS, time_spec.get_full_secs()); } return; diff --git a/host/lib/usrp/usrp_e/usrp_e_impl.hpp b/host/lib/usrp/usrp_e/usrp_e_impl.hpp index e6bea1358..c0e302bd8 100644 --- a/host/lib/usrp/usrp_e/usrp_e_impl.hpp +++ b/host/lib/usrp/usrp_e/usrp_e_impl.hpp @@ -81,8 +81,8 @@ public: ~usrp_e_impl(void); //the io interface - size_t send(const boost::asio::const_buffer &, const uhd::tx_metadata_t &, const uhd::io_type_t &, send_mode_t); - size_t recv(const boost::asio::mutable_buffer &, uhd::rx_metadata_t &, const uhd::io_type_t &, recv_mode_t); + size_t send(const std::vector<const void *> &, size_t, const uhd::tx_metadata_t &, const uhd::io_type_t &, send_mode_t); + size_t recv(const std::vector<void *> &, size_t, uhd::rx_metadata_t &, const uhd::io_type_t &, recv_mode_t); size_t get_max_send_samps_per_packet(void) const{return 300;} size_t get_max_recv_samps_per_packet(void) const{return 300;} |