| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
| |
|
|
|
|
|
|
| |
Change the width of the crossbar in the AXI Interconnect IP from
256-bit to 512-bit to match the DRAM memory controller width and to
give better performance.
|
| |
|
| |
|
|
|
|
|
|
|
| |
In the HDL, the parameter named 'MTU' is clog2 of the size of the
desired MTU. For example, when the 'MTU' parameter is 10, that means
the actual MTU setting is 2**MTU or 1024. So we need to set our
buffers to 2**MTU if we want them to be one MTU in size.
|
| |
|
|
|
|
|
|
| |
Include a register that contains SPI controller information.
Currently, it only provides the number of slaves addressable
by the SPI engine.
|
|
|
|
|
|
| |
Modify behavior of clock crossing between radio_clk and radio_clk_2x.
This ensures strobe signals are always asserted for a single
radio_clk_2x cycle and when radio_clk is low.
|
|
|
|
|
|
|
| |
- Added support for tx_spb and rx_spb arguments
- Fixed TX thread timestamp for single channel
Signed-off-by: michael-west <michael.west@ettus.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit refactors ctrlport_endpoint and fixes several issues related
to multiple threads sending and receiving control transfers.
First, it refactors the change that Martin Braun implemented in
0caed5529 by adding a tracking mechanism for control requests where
clients have explicitly asked to receive an ACK when the corresponding
control response is received.
When a client wants to wait for an ACK associated with a control
request, a combination of that request's opcode, address, and sequence
number is added to a set when the request is sent. When a control
response is received, the set is consulted to see if the corresponding
request is there by matching the packet field data listed above. If so,
the control response is added to the response queue, thus notifying all
threads waiting in `wait_for_ack()` that there is a response that the
thread may be waiting on. If the request is not in the set, the request
is never added to the response queue. This prevents the initial problem
that 0caed5529 was addressing of the response queue growing infinitely
large with control responses that would never be popped from the queue.
Secondly, it addresses issues when multiple threads have sent a request
packet and are waiting in `wait_for_ack()` on the corresponding
response.
Originally, the function contained a loop which would sleep the calling
thread until the control response queue had at least one element in it.
When awakened, the thread would pop the frontmost control response off
the queue to see if it matches the corresponding control request (i.e.,
has the same sequence number, opcode, and address elements). If so, the
response would be handled appropriately, which may include signalling an
error if the response indicates an exceptional status, and the function
would return. If the response is not a matching one, the function would
return to the top of the loop. If the corresponding response is not
found within a specified period, the function would throw an op_timeout
exception.
However, there is a subtle issue with this algorithm when two different
calling threads submit control requests and end up calling
`wait_for_ack()` nearly simultaneously. Consider two threads issuing a
control request. Thread T1 issues a request with sequence number 1 and
thread T2 issues a request with sequence number 2. The two threads then
call `wait_for_ack()`. Let's assume that neither of the control reponses
have arrived yet. Both threads sleep, waiting to be notified of a
response. Now the response for sequence number 1 arrives and is pushed
to the front the response queue. This generates a signal that awakes one
of the waiting threads, but which one is awakened is completely at the
mercy of the scheduler. If T1 is awakened first, it pops the response
from the queue, finds that it matches the request, and handles it as
expected. Later, when the reponse for sequence number 2 is pushed onto
the queue, the still-sleeping T2 will be awakened. It pops the response,
finds it to be matching, and all is well.
But if the scheduler decides to wake T2 first, T2 ends up popping the
response with sequence number 1 off the front of the queue, but it
doesn't match the request that T2 sent with sequence number 2, so T2
goes back to the top of the loop. At this point, it doesn't matter if T2
or T1 is awakened next; because the control response for sequence number
1 was already popped off the queue, T1 never sees the control response
it expects, and will throw uhd::op_timeout back up the stack.
This commit modifies the `wait_for_ack()` algorithm to search the queue
for a matching response rather than indiscriminately popping the
frontmost element from the queue and throwing it away if it doesn't
match. That way, the order in which threads are awakened no longer
matters as they will be able to find the corresponding response
regardless. Furthermore, when a response is pushed onto the response
queue, all waiting threads are notified of the condition via
`notify_all()`, rather than just waking one thread at random
(`notify_one()`). This gives all waiting threads the opportunity to
check the queue for a response.
Finally, the `wait_for_ack()` loop has been modified such that the
thread waits to be signalled regardless of whether the queue has
elements in it or not. (Prior to this change, the thread would only wait
to be signalled if the queue was empty.) This effectively implements the
behavior that all threads are awakened when a new control response is
pushed into the queue, and combined with the changes above, ensures that
all threads get a chance to react and check the queue when the queue is
modified.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The ref_locked mboard sensor on the n320 always returned true without
querying hardware. On this device family, mboard sensor callback in
n3xx.py returns the "and" of its daughterboard LMK PLLs by querying the
get_ref_lock() function on each dboard manager. However, that function
only existed for the Magnesium daughterbaord. For the Rhodium
daughterboard, the function didn't exist and so a true value was
automatically returned.
This commit adds the get_ref_lock() implementations for Rhodium and
EISCAT daughterboards, which are identical to the implementation
already present for Magnesium.
Co-authored-by: Martin Braun <martin.braun@ettus.com>
|
| |
|
|
|
|
|
|
|
|
| |
Make sure no active components are connected to the TX frontend during
next boot. This avoids configurations that could generate unwanted tones
during operations such as the Mykonos init cals.
Signed-off-by: mattprost <matt.prost@ni.com>
|
| |
|
|
|
|
|
|
|
|
|
| |
This is useful for unit testing certain code which operates the DDR
registers, in particular code which performs a read-modify-write
operation on that register.
Conceivably we could add more registers here, but I'm just doing one
at a time.
|
|
|
|
|
| |
The receiving socket can be used to send responses. This allows setting
firewall rules for USRP detection.
|
|
|
|
|
|
|
|
|
|
| |
- Use connect_through_blocks() to create connections
- Remove check for spp being an integer multiple of the word size, the
atomic item size feature will do that for us now
- When using --nsamps, automatically terminate application after samples
have been tx'd.
- Added sleep statements to throttle empty while loops
- Minor formatting changes
|
|
|
|
|
|
|
| |
This adds the atomic item size property to the replay block, which was
originally introduced in 3e5e4eb. The effect is that it enforces
streaming data to and from the block that is an integer multiple of the
word size.
|
| |
|
|
|
|
|
| |
This commit adds test cases to convert_test to specifically test the
saturating behavior of the fc32/fc64-to-sc16 conversions.
|
|
|
|
|
| |
This commit modifies the explicitly written narrowing conversions to
clamp the results to the limits of the signed integer type.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit adds Boost test cases for benchmarking each of the existing
conversions that are tested in convert_test. The benchmarks do take some
time, and we do not want to run they as part of every CI run, so they
are marked with a test decorator that disables the benchmark by default.
To run the benchmarks, invoke convert_test with `--run-test=+benchmark*`
to explicitly enable all disabled tests that begin with the word
'benchmark'. Individual benchmark test cases can be enabled by
specifying the full name of the benchmark test or by crafting a wildcard
that includes all benchmark test cases of interest.
|
|
|
|
|
| |
This commit adds code to the convert tests to support the ability to
benchmark individual conversion test cases.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit implements some minor cleanup of various converter- and
convert test-related code:
* Improves the log messages regarding which converter was returned for a
request.
* Modifies the result checking code in the converter tests to only
report an out-of-range sample error once, rather than reporting every
out-of-range sample encountered during the test. This vastly cuts down
on the output when a conversion has failed.
* Adds a function `reverse_converter()` which, given a
`convert::id_type` describing a conversion from C1 to C2, returns a
`convert::id_type` describing the reverse conversion (C2 to C1).
* Removes two redundant test cases from the converter test.
|
|
|
|
| |
Signed-off-by: Ron Economos <w6rz@comcast.net>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When executing eeprom-init on E320 (which was originally written for
N310), it would use defaults from N310, potentially causing issues.
These issues would have arisen if we letter-revved the E320 one more
time (because at rev 5, N310 had a compatibility cutover).
Summary of changes:
- eeprom-init will now read values *not* given on the command line from
the existing content of the EEPROM, if it contains valid data. This
means that DT, MCU, and rev compat values will no longer get
auto-derived if the EEPROM already contained "good" values.
- If the EEPROM is empty or corrupted, eeprom-init will no longer run if
the pid value is not provided. This is to avoid N310 defaults being
written to E320 EEPROMs.
- A README is added to explain which devices use which utilities.
- PID checks are more strict now. It is unlikely we'll build new devices
using the old EEPROM format (prior to TLV), so we can check
specifically for E320, N3x0.
- The hard-coded list of PIDs for the EEPROM tools are moved to
a central location (eeprom-pids.h).
- The code to derive values for DT/MCU/rev compat from the rev is now
pid-specific and no longer device-agnostic.
|
|
|
|
|
| |
* A uhd_test.so lacks the necessary symbols for testing
due to default visibility set to hidden.
|
|
|
|
|
|
|
| |
Instead of squashing errors, set continue on error so that warnings
propagate up. Also reset timeout to default 60 minutes.
Signed-off-by: Steven Koo <steven.koo@ni.com>
|
|
|
|
|
|
|
| |
- Add notes on playback and record behaviour
- Improve docs for play()
Co-authored-by: Wade Fife <wade.fife@ettus.com>
|
|
|
|
|
|
|
|
| |
When connecting an Rx streamer to a replay block, this now allows
requesting data from the replay block using a stream command. This will
automatically request data from all ports the streamer is connected to,
and even if there are blocks in between (depending on their action
forwarding policies).
|
|
|
|
| |
These RFNoC C++ API calls were previously not exported into Python.
|
|
|
|
|
|
|
| |
rfnoc::connect_through_blocks(), unlike rfnoc_graph::connect(), did not
have an argument to declare a back-edge. This patch remedies this
situation by adding a skip_property_propagation argument that works
exactly as with rfnoc_graph::connect().
|
|
|
|
|
| |
This was left over from when the manual was ported to Doxygen in
a74919c2. It is not used by Doxygen.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is a Doxygen setting where to find MathJax. The default might not
be suitable for everyone, and in particular, if people already have MJ
installed on their local system, they might prefer using that instead of
an online one.
Example usage: Assume you have MathJax installed locally, e.g., through
the mathjax package on Fedora, or the libjs-mathjax package on
Debian/Ubuntu. Then you could build UHD as such:
cmake -DMATHJAX_RELPATH=/usr/share/javascript/mathjax
This will now use the local version. Note that locally generated HTML
documentation can now no longer be copied to other machines, unless they
also have MathJax installed to the same path.
|
|
|
|
|
| |
This fixes an issue where tinfo and ncurses are split into separate
libraries.
|
| |
|
|
|
|
| |
Iterate over copy and delete from original dictionary.
|
|
|
|
|
| |
This thread is a vestige from copy & pasting N310 code, it does
absolutely nothing but occupy resources.
|
|
|
|
|
| |
USRP N230 is no longer supported starting with UHD 4, and thus, the
firmware code is also no longer required.
|
|
|
|
|
|
|
| |
These x4xx pipelines have been obsoleted
by x4xx integration with mono pipeline.
Signed-off-by: Steven Koo <steven.koo@ni.com>
|
| |
|
|
|
|
|
| |
The sw_iface entry in the `control` section is yet underdefined, so we
can remove it from the block descriptors.
|
|
|
|
|
|
|
| |
The FSRU (aka EISCAT) was never supported in UHD 4.0. The FPGA
repository never had the relevant files, and the block controller also
never existed. This removes all the corresponding files from MPM, as
well as some references from makefiles.
|
|
|
|
| |
UHD no longer depends on ORC since 41812aa2f (merged 2015).
|
|
|
|
|
|
|
| |
Change the --to argument to --to-destination. Both seem to work, but the
latter is what is listed in iptables-extensions(8). What's confusing is
that `--to` also exists in another context (in the `string` match
extension).
|
|
|
|
|
| |
This adds two additional ports to the DRAM, for a total of up to
four channels connected to DRAM.
|