Previously this was referenced off the the ad9862
PGA with a range from 0 to -20 dB. Instead base
the attenuation factor on the maximum total RF
gain returned by the device.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
On a lapses of time monotonicity (and possibly other errors),
stop and restart the receive streaming with a buffer flush
in between. This is a cleaner replacement to the previous
clock reset with that didn't attempt to stop steaming.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Type size_t was used in the UHD time_spec_t to integer
conversion, which would overflow at roughly 4 and a half
hours causing the sample buffer to error on timestamp
validity. Builds where size_t takes on 64-bits were not
affected by this bug.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
With UHD b4fc0d61bb6cbd1a5614745bab9aeb0abc22cb6f
Sample clock will reset to zero after an overrun. Earlier
versions may hang the FPGA, which is non-recoverable,
requiring a manual image reload or reboot.
If reset to zero, attempt to kick the sample clock to the
last properly received timestamp value. At this point,
there will be a timing continuity jump, which will drop
connections, but transmit and receive chains should be
aligned allowing for re-establishment.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Push the ability to set thread priority out to the 52M
Transceiver interface, because that's where the thread
control exists.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Use the same header files for the device and start moving
toward a commmon transceiver without so much redundant code.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Shadow all gains and frequencies, which minimizes device access.
This allows the transceiver to variably control the device
settings.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
This shouldn't matter much, but the gain settings through the
interface are short circuited right now, which makes this a
problem.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
The value is used to align transmit and receive time slots within
a sample. This oscilloscope measured value is close, but may
need minor tweaking.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Occasionally, the E100 will have errant timestamps at start
related to previous sessions. Early packets will be thrown
out anyways, so do this explicitly so the timestamps don't
royally fuck up the sample timing.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
These are mostly identical changes as added to the non-52MHz
implementation with the exception of sample rate.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Because I can't take it anymore...
Actually, I've been manually converting names to camel
case before checking in, which was an error prone process
in and of itself.
The interface is unchanged, so nobody should complain.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Utilize start and stop burst flags more effectively to
manage interaction with the FPGA. This makes communication
slightly more explicit, though it is not expected to
have a major effect. Also, lower the alignment messages
to DEBUG, and raise the asynchronous messages to INFO.
In other words, report the underrun, but not the handling
of it.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
On the E100, and possibly other systems, OpenBTS seg faults
at startup. The cause is a null reference to the global
logging file descriptor occuring due to an initializer order
dependency, which is not guaranteed across compilation
units.
When this occurs, check for for null and set the output to
stdout.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Though the receive loop ultimately drives the GSM clock,
it does not have any priority because it runs as a
separate thread from the trasmit loop. The transmit
has priority because it starts the UHD device, where
priority scheduling is enabled. The result is frequent
underruns, which occur regardless of buffer size tuning.
To address this, break out and expose the priority
setting so that it can be called from the radioInterface
at the start of a new thread.
Tested on a modest Intel Core 2 Duo tablet running
Linux 2.6.33.7.2-rt30, this reduced underruns down to
near zero.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Currently, upon receiving an unexpected timestamp, the sample
buffer will error and log its internal state. The errant
timestamp is not logged though. This patch fixes that.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Certain chipsets (e.g. RTL8168) have issues with the
initial packet of samples at that start of a UHD
receive stream resulting in timestamp errors shortly
after start. This temporary patch forces a receive
during init to clear any lingering errant packets.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Recent UHD firmware for the USRP2/N210 replaces the MicroBlaze
with a slower ZPU in addition to changes to the control
transactions. The effect is less predictable reading of the
current time and Tx/Rx sample mis-alignment following
underruns.
After an underrun, this patch drops potentially stale packets
with a fixed interval instead of relying on reading the
current time from the device.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
The non-UHD implementation tunes the DDC to output an inverted
spectrum that requires swapping on the host. Push I/Q and byte
swapping into the device implementation and strip the related
bits out of the remaining transceiver code.
This also moves the Transceiver closer to the Transcever52M
version.
Signed-off-by: Thomas Tsou <ttsou@vt.edu>
* 'master' of git://openbts.git.sourceforge.net/gitroot/openbts/openbts: (21 commits)
Transceiver52M: Do not delete 'trx' on exit.
common libs: Implemented ISLOGGING() macro to test whether given loglevel is going to be logged.
common libs: Implemented BitVector::unhex() which reads a hex string into a BitVector.
common libs: Lower log level for "setting log path to " message.
common libs: Use gethostbyname2_r() instead of gethostbyname() if available.
control: Save IMEI in TMSI table for informational purposes.
sip: Set display name for To field in a SIP MESSAGE.
control: Use std::string in TransactionEntry to ctore messaging payload.
smqueue: Documentation fixes for sm_state enumeration in smqueue.
gsm: Add 8-bit alphabet to enumeration of GSM alphabets.
sip: More comments and minor code ordering in SIP::sip_message().
smqueue: Fix compiler warning about char* and constant strings.
Transceiver: correctly exit if USRP is not found.
Transceiver52M: Fix wrong memcpy().
Better safety checks in TMSIRecord::load().
Zero file descriptors set before use.
Remove unused variable in BitVector::hex().
Move more code out of asserts.
Don't put real code into assert().
Fix a bug with Timeval difference calculation on 64-bit Linux.
...
This should make it slightly less frequent to segfault on exit.
Actually we should shutdown all our threads correctly, but that's a lot of work.
(cherry picked from commit 7cd65d3e5a717e0c224477cacfe932cfd7a45b8f)
I don't see real value of this message, while it's been printed to the screen like something very important.
(cherry picked from commit 3f3c9b2d2599a672f08624b3081c2c687cbba4d4)
gethostbyname() is not thread-safe. It's recommended to use gethostbyname_r() or gethostbyname2_r() instead.
(cherry picked from commit f27e9581cdb6837f83d0aab467f0e5f83e814e7b)
Originally there was a fixed-size char array, which didn't allow to work with long hex strings.
(cherry picked from commit fdc6fc85f9f431438ef7279975c2f7c230cb4aa5)
1) It should be memmove(), because source and destination regions may overlap.
2) Amount of moved memory was calculated incorrectly and was about 2x times more then really needed. We thus touched memory outside of the allocated array and may crash the program.
(cherry picked from commit fbed302055ebe77ca19b899c8bc307ca05b4a604)
This time I checked all occurrences of assert() and all others are ok, if I didn't miss anything
(cherry picked from commit 2afd3fd962eb89e08a73420542267191f459815f)
If you compile with optimization and NDEBUG is defined, then the whole assert() is replaced with ((void) 0) and your code is not executed at all.
Don't assert() on pthread_join() return value. If thread was not started yet, then pthread_join() will fail, but it's ok for us.
(cherry picked from commit d0b797e62c, 21a84dcec9cdf25657bba5c221aac9d4bb81d8b3, 8ed37a1f36e1b1266728647e715f95a28df3f900)
Subtracting uint32_t from uin32_t gives you uint32_t. And assigning result to a long doesn't make it a signed value, because on 64-bit Linux long is 64 bits.
(cherry picked from commit 82dd78d698)