Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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
Michael Black
OpenXG UE
Commits
e284118c
Commit
e284118c
authored
Feb 28, 2021
by
Laurent Thomas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
record/replay for 5G, nrscope bug fix
parent
3ebe924d
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
668 additions
and
689 deletions
+668
-689
executables/main-ocp.c
executables/main-ocp.c
+2
-2
executables/nr-ru.c
executables/nr-ru.c
+3
-2
executables/nr-softmodem.c
executables/nr-softmodem.c
+1
-1
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+1
-1
executables/ocp-gnb.c
executables/ocp-gnb.c
+1
-1
executables/softmodem-common.c
executables/softmodem-common.c
+1
-1
executables/softmodem-common.h
executables/softmodem-common.h
+2
-2
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+62
-46
openair1/PHY/TOOLS/nr_phy_scope.h
openair1/PHY/TOOLS/nr_phy_scope.h
+1
-7
openair1/PHY/TOOLS/phy_scope_interface.c
openair1/PHY/TOOLS/phy_scope_interface.c
+1
-0
openair1/PHY/TOOLS/phy_scope_interface.h
openair1/PHY/TOOLS/phy_scope_interface.h
+19
-0
targets/ARCH/COMMON/record_player.c
targets/ARCH/COMMON/record_player.c
+15
-9
targets/ARCH/COMMON/record_player.h
targets/ARCH/COMMON/record_player.h
+11
-8
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+466
-476
targets/ARCH/iqplayer/iqplayer_lib.c
targets/ARCH/iqplayer/iqplayer_lib.c
+78
-129
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+2
-2
targets/RT/USER/lte-uesoftmodem.c
targets/RT/USER/lte-uesoftmodem.c
+2
-2
No files found.
executables/main-ocp.c
View file @
e284118c
...
...
@@ -1318,7 +1318,7 @@ int main ( int argc, char **argv ) {
// end of CI modifications
//getchar();
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
load_softscope
(
"enb"
,
NULL
);
itti_wait_tasks_end
();
...
...
@@ -1327,7 +1327,7 @@ int main ( int argc, char **argv ) {
// stop threads
if
(
RC
.
nb_inst
==
0
||
!
NODE_IS_CU
(
node_type
))
{
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
end_forms
();
LOG_I
(
ENB_APP
,
"stopping MODEM threads
\n
"
);
...
...
executables/nr-ru.c
View file @
e284118c
...
...
@@ -89,7 +89,7 @@ static int DEFBFW[] = {0x00007fff};
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
#include "T.h"
...
...
@@ -1593,7 +1593,8 @@ void *ru_thread( void *param ) {
for
(
aa
=
0
;
aa
<
ru
->
nb_rx
;
aa
++
)
memcpy
((
void
*
)
RC
.
gNB
[
0
]
->
common_vars
.
rxdataF
[
aa
],
(
void
*
)
ru
->
common
.
rxdataF
[
aa
],
fp
->
symbols_per_slot
*
fp
->
ofdm_symbol_size
*
sizeof
(
int32_t
));
if
(
IS_SOFTMODEM_DOSCOPE
&&
RC
.
gNB
[
0
]
->
scopeData
)
((
scopeData_t
*
)
RC
.
gNB
[
0
]
->
scopeData
)
->
slotFunc
(
ru
->
common
.
rxdataF
[
0
],
proc
->
tti_rx
,
RC
.
gNB
[
0
]
->
scopeData
);
// Do PRACH RU processing
int
prach_id
=
find_nr_prach_ru
(
ru
,
proc
->
frame_rx
,
proc
->
tti_rx
,
SEARCH_EXIST
);
...
...
executables/nr-softmodem.c
View file @
e284118c
...
...
@@ -900,7 +900,7 @@ if(!IS_SOFTMODEM_NOS1)
printf
(
"RC.nb_RU:%d
\n
"
,
RC
.
nb_RU
);
// once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
printf
(
"ALL RUs ready - init gNBs
\n
"
);
if
(
IS_SOFTMODEM_DO
FORMS
)
{
if
(
IS_SOFTMODEM_DO
SCOPE
)
{
sleep
(
1
);
scopeParms_t
p
;
p
.
argc
=&
argc
;
...
...
executables/nr-uesoftmodem.c
View file @
e284118c
...
...
@@ -551,7 +551,7 @@ int main( int argc, char **argv ) {
configure_linux
();
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
if
(
IS_SOFTMODEM_DO
FORMS
)
{
if
(
IS_SOFTMODEM_DO
SCOPE
)
{
load_softscope
(
"nr"
,
PHY_vars_UE_g
[
0
][
0
]);
}
...
...
executables/ocp-gnb.c
View file @
e284118c
...
...
@@ -996,7 +996,7 @@ int main( int argc, char **argv ) {
(
void
*
)
NULL
,
"time_meas"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
if
(
IS_SOFTMODEM_DO
FORMS
)
{
if
(
IS_SOFTMODEM_DO
SCOPE
)
{
scopeParms_t
tmp
=
{
&
argc
,
argv
,
&
ru
,
RC
.
gNB
[
0
]};
load_softscope
(
"nr"
,
&
tmp
);
}
...
...
executables/softmodem-common.c
View file @
e284118c
...
...
@@ -140,7 +140,7 @@ void get_common_options(uint32_t execmask) {
}
if
(
do_forms
)
{
set_softmodem_optmask
(
SOFTMODEM_DO
FORMS
_BIT
);
set_softmodem_optmask
(
SOFTMODEM_DO
SCOPE
_BIT
);
}
if
(
parallel_config
!=
NULL
)
set_parallel_conf
(
parallel_config
);
...
...
executables/softmodem-common.h
View file @
e284118c
...
...
@@ -188,7 +188,7 @@ extern "C"
#define SOFTMODEM_RFSIM_BIT (1<<10)
#define SOFTMODEM_BASICSIM_BIT (1<<11)
#define SOFTMODEM_SIML1_BIT (1<<12)
#define SOFTMODEM_DO
FORMS
_BIT (1<<15)
#define SOFTMODEM_DO
SCOPE
_BIT (1<<15)
#define SOFTMODEM_RECPLAY_BIT (1<<16)
#define SOFTMODEM_ENB_BIT (1<<20)
#define SOFTMODEM_GNB_BIT (1<<21)
...
...
@@ -204,7 +204,7 @@ extern "C"
#define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT)
#define IS_SOFTMODEM_BASICSIM ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT)
#define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT)
#define IS_SOFTMODEM_DO
FORMS ( get_softmodem_optmask() & SOFTMODEM_DOFORMS
_BIT)
#define IS_SOFTMODEM_DO
SCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE
_BIT)
#define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT)
#define IS_SOFTMODEM_ENB_BIT ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT)
#define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT)
...
...
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
e284118c
...
...
@@ -56,7 +56,7 @@ typedef struct OAIgraph {
double
*
waterFallAvg
;
boolean_t
initDone
;
int
iteration
;
void
(
*
gNBfunct
)
(
struct
OAIgraph
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
);
void
(
*
gNBfunct
)
(
struct
OAIgraph
*
graph
,
scopeData_t
*
p
,
int
UE_id
);
void
(
*
nrUEfunct
)(
struct
OAIgraph
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
);
}
OAIgraph_t
;
...
...
@@ -132,7 +132,7 @@ static void commonGraph(OAIgraph_t *graph, int type, FL_Coord x, FL_Coord y, FL_
graph
->
iteration
=
0
;
}
static
OAIgraph_t
gNBcommonGraph
(
void
(
*
funct
)
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
UE_id
),
static
OAIgraph_t
gNBcommonGraph
(
void
(
*
funct
)
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
UE_id
),
int
type
,
FL_Coord
x
,
FL_Coord
y
,
FL_Coord
w
,
FL_Coord
h
,
const
char
*
label
,
FL_COLOR
pointColor
)
{
OAIgraph_t
graph
;
commonGraph
(
&
graph
,
type
,
x
,
y
,
w
,
h
,
label
,
pointColor
);
...
...
@@ -223,7 +223,8 @@ static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int laye
static
void
genericWaterFall
(
OAIgraph_t
*
graph
,
scopeSample_t
*
values
,
const
int
datasize
,
const
int
divisions
,
const
char
*
label
)
{
if
(
values
==
NULL
)
return
;
return
;
fl_winset
(
FL_ObjWin
(
graph
->
graph
));
const
int
samplesPerPixel
=
datasize
/
graph
->
w
;
int
displayPart
=
graph
->
waterFallh
-
ScaleZone
;
...
...
@@ -318,10 +319,10 @@ static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const sc
}
}
static
void
gNBWaterFall
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
hy_vars_gnb
->
frame_parms
;
static
void
gNBWaterFall
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
->
gNB
->
frame_parms
;
//use 1st antenna
genericWaterFall
(
graph
,
(
scopeSample_t
*
)
p
hy_vars_
ru
->
common
.
rxdata
[
0
],
genericWaterFall
(
graph
,
(
scopeSample_t
*
)
p
->
ru
->
common
.
rxdata
[
0
],
frame_parms
->
samples_per_frame
,
frame_parms
->
slots_per_frame
,
"X axis:one frame in time"
);
}
...
...
@@ -339,31 +340,35 @@ static void timeSignal (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy
}
*/
static
void
timeResponse
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
const
int
len
=
2
*
p
hy_vars_gnb
->
frame_parms
.
ofdm_symbol_size
;
static
void
timeResponse
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
const
int
len
=
2
*
p
->
gNB
->
frame_parms
.
ofdm_symbol_size
;
float
*
values
,
*
time
;
oai_xygraph_getbuff
(
graph
,
&
time
,
&
values
,
len
,
0
);
const
int
ant
=
0
;
// display antenna 0 for each UE
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
scopeSample_t
*
data
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
[
ant
];
if
(
p
->
gNB
->
pusch_vars
&&
p
->
gNB
->
pusch_vars
[
ue
]
&&
p
->
gNB
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
&&
p
->
gNB
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
[
ant
]
)
{
scopeSample_t
*
data
=
(
scopeSample_t
*
)
p
->
gNB
->
pusch_vars
[
ue
]
->
ul_ch_estimates_time
[
ant
];
if
(
data
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
values
[
i
]
=
SquaredNorm
(
data
[
i
]);
}
if
(
data
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
values
[
i
]
=
SquaredNorm
(
data
[
i
]);
oai_xygraph
(
graph
,
time
,
values
,
len
,
ue
,
10
);
}
oai_xygraph
(
graph
,
time
,
values
,
len
,
ue
,
10
);
}
}
}
static
void
gNBfreqWaterFall
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
hy_vars_gnb
->
frame_parms
;
static
void
gNBfreqWaterFall
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
->
gNB
->
frame_parms
;
//use 1st antenna
genericWaterFall
(
graph
,
(
scopeSample_t
*
)
p
hy_vars_ru
->
common
.
rxdataF
[
0
]
,
frame_parms
->
samples_per_frame_wCP
,
genericWaterFall
(
graph
,
(
scopeSample_t
*
)
p
->
rxdataF
,
frame_parms
->
samples_per_frame_wCP
,
frame_parms
->
slots_per_frame
,
"X axis: Frequency domain, one frame"
);
"X axis: Frequency domain, one
sub
frame"
);
}
/*
...
...
@@ -375,16 +380,18 @@ static void frequencyResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU
}
*/
static
void
puschLLR
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
static
void
puschLLR
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
//int Qm = 2;
int
coded_bits_per_codeword
=
3
*
8
*
6144
+
12
;
// (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
int16_t
*
pusch_llr
=
(
int16_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
llr
;
float
*
llr
,
*
bit
;
oai_xygraph_getbuff
(
graph
,
&
bit
,
&
llr
,
coded_bits_per_codeword
,
ue
);
if
(
p
->
gNB
->
pusch_vars
&&
p
->
gNB
->
pusch_vars
[
ue
]
&&
p
->
gNB
->
pusch_vars
[
ue
]
->
llr
)
{
int16_t
*
pusch_llr
=
(
int16_t
*
)
p
->
gNB
->
pusch_vars
[
ue
]
->
llr
;
float
*
llr
,
*
bit
;
oai_xygraph_getbuff
(
graph
,
&
bit
,
&
llr
,
coded_bits_per_codeword
,
ue
);
if
(
pusch_llr
)
{
for
(
int
i
=
0
;
i
<
coded_bits_per_codeword
;
i
++
)
{
llr
[
i
]
=
(
float
)
pusch_llr
[
i
];
}
...
...
@@ -394,16 +401,19 @@ static void puschLLR (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_v
}
}
static
void
puschIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
hy_vars_gnb
->
frame_parms
;
static
void
puschIQ
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=&
p
->
gNB
->
frame_parms
;
int
sz
=
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_slot
;
for
(
int
ue
=
0
;
ue
<
nb_UEs
;
ue
++
)
{
scopeSample_t
*
pusch_comp
=
(
scopeSample_t
*
)
phy_vars_gnb
->
pusch_vars
[
ue
]
->
rxdataF_comp
[
0
];
float
*
I
,
*
Q
;
oai_xygraph_getbuff
(
graph
,
&
I
,
&
Q
,
sz
,
ue
);
if
(
p
->
gNB
->
pusch_vars
&&
p
->
gNB
->
pusch_vars
[
ue
]
&&
p
->
gNB
->
pusch_vars
[
ue
]
->
rxdataF_comp
&&
p
->
gNB
->
pusch_vars
[
ue
]
->
rxdataF_comp
[
0
]
)
{
scopeSample_t
*
pusch_comp
=
(
scopeSample_t
*
)
p
->
gNB
->
pusch_vars
[
ue
]
->
rxdataF_comp
[
0
];
float
*
I
,
*
Q
;
oai_xygraph_getbuff
(
graph
,
&
I
,
&
Q
,
sz
,
ue
);
if
(
pusch_comp
)
{
for
(
int
k
=
0
;
k
<
sz
;
k
++
)
{
I
[
k
]
=
pusch_comp
[
k
].
r
;
Q
[
k
]
=
pusch_comp
[
k
].
i
;
...
...
@@ -414,7 +424,7 @@ static void puschIQ (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_va
}
}
static
void
pucchEnergy
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
static
void
pucchEnergy
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
// PUSCH I/Q of MF Output
/*
int32_t *pucch1ab_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1ab_stats[UE_id];
...
...
@@ -440,10 +450,10 @@ static void pucchEnergy (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *ph
*/
}
static
void
pucchIQ
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
static
void
pucchIQ
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
}
static
void
puschThroughtput
(
OAIgraph_t
*
graph
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
int
nb_UEs
)
{
static
void
puschThroughtput
(
OAIgraph_t
*
graph
,
scopeData_t
*
p
,
int
nb_UEs
)
{
// PUSCH Throughput
/*
float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}};
...
...
@@ -510,8 +520,7 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) {
static
const
int
scope_enb_num_ue
=
1
;
void
phy_scope_gNB
(
OAI_phy_scope_t
*
form
,
PHY_VARS_gNB
*
phy_vars_gnb
,
RU_t
*
phy_vars_ru
,
scopeData_t
*
p
,
int
UE_id
)
{
static
OAI_phy_scope_t
*
rememberForm
=
NULL
;
...
...
@@ -526,7 +535,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form,
int
i
=
0
;
while
(
form
->
graph
[
i
].
graph
)
{
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
+
i
,
p
hy_vars_gnb
,
phy_vars_ru
,
UE_id
);
form
->
graph
[
i
].
gNBfunct
(
form
->
graph
+
i
,
p
,
UE_id
);
i
++
;
}
...
...
@@ -534,7 +543,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form,
}
static
void
*
scope_thread_gNB
(
void
*
arg
)
{
scope
Parms_t
*
p
=
(
scopeParms
_t
*
)
arg
;
scope
Data_t
*
p
=
(
scopeData
_t
*
)
arg
;
//# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
//#endif
...
...
@@ -543,12 +552,6 @@ static void *scope_thread_gNB(void *arg) {
pthread_attr_init
(
&
atr
);
pthread_attr_getstacksize
(
&
atr
,
&
stksize
);
pthread_attr_setstacksize
(
&
atr
,
32
*
1024
*
1024
);
p
.
gNB
->
scopeData
=
calloc
(
sizeof
(
nrscope_t
));
nrscope_t
scope
=
(
nrscope_t
*
)
p
.
gNB
->
scopeData
;
scope
->
rxdataF
=
(
int32_t
**
)
malloc16
(
Prx
*
sizeof
(
int32_t
*
));
for
(
int
i
=
0
;
i
<
p
.
gNB
->
gNB_config
.
carrier_config
.
num_rx_ant
.
value
;
;
i
++
)
scope
->
rxdataF
[
i
]
=
(
scopeSample_t
*
)
malloc16_clear
(
p
->
gNB
.
frme_parms
.
samples_per_frame_wCP
*
sizeof
(
scopeSample_t
));
sleep
(
3
);
// no clean interthread barriers
int
fl_argc
=
1
;
char
*
name
=
"5G-gNB-scope"
;
...
...
@@ -557,18 +560,31 @@ static void *scope_thread_gNB(void *arg) {
OAI_phy_scope_t
*
form_gnb
=
create_phy_scope_gnb
();
while
(
!
oai_exit
)
{
phy_scope_gNB
(
form_gnb
,
p
->
gNB
,
p
->
ru
,
nb_ue
);
phy_scope_gNB
(
form_gnb
,
p
,
nb_ue
);
usleep
(
99
*
1000
);
}
return
NULL
;
}
static
void
copyRxdataF
(
int32_t
*
data
,
int
slot
,
void
*
scopeData
)
{
scopeData_t
*
scope
=
(
scopeData_t
*
)
scopeData
;
memcpy
(
scope
->
rxdataF
+
slot
*
scope
->
gNB
->
frame_parms
.
samples_per_slot_wCP
,
data
,
scope
->
gNB
->
frame_parms
.
samples_per_slot_wCP
);
}
void
gNBinitScope
(
scopeParms_t
*
p
)
{
static
scopeParms_t
parms
;
memcpy
(
&
parms
,
p
,
sizeof
(
parms
));
AssertFatal
(
p
->
gNB
->
scopeData
=
malloc
(
sizeof
(
scopeData_t
)),
""
);
scopeData_t
*
scope
=
(
scopeData_t
*
)
p
->
gNB
->
scopeData
;
scope
->
argc
=
p
->
argc
;
scope
->
argv
=
p
->
argv
;
scope
->
ru
=
p
->
ru
;
scope
->
gNB
=
p
->
gNB
;
scope
->
slotFunc
=
copyRxdataF
;
AssertFatal
(
scope
->
rxdataF
=
(
int32_t
*
)
calloc
(
p
->
gNB
->
frame_parms
.
samples_per_frame_wCP
*
sizeof
(
int32_t
),
1
),
""
);
pthread_t
forms_thread
;
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
&
parms
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
threadCreate
(
&
forms_thread
,
scope_thread_gNB
,
p
->
gNB
->
scopeData
,
"scope"
,
-
1
,
OAI_PRIORITY_RT_LOW
);
}
static
void
ueWaterFall
(
OAIgraph_t
*
graph
,
PHY_VARS_NR_UE
*
phy_vars_ue
,
int
eNB_id
,
int
UE_id
)
{
...
...
openair1/PHY/TOOLS/nr_phy_scope.h
View file @
e284118c
...
...
@@ -33,13 +33,7 @@
//#include "PHY/impl_defs_top.h"
#include "PHY/defs_nr_UE.h"
typedef
struct
{
int
*
argc
;
char
**
argv
;
RU_t
*
ru
;
PHY_VARS_gNB
*
gNB
;
}
scopeParms_t
;
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
extern
RAN_CONTEXT_t
RC
;
#endif
openair1/PHY/TOOLS/phy_scope_interface.c
View file @
e284118c
...
...
@@ -35,6 +35,7 @@
#include "phy_scope_interface.h"
#define SOFTSCOPE_ENDFUNC_IDX 0
static
loader_shlibfunc_t
scope_fdesc
[]
=
{{
"end_forms"
,
NULL
}};
int
load_softscope
(
char
*
exectype
,
void
*
initarg
)
{
...
...
openair1/PHY/TOOLS/phy_scope_interface.h
View file @
e284118c
...
...
@@ -29,7 +29,26 @@
* \note
* \warning
*/
#ifndef __PHY_SCOPE_INTERFACE_H__
#define __PHY_SCOPE_INTERFACE_H__
#include <openair1/PHY/defs_gNB.h>
typedef
struct
{
int
*
argc
;
char
**
argv
;
RU_t
*
ru
;
PHY_VARS_gNB
*
gNB
;
}
scopeParms_t
;
typedef
struct
scopeData_s
{
int
*
argc
;
char
**
argv
;
RU_t
*
ru
;
PHY_VARS_gNB
*
gNB
;
int32_t
*
rxdataF
;
void
(
*
slotFunc
)(
int32_t
*
data
,
int
slot
,
void
*
scopeData
);
}
scopeData_t
;
int
load_softscope
(
char
*
exectype
,
void
*
initarg
);
int
end_forms
(
void
)
;
#endif
targets/ARCH/COMMON/record_player.c
View file @
e284118c
...
...
@@ -68,8 +68,10 @@ int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_
*
recplay_conf
=
NULL
;
}
if
(
u_sf_replay
==
1
)
return
RECPLAY_REPLAYMODE
;
else
if
(
u_sf_record
==
1
)
return
RECPLAY_RECORDMODE
;
if
(
u_sf_replay
==
1
)
return
RECPLAY_REPLAYMODE
;
else
if
(
u_sf_record
==
1
)
return
RECPLAY_RECORDMODE
;
return
0
;
}
...
...
@@ -80,7 +82,7 @@ int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_
*/
void
iqrecorder_end
(
openair0_device
*
device
)
{
if
(
device
->
recplay_state
!=
NULL
)
{
// subframes store
iqfile_header_t
fh
=
{
device
->
type
,
device
->
openair0_cfg
->
tx_sample_advance
,
device
->
openair0_cfg
->
rx_bw
,
OAIIQFILE_ID
};
iqfile_header_t
fh
=
{
device
->
type
,
device
->
openair0_cfg
->
tx_sample_advance
,
device
->
openair0_cfg
->
rx_bw
,
0
,
OAIIQFILE_ID
};
recplay_state_t
*
rs
=
device
->
recplay_state
;
recplay_conf_t
*
rc
=
device
->
openair0_cfg
[
0
].
recplay_conf
;
rs
->
pFile
=
fopen
(
rc
->
u_sf_filename
,
"wb+"
);
...
...
@@ -91,16 +93,20 @@ void iqrecorder_end(openair0_device *device) {
unsigned
int
i
=
0
;
unsigned
int
modu
=
0
;
if
((
modu
=
rs
->
nb
_sample
s
%
10
)
!=
0
)
{
rs
->
nb
_sample
s
-=
modu
;
// store entire number of frames
if
((
modu
=
rs
->
nb
SamplesBlock
s
%
10
)
!=
0
)
{
rs
->
nb
SamplesBlock
s
-=
modu
;
// store entire number of frames
}
fh
.
nbSamplesBlocks
=
rs
->
nbSamplesBlocks
;
LOG_I
(
HW
,
"Writing file header to %s
\n
"
,
rc
->
u_sf_filename
);
fwrite
(
&
fh
,
sizeof
(
fh
),
1
,
rs
->
pFile
);
LOG_UI
(
HW
,
"Writing %u subframes to %s
\n
"
,
rs
->
nb_samples
,
rc
->
u_sf_filename
);
LOG_UI
(
HW
,
"Writing %u subframes to %s
\n
"
,
rs
->
nbSamplesBlocks
,
rc
->
u_sf_filename
);
uint8_t
*
ptr
=
(
uint8_t
*
)
rs
->
ms_sample
;
for
(
i
=
0
;
i
<
rs
->
nb_samples
;
i
++
)
{
fwrite
(
rs
->
ms_sample
+
i
,
sizeof
(
unsigned
char
),
sizeof
(
iqrec_t
),
rs
->
pFile
);
for
(
i
=
0
;
i
<
rs
->
nbSamplesBlocks
;
i
++
)
{
int
blockBytes
=
sizeof
(
iqrec_t
)
+
((
iqrec_t
*
)
ptr
)
->
nbBytes
;
fwrite
(
ptr
,
sizeof
(
unsigned
char
),
blockBytes
,
rs
->
pFile
);
ptr
+=
blockBytes
;
}
fclose
(
rs
->
pFile
);
...
...
@@ -112,4 +118,4 @@ void iqrecorder_end(openair0_device *device) {
rs
->
ms_sample
=
NULL
;
}
}
}
\ No newline at end of file
}
targets/ARCH/COMMON/record_player.h
View file @
e284118c
...
...
@@ -46,21 +46,22 @@ extern "C"
#define BELL_LABS_IQ_HEADER 0xabababababababab
#define BELL_LABS_IQ_PER_SF 7680 // Up to 5MHz bw for now
#define BELL_LABS_IQ_BYTES_PER_SF (BELL_LABS_IQ_PER_SF * 4)
#define MAX_BELL_LABS_IQ_BYTES_PER_SF BELL_LABS_IQ_BYTES_PER_SF*10
#define
OAIIQFILE_ID "OIQF"
#define
OAIIQFILE_ID {'O', 'I','Q','F'}
typedef
struct
{
uint64_t
devtype
;
uint64_t
tx_sample_advance
;
double
bw
;
unsigned
int
nbSamplesBlocks
;
char
oaiid
[
4
];
}
iqfile_header_t
;
typedef
struct
{
int64_t
header
;
int64_t
ts
;
int64_t
rfu1
;
int64_t
nbBytes
;
int64_t
rfu2
;
// pad for 256 bits alignement required by AVX2
unsigned
char
samples
[
BELL_LABS_IQ_BYTES_PER_SF
];
// iq's for one subframe
}
iqrec_t
;
#define DEF_NB_SF 120000 // default nb of sf or ms to capture (2 minutes at 5MHz)
#define DEF_SF_FILE "/tmp/iqfile" // default subframes file name
...
...
@@ -114,14 +115,16 @@ typedef struct {
int
use_mmap
;
// default is to use mmap
size_t
mapsize
;
FILE
*
pFile
;
int
mmapfd
;
int
iqfd
;
int
fd
;
iqrec_t
*
ms_sample
;
// memory for all subframes
unsigned
int
nb_samples
;
unsigned
int
nbSamplesBlocks
;
uint8_t
*
currentPtr
;
uint64_t
currentTs
;
unsigned
int
curSamplesBlock
;
int64_t
wrap_count
;
size_t
maxSizeBytes
;
}
recplay_state_t
;
#ifdef __cplusplus
}
#endif
...
...
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
View file @
e284118c
...
...
@@ -272,11 +272,10 @@ static int sync_to_gps(openair0_device *device) {
*/
static
int
trx_usrp_start
(
openair0_device
*
device
)
{
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
// setup GPIO for TDD, GPIO(4) = ATR_RX
//set data direction register (DDR) to output
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"DDR"
,
0xfff
,
0xfff
);
//set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually)
//set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually)
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"CTRL"
,
0x7f
,
0xfff
);
//set pins 4 (RX_TX_Switch) and 6 (Shutdown PA) to 1 when the radio is only receiving (ATR_RX)
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"ATR_RX"
,
(
1
<<
4
)
|
(
1
<<
6
),
0x7f
);
...
...
@@ -285,26 +284,24 @@ static int trx_usrp_start(openair0_device *device) {
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"ATR_XX"
,
(
1
<<
5
),
0x7f
);
// set the output pins to 1
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"OUT"
,
7
<<
7
,
0xf80
);
s
->
wait_for_first_pps
=
1
;
s
->
rx_count
=
0
;
s
->
tx_count
=
0
;
//s->first_tx = 1;
//s->first_rx = 1;
s
->
rx_timestamp
=
0
;
s
->
usrp
->
set_time_next_pps
(
uhd
::
time_spec_t
(
0.0
));
// wait for the pps to change
uhd
::
time_spec_t
time_last_pps
=
s
->
usrp
->
get_time_last_pps
();
while
(
time_last_pps
==
s
->
usrp
->
get_time_last_pps
())
{
boost
::
this_thread
::
sleep
(
boost
::
posix_time
::
milliseconds
(
1
));
}
uhd
::
stream_cmd_t
cmd
(
uhd
::
stream_cmd_t
::
STREAM_MODE_START_CONTINUOUS
);
cmd
.
time_spec
=
uhd
::
time_spec_t
(
1.0
);
cmd
.
time_spec
=
uhd
::
time_spec_t
(
1.0
);
cmd
.
stream_now
=
false
;
// start at constant delay
s
->
rx_stream
->
issue_stream_cmd
(
cmd
);
return
0
;
}
/*! \brief Terminate operation of the USRP transceiver -- free all associated resources
...
...
@@ -315,12 +312,11 @@ static void trx_usrp_end(openair0_device *device) {
return
;
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
if
(
s
==
NULL
)
return
;
iqrecorder_end
(
device
);
iqrecorder_end
(
device
);
}
/*! \brief Called to send samples to the USRP RF target
...
...
@@ -332,64 +328,59 @@ static void trx_usrp_end(openair0_device *device) {
@param flags flags must be set to TRUE if timestamp parameter needs to be applied
*/
static
int
trx_usrp_write
(
openair0_device
*
device
,
openair0_timestamp
timestamp
,
void
**
buff
,
int
nsamps
,
int
cc
,
int
flags
)
{
openair0_timestamp
timestamp
,
void
**
buff
,
int
nsamps
,
int
cc
,
int
flags
)
{
int
ret
=
0
;
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
int
nsamps2
;
// aligned to upper 32 or 16 byte boundary
int
flags_lsb
=
flags
&
0xff
;
int
flags_msb
=
(
flags
>>
8
)
&
0xff
;
int
end
;
openair0_thread_t
*
write_thread
=
&
device
->
write_thread
;
openair0_write_package_t
*
write_package
=
write_thread
->
write_package
;
AssertFatal
(
MAX_WRITE_THREAD_BUFFER_SIZE
>=
cc
,
"Do not support more than %d cc number
\n
"
,
MAX_WRITE_THREAD_BUFFER_SIZE
);
boolean_t
first_packet_state
=
false
,
last_packet_state
=
false
;
if
(
flags_lsb
==
2
)
{
// start of burst
// s->tx_md.start_of_burst = true;
// s->tx_md.end_of_burst = false;
first_packet_state
=
true
;
last_packet_state
=
false
;
}
else
if
(
flags_lsb
==
3
)
{
// end of burst
//s->tx_md.start_of_burst = false;
//s->tx_md.end_of_burst = true;
first_packet_state
=
false
;
last_packet_state
=
true
;
}
else
if
(
flags_lsb
==
4
)
{
// start and end
boolean_t
first_packet_state
=
false
,
last_packet_state
=
false
;
if
(
flags_lsb
==
2
)
{
// start of burst
// s->tx_md.start_of_burst = true;
// s->tx_md.end_of_burst = false;
first_packet_state
=
true
;
last_packet_state
=
false
;
}
else
if
(
flags_lsb
==
3
)
{
// end of burst
//s->tx_md.start_of_burst = false;
//s->tx_md.end_of_burst = true;
first_packet_state
=
false
;
last_packet_state
=
true
;
}
else
if
(
flags_lsb
==
4
)
{
// start and end
// s->tx_md.start_of_burst = true;
// s->tx_md.end_of_burst = true;
first_packet_state
=
true
;
last_packet_state
=
true
;
}
else
if
(
flags_lsb
==
1
)
{
// middle of burst
first_packet_state
=
true
;
last_packet_state
=
true
;
}
else
if
(
flags_lsb
==
1
)
{
// middle of burst
// s->tx_md.start_of_burst = false;
// s->tx_md.end_of_burst = false;
first_packet_state
=
false
;
last_packet_state
=
false
;
}
else
if
(
flags_lsb
==
10
)
{
// fail safe mode
// s->tx_md.has_time_spec = false;
// s->tx_md.start_of_burst = false;
// s->tx_md.end_of_burst = true;
first_packet_state
=
false
;
last_packet_state
=
true
;
}
first_packet_state
=
false
;
last_packet_state
=
false
;
}
else
if
(
flags_lsb
==
10
)
{
// fail safe mode
// s->tx_md.has_time_spec = false;
// s->tx_md.start_of_burst = false;
// s->tx_md.end_of_burst = true;
first_packet_state
=
false
;
last_packet_state
=
true
;
}
if
(
usrp_tx_thread
==
0
){
if
(
usrp_tx_thread
==
0
)
{
#if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2
=
(
nsamps
+
7
)
>>
3
;
__m256i
buff_tx
[
8
][
nsamps2
];
#else
#ifdef __AVX2__
nsamps2
=
(
nsamps
+
7
)
>>
3
;
__m256i
buff_tx
[
8
][
nsamps2
];
#else
nsamps2
=
(
nsamps
+
3
)
>>
2
;
__m128i
buff_tx
[
8
][
nsamps2
];
#endif
#endif
#elif defined(__arm__)
nsamps2
=
(
nsamps
+
3
)
>>
2
;
int16x8_t
buff_tx
[
8
][
nsamps2
];
...
...
@@ -417,8 +408,8 @@ static int trx_usrp_write(openair0_device *device,
s
->
tx_md
.
end_of_burst
=
last_packet_state
;
s
->
tx_md
.
time_spec
=
uhd
::
time_spec_t
::
from_ticks
(
timestamp
,
s
->
sample_rate
);
s
->
tx_count
++
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO
,
1
);
// bit 3 enables gpio (for backward compatibility)
if
(
flags_msb
&
8
)
{
// push GPIO bits 7-9 from flags_msb
...
...
@@ -427,7 +418,8 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"OUT"
,
gpio789
,
0x380
);
s
->
usrp
->
clear_command_time
();
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHING_GPIO
,
0
);
if
(
cc
>
1
)
{
std
::
vector
<
void
*>
buff_ptrs
;
...
...
@@ -436,18 +428,18 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI
buff_ptrs
.
push_back
(
&
(((
int16_t
*
)
buff_tx
[
i
])[
0
]));
ret
=
(
int
)
s
->
tx_stream
->
send
(
buff_ptrs
,
nsamps
,
s
->
tx_md
);
}
else
{
}
else
{
ret
=
(
int
)
s
->
tx_stream
->
send
(
&
(((
int16_t
*
)
buff_tx
[
0
])[
0
]),
nsamps
,
s
->
tx_md
);
}
if
(
ret
!=
nsamps
)
LOG_E
(
HW
,
"[xmit] tx samples %d != %d
\n
"
,
ret
,
nsamps
);
if
(
ret
!=
nsamps
)
LOG_E
(
HW
,
"[xmit] tx samples %d != %d
\n
"
,
ret
,
nsamps
);
return
ret
;
}
else
{
}
else
{
pthread_mutex_lock
(
&
write_thread
->
mutex_write
);
if
(
write_thread
->
count_write
>=
MAX_WRITE_THREAD_PACKAGE
){
if
(
write_thread
->
count_write
>=
MAX_WRITE_THREAD_PACKAGE
)
{
LOG_W
(
HW
,
"Buffer overflow, count_write = %d, start = %d end = %d, resetting write package
\n
"
,
write_thread
->
count_write
,
write_thread
->
start
,
write_thread
->
end
);
write_thread
->
end
=
write_thread
->
start
;
write_thread
->
count_write
=
0
;
...
...
@@ -460,15 +452,16 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI
write_package
[
end
].
first_packet
=
first_packet_state
;
write_package
[
end
].
last_packet
=
last_packet_state
;
write_package
[
end
].
flags_msb
=
flags_msb
;
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
write_package
[
end
].
buff
[
i
]
=
buff
[
i
];
write_thread
->
count_write
++
;
write_thread
->
end
=
(
write_thread
->
end
+
1
)
%
MAX_WRITE_THREAD_PACKAGE
;
pthread_cond_signal
(
&
write_thread
->
cond_write
);
pthread_mutex_unlock
(
&
write_thread
->
mutex_write
);
return
0
;
}
}
//-----------------------start--------------------------
...
...
@@ -480,12 +473,11 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI
@param antenna_id index of the antenna if the device has multiple antennas
@param flags flags must be set to TRUE if timestamp parameter needs to be applied
*/
void
*
trx_usrp_write_thread
(
void
*
arg
){
void
*
trx_usrp_write_thread
(
void
*
arg
)
{
int
ret
=
0
;
openair0_device
*
device
=
(
openair0_device
*
)
arg
;
openair0_thread_t
*
write_thread
=
&
device
->
write_thread
;
openair0_write_package_t
*
write_package
=
write_thread
->
write_package
;
usrp_state_t
*
s
;
int
nsamps2
;
// aligned to upper 32 or 16 byte boundary
int
start
;
...
...
@@ -497,11 +489,13 @@ void *trx_usrp_write_thread(void * arg){
signed
char
last_packet
;
int
flags_msb
;
while
(
1
){
while
(
1
)
{
pthread_mutex_lock
(
&
write_thread
->
mutex_write
);
while
(
write_thread
->
count_write
==
0
)
{
pthread_cond_wait
(
&
write_thread
->
cond_write
,
&
write_thread
->
mutex_write
);
// this unlocks mutex_rxtx while waiting and then locks it again
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD
,
1
);
s
=
(
usrp_state_t
*
)
device
->
priv
;
start
=
write_thread
->
start
;
...
...
@@ -518,38 +512,36 @@ void *trx_usrp_write_thread(void * arg){
/*if(write_thread->count_write != 0){
LOG_W(HW,"count write = %d, start = %d, end = %d\n", write_thread->count_write, write_thread->start, write_thread->end);
}*/
#if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2
=
(
nsamps
+
7
)
>>
3
;
__m256i
buff_tx
[
8
][
nsamps2
];
#else
nsamps2
=
(
nsamps
+
3
)
>>
2
;
__m128i
buff_tx
[
8
][
nsamps2
];
#endif
#elif defined(__arm__)
nsamps2
=
(
nsamps
+
3
)
>>
2
;
int16x8_t
buff_tx
[
8
][
nsamps2
];
#else
#error Unsupported CPU architecture, USRP device cannot be built
#endif
#if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2
=
(
nsamps
+
7
)
>>
3
;
__m256i
buff_tx
[
8
][
nsamps2
];
#else
nsamps2
=
(
nsamps
+
3
)
>>
2
;
__m128i
buff_tx
[
8
][
nsamps2
];
#endif
#elif defined(__arm__)
nsamps2
=
(
nsamps
+
3
)
>>
2
;
int16x8_t
buff_tx
[
8
][
nsamps2
];
#else
#error Unsupported CPU architecture, USRP device cannot be built
#endif
// bring RX data into 12 LSBs for softmodem RX
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
{
for
(
int
j
=
0
;
j
<
nsamps2
;
j
++
)
{
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
buff_tx
[
i
][
j
]
=
_mm256_slli_epi16
(((
__m256i
*
)
buff
[
i
])[
j
],
4
);
#else
buff_tx
[
i
][
j
]
=
_mm_slli_epi16
(((
__m128i
*
)
buff
[
i
])[
j
],
4
);
#endif
#elif defined(__arm__)
buff_tx
[
i
][
j
]
=
vshlq_n_s16
(((
int16x8_t
*
)
buff
[
i
])[
j
],
4
);
#endif
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
buff_tx
[
i
][
j
]
=
_mm256_slli_epi16
(((
__m256i
*
)
buff
[
i
])[
j
],
4
);
#else
buff_tx
[
i
][
j
]
=
_mm_slli_epi16
(((
__m128i
*
)
buff
[
i
])[
j
],
4
);
#endif
#elif defined(__arm__)
buff_tx
[
i
][
j
]
=
vshlq_n_s16
(((
int16x8_t
*
)
buff
[
i
])[
j
],
4
);
#endif
}
}
s
->
tx_md
.
has_time_spec
=
true
;
s
->
tx_md
.
start_of_burst
=
(
s
->
tx_count
==
0
)
?
true
:
first_packet
;
s
->
tx_md
.
end_of_burst
=
last_packet
;
...
...
@@ -572,34 +564,32 @@ void *trx_usrp_write_thread(void * arg){
buff_ptrs
.
push_back
(
&
(((
int16_t
*
)
buff_tx
[
i
])[
0
]));
ret
=
(
int
)
s
->
tx_stream
->
send
(
buff_ptrs
,
nsamps
,
s
->
tx_md
);
}
else
{
}
else
{
ret
=
(
int
)
s
->
tx_stream
->
send
(
&
(((
int16_t
*
)
buff_tx
[
0
])[
0
]),
nsamps
,
s
->
tx_md
);
}
if
(
ret
!=
nsamps
)
LOG_E
(
HW
,
"[xmit] tx samples %d != %d
\n
"
,
ret
,
nsamps
);
if
(
ret
!=
nsamps
)
LOG_E
(
HW
,
"[xmit] tx samples %d != %d
\n
"
,
ret
,
nsamps
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_USRP_SEND_RETURN
,
ret
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD
,
0
);
if
(
0
)
break
;
if
(
0
)
break
;
}
return
NULL
;
}
int
trx_usrp_write_init
(
openair0_device
*
device
){
int
trx_usrp_write_init
(
openair0_device
*
device
)
{
uhd
::
set_thread_priority_safe
(
1.0
);
openair0_thread_t
*
write_thread
=
&
device
->
write_thread
;
printf
(
"initializing tx write thread
\n
"
);
write_thread
->
start
=
0
;
write_thread
->
end
=
0
;
write_thread
->
count_write
=
0
;
printf
(
"end of tx write thread
\n
"
);
pthread_create
(
&
write_thread
->
pthread_write
,
NULL
,
trx_usrp_write_thread
,(
void
*
)
device
);
return
(
0
);
}
...
...
@@ -633,57 +623,60 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
int16x8_t
buff_tmp
[
2
][
nsamps2
];
#endif
if
(
cc
>
1
)
{
// receive multiple channels (e.g. RF A and RF B)
std
::
vector
<
void
*>
buff_ptrs
;
if
(
cc
>
1
)
{
// receive multiple channels (e.g. RF A and RF B)
std
::
vector
<
void
*>
buff_ptrs
;
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
buff_ptrs
.
push_back
(
buff_tmp
[
i
]);
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
buff_ptrs
.
push_back
(
buff_tmp
[
i
]);
samples_received
=
s
->
rx_stream
->
recv
(
buff_ptrs
,
nsamps
,
s
->
rx_md
);
}
else
{
// receive a single channel (e.g. from connector RF A)
samples_received
=
0
;
samples_received
=
s
->
rx_stream
->
recv
(
buff_ptrs
,
nsamps
,
s
->
rx_md
);
}
else
{
// receive a single channel (e.g. from connector RF A)
samples_received
=
0
;
while
(
samples_received
!=
nsamps
)
{
samples_received
+=
s
->
rx_stream
->
recv
((
void
*
)((
int32_t
*
)
buff_tmp
[
0
]
+
samples_received
),
nsamps
-
samples_received
,
s
->
rx_md
);
while
(
samples_received
!=
nsamps
)
{
samples_received
+=
s
->
rx_stream
->
recv
((
void
*
)((
int32_t
*
)
buff_tmp
[
0
]
+
samples_received
),
nsamps
-
samples_received
,
s
->
rx_md
);
if
((
s
->
wait_for_first_pps
==
0
)
&&
(
s
->
rx_md
.
error_code
!=
uhd
::
rx_metadata_t
::
ERROR_CODE_NONE
))
break
;
if
((
s
->
wait_for_first_pps
==
0
)
&&
(
s
->
rx_md
.
error_code
!=
uhd
::
rx_metadata_t
::
ERROR_CODE_NONE
))
break
;
if
((
s
->
wait_for_first_pps
==
1
)
&&
(
samples_received
!=
nsamps
))
{
printf
(
"sleep...
\n
"
);
//usleep(100);
}
if
((
s
->
wait_for_first_pps
==
1
)
&&
(
samples_received
!=
nsamps
))
{
printf
(
"sleep...
\n
"
);
//usleep(100);
}
if
(
samples_received
==
nsamps
)
s
->
wait_for_first_pps
=
0
;
}
// bring RX data into 12 LSBs for softmodem RX
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
{
for
(
int
j
=
0
;
j
<
nsamps2
;
j
++
)
{
if
(
samples_received
==
nsamps
)
s
->
wait_for_first_pps
=
0
;
}
// bring RX data into 12 LSBs for softmodem RX
for
(
int
i
=
0
;
i
<
cc
;
i
++
)
{
for
(
int
j
=
0
;
j
<
nsamps2
;
j
++
)
{
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
// FK: in some cases the buffer might not be 32 byte aligned, so we cannot use avx2
// FK: in some cases the buffer might not be 32 byte aligned, so we cannot use avx2
if
((((
uintptr_t
)
buff
[
i
])
&
0x1F
)
==
0
)
{
((
__m256i
*
)
buff
[
i
])[
j
]
=
_mm256_srai_epi16
(
buff_tmp
[
i
][
j
],
4
);
}
else
{
((
__m128i
*
)
buff
[
i
])[
2
*
j
]
=
_mm_srai_epi16
(((
__m128i
*
)
buff_tmp
[
i
])[
2
*
j
],
4
);
((
__m128i
*
)
buff
[
i
])[
2
*
j
+
1
]
=
_mm_srai_epi16
(((
__m128i
*
)
buff_tmp
[
i
])[
2
*
j
+
1
],
4
);
}
if
((((
uintptr_t
)
buff
[
i
])
&
0x1F
)
==
0
)
{
((
__m256i
*
)
buff
[
i
])[
j
]
=
_mm256_srai_epi16
(
buff_tmp
[
i
][
j
],
4
);
}
else
{
((
__m128i
*
)
buff
[
i
])[
2
*
j
]
=
_mm_srai_epi16
(((
__m128i
*
)
buff_tmp
[
i
])[
2
*
j
],
4
);
((
__m128i
*
)
buff
[
i
])[
2
*
j
+
1
]
=
_mm_srai_epi16
(((
__m128i
*
)
buff_tmp
[
i
])[
2
*
j
+
1
],
4
);
}
#else
((
__m128i
*
)
buff
[
i
])[
j
]
=
_mm_srai_epi16
(
buff_tmp
[
i
][
j
],
4
);
((
__m128i
*
)
buff
[
i
])[
j
]
=
_mm_srai_epi16
(
buff_tmp
[
i
][
j
],
4
);
#endif
#elif defined(__arm__)
((
int16x8_t
*
)
buff
[
i
])[
j
]
=
vshrq_n_s16
(
buff_tmp
[
i
][
j
],
4
);
((
int16x8_t
*
)
buff
[
i
])[
j
]
=
vshrq_n_s16
(
buff_tmp
[
i
][
j
],
4
);
#endif
}
}
}
if
(
samples_received
<
nsamps
)
{
LOG_E
(
HW
,
"[recv] received %d samples out of %d
\n
"
,
samples_received
,
nsamps
);
}
if
(
samples_received
<
nsamps
)
{
LOG_E
(
HW
,
"[recv] received %d samples out of %d
\n
"
,
samples_received
,
nsamps
);
}
if
(
s
->
rx_md
.
error_code
!=
uhd
::
rx_metadata_t
::
ERROR_CODE_NONE
)
LOG_E
(
HW
,
"%s
\n
"
,
s
->
rx_md
.
to_pp_string
(
true
).
c_str
());
...
...
@@ -691,21 +684,28 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
s
->
rx_count
+=
nsamps
;
s
->
rx_timestamp
=
s
->
rx_md
.
time_spec
.
to_ticks
(
s
->
sample_rate
);
*
ptimestamp
=
s
->
rx_timestamp
;
// push GPIO bits 7-9 from flags_msb
/*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate));
s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380);
s->usrp->clear_command_time();
gpio789 = (gpio789+1)&7;*/
/*s->usrp->set_command_time(uhd::time_spec_t::from_ticks((s->rx_timestamp+(2*nsamps)),s->sample_rate));
s->usrp->set_gpio_attr("FP0", "OUT", gpio789<<7, 0x380);
s->usrp->clear_command_time();
gpio789 = (gpio789+1)&7;*/
recplay_state_t
*
recPlay
=
device
->
recplay_state
;
if
(
device
->
recplay_state
!=
NULL
)
{
// record mode
if
(
recPlay
!=
NULL
)
{
// record mode
// Copy subframes to memory (later dump on a file)
if
(
device
->
recplay_state
->
nb_samples
<
device
->
openair0_cfg
->
recplay_conf
->
u_sf_max
)
{
(
device
->
recplay_state
->
ms_sample
+
device
->
recplay_state
->
nb_samples
)
->
header
=
BELL_LABS_IQ_HEADER
;
(
device
->
recplay_state
->
ms_sample
+
device
->
recplay_state
->
nb_samples
)
->
ts
=
*
ptimestamp
;
memcpy
((
device
->
recplay_state
->
ms_sample
+
device
->
recplay_state
->
nb_samples
)
->
samples
,
buff
[
0
],
nsamps
*
4
);
device
->
recplay_state
->
nb_samples
++
;
}
else
exit_function
(
__FILE__
,
__FUNCTION__
,
__LINE__
,
"Recording reaches max iq limit
\n
"
);
if
(
recPlay
->
nbSamplesBlocks
<
device
->
openair0_cfg
->
recplay_conf
->
u_sf_max
&&
recPlay
->
maxSizeBytes
>
(
recPlay
->
currentPtr
-
(
uint8_t
*
)
recPlay
->
ms_sample
)
+
sizeof
(
iqrec_t
)
+
nsamps
*
4
)
{
iqrec_t
*
hdr
=
(
iqrec_t
*
)
recPlay
->
currentPtr
;
hdr
->
header
=
BELL_LABS_IQ_HEADER
;
hdr
->
ts
=
*
ptimestamp
;
hdr
->
nbBytes
=
nsamps
*
4
;
memcpy
(
hdr
+
1
,
buff
[
0
],
nsamps
*
4
);
recPlay
->
currentPtr
+=
sizeof
(
iqrec_t
)
+
nsamps
*
4
;
recPlay
->
nbSamplesBlocks
++
;
LOG_D
(
HW
,
"recorded %d samples, for TS %lu, shift in buffer %ld
\n
"
,
nsamps
,
hdr
->
ts
,
recPlay
->
currentPtr
-
(
uint8_t
*
)
recPlay
->
ms_sample
);
}
else
exit_function
(
__FILE__
,
__FUNCTION__
,
__LINE__
,
"Recording reaches max iq limit
\n
"
);
}
return
samples_received
;
...
...
@@ -937,32 +937,30 @@ extern "C" {
device
->
trx_set_freq_func
=
trx_usrp_set_freq
;
device
->
trx_set_gains_func
=
trx_usrp_set_gains
;
device
->
trx_write_init
=
trx_usrp_write_init
;
// hotfix! to be checked later
uhd
::
set_thread_priority_safe
(
1.0
);
// Initialize USRP device
int
vers
=
0
,
subvers
=
0
,
subsubvers
=
0
;
int
bw_gain_adjust
=
0
;
if
(
device
->
openair0_cfg
->
recplay_mode
==
RECPLAY_RECORDMODE
)
{
std
::
cerr
<<
"USRP device initialized in subframes record mode"
<<
std
::
endl
;
}
sscanf
(
uhd
::
get_version_string
().
c_str
(),
"%d.%d.%d"
,
&
vers
,
&
subvers
,
&
subsubvers
);
LOG_I
(
HW
,
"UHD version %s (%d.%d.%d)
\n
"
,
uhd
::
get_version_string
().
c_str
(),
vers
,
subvers
,
subsubvers
);
std
::
string
args
;
if
(
openair0_cfg
[
0
].
sdr_addrs
==
NULL
)
{
args
=
"type=b200"
;
}
else
{
args
=
openair0_cfg
[
0
].
sdr_addrs
;
LOG_I
(
HW
,
"Checking for USRP with args %s
\n
"
,
openair0_cfg
[
0
].
sdr_addrs
);
}
uhd
::
device_addrs_t
device_adds
=
uhd
::
device
::
find
(
args
);
if
(
device_adds
.
size
()
==
0
)
{
LOG_E
(
HW
,
"No USRP Device Found.
\n
"
);
free
(
s
);
...
...
@@ -972,375 +970,367 @@ extern "C" {
free
(
s
);
return
-
1
;
}
LOG_I
(
HW
,
"Found USRP %s
\n
"
,
device_adds
[
0
].
get
(
"type"
).
c_str
());
double
usrp_master_clock
;
if
(
device_adds
[
0
].
get
(
"type"
)
==
"b200"
)
{
device
->
type
=
USRP_B200_DEV
;
usrp_master_clock
=
30.72e6
;
args
+=
boost
::
str
(
boost
::
format
(
",master_clock_rate=%f"
)
%
usrp_master_clock
);
args
+=
",num_send_frames=256,num_recv_frames=256, send_frame_size=7680, recv_frame_size=7680"
;
}
if
(
device_adds
[
0
].
get
(
"type"
)
==
"n3xx"
)
{
printf
(
"Found USRP n300
\n
"
);
device
->
type
=
USRP_N300_DEV
;
device
->
type
=
USRP_N300_DEV
;
usrp_master_clock
=
122.88e6
;
args
+=
boost
::
str
(
boost
::
format
(
",master_clock_rate=%f"
)
%
usrp_master_clock
);
//args += ", send_buff_size=33554432";
}
if
(
device_adds
[
0
].
get
(
"type"
)
==
"x300"
)
{
printf
(
"Found USRP x300
\n
"
);
device
->
type
=
USRP_X300_DEV
;
usrp_master_clock
=
184.32e6
;
args
+=
boost
::
str
(
boost
::
format
(
",master_clock_rate=%f"
)
%
usrp_master_clock
);
// USRP recommended: https://files.ettus.com/manual/page_usrp_x3x0_config.html
if
(
0
!=
system
(
"sysctl -w net.core.rmem_max=33554432 net.core.wmem_max=33554432"
)
)
LOG_W
(
HW
,
"Can't set kernel parameters for X3xx
\n
"
);
}
s
->
usrp
=
uhd
::
usrp
::
multi_usrp
::
make
(
args
);
if
(
args
.
find
(
"clock_source"
)
==
std
::
string
::
npos
)
{
if
(
openair0_cfg
[
0
].
clock_source
==
internal
)
{
s
->
usrp
->
set_clock_source
(
"internal"
);
LOG_D
(
HW
,
"Setting clock source to internal
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
clock_source
==
external
)
{
s
->
usrp
->
set_clock_source
(
"external"
);
LOG_D
(
HW
,
"Setting clock source to external
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
clock_source
==
gpsdo
)
{
s
->
usrp
->
set_clock_source
(
"gpsdo"
);
LOG_D
(
HW
,
"Setting clock source to gpsdo
\n
"
);
}
else
{
LOG_W
(
HW
,
"Clock source set neither in usrp_args nor on command line, using default!
\n
"
);
}
if
(
openair0_cfg
[
0
].
clock_source
==
internal
)
{
s
->
usrp
->
set_clock_source
(
"internal"
);
LOG_D
(
HW
,
"Setting clock source to internal
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
clock_source
==
external
)
{
s
->
usrp
->
set_clock_source
(
"external"
);
LOG_D
(
HW
,
"Setting clock source to external
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
clock_source
==
gpsdo
)
{
s
->
usrp
->
set_clock_source
(
"gpsdo"
);
LOG_D
(
HW
,
"Setting clock source to gpsdo
\n
"
);
}
else
{
LOG_W
(
HW
,
"Clock source set neither in usrp_args nor on command line, using default!
\n
"
);
}
}
else
{
if
(
openair0_cfg
[
0
].
clock_source
!=
unset
)
{
LOG_W
(
HW
,
"Clock source set in both usrp_args and in clock_source, ingnoring the latter!
\n
"
);
}
}
else
{
if
(
openair0_cfg
[
0
].
clock_source
!=
unset
)
{
LOG_W
(
HW
,
"Clock source set in both usrp_args and in clock_source, ingnoring the latter!
\n
"
);
}
}
if
(
args
.
find
(
"time_source"
)
==
std
::
string
::
npos
)
{
if
(
openair0_cfg
[
0
].
time_source
==
internal
)
{
s
->
usrp
->
set_time_source
(
"internal"
);
LOG_D
(
HW
,
"Setting time source to internal
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
time_source
==
external
)
{
s
->
usrp
->
set_time_source
(
"external"
);
LOG_D
(
HW
,
"Setting time source to external
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
time_source
==
gpsdo
)
{
s
->
usrp
->
set_time_source
(
"gpsdo"
);
LOG_D
(
HW
,
"Setting time source to gpsdo
\n
"
);
}
else
{
LOG_W
(
HW
,
"Time source set neither in usrp_args nor on command line, using default!
\n
"
);
}
if
(
openair0_cfg
[
0
].
time_source
==
internal
)
{
s
->
usrp
->
set_time_source
(
"internal"
);
LOG_D
(
HW
,
"Setting time source to internal
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
time_source
==
external
)
{
s
->
usrp
->
set_time_source
(
"external"
);
LOG_D
(
HW
,
"Setting time source to external
\n
"
);
}
else
if
(
openair0_cfg
[
0
].
time_source
==
gpsdo
)
{
s
->
usrp
->
set_time_source
(
"gpsdo"
);
LOG_D
(
HW
,
"Setting time source to gpsdo
\n
"
);
}
else
{
LOG_W
(
HW
,
"Time source set neither in usrp_args nor on command line, using default!
\n
"
);
}
}
else
{
if
(
openair0_cfg
[
0
].
clock_source
!=
unset
)
{
LOG_W
(
HW
,
"Time source set in both usrp_args and in time_source, ingnoring the latter!
\n
"
);
}
}
else
{
if
(
openair0_cfg
[
0
].
clock_source
!=
unset
)
{
LOG_W
(
HW
,
"Time source set in both usrp_args and in time_source, ingnoring the latter!
\n
"
);
}
}
if
(
s
->
usrp
->
get_clock_source
(
0
)
==
"gpsdo"
)
{
s
->
use_gps
=
1
;
if
(
sync_to_gps
(
device
)
==
EXIT_SUCCESS
)
{
LOG_I
(
HW
,
"USRP synced with GPS!
\n
"
);
}
else
{
LOG_I
(
HW
,
"USRP fails to sync with GPS. Exiting.
\n
"
);
exit
(
EXIT_FAILURE
);
if
(
s
->
usrp
->
get_clock_source
(
0
)
==
"gpsdo"
)
{
s
->
use_gps
=
1
;
if
(
sync_to_gps
(
device
)
==
EXIT_SUCCESS
)
{
LOG_I
(
HW
,
"USRP synced with GPS!
\n
"
);
}
else
{
LOG_I
(
HW
,
"USRP fails to sync with GPS. Exiting.
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
s
->
usrp
->
get_clock_source
(
0
)
==
"external"
)
{
if
(
check_ref_locked
(
s
,
0
))
{
LOG_I
(
HW
,
"USRP locked to external reference!
\n
"
);
}
else
{
LOG_I
(
HW
,
"Failed to lock to external reference. Exiting.
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
}
else
if
(
s
->
usrp
->
get_clock_source
(
0
)
==
"external"
)
{
if
(
check_ref_locked
(
s
,
0
))
{
LOG_I
(
HW
,
"USRP locked to external reference!
\n
"
);
}
else
{
LOG_I
(
HW
,
"Failed to lock to external reference. Exiting.
\n
"
);
exit
(
EXIT_FAILURE
);
if
(
device
->
type
==
USRP_X300_DEV
)
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_x310
;
std
::
cerr
<<
"-- Using calibration table: calib_table_x310"
<<
std
::
endl
;
}
}
if
(
device
->
type
==
USRP_X300_DEV
)
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_x310
;
std
::
cerr
<<
"-- Using calibration table: calib_table_x310"
<<
std
::
endl
;
}
if
(
device
->
type
==
USRP_N300_DEV
)
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_n310
;
std
::
cerr
<<
"-- Using calibration table: calib_table_n310"
<<
std
::
endl
;
}
if
(
device
->
type
==
USRP_N300_DEV
)
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_n310
;
std
::
cerr
<<
"-- Using calibration table: calib_table_n310"
<<
std
::
endl
;
}
if
(
device
->
type
==
USRP_N300_DEV
||
device
->
type
==
USRP_X300_DEV
)
{
LOG_I
(
HW
,
"%s() sample_rate:%u
\n
"
,
__FUNCTION__
,
(
int
)
openair0_cfg
[
0
].
sample_rate
);
if
(
device
->
type
==
USRP_N300_DEV
||
device
->
type
==
USRP_X300_DEV
)
{
LOG_I
(
HW
,
"%s() sample_rate:%u
\n
"
,
__FUNCTION__
,
(
int
)
openair0_cfg
[
0
].
sample_rate
);
switch
((
int
)
openair0_cfg
[
0
].
sample_rate
)
{
case
122880000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
//to be checked
openair0_cfg
[
0
].
tx_bw
=
80e6
;
openair0_cfg
[
0
].
rx_bw
=
80e6
;
break
;
switch
((
int
)
openair0_cfg
[
0
].
sample_rate
)
{
case
122880000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
//to be checked
openair0_cfg
[
0
].
tx_bw
=
80e6
;
openair0_cfg
[
0
].
rx_bw
=
80e6
;
break
;
case
92160000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
//to be checked
openair0_cfg
[
0
].
tx_bw
=
80e6
;
openair0_cfg
[
0
].
rx_bw
=
80e6
;
break
;
case
61440000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
46080000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
30720000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
15360000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
45
;
openair0_cfg
[
0
].
tx_bw
=
10e6
;
openair0_cfg
[
0
].
rx_bw
=
10e6
;
break
;
case
7680000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
50
;
openair0_cfg
[
0
].
tx_bw
=
5e6
;
openair0_cfg
[
0
].
rx_bw
=
5e6
;
break
;
case
1920000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
50
;
openair0_cfg
[
0
].
tx_bw
=
1.25e6
;
openair0_cfg
[
0
].
rx_bw
=
1.25e6
;
break
;
default:
LOG_E
(
HW
,
"Error: unknown sampling rate %f
\n
"
,
openair0_cfg
[
0
].
sample_rate
);
exit
(
-
1
);
break
;
case
92160000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
//to be checked
openair0_cfg
[
0
].
tx_bw
=
80e6
;
openair0_cfg
[
0
].
rx_bw
=
80e6
;
break
;
case
61440000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
46080000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
30720000
:
// from usrp_time_offset
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
15
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
15360000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
45
;
openair0_cfg
[
0
].
tx_bw
=
10e6
;
openair0_cfg
[
0
].
rx_bw
=
10e6
;
break
;
case
7680000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
50
;
openair0_cfg
[
0
].
tx_bw
=
5e6
;
openair0_cfg
[
0
].
rx_bw
=
5e6
;
break
;
case
1920000
:
//openair0_cfg[0].samples_per_packet = 2048;
openair0_cfg
[
0
].
tx_sample_advance
=
50
;
openair0_cfg
[
0
].
tx_bw
=
1.25e6
;
openair0_cfg
[
0
].
rx_bw
=
1.25e6
;
break
;
default:
LOG_E
(
HW
,
"Error: unknown sampling rate %f
\n
"
,
openair0_cfg
[
0
].
sample_rate
);
exit
(
-
1
);
break
;
}
}
}
if
(
device
->
type
==
USRP_B200_DEV
)
{
if
((
vers
==
3
)
&&
(
subvers
==
9
)
&&
(
subsubvers
>=
2
))
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_b210
;
bw_gain_adjust
=
0
;
std
::
cerr
<<
"-- Using calibration table: calib_table_b210"
<<
std
::
endl
;
// Bell Labs info
}
else
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_b210_38
;
bw_gain_adjust
=
1
;
std
::
cerr
<<
"-- Using calibration table: calib_table_b210_38"
<<
std
::
endl
;
// Bell Labs info
if
(
device
->
type
==
USRP_B200_DEV
)
{
if
((
vers
==
3
)
&&
(
subvers
==
9
)
&&
(
subsubvers
>=
2
))
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_b210
;
bw_gain_adjust
=
0
;
std
::
cerr
<<
"-- Using calibration table: calib_table_b210"
<<
std
::
endl
;
// Bell Labs info
}
else
{
openair0_cfg
[
0
].
rx_gain_calib_table
=
calib_table_b210_38
;
bw_gain_adjust
=
1
;
std
::
cerr
<<
"-- Using calibration table: calib_table_b210_38"
<<
std
::
endl
;
// Bell Labs info
}
switch
((
int
)
openair0_cfg
[
0
].
sample_rate
)
{
case
46080000
:
s
->
usrp
->
set_master_clock_rate
(
46.08e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
115
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
30720000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
115
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
23040000
:
s
->
usrp
->
set_master_clock_rate
(
23.04e6
);
//to be checked
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
113
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
15360000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e06
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
103
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
7680000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
80
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
1920000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
40
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
default:
LOG_E
(
HW
,
"Error: unknown sampling rate %f
\n
"
,
openair0_cfg
[
0
].
sample_rate
);
exit
(
-
1
);
break
;
}
}
switch
((
int
)
openair0_cfg
[
0
].
sample_rate
)
{
case
46080000
:
s
->
usrp
->
set_master_clock_rate
(
46.08e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
115
;
openair0_cfg
[
0
].
tx_bw
=
40e6
;
openair0_cfg
[
0
].
rx_bw
=
40e6
;
break
;
case
30720000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
115
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
23040000
:
s
->
usrp
->
set_master_clock_rate
(
23.04e6
);
//to be checked
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
113
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
15360000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e06
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
103
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
7680000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
80
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
case
1920000
:
s
->
usrp
->
set_master_clock_rate
(
30.72e6
);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg
[
0
].
tx_sample_advance
=
40
;
openair0_cfg
[
0
].
tx_bw
=
20e6
;
openair0_cfg
[
0
].
rx_bw
=
20e6
;
break
;
default:
LOG_E
(
HW
,
"Error: unknown sampling rate %f
\n
"
,
openair0_cfg
[
0
].
sample_rate
);
exit
(
-
1
);
break
;
/* device specific */
//openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered
//openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered
openair0_cfg
[
0
].
iq_txshift
=
4
;
//shift
openair0_cfg
[
0
].
iq_rxrescale
=
15
;
//rescale iqs
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_rx_num_channels
());
i
++
)
{
if
(
i
<
openair0_cfg
[
0
].
rx_num_channels
)
{
s
->
usrp
->
set_rx_rate
(
openair0_cfg
[
0
].
sample_rate
,
i
);
s
->
usrp
->
set_rx_freq
(
openair0_cfg
[
0
].
rx_freq
[
i
],
i
);
set_rx_gain_offset
(
&
openair0_cfg
[
0
],
i
,
bw_gain_adjust
);
::
uhd
::
gain_range_t
gain_range
=
s
->
usrp
->
get_rx_gain_range
(
i
);
// limit to maximum gain
AssertFatal
(
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
]
<=
gain_range
.
stop
(),
"RX Gain too high, lower by %f dB
\n
"
,
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
]
-
gain_range
.
stop
());
s
->
usrp
->
set_rx_gain
(
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
i
);
LOG_I
(
HW
,
"RX Gain %d %f (%f) => %f (max %f)
\n
"
,
i
,
openair0_cfg
[
0
].
rx_gain
[
i
],
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
gain_range
.
stop
());
}
}
}
/* device specific */
//openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered
//openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered
openair0_cfg
[
0
].
iq_txshift
=
4
;
//shift
openair0_cfg
[
0
].
iq_rxrescale
=
15
;
//rescale iqs
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_rx_num_channels
());
i
++
)
{
if
(
i
<
openair0_cfg
[
0
].
rx_num_channels
)
{
s
->
usrp
->
set_rx_rate
(
openair0_cfg
[
0
].
sample_rate
,
i
);
s
->
usrp
->
set_rx_freq
(
openair0_cfg
[
0
].
rx_freq
[
i
],
i
);
set_rx_gain_offset
(
&
openair0_cfg
[
0
],
i
,
bw_gain_adjust
);
::
uhd
::
gain_range_t
gain_range
=
s
->
usrp
->
get_rx_gain_range
(
i
);
// limit to maximum gain
AssertFatal
(
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
]
<=
gain_range
.
stop
(),
"RX Gain too high, lower by %f dB
\n
"
,
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
]
-
gain_range
.
stop
());
s
->
usrp
->
set_rx_gain
(
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
i
);
LOG_I
(
HW
,
"RX Gain %d %f (%f) => %f (max %f)
\n
"
,
i
,
openair0_cfg
[
0
].
rx_gain
[
i
],
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
openair0_cfg
[
0
].
rx_gain
[
i
]
-
openair0_cfg
[
0
].
rx_gain_offset
[
i
],
gain_range
.
stop
());
LOG_D
(
HW
,
"usrp->get_tx_num_channels() == %zd
\n
"
,
s
->
usrp
->
get_tx_num_channels
());
LOG_D
(
HW
,
"openair0_cfg[0].tx_num_channels == %d
\n
"
,
openair0_cfg
[
0
].
tx_num_channels
);
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_tx_num_channels
());
i
++
)
{
::
uhd
::
gain_range_t
gain_range_tx
=
s
->
usrp
->
get_tx_gain_range
(
i
);
if
(
i
<
openair0_cfg
[
0
].
tx_num_channels
)
{
s
->
usrp
->
set_tx_rate
(
openair0_cfg
[
0
].
sample_rate
,
i
);
s
->
usrp
->
set_tx_freq
(
openair0_cfg
[
0
].
tx_freq
[
i
],
i
);
s
->
usrp
->
set_tx_gain
(
gain_range_tx
.
stop
()
-
openair0_cfg
[
0
].
tx_gain
[
i
],
i
);
LOG_I
(
HW
,
"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf
\n
"
,
gain_range_tx
.
stop
()
-
openair0_cfg
[
0
].
tx_gain
[
i
],
gain_range_tx
.
stop
(),
openair0_cfg
[
0
].
tx_gain
[
i
]);
}
}
}
LOG_D
(
HW
,
"usrp->get_tx_num_channels() == %zd
\n
"
,
s
->
usrp
->
get_tx_num_channels
());
LOG_D
(
HW
,
"openair0_cfg[0].tx_num_channels == %d
\n
"
,
openair0_cfg
[
0
].
tx_num_channels
);
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_tx_num_channels
());
i
++
)
{
::
uhd
::
gain_range_t
gain_range_tx
=
s
->
usrp
->
get_tx_gain_range
(
i
);
if
(
i
<
openair0_cfg
[
0
].
tx_num_channels
)
{
s
->
usrp
->
set_tx_rate
(
openair0_cfg
[
0
].
sample_rate
,
i
);
s
->
usrp
->
set_tx_freq
(
openair0_cfg
[
0
].
tx_freq
[
i
],
i
);
s
->
usrp
->
set_tx_gain
(
gain_range_tx
.
stop
()
-
openair0_cfg
[
0
].
tx_gain
[
i
],
i
);
LOG_I
(
HW
,
"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf
\n
"
,
gain_range_tx
.
stop
()
-
openair0_cfg
[
0
].
tx_gain
[
i
],
gain_range_tx
.
stop
(),
openair0_cfg
[
0
].
tx_gain
[
i
]);
//s->usrp->set_clock_source("external");
//s->usrp->set_time_source("external");
// display USRP settings
LOG_I
(
HW
,
"Actual master clock: %fMHz...
\n
"
,
s
->
usrp
->
get_master_clock_rate
()
/
1e6
);
LOG_I
(
HW
,
"Actual clock source %s...
\n
"
,
s
->
usrp
->
get_clock_source
(
0
).
c_str
());
LOG_I
(
HW
,
"Actual time source %s...
\n
"
,
s
->
usrp
->
get_time_source
(
0
).
c_str
());
sleep
(
1
);
// create tx & rx streamer
uhd
::
stream_args_t
stream_args_rx
(
"sc16"
,
"sc16"
);
int
samples
=
openair0_cfg
[
0
].
sample_rate
;
int
max
=
s
->
usrp
->
get_rx_stream
(
stream_args_rx
)
->
get_max_num_samps
();
samples
/=
10000
;
LOG_I
(
HW
,
"RF board max packet size %u, size for 100µs jitter %d
\n
"
,
max
,
samples
);
if
(
samples
<
max
)
{
stream_args_rx
.
args
[
"spp"
]
=
str
(
boost
::
format
(
"%d"
)
%
samples
);
}
}
//s->usrp->set_clock_source("external");
//s->usrp->set_time_source("external");
// display USRP settings
LOG_I
(
HW
,
"Actual master clock: %fMHz...
\n
"
,
s
->
usrp
->
get_master_clock_rate
()
/
1e6
);
LOG_I
(
HW
,
"Actual clock source %s...
\n
"
,
s
->
usrp
->
get_clock_source
(
0
).
c_str
());
LOG_I
(
HW
,
"Actual time source %s...
\n
"
,
s
->
usrp
->
get_time_source
(
0
).
c_str
());
sleep
(
1
);
// create tx & rx streamer
uhd
::
stream_args_t
stream_args_rx
(
"sc16"
,
"sc16"
);
int
samples
=
openair0_cfg
[
0
].
sample_rate
;
int
max
=
s
->
usrp
->
get_rx_stream
(
stream_args_rx
)
->
get_max_num_samps
();
samples
/=
10000
;
LOG_I
(
HW
,
"RF board max packet size %u, size for 100µs jitter %d
\n
"
,
max
,
samples
);
if
(
samples
<
max
)
{
stream_args_rx
.
args
[
"spp"
]
=
str
(
boost
::
format
(
"%d"
)
%
samples
);
}
LOG_I
(
HW
,
"rx_max_num_samps %zu
\n
"
,
s
->
usrp
->
get_rx_stream
(
stream_args_rx
)
->
get_max_num_samps
());
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
stream_args_rx
.
channels
.
push_back
(
i
);
s
->
rx_stream
=
s
->
usrp
->
get_rx_stream
(
stream_args_rx
);
uhd
::
stream_args_t
stream_args_tx
(
"sc16"
,
"sc16"
);
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
stream_args_tx
.
channels
.
push_back
(
i
);
s
->
tx_stream
=
s
->
usrp
->
get_tx_stream
(
stream_args_tx
);
/* Setting TX/RX BW after streamers are created due to USRP calibration issue */
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_tx_num_channels
())
&&
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
s
->
usrp
->
set_tx_bandwidth
(
openair0_cfg
[
0
].
tx_bw
,
i
);
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_rx_num_channels
())
&&
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
s
->
usrp
->
set_rx_bandwidth
(
openair0_cfg
[
0
].
rx_bw
,
i
);
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
{
LOG_I
(
HW
,
"RX Channel %d
\n
"
,
i
);
LOG_I
(
HW
,
" Actual RX sample rate: %fMSps...
\n
"
,
s
->
usrp
->
get_rx_rate
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual RX frequency: %fGHz...
\n
"
,
s
->
usrp
->
get_rx_freq
(
i
)
/
1e9
);
LOG_I
(
HW
,
" Actual RX gain: %f...
\n
"
,
s
->
usrp
->
get_rx_gain
(
i
));
LOG_I
(
HW
,
" Actual RX bandwidth: %fM...
\n
"
,
s
->
usrp
->
get_rx_bandwidth
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual RX antenna: %s...
\n
"
,
s
->
usrp
->
get_rx_antenna
(
i
).
c_str
());
}
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
{
LOG_I
(
HW
,
"TX Channel %d
\n
"
,
i
);
LOG_I
(
HW
,
" Actual TX sample rate: %fMSps...
\n
"
,
s
->
usrp
->
get_tx_rate
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual TX frequency: %fGHz...
\n
"
,
s
->
usrp
->
get_tx_freq
(
i
)
/
1e9
);
LOG_I
(
HW
,
" Actual TX gain: %f...
\n
"
,
s
->
usrp
->
get_tx_gain
(
i
));
LOG_I
(
HW
,
" Actual TX bandwidth: %fM...
\n
"
,
s
->
usrp
->
get_tx_bandwidth
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual TX antenna: %s...
\n
"
,
s
->
usrp
->
get_tx_antenna
(
i
).
c_str
());
LOG_I
(
HW
,
" Actual TX packet size: %lu
\n
"
,
s
->
tx_stream
->
get_max_num_samps
());
}
LOG_I
(
HW
,
"Device timestamp: %f...
\n
"
,
s
->
usrp
->
get_time_now
().
get_real_secs
());
device
->
trx_write_func
=
trx_usrp_write
;
device
->
trx_read_func
=
trx_usrp_read
;
s
->
sample_rate
=
openair0_cfg
[
0
].
sample_rate
;
// TODO:
// init tx_forward_nsamps based usrp_time_offset ex
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
30.72e6
))
s
->
tx_forward_nsamps
=
176
;
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
15.36e6
))
s
->
tx_forward_nsamps
=
90
;
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
7.68e6
))
s
->
tx_forward_nsamps
=
50
;
if
(
device
->
recplay_state
!=
NULL
)
{
// record mode
device
->
recplay_state
->
ms_sample
=
(
iqrec_t
*
)
malloc
(
openair0_cfg
[
0
].
recplay_conf
->
u_sf_max
*
sizeof
(
iqrec_t
));
if
(
device
->
recplay_state
->
ms_sample
==
NULL
)
{
std
::
cerr
<<
"Memory allocation failed for subframe record or replay mode."
<<
std
::
endl
;
exit
(
-
1
);
LOG_I
(
HW
,
"rx_max_num_samps %zu
\n
"
,
s
->
usrp
->
get_rx_stream
(
stream_args_rx
)
->
get_max_num_samps
());
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
stream_args_rx
.
channels
.
push_back
(
i
);
s
->
rx_stream
=
s
->
usrp
->
get_rx_stream
(
stream_args_rx
);
uhd
::
stream_args_t
stream_args_tx
(
"sc16"
,
"sc16"
);
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
stream_args_tx
.
channels
.
push_back
(
i
);
s
->
tx_stream
=
s
->
usrp
->
get_tx_stream
(
stream_args_tx
);
/* Setting TX/RX BW after streamers are created due to USRP calibration issue */
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_tx_num_channels
())
&&
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
s
->
usrp
->
set_tx_bandwidth
(
openair0_cfg
[
0
].
tx_bw
,
i
);
for
(
int
i
=
0
;
i
<
((
int
)
s
->
usrp
->
get_rx_num_channels
())
&&
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
s
->
usrp
->
set_rx_bandwidth
(
openair0_cfg
[
0
].
rx_bw
,
i
);
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
rx_num_channels
;
i
++
)
{
LOG_I
(
HW
,
"RX Channel %d
\n
"
,
i
);
LOG_I
(
HW
,
" Actual RX sample rate: %fMSps...
\n
"
,
s
->
usrp
->
get_rx_rate
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual RX frequency: %fGHz...
\n
"
,
s
->
usrp
->
get_rx_freq
(
i
)
/
1e9
);
LOG_I
(
HW
,
" Actual RX gain: %f...
\n
"
,
s
->
usrp
->
get_rx_gain
(
i
));
LOG_I
(
HW
,
" Actual RX bandwidth: %fM...
\n
"
,
s
->
usrp
->
get_rx_bandwidth
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual RX antenna: %s...
\n
"
,
s
->
usrp
->
get_rx_antenna
(
i
).
c_str
());
}
for
(
int
i
=
0
;
i
<
openair0_cfg
[
0
].
tx_num_channels
;
i
++
)
{
LOG_I
(
HW
,
"TX Channel %d
\n
"
,
i
);
LOG_I
(
HW
,
" Actual TX sample rate: %fMSps...
\n
"
,
s
->
usrp
->
get_tx_rate
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual TX frequency: %fGHz...
\n
"
,
s
->
usrp
->
get_tx_freq
(
i
)
/
1e9
);
LOG_I
(
HW
,
" Actual TX gain: %f...
\n
"
,
s
->
usrp
->
get_tx_gain
(
i
));
LOG_I
(
HW
,
" Actual TX bandwidth: %fM...
\n
"
,
s
->
usrp
->
get_tx_bandwidth
(
i
)
/
1e6
);
LOG_I
(
HW
,
" Actual TX antenna: %s...
\n
"
,
s
->
usrp
->
get_tx_antenna
(
i
).
c_str
());
LOG_I
(
HW
,
" Actual TX packet size: %lu
\n
"
,
s
->
tx_stream
->
get_max_num_samps
());
}
memset
(
device
->
recplay_state
->
ms_sample
,
0
,
openair0_cfg
[
0
].
recplay_conf
->
u_sf_max
*
BELL_LABS_IQ_BYTES_PER_SF
);
LOG_I
(
HW
,
"Device timestamp: %f...
\n
"
,
s
->
usrp
->
get_time_now
().
get_real_secs
());
device
->
trx_write_func
=
trx_usrp_write
;
device
->
trx_read_func
=
trx_usrp_read
;
s
->
sample_rate
=
openair0_cfg
[
0
].
sample_rate
;
// TODO:
// init tx_forward_nsamps based usrp_time_offset ex
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
30.72e6
))
s
->
tx_forward_nsamps
=
176
;
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
15.36e6
))
s
->
tx_forward_nsamps
=
90
;
if
(
is_equal
(
s
->
sample_rate
,
(
double
)
7.68e6
))
s
->
tx_forward_nsamps
=
50
;
recplay_state_t
*
recPlay
=
device
->
recplay_state
;
if
(
recPlay
!=
NULL
)
{
// record mode
recPlay
->
maxSizeBytes
=
openair0_cfg
[
0
].
recplay_conf
->
u_sf_max
*
(
sizeof
(
iqrec_t
)
+
BELL_LABS_IQ_BYTES_PER_SF
);
recPlay
->
ms_sample
=
(
iqrec_t
*
)
malloc
(
recPlay
->
maxSizeBytes
);
recPlay
->
currentPtr
=
(
uint8_t
*
)
recPlay
->
ms_sample
;
if
(
recPlay
->
ms_sample
==
NULL
)
{
std
::
cerr
<<
"Memory allocation failed for subframe record or replay mode."
<<
std
::
endl
;
exit
(
-
1
);
}
}
return
0
;
}
return
0
;
}
/*@}*/
/*@}*/
}
/* extern c */
targets/ARCH/iqplayer/iqplayer_lib.c
View file @
e284118c
...
...
@@ -40,18 +40,15 @@
#include "assertions.h"
#include "common/utils/LOG/log.h"
static
void
parse_iqfile_header
(
openair0_device
*
device
,
iqfile_header_t
*
iq_fh
)
{
AssertFatal
((
memcmp
(
iq_fh
->
oaiid
,
OAIIQFILE_ID
,
sizeof
(
OAIIQFILE_ID
))
==
0
),
"iqfile doesn't seem to be compatible with oai (invalid id %.4s in header)
\n
"
,
iq_fh
->
oaiid
);
char
tmp
[
4
]
=
OAIIQFILE_ID
;
AssertFatal
((
memcmp
(
iq_fh
->
oaiid
,
tmp
,
sizeof
(
iq_fh
->
oaiid
))
==
0
),
"iqfile doesn't seem to be compatible with oai (invalid id %.4s in header)
\n
"
,
iq_fh
->
oaiid
);
device
->
type
=
iq_fh
->
devtype
;
device
->
openair0_cfg
[
0
].
tx_sample_advance
=
iq_fh
->
tx_sample_advance
;
device
->
openair0_cfg
[
0
].
tx_bw
=
device
->
openair0_cfg
[
0
].
rx_bw
=
iq_fh
->
bw
;
device
->
recplay_state
->
nbSamplesBlocks
=
iq_fh
->
nbSamplesBlocks
;
LOG_UI
(
HW
,
"Replay iqs from %s device, bandwidth %e
\n
"
,
get_devname
(
iq_fh
->
devtype
),
iq_fh
->
bw
);
}
...
...
@@ -63,89 +60,73 @@ static int iqplayer_loadfile(openair0_device *device, openair0_config_t *openair
recplay_state_t
*
s
=
device
->
recplay_state
;
recplay_conf_t
*
c
=
openair0_cfg
->
recplay_conf
;
struct
stat
sb
;
s
->
fd
=
open
(
c
->
u_sf_filename
,
O_RDONLY
);
if
(
s
->
fd
>=
0
)
{
fstat
(
s
->
fd
,
&
sb
);
}
else
{
LOG_E
(
HW
,
"Cannot open %s exiting.
\n
"
,
c
->
u_sf_filename
);
exit
(
-
1
);
}
if
(
s
->
use_mmap
)
{
// use mmap
s
->
mmapfd
=
open
(
c
->
u_sf_filename
,
O_RDONLY
);
if
(
s
->
mmapfd
!=
0
)
{
struct
stat
sb
;
fstat
(
s
->
mmapfd
,
&
sb
);
s
->
mapsize
=
sb
.
st_size
;
LOG_I
(
HW
,
"Loading subframes using mmap() from %s size=%lu bytes ...
\n
"
,
c
->
u_sf_filename
,
(
uint64_t
)
sb
.
st_size
);
void
*
mptr
=
mmap
(
NULL
,
sb
.
st_size
,
PROT_WRITE
,
MAP_PRIVATE
,
s
->
mmap
fd
,
0
)
;
s
->
ms_sample
=
(
iqrec_t
*
)
(
mmap
(
NULL
,
sb
.
st_size
,
PROT_WRITE
,
MAP_PRIVATE
,
s
->
mmap
fd
,
0
)
+
sizeof
(
iqfile_header_t
));
void
*
mptr
=
mmap
(
NULL
,
sb
.
st_size
,
PROT_WRITE
,
MAP_PRIVATE
,
s
->
fd
,
0
)
;
s
->
ms_sample
=
(
iqrec_t
*
)
(
mmap
(
NULL
,
sb
.
st_size
,
PROT_WRITE
,
MAP_PRIVATE
,
s
->
fd
,
0
)
+
sizeof
(
iqfile_header_t
));
if
(
mptr
!=
MAP_FAILED
)
{
parse_iqfile_header
(
device
,
(
iqfile_header_t
*
)
mptr
);
s
->
ms_sample
=
(
iqrec_t
*
)((
char
*
)
mptr
+
sizeof
(
iqfile_header_t
));
s
->
nb_samples
=
((
sb
.
st_size
-
sizeof
(
iqfile_header_t
))
/
sizeof
(
iqrec_t
));
int
aligned
=
(((
unsigned
long
)
s
->
ms_sample
&
31
)
==
0
)
?
1
:
0
;
LOG_I
(
HW
,
"Loaded %u subframes.
\n
"
,
s
->
nb_samples
);
if
(
aligned
==
0
)
{
LOG_E
(
HW
,
"mmap address is not 32 bytes aligned, exiting.
\n
"
);
close
(
s
->
mmapfd
);
exit
(
-
1
);
}
LOG_I
(
HW
,
"Loaded %u subframes.
\n
"
,
s
->
nbSamplesBlocks
);
}
else
{
LOG_E
(
HW
,
"Cannot mmap file, exiting.
\n
"
);
close
(
s
->
mmap
fd
);
close
(
s
->
fd
);
exit
(
-
1
);
}
}
else
{
LOG_E
(
HW
,
"Cannot open %s exiting.
\n
"
,
c
->
u_sf_filename
);
exit
(
-
1
);
}
}
else
{
s
->
iqfd
=
open
(
c
->
u_sf_filename
,
O_RDONLY
);
iqfile_header_t
fh
;
size_t
hs
=
read
(
s
->
fd
,
&
fh
,
sizeof
(
fh
));
if
(
s
->
iqfd
!=
0
)
{
struct
stat
sb
;
iqfile_header_t
fh
;
size_t
hs
=
read
(
s
->
iqfd
,
&
fh
,
sizeof
(
fh
));
if
(
hs
==
sizeof
(
fh
))
{
parse_iqfile_header
(
device
,
&
fh
);
fstat
(
s
->
iqfd
,
&
sb
);
if
(
hs
==
sizeof
(
fh
))
{
parse_iqfile_header
(
device
,
&
fh
);
fstat
(
s
->
fd
,
&
sb
);
s
->
mapsize
=
sb
.
st_size
;
s
->
nb_samples
=
((
sb
.
st_size
-
sizeof
(
iqfile_header_t
))
/
sizeof
(
iqrec_t
));
LOG_I
(
HW
,
"Loading %u subframes from %s,size=%lu bytes ...
\n
"
,
s
->
nb_samples
,
c
->
u_sf_filename
,(
uint64_t
)
sb
.
st_size
);
LOG_I
(
HW
,
"Loading %u subframes from %s,size=%lu bytes ...
\n
"
,
s
->
nbSamplesBlocks
,
c
->
u_sf_filename
,(
uint64_t
)
sb
.
st_size
);
// allocate buffer for 1 sample at a time
s
->
ms_sample
=
(
iqrec_t
*
)
malloc
(
sizeof
(
iqrec_t
));
s
->
ms_sample
=
(
iqrec_t
*
)
malloc
(
sizeof
(
iqrec_t
)
+
MAX_BELL_LABS_IQ_BYTES_PER_SF
*
4
);
if
(
s
->
ms_sample
==
NULL
)
{
LOG_E
(
HW
,
"Memory allocation failed for individual subframe replay mode.
\n
"
);
close
(
s
->
iq
fd
);
close
(
s
->
fd
);
exit
(
-
1
);
}
memset
(
s
->
ms_sample
,
0
,
sizeof
(
iqrec_t
));
// point at beginning of iqs in file
if
(
lseek
(
s
->
iq
fd
,
sizeof
(
iqfile_header_t
),
SEEK_SET
)
==
0
)
{
if
(
lseek
(
s
->
fd
,
sizeof
(
iqfile_header_t
),
SEEK_SET
)
==
0
)
{
LOG_I
(
HW
,
"Initial seek at beginning of the file
\n
"
);
}
else
{
LOG_I
(
HW
,
"Problem initial seek at beginning of the file
\n
"
);
}
}
else
{
LOG_E
(
HW
,
"Cannot read header in %s exiting.
\n
"
,
c
->
u_sf_filename
);
close
(
s
->
iq
fd
);
close
(
s
->
fd
);
exit
(
-
1
);
}
}
else
{
LOG_E
(
HW
,
"Cannot open %s exiting.
\n
"
,
c
->
u_sf_filename
);
exit
(
-
1
);
}
}
s
->
currentPtr
=
(
uint8_t
*
)
s
->
ms_sample
;
return
0
;
}
/*! \brief start the oai iq player
* \param device, the hardware used
*/
static
int
trx_iqplayer_start
(
openair0_device
*
device
){
return
0
;
static
int
trx_iqplayer_start
(
openair0_device
*
device
)
{
return
0
;
}
/*! \brief Terminate operation of the oai iq player
...
...
@@ -157,28 +138,22 @@ static void trx_iqplayer_end(openair0_device *device) {
if
(
device
->
recplay_state
==
NULL
)
return
;
if
(
device
->
recplay_state
->
use_mmap
)
{
if
(
device
->
recplay_state
->
ms_sample
!=
MAP_FAILED
)
{
munmap
(
device
->
recplay_state
->
ms_sample
,
device
->
recplay_state
->
mapsize
);
device
->
recplay_state
->
ms_sample
=
NULL
;
}
if
(
device
->
recplay_state
->
mmapfd
!=
0
)
{
close
(
device
->
recplay_state
->
mmapfd
);
device
->
recplay_state
->
mmapfd
=
0
;
}
}
}
else
{
if
(
device
->
recplay_state
->
ms_sample
!=
NULL
)
{
free
(
device
->
recplay_state
->
ms_sample
);
device
->
recplay_state
->
ms_sample
=
NULL
;
}
if
(
device
->
recplay_state
->
iqfd
!=
0
)
{
close
(
device
->
recplay_state
->
iqfd
);
device
->
recplay_state
->
iqfd
=
0
;
}
}
}
device
->
recplay_state
->
ms_sample
=
NULL
;
if
(
device
->
recplay_state
->
fd
>=
0
)
{
close
(
device
->
recplay_state
->
fd
);
device
->
recplay_state
->
fd
=
-
1
;
}
}
/*! \brief Write iqs function when in replay mode, just introduce a delay, as configured at init time,
@param device pointer to the device structure specific to the RF hardware target
...
...
@@ -208,93 +183,68 @@ static int trx_iqplayer_write(openair0_device *device, openair0_timestamp timest
* \returns the number of sample read
*/
static
int
trx_iqplayer_read
(
openair0_device
*
device
,
openair0_timestamp
*
ptimestamp
,
void
**
buff
,
int
nsamps
,
int
cc
)
{
int
samples_received
=
0
;
static
unsigned
int
cur_samples
;
static
int64_t
wrap_count
;
static
int64_t
wrap_ts
;
recplay_state_t
*
s
=
device
->
recplay_state
;
if
(
cur_samples
==
s
->
nb_samples
)
{
cur_samples
=
0
;
wrap_count
++
;
if
(
wrap_count
==
device
->
openair0_cfg
->
recplay_conf
->
u_sf_loops
)
{
LOG_W
(
HW
,
"iqplayer device terminating subframes replay after %u iteration
\n
"
,
device
->
openair0_cfg
->
recplay_conf
->
u_sf_loops
);
if
(
s
->
curSamplesBlock
==
0
&&
s
->
wrap_count
==
0
)
s
->
currentTs
=
s
->
ms_sample
->
ts
;
if
(
s
->
curSamplesBlock
==
s
->
nbSamplesBlocks
)
{
LOG_I
(
HW
,
"wrapping on iq file (%ld)
\n
"
,
s
->
wrap_count
);
s
->
curSamplesBlock
=
0
;
s
->
wrap_count
++
;
if
(
s
->
wrap_count
==
device
->
openair0_cfg
->
recplay_conf
->
u_sf_loops
)
{
LOG_W
(
HW
,
"iqplayer device terminating subframes replay after %u iteration
\n
"
,
device
->
openair0_cfg
->
recplay_conf
->
u_sf_loops
);
exit_function
(
__FILE__
,
__FUNCTION__
,
__LINE__
,
"replay ended, triggering process termination
\n
"
);
}
wrap_ts
=
wrap_count
*
(
s
->
nb_samples
*
(((
int
)(
device
->
openair0_cfg
[
0
].
sample_rate
))
/
1000
));
LOG_I
(
HW
,
"go back at the beginning of IQ file"
);
device
->
recplay_state
->
currentPtr
=
(
uint8_t
*
)
device
->
recplay_state
->
ms_sample
;
if
(
!
device
->
recplay_state
->
use_mmap
)
{
if
(
lseek
(
device
->
recplay_state
->
iqfd
,
0
,
SEEK_SET
)
==
0
)
{
LOG_I
(
HW
,
"Seeking at the beginning of IQ file"
);
}
else
{
LOG_I
(
HW
,
"Problem seeking at the beginning of IQ file"
);
if
(
!
s
->
use_mmap
)
{
if
(
lseek
(
device
->
recplay_state
->
fd
,
0
,
SEEK_SET
)
!=
0
)
{
LOG_E
(
HW
,
"Problem seeking at the beginning of IQ file"
);
}
}
}
if
(
s
->
use_mmap
)
{
if
(
cur_samples
<
s
->
nb_samples
)
{
*
ptimestamp
=
(
s
->
ms_sample
[
0
].
ts
+
(
cur_samples
*
(((
int
)(
device
->
openair0_cfg
[
0
].
sample_rate
))
/
1000
)))
+
wrap_ts
;
if
(
cur_samples
==
0
)
{
LOG_I
(
HW
,
"starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu
\n
"
,
wrap_count
,
wrap_ts
,
*
ptimestamp
);
}
memcpy
(
buff
[
0
],
&
s
->
ms_sample
[
cur_samples
].
samples
[
0
],
nsamps
*
4
);
cur_samples
++
;
}
}
else
{
if
(
!
s
->
use_mmap
)
{
// read sample from file
if
(
read
(
s
->
iqfd
,
s
->
ms_sample
,
sizeof
(
iqrec_t
))
!=
sizeof
(
iqrec_t
))
{
LOG_E
(
HW
,
"pb reading iqfile at index %lu
\n
"
,
sizeof
(
iqrec_t
)
*
cur_samples
);
close
(
s
->
iqfd
);
free
(
s
->
ms_sample
);
s
->
ms_sample
=
NULL
;
s
->
iqfd
=
0
;
if
(
read
(
s
->
fd
,
s
->
ms_sample
,
sizeof
(
iqrec_t
))
!=
sizeof
(
iqrec_t
))
{
LOG_E
(
HW
,
"pb reading iqfile at index %lu
\n
"
,
sizeof
(
iqrec_t
)
*
s
->
curSamplesBlock
);
exit
(
-
1
);
}
if
(
cur_samples
<
s
->
nb_samples
)
{
static
int64_t
ts0
=
0
;
if
((
cur_samples
==
0
)
&&
(
wrap_count
==
0
))
{
ts0
=
s
->
ms_sample
->
ts
;
}
*
ptimestamp
=
ts0
+
(
cur_samples
*
(((
int
)(
device
->
openair0_cfg
[
0
].
sample_rate
))
/
1000
))
+
wrap_ts
;
if
(
cur_samples
==
0
)
{
LOG_I
(
HW
,
"starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu "
,
wrap_count
,
wrap_ts
,
*
ptimestamp
);
}
memcpy
(
buff
[
0
],
&
s
->
ms_sample
->
samples
[
0
],
nsamps
*
4
);
cur_samples
++
;
// Prepare for next read
off_t
where
=
lseek
(
s
->
iqfd
,
cur_samples
*
sizeof
(
iqrec_t
),
SEEK_SET
);
if
(
where
<
0
)
{
LOG_E
(
HW
,
"Cannot lseek in iqfile: %s
\n
"
,
strerror
(
errno
));
}
else
{
if
(
read
(
s
->
fd
,
s
->
ms_sample
+
1
,
s
->
ms_sample
->
nbBytes
)
!=
s
->
ms_sample
->
nbBytes
)
{
LOG_E
(
HW
,
"pb reading iqfile at index %lu
\n
"
,
sizeof
(
iqrec_t
)
*
s
->
curSamplesBlock
);
exit
(
-
1
);
}
}
}
struct
timespec
req
;
iqrec_t
*
curHeader
=
(
iqrec_t
*
)
s
->
currentPtr
;
AssertFatal
(
curHeader
->
header
==
BELL_LABS_IQ_HEADER
,
""
);
// the current timestamp is the stored timestamp until we wrap on input
// USRP shifts 1 sample time to time
AssertFatal
(
s
->
wrap_count
!=
0
||
abs
(
curHeader
->
ts
-
s
->
currentTs
)
<
5
,
""
);
AssertFatal
(
nsamps
*
4
==
curHeader
->
nbBytes
,
""
);
*
ptimestamp
=
s
->
currentTs
;
memcpy
(
buff
[
0
],
curHeader
+
1
,
nsamps
*
4
);
s
->
curSamplesBlock
++
;
// Prepare for next read
s
->
currentTs
+=
nsamps
;
if
(
s
->
use_mmap
)
s
->
currentPtr
+=
sizeof
(
iqrec_t
)
+
s
->
ms_sample
->
nbBytes
;
struct
timespec
req
;
req
.
tv_sec
=
0
;
req
.
tv_nsec
=
(
device
->
openair0_cfg
[
0
].
recplay_conf
->
u_sf_read_delay
)
*
1000
;
nanosleep
(
&
req
,
NULL
);
LOG_D
(
HW
,
"returning %d samples at ts %lu
\n
"
,
nsamps
,
*
ptimestamp
);
return
nsamps
;
return
samples_received
;
}
int
device_init
(
openair0_device
*
device
,
openair0_config_t
*
openair0_cfg
)
{
device
->
openair0_cfg
=
openair0_cfg
;
device
->
trx_start_func
=
trx_iqplayer_start
;
...
...
@@ -313,5 +263,4 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
LOG_UI
(
HW
,
"iqplayer device initialized, replay %s for %i iterations"
,
openair0_cfg
->
recplay_conf
->
u_sf_filename
,
openair0_cfg
->
recplay_conf
->
u_sf_loops
);
return
0
;
}
/*@}*/
targets/RT/USER/lte-softmodem.c
View file @
e284118c
...
...
@@ -727,7 +727,7 @@ int main ( int argc, char **argv )
fflush
(
stderr
);
// end of CI modifications
//getchar();
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
load_softscope
(
"enb"
,
NULL
);
itti_wait_tasks_end
();
oai_exit
=
1
;
...
...
@@ -735,7 +735,7 @@ int main ( int argc, char **argv )
// stop threads
if
(
RC
.
nb_inst
==
0
||
!
NODE_IS_CU
(
node_type
))
{
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
end_forms
();
LOG_I
(
ENB_APP
,
"stopping MODEM threads
\n
"
);
...
...
targets/RT/USER/lte-uesoftmodem.c
View file @
e284118c
...
...
@@ -758,7 +758,7 @@ int main( int argc, char **argv ) {
PHY_vars_UE_g
[
0
][
0
]
->
no_timing_correction
=
1
;
}
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
load_softscope
(
"ue"
,
NULL
);
config_check_unknown_cmdlineopt
(
CONFIG_CHECKALLSECTIONS
);
...
...
@@ -783,7 +783,7 @@ int main( int argc, char **argv ) {
printf
(
"oai_exit=%d
\n
"
,
oai_exit
);
// stop threads
if
(
IS_SOFTMODEM_DO
FORMS
)
if
(
IS_SOFTMODEM_DO
SCOPE
)
end_forms
();
printf
(
"stopping MODEM threads
\n
"
);
...
...
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