diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/usrp/dboard/db_sbx.cpp | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/host/lib/usrp/dboard/db_sbx.cpp b/host/lib/usrp/dboard/db_sbx.cpp index c9dca49b0..40e1a8851 100644 --- a/host/lib/usrp/dboard/db_sbx.cpp +++ b/host/lib/usrp/dboard/db_sbx.cpp @@ -16,18 +16,19 @@ // // Common IO Pins +#define LO_LPF_EN (1 << 15) #define ADF4350_CE (1 << 3) #define ADF4350_PDBRF (1 << 2) #define ADF4350_MUXOUT (1 << 1) // INPUT!!! #define LOCKDET_MASK (1 << 0) // INPUT!!! // TX IO Pins +#define TRSW (1 << 14) // 0 = TX, 1 = RX #define TX_PUP_5V (1 << 7) // enables 5.0V power supply #define TX_PUP_3V (1 << 6) // enables 3.3V supply #define TXMOD_EN (1 << 4) // on UNIT_TX, 1 enables TX Modulator // RX IO Pins -#define TRSW (1 << 15) // 0 = TX, 1 = RX #define LNASW (1 << 14) // 0 = TX/RX, 1 = RX2 #define RX_PUP_5V (1 << 7) // enables 5.0V power supply #define RX_PUP_3V (1 << 6) // enables 3.3V supply @@ -45,15 +46,15 @@ #define TX_MIXER_ENB (TXMOD_EN|ADF4350_PDBRF) #define TX_MIXER_DIS 0 -#define RX_MIXER_ENB (ADF4350_PDBRF) +#define RX_MIXER_ENB (LO_LPF_EN|ADF4350_PDBRF) #define RX_MIXER_DIS 0 // Pin functions #define TX_POWER_IO (TX_PUP_5V|TX_PUP_3V) // high enables power supply -#define TXIO_MASK (TX_POWER_IO|ADF4350_CE|ADF4350_PDBRF|TXMOD_EN|TX_ATTN_MASK) +#define TXIO_MASK (LO_LPF_EN|TX_POWER_IO|TRSW|ADF4350_CE|ADF4350_PDBRF|TXMOD_EN|TX_ATTN_MASK) #define RX_POWER_IO (RX_PUP_5V|RX_PUP_3V) // high enables power supply -#define RXIO_MASK (RX_POWER_IO|TRSW|LNASW|ADF4350_CE|ADF4350_PDBRF|RXBB_PDB|RX_ATTN_MASK) +#define RXIO_MASK (LO_LPF_EN|RX_POWER_IO|LNASW|ADF4350_CE|ADF4350_PDBRF|RXBB_PDB|RX_ATTN_MASK) // Power functions #define TX_POWER_UP (TX_POWER_IO|ADF4350_CE) @@ -63,11 +64,11 @@ #define RX_POWER_DOWN 0 // Antenna constants -#define ANT_TX TRSW //the tx line is transmitting -#define ANT_RX TRSW //the tx line is receiving -#define ANT_TXRX TRSW //the rx line is on txrx -#define ANT_RX2 (TRSW|LNASW) //the rx line in on rx2 -#define ANT_XX TRSW //dont care how the antenna is set +#define ANT_TX 0 //the tx line is transmitting +#define ANT_RX 0 //the tx line is receiving +#define ANT_TXRX LNASW //the rx line is on txrx +#define ANT_RX2 LNASW //the rx line in on rx2 +#define ANT_XX LNASW //dont care how the antenna is set #include "adf4350_regs.hpp" #include <uhd/types/dict.hpp> @@ -100,11 +101,11 @@ static const prop_names_t sbx_tx_antennas = list_of("TX/RX"); static const prop_names_t sbx_rx_antennas = list_of("TX/RX")("RX2"); static const uhd::dict<std::string, gain_range_t> sbx_tx_gain_ranges = map_list_of - ("PGA0", gain_range_t(0, 31.5, float(0.5))) + ("PGA0", gain_range_t(0, 31.5, double(0.5))) ; static const uhd::dict<std::string, gain_range_t> sbx_rx_gain_ranges = map_list_of - ("PGA0", gain_range_t(0, 31.5, float(0.5))) + ("PGA0", gain_range_t(0, 31.5, double(0.5))) ; /*********************************************************************** @@ -122,7 +123,7 @@ public: void tx_set(const wax::obj &key, const wax::obj &val); private: - uhd::dict<std::string, float> _tx_gains, _rx_gains; + uhd::dict<std::string, double> _tx_gains, _rx_gains; double _rx_lo_freq, _tx_lo_freq; std::string _tx_ant, _rx_ant; @@ -130,8 +131,8 @@ private: void set_tx_lo_freq(double freq); void set_rx_ant(const std::string &ant); void set_tx_ant(const std::string &ant); - void set_rx_gain(float gain, const std::string &name); - void set_tx_gain(float gain, const std::string &name); + void set_rx_gain(double gain, const std::string &name); + void set_tx_gain(double gain, const std::string &name); void update_atr(void); @@ -202,12 +203,12 @@ sbx_xcvr::~sbx_xcvr(void){ /*********************************************************************** * Gain Handling **********************************************************************/ -static int rx_pga0_gain_to_iobits(float &gain){ +static int rx_pga0_gain_to_iobits(double &gain){ //clip the input gain = sbx_rx_gain_ranges["PGA0"].clip(gain); //convert to attenuation and update iobits for atr - float attn = sbx_rx_gain_ranges["PGA0"].stop() - gain; + double attn = sbx_rx_gain_ranges["PGA0"].stop() - gain; //calculate the RX attenuation int attn_code = int(floor(attn*2)); @@ -219,17 +220,17 @@ static int rx_pga0_gain_to_iobits(float &gain){ ) % attn % attn_code % (iobits & RX_ATTN_MASK) % RX_ATTN_MASK << std::endl; //the actual gain setting - gain = sbx_rx_gain_ranges["PGA0"].stop() - float(attn_code)/2; + gain = sbx_rx_gain_ranges["PGA0"].stop() - double(attn_code)/2; return iobits; } -static int tx_pga0_gain_to_iobits(float &gain){ +static int tx_pga0_gain_to_iobits(double &gain){ //clip the input gain = sbx_tx_gain_ranges["PGA0"].clip(gain); //convert to attenuation and update iobits for atr - float attn = sbx_tx_gain_ranges["PGA0"].stop() - gain; + double attn = sbx_tx_gain_ranges["PGA0"].stop() - gain; //calculate the TX attenuation int attn_code = int(floor(attn*2)); @@ -241,12 +242,12 @@ static int tx_pga0_gain_to_iobits(float &gain){ ) % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK << std::endl; //the actual gain setting - gain = sbx_tx_gain_ranges["PGA0"].stop() - float(attn_code)/2; + gain = sbx_tx_gain_ranges["PGA0"].stop() - double(attn_code)/2; return iobits; } -void sbx_xcvr::set_tx_gain(float gain, const std::string &name){ +void sbx_xcvr::set_tx_gain(double gain, const std::string &name){ assert_has(sbx_tx_gain_ranges.keys(), name, "sbx tx gain name"); if(name == "PGA0"){ tx_pga0_gain_to_iobits(gain); @@ -258,7 +259,7 @@ void sbx_xcvr::set_tx_gain(float gain, const std::string &name){ else UHD_THROW_INVALID_CODE_PATH(); } -void sbx_xcvr::set_rx_gain(float gain, const std::string &name){ +void sbx_xcvr::set_rx_gain(double gain, const std::string &name){ assert_has(sbx_rx_gain_ranges.keys(), name, "sbx rx gain name"); if(name == "PGA0"){ rx_pga0_gain_to_iobits(gain); @@ -280,25 +281,25 @@ void sbx_xcvr::update_atr(void){ //setup the tx atr (this does not change with antenna) this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, dboard_iface::ATR_REG_IDLE, - tx_pga0_iobits | TX_POWER_UP | ANT_XX | TX_MIXER_DIS); + tx_pga0_iobits | TX_POWER_UP | TRSW | TX_MIXER_DIS); this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, dboard_iface::ATR_REG_RX_ONLY, - tx_pga0_iobits | TX_POWER_UP | ANT_XX | TX_MIXER_DIS); + tx_pga0_iobits | TX_POWER_UP | TRSW | TX_MIXER_DIS); this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, dboard_iface::ATR_REG_TX_ONLY, - tx_pga0_iobits | TX_POWER_UP | ANT_XX | TX_MIXER_ENB); + tx_pga0_iobits | TX_POWER_UP | TRSW | TX_MIXER_ENB); this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, dboard_iface::ATR_REG_FULL_DUPLEX, - tx_pga0_iobits | TX_POWER_UP | ANT_XX | TX_MIXER_ENB); + tx_pga0_iobits | TX_POWER_UP | TRSW | TX_MIXER_ENB); //setup the rx atr (this does not change with antenna) this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_IDLE, - rx_pga0_iobits | RX_POWER_UP | ANT_XX | RX_MIXER_DIS); + rx_pga0_iobits | RX_POWER_UP | LNASW | RX_MIXER_DIS); this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_TX_ONLY, - rx_pga0_iobits | RX_POWER_UP | ANT_TX | RX_MIXER_DIS); + rx_pga0_iobits | RX_POWER_UP | LNASW | RX_MIXER_DIS); this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_FULL_DUPLEX, - rx_pga0_iobits | RX_POWER_UP | ANT_RX2| RX_MIXER_ENB); + rx_pga0_iobits | RX_POWER_UP | LNASW | RX_MIXER_ENB); //set the rx atr regs that change with antenna setting this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_RX_ONLY, - rx_pga0_iobits | RX_POWER_UP | RX_MIXER_ENB | ((_rx_ant == "TX/RX")? ANT_TXRX : ANT_RX2)); + rx_pga0_iobits | RX_POWER_UP | RX_MIXER_ENB | LNASW); //((_rx_ant == "TX/RX")? ANT_TXRX : ANT_RX2)); if (sbx_debug) std::cerr << boost::format( "SBX RXONLY ATR REG: 0x%08x" ) % (rx_pga0_iobits | RX_POWER_UP | RX_MIXER_ENB | ((_rx_ant == "TX/RX")? ANT_TXRX : ANT_RX2)) << std::endl; @@ -530,6 +531,10 @@ void sbx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){ val = false; return; + case SUBDEV_PROP_ENABLED: + val = true; //always enabled + return; + case SUBDEV_PROP_SENSOR: UHD_ASSERT_THROW(key.name == "lo_locked"); val = sensor_value_t("LO", this->get_locked(dboard_iface::UNIT_RX), "locked", "unlocked"); @@ -558,13 +563,16 @@ void sbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){ return; case SUBDEV_PROP_GAIN: - this->set_rx_gain(val.as<float>(), key.name); + this->set_rx_gain(val.as<double>(), key.name); return; case SUBDEV_PROP_ANTENNA: this->set_rx_ant(val.as<std::string>()); return; + case SUBDEV_PROP_ENABLED: + return; //always enabled + case SUBDEV_PROP_BANDWIDTH: uhd::warning::post( str(boost::format("SBX: No tunable bandwidth, fixed filtered to 40MHz")) @@ -629,6 +637,10 @@ void sbx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){ val = false; return; + case SUBDEV_PROP_ENABLED: + val = true; //always enabled + return; + case SUBDEV_PROP_SENSOR: UHD_ASSERT_THROW(key.name == "lo_locked"); val = sensor_value_t("LO", this->get_locked(dboard_iface::UNIT_TX), "locked", "unlocked"); @@ -657,13 +669,16 @@ void sbx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){ return; case SUBDEV_PROP_GAIN: - this->set_tx_gain(val.as<float>(), key.name); + this->set_tx_gain(val.as<double>(), key.name); return; case SUBDEV_PROP_ANTENNA: this->set_tx_ant(val.as<std::string>()); return; + case SUBDEV_PROP_ENABLED: + return; //always enabled + case SUBDEV_PROP_BANDWIDTH: uhd::warning::post( str(boost::format("SBX: No tunable bandwidth, fixed filtered to 40MHz")) |