diff options
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/zpu/apps/txrx_uhd.c | 26 | ||||
| -rw-r--r-- | firmware/zpu/lib/clock_bits.h | 55 | ||||
| -rw-r--r-- | firmware/zpu/lib/clocks.c | 174 | ||||
| -rw-r--r-- | firmware/zpu/lib/clocks.h | 71 | ||||
| -rw-r--r-- | firmware/zpu/lib/net_common.c | 32 | ||||
| -rw-r--r-- | firmware/zpu/usrp2/memory_map.h | 134 | ||||
| -rw-r--r-- | firmware/zpu/usrp2p/memory_map.h | 134 | 
7 files changed, 73 insertions, 553 deletions
| diff --git a/firmware/zpu/apps/txrx_uhd.c b/firmware/zpu/apps/txrx_uhd.c index 4ccb585e2..0c93d2352 100644 --- a/firmware/zpu/apps/txrx_uhd.c +++ b/firmware/zpu/apps/txrx_uhd.c @@ -53,20 +53,34 @@ static void setup_network(void);  // the fast-path setup global variables  // ----------------------------------------------------------------  static eth_mac_addr_t fp_mac_addr_src, fp_mac_addr_dst; -extern struct socket_address fp_socket_src, fp_socket_dst; +struct socket_address fp_socket_src, fp_socket_dst; +extern uint16_t dsp0_dst_port, err0_dst_port, dsp1_dst_port;  static void handle_udp_err0_packet(      struct socket_address src, struct socket_address dst,      unsigned char *payload, int payload_len  ){      sr_udp_sm->err0_port = (((uint32_t)dst.port) << 16) | src.port; +    err0_dst_port = src.port;      printf("Storing for async error path:\n");      printf("  source udp port: %d\n", dst.port);      printf("  destination udp port: %d\n", src.port);      newline();  } -static void handle_udp_data_packet( +static void handle_udp_dsp1_packet( +    struct socket_address src, struct socket_address dst, +    unsigned char *payload, int payload_len +){ +    sr_udp_sm->dsp1_port = (((uint32_t)dst.port) << 16) | src.port; +    dsp1_dst_port = src.port; +    printf("Storing for dsp1 path:\n"); +    printf("  source udp port: %d\n", dst.port); +    printf("  destination udp port: %d\n", src.port); +    newline(); +} + +static void handle_udp_dsp0_packet(      struct socket_address src, struct socket_address dst,      unsigned char *payload, int payload_len  ){ @@ -75,7 +89,8 @@ static void handle_udp_data_packet(      fp_socket_src = dst;      fp_socket_dst = src;      sr_udp_sm->dsp0_port = (((uint32_t)dst.port) << 16) | src.port; -    printf("Storing for fast path:\n"); +    dsp0_dst_port = src.port; +    printf("Storing for dsp0 path:\n");      printf("  source mac addr: ");      print_mac_addr(&fp_mac_addr_src); newline();      printf("  source ip addr: "); @@ -341,13 +356,14 @@ main(void)    //1) register the addresses into the network stack    register_addrs(ethernet_mac_addr(), get_ip_addr()); -  pkt_ctrl_program_inspector(get_ip_addr(), USRP2_UDP_DATA_PORT); +  pkt_ctrl_program_inspector(get_ip_addr(), USRP2_UDP_DSP0_PORT);    //2) register callbacks for udp ports we service    init_udp_listeners();    register_udp_listener(USRP2_UDP_CTRL_PORT, handle_udp_ctrl_packet); -  register_udp_listener(USRP2_UDP_DATA_PORT, handle_udp_data_packet); +  register_udp_listener(USRP2_UDP_DSP0_PORT, handle_udp_dsp0_packet);    register_udp_listener(USRP2_UDP_ERR0_PORT, handle_udp_err0_packet); +  register_udp_listener(USRP2_UDP_DSP1_PORT, handle_udp_dsp1_packet);  #ifdef USRP2P    register_udp_listener(USRP2_UDP_UPDATE_PORT, handle_udp_fw_update_packet);  #endif diff --git a/firmware/zpu/lib/clock_bits.h b/firmware/zpu/lib/clock_bits.h deleted file mode 100644 index d2052e941..000000000 --- a/firmware/zpu/lib/clock_bits.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright 2010 Ettus Research LLC -// -/* - * Copyright 2008 Free Software Foundation, Inc. - *  - * This file is part of GNU Radio - *  - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - *  - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - *  - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#ifndef INCLUDED_USRP2_CLOCK_BITS_H -#define INCLUDED_USRP2_CLOCK_BITS_H - -#define	_MC_WE_LOCK			0x0001 -#define	_MC_MIMO_CLK_INPUT		0x0002		// else SMA input - -/* - * Derived masks (use these): - * - * We get our input from 1 of three places: - *  Our free running oscilator, our SMA connector, or from the MIMO connector - */ -#define	MC_WE_DONT_LOCK			0x0000 -#define	MC_WE_LOCK_TO_SMA		(_MC_WE_LOCK | 0) -#define	MC_WE_LOCK_TO_MIMO		(_MC_WE_LOCK | _MC_MIMO_CLK_INPUT) - -/* - * Independent of the source of the clock, we may or may not drive our - * clock onto the mimo connector.  Note that there are dedicated clock - * signals in each direction, so disaster doesn't occurs if we're - * unnecessarily providing clock. - */ -#define	MC_PROVIDE_CLK_TO_MIMO		0x0004 - -#define MC_REF_CLK_MASK          0x0f - -#define MC_PPS_SOURCE_SMA        (0x00 << 4) -#define MC_PPS_SOURCE_MIMO       (0x01 << 4) - -#define MC_PPS_POLARITY_NEG      (0x00 << 5) -#define MC_PPS_POLARITY_POS      (0x01 << 5) - -#endif /* INCLUDED_USRP2_CLOCK_BITS_H */ diff --git a/firmware/zpu/lib/clocks.c b/firmware/zpu/lib/clocks.c index 2b352a385..c1e8ce827 100644 --- a/firmware/zpu/lib/clocks.c +++ b/firmware/zpu/lib/clocks.c @@ -1,4 +1,6 @@ -/* -*- c++ -*- */ +// +// Copyright 2010-2011 Ettus Research LLC +//  /*   * Copyright 2008 Free Software Foundation, Inc.   * @@ -16,119 +18,39 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif  #include <clocks.h> - +#include <stdbool.h>  #include "memory_map.h"  #include "ad9510.h"  #include "spi.h" -#include "u2_init.h" -//USRP2PLUS clocks: -//Clock 0: testclk -//Clock 1: FPGA clk -//Clock 2: ADC clk -//Clock 3: DAC clk -//Clock 4: SER clk -//Clock 5: TX dboard clk -//Clock 6: EXP clk -//Clock 7: RX dboard clk +/*! + * \brief Lock Detect -- Return True if our PLL is locked + */ +bool clocks_lock_detect(); -//TODO: should have enough brains to init the FPGA clock for USRP2+. all others are suspect. -//note that without EEPROM support u2_hw_rev_major is going to be incorrect. +/*! + * \brief Enable or disable fpga clock.  Disabling would wedge and require a power cycle. + */ +void clocks_enable_fpga_clk(bool enable, int divisor);  void   clocks_init(void)  {    // Set up basic clocking functions in AD9510 -  ad9510_write_reg(0x45, 0x01); // CLK2 drives distribution +  ad9510_write_reg(0x45, 0x01);    //enable the 100MHz clock output to the FPGA for 50MHz CPU clock    clocks_enable_fpga_clk(true, 1);    spi_wait(); -  // Set up PLL for 10 MHz reference -  // Reg 4, A counter, Don't Care -//  ad9510_write_reg(0x05, 0x00);  // Reg 5, B counter MSBs, 0 -//  ad9510_write_reg(0x06, 0x05);  // Reg 6, B counter LSBs, 5 -  // Reg 7, Loss of reference detect, doesn't work yet, 0 -//  ad9510_write_reg(0x5A, 0x01); // Update Regs - -  // Primary clock configuration -//  clocks_mimo_config(MC_WE_DONT_LOCK); - -    //wait for the clock to stabilize    while(!clocks_lock_detect());    //issue a reset to the DCM so it locks up to the new freq    output_regs->clk_ctrl |= CLK_RESET; - -  // Set up other clocks -  //clocks_enable_test_clk(false, 0); -  //clocks_enable_tx_dboard(false, 0); -  //clocks_enable_rx_dboard(false, 0); -//  clocks_enable_eth_phyclk(false, 0); //PHY clk is separate now (u2r4, u2p) - -  // Enable clock to ADCs and DACs -  //clocks_enable_dac_clk(true, 1); -  //clocks_enable_adc_clk(true, 1); -} - -/* -void -clocks_mimo_config(int flags) -{ -  if (flags & _MC_WE_LOCK){ -    // Reg 8, Charge pump on, dig lock det, positive PFD, 47 -    ad9510_write_reg(0x08, 0x47); -  } -  else { -    // Reg 8, Charge pump off, dig lock det, positive PFD -    ad9510_write_reg(0x08, 0x00); -  } -   -  // Reg 9, Charge pump current, 0x40=3mA, 0x00=650uA -  ad9510_write_reg(0x09, 0x00); -  // Reg A, Prescaler of 2, everything normal 04 -  ad9510_write_reg(0x0A, 0x04); -  // Reg B, R Div MSBs, 0 -  ad9510_write_reg(0x0B, 0x00); -  // Reg C, R Div LSBs, 1 -  ad9510_write_reg(0x0C, 0x01); -  // Reg D, Antibacklash, Digital lock det, 0 - -  ad9510_write_reg(0x5A, 0x01); // Update Regs - -  spi_wait(); -   -  // Allow for clock switchover -  // The below masks include 0x10, which issues a reset to the DCM.   -  if (flags & _MC_WE_LOCK){		// WE LOCK -    if (flags & _MC_MIMO_CLK_INPUT) { -      // Turn on ref output and choose the MIMO connector -      output_regs->clk_ctrl = 0x15;   -    } -    else { -      // turn on ref output and choose the SMA -      output_regs->clk_ctrl = 0x1C;  -    } -  } -  else {				// WE DONT LOCK -    // Disable both ext clk inputs -    output_regs->clk_ctrl = 0x10; -  } - -  // Do we drive a clock onto the MIMO connector? -//  if (flags & MC_PROVIDE_CLK_TO_MIMO) -//    clocks_enable_clkexp_out(true,10); -//  else -//    clocks_enable_clkexp_out(false,0);   } -*/  bool   clocks_lock_detect() @@ -188,79 +110,9 @@ clocks_enable_XXX_clk(bool enable, int divisor, int reg_en, int reg_div, int mod    ad9510_write_reg(0x5A, 0x01);  // Update Regs  } -// Clock 0 -/*void -clocks_enable_test_clk(bool enable, int divisor) -{ -  clocks_enable_XXX_clk(enable,divisor,0x3C,0x48,CLOCK_MODE_PECL); -}*/ -  // Clock 1  void  clocks_enable_fpga_clk(bool enable, int divisor)  {    clocks_enable_XXX_clk(enable,divisor,0x3D,0x4A,CLOCK_MODE_PECL);  } -/* -// Clock 2 on Rev 3, Clock 5 on Rev 4, Clock 6 on USRP2+ -void -clocks_enable_clkexp_out(bool enable, int divisor) -{ -  if(u2_hw_rev_major == 3) -    clocks_enable_XXX_clk(enable,divisor,0x3E,0x4C,CLOCK_MODE_PECL); -  else if(u2_hw_rev_major == 4) { -    ad9510_write_reg(0x34,0x00);  // Turn on fine delay -    ad9510_write_reg(0x35,0x00);  // Set Full Scale to nearly 10ns -    ad9510_write_reg(0x36,0x1c);  // Set fine delay.  0x20 is midscale -    clocks_enable_XXX_clk(enable,divisor,0x41,0x52,CLOCK_MODE_LVDS); -  } -	else if(u2_hw_rev_major == 10) { -		ad9510_write_reg(0x34, 0x00); -		ad9510_write_reg(0x35, 0x00); -		ad9510_write_reg(0x36, 0x1C); -		clocks_enable_XXX_clk(enable, divisor, 0x42, 0x52, CLOCK_MODE_LVDS); -	} -  else -    putstr("ERR (clocks_enable_clkexp_out): Invalid hw rev, don't know what to do!\n"); -} -*/ -/* -// Clock 5 on Rev 3, none (was 2) on Rev 4, none on USRP2+ -void -clocks_enable_eth_phyclk(bool enable, int divisor) -{ -  if(u2_hw_rev_major == 3) -    clocks_enable_XXX_clk(enable,divisor,0x41,0x52,CLOCK_MODE_LVDS); -  else if(u2_hw_rev_major == 4) -    clocks_enable_XXX_clk(enable,divisor,0x3E,0x4C,CLOCK_MODE_PECL); -  else -    putstr("(clocks_enable_eth_phyclk): no eth PHY clock or invalid hw rev\n"); //not really an error -} -*/ -// Clock 3 -/*void -clocks_enable_dac_clk(bool enable, int divisor) -{ -  clocks_enable_XXX_clk(enable,divisor,0x3F,0x4E,CLOCK_MODE_PECL); -}*/ - -// Clock 4 -/*void -clocks_enable_adc_clk(bool enable, int divisor) -{ -  clocks_enable_XXX_clk(enable,divisor,0x40,0x50,CLOCK_MODE_LVDS); -}*/ - -// Clock 6 -/*void -clocks_enable_tx_dboard(bool enable, int divisor) -{ -  clocks_enable_XXX_clk(enable,divisor,0x42,0x54,CLOCK_MODE_CMOS); -}*/ - -// Clock 7 -/*void -clocks_enable_rx_dboard(bool enable, int divisor) -{ -  clocks_enable_XXX_clk(enable,divisor,0x43,0x56,CLOCK_MODE_CMOS); -}*/ diff --git a/firmware/zpu/lib/clocks.h b/firmware/zpu/lib/clocks.h index 28d1d542f..7bc7a3cda 100644 --- a/firmware/zpu/lib/clocks.h +++ b/firmware/zpu/lib/clocks.h @@ -1,5 +1,5 @@  // -// Copyright 2010 Ettus Research LLC +// Copyright 2010-2011 Ettus Research LLC  //  /*   * Copyright 2008 Free Software Foundation, Inc. @@ -21,75 +21,10 @@  #ifndef INCLUDED_CLOCKS_H  #define INCLUDED_CLOCKS_H -/* - * Routines to configure our multitude of clocks - */ - -#include <stdbool.h> -#include "clock_bits.h" - -  /*! - * One time call to initialize all clocks to a reasonable state.  We - * come out of here using our free running 100MHz oscilator and not - * providing a clock to the MIMO connector (CMC_WE_DONT_LOCK) + * One time call to initialize the master clock to a reasonable state. + * We come out of here using our free running 100MHz oscillator.   */  void clocks_init(void); - -/*! - * \brief MIMO clock configuration. - * - * Configure our master clock source, and whether or not we drive a - * clock onto the mimo connector.  See MC_flags in usrp2_mimo_config.h. - */ -//void clocks_mimo_config(int flags); - -/*! - * \brief Lock Detect -- Return True if our PLL is locked - */ -bool clocks_lock_detect(); - -/*! - * \brief Enable or disable test clock (extra clock signal) - */ -//void clocks_enable_test_clk(bool enable, int divisor); - -/*! - * \brief Enable or disable fpga clock.  Disabling would wedge and require a power cycle. - */ -void clocks_enable_fpga_clk(bool enable, int divisor); - -/*! - * \brief Enable or disable clock output sent to MIMO connector - */ -//void clocks_enable_clkexp_out(bool enable, int divisor); - -/*! - * \brief Enable or disable ethernet phyclk, should always be disabled - */ -//void clocks_enable_eth_phyclk(bool enable, int divisor); - -/*! - * \brief Enable or disable clock to DAC - */ -//void clocks_enable_dac_clk(bool enable, int divisor); - -/*! - * \brief Enable or disable clock to ADC - */ -//void clocks_enable_adc_clk(bool enable, int divisor); - -/*! - * \brief Enable or disable clock to Rx daughterboard - */ -//void clocks_enable_rx_dboard(bool enable, int divisor); - - -/*! - * \brief Enable or disable clock to Tx daughterboard - */ -//void clocks_enable_tx_dboard(bool enable, int divisor); - -  #endif /* INCLUDED_CLOCKS_H */ diff --git a/firmware/zpu/lib/net_common.c b/firmware/zpu/lib/net_common.c index d1b06976d..6a0fd254b 100644 --- a/firmware/zpu/lib/net_common.c +++ b/firmware/zpu/lib/net_common.c @@ -1,6 +1,5 @@ -/* -*- c -*- */  /* - * Copyright 2009,2010 Ettus Research LLC + * Copyright 2009-2011 Ettus Research LLC   *   * This program is free software: you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -42,7 +41,7 @@ static const bool debug = false;  static const eth_mac_addr_t BCAST_MAC_ADDR = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};  //used in the top level application... -struct socket_address fp_socket_src, fp_socket_dst; +uint16_t dsp0_dst_port, err0_dst_port, dsp1_dst_port;  // ------------------------------------------------------------------------ @@ -277,15 +276,24 @@ handle_icmp_packet(struct ip_addr src, struct ip_addr dst,        //filter out non udp data response        struct ip_hdr *ip = (struct ip_hdr *)(((uint8_t*)icmp) + sizeof(struct icmp_echo_hdr));        struct udp_hdr *udp = (struct udp_hdr *)(((char *)ip) + IP_HLEN); -      if (IPH_PROTO(ip) != IP_PROTO_UDP || udp->dest != fp_socket_dst.port) return; - -      //end async update packets per second -      sr_tx_ctrl->cyc_per_up = 0; - -      //the end continuous streaming command -      sr_rx_ctrl->cmd = 1 << 31; //no samples now -      sr_rx_ctrl->time_secs = 0; -      sr_rx_ctrl->time_ticks = 0; //latch the command +      if (IPH_PROTO(ip) != IP_PROTO_UDP) break; + +      if (udp->dest == dsp0_dst_port){ +          //the end continuous streaming command +          sr_rx_ctrl0->cmd = 1 << 31; //no samples now +          sr_rx_ctrl0->time_secs = 0; +          sr_rx_ctrl0->time_ticks = 0; //latch the command +      } +      else if (udp->dest == dsp1_dst_port){ +          //the end continuous streaming command +          sr_rx_ctrl1->cmd = 1 << 31; //no samples now +          sr_rx_ctrl1->time_secs = 0; +          sr_rx_ctrl1->time_ticks = 0; //latch the command +      } +      else if (udp->dest == err0_dst_port){ +          //end async update packets per second +          sr_tx_ctrl->cyc_per_up = 0; +      }        //struct udp_hdr *udp = (struct udp_hdr *)((char *)icmp + 28);        //printf("icmp port unr %d\n", udp->dest); diff --git a/firmware/zpu/usrp2/memory_map.h b/firmware/zpu/usrp2/memory_map.h index e728a1ddb..79b11759a 100644 --- a/firmware/zpu/usrp2/memory_map.h +++ b/firmware/zpu/usrp2/memory_map.h @@ -1,4 +1,4 @@ -/* -*- c -*- */ +// Copyright 2010-2011 Ettus Research LLC  /*   * Copyright 2007,2008,2009 Free Software Foundation, Inc.   * @@ -227,8 +227,10 @@ hwconfig_wishbone_divisor(void)  #define SR_UDP_SM 96  #define SR_TX_DSP 208  #define SR_TX_CTRL 224 -#define SR_RX_DSP 160 -#define SR_RX_CTRL 176 +#define SR_RX_DSP0 160 +#define SR_RX_DSP1 240 +#define SR_RX_CTRL0 176 +#define SR_RX_CTRL1 32  #define SR_TIME64 192  #define SR_SIMTIMER 198  #define SR_LAST 255 @@ -350,10 +352,7 @@ typedef struct {  #define sr_udp_sm ((sr_udp_sm_t *) _SR_ADDR(SR_UDP_SM)) -// --- dsp tx regs --- - -#define MIN_CIC_INTERP	1 -#define	MAX_CIC_INTERP  128 +// --- VITA TX CTRL regs ---  typedef struct {    volatile uint32_t     num_chan; @@ -366,52 +365,6 @@ typedef struct {  #define sr_tx_ctrl ((sr_tx_ctrl_t *) _SR_ADDR(SR_TX_CTRL)) -typedef struct { -  volatile int32_t	freq; -  volatile uint32_t	scale_iq;	// {scale_i,scale_q} -  volatile uint32_t     interp_rate; -  volatile uint32_t     _padding0;      // padding for the tx_mux -                                        //   NOT freq, scale, interp -  /*! -   * \brief output mux configuration. -   * -   * <pre> -   *     3                   2                   1                        -   *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   *  +-------------------------------+-------+-------+-------+-------+ -   *  |                                               | DAC1  |  DAC0 | -   *  +-------------------------------+-------+-------+-------+-------+ -   *  -   *  There are N DUCs (1 now) with complex inputs and outputs. -   *  There are two DACs. -   *  -   *  Each 4-bit DACx field specifies the source for the DAC -   *  Each subfield is coded like this:  -   *  -   *     3 2 1 0 -   *    +-------+ -   *    |   N   | -   *    +-------+ -   *  -   *  N specifies which DUC output is connected to this DAC. -   *  -   *   N   which interp output -   *  ---  ------------------- -   *   0   DUC 0 I -   *   1   DUC 0 Q -   *   2   DUC 1 I -   *   3   DUC 1 Q -   *   F   All Zeros -   *    -   * The default value is 0x10 -   * </pre> -   */ -  volatile uint32_t	tx_mux; - -} dsp_tx_regs_t; -   -#define dsp_tx_regs ((dsp_tx_regs_t *) _SR_ADDR(SR_TX_DSP)) -  // --- VITA RX CTRL regs ---  typedef struct {    // The following 3 are logically a single command register. @@ -419,81 +372,10 @@ typedef struct {    volatile uint32_t	cmd;		// {now, chain, num_samples(30)    volatile uint32_t	time_secs;    volatile uint32_t	time_ticks; - -  volatile uint32_t	clear_overrun;	// write anything to clear overrun -  volatile uint32_t	vrt_header;	// word 0 of packet.  FPGA fills in packet counter -  volatile uint32_t	vrt_stream_id;	// word 1 of packet.  -  volatile uint32_t	vrt_trailer; -  volatile uint32_t	nsamples_per_pkt; -  volatile uint32_t     nchannels;      // 1 in basic case, up to 4 for vector sources -  volatile uint32_t     pad[7];         // Make each structure 16 elements long  } sr_rx_ctrl_t; -#define sr_rx_ctrl ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL)) - -// --- dsp rx regs --- -#define	MIN_CIC_DECIM	1 -#define	MAX_CIC_DECIM   128 - -typedef struct { -  volatile int32_t	freq; -  volatile uint32_t	scale_iq;	// {scale_i,scale_q} -  volatile uint32_t     decim_rate; -  volatile uint32_t     dcoffset_i;     // Bit 31 high sets fixed offset mode, using lower 14 bits, -                                        // otherwise it is automatic  -  volatile uint32_t     dcoffset_q;     // Bit 31 high sets fixed offset mode, using lower 14 bits - -  /*! -   * \brief input mux configuration. -   * -   * This determines which ADC (or constant zero) is connected to  -   * each DDC input.  There are N DDCs (1 now).  Each has two inputs. -   * -   * <pre> -   * Mux value: -   * -   *    3                   2                   1                        -   *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * |                                                       |Q0 |I0 | -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * -   * Each 2-bit I field is either 00 (A/D A), 01 (A/D B) or 1X (const zero) -   * Each 2-bit Q field is either 00 (A/D A), 01 (A/D B) or 1X (const zero) -   * -   * The default value is 0x4 -   * </pre> -   */ -  volatile uint32_t     rx_mux;        // called adc_mux in dsp_core_rx.v - -  /*! -   * \brief Streaming GPIO configuration -   * -   * This determines whether the LSBs of I and Q samples come from the DSP -   * pipeline or from the io_rx GPIO pins.  To stream GPIO, one must first -   * set the GPIO data direction register to have io_rx[15] and/or io_rx[14] -   * configured as inputs.  The GPIO pins will be sampled at the time the -   * remainder of the DSP sample is strobed into the RX sample FIFO.  There -   * will be a decimation-dependent fixed time offset between the GPIO -   * sample stream and the associated RF samples. -   * -   *    3                   2                   1                        -   *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * |                           MBZ                             |Q|I| -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * -   * I         0=LSB comes from DSP pipeline (default) -   *           1=LSB comes from io_rx[15] -   *  -   * Q         0=LSB comes from DSP pipeline (default) -   *           1=LSB comes from io_rx[14] -   */ -  volatile uint32_t gpio_stream_enable; - -} dsp_rx_regs_t; -   -#define dsp_rx_regs ((dsp_rx_regs_t *) _SR_ADDR(SR_RX_DSP)) +#define sr_rx_ctrl0 ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL0)) +#define sr_rx_ctrl1 ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL1))  // ----------------------------------------------------------------  // VITA49 64 bit time (write only) diff --git a/firmware/zpu/usrp2p/memory_map.h b/firmware/zpu/usrp2p/memory_map.h index 36d8ac9f2..2567a4588 100644 --- a/firmware/zpu/usrp2p/memory_map.h +++ b/firmware/zpu/usrp2p/memory_map.h @@ -1,4 +1,4 @@ -/* -*- c -*- */ +// Copyright 2010-2011 Ettus Research LLC  /*   * Copyright 2007,2008,2009 Free Software Foundation, Inc.   * @@ -218,8 +218,10 @@ hwconfig_wishbone_divisor(void)  #define SR_UDP_SM 96  #define SR_TX_DSP 208  #define SR_TX_CTRL 224 -#define SR_RX_DSP 160 -#define SR_RX_CTRL 176 +#define SR_RX_DSP0 160 +#define SR_RX_DSP1 240 +#define SR_RX_CTRL0 176 +#define SR_RX_CTRL1 32  #define SR_TIME64 192  #define SR_SIMTIMER 198  #define SR_LAST 255 @@ -343,10 +345,7 @@ typedef struct {  #define sr_udp_sm ((sr_udp_sm_t *) _SR_ADDR(SR_UDP_SM)) -// --- dsp tx regs --- - -#define MIN_CIC_INTERP	1 -#define	MAX_CIC_INTERP  128 +// --- VITA TX CTRL regs ---  typedef struct {    volatile uint32_t     num_chan; @@ -359,52 +358,6 @@ typedef struct {  #define sr_tx_ctrl ((sr_tx_ctrl_t *) _SR_ADDR(SR_TX_CTRL)) -typedef struct { -  volatile int32_t	freq; -  volatile uint32_t	scale_iq;	// {scale_i,scale_q} -  volatile uint32_t     interp_rate; -  volatile uint32_t     _padding0;      // padding for the tx_mux -                                        //   NOT freq, scale, interp -  /*! -   * \brief output mux configuration. -   * -   * <pre> -   *     3                   2                   1                        -   *   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   *  +-------------------------------+-------+-------+-------+-------+ -   *  |                                               | DAC1  |  DAC0 | -   *  +-------------------------------+-------+-------+-------+-------+ -   *  -   *  There are N DUCs (1 now) with complex inputs and outputs. -   *  There are two DACs. -   *  -   *  Each 4-bit DACx field specifies the source for the DAC -   *  Each subfield is coded like this:  -   *  -   *     3 2 1 0 -   *    +-------+ -   *    |   N   | -   *    +-------+ -   *  -   *  N specifies which DUC output is connected to this DAC. -   *  -   *   N   which interp output -   *  ---  ------------------- -   *   0   DUC 0 I -   *   1   DUC 0 Q -   *   2   DUC 1 I -   *   3   DUC 1 Q -   *   F   All Zeros -   *    -   * The default value is 0x10 -   * </pre> -   */ -  volatile uint32_t	tx_mux; - -} dsp_tx_regs_t; -   -#define dsp_tx_regs ((dsp_tx_regs_t *) _SR_ADDR(SR_TX_DSP)) -  // --- VITA RX CTRL regs ---  typedef struct {    // The following 3 are logically a single command register. @@ -412,81 +365,10 @@ typedef struct {    volatile uint32_t	cmd;		// {now, chain, num_samples(30)    volatile uint32_t	time_secs;    volatile uint32_t	time_ticks; - -  volatile uint32_t	clear_overrun;	// write anything to clear overrun -  volatile uint32_t	vrt_header;	// word 0 of packet.  FPGA fills in packet counter -  volatile uint32_t	vrt_stream_id;	// word 1 of packet.  -  volatile uint32_t	vrt_trailer; -  volatile uint32_t	nsamples_per_pkt; -  volatile uint32_t     nchannels;      // 1 in basic case, up to 4 for vector sources -  volatile uint32_t     pad[7];         // Make each structure 16 elements long  } sr_rx_ctrl_t; -#define sr_rx_ctrl ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL)) - -// --- dsp rx regs --- -#define	MIN_CIC_DECIM	1 -#define	MAX_CIC_DECIM   128 - -typedef struct { -  volatile int32_t	freq; -  volatile uint32_t	scale_iq;	// {scale_i,scale_q} -  volatile uint32_t     decim_rate; -  volatile uint32_t     dcoffset_i;     // Bit 31 high sets fixed offset mode, using lower 14 bits, -                                        // otherwise it is automatic  -  volatile uint32_t     dcoffset_q;     // Bit 31 high sets fixed offset mode, using lower 14 bits - -  /*! -   * \brief input mux configuration. -   * -   * This determines which ADC (or constant zero) is connected to  -   * each DDC input.  There are N DDCs (1 now).  Each has two inputs. -   * -   * <pre> -   * Mux value: -   * -   *    3                   2                   1                        -   *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * |                                                       |Q0 |I0 | -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * -   * Each 2-bit I field is either 00 (A/D A), 01 (A/D B) or 1X (const zero) -   * Each 2-bit Q field is either 00 (A/D A), 01 (A/D B) or 1X (const zero) -   * -   * The default value is 0x4 -   * </pre> -   */ -  volatile uint32_t     rx_mux;        // called adc_mux in dsp_core_rx.v - -  /*! -   * \brief Streaming GPIO configuration -   * -   * This determines whether the LSBs of I and Q samples come from the DSP -   * pipeline or from the io_rx GPIO pins.  To stream GPIO, one must first -   * set the GPIO data direction register to have io_rx[15] and/or io_rx[14] -   * configured as inputs.  The GPIO pins will be sampled at the time the -   * remainder of the DSP sample is strobed into the RX sample FIFO.  There -   * will be a decimation-dependent fixed time offset between the GPIO -   * sample stream and the associated RF samples. -   * -   *    3                   2                   1                        -   *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * |                           MBZ                             |Q|I| -   * +-------+-------+-------+-------+-------+-------+-------+-------+ -   * -   * I         0=LSB comes from DSP pipeline (default) -   *           1=LSB comes from io_rx[15] -   *  -   * Q         0=LSB comes from DSP pipeline (default) -   *           1=LSB comes from io_rx[14] -   */ -  volatile uint32_t gpio_stream_enable; - -} dsp_rx_regs_t; -   -#define dsp_rx_regs ((dsp_rx_regs_t *) _SR_ADDR(SR_RX_DSP)) +#define sr_rx_ctrl0 ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL0)) +#define sr_rx_ctrl1 ((sr_rx_ctrl_t *) _SR_ADDR(SR_RX_CTRL1))  // ----------------------------------------------------------------  // VITA49 64 bit time (write only) | 
