diff options
| -rw-r--r-- | host/lib/usrp/usrp1/dboard_iface.cpp | 105 | 
1 files changed, 63 insertions, 42 deletions
diff --git a/host/lib/usrp/usrp1/dboard_iface.cpp b/host/lib/usrp/usrp1/dboard_iface.cpp index 142907e57..fe4ebe04c 100644 --- a/host/lib/usrp/usrp1/dboard_iface.cpp +++ b/host/lib/usrp/usrp1/dboard_iface.cpp @@ -31,15 +31,6 @@ using namespace uhd;  using namespace uhd::usrp;  using namespace boost::assign; -/*********************************************************************** - * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO - * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO - * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO - * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO - * - * check the _dboard_slot and handle conditionally... - **********************************************************************/ -  class usrp1_dboard_iface : public dboard_iface {  public: @@ -161,13 +152,17 @@ void usrp1_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value)  {      switch(unit) {      case UNIT_RX: -         _iface->poke32(FR_ATR_MASK_1, value); -         _iface->poke32(FR_ATR_MASK_3, 0x00000000); -         break;  +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +             _iface->poke32(FR_ATR_MASK_1, value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +             _iface->poke32(FR_ATR_MASK_3, value); +        break;      case UNIT_TX: -         _iface->poke32(FR_ATR_MASK_0, value); -         _iface->poke32(FR_ATR_MASK_2, 0x00000000); -         break; +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_ATR_MASK_0, value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_ATR_MASK_2, value); +        break;      }  } @@ -175,12 +170,16 @@ void usrp1_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value)  {      switch(unit) {      case UNIT_RX: -        _iface->poke32(FR_OE_1, 0xffff0000 | value); -        _iface->poke32(FR_OE_3, 0xffff0000); -        break;  +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_OE_1, 0xffff0000 | value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_OE_3, 0xffff0000 | value); +        break;      case UNIT_TX: -        _iface->poke32(FR_OE_0, 0xffff0000 | value); -        _iface->poke32(FR_OE_2, 0xffff0000); +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_OE_0, 0xffff0000 | value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_OE_2, 0xffff0000 | value);          break;      }  } @@ -189,10 +188,16 @@ void usrp1_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value)  {      switch(unit) {      case UNIT_RX: -        _iface->poke32(FR_IO_1, 0xffff0000 | value); +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_IO_1, 0xffff0000 | value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_IO_3, 0xffff0000 | value);          break;      case UNIT_TX: -        _iface->poke32(FR_IO_0, 0xffff0000 | value); +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_IO_0, 0xffff0000 | value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_IO_2, 0xffff0000 | value);          break;      }  } @@ -200,19 +205,19 @@ void usrp1_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value)  boost::uint16_t usrp1_dboard_iface::read_gpio(unit_t unit)  {      boost::uint32_t out_value; -    boost::uint16_t ret_value; + +    if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +        out_value = _iface->peek32(1); +    else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +        out_value = _iface->peek32(2); +    else +        UHD_THROW_INVALID_CODE_PATH();      switch(unit) {      case UNIT_RX: -        //magic -        out_value = _iface->peek32(1); -        ret_value = (out_value >> 16) & 0x0000ffff; -        return ret_value; +        return (boost::uint16_t)((out_value >> 16) & 0x0000ffff);      case UNIT_TX: -        //magic -        out_value = _iface->peek32(1); -        ret_value = (out_value >>  0) & 0x0000ffff; -        return ret_value; +        return (boost::uint16_t)((out_value >>  0) & 0x0000ffff);      }      UHD_ASSERT_THROW(false);  } @@ -228,13 +233,16 @@ void usrp1_dboard_iface::set_atr_reg(unit_t unit,      switch(unit) {      case UNIT_RX: -        _iface->poke32(FR_ATR_RXVAL_1, value); -        _iface->poke32(FR_ATR_RXVAL_3, 0x0000); +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_ATR_RXVAL_1, value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_ATR_RXVAL_3, value);          break;       case UNIT_TX: -        //_iface->poke32(FR_ATR_TXVAL_0, value); -        _iface->poke32(FR_ATR_TXVAL_0, 0x0000); -        _iface->poke32(FR_ATR_TXVAL_2, 0x0000); +        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A) +            _iface->poke32(FR_ATR_TXVAL_0, value); +        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B) +            _iface->poke32(FR_ATR_TXVAL_2, value);          break;      }  } @@ -244,16 +252,29 @@ void usrp1_dboard_iface::set_atr_reg(unit_t unit,  /*!   * Static function to convert a unit type to a spi slave device number.   * \param unit the dboard interface unit type enum + * \param slot the side (A or B) the dboard is attached   * \return the slave device number   */ -static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit) +static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit, +                                           usrp1_impl::dboard_slot_t slot)  {      switch(unit) { -    case dboard_iface::UNIT_TX: return SPI_ENABLE_TX_A;  -    case dboard_iface::UNIT_RX: return SPI_ENABLE_RX_A; +    case dboard_iface::UNIT_TX: +        if (slot == usrp1_impl::DBOARD_SLOT_A) +            return SPI_ENABLE_TX_A;  +        else if (slot == usrp1_impl::DBOARD_SLOT_B) +            return SPI_ENABLE_TX_B; +        else +            break; +    case dboard_iface::UNIT_RX: +        if (slot == usrp1_impl::DBOARD_SLOT_A) +            return SPI_ENABLE_RX_A;  +        else if (slot == usrp1_impl::DBOARD_SLOT_B) +            return SPI_ENABLE_RX_B; +        else +            break;      }      throw std::invalid_argument("unknown unit type"); -  }  void usrp1_dboard_iface::write_spi(unit_t unit, @@ -261,7 +282,7 @@ void usrp1_dboard_iface::write_spi(unit_t unit,                                     boost::uint32_t data,                                     size_t num_bits)  { -    _iface->transact_spi(unit_to_otw_spi_dev(unit), +    _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),                           config, data, num_bits, false);  } @@ -270,7 +291,7 @@ boost::uint32_t usrp1_dboard_iface::read_write_spi(unit_t unit,                                                     boost::uint32_t data,                                                     size_t num_bits)  { -    return _iface->transact_spi(unit_to_otw_spi_dev(unit), +    return _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),                                  config, data, num_bits, true);  }  | 
