diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/usrp/multi_usrp.cpp | 281 | 
1 files changed, 164 insertions, 117 deletions
diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index c08c6c0af..3af762c82 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -1860,158 +1860,195 @@ public:          return banks;      } -    void set_gpio_attr(const std::string &bank, const std::string &attr, const uint32_t value, const uint32_t mask, const size_t mboard) -    { +    void set_gpio_attr( +        const std::string &bank, +        const std::string &attr, +        const uint32_t value, +        const uint32_t mask, +        const size_t mboard +    ) {          std::vector<std::string> attr_value; -        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) -        { +        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) {              if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)){ -                gpio_atr::gpio_attr_t attr_type = gpio_atr::gpio_attr_rev_map.at(attr); -                switch (attr_type){ +                const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr); +                switch (attr_type) {                      case gpio_atr::GPIO_SRC: -                        throw uhd::runtime_error("Can't set SRC attribute using u32int_t value"); +                        throw uhd::runtime_error( +                            "Can't set SRC attribute using integer value!" +                        );                          break;                      case gpio_atr::GPIO_CTRL: -                    case gpio_atr::GPIO_DDR:{ -                        attr_value = _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).get(); +                    case gpio_atr::GPIO_DDR: { +                        attr_value = _tree->access<std::vector<std::string>>( +                            mb_root(mboard) / "gpio" / bank / attr +                        ).get();                          UHD_ASSERT_THROW(attr_value.size() <= 32);                          std::bitset<32> bit_mask = std::bitset<32>(mask);                          std::bitset<32> bit_value = std::bitset<32>(value); -                        for (size_t i = 0 ; i < bit_mask.size();i++){ -                            if (bit_mask[i] == 1){ +                        for (size_t i = 0; i < bit_mask.size(); i++) { +                            if (bit_mask[i] == 1) {                                  attr_value[i] = gpio_atr::attr_value_map.at(attr_type).at(bit_value[i]);                              }                          } -                        _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).set(attr_value); +                        _tree->access<std::vector<std::string>>( +                            mb_root(mboard) / "gpio" / bank / attr +                        ).set(attr_value);                      } -                        break; +                    break;                      default:{ -                        const uint32_t current = _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).get(); +                        const uint32_t current = _tree->access<uint32_t>( +                            mb_root(mboard) / "gpio" / bank / attr).get();                          const uint32_t new_value = (current & ~mask) | (value & mask);                          _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).set(new_value);                      } -                        break; +                    break;                  }                  return; -            }else{ -                throw uhd::runtime_error(str(boost::format( -                    "The hardware has no gpio attribute: %s:\n") % attr)); +            } else { +                throw uhd::runtime_error(str( +                    boost::format("The hardware has no gpio attribute: `%s':\n") +                    % attr +                ));              }          } -        if (bank.size() > 2 and bank[1] == 'X') -        { +        if (bank.size() > 2 and bank[1] == 'X') {              const std::string name = bank.substr(2); -            const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX; -            dboard_iface::sptr iface = _tree->access<dboard_iface::sptr>(mb_root(mboard) / "dboards" / name / "iface").get(); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_CTRL)) iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_DDR)) iface->set_gpio_ddr(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_OUT)) iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_0X)) iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_RX)) iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_TX)) iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_XX)) iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_SRC)){ +            const dboard_iface::unit_t unit = +                (bank[0] == 'R') +                ? dboard_iface::UNIT_RX +                : dboard_iface::UNIT_TX; +            auto iface = _tree->access<dboard_iface::sptr>( +                mb_root(mboard) / "dboards" / name / "iface").get(); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_CTRL)) +                iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_DDR)) +                iface->set_gpio_ddr(unit, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_OUT)) +                iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_0X)) +                iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_RX)) +                iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_TX)) +                iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_XX)) +                iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask)); +            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_SRC)) {                  throw uhd::runtime_error("Setting gpio source does not supported in daughter board.");              }              return;          } -        throw uhd::runtime_error(str(boost::format( -            "The hardware has no gpio bank: %s:\n") % bank)); +        throw uhd::runtime_error(str( +            boost::format("The hardware has no GPIO bank `%s'") +            % bank +        ));      } -    void set_gpio_attr(const std::string &bank, const std::string &attr, const std::string &str_value , const uint32_t mask, const size_t mboard) -    { - -        gpio_atr::gpio_attr_t attr_type = gpio_atr::gpio_attr_rev_map.at(attr); - -        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) -        { -            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)){ - +    void set_gpio_attr( +            const std::string &bank, +            const std::string &attr, +            const std::string &str_value, +            const uint32_t mask, +            const size_t mboard +    ) { +        const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr); +        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) { +            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) {                  switch (attr_type){                      case gpio_atr::GPIO_SRC:                      case gpio_atr::GPIO_CTRL:                      case gpio_atr::GPIO_DDR:{ -                         std::vector<std::string> attr_value = _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).get(); -                         UHD_ASSERT_THROW(attr_value.size() <= 32); +                        auto attr_value = +                            _tree->access<std::vector<std::string>>( +                                mb_root(mboard) / "gpio" / bank / attr).get(); +                        UHD_ASSERT_THROW(attr_value.size() <= 32);                          std::bitset<32> bit_mask = std::bitset<32>(mask); -                        for (size_t i = 0 ; i < bit_mask.size(); i++){ -                            if (bit_mask[i] == 1){ -                                 attr_value[i] = str_value; -                             } -                         } -                         _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).set(attr_value); -                     } -                        break; -                    default:{ -                        uint32_t value = gpio_atr::gpio_attr_value_pair.at(attr).at(str_value) == 0 ? -1 : 0; -                        const uint32_t current = _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).get(); -                        const uint32_t new_value = (current & ~mask) | (value & mask); -                        _tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).set(new_value); +                        for (size_t i = 0 ; i < bit_mask.size(); i++) { +                            if (bit_mask[i] == 1) { +                                attr_value[i] = str_value; +                            } +                        } +                        _tree->access<std::vector<std::string>>( +                               mb_root(mboard) / "gpio" / bank / attr +                        ).set(attr_value);                      } -                        break; +                    break; +                    default: { +                        const uint32_t value = +                            gpio_atr::gpio_attr_value_pair.at(attr).at(str_value) == 0 ? -1 : 0; +                        const uint32_t current = _tree->access<uint32_t>( +                            mb_root(mboard) / "gpio" / bank / attr).get(); +                        const uint32_t new_value = +                            (current & ~mask) | (value & mask); +                        _tree->access<uint32_t>( +                            mb_root(mboard) / "gpio" / bank / attr +                        ).set(new_value); +                    } +                    break;                  }                  return; -            }else{ -                throw uhd::runtime_error(str(boost::format( -                    "The hardware has no gpio attribute: %s:\n") % attr)); -            } -        } -        if (bank.size() > 2 and bank[1] == 'X') -        { -            uint32_t value = gpio_atr::gpio_attr_value_pair.at(attr).at(str_value) == 0 ? -1 : 0; -            const std::string name = bank.substr(2); -            const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX; -            dboard_iface::sptr iface = _tree->access<dboard_iface::sptr>(mb_root(mboard) / "dboards" / name / "iface").get(); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_CTRL))    iface->set_pin_ctrl(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_DDR))     iface->set_gpio_ddr(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_OUT))     iface->set_gpio_out(unit, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_0X))  iface->set_atr_reg(unit, gpio_atr::ATR_REG_IDLE, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_RX))  iface->set_atr_reg(unit, gpio_atr::ATR_REG_RX_ONLY, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_TX))  iface->set_atr_reg(unit, gpio_atr::ATR_REG_TX_ONLY, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_ATR_XX))  iface->set_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX, uint16_t(value), uint16_t(mask)); -            if (attr == gpio_atr::gpio_attr_map.at(gpio_atr::GPIO_SRC)){ -                throw uhd::runtime_error("Setting gpio source does not supported in daughter board."); -            } -            return; -        } -        throw uhd::runtime_error(str(boost::format("The hardware has no gpio bank: %s:\n") % bank)); +            } else { +                throw uhd::runtime_error(str( +                    boost::format("The hardware has no gpio attribute `%s'") +                    % attr +                )); +            } +        } +        // If the bank is not in the prop tree, convert string value to integer +        // value and have it handled by the other set_gpio_attr() +        const uint32_t value = +            gpio_atr::gpio_attr_value_pair.at(attr).at(str_value) == 0 +            ? -1 +            : 0; +        set_gpio_attr( +            bank, +            attr, +            value, +            mask, +            mboard +        );      } -    uint32_t get_gpio_attr(const std::string &bank, const std::string &attr, const size_t mboard) -    { +    uint32_t get_gpio_attr( +            const std::string &bank, +            const std::string &attr, +            const size_t mboard +    ) {          std::vector<std::string> str_val; -        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) -        { -            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)){ -                gpio_atr::gpio_attr_t attr_type = gpio_atr::gpio_attr_rev_map.at(attr); +        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) { +            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) { +                const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr);                  switch (attr_type){                      case gpio_atr::GPIO_SRC: -                        throw uhd::runtime_error("Can't set SRC  attribute using u32int_t value"); +                        throw uhd::runtime_error("Can't set SRC attribute using integer value");                      case gpio_atr::GPIO_CTRL: -                    case gpio_atr::GPIO_DDR:{ -                        str_val = _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).get(); +                    case gpio_atr::GPIO_DDR: { +                        str_val = _tree->access<std::vector<std::string>>( +                            mb_root(mboard) / "gpio" / bank / attr).get();                          uint32_t val = 0; -                        for(size_t i = 0 ; i < str_val.size() ; i++){ -                                val += usrp::gpio_atr::gpio_attr_value_pair.at(attr).at(str_val[i])<<i; +                        for(size_t i = 0 ; i < str_val.size() ; i++) { +                            val += usrp::gpio_atr::gpio_attr_value_pair.at(attr).at(str_val[i]) << i;                          }                          return val;                      } -                    default:{ -                        return uint32_t(_tree->access<uint64_t>(mb_root(mboard) / "gpio" / bank / attr).get()); -                    } +                    default: +                        return uint32_t(_tree->access<uint64_t>( +                            mb_root(mboard) / "gpio" / bank / attr).get());                  }                  return 0; -            }else{ -                throw uhd::runtime_error(str(boost::format("The hardware has no gpio attribute: %s:\n") % attr)); +            } else { +                throw uhd::runtime_error(str( +                    boost::format("The hardware has no gpio attribute: `%s'") +                    % attr +                ));              }          } -        if (bank.size() > 2 and bank[1] == 'X') -        { +        if (bank.size() > 2 and bank[1] == 'X') {              const std::string name = bank.substr(2);              const dboard_iface::unit_t unit = (bank[0] == 'R')? dboard_iface::UNIT_RX : dboard_iface::UNIT_TX; -            dboard_iface::sptr iface = _tree->access<dboard_iface::sptr>(mb_root(mboard) / "dboards" / name / "iface").get(); +            auto iface = _tree->access<dboard_iface::sptr>( +                mb_root(mboard) / "dboards" / name / "iface").get();              if (attr == "CTRL")     return iface->get_pin_ctrl(unit);              if (attr == "DDR")      return iface->get_gpio_ddr(unit);              if (attr == "OUT")      return iface->get_gpio_out(unit); @@ -2021,24 +2058,28 @@ public:              if (attr == "ATR_XX")   return iface->get_atr_reg(unit, gpio_atr::ATR_REG_FULL_DUPLEX);              if (attr == "READBACK") return iface->read_gpio(unit);          } -        throw uhd::runtime_error(str(boost::format("The hardware has no gpio bank: %s:\n") % bank)); +        throw uhd::runtime_error(str( +            boost::format("The hardware has no gpio bank `%s'") +            % bank +        ));      } -    std::vector<std::string> get_gpio_string_attr(const std::string &bank, const std::string &attr, const size_t mboard) -    { -        gpio_atr::gpio_attr_t attr_type = gpio_atr::gpio_attr_rev_map.at(attr); -        std::vector<std::string> str_val = std::vector<std::string>(32, gpio_atr::default_attr_value_map.at(attr_type)); -        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) -        { -            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) -            { -                gpio_atr::gpio_attr_t attr_type = gpio_atr::gpio_attr_rev_map.at(attr); + +    std::vector<std::string> get_gpio_string_attr( +        const std::string &bank, +        const std::string &attr, +        const size_t mboard +    ) { +        const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr); +        auto str_val = std::vector<std::string>(32, gpio_atr::default_attr_value_map.at(attr_type)); +        if (_tree->exists(mb_root(mboard) / "gpio" / bank)) { +            if (_tree->exists(mb_root(mboard) / "gpio" / bank / attr)) { +                const auto attr_type = gpio_atr::gpio_attr_rev_map.at(attr);                  switch (attr_type){                      case gpio_atr::GPIO_SRC:                      case gpio_atr::GPIO_CTRL: -                    case gpio_atr::GPIO_DDR:{ +                    case gpio_atr::GPIO_DDR:                          return _tree->access<std::vector<std::string>>(mb_root(mboard) / "gpio" / bank / attr).get(); -                    } -                    default:{ +                    default: {                          uint32_t value = uint32_t(_tree->access<uint32_t>(mb_root(mboard) / "gpio" / bank / attr).get());                          std::bitset<32> bit_value = std::bitset<32>(value);                          for (size_t i = 0; i < bit_value.size(); i++) @@ -2049,13 +2090,19 @@ public:                      }                  }              } -            else -            { -                throw uhd::runtime_error(str(boost::format("The hardware has no gpio attribute: %s:\n") % attr)); +            else { +                throw uhd::runtime_error(str( +                    boost::format("The hardware has no gpio attribute: `%s'") +                    % attr +                ));              }          } -        throw uhd::runtime_error(str(boost::format("The hardware has no support for given gpio bank name: %s:\n") % bank)); +        throw uhd::runtime_error(str( +            boost::format("The hardware has no support for given gpio bank name `%s'") +            % bank +        ));      } +      void write_register(const std::string &path, const uint32_t field, const uint64_t value, const size_t mboard)      {          if (_tree->exists(mb_root(mboard) / "registers"))  | 
