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
alex037yang
OpenXG-RAN
Commits
4484f354
Commit
4484f354
authored
Mar 16, 2017
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
addition of TDD switch and timing for tx_write operation
parent
bd3394f5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
92 additions
and
63 deletions
+92
-63
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+15
-0
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf
...ERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf
+1
-1
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+76
-62
No files found.
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
View file @
4484f354
...
@@ -106,6 +106,21 @@ static int trx_usrp_start(openair0_device *device) {
...
@@ -106,6 +106,21 @@ static int trx_usrp_start(openair0_device *device) {
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
// setup GPIO for TDD, GPIO(0) = ATR_TX, GPIO(1) = ATR_RX
//set data direction register (DDR) to output
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"DDR"
,
0xf
,
0xf
);
//set control register to ATR
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"CTRL"
,
0x1
,
0xf
);
//set ATR register
// s->usrp->set_gpio_attr("FP0", "ATR_0X", 2, 0xf);
s
->
usrp
->
set_gpio_attr
(
"FP0"
,
"ATR_RX"
,
1
,
0xf
);
// s->usrp->set_gpio_attr("FP0", "ATR_TX", 4, 0xf);
// s->usrp->set_gpio_attr("FP0", "ATR_XX", 8, 0xf);
// init recv and send streaming
// init recv and send streaming
uhd
::
stream_cmd_t
cmd
(
uhd
::
stream_cmd_t
::
STREAM_MODE_START_CONTINUOUS
);
uhd
::
stream_cmd_t
cmd
(
uhd
::
stream_cmd_t
::
STREAM_MODE_START_CONTINUOUS
);
cmd
.
time_spec
=
s
->
usrp
->
get_time_now
()
+
uhd
::
time_spec_t
(
0.05
);
cmd
.
time_spec
=
s
->
usrp
->
get_time_now
()
+
uhd
::
time_spec_t
(
0.05
);
...
...
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.if4p5.50PRB.usrpb210.conf
View file @
4484f354
...
@@ -159,7 +159,7 @@ eNBs =
...
@@ -159,7 +159,7 @@ eNBs =
rrh_gw_config
= (
rrh_gw_config
= (
{
{
local_if_name
=
"eth0"
;
local_if_name
=
"eth0"
;
remote_address
=
"10.10.10.
21
5"
;
remote_address
=
"10.10.10.
15
5"
;
local_address
=
"10.10.10.60"
;
local_address
=
"10.10.10.60"
;
local_port
=
50000
;
#for raw option local port must be the same to remote
local_port
=
50000
;
#for raw option local port must be the same to remote
remote_port
=
50000
;
remote_port
=
50000
;
...
...
targets/RT/USER/lte-enb.c
View file @
4484f354
...
@@ -919,72 +919,14 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
...
@@ -919,72 +919,14 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
eNB_proc_t
*
proc
=
&
eNB
->
proc
;
eNB_proc_t
*
proc
=
&
eNB
->
proc
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
void
*
rxp
[
fp
->
nb_antennas_rx
],
*
txp
[
fp
->
nb_antennas_tx
];
void
*
rxp
[
fp
->
nb_antennas_rx
];
unsigned
int
rxs
,
txs
;
unsigned
int
rxs
;
int
i
;
int
tx_sfoffset
=
(
eNB
->
single_thread_flag
==
1
)
?
3
:
2
;
openair0_timestamp
ts
,
old_ts
;
if
(
proc
->
first_rx
==
0
)
{
// Transmit TX buffer based on timestamp from RX
// printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
(
proc
->
timestamp_rx
+
(
tx_sfoffset
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
)
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
1
);
// prepare tx buffer pointers
lte_subframe_t
SF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
tx_sfoffset
)
%
10
);
int
i
;
lte_subframe_t
prevSF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
tx_sfoffset
+
9
)
%
10
);
openair0_timestamp
ts
,
old_ts
;
lte_subframe_t
nextSF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
tx_sfoffset
+
1
)
%
10
);
if
((
SF_type
==
SF_DL
)
||
(
SF_type
==
SF_S
))
{
for
(
i
=
0
;
i
<
fp
->
nb_antennas_tx
;
i
++
)
txp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
txdata
[
0
][
i
][((
proc
->
subframe_rx
+
tx_sfoffset
)
%
10
)
*
fp
->
samples_per_tti
];
int
siglen
=
fp
->
samples_per_tti
,
flags
=
1
;
if
(
SF_type
==
SF_S
)
{
siglen
=
fp
->
dl_symbols_in_S_subframe
*
(
fp
->
ofdm_symbol_size
+
fp
->
nb_prefix_samples0
);
flags
=
3
;
// end of burst
}
if
((
fp
->
frame_type
==
TDD
)
&&
(
SF_type
==
SF_DL
)
&&
(
prevSF_type
==
SF_UL
)
&&
(
nextSF_type
==
SF_DL
))
flags
=
2
;
// start of burst
if
((
fp
->
frame_type
==
TDD
)
&&
(
SF_type
==
SF_DL
)
&&
(
prevSF_type
==
SF_UL
)
&&
(
nextSF_type
==
SF_UL
))
flags
=
4
;
// start of burst and end of burst (only one DL SF between two UL)
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
1
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS
,
flags
);
txs
=
eNB
->
rfdevice
.
trx_write_func
(
&
eNB
->
rfdevice
,
proc
->
timestamp_rx
+
eNB
->
ts_offset
+
(
tx_sfoffset
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
,
txp
,
siglen
,
fp
->
nb_antennas_tx
,
flags
);
clock_gettime
(
CLOCK_MONOTONIC
,
&
end_rf
);
end_rf_ts
=
proc
->
timestamp_rx
+
eNB
->
ts_offset
+
(
tx_sfoffset
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
;
if
(
recv_if_count
!=
0
)
{
recv_if_count
=
recv_if_count
-
1
;
LOG_D
(
HW
,
"[From Timestamp %d to Timestamp %d] RTT_RF: %"
PRId64
"; RTT_RF
\n
"
,
start_rf_prev_ts
,
end_rf_ts
,
clock_difftime_ns
(
start_rf_prev
,
end_rf
));
LOG_D
(
HW
,
"[From Timestamp %d to Timestamp %d] RTT_RF: %"
PRId64
"; RTT_RF
\n
"
,
start_rf_prev2_ts
,
end_rf_ts
,
clock_difftime_ns
(
start_rf_prev2
,
end_rf
));
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
0
);
if
(
txs
!=
siglen
)
{
LOG_E
(
PHY
,
"TX : Timeout (sent %d/%d)
\n
"
,
txs
,
fp
->
samples_per_tti
);
exit_fun
(
"problem transmitting samples"
);
}
}
}
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
rxp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
rxdata
[
0
][
i
][
*
subframe
*
fp
->
samples_per_tti
];
rxp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
rxdata
[
0
][
i
][
*
subframe
*
fp
->
samples_per_tti
];
...
@@ -1059,6 +1001,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
...
@@ -1059,6 +1001,7 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
exit_fun
(
"problem receiving samples"
);
exit_fun
(
"problem receiving samples"
);
}
}
...
@@ -1524,6 +1467,74 @@ static void* eNB_thread_prach( void* param ) {
...
@@ -1524,6 +1467,74 @@ static void* eNB_thread_prach( void* param ) {
}
}
void
tx_rf
(
PHY_VARS_eNB
*
eNB
)
{
eNB_proc_t
*
proc
=
&
eNB
->
proc
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
void
*
txp
[
fp
->
nb_antennas_tx
];
unsigned
int
txs
;
int
i
;
openair0_timestamp
ts
,
old_ts
;
// Transmit TX buffer based on timestamp from RX
// printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
(
proc
->
timestamp_rx
+
(
4
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
)
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
1
);
// prepare tx buffer pointers
lte_subframe_t
SF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
4
)
%
10
);
lte_subframe_t
prevSF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
4
+
9
)
%
10
);
lte_subframe_t
nextSF_type
=
subframe_select
(
fp
,(
proc
->
subframe_rx
+
4
+
1
)
%
10
);
if
((
SF_type
==
SF_DL
)
||
(
SF_type
==
SF_S
))
{
for
(
i
=
0
;
i
<
fp
->
nb_antennas_tx
;
i
++
)
txp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
txdata
[
0
][
i
][((
proc
->
subframe_rx
+
4
)
%
10
)
*
fp
->
samples_per_tti
];
int
siglen
=
fp
->
samples_per_tti
,
flags
=
1
;
if
(
SF_type
==
SF_S
)
{
siglen
=
fp
->
dl_symbols_in_S_subframe
*
(
fp
->
ofdm_symbol_size
+
fp
->
nb_prefix_samples0
);
flags
=
3
;
// end of burst
}
if
((
fp
->
frame_type
==
TDD
)
&&
(
SF_type
==
SF_DL
)
&&
(
prevSF_type
==
SF_UL
)
&&
(
nextSF_type
==
SF_DL
))
flags
=
2
;
// start of burst
if
((
fp
->
frame_type
==
TDD
)
&&
(
SF_type
==
SF_DL
)
&&
(
prevSF_type
==
SF_UL
)
&&
(
nextSF_type
==
SF_UL
))
flags
=
4
;
// start of burst and end of burst (only one DL SF between two UL)
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
1
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS
,
flags
);
txs
=
eNB
->
rfdevice
.
trx_write_func
(
&
eNB
->
rfdevice
,
proc
->
timestamp_rx
+
eNB
->
ts_offset
+
(
4
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
,
txp
,
siglen
,
fp
->
nb_antennas_tx
,
flags
);
clock_gettime
(
CLOCK_MONOTONIC
,
&
end_rf
);
end_rf_ts
=
proc
->
timestamp_rx
+
eNB
->
ts_offset
+
(
4
*
fp
->
samples_per_tti
)
-
openair0_cfg
[
0
].
tx_sample_advance
;
if
(
recv_if_count
!=
0
)
{
recv_if_count
=
recv_if_count
-
1
;
LOG_D
(
HW
,
"[From Timestamp %d to Timestamp %d] RTT_RF: %"
PRId64
"; RTT_RF
\n
"
,
start_rf_prev_ts
,
end_rf_ts
,
clock_difftime_ns
(
start_rf_prev
,
end_rf
));
LOG_D
(
HW
,
"[From Timestamp %d to Timestamp %d] RTT_RF: %"
PRId64
"; RTT_RF
\n
"
,
start_rf_prev2_ts
,
end_rf_ts
,
clock_difftime_ns
(
start_rf_prev2
,
end_rf
));
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE
,
0
);
if
(
txs
!=
siglen
)
{
LOG_E
(
PHY
,
"TX : Timeout (sent %d/%d)
\n
"
,
txs
,
fp
->
samples_per_tti
);
exit_fun
(
"problem transmitting samples"
);
}
}
}
static
void
*
eNB_thread_single
(
void
*
param
)
{
static
void
*
eNB_thread_single
(
void
*
param
)
{
...
@@ -1684,6 +1695,9 @@ static void* eNB_thread_single( void* param ) {
...
@@ -1684,6 +1695,9 @@ static void* eNB_thread_single( void* param ) {
wakeup_slaves
(
proc
);
wakeup_slaves
(
proc
);
if
(
rxtx
(
eNB
,
proc_rxtx
,
"eNB_thread_single"
)
<
0
)
break
;
if
(
rxtx
(
eNB
,
proc_rxtx
,
"eNB_thread_single"
)
<
0
)
break
;
if
((
eNB
->
node_function
!=
NGFI_RCC_IF4p5
)
&&
(
eNB
->
node_function
!=
eNodeB_3GPP_BBU
))
tx_rf
(
eNB
);
}
}
...
...
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