mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx.git
synced 2025-10-23 00:11:59 +00:00
173 lines
7.0 KiB
Plaintext
173 lines
7.0 KiB
Plaintext
[[trx_backends]]
|
|
== OsmoTRX backend support
|
|
|
|
[[backend_uhd]]
|
|
=== `osmo-trx-uhd` for UHD based Transceivers
|
|
|
|
This OsmoTRX model uses _libuhd_ (UHD, USRP Hardware Driver) to drive the
|
|
device, that is configuring it and reading/writing samples from/to it.
|
|
|
|
So far, this backend has been mostly used to drive devices such as the Ettus
|
|
B200 family and Fairwaves UmTRX family, and used to be the default backend used
|
|
for legacy @osmo-trx@ binary when per-backend binaries didn't exist yet.
|
|
|
|
Any device providing generic support for UHD should theoretically be able to be
|
|
run through this backend without much effort, but practical experience showed
|
|
that some devices don't play well with it, such as the LimeSDR family of
|
|
devices, which showed far better results when using its native interface.
|
|
|
|
Related code can be found in the _Transceiver52M/device/uhd/_ directory in
|
|
_osmo-trx.git_.
|
|
|
|
[[backend_lms]]
|
|
=== `osmo-trx-lms` for LimeSuite based Transceivers
|
|
|
|
This OsmoTRX model uses LimeSuite API and library to drive the device, that is
|
|
configuring it and reading/writing samples from/to it.
|
|
|
|
This backend was developed in order to be used together with LimeSDR-USB and
|
|
LimeSDR-mini devices, due to to the poor results obtained with the UHD backend,
|
|
and to simplify the stack.
|
|
|
|
Related code can be found in the _Transceiver52M/device/lms/_ directory in
|
|
_osmo-trx.git_.
|
|
|
|
[[backend_usrp1]]
|
|
=== `osmo-trx-usrp1` for libusrp based Transceivers
|
|
|
|
This OsmoTRX model uses the legacy libusrp driver provided in GNU Radio 3.4.2.
|
|
|
|
As this code was dropped from GNU Radio at some point and was found very
|
|
difficult to build, some work was done to create a standalone libusrp which can
|
|
be nowadays found as a separate git repository together with other osmocom git
|
|
repositories, in https://git.osmocom.org/libusrp/
|
|
|
|
Related code can be found in the _Transceiver52M/device/usrp1/_ directory in
|
|
_osmo-trx.git_.
|
|
|
|
The USRPDevice module is basically a driver that reads/writes packets to a USRP
|
|
with two RFX900 daughterboards, board A is the Tx chain and board B is the Rx
|
|
chain.
|
|
|
|
The `radioInterface` module is basically an interface between the transceiver
|
|
and the USRP. It operates the basestation clock based upon the sample count of
|
|
received USRP samples. Packets from the USRP are queued and segmented into GSM
|
|
bursts that are passed up to the transceiver; bursts from the transceiver are
|
|
passed down to the USRP.
|
|
|
|
The transceiver basically operates "layer 0" of the GSM stack, performing the
|
|
modulation, detection, and demodulation of GSM bursts. It communicates with the
|
|
GSM stack via three UDP sockets, one socket for data, one for control messages,
|
|
and one socket to pass clocking information. The transceiver contains a priority
|
|
queue to sort to-be-transmitted bursts, and a filler table to fill in timeslots
|
|
that do not have bursts in the priority queue. The transceiver tries to stay
|
|
ahead of the basestation clock, adapting its latency when underruns are reported
|
|
by the radioInterface/USRP. Received bursts (from the radioInterface) pass
|
|
through a simple energy detector, a RACH or midamble correlator, and a DFE-based
|
|
demodulator.
|
|
|
|
NOTE: There's a `SWLOOPBACK` #define statement, where the USRP is replaced
|
|
with a memory buffer. In this mode, data written to the USRP is actually stored
|
|
in a buffer, and read commands to the USRP simply pull data from this buffer.
|
|
This was very useful in early testing, and still may be useful in testing basic
|
|
Transceiver and radioInterface functionality.
|
|
|
|
|
|
[[backend_ipc]]
|
|
=== `osmo-trx-ipc` Inter Process Communication backend
|
|
|
|
This OsmoTRX model provides its own Inter Process Communication (IPC) interface
|
|
to drive the radio device driver (from now on the Driver), allowing for third
|
|
party processes to implement the lowest layer device-specific bits without being
|
|
affected by copyleft licenses of OsmoTRX.
|
|
|
|
For more information on such interface, see section <<ipc_if>>.
|
|
|
|
[[fig-backend-ipc]]
|
|
.Architecture with _osmo-trx-ipc_ and its IPC _Driver_
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
rankdir=LR;
|
|
MS0 [label="MS"];
|
|
MS1 [label="MS"];
|
|
OsmoTRX [label="osmo-trx-ipc", color=red];
|
|
BTS;
|
|
|
|
subgraph cluster_ipc_driver {
|
|
label = "IPC Driver";
|
|
color=red;
|
|
RE [label = "Radio Equipment"];
|
|
REC [label="Radio Equipment Controller"];
|
|
RE->REC;
|
|
}
|
|
|
|
REC->OsmoTRX [label="IPC Interface", color=red];
|
|
|
|
MS0->RE [label="Um"];
|
|
MS1->RE [label="Um"];
|
|
OsmoTRX->BTS [label="bursts over UDP"];
|
|
|
|
}
|
|
----
|
|
|
|
A sample config file for this OsmoTRX model can be found in _osmo-trx.git_ https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg[doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg]
|
|
|
|
In the config file, the following VTY command can be used to set up the IPC UD Master Socket _osmo-trx-ipc_ will connect to at startup:
|
|
|
|
.Example: _osmo-trx-ipc_ will connect to UD Master Socket /tmp/ipc_sock0 upon startup
|
|
----
|
|
dev-args ipc_msock=/tmp/ipc_sock0
|
|
----
|
|
|
|
==== ipc-device-test
|
|
|
|
When built with `--with-ipc --with-uhd` configure options, _osmo-trx.git_ will
|
|
build the test program called _ipc-driver-test_. This program implements the
|
|
_Driver_ side of the osmo-trx-ipc interface (see <<ipc_if>> for more
|
|
information) on one side, and also interacts internally with UHD (eg B210 as
|
|
when using osmo-trx-uhd).
|
|
|
|
You can use this small program as a reference to:
|
|
|
|
* Test and experiment with _osmo-trx-ipc_.
|
|
|
|
* Write your own IPC _Driver_ connecting to osmo-trx-ipc.
|
|
|
|
[[fig-backend-ipc-device-test]]
|
|
.Architecture with _osmo-trx-ipc_ and ipc-device-test as IPC _Driver_
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
rankdir=LR;
|
|
MS0 [label="MS"];
|
|
MS1 [label="MS"];
|
|
SDR;
|
|
ipc_device_test[label = "ipc-device-test", color=red];
|
|
OsmoTRX [label="osmo-trx-ipc", color=red];
|
|
BTS;
|
|
|
|
MS0->SDR [label="Um"];
|
|
MS1->SDR [label="Um"];
|
|
SDR->ipc_device_test [label="UHD"];
|
|
ipc_device_test->OsmoTRX [label="IPC Interface", color=red];
|
|
OsmoTRX->BTS [label="bursts over UDP"];
|
|
}
|
|
----
|
|
|
|
The code for this app is found here:
|
|
|
|
* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.h[Transceiver52M/device/ipc/ipc-driver-test.h]
|
|
|
|
* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.c[Transceiver52M/device/ipc/ipc-driver-test.c]
|
|
|
|
Those files use the server-side (_Driver_ side) code to operate the Posix Shared
|
|
Memory region implemented in files `shm.c`, `shm.h`, `ipc_shm.c` and `ipc_shm.h`
|
|
in the same directory.
|
|
|
|
Most of the code in that same directory is deliverately released under a BSD
|
|
license (unlike most of _osmo-trx.git_), allowing third parties to reuse/recycle
|
|
the code on their implemented _Driver_ program no matter it being proprietary or
|
|
under an open license. However, care must be taken with external dependencies,
|
|
as for instance shm.c uses the talloc memory allocator, which is GPL licensed
|
|
and hence cannot be used in a proprietary driver. |