Pau Espin Pedrol | 46560ea | 2018-09-20 15:03:19 +0200 | [diff] [blame] | 1 | [[trx_backends]] |
| 2 | == OsmoTRX backend support |
| 3 | |
Pau Espin Pedrol | 6b50b62 | 2018-09-19 17:05:30 +0200 | [diff] [blame] | 4 | [[backend_uhd]] |
Pau Espin Pedrol | 46560ea | 2018-09-20 15:03:19 +0200 | [diff] [blame] | 5 | === `osmo-trx-uhd` for UHD based Transceivers |
Pau Espin Pedrol | d06172c | 2018-07-05 18:26:52 +0200 | [diff] [blame] | 6 | |
| 7 | This OsmoTRX model uses _libuhd_ (UHD, USRP Hardware Driver) to drive the |
| 8 | device, that is configuring it and reading/writing samples from/to it. |
| 9 | |
| 10 | So far, this backend has been mostly used to drive devices such as the Ettus |
| 11 | B200 family and Fairwaves UmTRX family, and used to be the default backend used |
| 12 | for legacy @osmo-trx@ binary when per-backend binaries didn't exist yet. |
| 13 | |
| 14 | Any device providing generic support for UHD should theoretically be able to be |
| 15 | run through this backend without much effort, but pracitcal experience showed |
| 16 | that some devices don't play well with it, such as the LimeSDR family of |
| 17 | devices, which showed far better results when using its native interface. |
| 18 | |
| 19 | Related code can be found in the _Transceiver52M/device/uhd/_ directory in |
| 20 | _osmo-trx.git_. |
| 21 | |
Pau Espin Pedrol | 6b50b62 | 2018-09-19 17:05:30 +0200 | [diff] [blame] | 22 | [[backend_lms]] |
Pau Espin Pedrol | 46560ea | 2018-09-20 15:03:19 +0200 | [diff] [blame] | 23 | === `osmo-trx-lms` for LimeSuite based Transceivers |
Pau Espin Pedrol | d06172c | 2018-07-05 18:26:52 +0200 | [diff] [blame] | 24 | |
| 25 | This OsmoTRX model uses LimeSuite API and library to drive the device, that is |
| 26 | configuring it and reading/writing samples from/to it. |
| 27 | |
| 28 | This backend was developed in order to be used together with LimeSDR-USB and |
| 29 | LimeSDR-mini devices, due to to the poor results obtained with the UHD backend, |
| 30 | and to simplify the stack. |
| 31 | |
| 32 | Related code can be found in the _Transceiver52M/device/lms/_ directory in |
| 33 | _osmo-trx.git_. |
| 34 | |
Pau Espin Pedrol | 6b50b62 | 2018-09-19 17:05:30 +0200 | [diff] [blame] | 35 | [[backend_usrp1]] |
Pau Espin Pedrol | 46560ea | 2018-09-20 15:03:19 +0200 | [diff] [blame] | 36 | === `osmo-trx-usrp1` for libusrp based Transceivers |
Pau Espin Pedrol | d06172c | 2018-07-05 18:26:52 +0200 | [diff] [blame] | 37 | |
| 38 | This OsmoTRX model uses the legacy libusrp driver provided in GNU Radio 3.4.2. |
| 39 | |
| 40 | As this code was dropped from GNU Radio at some point and was found very |
| 41 | difficult to build, some work was done to create a standalone libusrp which can |
| 42 | be nowadays found as a separate git repository together with other osmocom git |
| 43 | repositories, in https://git.osmocom.org/libusrp/ |
| 44 | |
| 45 | Related code can be found in the _Transceiver52M/device/usrp1/_ directory in |
| 46 | _osmo-trx.git_. |
Pau Espin Pedrol | 06d3ba0 | 2019-07-30 17:56:03 +0200 | [diff] [blame^] | 47 | |
| 48 | The USRPDevice module is basically a driver that reads/writes packets to a USRP |
| 49 | with two RFX900 daughterboards, board A is the Tx chain and board B is the Rx |
| 50 | chain. |
| 51 | |
| 52 | The `radioInterface` module is basically an interface between the transceiver |
| 53 | and the USRP. It operates the basestation clock based upon the sample count of |
| 54 | received USRP samples. Packets from the USRP are queued and segmented into GSM |
| 55 | bursts that are passed up to the transceiver; bursts from the transceiver are |
| 56 | passed down to the USRP. |
| 57 | |
| 58 | The transceiver basically operates "layer 0" of the GSM stack, performing the |
| 59 | modulation, detection, and demodulation of GSM bursts. It communicates with the |
| 60 | GSM stack via three UDP sockets, one socket for data, one for control messages, |
| 61 | and one socket to pass clocking information. The transceiver contains a priority |
| 62 | queue to sort to-be-transmitted bursts, and a filler table to fill in timeslots |
| 63 | that do not have bursts in the priority queue. The transceiver tries to stay |
| 64 | ahead of the basestation clock, adapting its latency when underruns are reported |
| 65 | by the radioInterface/USRP. Received bursts (from the radioInterface) pass |
| 66 | through a simple energy detector, a RACH or midamble correlator, and a DFE-based |
| 67 | demodulator. |
| 68 | |
| 69 | NOTE: There's a `SWLOOPBACK` #define statement, where the USRP is replaced |
| 70 | with a memory buffer. In this mode, data written to the USRP is actually stored |
| 71 | in a buffer, and read commands to the USRP simply pull data from this buffer. |
| 72 | This was very useful in early testing, and still may be useful in testing basic |
| 73 | Transceiver and radioInterface functionality. |