USRP Hardware Driver and Device Manual  Version: 4.11.0.0-0-g0d7ed3b1
UHD and USRP Manual
multichan_register_iface.hpp
Go to the documentation of this file.
1 //
2 // Copyright 2020 Ettus Research, a National Instruments Brand
3 //
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 //
6 
7 #pragma once
8 
12 #include <uhd/types/time_spec.hpp>
13 #include <cstdint>
14 #include <functional>
15 #include <memory>
16 #include <vector>
17 
18 namespace uhd { namespace rfnoc {
19 
31 {
32 public:
33  using sptr = std::shared_ptr<multichan_register_iface>;
34 
36  const uint32_t block_base_addr,
37  const size_t block_size)
38  : _reg_iface_holder(reg_iface_holder)
39  , _block_base_addr(block_base_addr)
40  , _block_size(block_size)
41  {
42  }
43 
45 
59  inline void poke32(uint32_t addr,
60  uint32_t data,
61  const size_t instance = 0,
63  bool ack = false)
64  {
65  _reg_iface_holder.regs().poke32(_get_addr(addr, instance), data, time, ack);
66  }
67 
86  inline void poke64(uint32_t addr,
87  uint64_t data,
88  const size_t instance = 0,
90  bool ack = false)
91  {
92  _reg_iface_holder.regs().poke64(_get_addr(addr, instance), data, time, ack);
93  }
94 
114  inline void multi_poke32(const std::vector<uint32_t> addrs,
115  const std::vector<uint32_t> data,
116  const size_t instance = 0,
118  bool ack = false)
119  {
120  std::vector<uint32_t> abs_addrs(addrs.size());
121  std::transform(addrs.begin(),
122  addrs.end(),
123  abs_addrs.begin(),
124  [this, instance](
125  uint32_t addr) -> uint32_t { return _get_addr(addr, instance); });
126  _reg_iface_holder.regs().multi_poke32(abs_addrs, data, time, ack);
127  }
128 
150  inline void block_poke32(uint32_t first_addr,
151  const std::vector<uint32_t> data,
152  const size_t instance = 0,
154  bool ack = false)
155  {
156  _reg_iface_holder.regs().block_poke32(
157  _get_addr(first_addr, instance), data, time, ack);
158  }
159 
173  inline void burst_poke32(uint32_t addr,
174  const std::vector<uint32_t> data,
175  const size_t instance = 0,
177  bool ack = false)
178  {
179  _reg_iface_holder.regs().burst_poke32(_get_addr(addr, instance), data, time, ack);
180  }
181 
192  inline uint32_t peek32(uint32_t addr,
193  const size_t instance = 0,
195  {
196  return _reg_iface_holder.regs().peek32(_get_addr(addr, instance), time);
197  }
198 
215  inline uint64_t peek64(uint32_t addr,
216  const size_t instance = 0,
218  {
219  return _reg_iface_holder.regs().peek64(_get_addr(addr, instance), time);
220  }
221 
242  inline std::vector<uint32_t> block_peek32(uint32_t first_addr,
243  size_t length,
244  const size_t instance = 0,
246  {
247  return _reg_iface_holder.regs().block_peek32(
248  _get_addr(first_addr, instance), length, time);
249  }
250 
264  inline std::vector<uint32_t> burst_peek32(uint32_t addr,
265  size_t length,
266  const size_t instance = 0,
268  {
269  return _reg_iface_holder.regs().burst_peek32(
270  _get_addr(addr, instance), length, time);
271  }
272 
317  inline std::optional<uint32_t> poll32(uint32_t addr,
318  uint32_t data,
319  uint32_t mask,
320  time_spec_t timeout,
321  const size_t instance = 0,
323  bool ack = false)
324  {
325  return _reg_iface_holder.regs().poll32(
326  _get_addr(addr, instance), data, mask, timeout, time, ack);
327  }
328 
329 private:
330  register_iface_holder& _reg_iface_holder;
331  uint32_t _block_base_addr;
332  size_t _block_size;
333 
334  inline uint32_t _get_addr(const uint32_t reg_offset, const size_t instance) const
335  {
336  return _block_base_addr + reg_offset + _block_size * instance;
337  }
338 
339 }; // class multichan_register_iface
340 
341 }} /* namespace uhd::rfnoc */
Definition: multichan_register_iface.hpp:31
void burst_poke32(uint32_t addr, const std::vector< uint32_t > data, const size_t instance=0, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:173
std::vector< uint32_t > burst_peek32(uint32_t addr, size_t length, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP)
Definition: multichan_register_iface.hpp:264
std::optional< uint32_t > poll32(uint32_t addr, uint32_t data, uint32_t mask, time_spec_t timeout, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:317
std::vector< uint32_t > block_peek32(uint32_t first_addr, size_t length, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP)
Definition: multichan_register_iface.hpp:242
void poke64(uint32_t addr, uint64_t data, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:86
std::shared_ptr< multichan_register_iface > sptr
Definition: multichan_register_iface.hpp:33
void multi_poke32(const std::vector< uint32_t > addrs, const std::vector< uint32_t > data, const size_t instance=0, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:114
uint64_t peek64(uint32_t addr, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP)
Definition: multichan_register_iface.hpp:215
void poke32(uint32_t addr, uint32_t data, const size_t instance=0, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:59
void block_poke32(uint32_t first_addr, const std::vector< uint32_t > data, const size_t instance=0, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: multichan_register_iface.hpp:150
uint32_t peek32(uint32_t addr, const size_t instance=0, time_spec_t time=uhd::time_spec_t::ASAP)
Definition: multichan_register_iface.hpp:192
multichan_register_iface(register_iface_holder &reg_iface_holder, const uint32_t block_base_addr, const size_t block_size)
Definition: multichan_register_iface.hpp:35
Definition: register_iface_holder.hpp:19
register_iface & regs()
Definition: register_iface_holder.hpp:28
virtual void block_poke32(uint32_t first_addr, const std::vector< uint32_t > data, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)=0
uint64_t peek64(uint32_t addr, time_spec_t time=uhd::time_spec_t::ASAP)
Definition: register_iface.hpp:264
virtual void burst_poke32(uint32_t addr, const std::vector< uint32_t > data, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)=0
virtual std::optional< uint32_t > poll32(uint32_t addr, uint32_t data, uint32_t mask, time_spec_t timeout, time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)=0
virtual void multi_poke32(const std::vector< uint32_t > addrs, const std::vector< uint32_t > data, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)=0
virtual std::vector< uint32_t > block_peek32(uint32_t first_addr, size_t length, time_spec_t time=uhd::time_spec_t::ASAP)=0
virtual uint32_t peek32(uint32_t addr, time_spec_t time=uhd::time_spec_t::ASAP)=0
virtual std::vector< uint32_t > burst_peek32(uint32_t addr, size_t length, time_spec_t time=uhd::time_spec_t::ASAP)=0
void poke64(uint32_t addr, uint64_t data, time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)
Definition: register_iface.hpp:152
virtual void poke32(uint32_t addr, uint32_t data, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false)=0
Definition: time_spec.hpp:31
static constexpr double ASAP
Definition: time_spec.hpp:34
UHD_INLINE data_t mask(const soft_reg_field_t field)
Definition: soft_register.hpp:86
Definition: build_info.hpp:12