extraction of RU control functions from lte-ru.c. Removal of mobipass fronthaul.
This commit is contained in:
@@ -1902,6 +1902,7 @@ add_executable(lte-softmodem
|
|||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
||||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
@@ -1942,6 +1943,7 @@ add_executable(lte-softmodem-nos1
|
|||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
|
||||||
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
@@ -1982,6 +1984,7 @@ add_executable(lte-uesoftmodem
|
|||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/rfsim.c
|
${OPENAIR_TARGETS}/RT/USER/rfsim.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||||
@@ -2021,6 +2024,7 @@ add_executable(lte-uesoftmodem-nos1
|
|||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/rfsim.c
|
${OPENAIR_TARGETS}/RT/USER/rfsim.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
set(ENABLE_ITTI True)
|
|
||||||
set(ENABLE_USE_MME False)
|
|
||||||
set(PDCP_USE_NETLINK True)
|
|
||||||
set(LINK_ENB_PDCP_TO_IP_DRIVER True)
|
|
||||||
set(LINK_ENB_PDCP_TO_GTPV1U False)
|
|
||||||
set(PDCP_USE_NETLINK_QUEUES False)
|
|
||||||
set(LINUX True)
|
|
||||||
set(SECU False)
|
|
||||||
set(NAS_UE False)
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
|
||||||
set ( DEBUG_OMG False )
|
|
||||||
set ( DISABLE_XER_PRINT False )
|
|
||||||
set ( DRIVER2013 True )
|
|
||||||
set ( ENABLE_ITTI True )
|
|
||||||
set ( ENABLE_NAS_UE_LOGGING True )
|
|
||||||
set ( ENABLE_NEW_MULTICAST True )
|
|
||||||
set ( ENABLE_RAL False )
|
|
||||||
set ( ENABLE_SECURITY True )
|
|
||||||
set ( ENABLE_STANDALONE_EPC False)
|
|
||||||
set ( ENABLE_USE_CPU_EXECUTION_TIME True )
|
|
||||||
set ( ENABLE_USE_MME True )
|
|
||||||
set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True)
|
|
||||||
set ( ENABLE_VCD_FIFO False )
|
|
||||||
set ( ENB_MODE True )
|
|
||||||
set ( EXMIMO_IOT True )
|
|
||||||
set ( JUMBO_FRAME True )
|
|
||||||
set ( LARGE_SCALE False )
|
|
||||||
set ( LINK_ENB_PDCP_TO_GTPV1U True)
|
|
||||||
set ( LINUX_LIST False )
|
|
||||||
set ( LINUX True )
|
|
||||||
set ( LOCALIZATION False )
|
|
||||||
set ( LOG_NO_THREAD True )
|
|
||||||
set ( DEADLINE_SCHEDULER False )
|
|
||||||
set ( MAC_CONTEXT 1 )
|
|
||||||
set ( MAX_NUM_CCs 1 )
|
|
||||||
set ( MESSAGE_CHART_GENERATOR False)
|
|
||||||
set ( MSG_PRINT False )
|
|
||||||
set ( MU_RECEIVER False )
|
|
||||||
set ( NAS_ADDRESS_FIX False )
|
|
||||||
set ( NAS_BUILT_IN_UE True)
|
|
||||||
set ( NAS_MME False )
|
|
||||||
set ( NAS_UE True )
|
|
||||||
set ( NB_ANTENNAS_RX "2" )
|
|
||||||
set ( NB_ANTENNAS_TX "2" )
|
|
||||||
set ( NO_RRM True )
|
|
||||||
set ( OAISIM True )
|
|
||||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
|
||||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
|
||||||
set ( OPENAIR2 True )
|
|
||||||
set ( OPENAIR_LTE True )
|
|
||||||
set ( PACKAGE_NAME "oaisim" )
|
|
||||||
set ( PDCP_USE_NETLINK True )
|
|
||||||
set ( PDCP_MSG_PRINT False )
|
|
||||||
set ( PHY_CONTEXT False )
|
|
||||||
set ( PHY_EMUL False )
|
|
||||||
set ( PHYSIM True )
|
|
||||||
set ( RF_BOARD "False" )
|
|
||||||
set ( RLC_STOP_ON_LOST_PDU False )
|
|
||||||
set ( RRC_ASN1_VERSION "Rel10" )
|
|
||||||
set ( RRC_DEFAULT_RAB_IS_AM True)
|
|
||||||
set ( RRC_MSG_PRINT False )
|
|
||||||
set ( SECU False )
|
|
||||||
set ( SMBV False )
|
|
||||||
set ( TEST_OMG False )
|
|
||||||
set ( USE_3GPP_ADDR_AS_LINK_ADDR False )
|
|
||||||
set ( USE_MME "R10" )
|
|
||||||
set ( XER_PRINT False )
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
|
||||||
set ( DEBUG_OMG False )
|
|
||||||
set ( DISABLE_XER_PRINT False )
|
|
||||||
set ( DRIVER2013 False )
|
|
||||||
set ( ENABLE_ITTI True )
|
|
||||||
set ( ENABLE_NAS_UE_LOGGING False )
|
|
||||||
set ( ENABLE_NEW_MULTICAST False )
|
|
||||||
set ( ENABLE_RAL False )
|
|
||||||
set ( ENABLE_SECURITY False )
|
|
||||||
set ( ENABLE_STANDALONE_EPC False )
|
|
||||||
set ( ENABLE_USE_CPU_EXECUTION_TIME False )
|
|
||||||
set ( ENABLE_USE_MME False )
|
|
||||||
set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True)
|
|
||||||
set ( ENABLE_VCD_FIFO False )
|
|
||||||
set ( ENB_MODE False )
|
|
||||||
set ( EPC_BUILD True )
|
|
||||||
set ( EXMIMO_IOT False )
|
|
||||||
set ( JUMBO_FRAME False )
|
|
||||||
set ( LARGE_SCALE False )
|
|
||||||
set ( LINK_ENB_PDCP_TO_GTPV1U True)
|
|
||||||
set ( LINUX_LIST False )
|
|
||||||
set ( LINUX False )
|
|
||||||
set ( LOCALIZATION False )
|
|
||||||
set ( LOG_NO_THREAD False )
|
|
||||||
set ( DEADLINE_SCHEDULER False )
|
|
||||||
set ( MAC_CONTEXT 1 )
|
|
||||||
set ( MAX_NUM_CCs 1 )
|
|
||||||
set ( MSG_PRINT False )
|
|
||||||
set ( MU_RECEIVER False )
|
|
||||||
set ( NAS_ADDRESS_FIX False )
|
|
||||||
set ( NAS_BUILT_IN_EPC True )
|
|
||||||
set ( NAS_MME True )
|
|
||||||
set ( NAS_NETLINK False )
|
|
||||||
set ( NAS_UE False )
|
|
||||||
set ( NB_ANTENNAS_RX "2" )
|
|
||||||
set ( NB_ANTENNAS_TX "2" )
|
|
||||||
set ( NO_RRM False )
|
|
||||||
set ( OAISIM False )
|
|
||||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
|
||||||
set ( OAI_NW_DRIVER_USE_NETLINK False )
|
|
||||||
set ( OPENAIR2 False )
|
|
||||||
set ( OPENAIR_LTE False )
|
|
||||||
set ( PACKAGE_NAME "EPC" )
|
|
||||||
set ( PDCP_MSG_PRINT False )
|
|
||||||
set ( PHY_CONTEXT False )
|
|
||||||
set ( PHY_EMUL False )
|
|
||||||
set ( PHYSIM False )
|
|
||||||
set ( RF_BOARD "False" )
|
|
||||||
set ( RRC_ASN1_VERSION "Rel10" )
|
|
||||||
set ( RLC_STOP_ON_LOST_PDU False )
|
|
||||||
set ( RRC_MSG_PRINT False )
|
|
||||||
set ( SECU False )
|
|
||||||
set ( SMBV False )
|
|
||||||
set ( TEST_OMG False )
|
|
||||||
set ( UPDATE_RELEASE_9 True)
|
|
||||||
set ( UPDATE_RELEASE_10 True)
|
|
||||||
set ( USE_3GPP_ADDR_AS_LINK_ADDR False )
|
|
||||||
set ( USE_MME "R10" )
|
|
||||||
set ( XER_PRINT False )
|
|
||||||
set ( XFORMS False )
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
set ( DEBUG_OMG False )
|
|
||||||
set ( DISABLE_XER_PRINT False )
|
|
||||||
set ( DRIVER2013 True )
|
|
||||||
set ( ENABLE_ITTI True )
|
|
||||||
set ( ENABLE_NAS_UE_LOGGING False )
|
|
||||||
set ( ENABLE_NEW_MULTICAST True )
|
|
||||||
set ( ENABLE_RAL False )
|
|
||||||
set ( ENABLE_SECURITY False )
|
|
||||||
set ( ENABLE_STANDALONE_EPC False)
|
|
||||||
set ( ENABLE_USE_CPU_EXECUTION_TIME True )
|
|
||||||
set ( ENABLE_USE_MME False )
|
|
||||||
set ( ENABLE_USE_RAW_SOCKET_FOR_SGI False)
|
|
||||||
set ( ENABLE_VCD_FIFO False )
|
|
||||||
set ( ENB_MODE True )
|
|
||||||
set ( EXMIMO_IOT True )
|
|
||||||
set ( JUMBO_FRAME True )
|
|
||||||
set ( LARGE_SCALE False )
|
|
||||||
set ( LINK_ENB_PDCP_TO_GTPV1U False)
|
|
||||||
set ( LINUX_LIST False )
|
|
||||||
set ( LINUX True )
|
|
||||||
set ( LOCALIZATION False )
|
|
||||||
set ( LOG_NO_THREAD 1 )
|
|
||||||
set ( DEADLINE_SCHEDULER False )
|
|
||||||
set ( MAC_CONTEXT 1 )
|
|
||||||
set ( MAX_NUM_CCs 1 )
|
|
||||||
set ( MESSAGE_CHART_GENERATOR False )
|
|
||||||
set ( MESSAGE_CHART_GENERATOR_RLC_MAC False )
|
|
||||||
set ( MESSAGE_CHART_GENERATOR_PHY False )
|
|
||||||
set ( MSG_PRINT False )
|
|
||||||
set ( MU_RECEIVER False )
|
|
||||||
set ( NAS_ADDRESS_FIX False )
|
|
||||||
set ( NAS_BUILT_IN_UE False)
|
|
||||||
set ( NAS_MME False )
|
|
||||||
set ( NAS_UE False )
|
|
||||||
set ( NB_ANTENNAS_RX "2" )
|
|
||||||
set ( NB_ANTENNAS_TX "2" )
|
|
||||||
set ( NO_RRM True )
|
|
||||||
set ( OAISIM True )
|
|
||||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
|
||||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
|
||||||
set ( OPENAIR2 True )
|
|
||||||
set ( OPENAIR_LTE True )
|
|
||||||
set ( PACKAGE_NAME "oaisim" )
|
|
||||||
set ( PDCP_USE_NETLINK True )
|
|
||||||
set ( PDCP_MSG_PRINT False )
|
|
||||||
set ( PHY_CONTEXT False )
|
|
||||||
set ( PHY_EMUL False )
|
|
||||||
set ( PHYSIM True )
|
|
||||||
set ( RF_BOARD "False" )
|
|
||||||
set ( RRC_ASN1_VERSION "Rel10" )
|
|
||||||
set ( RLC_STOP_ON_LOST_PDU False )
|
|
||||||
set ( RRC_MSG_PRINT False )
|
|
||||||
set ( SECU False )
|
|
||||||
set ( SMBV False )
|
|
||||||
set ( TEST_OMG False )
|
|
||||||
set ( USE_3GPP_ADDR_AS_LINK_ADDR False )
|
|
||||||
set ( USE_MME "R10" )
|
|
||||||
set ( XER_PRINT False )
|
|
||||||
set ( DEBUG_PHY False )
|
|
||||||
set ( DEBUG_PHY_PROC False)
|
|
||||||
set ( DEBUG_DLSCH False)
|
|
||||||
@@ -35,6 +35,8 @@
|
|||||||
#include "RRC/LTE/rrc_extern.h"
|
#include "RRC/LTE/rrc_extern.h"
|
||||||
#include "PHY_INTERFACE/phy_interface.h"
|
#include "PHY_INTERFACE/phy_interface.h"
|
||||||
|
|
||||||
|
// Note: this is for prototype of generate_drs_pusch (OTA synchronization of RRUs)
|
||||||
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
|
|
||||||
int* sync_corr_ue0 = NULL;
|
int* sync_corr_ue0 = NULL;
|
||||||
int* sync_corr_ue1 = NULL;
|
int* sync_corr_ue1 = NULL;
|
||||||
|
|||||||
@@ -107,9 +107,6 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||||
int prach_ifft_cnt=0;
|
int prach_ifft_cnt=0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef PRACH_DEBUG
|
|
||||||
int en0=0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ru) {
|
if (ru) {
|
||||||
fp = &ru->frame_parms;
|
fp = &ru->frame_parms;
|
||||||
@@ -470,7 +467,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
} else if (eNB!=NULL) {
|
} else if (eNB!=NULL) {
|
||||||
|
|
||||||
#ifdef PRACH_DEBUG
|
#ifdef PRACH_DEBUG
|
||||||
int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
|
en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
|
||||||
if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -706,7 +706,7 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
|||||||
int i;
|
int i;
|
||||||
LTE_eNB_UCI *uci;
|
LTE_eNB_UCI *uci;
|
||||||
uint16_t tdd_multiplexing_mask=0;
|
uint16_t tdd_multiplexing_mask=0;
|
||||||
int res;
|
|
||||||
|
|
||||||
for (i=0;i<NUMBER_OF_UE_MAX;i++) {
|
for (i=0;i<NUMBER_OF_UE_MAX;i++) {
|
||||||
|
|
||||||
@@ -855,13 +855,13 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
|
|||||||
uci->rnti,
|
uci->rnti,
|
||||||
frame,subframe,
|
frame,subframe,
|
||||||
uci->num_pucch_resources,
|
uci->num_pucch_resources,
|
||||||
uci->n_pucch_1[res][0],
|
uci->n_pucch_1[0][0],
|
||||||
uci->n_pucch_1[res][1],
|
uci->n_pucch_1[0][1],
|
||||||
uci->n_pucch_1[res][2],
|
uci->n_pucch_1[0][2],
|
||||||
uci->n_pucch_1[res][3],
|
uci->n_pucch_1[0][3],
|
||||||
uci->pucch_fmt);
|
uci->pucch_fmt);
|
||||||
|
|
||||||
for (res=0;res<uci->num_pucch_resources;res++)
|
for (int res=0;res<uci->num_pucch_resources;res++)
|
||||||
metric[res] = rx_pucch(eNB,
|
metric[res] = rx_pucch(eNB,
|
||||||
uci->pucch_fmt,
|
uci->pucch_fmt,
|
||||||
i,
|
i,
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
|
|
||||||
#include "targets/RT/USER/rt_wrapper.h"
|
#include "targets/RT/USER/rt_wrapper.h"
|
||||||
|
|
||||||
|
// Note: this is needed for prototype of generate_drs_pusch, which is used as a reference signal for OTA synchronization
|
||||||
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
// RU OFDM Modulator, used in IF4p5 RRU, RCC/RAU with IF5, eNodeB
|
// RU OFDM Modulator, used in IF4p5 RRU, RCC/RAU with IF5, eNodeB
|
||||||
|
|
||||||
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
@@ -58,6 +60,7 @@ extern openair0_config_t openair0_cfg[MAX_CARDS];
|
|||||||
extern int oai_exit;
|
extern int oai_exit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void feptx0(RU_t *ru,int slot) {
|
void feptx0(RU_t *ru,int slot) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
|
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
|
||||||
|
|||||||
+21
-722
@@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
OpenAirInterface
|
OpenAirInterface
|
||||||
Copyright(c) 1999 - 2014 Eurecom
|
Copyright(c) 1999 - 2018 Eurecom
|
||||||
|
|
||||||
OpenAirInterface is free software: you can redistribute it and/or modify
|
OpenAirInterface is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -21,16 +21,16 @@
|
|||||||
Contact Information
|
Contact Information
|
||||||
OpenAirInterface Admin: openair_admin@eurecom.fr
|
OpenAirInterface Admin: openair_admin@eurecom.fr
|
||||||
OpenAirInterface Tech : openair_tech@eurecom.fr
|
OpenAirInterface Tech : openair_tech@eurecom.fr
|
||||||
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
|
OpenAirInterface Dev : openair5g-devel@lists.eurecom.fr
|
||||||
|
|
||||||
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/*! \file lte-enb.c
|
/*! \file lte-ru.c
|
||||||
* \brief Top-level threads for eNodeB
|
* \brief Top-level threads for RU entity
|
||||||
* \author R. Knopp, F. Kaltenberger, Navid Nikaein
|
* \author R. Knopp, F. Kaltenberger, Navid Nikaein
|
||||||
* \date 2012
|
* \date 2018
|
||||||
* \version 0.1
|
* \version 0.1
|
||||||
* \company Eurecom
|
* \company Eurecom
|
||||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
|
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
|
||||||
@@ -128,266 +128,19 @@ void init_RU(char*,clock_source_t clock_source,clock_source_t time_source,int ge
|
|||||||
void stop_RU(int nb_ru);
|
void stop_RU(int nb_ru);
|
||||||
void do_ru_sync(RU_t *ru);
|
void do_ru_sync(RU_t *ru);
|
||||||
|
|
||||||
void configure_ru(int idx,
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
void configure_rru(int idx,
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
int attach_rru(RU_t *ru);
|
|
||||||
void reset_proc(RU_t *ru);
|
void reset_proc(RU_t *ru);
|
||||||
int connect_rau(RU_t *ru);
|
int connect_rau(RU_t *ru);
|
||||||
|
|
||||||
|
const char ru_states[6][9] = {"RU_IDLE","RU_CONFIG","RU_READY","RU_RUN","RU_ERROR","RU_SYNC"};
|
||||||
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
static void* ru_thread_control( void* param );
|
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/* Functions to attach and configure RRU */
|
/* Functions to attach and configure RRU */
|
||||||
|
|
||||||
extern void wait_eNBs(void);
|
|
||||||
|
|
||||||
char ru_states[6][9] = {"RU_IDLE","RU_CONFIG","RU_READY","RU_RUN","RU_ERROR","RU_SYNC"};
|
|
||||||
|
|
||||||
int send_tick(RU_t *ru){
|
|
||||||
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
|
|
||||||
rru_config_msg.type = RAU_tick;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE;
|
|
||||||
|
|
||||||
LOG_I(PHY,"Sending RAU tick to RRU %d\n",ru->idx);
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d cannot access remote radio\n",ru->idx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int send_config(RU_t *ru, RRU_CONFIG_msg_t rru_config_msg){
|
|
||||||
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_config;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_config_t);
|
|
||||||
|
|
||||||
LOG_I(PHY,"Sending Configuration to RRU %d (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d\n",ru->idx,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send configuration to remote radio\n",ru->idx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int send_capab(RU_t *ru){
|
|
||||||
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
RRU_capabilities_t *cap;
|
|
||||||
int i=0;
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_capabilities;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
|
||||||
cap = (RRU_capabilities_t*)&rru_config_msg.msg[0];
|
|
||||||
LOG_I(PHY,"Sending Capabilities (len %d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",
|
|
||||||
(int)rru_config_msg.len,ru->num_bands,ru->max_pdschReferenceSignalPower,ru->max_rxgain,ru->nb_tx,ru->nb_rx);
|
|
||||||
switch (ru->function) {
|
|
||||||
case NGFI_RRU_IF4p5:
|
|
||||||
cap->FH_fmt = OAI_IF4p5_only;
|
|
||||||
break;
|
|
||||||
case NGFI_RRU_IF5:
|
|
||||||
cap->FH_fmt = OAI_IF5_only;
|
|
||||||
break;
|
|
||||||
case MBP_RRU_IF5:
|
|
||||||
cap->FH_fmt = MBP_IF5;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"RU_function is unknown %d\n",RC.ru[0]->function);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cap->num_bands = ru->num_bands;
|
|
||||||
for (i=0;i<ru->num_bands;i++) {
|
|
||||||
LOG_I(PHY,"Band %d: nb_rx %d nb_tx %d pdschReferenceSignalPower %d rxgain %d\n",
|
|
||||||
ru->band[i],ru->nb_rx,ru->nb_tx,ru->max_pdschReferenceSignalPower,ru->max_rxgain);
|
|
||||||
cap->band_list[i] = ru->band[i];
|
|
||||||
cap->nb_rx[i] = ru->nb_rx;
|
|
||||||
cap->nb_tx[i] = ru->nb_tx;
|
|
||||||
cap->max_pdschReferenceSignalPower[i] = ru->max_pdschReferenceSignalPower;
|
|
||||||
cap->max_rxgain[i] = ru->max_rxgain;
|
|
||||||
}
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send capabilities to RAU\n",ru->idx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int attach_rru(RU_t *ru) {
|
|
||||||
|
|
||||||
ssize_t msg_len,len;
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
int received_capabilities=0;
|
|
||||||
|
|
||||||
wait_eNBs();
|
|
||||||
// Wait for capabilities
|
|
||||||
while (received_capabilities==0) {
|
|
||||||
|
|
||||||
memset((void*)&rru_config_msg,0,sizeof(rru_config_msg));
|
|
||||||
rru_config_msg.type = RAU_tick;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE;
|
|
||||||
LOG_I(PHY,"Sending RAU tick to RRU %d\n",ru->idx);
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d cannot access remote radio\n",ru->idx);
|
|
||||||
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
|
||||||
|
|
||||||
// wait for answer with timeout
|
|
||||||
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
|
||||||
&rru_config_msg,
|
|
||||||
msg_len))<0) {
|
|
||||||
LOG_I(PHY,"Waiting for RRU %d\n",ru->idx);
|
|
||||||
}
|
|
||||||
else if (rru_config_msg.type == RRU_capabilities) {
|
|
||||||
AssertFatal(rru_config_msg.len==msg_len,"Received capabilities with incorrect length (%d!=%d)\n",(int)rru_config_msg.len,(int)msg_len);
|
|
||||||
LOG_I(PHY,"Received capabilities from RRU %d (len %d/%d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",ru->idx,
|
|
||||||
(int)rru_config_msg.len,(int)msg_len,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_pdschReferenceSignalPower[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_rxgain[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_tx[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_rx[0]);
|
|
||||||
received_capabilities=1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_E(PHY,"Received incorrect message %d from RRU %d\n",rru_config_msg.type,ru->idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
configure_ru(ru->idx,
|
|
||||||
(RRU_capabilities_t *)&rru_config_msg.msg[0]);
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_config;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_config_t);
|
|
||||||
LOG_I(PHY,"Sending Configuration to RRU %d (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n",ru->idx,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send configuration to remote radio\n",ru->idx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int connect_rau(RU_t *ru) {
|
|
||||||
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
ssize_t msg_len;
|
|
||||||
int tick_received = 0;
|
|
||||||
int configuration_received = 0;
|
|
||||||
RRU_capabilities_t *cap;
|
|
||||||
int i;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
// wait for RAU_tick
|
|
||||||
while (tick_received == 0) {
|
|
||||||
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE;
|
|
||||||
|
|
||||||
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
|
||||||
&rru_config_msg,
|
|
||||||
msg_len))<0) {
|
|
||||||
LOG_I(PHY,"Waiting for RAU\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (rru_config_msg.type == RAU_tick) {
|
|
||||||
LOG_I(PHY,"Tick received from RAU\n");
|
|
||||||
tick_received = 1;
|
|
||||||
}
|
|
||||||
else LOG_E(PHY,"Received erroneous message (%d)from RAU, expected RAU_tick\n",rru_config_msg.type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// send capabilities
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_capabilities;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
|
||||||
cap = (RRU_capabilities_t*)&rru_config_msg.msg[0];
|
|
||||||
LOG_I(PHY,"Sending Capabilities (len %d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",
|
|
||||||
(int)rru_config_msg.len,ru->num_bands,ru->max_pdschReferenceSignalPower,ru->max_rxgain,ru->nb_tx,ru->nb_rx);
|
|
||||||
switch (ru->function) {
|
|
||||||
case NGFI_RRU_IF4p5:
|
|
||||||
cap->FH_fmt = OAI_IF4p5_only;
|
|
||||||
break;
|
|
||||||
case NGFI_RRU_IF5:
|
|
||||||
cap->FH_fmt = OAI_IF5_only;
|
|
||||||
break;
|
|
||||||
case MBP_RRU_IF5:
|
|
||||||
cap->FH_fmt = MBP_IF5;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"RU_function is unknown %d\n",RC.ru[0]->function);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cap->num_bands = ru->num_bands;
|
|
||||||
for (i=0;i<ru->num_bands;i++) {
|
|
||||||
LOG_I(PHY,"Band %d: nb_rx %d nb_tx %d pdschReferenceSignalPower %d rxgain %d\n",
|
|
||||||
ru->band[i],ru->nb_rx,ru->nb_tx,ru->max_pdschReferenceSignalPower,ru->max_rxgain);
|
|
||||||
cap->band_list[i] = ru->band[i];
|
|
||||||
cap->nb_rx[i] = ru->nb_rx;
|
|
||||||
cap->nb_tx[i] = ru->nb_tx;
|
|
||||||
cap->max_pdschReferenceSignalPower[i] = ru->max_pdschReferenceSignalPower;
|
|
||||||
cap->max_rxgain[i] = ru->max_rxgain;
|
|
||||||
}
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send capabilities to RAU\n",ru->idx);
|
|
||||||
|
|
||||||
// wait for configuration
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_config_t);
|
|
||||||
while (configuration_received == 0) {
|
|
||||||
|
|
||||||
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
|
||||||
&rru_config_msg,
|
|
||||||
rru_config_msg.len))<0) {
|
|
||||||
LOG_I(PHY,"Waiting for configuration from RAU\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_I(PHY,"Configuration received from RAU (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n",
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
configure_rru(ru->idx,
|
|
||||||
(void*)&rru_config_msg.msg[0]);
|
|
||||||
configuration_received = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/* Southbound Fronthaul functions, RCC/RAU */
|
/* Southbound Fronthaul functions, RCC/RAU */
|
||||||
|
|
||||||
@@ -397,12 +150,6 @@ static inline void fh_if5_south_out(RU_t *ru) {
|
|||||||
send_IF5(ru, ru->proc.timestamp_tx, ru->proc.subframe_tx, &ru->seqno, IF5_RRH_GW_DL);
|
send_IF5(ru, ru->proc.timestamp_tx, ru->proc.subframe_tx, &ru->seqno, IF5_RRH_GW_DL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// southbound IF5 fronthaul for Mobipass packet format
|
|
||||||
static inline void fh_if5_mobipass_south_out(RU_t *ru) {
|
|
||||||
if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
|
|
||||||
send_IF5(ru, ru->proc.timestamp_tx, ru->proc.subframe_tx, &ru->seqno, IF5_MOBIPASS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// southbound IF4p5 fronthaul
|
// southbound IF4p5 fronthaul
|
||||||
static inline void fh_if4p5_south_out(RU_t *ru) {
|
static inline void fh_if4p5_south_out(RU_t *ru) {
|
||||||
if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
|
if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
|
||||||
@@ -532,48 +279,6 @@ void fh_slave_south_in(RU_t *ru,int *frame,int *subframe) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// asynchronous inbound if5 fronthaul from south (Mobipass)
|
|
||||||
void fh_if5_south_asynch_in_mobipass(RU_t *ru,int *frame,int *subframe) {
|
|
||||||
|
|
||||||
RU_proc_t *proc = &ru->proc;
|
|
||||||
LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
|
|
||||||
|
|
||||||
recv_IF5(ru, &proc->timestamp_rx, *subframe, IF5_MOBIPASS);
|
|
||||||
pthread_mutex_lock(&proc->mutex_asynch_rxtx);
|
|
||||||
int offset_mobipass = 40120;
|
|
||||||
pthread_mutex_lock(&proc->mutex_asynch_rxtx);
|
|
||||||
proc->subframe_rx = ((proc->timestamp_rx-offset_mobipass)/fp->samples_per_tti)%10;
|
|
||||||
proc->frame_rx = ((proc->timestamp_rx-offset_mobipass)/(fp->samples_per_tti*10))&1023;
|
|
||||||
|
|
||||||
proc->subframe_rx = (proc->timestamp_rx/fp->samples_per_tti)%10;
|
|
||||||
proc->frame_rx = (proc->timestamp_rx/(10*fp->samples_per_tti))&1023;
|
|
||||||
|
|
||||||
if (proc->first_rx == 1) {
|
|
||||||
proc->first_rx =2;
|
|
||||||
*subframe = proc->subframe_rx;
|
|
||||||
*frame = proc->frame_rx;
|
|
||||||
LOG_E(PHY,"[Mobipass]timestamp_rx:%llu, frame_rx %d, subframe: %d\n",(unsigned long long int)proc->timestamp_rx,proc->frame_rx,proc->subframe_rx);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (proc->subframe_rx != *subframe) {
|
|
||||||
proc->first_rx++;
|
|
||||||
LOG_E(PHY,"[Mobipass]timestamp:%llu, subframe_rx %d is not what we expect %d, first_rx:%d\n",(unsigned long long int)proc->timestamp_rx, proc->subframe_rx,*subframe, proc->first_rx);
|
|
||||||
//exit_fun("Exiting");
|
|
||||||
}
|
|
||||||
if (proc->frame_rx != *frame) {
|
|
||||||
proc->first_rx++;
|
|
||||||
LOG_E(PHY,"[Mobipass]timestamp:%llu, frame_rx %d is not what we expect %d, first_rx:%d\n",(unsigned long long int)proc->timestamp_rx,proc->frame_rx,*frame, proc->first_rx);
|
|
||||||
// exit_fun("Exiting");
|
|
||||||
}
|
|
||||||
// temporary solution
|
|
||||||
*subframe = proc->subframe_rx;
|
|
||||||
*frame = proc->frame_rx;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&proc->mutex_asynch_rxtx);
|
|
||||||
|
|
||||||
|
|
||||||
} // eNodeB_3GPP_BBU
|
|
||||||
|
|
||||||
// asynchronous inbound if4p5 fronthaul from south
|
// asynchronous inbound if4p5 fronthaul from south
|
||||||
void fh_if4p5_south_asynch_in(RU_t *ru,int *frame,int *subframe) {
|
void fh_if4p5_south_asynch_in(RU_t *ru,int *frame,int *subframe) {
|
||||||
@@ -1053,10 +758,8 @@ static void* ru_thread_asynch_rxtx( void* param ) {
|
|||||||
subframe++;
|
subframe++;
|
||||||
}
|
}
|
||||||
LOG_D(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n");
|
LOG_D(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n");
|
||||||
// asynchronous receive from south (Mobipass)
|
|
||||||
if (ru->fh_south_asynch_in) ru->fh_south_asynch_in(ru,&frame,&subframe);
|
|
||||||
// asynchronous receive from north (RRU IF4/IF5)
|
// asynchronous receive from north (RRU IF4/IF5)
|
||||||
else if (ru->fh_north_asynch_in) {
|
if (ru->fh_north_asynch_in) {
|
||||||
if (subframe_select(&ru->frame_parms,subframe)!=SF_UL)
|
if (subframe_select(&ru->frame_parms,subframe)!=SF_UL)
|
||||||
ru->fh_north_asynch_in(ru,&frame,&subframe);
|
ru->fh_north_asynch_in(ru,&frame,&subframe);
|
||||||
}
|
}
|
||||||
@@ -2066,6 +1769,9 @@ extern void feptx_prec(RU_t *ru);
|
|||||||
extern void init_fep_thread(RU_t *ru,pthread_attr_t *attr);
|
extern void init_fep_thread(RU_t *ru,pthread_attr_t *attr);
|
||||||
extern void init_feptx_thread(RU_t *ru,pthread_attr_t *attr);
|
extern void init_feptx_thread(RU_t *ru,pthread_attr_t *attr);
|
||||||
|
|
||||||
|
extern void configure_ru(int idx,
|
||||||
|
void *arg);
|
||||||
|
|
||||||
void reset_proc(RU_t *ru) {
|
void reset_proc(RU_t *ru) {
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
@@ -2083,6 +1789,8 @@ void reset_proc(RU_t *ru) {
|
|||||||
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void* ru_thread_control( void* param );
|
||||||
|
|
||||||
void init_RU_proc(RU_t *ru) {
|
void init_RU_proc(RU_t *ru) {
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
@@ -2172,11 +1880,9 @@ void init_RU_proc(RU_t *ru) {
|
|||||||
|
|
||||||
|
|
||||||
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
|
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
|
||||||
if(emulate_rf)
|
if (emulate_rf) pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
||||||
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
|
|
||||||
|
|
||||||
if (get_nprocs() > 4)
|
if (get_nprocs() > 4) pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
||||||
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
|
|
||||||
|
|
||||||
|
|
||||||
if (ru->function == NGFI_RRU_IF4p5) {
|
if (ru->function == NGFI_RRU_IF4p5) {
|
||||||
@@ -2356,156 +2062,12 @@ void kill_RU_proc(int inst)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_capabilities(RU_t *ru,RRU_capabilities_t *cap) {
|
|
||||||
|
|
||||||
FH_fmt_options_t fmt = cap->FH_fmt;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
int found_band=0;
|
|
||||||
|
|
||||||
LOG_I(PHY,"RRU %d, num_bands %d, looking for band %d\n",ru->idx,cap->num_bands,ru->frame_parms.eutra_band);
|
|
||||||
for (i=0;i<cap->num_bands;i++) {
|
|
||||||
LOG_I(PHY,"band %d on RRU %d\n",cap->band_list[i],ru->idx);
|
|
||||||
if (ru->frame_parms.eutra_band == cap->band_list[i]) {
|
|
||||||
found_band=1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found_band == 0) {
|
|
||||||
LOG_I(PHY,"Couldn't find target EUTRA band %d on RRU %d\n",ru->frame_parms.eutra_band,ru->idx);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ru->if_south) {
|
|
||||||
case LOCAL_RF:
|
|
||||||
AssertFatal(1==0, "This RU should not have a local RF, exiting\n");
|
|
||||||
return(0);
|
|
||||||
break;
|
|
||||||
case REMOTE_IF5:
|
|
||||||
if (fmt == OAI_IF5_only || fmt == OAI_IF5_and_IF4p5) return(0);
|
|
||||||
break;
|
|
||||||
case REMOTE_IF4p5:
|
|
||||||
if (fmt == OAI_IF4p5_only || fmt == OAI_IF5_and_IF4p5) return(0);
|
|
||||||
break;
|
|
||||||
case REMOTE_MBP_IF5:
|
|
||||||
if (fmt == MBP_IF5) return(0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG_I(PHY,"No compatible Fronthaul interface found for RRU %d\n", ru->idx);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char rru_format_options[4][20] = {"OAI_IF5_only","OAI_IF4p5_only","OAI_IF5_and_IF4p5","MBP_IF5"};
|
|
||||||
|
|
||||||
char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"};
|
|
||||||
char ru_if_formats[4][20] = {"LOCAL_RF","REMOTE_OAI_IF5","REMOTE_MBP_IF5","REMOTE_OAI_IF4p5"};
|
|
||||||
|
|
||||||
void configure_ru(int idx,
|
|
||||||
void *arg) {
|
|
||||||
|
|
||||||
RU_t *ru = RC.ru[idx];
|
|
||||||
RRU_config_t *config = (RRU_config_t *)arg;
|
|
||||||
RRU_capabilities_t *capabilities = (RRU_capabilities_t*)arg;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
LOG_I(PHY, "Received capabilities from RRU %d\n",idx);
|
|
||||||
|
|
||||||
|
|
||||||
if (capabilities->FH_fmt < MAX_FH_FMTs) LOG_I(PHY, "RU FH options %s\n",rru_format_options[capabilities->FH_fmt]);
|
|
||||||
|
|
||||||
AssertFatal((ret=check_capabilities(ru,capabilities)) == 0,
|
|
||||||
"Cannot configure RRU %d, check_capabilities returned %d\n", idx,ret);
|
|
||||||
// take antenna capabilities of RRU
|
|
||||||
ru->nb_tx = capabilities->nb_tx[0];
|
|
||||||
ru->nb_rx = capabilities->nb_rx[0];
|
|
||||||
|
|
||||||
// Pass configuration to RRU
|
|
||||||
LOG_I(PHY, "Using %s fronthaul (%d), band %d \n",ru_if_formats[ru->if_south],ru->if_south,ru->frame_parms.eutra_band);
|
|
||||||
// wait for configuration
|
|
||||||
config->FH_fmt = ru->if_south;
|
|
||||||
config->num_bands = 1;
|
|
||||||
config->band_list[0] = ru->frame_parms.eutra_band;
|
|
||||||
config->tx_freq[0] = ru->frame_parms.dl_CarrierFreq;
|
|
||||||
config->rx_freq[0] = ru->frame_parms.ul_CarrierFreq;
|
|
||||||
config->tdd_config[0] = ru->frame_parms.tdd_config;
|
|
||||||
config->tdd_config_S[0] = ru->frame_parms.tdd_config_S;
|
|
||||||
config->att_tx[0] = ru->att_tx;
|
|
||||||
config->att_rx[0] = ru->att_rx;
|
|
||||||
config->N_RB_DL[0] = ru->frame_parms.N_RB_DL;
|
|
||||||
config->N_RB_UL[0] = ru->frame_parms.N_RB_UL;
|
|
||||||
config->threequarter_fs[0] = ru->frame_parms.threequarter_fs;
|
|
||||||
if (ru->if_south==REMOTE_IF4p5) {
|
|
||||||
config->prach_FreqOffset[0] = ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset;
|
|
||||||
config->prach_ConfigIndex[0] = ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
|
|
||||||
LOG_I(PHY,"REMOTE_IF4p5: prach_FrequOffset %d, prach_ConfigIndex %d\n",
|
|
||||||
config->prach_FreqOffset[0],config->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
|
||||||
int i;
|
|
||||||
for (i=0;i<4;i++) {
|
|
||||||
config->emtc_prach_CElevel_enable[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i];
|
|
||||||
config->emtc_prach_FreqOffset[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i];
|
|
||||||
config->emtc_prach_ConfigIndex[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
init_frame_parms(&ru->frame_parms,1);
|
|
||||||
phy_init_RU(ru);
|
|
||||||
}
|
|
||||||
|
|
||||||
void configure_rru(int idx,
|
|
||||||
void *arg) {
|
|
||||||
|
|
||||||
RRU_config_t *config = (RRU_config_t *)arg;
|
|
||||||
RU_t *ru = RC.ru[idx];
|
|
||||||
|
|
||||||
ru->frame_parms.eutra_band = config->band_list[0];
|
|
||||||
ru->frame_parms.dl_CarrierFreq = config->tx_freq[0];
|
|
||||||
ru->frame_parms.ul_CarrierFreq = config->rx_freq[0];
|
|
||||||
if (ru->frame_parms.dl_CarrierFreq == ru->frame_parms.ul_CarrierFreq) {
|
|
||||||
ru->frame_parms.frame_type = TDD;
|
|
||||||
ru->frame_parms.tdd_config = config->tdd_config[0];
|
|
||||||
ru->frame_parms.tdd_config_S = config->tdd_config_S[0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ru->frame_parms.frame_type = FDD;
|
|
||||||
ru->att_tx = config->att_tx[0];
|
|
||||||
ru->att_rx = config->att_rx[0];
|
|
||||||
ru->frame_parms.N_RB_DL = config->N_RB_DL[0];
|
|
||||||
ru->frame_parms.N_RB_UL = config->N_RB_UL[0];
|
|
||||||
ru->frame_parms.threequarter_fs = config->threequarter_fs[0];
|
|
||||||
ru->frame_parms.pdsch_config_common.referenceSignalPower = ru->max_pdschReferenceSignalPower-config->att_tx[0];
|
|
||||||
if (ru->function==NGFI_RRU_IF4p5) {
|
|
||||||
ru->frame_parms.att_rx = ru->att_rx;
|
|
||||||
ru->frame_parms.att_tx = ru->att_tx;
|
|
||||||
|
|
||||||
LOG_I(PHY,"Setting ru->function to NGFI_RRU_IF4p5, prach_FrequOffset %d, prach_ConfigIndex %d, att (%d,%d)\n",
|
|
||||||
config->prach_FreqOffset[0],config->prach_ConfigIndex[0],ru->att_tx,ru->att_rx);
|
|
||||||
ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset = config->prach_FreqOffset[0];
|
|
||||||
ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex = config->prach_ConfigIndex[0];
|
|
||||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
|
||||||
for (int i=0;i<4;i++) {
|
|
||||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] = config->emtc_prach_CElevel_enable[0][i];
|
|
||||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i] = config->emtc_prach_FreqOffset[0][i];
|
|
||||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i] = config->emtc_prach_ConfigIndex[0][i];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
init_frame_parms(&ru->frame_parms,1);
|
|
||||||
|
|
||||||
fill_rf_config(ru,ru->rf_config_file);
|
|
||||||
|
|
||||||
|
|
||||||
// phy_init_RU(ru);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_precoding_weights(PHY_VARS_eNB *eNB) {
|
void init_precoding_weights(PHY_VARS_eNB *eNB) {
|
||||||
|
|
||||||
@@ -2628,16 +2190,10 @@ void set_function_spec_param(RU_t *ru)
|
|||||||
ru->feprx = (get_nprocs()<=2 || !fepw) ? fep_full : fep_full; // this is frequency-shift + DFTs
|
ru->feprx = (get_nprocs()<=2 || !fepw) ? fep_full : fep_full; // this is frequency-shift + DFTs
|
||||||
ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
|
ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
|
||||||
ru->feptx_ofdm = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
|
ru->feptx_ofdm = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
|
||||||
if (ru->if_timing == synch_to_other) {
|
ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
|
||||||
ru->fh_south_in = fh_slave_south_in; // synchronize to master
|
ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
|
||||||
ru->fh_south_out = fh_if5_mobipass_south_out; // use send_IF5 for mobipass
|
ru->fh_south_asynch_in = NULL; // no asynchronous UL
|
||||||
ru->fh_south_asynch_in = fh_if5_south_asynch_in_mobipass; // UL is asynchronous
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
|
|
||||||
ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
|
|
||||||
ru->fh_south_asynch_in = NULL; // no asynchronous UL
|
|
||||||
}
|
|
||||||
ru->start_rf = NULL; // no local RF
|
ru->start_rf = NULL; // no local RF
|
||||||
ru->stop_rf = NULL;
|
ru->stop_rf = NULL;
|
||||||
ru->start_if = start_if; // need to start if interface for IF5
|
ru->start_if = start_if; // need to start if interface for IF5
|
||||||
@@ -2912,10 +2468,7 @@ void RCconfig_RU(void) {
|
|||||||
RC.ru[j]->function = NGFI_RAU_IF4p5;
|
RC.ru[j]->function = NGFI_RAU_IF4p5;
|
||||||
RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE;
|
RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE;
|
||||||
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if5_mobipass") == 0) {
|
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if5_mobipass") == 0) {
|
||||||
RC.ru[j]->if_south = REMOTE_IF5;
|
AssertFatal(1==0,"Mobipass support is depracated\n");
|
||||||
RC.ru[j]->function = NGFI_RAU_IF5;
|
|
||||||
RC.ru[j]->if_timing = synch_to_other;
|
|
||||||
RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF5_MOBIPASS;
|
|
||||||
}
|
}
|
||||||
if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) RC.ru[j]->is_slave=1;
|
if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) RC.ru[j]->is_slave=1;
|
||||||
else RC.ru[j]->is_slave=0;
|
else RC.ru[j]->is_slave=0;
|
||||||
@@ -2936,257 +2489,3 @@ void RCconfig_RU(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void* ru_thread_control( void* param ) {
|
|
||||||
|
|
||||||
|
|
||||||
RU_t *ru = (RU_t*)param;
|
|
||||||
RU_proc_t *proc = &ru->proc;
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
ssize_t msg_len;
|
|
||||||
int len, ret;
|
|
||||||
|
|
||||||
|
|
||||||
// Start IF device if any
|
|
||||||
if (ru->start_if) {
|
|
||||||
LOG_I(PHY,"Starting IF interface for RU %d\n",ru->idx);
|
|
||||||
AssertFatal(
|
|
||||||
ru->start_if(ru,NULL) == 0, "Could not start the IF device\n");
|
|
||||||
|
|
||||||
if (ru->if_south != LOCAL_RF) wait_eNBs();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ru->state = (ru->function==eNodeB_3GPP)? RU_RUN : RU_IDLE;
|
|
||||||
LOG_I(PHY,"Control channel ON for RU %d\n", ru->idx);
|
|
||||||
|
|
||||||
while (!oai_exit) // Change the cond
|
|
||||||
{
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t); // TODO : check what should be the msg len
|
|
||||||
|
|
||||||
if (ru->state == RU_IDLE && ru->if_south != LOCAL_RF)
|
|
||||||
send_tick(ru);
|
|
||||||
|
|
||||||
|
|
||||||
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
|
||||||
&rru_config_msg,
|
|
||||||
msg_len))<0) {
|
|
||||||
LOG_D(PHY,"Waiting msg for RU %d\n", ru->idx);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch(rru_config_msg.type)
|
|
||||||
{
|
|
||||||
case RAU_tick: // RRU
|
|
||||||
if (ru->if_south != LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Received Tick msg...Ignoring\n");
|
|
||||||
}else{
|
|
||||||
LOG_I(PHY,"Tick received from RAU\n");
|
|
||||||
|
|
||||||
if (send_capab(ru) == 0) ru->state = RU_CONFIG;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_capabilities: // RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_capab msg...Ignoring\n");
|
|
||||||
|
|
||||||
else{
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
|
||||||
|
|
||||||
AssertFatal(rru_config_msg.len==msg_len,"Received capabilities with incorrect length (%d!=%d)\n",(int)rru_config_msg.len,(int)msg_len);
|
|
||||||
LOG_I(PHY,"Received capabilities from RRU %d (len %d/%d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",ru->idx,
|
|
||||||
(int)rru_config_msg.len,(int)msg_len,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_pdschReferenceSignalPower[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_rxgain[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_tx[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_rx[0]);
|
|
||||||
|
|
||||||
configure_ru(ru->idx,(RRU_capabilities_t *)&rru_config_msg.msg[0]);
|
|
||||||
|
|
||||||
// send config
|
|
||||||
if (send_config(ru,rru_config_msg) == 0) ru->state = RU_CONFIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_config: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Configuration received from RAU (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n",
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
configure_rru(ru->idx, (void*)&rru_config_msg.msg[0]);
|
|
||||||
|
|
||||||
|
|
||||||
fill_rf_config(ru,ru->rf_config_file);
|
|
||||||
init_frame_parms(&ru->frame_parms,1);
|
|
||||||
ru->frame_parms.nb_antennas_rx = ru->nb_rx;
|
|
||||||
phy_init_RU(ru);
|
|
||||||
|
|
||||||
//if (ru->is_slave == 1) lte_sync_time_init(&ru->frame_parms);
|
|
||||||
|
|
||||||
if (ru->rfdevice.is_init != 1){
|
|
||||||
ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (ru->rfdevice.trx_config_func) AssertFatal((ru->rfdevice.trx_config_func(&ru->rfdevice,&ru->openair0_cfg)==0),
|
|
||||||
"Failed to configure RF device for RU %d\n",ru->idx);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (setup_RU_buffers(ru)!=0) {
|
|
||||||
printf("Exiting, cannot initialize RU Buffers\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// send CONFIG_OK
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_config_ok;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t);
|
|
||||||
LOG_I(PHY,"Sending CONFIG_OK to RAU %d\n", ru->idx);
|
|
||||||
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send CONFIG_OK to RAU\n",ru->idx);
|
|
||||||
reset_proc(ru);
|
|
||||||
ru->state = RU_READY;
|
|
||||||
} else LOG_E(PHY,"Received RRU_config msg...Ignoring\n");
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_config_ok: // RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_config_ok msg...Ignoring\n");
|
|
||||||
else{
|
|
||||||
|
|
||||||
if (setup_RU_buffers(ru)!=0) {
|
|
||||||
printf("Exiting, cannot initialize RU Buffers\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set state to RUN for Master RU, Others on SYNC
|
|
||||||
ru->state = (ru->is_slave == 1) ? RU_SYNC : RU_RUN ;
|
|
||||||
ru->in_synch = 0;
|
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY, "Signaling main thread that RU %d (is_slave %d) is ready in state %s\n",ru->idx,ru->is_slave,ru_states[ru->state]);
|
|
||||||
pthread_mutex_lock(&RC.ru_mutex);
|
|
||||||
RC.ru_mask &= ~(1<<ru->idx);
|
|
||||||
pthread_cond_signal(&RC.ru_cond);
|
|
||||||
pthread_mutex_unlock(&RC.ru_mutex);
|
|
||||||
|
|
||||||
wait_sync("ru_thread_control");
|
|
||||||
|
|
||||||
// send start
|
|
||||||
rru_config_msg.type = RRU_start;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t); // TODO: set to correct msg len
|
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY,"Sending Start to RRU %d\n", ru->idx);
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),"Failed to send msg to RU %d\n",ru->idx);
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&proc->mutex_ru);
|
|
||||||
proc->instance_cnt_ru = 1;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_ru);
|
|
||||||
if (pthread_cond_signal(&proc->cond_ru_thread) != 0) {
|
|
||||||
LOG_E( PHY, "ERROR pthread_cond_signal for RU %d\n",ru->idx);
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_start: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Start received from RAU\n");
|
|
||||||
|
|
||||||
if (ru->state == RU_READY){
|
|
||||||
|
|
||||||
LOG_I(PHY, "Signaling main thread that RU %d is ready\n",ru->idx);
|
|
||||||
pthread_mutex_lock(&RC.ru_mutex);
|
|
||||||
RC.ru_mask &= ~(1<<ru->idx);
|
|
||||||
pthread_cond_signal(&RC.ru_cond);
|
|
||||||
pthread_mutex_unlock(&RC.ru_mutex);
|
|
||||||
|
|
||||||
wait_sync("ru_thread_control");
|
|
||||||
|
|
||||||
ru->state = (ru->is_slave == 1) ? RU_SYNC : RU_RUN ;
|
|
||||||
ru->cmd = EMPTY;
|
|
||||||
pthread_mutex_lock(&proc->mutex_ru);
|
|
||||||
proc->instance_cnt_ru = 1;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_ru);
|
|
||||||
if (pthread_cond_signal(&proc->cond_ru_thread) != 0) {
|
|
||||||
LOG_E( PHY, "ERROR pthread_cond_signal for RU %d\n",ru->idx);
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else LOG_E(PHY,"RRU not ready, cannot start\n");
|
|
||||||
|
|
||||||
} else LOG_E(PHY,"Received RRU_start msg...Ignoring\n");
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_sync_ok: //RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_config_ok msg...Ignoring\n");
|
|
||||||
else{
|
|
||||||
if (ru->is_slave == 1){
|
|
||||||
LOG_I(PHY,"Received RRU_sync_ok from RRU %d\n",ru->idx);
|
|
||||||
// Just change the state of the RRU to unblock ru_thread()
|
|
||||||
ru->state = RU_RUN;
|
|
||||||
}else LOG_E(PHY,"Received RRU_sync_ok from a master RRU...Ignoring\n");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RRU_frame_resynch: //RRU
|
|
||||||
if (ru->if_south != LOCAL_RF) LOG_E(PHY,"Received RRU frame resynch message, should not happen in RAU\n");
|
|
||||||
else {
|
|
||||||
LOG_I(PHY,"Received RRU_frame_resynch command\n");
|
|
||||||
ru->cmd = RU_FRAME_RESYNCH;
|
|
||||||
ru->cmdval = ((uint16_t*)&rru_config_msg.msg[0])[0];
|
|
||||||
LOG_I(PHY,"Received Frame Resynch messaage with value %d\n",ru->cmdval);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_stop: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Stop received from RAU\n");
|
|
||||||
|
|
||||||
if (ru->state == RU_RUN || ru->state == RU_ERROR){
|
|
||||||
|
|
||||||
LOG_I(PHY,"Stopping RRU\n");
|
|
||||||
ru->state = RU_READY;
|
|
||||||
// TODO: stop ru_thread
|
|
||||||
}else{
|
|
||||||
LOG_I(PHY,"RRU not running, can't stop\n");
|
|
||||||
}
|
|
||||||
}else LOG_E(PHY,"Received RRU_stop msg...Ignoring\n");
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (ru->if_south != LOCAL_RF){
|
|
||||||
if (ru->state == RU_IDLE){
|
|
||||||
// Keep sending TICK
|
|
||||||
send_tick(ru);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
} // switch
|
|
||||||
} //else
|
|
||||||
|
|
||||||
|
|
||||||
}//while
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user