// // Copyright 2014 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 // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program 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, see . // #ifndef INCLUDED_N230_FPGA_DEFS_H #define INCLUDED_N230_FPGA_DEFS_H #include #ifndef __cplusplus #include #endif #include namespace uhd { namespace usrp { namespace n230 { namespace fpga { static inline uint32_t sr_addr(uint32_t offset) { return (offset*4); } static inline uint32_t rb_addr(uint32_t offset) { return (offset*8); } static const size_t NUM_RADIOS = 2; static const double BUS_CLK_RATE = 80e6; /******************************************************************* * CVITA Routing *******************************************************************/ static const uint32_t CVITA_UDP_PORT = 49153; static const bool CVITA_BIG_ENDIAN = true; enum xb_endpoint_t { N230_XB_DST_E0 = 0, N230_XB_DST_E1 = 1, N230_XB_DST_R0 = 2, N230_XB_DST_R1 = 3, N230_XB_DST_GCTRL = 4, N230_XB_DST_UART = 5 }; static const boost::uint8_t RADIO_CTRL_SUFFIX = 0x00; static const boost::uint8_t RADIO_FC_SUFFIX = 0x01; static const boost::uint8_t RADIO_DATA_SUFFIX = 0x02; /******************************************************************* * Seting Register Base addresses *******************************************************************/ static const uint32_t SR_CORE_RADIO_CONTROL = 3; static const uint32_t SR_CORE_LOOPBACK = 4; static const uint32_t SR_CORE_BIST1 = 5; static const uint32_t SR_CORE_BIST2 = 6; static const uint32_t SR_CORE_SPI = 8; static const uint32_t SR_CORE_MISC = 16; static const uint32_t SR_CORE_DATA_DELAY = 17; static const uint32_t SR_CORE_CLK_DELAY = 18; static const uint32_t SR_CORE_COMPAT = 24; static const uint32_t SR_CORE_READBACK = 32; static const uint32_t SR_CORE_GPSDO_ST = 40; static const uint32_t SR_CORE_PPS_SEL = 48; static const uint32_t SR_CORE_MS0_GPIO = 50; static const uint32_t SR_CORE_MS1_GPIO = 58; static const uint32_t RB_CORE_SIGNATUE = 0; static const uint32_t RB_CORE_SPI = 1; static const uint32_t RB_CORE_STATUS = 2; static const uint32_t RB_CORE_BIST = 3; static const uint32_t RB_CORE_VERSION_HASH = 4; static const uint32_t RB_CORE_MS0_GPIO = 5; static const uint32_t RB_CORE_MS1_GPIO = 6; /******************************************************************* * Seting Register Base addresses *******************************************************************/ static const uint32_t SR_RADIO_SPI = 8; static const uint32_t SR_RADIO_ATR = 12; static const uint32_t SR_RADIO_SW_RST = 20; static const uint32_t SR_RADIO_TEST = 21; static const uint32_t SR_RADIO_CODEC_IDLE = 22; static const uint32_t SR_RADIO_READBACK = 32; static const uint32_t SR_RADIO_TX_CTRL = 64; static const uint32_t SR_RADIO_RX_CTRL = 96; static const uint32_t SR_RADIO_RX_DSP = 144; static const uint32_t SR_RADIO_TX_DSP = 184; static const uint32_t SR_RADIO_TIME = 128; static const uint32_t SR_RADIO_RX_FMT = 136; static const uint32_t SR_RADIO_TX_FMT = 138; static const uint32_t SR_RADIO_USER_SR = 253; static const uint32_t RB_RADIO_TEST = 0; static const uint32_t RB_RADIO_TIME_NOW = 1; static const uint32_t RB_RADIO_TIME_PPS = 2; static const uint32_t RB_RADIO_CODEC_DATA = 3; static const uint32_t RB_RADIO_DEBUG = 4; static const uint32_t RB_RADIO_FRAMER = 5; static const uint32_t SR_RADIO_USER_RB = 7; static const uint32_t AD9361_SPI_SLAVE_NUM = 0x1; static const uint32_t ADF4001_SPI_SLAVE_NUM = 0x2; static const uint32_t RB_N230_PRODUCT_ID = 1; static const uint32_t RB_N230_COMPAT_MAJOR = 0x20; static const uint32_t RB_N230_COMPAT_SAFE = 0xC0; /******************************************************************* * Codec Interface Specific *******************************************************************/ // Matches delay setting of 0x00 in AD9361 register 0x006 static const uint32_t CODEC_DATA_DELAY = 0; static const uint32_t CODEC_CLK_DELAY = 16; //This number must be < 46.08MHz to make sure we don't //violate timing for radio_clk. It is only used during //initialization so the exact value does not matter. static const double CODEC_DEFAULT_CLK_RATE = 40e6; /******************************************************************* * Link Specific *******************************************************************/ static const double N230_LINK_RATE_BPS = 1e9/8; /******************************************************************* * GPSDO *******************************************************************/ static const uint32_t GPSDO_UART_BAUDRATE = 115200; static const uint32_t GPSDO_ST_ABSENT = 0x83; /******************************************************************* * Register Objects *******************************************************************/ class core_radio_ctrl_reg_t : public soft_reg32_wo_t { public: UHD_DEFINE_SOFT_REG_FIELD(MIMO, /*width*/ 1, /*shift*/ 0); //[0] UHD_DEFINE_SOFT_REG_FIELD(CODEC_ARST, /*width*/ 1, /*shift*/ 1); //[1] core_radio_ctrl_reg_t(): soft_reg32_wo_t(fpga::sr_addr(fpga::SR_CORE_RADIO_CONTROL)) { //Initial values set(CODEC_ARST, 0); set(MIMO, 1); //MIMO always ON for now } }; class core_misc_reg_t : public soft_reg32_wo_t { public: UHD_DEFINE_SOFT_REG_FIELD(REF_SEL, /*width*/ 1, /*shift*/ 0); //[0] UHD_DEFINE_SOFT_REG_FIELD(RX_BANDSEL_C, /*width*/ 1, /*shift*/ 1); //[1] UHD_DEFINE_SOFT_REG_FIELD(RX_BANDSEL_B, /*width*/ 1, /*shift*/ 2); //[2] UHD_DEFINE_SOFT_REG_FIELD(RX_BANDSEL_A, /*width*/ 1, /*shift*/ 3); //[3] UHD_DEFINE_SOFT_REG_FIELD(TX_BANDSEL_B, /*width*/ 1, /*shift*/ 4); //[4] UHD_DEFINE_SOFT_REG_FIELD(TX_BANDSEL_A, /*width*/ 1, /*shift*/ 5); //[5] core_misc_reg_t(): soft_reg32_wo_t(fpga::sr_addr(fpga::SR_CORE_MISC)) { //Initial values set(REF_SEL, 0); set(RX_BANDSEL_C, 0); set(RX_BANDSEL_B, 0); set(RX_BANDSEL_A, 0); set(TX_BANDSEL_B, 0); set(TX_BANDSEL_A, 0); } }; class core_pps_sel_reg_t : public soft_reg32_wo_t { public: UHD_DEFINE_SOFT_REG_FIELD(EXT_PPS_EN, /*width*/ 1, /*shift*/ 0); //[0] core_pps_sel_reg_t(): soft_reg32_wo_t(fpga::sr_addr(fpga::SR_CORE_PPS_SEL)) { //Initial values set(EXT_PPS_EN, 0); } }; class core_status_reg_t : public soft_reg64_ro_t { public: UHD_DEFINE_SOFT_REG_FIELD(REF_LOCKED, /*width*/ 1, /*shift*/ 0); //[0] UHD_DEFINE_SOFT_REG_FIELD(GPSDO_STATUS, /*width*/ 8, /*shift*/ 32); //[32:39] core_status_reg_t(): soft_reg64_ro_t(fpga::rb_addr(fpga::RB_CORE_STATUS)) { } }; }}}} //namespace #endif /* INCLUDED_N230_FPGA_DEFS_H */