diff options
| author | Josh Blum <josh@joshknows.com> | 2010-05-10 14:18:00 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-05-10 14:18:00 -0700 | 
| commit | 650e0d9b35eeca9cec3989159310f4d5e3d38836 (patch) | |
| tree | d311fffb7abb84e61c76251df5cdcd0383cf3918 /host/lib/usrp/usrp2 | |
| parent | 9c7c178f70f8a78dc638d5f4301407893351b4fd (diff) | |
| parent | 30bd666e306cb8f8c947c6ba99a76f7c49484597 (diff) | |
| download | uhd-650e0d9b35eeca9cec3989159310f4d5e3d38836.tar.gz uhd-650e0d9b35eeca9cec3989159310f4d5e3d38836.tar.bz2 uhd-650e0d9b35eeca9cec3989159310f4d5e3d38836.zip | |
Merge branch 'shrinkfw' into usrp2
Diffstat (limited to 'host/lib/usrp/usrp2')
| -rw-r--r-- | host/lib/usrp/usrp2/dsp_impl.cpp | 3 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/fw_common.h | 14 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 22 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 72 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_regs.hpp | 39 | 
5 files changed, 90 insertions, 60 deletions
| diff --git a/host/lib/usrp/usrp2/dsp_impl.cpp b/host/lib/usrp/usrp2/dsp_impl.cpp index fc4c5479e..195a9bc53 100644 --- a/host/lib/usrp/usrp2/dsp_impl.cpp +++ b/host/lib/usrp/usrp2/dsp_impl.cpp @@ -94,9 +94,6 @@ void usrp2_impl::init_ddc_config(void){      _ddc_decim = default_decim;      _ddc_freq = 0;      update_ddc_config(); - -    //initial command that kills streaming (in case if was left on) -    issue_ddc_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);  }  void usrp2_impl::update_ddc_config(void){ diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h index e80001ff2..f28013cf6 100644 --- a/host/lib/usrp/usrp2/fw_common.h +++ b/host/lib/usrp/usrp2/fw_common.h @@ -34,7 +34,7 @@ extern "C" {  //defines the protocol version in this shared header  //increment this value when the protocol is changed -#define USRP2_PROTO_VERSION 2 +#define USRP2_PROTO_VERSION 3  //used to differentiate control packets over data port  #define USRP2_INVALID_VRT_HEADER 0 @@ -70,9 +70,6 @@ typedef enum{      USRP2_CTRL_ID_WRITE_THESE_I2C_VALUES_BRO = 'h',      USRP2_CTRL_ID_COOL_IM_DONE_I2C_WRITE_DUDE = 'H', -    USRP2_CTRL_ID_SEND_STREAM_COMMAND_FOR_ME_BRO = '{', -    USRP2_CTRL_ID_GOT_THAT_STREAM_COMMAND_DUDE = '}', -      USRP2_CTRL_ID_POKE_THIS_REGISTER_FOR_ME_BRO = 'p',      USRP2_CTRL_ID_OMG_POKED_REGISTER_SO_BAD_DUDE = 'P', @@ -114,15 +111,6 @@ typedef struct{              _SINS_ uint8_t data[sizeof(_SINS_ uint32_t)];          } i2c_args;          struct { -            _SINS_ uint8_t now; //stream now? -            _SINS_ uint8_t continuous; //auto-reload commmands? -            _SINS_ uint8_t chain; -            _SINS_ uint8_t _pad[1]; -            _SINS_ uint32_t secs; -            _SINS_ uint32_t ticks; -            _SINS_ uint32_t num_samps; -        } stream_cmd; -        struct {              _SINS_ uint32_t addr;              _SINS_ uint32_t data;              _SINS_ uint8_t num_bytes; //1, 2, 4 diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 2634e84aa..7c9d003ce 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -16,6 +16,7 @@  //  #include "usrp2_impl.hpp" +#include "usrp2_regs.hpp"  #include <uhd/transport/convert_types.hpp>  #include <boost/format.hpp>  #include <boost/asio.hpp> //htonl and ntohl @@ -42,14 +43,23 @@ void usrp2_impl::io_init(void){      _rx_stream_id_to_packet_seq[0] = 0;      //send a small data packet so the usrp2 knows the udp source port -    //and the maximum number of lines (32 bit words) per packet      managed_send_buffer::sptr send_buff = _data_transport->get_send_buff(); -    boost::uint32_t data[2] = { -        htonl(USRP2_INVALID_VRT_HEADER), -        htonl(_max_rx_samples_per_packet) -    }; -    memcpy(send_buff->cast<void*>(), data, sizeof(data)); +    boost::uint32_t data = htonl(USRP2_INVALID_VRT_HEADER); +    memcpy(send_buff->cast<void*>(), &data, sizeof(data));      send_buff->done(sizeof(data)); + +    //setup RX DSP regs +    _iface->poke32(FR_RX_CTRL_NSAMPS_PER_PKT, _max_rx_samples_per_packet); +    _iface->poke32(FR_RX_CTRL_NCHANNELS, 1); +    _iface->poke32(FR_RX_CTRL_CLEAR_OVERRUN, 1); //reset +    _iface->poke32(FR_RX_CTRL_VRT_HEADER, 0 +        | (0x1 << 28) //if data with stream id +        | (0x1 << 26) //has trailer +        | (0x3 << 22) //integer time other +        | (0x1 << 20) //fractional time sample count +    ); +    _iface->poke32(FR_RX_CTRL_VRT_STREAM_ID, 0); +    _iface->poke32(FR_RX_CTRL_VRT_TRAILER, 0);  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 36bef4f25..2c8fd2df4 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -63,6 +63,13 @@ void usrp2_impl::mboard_init(void){          boost::uint16_t data = ad9777_regs.get_write_reg(addr);          _iface->transact_spi(SPI_SS_AD9777, spi_config_t::EDGE_RISE, data, 16, false /*no rb*/);      } + +    //enable ADCs +    _iface->poke32(FR_MISC_CTRL_ADC, FRF_MISC_CTRL_ADC_ON); + +    //set up serdes +    _iface->poke32(FR_MISC_CTRL_SERDES, FRF_MISC_CTRL_SERDES_ENABLE | FRF_MISC_CTRL_SERDES_RXEN); +  }  void usrp2_impl::init_clock_config(void){ @@ -97,9 +104,9 @@ void usrp2_impl::update_clock_config(void){      //clock source ref 10mhz      switch(_clock_config.ref_source){ -    case clock_config_t::REF_INT : _iface->poke32(FR_CLOCK_CONTROL, 0x10); break; -    case clock_config_t::REF_SMA : _iface->poke32(FR_CLOCK_CONTROL, 0x1C); break; -    case clock_config_t::REF_MIMO: _iface->poke32(FR_CLOCK_CONTROL, 0x15); break; +    case clock_config_t::REF_INT : _iface->poke32(FR_MISC_CTRL_CLOCK, 0x10); break; +    case clock_config_t::REF_SMA : _iface->poke32(FR_MISC_CTRL_CLOCK, 0x1C); break; +    case clock_config_t::REF_MIMO: _iface->poke32(FR_MISC_CTRL_CLOCK, 0x15); break;      default: throw std::runtime_error("usrp2: unhandled clock configuration reference source");      } @@ -119,40 +126,31 @@ void usrp2_impl::set_time_spec(const time_spec_t &time_spec, bool now){  }  void usrp2_impl::issue_ddc_stream_cmd(const stream_cmd_t &stream_cmd){ -    //setup the out data -    usrp2_ctrl_data_t out_data; -    out_data.id = htonl(USRP2_CTRL_ID_SEND_STREAM_COMMAND_FOR_ME_BRO); -    out_data.data.stream_cmd.now = (stream_cmd.stream_now)? 1 : 0; -    out_data.data.stream_cmd.secs = htonl(stream_cmd.time_spec.secs); -    out_data.data.stream_cmd.ticks = htonl(stream_cmd.time_spec.get_ticks(get_master_clock_freq())); - -    //set these to defaults, then change in the switch statement -    out_data.data.stream_cmd.continuous = 0; -    out_data.data.stream_cmd.chain = 0; -    out_data.data.stream_cmd.num_samps = htonl(stream_cmd.num_samps); - -    //setup chain, num samps, and continuous below -    switch(stream_cmd.stream_mode){ -    case stream_cmd_t::STREAM_MODE_START_CONTINUOUS: -        out_data.data.stream_cmd.continuous = 1; -        break; - -    case stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS: -        out_data.data.stream_cmd.num_samps = htonl(0); -        break; - -    case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE: -        //all set by defaults above -        break; - -    case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE: -        out_data.data.stream_cmd.chain = 1; -        break; -    } - -    //send and recv -    usrp2_ctrl_data_t in_data = _iface->ctrl_send_and_recv(out_data); -    UHD_ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_GOT_THAT_STREAM_COMMAND_DUDE); +    UHD_ASSERT_THROW(stream_cmd.num_samps <= FR_RX_CTRL_MAX_SAMPS_PER_CMD); + +    //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(FR_RX_CTRL_STREAM_CMD, FR_RX_CTRL_MAKE_CMD( +        (inst_samps)? stream_cmd.num_samps : ((inst_chain)? _max_rx_samples_per_packet : 1), +        (stream_cmd.stream_now)? 1 : 0, +        (inst_chain)? 1 : 0, +        (inst_reload)? 1 : 0 +    )); +    _iface->poke32(FR_RX_CTRL_TIME_SECS,  stream_cmd.time_spec.secs); +    _iface->poke32(FR_RX_CTRL_TIME_TICKS, stream_cmd.time_spec.get_ticks(get_master_clock_freq()));  }  /*********************************************************************** diff --git a/host/lib/usrp/usrp2/usrp2_regs.hpp b/host/lib/usrp/usrp2/usrp2_regs.hpp index 0e2a18756..feeccaa34 100644 --- a/host/lib/usrp/usrp2/usrp2_regs.hpp +++ b/host/lib/usrp/usrp2/usrp2_regs.hpp @@ -64,7 +64,23 @@  /////////////////////////////////////////////////  // Misc Control  //////////////////////////////////////////////// -#define FR_CLOCK_CONTROL _SR_ADDR(0) +#define FR_MISC_CTRL_CLOCK           _SR_ADDR(0) +#define FR_MISC_CTRL_SERDES          _SR_ADDR(1) +#define FR_MISC_CTRL_ADC             _SR_ADDR(2) +#define FR_MISC_CTRL_LEDS            _SR_ADDR(3) +#define FR_MISC_CTRL_PHY             _SR_ADDR(4) // LSB is reset line to eth phy +#define FR_MISC_CTRL_DBG_MUX         _SR_ADDR(5) +#define FR_MISC_CTRL_RAM_PAGE        _SR_ADDR(6) // FIXME should go somewhere else... +#define FR_MISC_CTRL_FLUSH_ICACHE    _SR_ADDR(7) // Flush the icache +#define FR_MISC_CTRL_LED_SRC         _SR_ADDR(8) // HW or SW control for LEDs + +#define FRF_MISC_CTRL_SERDES_ENABLE 8 +#define FRF_MISC_CTRL_SERDES_PRBSEN 4 +#define FRF_MISC_CTRL_SERDES_LOOPEN 2 +#define FRF_MISC_CTRL_SERDES_RXEN   1 + +#define FRF_MISC_CTRL_ADC_ON  0x0F +#define FRF_MISC_CTRL_ADC_OFF 0x00  /////////////////////////////////////////////////  // VITA49 64 bit time (write only) @@ -207,4 +223,25 @@  #define FR_ATR_FULL_TXSIDE  FR_ATR_BASE + 12  #define FR_ATR_FULL_RXSIDE  FR_ATR_BASE + 14 +/////////////////////////////////////////////////// +// VITA RX CTRL regs +/////////////////////////////////////////////////// +// The following 3 are logically a single command register. +// They are clocked into the underlying fifo when time_ticks is written. +#define FR_RX_CTRL_STREAM_CMD        _SR_ADDR(SR_RX_CTRL + 0) // {now, chain, num_samples(30) +#define FR_RX_CTRL_TIME_SECS         _SR_ADDR(SR_RX_CTRL + 1) +#define FR_RX_CTRL_TIME_TICKS        _SR_ADDR(SR_RX_CTRL + 2) + +#define FR_RX_CTRL_CLEAR_OVERRUN     _SR_ADDR(SR_RX_CTRL + 3) // write anything to clear overrun +#define FR_RX_CTRL_VRT_HEADER        _SR_ADDR(SR_RX_CTRL + 4) // word 0 of packet.  FPGA fills in packet counter +#define FR_RX_CTRL_VRT_STREAM_ID     _SR_ADDR(SR_RX_CTRL + 5) // word 1 of packet. +#define FR_RX_CTRL_VRT_TRAILER       _SR_ADDR(SR_RX_CTRL + 6) +#define FR_RX_CTRL_NSAMPS_PER_PKT    _SR_ADDR(SR_RX_CTRL + 7) +#define FR_RX_CTRL_NCHANNELS         _SR_ADDR(SR_RX_CTRL + 8) // 1 in basic case, up to 4 for vector sources + +//helpful macros for dealing with stream cmd +#define FR_RX_CTRL_MAX_SAMPS_PER_CMD 0x1fffffff +#define FR_RX_CTRL_MAKE_CMD(nsamples, now, chain, reload) \ +  ((((now) & 0x1) << 31) | (((chain) & 0x1) << 30) | (((reload) & 0x1) << 29) | ((nsamples) & 0x1fffffff)) +  #endif /* INCLUDED_USRP2_REGS_HPP */ | 
