git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5493 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -1,14 +1,21 @@
|
|||||||
/** usrp_lib.h
|
/** common_lib.h
|
||||||
*
|
*
|
||||||
* Author: HongliangXU : hong-liang-xu@agilent.com
|
* Author: HongliangXU : hong-liang-xu@agilent.com
|
||||||
*/
|
*/
|
||||||
#ifndef USRP_LIB_H
|
#ifndef COMMON_LIB_H
|
||||||
#define USRP_LIB_H
|
#define COMMON_LIB_H
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef int64_t openair0_timestamp;
|
typedef int64_t openair0_timestamp;
|
||||||
typedef struct openair0_device_t openair0_device;
|
typedef struct openair0_device_t openair0_device;
|
||||||
/* structrue holds the parameters to configure USRP devices
|
/* structrue holds the parameters to configure USRP devices
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
max_gain=0,med_gain,byp_gain
|
||||||
|
} rx_gain_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* the sample rate for both transmit and receive. */
|
/* the sample rate for both transmit and receive. */
|
||||||
double sample_rate;
|
double sample_rate;
|
||||||
@@ -17,13 +24,15 @@ typedef struct {
|
|||||||
/* number of TX channels (=TX antennas) */
|
/* number of TX channels (=TX antennas) */
|
||||||
int tx_num_channels;
|
int tx_num_channels;
|
||||||
/* center frequency in Hz for RX */
|
/* center frequency in Hz for RX */
|
||||||
double rx_freq;
|
double rx_freq[4];
|
||||||
/* center frequency in Hz for TX */
|
/* center frequency in Hz for TX */
|
||||||
double tx_freq;
|
double tx_freq[4];
|
||||||
|
/* mode for rxgain (ExpressMIMO2)*/
|
||||||
|
rx_gain_t rxg_mode[4];
|
||||||
/* gain for RX in dB */
|
/* gain for RX in dB */
|
||||||
double rx_gain;
|
double rx_gain[4];
|
||||||
/* gain for TX in dB */
|
/* gain for TX in dB */
|
||||||
double tx_gain;
|
double tx_gain[4];
|
||||||
/* RX bandwidth in Hz */
|
/* RX bandwidth in Hz */
|
||||||
double rx_bw;
|
double rx_bw;
|
||||||
/* TX bandwidth in Hz */
|
/* TX bandwidth in Hz */
|
||||||
@@ -65,6 +74,8 @@ extern "C"
|
|||||||
/* return 0 if OK, < 0 if error */
|
/* return 0 if OK, < 0 if error */
|
||||||
int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
|
int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // USRP_LIB_H
|
#endif // COMMON_LIB_H
|
||||||
@@ -16,7 +16,8 @@
|
|||||||
|
|
||||||
#include "openair0_lib.h"
|
#include "openair0_lib.h"
|
||||||
#include "openair_device.h"
|
#include "openair_device.h"
|
||||||
|
#include "common_lib.h"
|
||||||
|
#define max(a,b) ((a)>(b) ? (a) : (b))
|
||||||
exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card
|
exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card
|
||||||
|
|
||||||
char *bigshm_top[MAX_CARDS] = INIT_ZEROS;
|
char *bigshm_top[MAX_CARDS] = INIT_ZEROS;
|
||||||
@@ -42,6 +43,7 @@ int openair0_open(void)
|
|||||||
|
|
||||||
int card;
|
int card;
|
||||||
int ant;
|
int ant;
|
||||||
|
int openair0_num_antennas[4];
|
||||||
|
|
||||||
PAGE_SHIFT = log2_int( sysconf( _SC_PAGESIZE ) );
|
PAGE_SHIFT = log2_int( sysconf( _SC_PAGESIZE ) );
|
||||||
|
|
||||||
@@ -187,3 +189,93 @@ int openair0_stop_without_reset(int card)
|
|||||||
{
|
{
|
||||||
return ioctl(openair0_fd, openair_STOP_WITHOUT_RESET, card);
|
return ioctl(openair0_fd, openair_STOP_WITHOUT_RESET, card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static exmimo_config_t *p_exmimo_config;
|
||||||
|
static exmimo_id_t *p_exmimo_id;
|
||||||
|
#define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX)
|
||||||
|
#define RF_MODE_BASE (TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM)
|
||||||
|
|
||||||
|
int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
|
|
||||||
|
// Initialize card
|
||||||
|
int ret;
|
||||||
|
int ant;
|
||||||
|
|
||||||
|
ret = openair0_open();
|
||||||
|
if ( ret != 0 ) {
|
||||||
|
if (ret == -1)
|
||||||
|
printf("Error opening /dev/openair0");
|
||||||
|
if (ret == -2)
|
||||||
|
printf("Error mapping bigshm");
|
||||||
|
if (ret == -3)
|
||||||
|
printf("Error mapping RX or TX buffer");
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[0]);
|
||||||
|
|
||||||
|
p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
|
||||||
|
p_exmimo_id = openair0_exmimo_pci[0].exmimo_id_ptr;
|
||||||
|
|
||||||
|
printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", 0, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
|
||||||
|
|
||||||
|
// check if the software matches firmware
|
||||||
|
if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) {
|
||||||
|
printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_exmimo_id->board_swrev>=9)
|
||||||
|
p_exmimo_config->framing.eNB_flag = 0;
|
||||||
|
else
|
||||||
|
p_exmimo_config->framing.eNB_flag = 1;//!UE_flag;
|
||||||
|
|
||||||
|
p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
|
||||||
|
#if (BOARD_SWREV_CNTL2>=0x0A)
|
||||||
|
for (ant=0; ant<4; ant++)
|
||||||
|
p_exmimo_config->framing.resampling_factor[ant] = 2;
|
||||||
|
#else
|
||||||
|
p_exmimo_config->framing.resampling_factor = 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (ant=0;ant<max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant++)
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
|
||||||
|
for (ant=0;ant<openair0_cfg->tx_num_channels;ant++)
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
|
||||||
|
for (ant=0;ant<openair0_cfg->rx_num_channels;ant++) {
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
|
||||||
|
switch (openair0_cfg->rxg_mode[ant]) {
|
||||||
|
default:
|
||||||
|
case max_gain:
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMax;
|
||||||
|
break;
|
||||||
|
case med_gain:
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMed;
|
||||||
|
break;
|
||||||
|
case byp_gain:
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAByp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (ant=max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant<4;ant++) {
|
||||||
|
p_exmimo_config->rf.rf_mode[ant] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ant = 0; ant<openair0_cfg->rx_num_channels; ant++) {
|
||||||
|
p_exmimo_config->rf.do_autocal[ant] = 1;
|
||||||
|
p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg->rx_freq[ant];
|
||||||
|
p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->rx_gain;
|
||||||
|
}
|
||||||
|
for (ant = 0; ant<openair0_cfg->tx_num_channels; ant++) {
|
||||||
|
p_exmimo_config->rf.do_autocal[ant] = 1;
|
||||||
|
p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg->tx_freq[ant];
|
||||||
|
p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->tx_gain;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int *openair0_daq_cnt() {
|
||||||
|
|
||||||
|
return((unsigned int *)openair0_exmimo_pci[0].rxcnt_ptr[0]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "pcie_interface.h"
|
#include "pcie_interface.h"
|
||||||
#include "openair_device.h"
|
#include "openair_device.h"
|
||||||
|
#include "common_lib.h"
|
||||||
|
|
||||||
// Use this to access shared memory (configuration structures, adc/dac data buffers, ...)
|
// Use this to access shared memory (configuration structures, adc/dac data buffers, ...)
|
||||||
// contains userspace pointers
|
// contains userspace pointers
|
||||||
@@ -53,5 +54,7 @@ int openair0_stop(int card);
|
|||||||
// return 0 on success
|
// return 0 on success
|
||||||
int openair0_stop_without_reset(int card);
|
int openair0_stop_without_reset(int card);
|
||||||
|
|
||||||
|
// return the DAQ block counter
|
||||||
|
unsigned int *openair0_daq_cnt();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
USRP_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.o
|
USRP_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.o
|
||||||
USRP_FILE_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
|
USRP_FILE_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
|
||||||
USRP_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/
|
USRP_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/COMMON
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#include <complex>
|
#include <complex>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "usrp_lib.h"
|
#include "common_lib.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|||||||
+20
-23
@@ -18,12 +18,13 @@ ifeq "$(GCCVERSION)" "4.6.1"
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -O2
|
CFLAGS += -O2
|
||||||
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
|
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/COMMON -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
|
||||||
ifdef DEBUG
|
ifdef DEBUG
|
||||||
CFLAGS += -g -ggdb
|
CFLAGS += -g -ggdb
|
||||||
endif
|
endif
|
||||||
SRC = synctest.c condtest.c #lte-softmodem.c
|
SRC = synctest.c condtest.c #lte-softmodem.c
|
||||||
|
|
||||||
|
|
||||||
ifndef RTAI
|
ifndef RTAI
|
||||||
RTAI=1
|
RTAI=1
|
||||||
endif
|
endif
|
||||||
@@ -55,24 +56,14 @@ endif
|
|||||||
ifeq ($(RTAI),1)
|
ifeq ($(RTAI),1)
|
||||||
CFLAGS += -DENABLE_RTAI_CLOCK
|
CFLAGS += -DENABLE_RTAI_CLOCK
|
||||||
CFLAGS += -DCONFIG_RTAI_LXRT_INLINE #remend the RTAI warning
|
CFLAGS += -DCONFIG_RTAI_LXRT_INLINE #remend the RTAI warning
|
||||||
RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o
|
RTAI_OBJ = sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o
|
||||||
ifeq ($(USRP),1)
|
|
||||||
RTAI_OBJ += lte-softmodem-usrp.o
|
|
||||||
endif
|
|
||||||
else #RTAI
|
else #RTAI
|
||||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||||
OBJ += sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o
|
OBJ += sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o
|
||||||
ifeq ($(USRP),1)
|
|
||||||
OBJ += lte-softmodem-usrp.o
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o #$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o
|
OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o #$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o
|
||||||
|
|
||||||
ifeq ($(USRP),1)
|
|
||||||
include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
|
|
||||||
endif
|
|
||||||
|
|
||||||
OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o
|
OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o
|
||||||
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
|
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
|
||||||
|
|
||||||
@@ -94,6 +85,14 @@ include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
|
|||||||
include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc
|
include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc
|
||||||
include $(OPENAIR3_DIR)/RAL-LTE/Makefile.inc
|
include $(OPENAIR3_DIR)/RAL-LTE/Makefile.inc
|
||||||
|
|
||||||
|
ifeq ($(USRP),1)
|
||||||
|
|
||||||
|
include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
|
||||||
|
CFLAGS += -I/opt/uhd/include -L/opt/uhd/lib -luhd -lpthread -lstdc++
|
||||||
|
CFLAGS += -DUSRP
|
||||||
|
LDFLAGS += -L/opt/uhd/lib -luhd -lpthread -lstdc++
|
||||||
|
endif
|
||||||
|
|
||||||
OBJ += $(ENB_APP_OBJS)
|
OBJ += $(ENB_APP_OBJS)
|
||||||
|
|
||||||
ifeq ($(RTAI),1)
|
ifeq ($(RTAI),1)
|
||||||
@@ -119,6 +118,8 @@ endif
|
|||||||
|
|
||||||
RTAI_OBJ += $(UTILS_OBJS)
|
RTAI_OBJ += $(UTILS_OBJS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ifdef ENABLE_ITTI
|
ifdef ENABLE_ITTI
|
||||||
CFLAGS += -DEXMIMO_IOT
|
CFLAGS += -DEXMIMO_IOT
|
||||||
endif
|
endif
|
||||||
@@ -205,8 +206,12 @@ $(LFDS_LIB):
|
|||||||
@if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi;
|
@if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi;
|
||||||
$(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR)
|
$(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR)
|
||||||
|
|
||||||
|
$(USRP_OBJ):$(USRP_FILE_OBJ)
|
||||||
|
@echo Compiling $<
|
||||||
|
@$(CXX) -c $(USRP_CFLAGS) $(USRP_FILE_OBJ) -o $(USRP_OBJ)
|
||||||
|
|
||||||
ifeq ($(RTAI),1)
|
ifeq ($(RTAI),1)
|
||||||
$(RTAI_OBJ) lte-enb.o lte-softmodem.o: %.o : %.c
|
$(RTAI_OBJ) lte-softmodem.o: %.o : %.c
|
||||||
else
|
else
|
||||||
$(RTAI_OBJ): %.o : %.c
|
$(RTAI_OBJ): %.o : %.c
|
||||||
endif
|
endif
|
||||||
@@ -256,18 +261,10 @@ synctest: $(OBJ_SYNC) $(SHARED_DEPENDENCIES) synctest.c
|
|||||||
sleeptest: rt_wrapper.o sleeptest.c
|
sleeptest: rt_wrapper.o sleeptest.c
|
||||||
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS)
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS)
|
||||||
|
|
||||||
lte-softmodem: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
|
lte-softmodem: $(OBJ) $(USRP_OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
|
||||||
@echo Linking $@
|
@echo Linking $@
|
||||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS)
|
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
lte-enb: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-enb.o $(SHARED_DEPENDENCIES)
|
|
||||||
@echo Linking $@
|
|
||||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-enb.o -o lte-enb $(LDFLAGS) $(LIBS)
|
|
||||||
|
|
||||||
lte-softmodem-usrp: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(USRP_OBJ) $(SHARED_DEPENDENCIES)
|
|
||||||
@echo Linking $@
|
|
||||||
@$(CC) $(USRP_OBJ) $(CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-softmodem-usrp $(LDFLAGS) $(LIBS)
|
|
||||||
|
|
||||||
emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c
|
emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c
|
||||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS)
|
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS)
|
||||||
|
|
||||||
|
|||||||
+189
-389
@@ -121,9 +121,6 @@ unsigned short config_frames[4] = {2,9,11,13};
|
|||||||
|
|
||||||
#define DEBUG_THREADS 1
|
#define DEBUG_THREADS 1
|
||||||
|
|
||||||
#define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX)
|
|
||||||
#define RF_MODE_BASE (TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM)
|
|
||||||
|
|
||||||
struct timing_info_t {
|
struct timing_info_t {
|
||||||
//unsigned int frame, hw_slot, last_slot, next_slot;
|
//unsigned int frame, hw_slot, last_slot, next_slot;
|
||||||
RTIME time_min, time_max, time_avg, time_last, time_now;
|
RTIME time_min, time_max, time_avg, time_last, time_now;
|
||||||
@@ -138,12 +135,11 @@ int init_dlsch_threads(void);
|
|||||||
void cleanup_dlsch_threads(void);
|
void cleanup_dlsch_threads(void);
|
||||||
int32_t init_rx_pdsch_thread(void);
|
int32_t init_rx_pdsch_thread(void);
|
||||||
void cleanup_rx_pdsch_thread(void);
|
void cleanup_rx_pdsch_thread(void);
|
||||||
int init_ulsch_threads(void);
|
|
||||||
void cleanup_ulsch_threads(void);
|
|
||||||
|
|
||||||
void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
|
void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
|
||||||
void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
|
void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
|
||||||
void test_config(int card, int ant, unsigned int rf_mode, int UE_flag);
|
|
||||||
|
|
||||||
#ifdef XFORMS
|
#ifdef XFORMS
|
||||||
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
|
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
|
||||||
@@ -181,6 +177,9 @@ static pthread_t thread2; //xforms
|
|||||||
static pthread_t thread3; //emos
|
static pthread_t thread3; //emos
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
openair0_device openair0;
|
||||||
|
openair0_timestamp timestamp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
static int instance_cnt=-1; //0 means worker is busy, -1 means its free
|
static int instance_cnt=-1; //0 means worker is busy, -1 means its free
|
||||||
int instance_cnt_ptr_kern,*instance_cnt_ptr_user;
|
int instance_cnt_ptr_kern,*instance_cnt_ptr_user;
|
||||||
@@ -190,9 +189,7 @@ static pthread_t thread3; //emos
|
|||||||
//extern unsigned int mem_base;
|
//extern unsigned int mem_base;
|
||||||
|
|
||||||
int card = 0;
|
int card = 0;
|
||||||
static exmimo_config_t *p_exmimo_config;
|
|
||||||
static exmimo_id_t *p_exmimo_id;
|
|
||||||
static volatile unsigned int *DAQ_MBOX;
|
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
static volatile int start_eNB = 0;
|
static volatile int start_eNB = 0;
|
||||||
@@ -204,7 +201,7 @@ volatile int oai_exit = 0;
|
|||||||
//static int time_offset[4] = {-145,-145,-145,-145};
|
//static int time_offset[4] = {-145,-145,-145,-145};
|
||||||
static int time_offset[4] = {0,0,0,0};
|
static int time_offset[4] = {0,0,0,0};
|
||||||
|
|
||||||
static int fs4_test=0;
|
|
||||||
static char UE_flag=0;
|
static char UE_flag=0;
|
||||||
static uint8_t eNB_id=0,UE_id=0;
|
static uint8_t eNB_id=0,UE_id=0;
|
||||||
|
|
||||||
@@ -213,36 +210,55 @@ static uint32_t downlink_frequency[4] = {1907600000,1907600000,1907
|
|||||||
static int32_t uplink_frequency_offset[4]= {-120000000,-120000000,-120000000,-120000000};
|
static int32_t uplink_frequency_offset[4]= {-120000000,-120000000,-120000000,-120000000};
|
||||||
static char *conf_config_file_name = NULL;
|
static char *conf_config_file_name = NULL;
|
||||||
|
|
||||||
|
#ifdef ITTI_ENABLED
|
||||||
static char *itti_dump_file = NULL;
|
static char *itti_dump_file = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
static char rxg_fname[100];
|
double tx_gain = 50;
|
||||||
static char txg_fname[100];
|
double rx_gain = 30;
|
||||||
static char rflo_fname[100];
|
double bw = 14e6;
|
||||||
static char rfdc_fname[100];
|
|
||||||
static FILE *rxg_fd=NULL;
|
#ifndef USRP
|
||||||
static FILE *txg_fd=NULL;
|
|
||||||
static FILE *rflo_fd=NULL;
|
|
||||||
static FILE *rfdc_fd=NULL;
|
|
||||||
static unsigned int rxg_max[4] = {133,133,133,133};
|
static unsigned int rxg_max[4] = {133,133,133,133};
|
||||||
static unsigned int rxg_med[4] = {127,127,127,127};
|
static unsigned int rxg_med[4] = {127,127,127,127};
|
||||||
static unsigned int rxg_byp[4] = {120,120,120,120};
|
static unsigned int rxg_byp[4] = {120,120,120,120};
|
||||||
static int tx_max_power = 0;
|
static int tx_max_power = 0;
|
||||||
|
|
||||||
|
double sample_rate=30.72e6;
|
||||||
|
#else
|
||||||
|
double tx_gain = 50;
|
||||||
|
double rx_gain = 30;
|
||||||
|
double bw = 14e6;
|
||||||
|
char ref[128] = "internal";
|
||||||
|
char channels[128] = "0";
|
||||||
|
|
||||||
|
int samples_per_frame = 307200;
|
||||||
|
int samples_per_packets = 2048; // samples got every recv or send
|
||||||
|
int tx_forward_nsamps;
|
||||||
|
|
||||||
|
int sf_bounds_5[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75};
|
||||||
|
int sf_bounds_10[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75};
|
||||||
|
int sf_bounds_20[10] = {15, 30, 45, 60, 75, 90, 105, 120, 135, 150};
|
||||||
|
int *sf_bounds;
|
||||||
|
int max_cnt;
|
||||||
|
int tx_delay;
|
||||||
|
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
uint32_t rf_mode_max[4] = {55759,55759,55759,55759};
|
uint32_t rf_mode_max[4] = {55759,55759,55759,55759};
|
||||||
uint32_t rf_mode_med[4] = {39375,39375,39375,39375};
|
uint32_t rf_mode_med[4] = {39375,39375,39375,39375};
|
||||||
uint32_t rf_mode_byp[4] = {22991,22991,22991,22991};
|
uint32_t rf_mode_byp[4] = {22991,22991,22991,22991};
|
||||||
*/
|
*/
|
||||||
static uint32_t rf_mode[4] = {MY_RF_MODE,0,0,0};
|
//static uint32_t rf_mode[4] = {MY_RF_MODE,0,0,0};
|
||||||
static uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto
|
//static uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto
|
||||||
//{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
|
//{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
|
||||||
//{8255067,8254810,8257340,8257340}; // eNB PETRONAS
|
//{8255067,8254810,8257340,8257340}; // eNB PETRONAS
|
||||||
|
|
||||||
static uint32_t rf_vcocal[4] = {910,910,910,910};
|
//static uint32_t rf_vcocal[4] = {910,910,910,910};
|
||||||
static uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015};
|
//static uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015};
|
||||||
static uint32_t rf_rxdc[4] = {32896,32896,32896,32896};
|
//static uint32_t rf_rxdc[4] = {32896,32896,32896,32896};
|
||||||
static uint32_t rxgain[4] = {20,20,20,20};
|
//static uint32_t rxgain[4] = {20,20,20,20};
|
||||||
static uint32_t txgain[4] = {20,20,20,20};
|
//static uint32_t txgain[4] = {20,20,20,20};
|
||||||
|
|
||||||
static runmode_t mode;
|
static runmode_t mode;
|
||||||
static int rx_input_level_dBm;
|
static int rx_input_level_dBm;
|
||||||
@@ -253,7 +269,7 @@ static char do_forms=0;
|
|||||||
#else
|
#else
|
||||||
int otg_enabled;
|
int otg_enabled;
|
||||||
#endif
|
#endif
|
||||||
int number_of_cards = 1;
|
//int number_of_cards = 1;
|
||||||
|
|
||||||
static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
|
static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
|
||||||
//static int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
|
//static int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
|
||||||
@@ -261,6 +277,7 @@ static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,7
|
|||||||
static LTE_DL_FRAME_PARMS *frame_parms;
|
static LTE_DL_FRAME_PARMS *frame_parms;
|
||||||
|
|
||||||
int multi_thread=0;
|
int multi_thread=0;
|
||||||
|
int N_RB_DL=25;
|
||||||
|
|
||||||
unsigned int build_rflocal(int txi, int txq, int rxi, int rxq)
|
unsigned int build_rflocal(int txi, int txq, int rxi, int rxq)
|
||||||
{
|
{
|
||||||
@@ -1004,20 +1021,23 @@ void kill_eNB_proc() {
|
|||||||
/* This is the main eNB thread. */
|
/* This is the main eNB thread. */
|
||||||
int eNB_thread_status;
|
int eNB_thread_status;
|
||||||
|
|
||||||
|
#ifndef USRP
|
||||||
static void *eNB_thread(void *arg)
|
static void *eNB_thread(void *arg)
|
||||||
{
|
{
|
||||||
#ifdef RTAI
|
#ifdef RTAI
|
||||||
RT_TASK *task;
|
RT_TASK *task;
|
||||||
#endif
|
#endif
|
||||||
unsigned char slot=0,last_slot, next_slot;
|
unsigned char slot=0;//,last_slot, next_slot;
|
||||||
int hw_slot,frame=0;
|
int hw_slot,frame=0;
|
||||||
int diff;
|
int diff;
|
||||||
int delay_cnt;
|
int delay_cnt;
|
||||||
RTIME time_in, time_diff;
|
RTIME time_in, time_diff;
|
||||||
int mbox_target=0,mbox_current=0;
|
int mbox_target=0,mbox_current=0;
|
||||||
int i,ret;
|
int i;//
|
||||||
int tx_offset;
|
int ret;
|
||||||
|
// int tx_offset;
|
||||||
int sf;
|
int sf;
|
||||||
|
volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
/* Wait for eNB application initialization to be complete (eNB registration to MME) */
|
/* Wait for eNB application initialization to be complete (eNB registration to MME) */
|
||||||
@@ -1079,7 +1099,7 @@ static void *eNB_thread(void *arg)
|
|||||||
if (diff>8)
|
if (diff>8)
|
||||||
LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, mbox_target, diff);
|
LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, mbox_target, diff);
|
||||||
|
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
|
||||||
|
|
||||||
delay_cnt = 0;
|
delay_cnt = 0;
|
||||||
@@ -1090,7 +1110,7 @@ static void *eNB_thread(void *arg)
|
|||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
|
||||||
ret = rt_sleep_ns(diff*DAQ_PERIOD);
|
ret = rt_sleep_ns(diff*DAQ_PERIOD);
|
||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
if (ret)
|
if (ret)
|
||||||
LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
|
LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
|
||||||
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
|
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
|
||||||
@@ -1111,19 +1131,8 @@ static void *eNB_thread(void *arg)
|
|||||||
|
|
||||||
if (oai_exit) break;
|
if (oai_exit) break;
|
||||||
|
|
||||||
last_slot = (slot)%LTE_SLOTS_PER_FRAME;
|
|
||||||
if (last_slot <0)
|
|
||||||
last_slot+=20;
|
|
||||||
next_slot = (slot+2)%LTE_SLOTS_PER_FRAME;
|
|
||||||
|
|
||||||
//PHY_vars_eNB_g[0]->frame = frame;
|
|
||||||
if (frame>5) {
|
if (frame>5) {
|
||||||
/*
|
|
||||||
if (frame%100==0)
|
|
||||||
LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n",frame, PHY_vars_eNB_g[0]->frame, slot, hw_slot,next_slot,DAQ_MBOX[0]);
|
|
||||||
*/
|
|
||||||
|
|
||||||
//if (PHY_vars_eNB_g[0]->frame>5) {
|
|
||||||
timing_info.time_last = timing_info.time_now;
|
timing_info.time_last = timing_info.time_now;
|
||||||
timing_info.time_now = rt_get_time_ns();
|
timing_info.time_now = rt_get_time_ns();
|
||||||
|
|
||||||
@@ -1230,6 +1239,9 @@ static void *eNB_thread(void *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
|
/* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
|
||||||
static void *UE_thread(void *arg) {
|
static void *UE_thread(void *arg) {
|
||||||
#ifdef RTAI
|
#ifdef RTAI
|
||||||
@@ -1244,6 +1256,11 @@ static void *UE_thread(void *arg) {
|
|||||||
int hw_slot_offset=0,rx_offset_mbox=0,mbox_target=0,mbox_current=0;
|
int hw_slot_offset=0,rx_offset_mbox=0,mbox_target=0,mbox_current=0;
|
||||||
int diff2;
|
int diff2;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
|
||||||
|
#ifndef USRP
|
||||||
|
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
|
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
|
||||||
/* Wait for NAS UE to start cell selection */
|
/* Wait for NAS UE to start cell selection */
|
||||||
@@ -1272,8 +1289,7 @@ static void *UE_thread(void *arg) {
|
|||||||
openair0_dump_config(card);
|
openair0_dump_config(card);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
while (!oai_exit)
|
while (!oai_exit) {
|
||||||
{
|
|
||||||
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
|
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
|
||||||
|
|
||||||
if (is_synchronized) {
|
if (is_synchronized) {
|
||||||
@@ -1312,27 +1328,25 @@ static void *UE_thread(void *arg) {
|
|||||||
LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, rx_offset_mbox %d, mbox_target %d, mbox_current %d, diff %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,rx_offset_mbox,mbox_target,mbox_current,diff2);
|
LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, rx_offset_mbox %d, mbox_target %d, mbox_current %d, diff %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,rx_offset_mbox,mbox_target,mbox_current,diff2);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
|
||||||
|
|
||||||
delay_cnt = 0;
|
delay_cnt = 0;
|
||||||
while ((diff2>0) && (!oai_exit) && (is_synchronized) )
|
while ((diff2>0) && (!oai_exit) && (is_synchronized) ) {
|
||||||
{
|
|
||||||
time_in = rt_get_time_ns();
|
time_in = rt_get_time_ns();
|
||||||
//LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
|
//LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
|
||||||
ret = rt_sleep_ns(diff2*DAQ_PERIOD);
|
ret = rt_sleep_ns(diff2*DAQ_PERIOD);
|
||||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
|
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
if (ret)
|
if (ret)
|
||||||
LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
|
LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
|
||||||
|
|
||||||
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
|
hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
|
||||||
//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
|
//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
|
||||||
delay_cnt++;
|
delay_cnt++;
|
||||||
if (delay_cnt == 30)
|
if (delay_cnt == 30) {
|
||||||
{
|
|
||||||
LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
|
LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
|
||||||
exit_fun("[HW][UE] HW stopped");
|
exit_fun("[HW][UE] HW stopped");
|
||||||
}
|
}
|
||||||
@@ -1344,7 +1358,7 @@ static void *UE_thread(void *arg) {
|
|||||||
else
|
else
|
||||||
diff2 = mbox_target - mbox_current;
|
diff2 = mbox_target - mbox_current;
|
||||||
|
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
|
||||||
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
|
vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1355,30 +1369,11 @@ static void *UE_thread(void *arg) {
|
|||||||
last_slot+=LTE_SLOTS_PER_FRAME;
|
last_slot+=LTE_SLOTS_PER_FRAME;
|
||||||
next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
|
next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
|
||||||
|
|
||||||
if (is_synchronized)
|
if (is_synchronized) {
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (frame%100==0)
|
|
||||||
LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, last_slot %d (before): DAQ_MBOX %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,last_slot,DAQ_MBOX[0]);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// in = rt_get_time_ns();
|
|
||||||
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0], 0, 0,mode,0,NULL);
|
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0], 0, 0,mode,0,NULL);
|
||||||
// out = rt_get_time_ns();
|
|
||||||
// diff = out-in;
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (frame % 100 == 0)
|
|
||||||
LOG_D(HW,"hw_slot %d (after): DAQ_MBOX %d\n",hw_slot,DAQ_MBOX[0]);
|
|
||||||
|
|
||||||
LOG_D(HW,"Frame %d: last_slot %d, phy_procedures_lte_ue time_in %llu, time_out %llu, diff %llu\n",
|
|
||||||
frame, last_slot,in,out,diff);
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else // we are not yet synchronized
|
else { // we are not yet synchronized
|
||||||
{
|
|
||||||
hw_slot_offset = 0;
|
hw_slot_offset = 0;
|
||||||
|
|
||||||
slot = 0;
|
slot = 0;
|
||||||
@@ -1428,12 +1423,14 @@ static void *UE_thread(void *arg) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
|
LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
|
||||||
|
#ifndef USRP
|
||||||
for (i=0; i<4; i++) {
|
for (i=0; i<4; i++) {
|
||||||
if (p_exmimo_config->rf.rf_freq_rx[i])
|
if (p_exmimo_config->rf.rf_freq_rx[i])
|
||||||
p_exmimo_config->rf.rf_freq_rx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
|
p_exmimo_config->rf.rf_freq_rx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
|
||||||
if (p_exmimo_config->rf.rf_freq_tx[i])
|
if (p_exmimo_config->rf.rf_freq_tx[i])
|
||||||
p_exmimo_config->rf.rf_freq_tx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
|
p_exmimo_config->rf.rf_freq_tx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
openair0_dump_config(card);
|
openair0_dump_config(card);
|
||||||
rt_sleep_ns(FRAME_PERIOD);
|
rt_sleep_ns(FRAME_PERIOD);
|
||||||
}
|
}
|
||||||
@@ -1467,8 +1464,12 @@ static void *UE_thread(void *arg) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_options (int argc, char **argv)
|
#else // This is for USRP or ETHERNET targets
|
||||||
{
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void get_options (int argc, char **argv) {
|
||||||
int c;
|
int c;
|
||||||
char line[1000];
|
char line[1000];
|
||||||
int l;
|
int l;
|
||||||
@@ -1496,10 +1497,8 @@ static void *UE_thread(void *arg) {
|
|||||||
{"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT},
|
{"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT},
|
||||||
{NULL, 0, NULL, 0}};
|
{NULL, 0, NULL, 0}};
|
||||||
|
|
||||||
while ((c = getopt_long (argc, argv, "C:dF:K:qO:ST:UVRM",long_options,NULL)) != -1)
|
while ((c = getopt_long (argc, argv, "C:dK:qO:SUVRMr:",long_options,NULL)) != -1) {
|
||||||
{
|
switch (c) {
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
|
case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
|
||||||
ULSCH_max_consecutive_errors = atoi(optarg);
|
ULSCH_max_consecutive_errors = atoi(optarg);
|
||||||
printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
|
printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
|
||||||
@@ -1551,65 +1550,6 @@ static void *UE_thread(void *arg) {
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'F':
|
|
||||||
sprintf(rxg_fname,"%srxg.lime",optarg);
|
|
||||||
rxg_fd = fopen(rxg_fname,"r");
|
|
||||||
if (rxg_fd) {
|
|
||||||
printf("Loading RX Gain parameters from %s\n",rxg_fname);
|
|
||||||
l=0;
|
|
||||||
while (fgets(line, sizeof(line), rxg_fd)) {
|
|
||||||
if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines
|
|
||||||
else {
|
|
||||||
if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]);
|
|
||||||
if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]);
|
|
||||||
if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]);
|
|
||||||
l++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s not found, running with defaults\n",rxg_fname);
|
|
||||||
|
|
||||||
sprintf(txg_fname,"%stxg.lime",optarg);
|
|
||||||
txg_fd = fopen(txg_fname,"r");
|
|
||||||
if (txg_fd) {
|
|
||||||
printf("Loading TX Gain parameters from %s\n",txg_fname);
|
|
||||||
l=0;
|
|
||||||
while (fgets(line, sizeof(line), txg_fd)) {
|
|
||||||
if ((strlen(line)==0) || (*line == '#')) {
|
|
||||||
continue; //ignore empty or comment lines
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (l==0) sscanf(line,"%d %d %d %d",&txgain[0],&txgain[1],&txgain[2],&txgain[3]);
|
|
||||||
if (l==1) sscanf(line,"%d",&tx_max_power);
|
|
||||||
l++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s not found, running with defaults\n",txg_fname);
|
|
||||||
|
|
||||||
sprintf(rflo_fname,"%srflo.lime",optarg);
|
|
||||||
rflo_fd = fopen(rflo_fname,"r");
|
|
||||||
if (rflo_fd) {
|
|
||||||
printf("Loading RF LO parameters from %s\n",rflo_fname);
|
|
||||||
if (fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]) < 4)
|
|
||||||
LOG_E(EMU, "Error parsing \"%s\"", rflo_fname);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s not found, running with defaults\n",rflo_fname);
|
|
||||||
|
|
||||||
sprintf(rfdc_fname,"%srfdc.lime",optarg);
|
|
||||||
rfdc_fd = fopen(rfdc_fname,"r");
|
|
||||||
if (rfdc_fd) {
|
|
||||||
printf("Loading RF DC parameters from %s\n",rfdc_fname);
|
|
||||||
if (fscanf(rfdc_fd,"%d %d %d %d",&rf_rxdc[0],&rf_rxdc[1],&rf_rxdc[2],&rf_rxdc[3]) < 4)
|
|
||||||
LOG_E(EMU, "Error parsing \"%s\"", rfdc_fname);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s not found, running with defaults\n",rfdc_fname);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'K':
|
case 'K':
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
itti_dump_file = strdup(optarg);
|
itti_dump_file = strdup(optarg);
|
||||||
@@ -1622,16 +1562,6 @@ static void *UE_thread(void *arg) {
|
|||||||
conf_config_file_name = optarg;
|
conf_config_file_name = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'S':
|
|
||||||
fs4_test=1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'T':
|
|
||||||
#ifdef ENABLE_TCXO
|
|
||||||
tcxo=atoi(optarg);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
case 'U':
|
||||||
UE_flag = 1;
|
UE_flag = 1;
|
||||||
break;
|
break;
|
||||||
@@ -1645,6 +1575,24 @@ static void *UE_thread(void *arg) {
|
|||||||
case 'R' :
|
case 'R' :
|
||||||
online_log_messages =1;
|
online_log_messages =1;
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
switch(atoi(optarg)) {
|
||||||
|
case 6:
|
||||||
|
N_RB_DL=6;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
N_RB_DL=25;
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
N_RB_DL=50;
|
||||||
|
break;
|
||||||
|
case 100:
|
||||||
|
N_RB_DL=100;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Unknown N_RB_DL %d, switching to 25\n",atoi(optarg));
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1707,12 +1655,14 @@ static void *UE_thread(void *arg) {
|
|||||||
#if defined (EMOS) || (! defined (RTAI))
|
#if defined (EMOS) || (! defined (RTAI))
|
||||||
int error_code;
|
int error_code;
|
||||||
#endif
|
#endif
|
||||||
|
openair0_config_t openair0_cfg;
|
||||||
|
|
||||||
|
|
||||||
mode = normal_txrx;
|
mode = normal_txrx;
|
||||||
|
|
||||||
frame_parms = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
|
frame_parms = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
|
||||||
/* Set some default values that may be overwritten while reading options */
|
/* Set some default values that may be overwritten while reading options */
|
||||||
frame_parms->frame_type = 1; /* TDD */
|
frame_parms->frame_type = TDD; /* TDD */
|
||||||
frame_parms->tdd_config = 3;
|
frame_parms->tdd_config = 3;
|
||||||
frame_parms->tdd_config_S = 0;
|
frame_parms->tdd_config_S = 0;
|
||||||
|
|
||||||
@@ -1814,10 +1764,10 @@ static void *UE_thread(void *arg) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// init the parameters
|
// init the parameters
|
||||||
frame_parms->N_RB_DL = 25;
|
frame_parms->N_RB_DL = N_RB_DL;
|
||||||
frame_parms->N_RB_UL = 25;
|
frame_parms->N_RB_UL = N_RB_DL;
|
||||||
frame_parms->Ncp = 0;
|
frame_parms->Ncp = NORMAL;
|
||||||
frame_parms->Ncp_UL = 0;
|
frame_parms->Ncp_UL = NORMAL;
|
||||||
frame_parms->Nid_cell = Nid_cell;
|
frame_parms->Nid_cell = Nid_cell;
|
||||||
frame_parms->nushift = 0;
|
frame_parms->nushift = 0;
|
||||||
if (UE_flag==0)
|
if (UE_flag==0)
|
||||||
@@ -1868,8 +1818,7 @@ static void *UE_thread(void *arg) {
|
|||||||
// prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
|
// prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
|
||||||
// N_ZC = (prach_fmt <4)?839:139;
|
// N_ZC = (prach_fmt <4)?839:139;
|
||||||
|
|
||||||
if (UE_flag==1)
|
if (UE_flag==1) {
|
||||||
{
|
|
||||||
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE*));
|
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE*));
|
||||||
PHY_vars_UE_g[0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode);
|
PHY_vars_UE_g[0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode);
|
||||||
|
|
||||||
@@ -1902,39 +1851,26 @@ static void *UE_thread(void *arg) {
|
|||||||
openair_daq_vars.auto_freq_correction = 0;
|
openair_daq_vars.auto_freq_correction = 0;
|
||||||
openair_daq_vars.use_ia_receiver = 0;
|
openair_daq_vars.use_ia_receiver = 0;
|
||||||
|
|
||||||
// if AGC is off, the following values will be used
|
|
||||||
for (i=0;i<4;i++)
|
|
||||||
rxgain[i] = 0;
|
|
||||||
|
|
||||||
for (i=0;i<4;i++) {
|
for (i=0;i<4;i++) {
|
||||||
PHY_vars_UE_g[0]->rx_gain_max[i] = rxg_max[i];
|
PHY_vars_UE_g[0]->rx_gain_max[i] = rxg_max[i];
|
||||||
PHY_vars_UE_g[0]->rx_gain_med[i] = rxg_med[i];
|
// PHY_vars_UE_g[0]->rx_gain_med[i] = rxg_med[i];
|
||||||
PHY_vars_UE_g[0]->rx_gain_byp[i] = rxg_byp[i];
|
// PHY_vars_UE_g[0]->rx_gain_byp[i] = rxg_byp[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) {
|
if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) {
|
||||||
for (i=0; i<4; i++) {
|
for (i=0;i<4;i++)
|
||||||
PHY_vars_UE_g[0]->rx_gain_mode[i] = max_gain;
|
openair0_cfg.rxg_mode[i] = max_gain;
|
||||||
// frame_parms->rfmode[i] = rf_mode_max[i];
|
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_max[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain
|
||||||
rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMax;
|
|
||||||
}
|
|
||||||
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_max[0] + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain
|
|
||||||
}
|
}
|
||||||
else if ((mode == rx_calib_ue_med)) {
|
else if ((mode == rx_calib_ue_med)) {
|
||||||
for (i=0; i<4; i++) {
|
for (i=0;i<4;i++)
|
||||||
PHY_vars_UE_g[0]->rx_gain_mode[i] = med_gain;
|
openair0_cfg.rxg_mode[i] = med_gain;
|
||||||
// frame_parms->rfmode[i] = rf_mode_med[i];
|
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_med[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
|
||||||
rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMed;
|
|
||||||
}
|
|
||||||
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_med[0] + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain;
|
|
||||||
}
|
}
|
||||||
else if ((mode == rx_calib_ue_byp)) {
|
else if ((mode == rx_calib_ue_byp)) {
|
||||||
for (i=0; i<4; i++) {
|
for (i=0;i<4;i++)
|
||||||
PHY_vars_UE_g[0]->rx_gain_mode[i] = byp_gain;
|
openair0_cfg.rxg_mode[i] = byp_gain;
|
||||||
// frame_parms->rfmode[i] = rf_mode_byp[i];
|
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_byp[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
|
||||||
rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAByp;
|
|
||||||
}
|
|
||||||
PHY_vars_UE_g[0]->rx_total_gain_dB = PHY_vars_UE_g[0]->rx_gain_byp[0] + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PHY_vars_UE_g[0]->tx_power_max_dBm = tx_max_power;
|
PHY_vars_UE_g[0]->tx_power_max_dBm = tx_max_power;
|
||||||
@@ -1970,134 +1906,77 @@ static void *UE_thread(void *arg) {
|
|||||||
openair_daq_vars.ue_ul_nb_rb=6;
|
openair_daq_vars.ue_ul_nb_rb=6;
|
||||||
openair_daq_vars.target_ue_ul_mcs=6;
|
openair_daq_vars.target_ue_ul_mcs=6;
|
||||||
|
|
||||||
// if AGC is off, the following values will be used
|
|
||||||
for (i=0;i<4;i++)
|
|
||||||
rxgain[i]=10;
|
|
||||||
|
|
||||||
// set eNB to max gain
|
// set eNB to max gain
|
||||||
PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB = rxg_max[0] + rxgain[0] - 30; //was measured at rxgain=30;
|
PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB = rxg_max[0] + (int)rx_gain - 30; //was measured at rxgain=30;
|
||||||
for (i=0; i<4; i++) {
|
for (i=0;i<4;i++)
|
||||||
// frame_parms->rfmode[i] = rf_mode_max[i];
|
openair0_cfg.rxg_mode[i] = max_gain;
|
||||||
rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMax;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize card
|
|
||||||
ret = openair0_open();
|
|
||||||
if ( ret != 0 ) {
|
|
||||||
if (ret == -1)
|
|
||||||
printf("Error opening /dev/openair0");
|
|
||||||
if (ret == -2)
|
|
||||||
printf("Error mapping bigshm");
|
|
||||||
if (ret == -3)
|
|
||||||
printf("Error mapping RX or TX buffer");
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]);
|
|
||||||
|
|
||||||
p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
|
|
||||||
p_exmimo_id = openair0_exmimo_pci[card].exmimo_id_ptr;
|
|
||||||
|
|
||||||
printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
|
|
||||||
|
|
||||||
// check if the software matches firmware
|
|
||||||
if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) {
|
|
||||||
printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p_exmimo_id->board_swrev>=9)
|
|
||||||
p_exmimo_config->framing.eNB_flag = 0;
|
|
||||||
else
|
|
||||||
p_exmimo_config->framing.eNB_flag = !UE_flag;
|
|
||||||
|
|
||||||
p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
|
|
||||||
#if (BOARD_SWREV_CNTL2>=0x0A)
|
|
||||||
p_exmimo_config->framing.resampling_factor[ant] = 2;
|
|
||||||
#else
|
|
||||||
for (ant=0; ant<4; ant++)
|
|
||||||
p_exmimo_config->framing.resampling_factor = 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++)
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
|
|
||||||
for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
|
|
||||||
for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
|
|
||||||
for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] = 0;
|
|
||||||
carrier_freq[ant] = 0; //this turns off all other LIMEs
|
|
||||||
downlink_frequency[ant] = 0; //this turns off all other LIMEs
|
|
||||||
uplink_frequency_offset[ant] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
ant_offset = 0;
|
|
||||||
for (ant=0; ant<4; ant++) {
|
|
||||||
if (ant==ant_offset) {
|
|
||||||
//if (1) {
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] = 0;
|
|
||||||
downlink_frequency[ant] = 0; //this turns off all other LIMEs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (ant = 0; ant<4; ant++) {
|
|
||||||
p_exmimo_config->rf.do_autocal[ant] = 1;
|
|
||||||
if (UE_flag==0) {
|
|
||||||
/* eNB */
|
|
||||||
if (frame_parms->frame_type == FDD) {
|
|
||||||
p_exmimo_config->rf.rf_freq_rx[ant] = downlink_frequency[ant] + uplink_frequency_offset[ant];
|
|
||||||
} else {
|
|
||||||
p_exmimo_config->rf.rf_freq_rx[ant] = downlink_frequency[ant];
|
|
||||||
}
|
|
||||||
p_exmimo_config->rf.rf_freq_tx[ant] = downlink_frequency[ant];
|
|
||||||
} else {
|
|
||||||
/* UE */
|
|
||||||
p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
|
|
||||||
if (frame_parms->frame_type == FDD) {
|
|
||||||
p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant] + uplink_frequency_offset[ant];
|
|
||||||
} else {
|
|
||||||
p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
|
|
||||||
p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
|
|
||||||
|
|
||||||
p_exmimo_config->rf.rf_local[ant] = rf_local[ant];
|
|
||||||
p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant];
|
|
||||||
|
|
||||||
if ((downlink_frequency[ant] >= 850000000) && (downlink_frequency[ant] <= 865000000)) {
|
|
||||||
p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant];
|
|
||||||
p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;
|
|
||||||
}
|
|
||||||
else if ((downlink_frequency[ant] >= 1900000000) && (downlink_frequency[ant] <= 2000000000)) {
|
|
||||||
p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant];
|
|
||||||
p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant];
|
|
||||||
p_exmimo_config->rf.rffe_band_mode[ant] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
|
|
||||||
p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
|
|
||||||
p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
|
|
||||||
p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
|
|
||||||
}
|
|
||||||
|
|
||||||
dump_frame_parms(frame_parms);
|
dump_frame_parms(frame_parms);
|
||||||
|
|
||||||
|
if(frame_parms->N_RB_DL == 100) {
|
||||||
|
sample_rate = 30.72e6;
|
||||||
|
#ifdef USRP
|
||||||
|
samples_per_packets = 2048;
|
||||||
|
samples_per_frame = 307200;
|
||||||
|
// from usrp_time_offset
|
||||||
|
tx_forward_nsamps = 175;
|
||||||
|
sf_bounds = sf_bounds_20;
|
||||||
|
max_cnt = 150;
|
||||||
|
tx_delay = 8;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if(frame_parms->N_RB_DL == 50){
|
||||||
|
sample_rate = 15.36e6;
|
||||||
|
#ifdef USRP
|
||||||
|
samples_per_packets = 2048;
|
||||||
|
samples_per_frame = 153600;
|
||||||
|
tx_forward_nsamps = 95;
|
||||||
|
sf_bounds = sf_bounds_10;
|
||||||
|
max_cnt = 75;
|
||||||
|
tx_delay = 4;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (frame_parms->N_RB_DL == 25) {
|
||||||
|
sample_rate = 7.68e6;
|
||||||
|
#ifdef USRP
|
||||||
|
samples_per_packets = 1024;
|
||||||
|
samples_per_frame = 76800;
|
||||||
|
tx_forward_nsamps = 70;
|
||||||
|
sf_bounds = sf_bounds_5;
|
||||||
|
max_cnt = 75;
|
||||||
|
tx_delay = 4;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
mac_xface = malloc(sizeof(MAC_xface));
|
mac_xface = malloc(sizeof(MAC_xface));
|
||||||
|
|
||||||
|
|
||||||
|
openair0_cfg.sample_rate = sample_rate;
|
||||||
|
openair0_cfg.tx_num_channels = frame_parms->nb_antennas_tx;
|
||||||
|
openair0_cfg.rx_num_channels = frame_parms->nb_antennas_rx;
|
||||||
|
|
||||||
|
for (i=0;i<4;i++) {
|
||||||
|
if (UE_flag==0) {
|
||||||
|
openair0_cfg.tx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
|
||||||
|
openair0_cfg.rx_freq[i] = downlink_frequency[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
openair0_cfg.rx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
|
||||||
|
openair0_cfg.tx_freq[i] = downlink_frequency[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openair0_cfg.tx_bw = bw;
|
||||||
|
openair0_cfg.rx_bw = bw;
|
||||||
|
for (i=0;i<4;i++) {
|
||||||
|
openair0_cfg.tx_gain[i] = tx_gain;
|
||||||
|
openair0_cfg.rx_gain[i] = rx_gain;
|
||||||
|
}
|
||||||
|
|
||||||
|
openair0_device_init(&openair0, &openair0_cfg);
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
#ifdef OPENAIR2
|
||||||
int eMBMS_active=0;
|
int eMBMS_active=0;
|
||||||
|
|
||||||
@@ -2137,19 +2016,12 @@ static void *UE_thread(void *arg) {
|
|||||||
// }
|
// }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OPENAIR2
|
// number_of_cards = openair0_num_detected_cards;
|
||||||
//init_pdcp_thread();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
number_of_cards = openair0_num_detected_cards;
|
|
||||||
if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
|
|
||||||
openair_daq_vars.timing_advance = 138;
|
|
||||||
else //ExpressMIMO2
|
|
||||||
openair_daq_vars.timing_advance = 0;
|
openair_daq_vars.timing_advance = 0;
|
||||||
|
|
||||||
// connect the TX/RX buffers
|
// connect the TX/RX buffers
|
||||||
if (UE_flag==1)
|
if (UE_flag==1) {
|
||||||
{
|
|
||||||
setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset);
|
setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset);
|
||||||
printf("Setting UE buffer to all-RX\n");
|
printf("Setting UE buffer to all-RX\n");
|
||||||
// Set LSBs for antenna switch (ExpressMIMO)
|
// Set LSBs for antenna switch (ExpressMIMO)
|
||||||
@@ -2159,68 +2031,20 @@ static void *UE_thread(void *arg) {
|
|||||||
|
|
||||||
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset);
|
setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset);
|
||||||
if (fs4_test==0)
|
|
||||||
{
|
|
||||||
printf("Setting eNB buffer to all-RX\n");
|
printf("Setting eNB buffer to all-RX\n");
|
||||||
// Set LSBs for antenna switch (ExpressMIMO)
|
// Set LSBs for antenna switch (ExpressMIMO)
|
||||||
for (i=0; i<frame_parms->samples_per_tti*10; i++)
|
for (i=0; i<frame_parms->samples_per_tti*10; i++)
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
||||||
PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
|
PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
|
||||||
|
|
||||||
// Set the last OFDM symbol of subframe 4 to TX to allow enough time for switch to settle
|
|
||||||
// (that's ok since the last symbol can be configured as SRS)
|
|
||||||
/*
|
|
||||||
for (i=frame_parms->samples_per_tti*5-0*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
|
|
||||||
i<frame_parms->samples_per_tti*5; i++)
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
|
||||||
PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x0;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("Setting eNB buffer to fs/4 test signal\n");
|
|
||||||
for (j=0; j<PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti*10; j+=4)
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
|
|
||||||
{
|
|
||||||
amp = 0x8000;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+1] = 0;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+3] = amp-1;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+5] = 0;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+7] = amp;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j] = amp-1;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+2] = 0;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+4] = amp;
|
|
||||||
((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+6] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
openair0_dump_config(card);
|
openair0_dump_config(card);
|
||||||
|
/*
|
||||||
printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",
|
|
||||||
p_exmimo_config->rf.rf_mode[0],
|
|
||||||
p_exmimo_config->rf.rf_mode[1],
|
|
||||||
p_exmimo_config->rf.rf_mode[2],
|
|
||||||
p_exmimo_config->rf.rf_mode[3],
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&3), // RXen+TXen
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&4)>>2, //TXLPFen
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&128)>>7, //RXLPFen
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
|
|
||||||
(p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
|
|
||||||
(p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
|
|
||||||
p_exmimo_config->rf.rf_rxdc[0],
|
|
||||||
p_exmimo_config->rf.rf_local[0],
|
|
||||||
p_exmimo_config->rf.rf_vcocal[0]);
|
|
||||||
|
|
||||||
for (ant=0;ant<4;ant++)
|
for (ant=0;ant<4;ant++)
|
||||||
p_exmimo_config->rf.do_autocal[ant] = 0;
|
p_exmimo_config->rf.do_autocal[ant] = 0;
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef EMOS
|
#ifdef EMOS
|
||||||
error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
|
error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
|
||||||
@@ -2260,7 +2084,7 @@ static void *UE_thread(void *arg) {
|
|||||||
printf("mutex=%p\n",mutex);
|
printf("mutex=%p\n",mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0];
|
|
||||||
|
|
||||||
// this starts the DMA transfers
|
// this starts the DMA transfers
|
||||||
if (UE_flag!=1)
|
if (UE_flag!=1)
|
||||||
@@ -2328,6 +2152,7 @@ static void *UE_thread(void *arg) {
|
|||||||
|
|
||||||
// start the main thread
|
// start the main thread
|
||||||
if (UE_flag == 1) {
|
if (UE_flag == 1) {
|
||||||
|
#ifndef USRP
|
||||||
#ifdef RTAI
|
#ifdef RTAI
|
||||||
thread1 = rt_thread_create(UE_thread, NULL, 100000000);
|
thread1 = rt_thread_create(UE_thread, NULL, 100000000);
|
||||||
#else
|
#else
|
||||||
@@ -2346,6 +2171,9 @@ static void *UE_thread(void *arg) {
|
|||||||
init_dlsch_threads();
|
init_dlsch_threads();
|
||||||
#endif
|
#endif
|
||||||
printf("UE threads created\n");
|
printf("UE threads created\n");
|
||||||
|
#else
|
||||||
|
printf("UE functionality not yet supported on USRP");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
@@ -2365,13 +2193,6 @@ static void *UE_thread(void *arg) {
|
|||||||
LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
|
LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef ULSCH_THREAD
|
|
||||||
init_ulsch_threads();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2410,6 +2231,7 @@ static void *UE_thread(void *arg) {
|
|||||||
printf("stopping MODEM threads\n");
|
printf("stopping MODEM threads\n");
|
||||||
// cleanup
|
// cleanup
|
||||||
if (UE_flag == 1) {
|
if (UE_flag == 1) {
|
||||||
|
#ifndef USRP
|
||||||
#ifdef RTAI
|
#ifdef RTAI
|
||||||
rt_thread_join(thread1);
|
rt_thread_join(thread1);
|
||||||
#else
|
#else
|
||||||
@@ -2418,6 +2240,7 @@ static void *UE_thread(void *arg) {
|
|||||||
#ifdef DLSCH_THREAD
|
#ifdef DLSCH_THREAD
|
||||||
cleanup_dlsch_threads();
|
cleanup_dlsch_threads();
|
||||||
cleanup_rx_pdsch_thread();
|
cleanup_rx_pdsch_thread();
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -2431,9 +2254,6 @@ static void *UE_thread(void *arg) {
|
|||||||
#ifdef DEBUG_THREADS
|
#ifdef DEBUG_THREADS
|
||||||
printf("status %d\n",*eNB_thread_status_p);
|
printf("status %d\n",*eNB_thread_status_p);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#ifdef ULSCH_THREAD
|
|
||||||
cleanup_ulsch_threads();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (multi_thread>0) {
|
if (multi_thread>0) {
|
||||||
@@ -2475,26 +2295,6 @@ static void *UE_thread(void *arg) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_config(int card, int ant, unsigned int rf_mode, int UE_flag) {
|
|
||||||
p_exmimo_config->framing.eNB_flag = !UE_flag;
|
|
||||||
p_exmimo_config->framing.tdd_config = 0;
|
|
||||||
#if (BOARD_SWREV_CNTL2>=0x0A)
|
|
||||||
p_exmimo_config->framing.resampling_factor[ant] = 2;
|
|
||||||
#else
|
|
||||||
p_exmimo_config->framing.resampling_factor = 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
p_exmimo_config->rf.rf_freq_rx[ant] = 1907600000;
|
|
||||||
p_exmimo_config->rf.rf_freq_tx[ant] = 1907600000;;
|
|
||||||
p_exmimo_config->rf.rx_gain[ant][0] = 20;
|
|
||||||
p_exmimo_config->rf.tx_gain[ant][0] = 10;
|
|
||||||
p_exmimo_config->rf.rf_mode[ant] = rf_mode;
|
|
||||||
|
|
||||||
p_exmimo_config->rf.rf_local[ant] = build_rflocal(20,25,26,04);
|
|
||||||
p_exmimo_config->rf.rf_rxdc[ant] = build_rfdc(128, 128);
|
|
||||||
p_exmimo_config->rf.rf_vcocal[ant] = (0xE<<6) + 0xE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
|
void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
Reference in New Issue
Block a user