Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
12c6a740
Commit
12c6a740
authored
Oct 01, 2019
by
Nick Ho
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adjust framework of lte-enb-nbiot.c
parent
38207390
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
152 additions
and
109 deletions
+152
-109
openair1/PHY/NBIoT_TRANSPORT/SIB_NB_IoT.c
openair1/PHY/NBIoT_TRANSPORT/SIB_NB_IoT.c
+2
-2
openair1/PHY/defs_L1_NB_IoT.h
openair1/PHY/defs_L1_NB_IoT.h
+3
-0
openair1/SCHED_NBIOT/phy_procedures_lte_eNb_nbiot.c
openair1/SCHED_NBIOT/phy_procedures_lte_eNb_nbiot.c
+5
-5
openair2/LAYER2/MAC/main_NB_IoT.c
openair2/LAYER2/MAC/main_NB_IoT.c
+1
-0
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.c
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.c
+1
-1
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.h
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.h
+0
-9
openair2/PHY_INTERFACE/IF_Module_NB_IoT.c
openair2/PHY_INTERFACE/IF_Module_NB_IoT.c
+0
-1
targets/RT/USER/lte-enb-nbiot.c
targets/RT/USER/lte-enb-nbiot.c
+140
-91
No files found.
openair1/PHY/NBIoT_TRANSPORT/SIB_NB_IoT.c
View file @
12c6a740
...
@@ -347,8 +347,8 @@ int generate_NDLSCH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
...
@@ -347,8 +347,8 @@ int generate_NDLSCH_NB_IoT(PHY_VARS_eNB_NB_IoT *eNB,
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
/
///////////////////////////////////////////////////////////////////////////////////////////
int
generate_NPDCCH_NB_IoT
(
NB_IoT_eNB_NPDCCH_t
*
DCI_1
,
int
generate_NPDCCH_NB_IoT
(
NB_IoT_eNB_NPDCCH_t
*
DCI_1
,
// add _1 to solve compliation error
int32_t
**
txdataF
,
int32_t
**
txdataF
,
int16_t
amp
,
int16_t
amp
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
...
...
openair1/PHY/defs_L1_NB_IoT.h
View file @
12c6a740
...
@@ -270,6 +270,9 @@ typedef struct {
...
@@ -270,6 +270,9 @@ typedef struct {
int
frame_tx
;
int
frame_tx
;
/// frame to act upon for reception
/// frame to act upon for reception
int
frame_rx
;
int
frame_rx
;
uint16_t
HFN
;
/// \brief Instance count for RXn-TXnp4 processing thread.
/// \brief Instance count for RXn-TXnp4 processing thread.
/// \internal This variable is protected by \ref mutex_rxtx.
/// \internal This variable is protected by \ref mutex_rxtx.
int
instance_cnt_rxtx
;
int
instance_cnt_rxtx
;
...
...
openair1/SCHED_NBIOT/phy_procedures_lte_eNb_nbiot.c
View file @
12c6a740
...
@@ -3059,7 +3059,7 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
...
@@ -3059,7 +3059,7 @@ void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
void
eNB_fep_full
(
PHY_VARS_eNB
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
)
{
void
eNB_fep_full
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
)
{
int
l
;
int
l
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
...
@@ -3099,9 +3099,9 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
...
@@ -3099,9 +3099,9 @@ void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
}
}
}
}
void
eNB_fep_rru_if5
(
PHY_VARS_eNB
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
)
{
void
eNB_fep_rru_if5
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
)
{
eNB_proc_t
*
proc
=&
eNB
->
proc
;
eNB_proc_
NB_IoT_
t
*
proc
=&
eNB
->
proc
;
uint8_t
seqno
=
0
;
uint8_t
seqno
=
0
;
/// **** send_IF5 of rxdata to BBU **** ///
/// **** send_IF5 of rxdata to BBU **** ///
...
@@ -3115,9 +3115,9 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
...
@@ -3115,9 +3115,9 @@ void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_NB_IoT_t *proc_rxtx) {
}
}
void
do_prach
(
PHY_VARS_eNB
*
eNB
,
int
frame
,
int
subframe
)
{
void
do_prach
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
frame
,
int
subframe
)
{
eNB_proc_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_
NB_IoT_
t
*
proc
=
&
eNB
->
proc
;
// LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
// LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
if
(
frame
%
2
==
0
&&
subframe
==
9
)
if
(
frame
%
2
==
0
&&
subframe
==
9
)
...
...
openair2/LAYER2/MAC/main_NB_IoT.c
View file @
12c6a740
...
@@ -12,6 +12,7 @@
...
@@ -12,6 +12,7 @@
#include "LAYER2/MAC/defs_NB_IoT.h"
#include "LAYER2/MAC/defs_NB_IoT.h"
#include "LAYER2/MAC/proto_NB_IoT.h"
#include "LAYER2/MAC/proto_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
#include "PHY_INTERFACE/IF_Module_NB_IoT.h"
#include "vars_NB_IoT.h"
#include "vars_NB_IoT.h"
#include "RRC/NBIOT/proto_NB_IoT.h"
#include "RRC/NBIOT/proto_NB_IoT.h"
...
...
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.c
View file @
12c6a740
#include "
IF_Module_L2_primitives
_NB_IoT.h"
#include "
PHY_INTERFACE/IF_Module
_NB_IoT.h"
#include "LAYER2/MAC/proto_NB_IoT.h"
#include "LAYER2/MAC/proto_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
...
...
openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.h
deleted
100644 → 0
View file @
38207390
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
//#include "LAYER2/MAC/extern.h"
#ifndef __IF_MODULE_L2_PRIMITIVES_NB_IOT_H__
#define __IF_MODULE_L2_PRIMITIVES_NB_IOT_H__
#endif
openair2/PHY_INTERFACE/IF_Module_NB_IoT.c
View file @
12c6a740
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
#include "openair2/PHY_INTERFACE/IF_Module_L2_primitives_NB_IoT.h"
#include "openair1/SCHED_NBIOT/IF_Module_L1_primitives_NB_IoT.h"
#include "openair1/SCHED_NBIOT/IF_Module_L1_primitives_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
#include "LAYER2/MAC/extern_NB_IoT.h"
//#include "LAYER2/MAC/proto_NB_IoT.h"
//#include "LAYER2/MAC/proto_NB_IoT.h"
...
...
targets/RT/USER/lte-enb-nbiot.c
View file @
12c6a740
...
@@ -137,12 +137,10 @@ struct timespec end_fh;
...
@@ -137,12 +137,10 @@ struct timespec end_fh;
int
end_fh_sf
;
int
end_fh_sf
;
void
init_eNB_NB_IoT
(
eNB_func_NB_IoT_t
node_function
[],
eNB_timing_NB_IoT_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
,
int
,
int
);
void
init_eNB_NB_IoT
(
eNB_func_NB_IoT_t
node_function
[],
eNB_timing_NB_IoT_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
,
int
,
int
);
extern
void
do_prach
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
frame
,
int
subframe
);
/**********************************************************Other structure***************************************************************/
/**********************************************************Other structure***************************************************************/
void
do_OFDM_mod_rt
(
int
subframe
,
PHY_VARS_eNB_NB_IoT
*
phy_vars_eNB
)
void
do_OFDM_mod_rt
_NB_IoT
(
int
subframe
,
PHY_VARS_eNB_NB_IoT
*
phy_vars_eNB
)
{
{
int
CC_id
=
phy_vars_eNB
->
proc
.
CC_id
;
int
CC_id
=
phy_vars_eNB
->
proc
.
CC_id
;
...
@@ -231,7 +229,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB_NB_IoT *phy_vars_eNB)
...
@@ -231,7 +229,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB_NB_IoT *phy_vars_eNB)
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN
,
0
);
}
}
void
tx_fh_if5
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
void
tx_fh_if5
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
proc
->
timestamp_tx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
proc
->
timestamp_tx
&
0xffffffff
);
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
...
@@ -240,7 +238,7 @@ void tx_fh_if5(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
...
@@ -240,7 +238,7 @@ void tx_fh_if5(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
}
}
void
tx_fh_if5_mobipass
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
void
tx_fh_if5_mobipass
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
proc
->
timestamp_tx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
proc
->
timestamp_tx
&
0xffffffff
);
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
...
@@ -248,7 +246,7 @@ void tx_fh_if5_mobipass(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
...
@@ -248,7 +246,7 @@ void tx_fh_if5_mobipass(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
send_IF5
(
eNB
,
proc
->
timestamp_tx
,
proc
->
subframe_tx
,
&
seqno
,
IF5_MOBIPASS
);
send_IF5
(
eNB
,
proc
->
timestamp_tx
,
proc
->
subframe_tx
,
&
seqno
,
IF5_MOBIPASS
);
}
}
void
tx_fh_if4p5
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
void
tx_fh_if4p5
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
)
{
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
if
((
eNB
->
frame_parms
.
frame_type
==
FDD
)
||
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
((
eNB
->
frame_parms
.
frame_type
==
TDD
)
&&
(
subframe_select
(
&
eNB
->
frame_parms
,
proc
->
subframe_tx
)
!=
SF_UL
)))
(
subframe_select
(
&
eNB
->
frame_parms
,
proc
->
subframe_tx
)
!=
SF_UL
)))
...
@@ -256,7 +254,7 @@ void tx_fh_if4p5(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
...
@@ -256,7 +254,7 @@ void tx_fh_if4p5(PHY_VARS_eNB_NB_IoT *eNB,L1_rxtx_proc_t *proc) {
}
}
void
proc_tx_high0
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
void
proc_tx_high0
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc
,
eNB_rxtx_proc_NB_IoT_t
*
proc
,
relaying_type_t
r_type
,
relaying_type_t
r_type
,
PHY_VARS_RN_NB_IoT
*
rn
)
{
PHY_VARS_RN_NB_IoT
*
rn
)
{
...
@@ -266,6 +264,7 @@ void proc_tx_high0(PHY_VARS_eNB_NB_IoT *eNB,
...
@@ -266,6 +264,7 @@ void proc_tx_high0(PHY_VARS_eNB_NB_IoT *eNB,
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB
+
offset
,
proc
->
frame_tx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB
+
offset
,
proc
->
frame_tx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB
+
offset
,
proc
->
subframe_tx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB
+
offset
,
proc
->
subframe_tx
);
// issue here
phy_procedures_eNB_TX_NB_IoT
(
eNB
,
proc
,
1
);
phy_procedures_eNB_TX_NB_IoT
(
eNB
,
proc
,
1
);
/* we're done, let the next one proceed */
/* we're done, let the next one proceed */
...
@@ -283,14 +282,14 @@ void proc_tx_high0(PHY_VARS_eNB_NB_IoT *eNB,
...
@@ -283,14 +282,14 @@ void proc_tx_high0(PHY_VARS_eNB_NB_IoT *eNB,
}
}
void
proc_tx_high
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
void
proc_tx_high
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
,
L1_rxtx_proc_t
*
proc
,
relaying_type_t
r_type
,
relaying_type_t
r_type
,
PHY_VARS_RN_NB_IoT
*
rn
)
{
PHY_VARS_RN_NB_IoT
*
rn
)
{
// do PHY high
// do PHY high
proc_tx_high0
(
eNB
,
proc
,
r_type
,
rn
);
proc_tx_high0
_NB_IoT
(
eNB
,
proc
,
r_type
,
rn
);
// if TX fronthaul go ahead
// if TX fronthaul go ahead
if
(
eNB
->
tx_fh
)
eNB
->
tx_fh
(
eNB
,
proc
);
if
(
eNB
->
tx_fh
)
eNB
->
tx_fh
(
eNB
,
proc
);
...
@@ -298,16 +297,16 @@ void proc_tx_high(PHY_VARS_eNB_NB_IoT *eNB,
...
@@ -298,16 +297,16 @@ void proc_tx_high(PHY_VARS_eNB_NB_IoT *eNB,
}
}
void
proc_tx_full
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
void
proc_tx_full
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc
,
eNB_rxtx_proc_NB_IoT_t
*
proc
,
relaying_type_t
r_type
,
relaying_type_t
r_type
,
PHY_VARS_RN_NB_IoT
*
rn
)
{
PHY_VARS_RN_NB_IoT
*
rn
)
{
// do PHY high
// do PHY high
proc_tx_high0
(
eNB
,
proc
,
r_type
,
rn
);
proc_tx_high0
_NB_IoT
(
eNB
,
proc
,
r_type
,
rn
);
// do OFDM modulation
// do OFDM modulation
do_OFDM_mod_rt
(
proc
->
subframe_tx
,
eNB
);
do_OFDM_mod_rt
_NB_IoT
(
proc
->
subframe_tx
,
eNB
);
// if TX fronthaul go ahead
// if TX fronthaul go ahead
if
(
eNB
->
tx_fh
)
eNB
->
tx_fh
(
eNB
,
proc
);
if
(
eNB
->
tx_fh
)
eNB
->
tx_fh
(
eNB
,
proc
);
...
@@ -322,18 +321,72 @@ static void wait_system_ready (char *message, volatile int *start_flag) {
...
@@ -322,18 +321,72 @@ static void wait_system_ready (char *message, volatile int *start_flag) {
int
i
=
0
;
int
i
=
0
;
while
((
!
oai_exit
)
&&
(
*
start_flag
==
0
))
{
while
((
!
oai_exit
)
&&
(
*
start_flag
==
0
))
{
LOG_N
(
EMU
,
message
,
indicator
[
i
]);
//
LOG_N(EMU, message, indicator[i]);
fflush
(
stdout
);
fflush
(
stdout
);
i
=
(
i
+
1
)
%
(
sizeof
(
indicator
)
/
sizeof
(
indicator
[
0
]));
i
=
(
i
+
1
)
%
(
sizeof
(
indicator
)
/
sizeof
(
indicator
[
0
]));
usleep
(
200000
);
usleep
(
200000
);
}
}
LOG_D
(
EMU
,
"
\n
"
);
//
LOG_D(EMU,"\n");
}
}
#endif
#endif
static
void
*
eNB_thread_single
(
void
*
param
)
{
static
inline
int
rxtx_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc
,
char
*
thread_name
)
{
///start_meas(&softmodem_stats_rxtx_sf);
// ****************************************
// Common RX procedures subframe n
if
((
eNB
->
do_prach
)
&&
((
eNB
->
node_function
!=
NGFI_RCC_IF4p5_NB_IoT
)))
eNB
->
do_prach
(
eNB
,
proc
->
frame_rx
,
proc
->
subframe_rx
);
phy_procedures_eNB_common_RX
(
eNB
,
proc
);
// UE-specific RX processing for subframe n
///////////////////////////////////// for NB-IoT testing ////////////////////////
// for NB-IoT testing // activating only TX part
if
(
eNB
->
proc_uespec_rx
)
eNB
->
proc_uespec_rx
(
eNB
,
proc
,
no_relay
);
////////////////////////////////////END///////////////////////
//npusch_procedures(eNB,proc,data_or_control);
//fill_rx_indication(eNB,i,frame,subframe);
//////////////////////////////////// for IF Module/scheduler testing
pthread_mutex_lock
(
&
eNB
->
UL_INFO_mutex
);
eNB
->
UL_INFO
.
frame
=
proc
->
frame_rx
;
eNB
->
UL_INFO
.
subframe
=
proc
->
subframe_rx
;
eNB
->
UL_INFO
.
module_id
=
eNB
->
Mod_id
;
eNB
->
UL_INFO
.
CC_id
=
eNB
->
CC_id
;
eNB
->
UL_INFO
.
hypersfn
=
proc
->
HFN
;
eNB
->
if_inst_NB_IoT
->
UL_indication
(
&
eNB
->
UL_INFO
);
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
//LOG_I(PHY,"After UL_indication\n");
// *****************************************
// TX processing for subframe n+4
// run PHY TX procedures the one after the other for all CCs to avoid race conditions
// (may be relaxed in the future for performance reasons)
// *****************************************
//if (wait_CCs(proc)<0) return(-1);
if
(
oai_exit
)
return
(
-
1
);
if
(
eNB
->
proc_tx
)
eNB
->
proc_tx
(
eNB
,
proc
,
no_relay
,
NULL
);
if
(
release_thread
(
&
proc
->
mutex_rxtx
,
&
proc
->
instance_cnt_rxtx
,
thread_name
)
<
0
)
return
(
-
1
);
/// stop_meas( &softmodem_stats_rxtx_sf );
return
(
0
);
}
static
void
*
eNB_thread_single_NB_IoT
(
void
*
param
)
{
static
int
eNB_thread_single_status
;
static
int
eNB_thread_single_status
;
...
@@ -369,7 +422,7 @@ static void* eNB_thread_single( void* param ) {
...
@@ -369,7 +422,7 @@ static void* eNB_thread_single( void* param ) {
wait_sync
(
"eNB_thread_single"
);
wait_sync
(
"eNB_thread_single"
);
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
if
((
eNB
->
node_function
<
NGFI_RRU_IF5
)
&&
(
eNB
->
mac_enabled
==
1
))
if
((
eNB
->
node_function
<
NGFI_RRU_IF5
_NB_IoT
)
&&
(
eNB
->
mac_enabled
==
1
))
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
#endif
#endif
...
@@ -494,8 +547,8 @@ static void* eNB_thread_single( void* param ) {
...
@@ -494,8 +547,8 @@ static void* eNB_thread_single( void* param ) {
wakeup_slaves
(
proc
);
wakeup_slaves
(
proc
);
//if (rxtx_NB_IoT(eNB_NB_IoT
,proc_rxtx,"eNB_thread_single") < 0) break;
if
(
rxtx_NB_IoT
(
eNB
,
proc_rxtx
,
"eNB_thread_single"
)
<
0
)
break
;
if
(
rxtx
(
eNB
,
proc_rxtx
,
"eNB_thread_single"
)
<
0
)
break
;
//
if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break;
}
}
...
@@ -506,13 +559,12 @@ static void* eNB_thread_single( void* param ) {
...
@@ -506,13 +559,12 @@ static void* eNB_thread_single( void* param ) {
}
}
/*!
/*!
* \brief The RX UE-specific and TX thread of eNB.
* \brief The RX UE-specific and TX thread of eNB.
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
*/
*/
static
void
*
eNB_thread_rxtx
(
void
*
param
)
{
static
void
*
eNB_thread_rxtx
_NB_IoT
(
void
*
param
)
{
static
int
eNB_thread_rxtx_status
;
static
int
eNB_thread_rxtx_status
;
...
@@ -546,11 +598,7 @@ static void* eNB_thread_rxtx( void* param ) {
...
@@ -546,11 +598,7 @@ static void* eNB_thread_rxtx( void* param ) {
if
(
eNB
->
CC_id
==
0
)
if
(
eNB
->
CC_id
==
0
)
{
{
//#ifdef NB_IOT
if
(
rxtx_NB_IoT
(
eNB
,
proc
,
thread_name
)
<
0
)
break
;
// if(rxtx_NB_IoT(eNB,proc,thread_name)<0) break;
//#else
if
(
rxtx
(
eNB
,
proc
,
thread_name
)
<
0
)
break
;
//#endif
}
}
}
// while !oai_exit
}
// while !oai_exit
...
@@ -565,7 +613,7 @@ static void* eNB_thread_rxtx( void* param ) {
...
@@ -565,7 +613,7 @@ static void* eNB_thread_rxtx( void* param ) {
// asynchronous UL with IF5 (RCC,RAU,eNodeB_BBU)
// asynchronous UL with IF5 (RCC,RAU,eNodeB_BBU)
void
fh_if5_asynch_UL
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
fh_if5_asynch_UL
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
...
@@ -605,7 +653,7 @@ void fh_if5_asynch_UL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -605,7 +653,7 @@ void fh_if5_asynch_UL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU)
// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU)
void
fh_if4p5_asynch_UL
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
fh_if4p5_asynch_UL
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
...
@@ -648,7 +696,7 @@ void fh_if4p5_asynch_UL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -648,7 +696,7 @@ void fh_if4p5_asynch_UL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
}
}
void
fh_if5_asynch_DL
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
fh_if5_asynch_DL
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
...
@@ -686,7 +734,7 @@ void fh_if5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -686,7 +734,7 @@ void fh_if5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
}
}
}
}
void
fh_if4p5_asynch_DL
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
fh_if4p5_asynch_DL
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
...
@@ -752,7 +800,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -752,7 +800,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
// intialize this to zero after we're done with the subframe
// intialize this to zero after we're done with the subframe
proc
->
symbol_mask
[
*
subframe
]
=
0
;
proc
->
symbol_mask
[
*
subframe
]
=
0
;
do_OFDM_mod_rt
(
*
subframe
,
eNB
);
do_OFDM_mod_rt
_NB_IoT
(
*
subframe
,
eNB
);
}
}
...
@@ -762,7 +810,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -762,7 +810,7 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
*/
*/
static
void
*
eNB_thread_asynch_rxtx
(
void
*
param
)
{
static
void
*
eNB_thread_asynch_rxtx
_NB_IoT
(
void
*
param
)
{
static
int
eNB_thread_asynch_rxtx_status
;
static
int
eNB_thread_asynch_rxtx_status
;
...
@@ -809,7 +857,7 @@ static void* eNB_thread_asynch_rxtx( void* param ) {
...
@@ -809,7 +857,7 @@ static void* eNB_thread_asynch_rxtx( void* param ) {
}
}
void
rx_rf
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
rx_rf
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
...
@@ -956,7 +1004,7 @@ void rx_rf(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -956,7 +1004,7 @@ void rx_rf(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
}
}
void
rx_fh_if5
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
rx_fh_if5
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
...
@@ -990,7 +1038,7 @@ void rx_fh_if5(PHY_VARS_eNB_NB_IoT *eNB,int *frame, int *subframe) {
...
@@ -990,7 +1038,7 @@ void rx_fh_if5(PHY_VARS_eNB_NB_IoT *eNB,int *frame, int *subframe) {
}
}
void
rx_fh_if4p5
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
rx_fh_if4p5
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=
&
eNB
->
proc
;
...
@@ -1072,7 +1120,7 @@ void rx_fh_if4p5(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -1072,7 +1120,7 @@ void rx_fh_if4p5(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
}
}
void
rx_fh_slave
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
void
rx_fh_slave
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
*
frame
,
int
*
subframe
)
{
// This case is for synchronization to another thread
// This case is for synchronization to another thread
// it just waits for an external event. The actual rx_fh is handle by the asynchronous RX thread
// it just waits for an external event. The actual rx_fh is handle by the asynchronous RX thread
eNB_proc_NB_IoT_t
*
proc
=&
eNB
->
proc
;
eNB_proc_NB_IoT_t
*
proc
=&
eNB
->
proc
;
...
@@ -1088,7 +1136,7 @@ void rx_fh_slave(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
...
@@ -1088,7 +1136,7 @@ void rx_fh_slave(PHY_VARS_eNB_NB_IoT *eNB,int *frame,int *subframe) {
uint32_t
sync_corr
[
307200
]
__attribute__
((
aligned
(
32
)));
uint32_t
sync_corr
[
307200
]
__attribute__
((
aligned
(
32
)));
// This thread run the initial synchronization like a UE
// This thread run the initial synchronization like a UE
void
*
eNB_thread_synch
(
void
*
arg
)
{
void
*
eNB_thread_synch
_NB_IoT
(
void
*
arg
)
{
PHY_VARS_eNB_NB_IoT
*
eNB
=
(
PHY_VARS_eNB_NB_IoT
*
)
arg
;
PHY_VARS_eNB_NB_IoT
*
eNB
=
(
PHY_VARS_eNB_NB_IoT
*
)
arg
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
...
@@ -1177,7 +1225,7 @@ void *eNB_thread_synch(void *arg) {
...
@@ -1177,7 +1225,7 @@ void *eNB_thread_synch(void *arg) {
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
*/
*/
static
void
*
eNB_thread_FH
(
void
*
param
)
{
static
void
*
eNB_thread_FH
_NB_IoT
(
void
*
param
)
{
static
int
eNB_thread_FH_status
;
static
int
eNB_thread_FH_status
;
...
@@ -1195,7 +1243,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1195,7 +1243,7 @@ static void* eNB_thread_FH( void* param ) {
wait_sync
(
"eNB_thread_FH"
);
wait_sync
(
"eNB_thread_FH"
);
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
if
(
eNB
->
node_function
<
NGFI_RRU_IF5
)
if
(
eNB
->
node_function
<
NGFI_RRU_IF5
_NB_IoT
)
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
#endif
#endif
...
@@ -1261,7 +1309,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1261,7 +1309,7 @@ static void* eNB_thread_FH( void* param ) {
Each rf chain is is addressed by the card number and the chain on the card. The
Each rf chain is is addressed by the card number and the chain on the card. The
rf_map specifies for each CC, on which rf chain the mapping should start. Multiple
rf_map specifies for each CC, on which rf chain the mapping should start. Multiple
antennas are mapped to successive RF chains on the same card. */
antennas are mapped to successive RF chains on the same card. */
int
setup_eNB_buffers
(
PHY_VARS_eNB_NB_IoT
**
phy_vars_eNB
,
openair0_config_t
*
openair0_cfg
)
{
int
setup_eNB_buffers
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
**
phy_vars_eNB
,
openair0_config_t
*
openair0_cfg
)
{
int
i
,
j
;
int
i
,
j
;
int
CC_id
,
card
,
ant
;
int
CC_id
,
card
,
ant
;
...
@@ -1352,18 +1400,15 @@ int setup_eNB_buffers(PHY_VARS_eNB_NB_IoT **phy_vars_eNB, openair0_config_t *ope
...
@@ -1352,18 +1400,15 @@ int setup_eNB_buffers(PHY_VARS_eNB_NB_IoT **phy_vars_eNB, openair0_config_t *ope
}
}
int
start_if
(
PHY_VARS_eNB_NB_IoT
*
eNB
)
{
int
start_if
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
)
{
return
(
eNB
->
ifdevice
.
trx_start_func
(
&
eNB
->
ifdevice
));
return
(
eNB
->
ifdevice
.
trx_start_func
(
&
eNB
->
ifdevice
));
}
}
int
start_rf
(
PHY_VARS_eNB_NB_IoT
*
eNB
)
{
int
start_rf
_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
)
{
return
(
eNB
->
rfdevice
.
trx_start_func
(
&
eNB
->
rfdevice
));
return
(
eNB
->
rfdevice
.
trx_start_func
(
&
eNB
->
rfdevice
));
}
}
extern
void
eNB_fep_rru_if5
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
);
extern
void
eNB_fep_full
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
L1_rxtx_proc_t
*
proc
);
...
@@ -1411,6 +1456,10 @@ static void* eNB_thread_prach_NB_IoT( void* param ) {
...
@@ -1411,6 +1456,10 @@ static void* eNB_thread_prach_NB_IoT( void* param ) {
return
&
eNB_thread_prach_status
;
return
&
eNB_thread_prach_status
;
}
}
extern
void
eNB_fep_rru_if5_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
);
extern
void
eNB_fep_full_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
eNB_rxtx_proc_NB_IoT_t
*
proc_rxtx
);
extern
void
do_prach_NB_IoT
(
PHY_VARS_eNB_NB_IoT
*
eNB
,
int
frame
,
int
subframe
);
///Modify to NB-IoT merge
///Modify to NB-IoT merge
void
init_eNB_NB_IoT
(
eNB_func_NB_IoT_t
node_function
[],
eNB_timing_NB_IoT_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
eth_params
,
int
single_thread_flag
,
int
wait_for_sync
)
{
void
init_eNB_NB_IoT
(
eNB_func_NB_IoT_t
node_function
[],
eNB_timing_NB_IoT_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
eth_params
,
int
single_thread_flag
,
int
wait_for_sync
)
{
...
@@ -1449,16 +1498,16 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1449,16 +1498,16 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
case
NGFI_RRU_IF5_NB_IoT
:
case
NGFI_RRU_IF5_NB_IoT
:
eNB
->
do_prach
=
NULL
;
eNB
->
do_prach
=
NULL
;
eNB
->
do_precoding
=
0
;
eNB
->
do_precoding
=
0
;
eNB
->
fep
=
eNB_fep_rru_if5
;
eNB
->
fep
=
eNB_fep_rru_if5
_NB_IoT
;
eNB
->
td
=
NULL
;
eNB
->
td
=
NULL
;
eNB
->
te
=
NULL
;
eNB
->
te
=
NULL
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_tx
=
NULL
;
eNB
->
proc_tx
=
NULL
;
eNB
->
tx_fh
=
NULL
;
eNB
->
tx_fh
=
NULL
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
_NB_IoT
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
_NB_IoT
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
_NB_IoT
;
eNB
->
fh_asynch
=
fh_if5_asynch_DL
;
eNB
->
fh_asynch
=
fh_if5_asynch_DL
_NB_IoT
;
if
(
oaisim_flag
==
0
)
{
if
(
oaisim_flag
==
0
)
{
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
CC_id
]);
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
CC_id
]);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
@@ -1478,17 +1527,17 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1478,17 +1527,17 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
break
;
break
;
case
NGFI_RRU_IF4p5_NB_IoT
:
case
NGFI_RRU_IF4p5_NB_IoT
:
eNB
->
do_precoding
=
0
;
eNB
->
do_precoding
=
0
;
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
_NB_IoT
;
eNB
->
fep
=
eNB_fep_full
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
fep
=
eNB_fep_full
_NB_IoT
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
td
=
NULL
;
eNB
->
td
=
NULL
;
eNB
->
te
=
NULL
;
eNB
->
te
=
NULL
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_tx
=
NULL
;
//proc_tx_rru_if4p5;
eNB
->
proc_tx
=
NULL
;
//proc_tx_rru_if4p5;
eNB
->
tx_fh
=
NULL
;
eNB
->
tx_fh
=
NULL
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
_NB_IoT
;
eNB
->
fh_asynch
=
fh_if4p5_asynch_DL
;
eNB
->
fh_asynch
=
fh_if4p5_asynch_DL
_NB_IoT
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
_NB_IoT
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
_NB_IoT
;
if
(
oaisim_flag
==
0
)
{
if
(
oaisim_flag
==
0
)
{
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
CC_id
]);
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
CC_id
]);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
@@ -1511,18 +1560,18 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1511,18 +1560,18 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
break
;
break
;
case
eNodeB_3GPP_NB_IoT
:
case
eNodeB_3GPP_NB_IoT
:
eNB
->
do_precoding
=
eNB
->
frame_parms
.
nb_antennas_tx
!=
eNB
->
frame_parms
.
nb_antenna_ports_eNB
;
eNB
->
do_precoding
=
eNB
->
frame_parms
.
nb_antennas_tx
!=
eNB
->
frame_parms
.
nb_antenna_ports_eNB
;
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
_NB_IoT
;
eNB
->
fep
=
eNB_fep_full
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
fep
=
eNB_fep_full
_NB_IoT
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
////////////////////// NB-IoT testing ////////////////////
////////////////////// NB-IoT testing ////////////////////
//eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX;
//eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX_NB_IoT
;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX_NB_IoT
;
eNB
->
proc_tx
=
proc_tx_full
;
eNB
->
proc_tx
=
proc_tx_full
_NB_IoT
;
eNB
->
tx_fh
=
NULL
;
eNB
->
tx_fh
=
NULL
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
_NB_IoT
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
_NB_IoT
;
eNB
->
start_if
=
NULL
;
eNB
->
start_if
=
NULL
;
eNB
->
fh_asynch
=
NULL
;
eNB
->
fh_asynch
=
NULL
;
if
(
oaisim_flag
==
0
)
{
if
(
oaisim_flag
==
0
)
{
...
@@ -1537,26 +1586,26 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1537,26 +1586,26 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
break
;
break
;
case
eNodeB_3GPP_BBU_NB_IoT
:
case
eNodeB_3GPP_BBU_NB_IoT
:
eNB
->
do_precoding
=
eNB
->
frame_parms
.
nb_antennas_tx
!=
eNB
->
frame_parms
.
nb_antenna_ports_eNB
;
eNB
->
do_precoding
=
eNB
->
frame_parms
.
nb_antennas_tx
!=
eNB
->
frame_parms
.
nb_antenna_ports_eNB
;
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
_NB_IoT
;
eNB
->
fep
=
eNB_fep_full
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
fep
=
eNB_fep_full
_NB_IoT
;
//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
;
eNB
->
proc_tx
=
proc_tx_full
;
eNB
->
proc_tx
=
proc_tx_full
_NB_IoT
;
if
(
eNB
->
node_timing
==
synch_to_other
)
{
if
(
eNB
->
node_timing
==
synch_to_other
)
{
eNB
->
tx_fh
=
tx_fh_if5_mobipass
;
eNB
->
tx_fh
=
tx_fh_if5_mobipass
_NB_IoT
;
eNB
->
rx_fh
=
rx_fh_slave
;
eNB
->
rx_fh
=
rx_fh_slave
_NB_IoT
;
eNB
->
fh_asynch
=
fh_if5_asynch_UL
;
eNB
->
fh_asynch
=
fh_if5_asynch_UL
_NB_IoT
;
}
}
else
{
else
{
eNB
->
tx_fh
=
tx_fh_if5
;
eNB
->
tx_fh
=
tx_fh_if5
_NB_IoT
;
eNB
->
rx_fh
=
rx_fh_if5
;
eNB
->
rx_fh
=
rx_fh_if5
_NB_IoT
;
eNB
->
fh_asynch
=
NULL
;
eNB
->
fh_asynch
=
NULL
;
}
}
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
_NB_IoT
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
...
@@ -1571,17 +1620,17 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1571,17 +1620,17 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
break
;
break
;
case
NGFI_RCC_IF4p5_NB_IoT
:
case
NGFI_RCC_IF4p5_NB_IoT
:
eNB
->
do_precoding
=
0
;
eNB
->
do_precoding
=
0
;
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
_NB_IoT
;
eNB
->
fep
=
NULL
;
eNB
->
fep
=
NULL
;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
_NB_IoT
;
eNB
->
proc_tx
=
proc_tx_high
;
eNB
->
proc_tx
=
proc_tx_high
_NB_IoT
;
eNB
->
tx_fh
=
tx_fh_if4p5
;
eNB
->
tx_fh
=
tx_fh_if4p5
_NB_IoT
;
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
rx_fh
=
rx_fh_if4p5
_NB_IoT
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
_NB_IoT
;
eNB
->
fh_asynch
=
(
eNB
->
node_timing
==
synch_to_other
)
?
fh_if4p5_asynch_UL
:
NULL
;
eNB
->
fh_asynch
=
(
eNB
->
node_timing
==
synch_to_other
)
?
fh_if4p5_asynch_UL
_NB_IoT
:
NULL
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
CC_id
],
eNB
->
eth_params
);
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
CC_id
],
eNB
->
eth_params
);
...
@@ -1595,18 +1644,18 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
...
@@ -1595,18 +1644,18 @@ void init_eNB_NB_IoT(eNB_func_NB_IoT_t node_function[], eNB_timing_NB_IoT_t node
break
;
break
;
case
NGFI_RAU_IF4p5_NB_IoT
:
case
NGFI_RAU_IF4p5_NB_IoT
:
eNB
->
do_precoding
=
0
;
eNB
->
do_precoding
=
0
;
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
_NB_IoT
;
eNB
->
fep
=
NULL
;
eNB
->
fep
=
NULL
;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
td
=
ulsch_decoding_data_NB_IoT
;
//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
te
=
dlsch_encoding_NB_IoT
;
//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
;
eNB
->
proc_uespec_rx
=
phy_procedures_eNB_uespec_RX
_NB_IoT
;
eNB
->
proc_tx
=
proc_tx_high
;
eNB
->
proc_tx
=
proc_tx_high
_NB_IoT
;
eNB
->
tx_fh
=
tx_fh_if4p5
;
eNB
->
tx_fh
=
tx_fh_if4p5
_NB_IoT
;
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
rx_fh
=
rx_fh_if4p5
_NB_IoT
;
eNB
->
fh_asynch
=
(
eNB
->
node_timing
==
synch_to_other
)
?
fh_if4p5_asynch_UL
:
NULL
;
eNB
->
fh_asynch
=
(
eNB
->
node_timing
==
synch_to_other
)
?
fh_if4p5_asynch_UL
_NB_IoT
:
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
_NB_IoT
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
rfdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
eNB
->
ifdevice
.
host_type
=
RRU_HOST
;
...
@@ -1707,12 +1756,12 @@ void init_eNB_proc_NB_IoT(int inst) {
...
@@ -1707,12 +1756,12 @@ void init_eNB_proc_NB_IoT(int inst) {
if
(
eNB
->
single_thread_flag
==
0
)
{
if
(
eNB
->
single_thread_flag
==
0
)
{
//the two threads that manage tw consecutive subframes
//the two threads that manage tw consecutive subframes
pthread_create
(
&
proc_rxtx
[
0
].
pthread_rxtx
,
attr0
,
eNB_thread_rxtx
,
&
proc_rxtx
[
0
]
);
pthread_create
(
&
proc_rxtx
[
0
].
pthread_rxtx
,
attr0
,
eNB_thread_rxtx
_NB_IoT
,
&
proc_rxtx
[
0
]
);
pthread_create
(
&
proc_rxtx
[
1
].
pthread_rxtx
,
attr1
,
eNB_thread_rxtx
,
&
proc_rxtx
[
1
]
);
pthread_create
(
&
proc_rxtx
[
1
].
pthread_rxtx
,
attr1
,
eNB_thread_rxtx
_NB_IoT
,
&
proc_rxtx
[
1
]
);
pthread_create
(
&
proc
->
pthread_FH
,
attr_FH
,
eNB_thread_FH
,
&
eNB
->
proc
);
pthread_create
(
&
proc
->
pthread_FH
,
attr_FH
,
eNB_thread_FH
_NB_IoT
,
&
eNB
->
proc
);
}
}
else
{
else
{
pthread_create
(
&
proc
->
pthread_single
,
attr_single
,
eNB_thread_single
,
&
eNB
->
proc
);
pthread_create
(
&
proc
->
pthread_single
,
attr_single
,
eNB_thread_single
_NB_IoT
,
&
eNB
->
proc
);
init_fep_thread
(
eNB
,
attr_fep
);
init_fep_thread
(
eNB
,
attr_fep
);
/*
/*
init_td_thread(eNB,attr_td);
init_td_thread(eNB,attr_td);
...
@@ -1720,13 +1769,13 @@ void init_eNB_proc_NB_IoT(int inst) {
...
@@ -1720,13 +1769,13 @@ void init_eNB_proc_NB_IoT(int inst) {
*/
*/
}
}
pthread_create
(
&
proc
->
pthread_prach
,
attr_prach
,
eNB_thread_prach_NB_IoT
,
&
eNB
->
proc
);
pthread_create
(
&
proc
->
pthread_prach
,
attr_prach
,
eNB_thread_prach_NB_IoT
,
&
eNB
->
proc
);
pthread_create
(
&
proc
->
pthread_synch
,
attr_synch
,
eNB_thread_synch
,
eNB
);
pthread_create
(
&
proc
->
pthread_synch
,
attr_synch
,
eNB_thread_synch
_NB_IoT
,
eNB
);
if
((
eNB
->
node_timing
==
synch_to_other
)
||
if
((
eNB
->
node_timing
==
synch_to_other
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF5
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF5
_NB_IoT
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF4p5
))
(
eNB
->
node_function
==
NGFI_RRU_IF4p5
_NB_IoT
))
pthread_create
(
&
proc
->
pthread_asynch_rxtx
,
attr_asynch
,
eNB_thread_asynch_rxtx
,
&
eNB
->
proc
);
pthread_create
(
&
proc
->
pthread_asynch_rxtx
,
attr_asynch
,
eNB_thread_asynch_rxtx
_NB_IoT
,
&
eNB
->
proc
);
char
name
[
16
];
char
name
[
16
];
if
(
eNB
->
single_thread_flag
==
0
)
{
if
(
eNB
->
single_thread_flag
==
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment