Merge remote-tracking branch 'origin/bladerf_testing' into integration_2026_w07 (!3894)
Reimplement BladeRF radio driver, make it work for 5G This MR reimplements the BladeRF radio driver such that it is usable for 5G. On the way, we remove unused code, refactor it for readability, and update configuration. Tested: - 40MHz carrier as gNB - 20MHz carries as gNB An initial focus was 2x2, but I did not manage to do this yet. Documentation on the format is here [1] and there is a helper [2]. I will do this later. [1] https://www.nuand.com/bladeRF-doc/libbladeRF/v2.6.0/group___s_t_r_e_a_m_i_n_g___f_o_r_m_a_t.html#gga4c61587834fd4de51a8e2d34e14a73b2a92cfbda7a5577c809e2ff6123f8f30b6 [2] https://www.nuand.com/bladeRF-doc/libbladeRF/v2.6.0/group___s_t_r_e_a_m_i_n_g___f_o_r_m_a_t.html#gac754a927c12cd8aa3fc270e9dd9c108e
This commit is contained in:
@@ -1,138 +0,0 @@
|
||||
BladeRF documentation
|
||||
=====================
|
||||
|
||||
As of 2018-11-06, the bladeRF support is not fully automatic and requires
|
||||
some manual settings before use. This documentation is the ultimate source
|
||||
of information. If something described in this file does not work or does
|
||||
not correspond to the reality, then contact us so we can fix the problems
|
||||
and update this documentation.
|
||||
|
||||
1. Install bladeRF 2.0 libraries.
|
||||
|
||||
As of now, it's better to install from source.
|
||||
So, do not run: ./build_oai -I -w BLADERF
|
||||
(That is: do not include '-w BLADERF'.)
|
||||
|
||||
Instead, follow the instructions at: https://github.com/Nuand/bladeRF
|
||||
|
||||
If you already had some bladeRF software installed using automatic
|
||||
methods, first remove it by hand ('apt-get purge bladeRF' or something
|
||||
similar, you can get the list of installed bladeRF packages by running
|
||||
'dpkg -l|grep -i blade', remove them all).
|
||||
|
||||
2. Update the device.
|
||||
|
||||
Download the latest FX3 firmware and FPGA images from Nuand's website.
|
||||
As of writing, this is:
|
||||
|
||||
https://github.com/Nuand/bladeRF/wiki
|
||||
|
||||
That points to the following pages.
|
||||
For FX3:
|
||||
|
||||
http://www.nuand.com/fx3_images/
|
||||
|
||||
For FPGA:
|
||||
|
||||
http://www.nuand.com/fpga_images/
|
||||
|
||||
Install FX3 firmware:
|
||||
|
||||
sudo bladeRF-cli -f bladeRF_fw_latest.img
|
||||
|
||||
Install FPGA image (this is for BladeRF x40):
|
||||
|
||||
sudo bladeRF-cli -L hostedx40-latest.rbf
|
||||
|
||||
Retrieve calibration information:
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
info
|
||||
|
||||
That outputs the serial number of your device.
|
||||
|
||||
Go to:
|
||||
|
||||
https://www.nuand.com/calibration
|
||||
|
||||
And enter your serial number.
|
||||
The website tells you to run something like:
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
flash_init_cal 40 0x9271
|
||||
|
||||
Actual values depend on your device and serial number.
|
||||
|
||||
3. Calibrate the bladeRF device.
|
||||
|
||||
We will work with band 7 on 2.68GHz with a bandwidth of 5 MHz (25 RBs).
|
||||
|
||||
Plug the bladeRF device, then run:
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
set frequency tx 2680000000
|
||||
set frequency rx 2560000000
|
||||
set gain rx 60
|
||||
set gain tx 60
|
||||
set bandwidth 5000000
|
||||
set samplerate 7680000
|
||||
cal lms
|
||||
cal lms
|
||||
cal lms
|
||||
cal dc rxtx
|
||||
cal dc rxtx
|
||||
cal dc rxtx
|
||||
|
||||
4. Tune the RX gain using the enb tracer.
|
||||
|
||||
Run the softmodem and the 'enb' tracer. For instructions, see:
|
||||
|
||||
https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/T/basic
|
||||
|
||||
In the enb window, check the 'input signal'. You should see some blue
|
||||
signal as seen at:
|
||||
|
||||
https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/T/enb
|
||||
|
||||
(the 'Time signal power' plot).
|
||||
|
||||
The level should be around 30.
|
||||
|
||||
If it's not around 30 then edit your configuration file and modify
|
||||
the value 'max_rxgain' in the section 'RUs'.
|
||||
|
||||
The configuration file to use is:
|
||||
|
||||
configuration/bladeRF/enb-band7-5mhz.conf
|
||||
|
||||
In the configuration file, you also need to set the correct values for:
|
||||
|
||||
- tracking_area_code
|
||||
- plmn_list: mcc, mnc, mnc_length
|
||||
- mme_ip_address: this is the IP address used by the computer running
|
||||
the softmodem to connect to the EPC
|
||||
- NETWORK_INTERFACES: all the ENB*ADDRESS* variables have to point
|
||||
to the IP address of the EPC machine
|
||||
|
||||
5. You're good to go.
|
||||
|
||||
You can now connect a UE and pass some traffic. If everything is well
|
||||
configured you can expect more than 16 Mb/s of throughput in the downlink
|
||||
using iperf and more than 8 Mb/s in the uplink. Looking at the logs, you
|
||||
should find lines containing 'PHR 40' and 'CQI 15'. If your values are
|
||||
lower then your setup may need some adjustments.
|
||||
|
||||
6. In case of problems.
|
||||
|
||||
If the performance of the softmodem is very bad, you can stop it and
|
||||
run the calibration again, without setting the parameters (frequencies,
|
||||
gains, etc.). Just run:
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
cal lms
|
||||
cal dc rxtx
|
||||
|
||||
That may help.
|
||||
|
||||
Be sure to use proper radio equipment (duplexer, antennas, clean
|
||||
environment without interferences).
|
||||
@@ -0,0 +1,148 @@
|
||||
# BladeRF 2.0 Micro Documentation
|
||||
|
||||
[TOC]
|
||||
|
||||
## Install BladeRF 2.0 Micro Libraries
|
||||
|
||||
You can install the BladeRF library by using `build_oai -I -w BLADERF`, which
|
||||
will install it from the package manager if the distribution supports it, or
|
||||
falls back to a build from source otherwise.
|
||||
|
||||
If you intentionally want to install BladeRF from source, you can follow
|
||||
[Nuand's Getting Started
|
||||
guide](https://github.com/Nuand/bladeRF/wiki/Getting-Started%3A-Linux#building-bladerf-libraries-and-tools-from-source)
|
||||
to do so.
|
||||
|
||||
## Configure the device
|
||||
|
||||
### Image Flash
|
||||
|
||||
Download the latest FX3 firmware and FPGA images from Nuand's website. There
|
||||
are [fx3 images](http://www.nuand.com/fx3_images/) and [FPGA
|
||||
images](http://www.nuand.com/fpga_images/). Download and save the corresponding
|
||||
files to your computer, then install the FX3 firmware
|
||||
|
||||
sudo bladeRF-cli -f bladeRF_fw_latest.img
|
||||
|
||||
and install the FPGA image (this is x40):
|
||||
|
||||
sudo bladeRF-cli -L hostedx40-latest.rbf
|
||||
|
||||
### Use of the configuration file
|
||||
|
||||
This configuration will help the bladeRF board to load the bitstream images
|
||||
automatically, and can be used to set some options automatically that are not
|
||||
configured by OAI.
|
||||
|
||||
Create the bladeRF config file:
|
||||
|
||||
```bash
|
||||
$ cat ~/.config/Nuand/bladeRF/bladerf.conf
|
||||
# Load the hostedx40.rbf FPGA image, set the trim DAC, and
|
||||
# configure the frequency
|
||||
fpga ~/.config/Nuand/bladeRF/image.rbf
|
||||
# trimdac 592
|
||||
# frequency 2.4G
|
||||
```
|
||||
|
||||
More information is available at [Nuand's
|
||||
website](https://nuand.com/libbladeRF-doc/v2.5.0/configfile.html).
|
||||
|
||||
### Useful commands for `bladerf-cli`
|
||||
|
||||
`bladeRF-cli` can be used to query various device details.
|
||||
|
||||
Show the version of bladeRF and device details
|
||||
|
||||
bladeRF-cli --exec version
|
||||
bladeRF-cli --exec info
|
||||
|
||||
Probe for a specific device
|
||||
|
||||
bladeRF-cli --probe
|
||||
|
||||
Print some information on device capabilities and current configuration
|
||||
(bandwidth, frequency, clocking and sample rate, various features)
|
||||
|
||||
bladeRF-cli --exec print
|
||||
|
||||
### Calibration
|
||||
|
||||
Retrieve calibration serial number:
|
||||
|
||||
bladerf-cli --exec info
|
||||
|
||||
Go to the [Nuand calibration page](https://www.nuand.com/calibration) and enter
|
||||
your serial number. The website tells you to run something like:
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
flash_init_cal 40 0x9271
|
||||
|
||||
Actual values depend on your device and serial number.
|
||||
|
||||
You can also rerun a calibration like so
|
||||
|
||||
sudo bladeRF-cli -i
|
||||
cal lms
|
||||
cal dc rxtx
|
||||
|
||||
## OAI
|
||||
|
||||
### Build BladeRF driver
|
||||
|
||||
You can use `build_oai` to build with BladeRF support, e.g.,
|
||||
|
||||
cd openairinterface5g/cmake_targets/
|
||||
./build_oai --ninja --nrUE --gNB -w BLADERF
|
||||
|
||||
or you can use cmake directly
|
||||
|
||||
cd openairinterface5g/
|
||||
cmake -B build -G Ninja -DOAI_BLADERF=ON
|
||||
cmake --build build -t oai_bladerfdevif # to build only the driver
|
||||
cmake --build build # to build it all
|
||||
|
||||
For more information about the build, please refer to [the build
|
||||
documentation](../../doc/BUILD.md).
|
||||
|
||||
### Adapt the OAI-gNB configuration file to your system
|
||||
|
||||
You can start from a [sample BladeRF configuration
|
||||
fiel](../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.51PRB.bladerf20xa0.conf).
|
||||
|
||||
The only BladeRF-specific configuration resides in `RUs.[0].sdr_addrs`. This
|
||||
string is passed to
|
||||
[`bladerf_open()`](https://www.nuand.com/libbladeRF-doc/v2.6.0/group___f_n___i_n_i_t.html#gab341ac98615f393da9158ea59cdb6a24)
|
||||
and can be used to select a specific BladeRF device. For instance, to open a
|
||||
specific device with serial 730f5a36545849d9aa71ca6cf50e8ca0 on USB, you would
|
||||
add `libusb: serial=730f5a36545849d9aa71ca6cf50e8ca0`.
|
||||
|
||||
The TX gain is automatically chosen to be the maximum, and can be reduced with
|
||||
`att_tx`. The RX gain is taken from `RUs.[0].max_rxgain`, and can be attenuated
|
||||
with `att_rx`.
|
||||
|
||||
The rest of the paramaters (PLMN, frequencies, IP addresses) is the same as in
|
||||
any other configuration. Refer to the [general
|
||||
tutorials](../..//doc/NR_SA_Tutorial_OAI_CN5G.md) for more information.
|
||||
|
||||
### Run the setup
|
||||
|
||||
Assuming you built from source above:
|
||||
|
||||
cd ~/openairinterface5g/build/
|
||||
sudo ./nr-softmodem -O ../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.51PRB.bladerf20xa0.conf -E
|
||||
|
||||
### In case of problems
|
||||
|
||||
Refer back to the calibration section above. If not done yet, consider
|
||||
calibrating your device.
|
||||
|
||||
You can get more logs from BladeRF. To do so, you have to edit the code and
|
||||
modify this line inside [`bladerf_lib.c`](./bladerf_lib.c).
|
||||
|
||||
```patch
|
||||
- bladerf_log_set_verbosity(BLADERF_LOG_LEVEL_INFO);
|
||||
+ bladerf_log_set_verbosity(BLADERF_LOG_LEVEL_VERBOSE);
|
||||
```
|
||||
|
||||
in function `device_init()`.
|
||||
+352
-1034
File diff suppressed because it is too large
Load Diff
@@ -1,122 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/** bladerf_lib.h
|
||||
*
|
||||
* Author: navid nikaein
|
||||
*/
|
||||
|
||||
#ifndef BLADERF_LIB_H
|
||||
#define BLADERF_LIB_H
|
||||
|
||||
#include <libbladeRF.h>
|
||||
|
||||
#include "common_lib.h"
|
||||
|
||||
/** @addtogroup _BLADERF_PHY_RF_INTERFACE_
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief BladeRF specific data structure */
|
||||
typedef struct {
|
||||
|
||||
//! opaque BladeRF device struct. An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend)
|
||||
struct bladerf *dev;
|
||||
|
||||
//! Number of buffers
|
||||
unsigned int num_buffers;
|
||||
//! Buffer size
|
||||
unsigned int buffer_size;
|
||||
//! Number of transfers
|
||||
unsigned int num_transfers;
|
||||
//! RX timeout
|
||||
unsigned int rx_timeout_ms;
|
||||
//! TX timeout
|
||||
unsigned int tx_timeout_ms;
|
||||
//! Metadata for RX
|
||||
struct bladerf_metadata meta_rx;
|
||||
//!Metadata for TX
|
||||
struct bladerf_metadata meta_tx;
|
||||
//! Sample rate
|
||||
unsigned int sample_rate;
|
||||
//! time offset between transmiter timestamp and receiver timestamp;
|
||||
double tdiff;
|
||||
//! TX number of forward samples use brf_time_offset to get this value
|
||||
int tx_forward_nsamps; //166 for 20Mhz
|
||||
|
||||
|
||||
// --------------------------------
|
||||
// Debug and output control
|
||||
// --------------------------------
|
||||
//! Number of underflows
|
||||
int num_underflows;
|
||||
//! Number of overflows
|
||||
int num_overflows;
|
||||
//! number of sequential errors
|
||||
int num_seq_errors;
|
||||
//! number of RX errors
|
||||
int num_rx_errors;
|
||||
//! Number of TX errors
|
||||
int num_tx_errors;
|
||||
|
||||
//! timestamp of current TX
|
||||
uint64_t tx_current_ts;
|
||||
//! timestamp of current RX
|
||||
uint64_t rx_current_ts;
|
||||
//! number of actual samples transmitted
|
||||
uint64_t tx_actual_nsamps;
|
||||
//! number of actual samples received
|
||||
uint64_t rx_actual_nsamps;
|
||||
//! number of TX samples
|
||||
uint64_t tx_nsamps;
|
||||
//! number of RX samples
|
||||
uint64_t rx_nsamps;
|
||||
//! number of TX count
|
||||
uint64_t tx_count;
|
||||
//! number of RX count
|
||||
uint64_t rx_count;
|
||||
//! timestamp of RX packet
|
||||
openair0_timestamp_t rx_timestamp;
|
||||
|
||||
} brf_state_t;
|
||||
/*
|
||||
* func prototypes
|
||||
*/
|
||||
/*! \brief BladeRF Init function (not used at the moment)
|
||||
* \param device RF frontend parameters set by application
|
||||
*/
|
||||
int trx_brf_init(openair0_device_t *device);
|
||||
|
||||
/*! \brief get current timestamp
|
||||
*\param device the hardware to use
|
||||
*\param module the bladeRf module
|
||||
*/
|
||||
openair0_timestamp_t trx_get_timestamp(openair0_device_t *device, bladerf_module module);
|
||||
|
||||
/*! \brief bladeRF error report
|
||||
* \param status
|
||||
* \returns 0 on success
|
||||
*/
|
||||
int brf_error(int status);
|
||||
|
||||
/*@}*/
|
||||
|
||||
#endif /* BLADERF_LIB_H */
|
||||
Reference in New Issue
Block a user