diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
index e0a3b31381..f387cce170 100755
--- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
+++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
@@ -29,10 +29,7 @@
# *******************************************************************************/
-# \file test01.py
-# \brief test 01 for OAI
-# \author Navid Nikaein
-# \date 2013 - 2015
+# \author Rohit Gupta
# \version 0.1
# @ingroup _test
@@ -1529,9 +1526,8 @@ for testcase in testcaseList:
print "Now copying files to NFS Share"
oai_localhost = openair('localdomain','localhost')
oai_localhost.connect(user,pw)
- cmd = ' rm -fr ' + NFSTestsResultsDir + ' ; mkdir -p ' + NFSTestsResultsDir
+ cmd = ' mkdir -p ' + NFSTestsResultsDir
res = oai_localhost.send_recv(cmd)
- print "Deleting NFSTestResults Dir..." + res
print "Copying files from GilabCI Runner Machine : " + host + " .locallogdir = " + locallogdir + ", NFSTestsResultsDir = " + NFSTestsResultsDir
SSHSessionWrapper('localhost', user, None, pw , NFSTestsResultsDir , locallogdir, "put_all")
@@ -1568,12 +1564,15 @@ res=os.system(cmd)
print "Now copying files to NFS Share"
oai_localhost = openair('localdomain','localhost')
oai_localhost.connect(user,pw)
-cmd = ' rm -fr ' + NFSTestsResultsDir + ' ; mkdir -p ' + NFSTestsResultsDir
+cmd = 'mkdir -p ' + NFSTestsResultsDir
res = oai_localhost.send_recv(cmd)
-print "Deleting NFSTestResults Dir..." + res
print "Copying files from GilabCI Runner Machine : " + host + " .locallogdir = " + locallogdir + ", NFSTestsResultsDir = " + NFSTestsResultsDir
SSHSessionWrapper('localhost', user, None, pw , NFSTestsResultsDir , locallogdir, "put_all")
+
+cmd = "cat " + NFSTestsResultsDir + "/log/*/*.xml > " + NFSTestsResultsDir + "/log/results_autotests.xml"
+res = oai_localhost.send_recv(cmd)
+
oai_localhost.disconnect()
sys.exit()
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index fa2f085564..59ccf05346 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -6146,7 +6146,7 @@ c
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m
- throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+ throughput_test min=5.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec
False
USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.Band_7.UL.1TX.1RX
@@ -6199,7 +6199,7 @@ c
sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue
- $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 20Mbits/s -B 192.172.0.2
@@ -6221,7 +6221,7 @@ c
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m
- throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+ throughput_test min=10.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec
False
USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.Band_7.UL.1TX.1RX
@@ -6347,7 +6347,7 @@ c
sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue
- $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -s -i 1 -u -f m -B 192.172.0.2
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script_phone 1 YT9115PX1E -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
@@ -6368,7 +6368,7 @@ c
/opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
- $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m
False
@@ -6421,7 +6421,7 @@ c
sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue
- $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m -B 192.172.0.2
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script_phone 1 YT9115PX1E -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 20M -R
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
@@ -6442,7 +6442,7 @@ c
/opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
- $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 15Mbits/s
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m
False
diff --git a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py
index eba3156976..5d0bd220b8 100755
--- a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py
+++ b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py
@@ -43,7 +43,8 @@ def kill_processes(name):
cmd = 'sudo adb -s ' + device_id +' shell "ps |grep ' + name + '"'
status, out = commands.getstatusoutput(cmd)
if status != 0:
- print "Error execting command to kill process " + name
+ print "Error executing command to kill process " + name
+ print "Error =" + out
sys.exit(1)
print "Out = " + out
if out=='':
diff --git a/cmake_targets/autotests/tools/iperf3_script_phone b/cmake_targets/autotests/tools/iperf3_script_phone
index eff4105d03..c191f72ec3 100755
--- a/cmake_targets/autotests/tools/iperf3_script_phone
+++ b/cmake_targets/autotests/tools/iperf3_script_phone
@@ -32,7 +32,7 @@
#arg1 timeout to wait before running the script
#arg2 interface
-#arg3 iperf arguments
+#arg3 iperf3 arguments
args=($*)
timeout=${args[0]}
@@ -43,7 +43,7 @@ iperf3_args=(${args[@]:2})
echo "args = ${args[@]}"
echo "timeout = $timeout"
echo "device_id = $device_id"
-echo "iperf_args = ${iperf_args[@]}"
+echo "iperf3_args = ${iperf3_args[@]}"
sleep $timeout
@@ -58,6 +58,6 @@ while true ; do
fi
done
-echo "Starting iperf now..."
+echo "Starting iperf3 now..."
-sudo adb -s $device_id shell /data/local/tmp/iperf3 ${iperf_args[@]}
+sudo adb -s $device_id shell /data/local/tmp/iperf3 ${iperf3_args[@]}
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index 75da3fab6d..98615d6f6e 100755
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -50,6 +50,7 @@
* @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface
* @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface
* @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface
+ * @defgroup _LMSSDR_PHY_RF_INTERFACE_ PHY - LMSSDR RF Interface
* @}
*
* @ingroup _ref_implementation_
diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
index 3620b8bf27..7a8944b1b1 100644
--- a/openair1/SCHED/phy_mac_stub.c
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -51,7 +51,6 @@
void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB)
{
- int i;
//uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
@@ -583,7 +582,6 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB)
{
- int i;
//uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
index d9b7bfa905..6cc1d8c5d2 100644
--- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
+++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
@@ -37,6 +37,7 @@
#include
#include
#include "bladerf_lib.h"
+#include "math.h"
/** @addtogroup _BLADERF_PHY_RF_INTERFACE_
* @{
@@ -58,14 +59,16 @@ int num_devices=0;
/*! \brief BladeRF Init function (not used at the moment)
* \param device RF frontend parameters set by application
+ * \returns 0 on success
*/
int trx_brf_init(openair0_device *device) {
-
+ return 0;
}
/*! \brief get current timestamp
*\param device the hardware to use
*\param module the bladeRf module
+ *\returns timestamp of BladeRF
*/
openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module) {
@@ -83,28 +86,22 @@ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module mod
}
/*! \brief Start BladeRF
- *\param device the hardware to use
+ * \param device the hardware to use
+ * \returns 0 on success
*/
int trx_brf_start(openair0_device *device) {
return 0;
}
-/*! \brief Get BladeRF stats
- *\param device the hardware to use
- */
-static void trx_brf_stats(openair0_device *device){
-
-
-}
-
/*! \brief Called to send samples to the BladeRF RF target
- @param device pointer to the device structure specific to the RF hardware target
- @param timestamp The timestamp at whicch the first sample MUST be sent
- @param buff Buffer which holds the samples
- @param nsamps number of samples to be sent
- @param cc index of the component carrier
- @param flags Ignored for the moment
+ \param device pointer to the device structure specific to the RF hardware target
+ \param timestamp The timestamp at whicch the first sample MUST be sent
+ \param buff Buffer which holds the samples
+ \param nsamps number of samples to be sent
+ \param cc index of the component carrier
+ \param flags Ignored for the moment
+ \returns 0 on success
*/
static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc, int flags) {
@@ -156,6 +153,7 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp,
* \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
* \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
* \param cc Index of component carrier
+ * \returns number of samples read
*/
static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
@@ -176,9 +174,10 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
brf->num_rx_errors++;
} else if ( brf->meta_rx.status & BLADERF_META_STATUS_OVERRUN) {
brf->num_overflows++;
- printf("RX overrun (%d) is detected. t=%u. Got %u samples. nsymps %d\n",
+ printf("RX overrun (%d) is detected. t=" "%" PRIu64 "Got %u samples. nsymps %d\n",
brf->num_overflows,brf->meta_rx.timestamp, brf->meta_rx.actual_count, nsamps);
}
+
//printf("Current RX timestampe %u\n", brf->meta_rx.timestamp);
//printf("[BRF] (buff %p) ts=0x%"PRIu64" %s\n",samples, brf->meta_rx.timestamp,bladerf_strerror(status));
brf->rx_current_ts=brf->meta_rx.timestamp;
@@ -196,7 +195,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
/*! \brief Terminate operation of the BladeRF transceiver -- free all associated resources
* \param device the hardware to use
*/
-int trx_brf_end(openair0_device *device) {
+void trx_brf_end(openair0_device *device) {
int status;
brf_state_t *brf = (brf_state_t*)device->priv;
@@ -208,7 +207,6 @@ int trx_brf_end(openair0_device *device) {
fprintf(stderr, "Failed to disable TX module: %s\n", bladerf_strerror(status));
}
bladerf_close(brf->dev);
- return 0;
}
/*! \brief print the BladeRF statistics
@@ -231,10 +229,11 @@ int trx_brf_reset_stats(openair0_device* device) {
}
-/*! \brief Stop USRP
- * \param device the hardware to use
+/*! \brief Stop BladeRF
+ * \param card the hardware to use
+ * \returns 0 in success
*/
-int trx_brf_stop(openair0_device* device) {
+int trx_brf_stop(int card) {
return(0);
@@ -242,9 +241,11 @@ int trx_brf_stop(openair0_device* device) {
/*! \brief Set frequencies (TX/RX)
* \param device the hardware to use
+ * \param openair0_cfg1 openair0 Config structure (ignored. It is there to comply with RF common API)
+ * \param exmimo_dump_config (ignored)
* \returns 0 in success
*/
-int trx_brf_set_freq(openair0_device* device) {
+int trx_brf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg1,int exmimo_dump_config) {
int status;
brf_state_t *brf = (brf_state_t *)device->priv;
@@ -269,9 +270,10 @@ int trx_brf_set_freq(openair0_device* device) {
/*! \brief Set Gains (TX/RX)
* \param device the hardware to use
+ * \param openair0_cfg openair0 Config structure
* \returns 0 in success
*/
-int trx_brf_set_gains(openair0_device* device) {
+int trx_brf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
return(0);
@@ -283,12 +285,17 @@ int trx_brf_set_gains(openair0_device* device) {
int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447};
int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448};
+/*! \brief calibration table for BladeRF */
rx_gain_calib_table_t calib_table_fx4[] = {
{2300000000.0,53.5},
{1880000000.0,57.0},
{816000000.0,73.0},
{-1,0}};
+/*! \brief set RX gain offset from calibration table
+ * \param openair0_cfg RF frontend parameters set by application
+ * \param chain_index RF chain ID
+ */
void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
int i=0;
@@ -310,6 +317,9 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
}
+/*! \brief Calibrate LMSSDR RF
+ * \param device the hardware to use
+ */
void calibrate_rf(openair0_device *device) {
@@ -885,11 +895,10 @@ void calibrate_rf(openair0_device *device) {
/*! \brief Initialize Openair BLADERF target. It returns 0 if OK
* \param device the hardware to use
* \param openair0_cfg RF frontend parameters set by application
+ * \returns 0 on success
*/
int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
int status;
- int card=0;
-
brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t));
memset(brf, 0, sizeof(brf_state_t));
/* device specific */
@@ -1063,8 +1072,6 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
}else
printf("[BRF] RX module calibrated DC \n");
-
-
bladerf_log_set_verbosity(get_brf_log_level(openair0_cfg->log_level));
printf("BLADERF: Initializing openair0_device\n");
@@ -1091,16 +1098,18 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
/*! \brief bladeRF error report
* \param status
+ * \returns 0 on success
*/
int brf_error(int status) {
//exit(-1);
- //return 1; // or status error code
+ return status; // or status error code
}
/*! \brief Open BladeRF from serial port
* \param serial name of serial port on which to open BladeRF device
+ * \returns bladerf device structure
*/
struct bladerf * open_bladerf_from_serial(const char *serial) {
@@ -1131,6 +1140,7 @@ struct bladerf * open_bladerf_from_serial(const char *serial) {
/*! \brief Get BladeRF log level
* \param log_level log level
+ * \returns log level of BLADERF device
*/
int get_brf_log_level(int log_level){
diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h
index 3a05c80e5c..743baf1bc8 100644
--- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h
+++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h
@@ -106,6 +106,27 @@ typedef struct {
/*
* 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 *device);
+/*! \brief get current timestamp
+ *\param device the hardware to use
+ *\param module the bladeRf module
+ */
+openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module);
+
+/*! \brief Get BladeRF log level
+ * \param log_level log level
+ * \returns log level of BLADERF device
+ */
+int get_brf_log_level(int log_level);
+
+/*! \brief bladeRF error report
+ * \param status
+ * \returns 0 on success
+ */
int brf_error(int status);
+
/*@}*/
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
index 3ca15c6660..4be796e588 100644
--- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
@@ -49,6 +49,9 @@
#include
+/** @addtogroup _LMSSDR_PHY_RF_INTERFACE_
+ * @{
+ */
///define for parameter enumeration if prefix might be needed
#define LMS7param(id) id
@@ -69,6 +72,15 @@ extern "C"
int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format);
}
+/*! \brief Called to send samples to the LMSSDR RF target
+ \param device pointer to the device structure specific to the RF hardware target
+ \param timestamp The timestamp at whicch the first sample MUST be sent
+ \param buff Buffer which holds the samples
+ \param nsamps number of samples to be sent
+ \param antenna_id index of the antenna
+ \param flags Ignored for the moment
+ \returns 0 on success
+*/
int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) {
LMS_TRxWrite((int16_t*)buff[0], nsamps,0, timestamp);
@@ -76,7 +88,17 @@ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **
return nsamps;
}
-
+/*! \brief Receive samples from hardware.
+ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
+ * the first channel. *ptimestamp is the time at which the first sample
+ * was received.
+ * \param device the hardware to use
+ * \param[out] ptimestamp the time at which the first sample was received.
+ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
+ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
+ * \param antenna_id Index of antenna port
+ * \returns number of samples read
+*/
int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int antenna_id) {
uint64_t timestamp;
@@ -87,6 +109,11 @@ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void *
return ret;
}
+
+/*! \brief set RX gain offset from calibration table
+ * \param openair0_cfg RF frontend parameters set by application
+ * \param chain_index RF chain ID
+ */
void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
int i=0;
@@ -107,469 +134,12 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
}
}
-/*
-void calibrate_rf(openair0_device *device) {
- openair0_timestamp ptimestamp;
- int16_t *calib_buffp,*calib_tx_buffp;
- int16_t calib_buff[2*RXDCLENGTH];
- int16_t calib_tx_buff[2*RXDCLENGTH];
- int i,j;
- int8_t offI,offQ,offIold,offQold,offInew,offQnew,offphase,offphaseold,offphasenew,offgain,offgainold,offgainnew;
- int32_t meanI,meanQ,meanIold,meanQold;
- int cnt=0,loop;
- liblms7_status opStatus;
- int16_t dcoffi;
- int16_t dcoffq;
- int16_t dccorri;
- int16_t dccorrq;
- const int16_t firCoefs[] =
- {
- -2531,
- -517,
- 2708,
- 188,
- -3059,
- 216,
- 3569,
- -770,
- -4199,
- 1541,
- 4886,
- -2577,
- -5552,
- 3909,
- 6108,
- -5537,
- -6457,
- 7440,
- 6507,
- -9566,
- -6174,
- 11845,
- 5391,
- -14179,
- -4110,
- 16457,
- 2310,
- -18561,
- 0,
- 20369,
- -2780,
- -21752,
- 5963,
- 22610,
- -9456,
- -22859,
- 13127,
- 22444,
- -16854,
- -21319,
- 20489,
- 19492,
- -23883,
- -17002,
- 26881,
- 13902,
- -29372,
- -10313,
- 31226,
- 6345,
- -32380,
- -2141,
- 32767,
- -2141,
- -32380,
- 6345,
- 31226,
- -10313,
- -29372,
- 13902,
- 26881,
- -17002,
- -23883,
- 19492,
- 20489,
- -21319,
- -16854,
- 22444,
- 13127,
- -22859,
- -9456,
- 22610,
- 5963,
- -21752,
- -2780,
- 20369,
- 0,
- -18561,
- 2310,
- 16457,
- -4110,
- -14179,
- 5391,
- 11845,
- -6174,
- -9566,
- 6507,
- 7440,
- -6457,
- -5537,
- 6108,
- 3909,
- -5552,
- -2577,
- 4886,
- 1541,
- -4199,
- -770,
- 3569,
- 216,
- -3059,
- 188,
- 2708,
- -517,
- -2531
- };
-
- j=0;
- for (i=0;iBackupAllRegisters();
- uint8_t ch = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(MAC));
- //Stage 1
- uint8_t sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF));
- uint8_t sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF));
- {
- uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C };
- uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses
- uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD };
-
- lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3);
- }
-
- // opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72);
- // put TX on fs/4
- opStatus = lms7->CalibrateRxSetup(device->openair0_cfg[0].sample_rate/1e6);
- if (opStatus != LIBLMS7_SUCCESS) {
- printf("Cannot calibrate for %f MHz\n",device->openair0_cfg[0].sample_rate/1e6);
- exit(-1);
- }
- // fill TX buffer with fs/8 complex sinusoid
- offIold=offQold=64;
- lms7->SetRxDCOFF(offIold,offQold);
- LMS_RxStart();
- for (i=0;i (%d,%d)\n",offIold,offQold,meanIold,meanQold);
-
- offI=offQ=-64;
- lms7->SetRxDCOFF(offI,offQ);
-
- for (i=0;i (%d,%d)\n",offI,offQ,meanI,meanQ);
-
- while (cnt++ < 7) {
-
- offInew=(offIold+offI)>>1;
- offQnew=(offQold+offQ)>>1;
-
- if (meanI*meanI < meanIold*meanIold) {
- meanIold = meanI;
- offIold = offI;
- printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI);
- }
- if (meanQ*meanQ < meanQold*meanQold) {
- meanQold = meanQ;
- offQold = offQ;
- printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ);
- }
- offI = offInew;
- offQ = offQnew;
-
- lms7->SetRxDCOFF(offI,offQ);
-
- for (i=0;i (%d,%d)\n",offI,offQ,meanI,meanQ);
- }
-
- if (meanI*meanI < meanIold*meanIold) {
- meanIold = meanI;
- offIold = offI;
- printf("[LMS] *** RX DC: offI %d => %d\n",offIold,meanI);
- }
- if (meanQ*meanQ < meanQold*meanQold) {
- meanQold = meanQ;
- offQold = offQ;
- printf("[LMS] *** RX DC: offQ %d => %d\n",offQold,meanQ);
- }
-
- printf("[LMS] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold);
-
- lms7->SetRxDCOFF(offIold,offQold);
-
- dcoffi = offIold;
- dcoffq = offQold;
-
- lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch);
- lms7->Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1);
- lms7->Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0);
-
- // TX LO leakage
- offQold=offIold=127;
- lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQold);
-
- {
- uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C };
- uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses
- uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD };
-
- lms7->Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3);
- }
- sel_band1_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF));
- sel_band2_trf = (uint8_t)lms7->Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF));
- //B
- lms7->Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1
- if (sel_band1_trf == 1)
- {
- lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0
- lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0
- }
- if (sel_band2_trf == 1)
- {
- lms7->Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0
- lms7->Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0
- }
- // FixRXSaturation();
-
- lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0
- lms7->Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2);
- lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7);
- lms7->Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7);
-
- lms7->SetGFIRCoefficients(LMS7002M::Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t));
-
- for (i=0;i (%d,%d)\n",offIold,meanIold,meanQold);
-
- offI=-128;
- lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold);
-
- for (i=0;i (%d,%d)\n",offI,meanI,meanQ);
- cnt = 0;
- while (cnt++ < 8) {
-
- offInew=(offIold+offI)>>1;
- if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
- printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ);
- meanIold = meanI;
- meanQold = meanQ;
- offIold = offI;
- }
- offI = offInew;
- lms7->SPI_write(0x0204,(((int16_t)offI)<<7)|offQold);
-
- for (i=0;i (%d,%d)\n",offI,meanI,meanQ);
- }
-
-
- if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
- printf("[LMS] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ);
- meanIold = meanI;
- meanQold = meanQ;
- offIold = offI;
- }
- offQ=-128;
- lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ);
-
- for (i=0;i (%d,%d)\n",offQ,meanI,meanQ);
-
- cnt=0;
- while (cnt++ < 8) {
-
- offQnew=(offQold+offQ)>>1;
- if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
- printf("[LMS] TX DC (offQ): ([%d,%d]) => %d : %d\n",offQold,offQ,offQnew,meanI*meanI+meanQ*meanQ);
-
- meanIold = meanI;
- meanQold = meanQ;
- offQold = offQ;
- }
- offQ = offQnew;
- lms7->SPI_write(0x0204,(((int16_t)offIold)<<7)|offQ);
-
-
- for (i=0;i (%d,%d)\n",offQ,meanI,meanQ);
- }
-
- LMS_RxStop();
-
- printf("[LMS] TX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold);
-
- dccorri = offIold;
- dccorrq = offQold;
-
-
- lms7->RestoreAllRegisters();
- lms7->Modify_SPI_Reg_bits(LMS7param(MAC), ch);
-
- lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFI_RFE), dcoffi);
- lms7->Modify_SPI_Reg_bits(LMS7param(DCOFFQ_RFE), dcoffq);
- lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri);
- lms7->Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq);
- // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri);
- // lms7->Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq);
- // lms7->Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr);
-
- // lms7->Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP
- lms7->Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP
-
-}
-*/
+/*! \brief Set Gains (TX/RX) on LMSSDR
+ * \param device the hardware to use
+ * \param openair0_cfg openair0 Config structure
+ * \returns 0 in success
+ */
int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
@@ -589,6 +159,10 @@ int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg)
return(0);
}
+/*! \brief Start LMSSDR
+ * \param device the hardware to use
+ * \returns 0 on success
+ */
int trx_lms_start(openair0_device *device){
@@ -746,7 +320,10 @@ int trx_lms_start(openair0_device *device){
return 0;
}
-
+/*! \brief Stop LMSSDR
+ * \param card Index of the RF card to use
+ * \returns 0 on success
+ */
int trx_lms_stop(int card) {
/*
LMS_DeviceClose(usbport);
@@ -756,6 +333,12 @@ int trx_lms_stop(int card) {
*/
}
+/*! \brief Set frequencies (TX/RX)
+ * \param device the hardware to use
+ * \param openair0_cfg openair0 Config structure (ignored. It is there to comply with RF common API)
+ * \param exmimo_dump_config (ignored)
+ * \returns 0 in success
+ */
int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) {
//Control port must be connected
@@ -768,6 +351,7 @@ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,in
}
// 31 = 19 dB => 105 dB total gain @ 2.6 GHz
+/*! \brief calibration table for LMSSDR */
rx_gain_calib_table_t calib_table_sodera[] = {
{3500000000.0,70.0},
{2660000000.0,80.0},
@@ -780,33 +364,30 @@ rx_gain_calib_table_t calib_table_sodera[] = {
-
-
+/*! \brief Get LMSSDR Statistics
+ * \param device the hardware to use
+ * \returns 0 in success
+ */
int trx_lms_get_stats(openair0_device* device) {
return(0);
}
+/*! \brief Reset LMSSDR Statistics
+ * \param device the hardware to use
+ * \returns 0 in success
+ */
int trx_lms_reset_stats(openair0_device* device) {
return(0);
}
-int openair0_set_gains(openair0_device* device,
- openair0_config_t *openair0_cfg) {
-
- return(0);
-}
-
-int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) {
-
- return(0);
-}
-
-
+/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources
+ * \param device the hardware to use
+ */
void trx_lms_end(openair0_device *device) {
@@ -877,3 +458,4 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){
return 0;
}
}
+/*@}*/
diff --git a/targets/DOCS/Doxyfile b/targets/DOCS/Doxyfile
index ac6ee99480..a060f6597a 100644
--- a/targets/DOCS/Doxyfile
+++ b/targets/DOCS/Doxyfile
@@ -796,7 +796,8 @@ INPUT = $(OPENAIR1_DIR)/PHY/defs.h \
$(OPENAIR_TARGETS)/ARCH/COMMON/common_lib.h \
$(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp \
$(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c \
- $(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h
+ $(OPENAIR_TARGETS)/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h \
+ $(OPENAIR_TARGETS)/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses