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
spbro
OpenXG-RAN
Commits
ebd70a39
Commit
ebd70a39
authored
Apr 04, 2023
by
francescomani
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_pbch_errors_at_MAC' into integration_2023_w14
parents
a6862df7
5c333cca
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
125 additions
and
162 deletions
+125
-162
executables/nr-ue.c
executables/nr-ue.c
+0
-5
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+2
-1
openair1/PHY/INIT/nr_init_ue.c
openair1/PHY/INIT/nr_init_ue.c
+0
-3
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+1
-13
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+31
-25
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+0
-1
openair1/PHY/defs_nr_UE.h
openair1/PHY/defs_nr_UE.h
+0
-14
openair1/SCHED_NR_UE/defs.h
openair1/SCHED_NR_UE/defs.h
+1
-1
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+19
-42
openair1/SIMULATION/NR_PHY/pbchsim.c
openair1/SIMULATION/NR_PHY/pbchsim.c
+2
-3
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+3
-2
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+1
-0
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+2
-2
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+4
-2
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+59
-48
No files found.
executables/nr-ue.c
View file @
ebd70a39
...
...
@@ -774,7 +774,6 @@ void *UE_thread(void *arg) {
fapi_nr_config_request_t
*
cfg
=
&
UE
->
nrUE_config
;
AssertFatal
(
0
==
openair0_device_load
(
&
(
UE
->
rfdevice
),
&
openair0_cfg
[
0
]),
""
);
UE
->
rfdevice
.
host_type
=
RAU_HOST
;
UE
->
lost_sync
=
0
;
UE
->
is_synchronized
=
0
;
AssertFatal
(
UE
->
rfdevice
.
trx_start_func
(
&
UE
->
rfdevice
)
==
0
,
"Could not start the device
\n
"
);
...
...
@@ -803,10 +802,6 @@ void *UE_thread(void *arg) {
}
while
(
!
oai_exit
)
{
if
(
UE
->
lost_sync
)
{
UE
->
is_synchronized
=
0
;
UE
->
lost_sync
=
0
;
}
if
(
syncRunning
)
{
notifiedFIFO_elt_t
*
res
=
tryPullTpool
(
&
nf
,
&
(
get_nrUE_params
()
->
Tpool
));
...
...
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
View file @
ebd70a39
...
...
@@ -117,7 +117,8 @@ typedef struct {
}
fapi_nr_pdsch_pdu_t
;
typedef
struct
{
uint8_t
*
pdu
;
// 3bytes
bool
decoded_pdu
;
uint8_t
pdu
[
3
];
uint8_t
additional_bits
;
uint8_t
ssb_index
;
uint8_t
ssb_length
;
...
...
openair1/PHY/INIT/nr_init_ue.c
View file @
ebd70a39
...
...
@@ -202,7 +202,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// create shortcuts
NR_DL_FRAME_PARMS
*
const
fp
=
&
ue
->
frame_parms
;
NR_UE_COMMON
*
const
common_vars
=
&
ue
->
common_vars
;
NR_UE_PBCH
**
const
pbch_vars
=
ue
->
pbch_vars
;
NR_UE_PRACH
**
const
prach_vars
=
ue
->
prach_vars
;
NR_UE_CSI_IM
**
const
csiim_vars
=
ue
->
csiim_vars
;
NR_UE_CSI_RS
**
const
csirs_vars
=
ue
->
csirs_vars
;
...
...
@@ -357,7 +356,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// DLSCH
for
(
gNB_id
=
0
;
gNB_id
<
ue
->
n_connected_gNB
;
gNB_id
++
)
{
prach_vars
[
gNB_id
]
=
(
NR_UE_PRACH
*
)
malloc16_clear
(
sizeof
(
NR_UE_PRACH
));
pbch_vars
[
gNB_id
]
=
(
NR_UE_PBCH
*
)
malloc16_clear
(
sizeof
(
NR_UE_PBCH
));
csiim_vars
[
gNB_id
]
=
(
NR_UE_CSI_IM
*
)
malloc16_clear
(
sizeof
(
NR_UE_CSI_IM
));
csirs_vars
[
gNB_id
]
=
(
NR_UE_CSI_RS
*
)
malloc16_clear
(
sizeof
(
NR_UE_CSI_RS
));
srs_vars
[
gNB_id
]
=
(
NR_UE_SRS
*
)
malloc16_clear
(
sizeof
(
NR_UE_SRS
));
...
...
@@ -476,7 +474,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero
(
ue
->
csirs_vars
[
gNB_id
]);
free_and_zero
(
ue
->
srs_vars
[
gNB_id
]);
free_and_zero
(
ue
->
pbch_vars
[
gNB_id
]);
free_and_zero
(
ue
->
prach_vars
[
gNB_id
]);
}
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
View file @
ebd70a39
...
...
@@ -155,12 +155,11 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
proc
,
i
,
i
-
pbch_initial_symbol
,
temp_ptr
->
i_ssb
,
temp_ptr
->
n_hf
,
rxdataF
);
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
fapiPbch_t
result
;
fapiPbch_t
result
=
{
0
}
;
ret
=
nr_rx_pbch
(
ue
,
proc
,
estimateSz
,
dl_ch_estimates
,
ue
->
pbch_vars
[
0
],
frame_parms
,
temp_ptr
->
i_ssb
,
SISO
,
...
...
@@ -188,11 +187,6 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
// openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1;
// flip byte endian on 24-bits for MIB
// dummy = ue->pbch_vars[0]->decoded_output[0];
// ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2];
// ue->pbch_vars[0]->decoded_output[2] = dummy;
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"[UE%d] Initial sync: pbch decoded sucessfully
\n
"
,
ue
->
Mod_id
);
#endif
...
...
@@ -447,8 +441,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
// send sync status to higher layers later when timing offset converge to target timing
ue
->
pbch_vars
[
0
]
->
pdu_errors_conseq
=
0
;
}
...
...
@@ -466,10 +458,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
frame_parms
->
Nid_cell
,
frame_parms
->
frame_type
);
#endif
ue
->
pbch_vars
[
0
]
->
pdu_errors_last
=
ue
->
pbch_vars
[
0
]
->
pdu_errors
;
ue
->
pbch_vars
[
0
]
->
pdu_errors
++
;
ue
->
pbch_vars
[
0
]
->
pdu_errors_conseq
++
;
}
// gain control
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
View file @
ebd70a39
...
...
@@ -302,8 +302,7 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
#endif
}
static
void
nr_pbch_unscrambling
(
NR_UE_PBCH
*
pbch
,
int16_t
*
demod_pbch_e
,
static
void
nr_pbch_unscrambling
(
int16_t
*
demod_pbch_e
,
uint16_t
Nid
,
uint8_t
nushift
,
uint16_t
M
,
...
...
@@ -311,7 +310,8 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch,
uint8_t
bitwise
,
uint32_t
unscrambling_mask
,
uint32_t
pbch_a_prime
,
uint32_t
*
pbch_a_interleaved
)
{
uint32_t
*
pbch_a_interleaved
)
{
uint8_t
reset
,
offset
;
uint32_t
x1
=
0
,
x2
=
0
,
s
=
0
;
uint8_t
k
=
0
;
...
...
@@ -384,17 +384,17 @@ unsigned char sign(int8_t x) {
uint8_t
pbch_deinterleaving_pattern
[
32
]
=
{
28
,
0
,
31
,
30
,
7
,
29
,
25
,
27
,
5
,
8
,
24
,
9
,
10
,
11
,
12
,
13
,
1
,
4
,
3
,
14
,
15
,
16
,
17
,
2
,
26
,
18
,
19
,
20
,
21
,
22
,
6
,
23
};
int
nr_rx_pbch
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
]
,
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
nr_phy_data_t
*
phy_data
,
fapiPbch_t
*
result
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
int
nr_rx_pbch
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
]
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
nr_phy_data_t
*
phy_data
,
fapiPbch_t
*
result
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
int
max_h
=
0
;
int
symbol
;
//uint8_t pbch_a[64];
...
...
@@ -456,7 +456,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
}
#ifdef DEBUG_PBCH
LOG_I
(
PHY
,
"[PHY] PBCH log2_maxh = %d (%d)
\n
"
,
nr_ue_pbch_vars
->
log2_maxh
,
max_h
);
LOG_I
(
PHY
,
"[PHY] PBCH log2_maxh = %d (%d)
\n
"
,
log2_maxh
,
max_h
);
#endif
__attribute__
((
aligned
(
32
)))
struct
complex16
rxdataF_comp
[
frame_parms
->
nb_antennas_rx
][
PBCH_MAX_RE_PER_SYMBOL
];
nr_pbch_channel_compensation
(
rxdataF_ext
,
...
...
@@ -464,7 +464,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
nb_re
,
rxdataF_comp
,
frame_parms
,
log2_maxh
);
// log2_maxh+I0_shift
log2_maxh
);
// log2_maxh+I0_shift
/*if (frame_parms->nb_antennas_rx > 1)
pbch_detection_mrc(frame_parms,
...
...
@@ -504,16 +504,25 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
uint32_t
unscrambling_mask
=
(
Lmax
==
64
)
?
0x100006D
:
0x1000041
;
uint32_t
pbch_a_interleaved
=
0
;
uint32_t
pbch_a_prime
=
0
;
nr_pbch_unscrambling
(
nr_ue_pbch_vars
,
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_E
,
nr_pbch_unscrambling
(
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_E
,
0
,
0
,
pbch_a_prime
,
&
pbch_a_interleaved
);
//polar decoding de-rate matching
uint64_t
tmp
=
0
;
decoderState
=
polar_decoder_int16
(
pbch_e_rx
,(
uint64_t
*
)
&
tmp
,
0
,
NR_POLAR_PBCH_MESSAGE_TYPE
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
NR_POLAR_PBCH_AGGREGATION_LEVEL
);
pbch_a_prime
=
tmp
;
if
(
decoderState
)
return
(
decoderState
);
pbch_a_prime
=
tmp
;
nr_downlink_indication_t
dl_indication
;
fapi_nr_rx_indication_t
rx_ind
=
{
0
};
uint16_t
number_pdus
=
1
;
if
(
decoderState
)
{
nr_fill_dl_indication
(
&
dl_indication
,
NULL
,
&
rx_ind
,
proc
,
ue
,
phy_data
);
nr_fill_rx_indication
(
&
rx_ind
,
FAPI_NR_RX_PDU_TYPE_SSB
,
ue
,
NULL
,
NULL
,
number_pdus
,
proc
,
NULL
,
NULL
);
if
(
ue
->
if_inst
&&
ue
->
if_inst
->
dl_indication
)
ue
->
if_inst
->
dl_indication
(
&
dl_indication
,
NULL
);
return
(
decoderState
);
}
// printf("polar decoder output 0x%08x\n",pbch_a_prime);
// Decoder reversal
uint32_t
a_reversed
=
0
;
...
...
@@ -526,7 +535,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
M
=
(
Lmax
==
64
)
?
(
NR_POLAR_PBCH_PAYLOAD_BITS
-
6
)
:
(
NR_POLAR_PBCH_PAYLOAD_BITS
-
3
);
nushift
=
((
pbch_a_prime
>>
24
)
&
1
)
^
(((
pbch_a_prime
>>
6
)
&
1
)
<<
1
);
pbch_a_interleaved
=
0
;
nr_pbch_unscrambling
(
nr_ue_pbch_vars
,
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
nr_pbch_unscrambling
(
pbch_e_rx
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_PAYLOAD_BITS
,
1
,
unscrambling_mask
,
pbch_a_prime
,
&
pbch_a_interleaved
);
//printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) );
//payload deinterleaving
...
...
@@ -577,12 +586,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
}
#endif
nr_downlink_indication_t
dl_indication
;
fapi_nr_rx_indication_t
rx_ind
=
{
0
};
uint16_t
number_pdus
=
1
;
nr_fill_dl_indication
(
&
dl_indication
,
NULL
,
&
rx_ind
,
proc
,
ue
,
phy_data
);
nr_fill_rx_indication
(
&
rx_ind
,
FAPI_NR_RX_PDU_TYPE_SSB
,
ue
,
NULL
,
NULL
,
number_pdus
,
proc
,(
void
*
)
result
,
NULL
);
nr_fill_rx_indication
(
&
rx_ind
,
FAPI_NR_RX_PDU_TYPE_SSB
,
ue
,
NULL
,
NULL
,
number_pdus
,
proc
,
(
void
*
)
result
,
NULL
);
if
(
ue
->
if_inst
&&
ue
->
if_inst
->
dl_indication
)
ue
->
if_inst
->
dl_indication
(
&
dl_indication
,
NULL
);
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
ebd70a39
...
...
@@ -287,7 +287,6 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t
*
proc
,
const
int
estimateSz
,
struct
complex16
dl_ch_estimates
[][
estimateSz
],
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
...
...
openair1/PHY/defs_nr_UE.h
View file @
ebd70a39
...
...
@@ -320,17 +320,6 @@ typedef struct {
#define PBCH_A 24
typedef
struct
{
/// \brief Total number of PDU errors.
uint32_t
pdu_errors
;
/// \brief Total number of PDU errors 128 frames ago.
uint32_t
pdu_errors_last
;
/// \brief Total number of consecutive PDU errors.
uint32_t
pdu_errors_conseq
;
/// \brief FER (in percent) .
//uint32_t pdu_fer;
}
NR_UE_PBCH
;
typedef
struct
{
int16_t
amp
;
bool
active
;
...
...
@@ -403,8 +392,6 @@ typedef struct {
int
is_synchronized
;
/// \brief Target gNB Nid_cell when UE is resynchronizing
int
target_Nid_cell
;
/// \brief Indicator that UE lost frame synchronization
int
lost_sync
;
/// Data structure for UE process scheduling
UE_nr_proc_t
proc
;
/// Flag to indicate the UE shouldn't do timing correction at all
...
...
@@ -445,7 +432,6 @@ typedef struct {
fapi_nr_config_request_t
nrUE_config
;
nr_synch_request_t
synch_request
;
NR_UE_PBCH
*
pbch_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_PRACH
*
prach_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_CSI_IM
*
csiim_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
NR_UE_CSI_RS
*
csirs_vars
[
NUMBER_OF_CONNECTED_gNB_MAX
];
...
...
openair1/SCHED_NR_UE/defs.h
View file @
ebd70a39
...
...
@@ -83,7 +83,7 @@
typedef
struct
{
uint8_t
decoded_output
[
64
];
uint8_t
decoded_output
[
3
];
// PBCH paylod not larger than 3B
uint8_t
xtra_byte
;
}
fapiPbch_t
;
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
ebd70a39
...
...
@@ -119,10 +119,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
uint16_t
n_pdus
,
UE_nr_rxtx_proc_t
*
proc
,
void
*
typeSpecific
,
uint8_t
*
b
){
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
uint8_t
*
b
)
{
if
(
n_pdus
>
1
){
LOG_E
(
PHY
,
"In %s: multiple number of DL PDUs not supported yet...
\n
"
,
__FUNCTION__
);
}
...
...
@@ -155,17 +153,23 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
AssertFatal
(
1
==
0
,
"Second codeword currently not supported
\n
"
);
}
break
;
case
FAPI_NR_RX_PDU_TYPE_SSB
:
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
pdu
=
malloc
(
sizeof
(((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
));
memcpy
(
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
pdu
,
((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
,
sizeof
(((
fapiPbch_t
*
)
typeSpecific
)
->
decoded_output
));
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
additional_bits
=
((
fapiPbch_t
*
)
typeSpecific
)
->
xtra_byte
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_index
=
(
frame_parms
->
ssb_index
)
&
0x7
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_length
=
frame_parms
->
Lmax
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
cell_id
=
frame_parms
->
Nid_cell
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
ssb_start_subcarrier
=
frame_parms
->
ssb_start_subcarrier
;
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
.
rsrp_dBm
=
ue
->
measurements
.
ssb_rsrp_dBm
[
frame_parms
->
ssb_index
];
case
FAPI_NR_RX_PDU_TYPE_SSB
:
{
fapi_nr_ssb_pdu_t
*
ssb_pdu
=
&
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
ssb_pdu
;
if
(
typeSpecific
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
fapiPbch_t
*
pbch
=
(
fapiPbch_t
*
)
typeSpecific
;
memcpy
(
ssb_pdu
->
pdu
,
pbch
->
decoded_output
,
sizeof
(
pbch
->
decoded_output
));
ssb_pdu
->
additional_bits
=
pbch
->
xtra_byte
;
ssb_pdu
->
ssb_index
=
(
frame_parms
->
ssb_index
)
&
0x7
;
ssb_pdu
->
ssb_length
=
frame_parms
->
Lmax
;
ssb_pdu
->
cell_id
=
frame_parms
->
Nid_cell
;
ssb_pdu
->
ssb_start_subcarrier
=
frame_parms
->
ssb_start_subcarrier
;
ssb_pdu
->
rsrp_dBm
=
ue
->
measurements
.
ssb_rsrp_dBm
[
frame_parms
->
ssb_index
];
ssb_pdu
->
decoded_pdu
=
true
;
}
else
ssb_pdu
->
decoded_pdu
=
false
;
}
break
;
case
FAPI_NR_CSIRS_IND
:
memcpy
(
&
rx_ind
->
rx_indication_body
[
n_pdus
-
1
].
csirs_measurements
,
...
...
@@ -383,7 +387,6 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
proc
,
estimateSz
,
dl_ch_estimates
,
ue
->
pbch_vars
[
gNB_id
],
&
ue
->
frame_parms
,
(
ue
->
frame_parms
.
ssb_index
)
&
7
,
SISO
,
...
...
@@ -393,8 +396,6 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
if
(
ret
==
0
)
{
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
=
0
;
#ifdef DEBUG_PHY_PROC
uint16_t
frame_tx
;
LOG_D
(
PHY
,
"[UE %d] frame %d, nr_slot_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d
\n
"
,
...
...
@@ -427,36 +428,12 @@ static void nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
write_output("H10.m","h10",&(ue->common_vars.dl_ch_estimates[0][2][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1);
write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],8*ue->frame_parms.ofdm_symbol_size,1,1);
write_output("PBCH_rxF0_ext.m","pbch0_ext",ue->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1);
write_output("PBCH_rxF0_comp.m","pbch0_comp",ue->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1);
write_output("PBCH_rxF_llr.m","pbch_llr",ue->pbch_vars[0]->llr,(ue->frame_parms.Ncp==0) ? 1920 : 1728,1,4);
exit(-1);
*/
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
++
;
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
++
;
if
(
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
>=
100
)
{
if
(
get_softmodem_params
()
->
non_stop
)
{
LOG_E
(
PHY
,
"More that 100 consecutive PBCH errors! Going back to Sync mode!
\n
"
);
ue
->
lost_sync
=
1
;
}
else
{
LOG_E
(
PHY
,
"More that 100 consecutive PBCH errors! Exiting!
\n
"
);
exit_fun
(
"More that 100 consecutive PBCH errors! Exiting!
\n
"
);
}
}
}
if
(
frame_rx
%
100
==
0
)
{
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_last
=
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
;
}
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!
\n
"
,
ue
->
Mod_id
,
frame_rx
,
nr_slot_rx
,
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors
,
ue
->
pbch_vars
[
gNB_id
]
->
pdu_errors_conseq
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES
,
VCD_FUNCTION_OUT
);
}
...
...
openair1/SIMULATION/NR_PHY/pbchsim.c
View file @
ebd70a39
...
...
@@ -794,8 +794,8 @@ int main(int argc, char **argv)
fapiPbch_t
result
;
ret
=
nr_rx_pbch
(
UE
,
&
proc
,
estimateSz
,
dl_ch_estimates
,
UE
->
pbch_vars
[
0
]
,
estimateSz
,
dl_ch_estimates
,
frame_parms
,
ssb_index
%
8
,
SISO
,
...
...
@@ -814,7 +814,6 @@ int main(int argc, char **argv)
for
(
i
=
0
;
i
<
3
;
i
++
){
payload_ret
+=
(
result
.
decoded_output
[
i
]
==
((
msgDataTx
.
ssb
[
ssb_index
].
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
(
8
*
i
))
&
0xff
));
}
//printf("xtra byte gNB: 0x%02x UE: 0x%02x\n",gNB_xtra_byte, UE->pbch_vars[0]->xtra_byte);
//printf("ret %d\n", payload_ret);
if
(
payload_ret
!=
4
)
n_errors_payload
++
;
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
ebd70a39
...
...
@@ -376,8 +376,9 @@ typedef struct {
uint32_t
ssb_index
;
/// SSB RSRP in dBm
short
ssb_rsrp_dBm
;
int
consecutive_bch_failures
;
}
NR_
PHY
_meas_t
;
}
NR_
SSB
_meas_t
;
/*!\brief Top level UE MAC structure */
typedef
struct
{
...
...
@@ -465,7 +466,7 @@ typedef struct {
uint16_t
nr_band
;
uint8_t
ssb_subcarrier_offset
;
NR_
PHY_meas_t
phy
_measurements
;
NR_
SSB_meas_t
ssb
_measurements
;
dci_pdu_rel15_t
def_dci_pdu_rel15
[
NR_MAX_SLOTS_PER_FRAME
][
8
];
...
...
openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
View file @
ebd70a39
...
...
@@ -55,6 +55,7 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
nr_ue_mac_inst
->
sib1_decoded
=
false
;
nr_ue_mac_inst
->
phy_config_request_sent
=
false
;
nr_ue_mac_inst
->
state
=
UE_NOT_SYNC
;
memset
(
&
nr_ue_mac_inst
->
ssb_measurements
,
0
,
sizeof
(
nr_ue_mac_inst
->
ssb_measurements
));
for
(
int
j
=
0
;
j
<
NB_NR_UE_MAC_INST
;
j
++
)
{
nr_ue_init_mac
(
j
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
View file @
ebd70a39
...
...
@@ -124,7 +124,7 @@ int16_t get_prach_tx_power(module_id_t mod_id) {
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
mod_id
);
RA_config_t
*
ra
=
&
mac
->
ra
;
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
);
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
);
int16_t
ra_preamble_rx_power
=
(
int16_t
)(
ra
->
prach_resources
.
ra_PREAMBLE_RECEIVED_TARGET_POWER
-
pathloss
+
30
);
return
min
(
nr_get_Pcmax
(
mod_id
),
ra_preamble_rx_power
);
...
...
@@ -674,7 +674,7 @@ void nr_get_prach_resources(module_id_t mod_id,
}
else
{
/* TODO: This controls the tx_power of UE and the ramping procedure of RA of UE. Later we
can abstract this, perhaps in the proxy. But for the time being lets leave it as below. */
int16_t
dl_pathloss
=
!
get_softmodem_params
()
->
emulate_l1
?
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
)
:
0
;
int16_t
dl_pathloss
=
!
get_softmodem_params
()
->
emulate_l1
?
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
)
:
0
;
ssb_rach_config
(
ra
,
prach_resources
,
nr_rach_ConfigCommon
);
ra_preambles_config
(
prach_resources
,
mac
,
dl_pathloss
);
LOG_D
(
MAC
,
"[RAPROC] - Selected RA preamble index %d for contention-based random access procedure...
\n
"
,
ra
->
ra_PreambleIndex
);
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
ebd70a39
...
...
@@ -238,6 +238,8 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
AssertFatal
(
mac
->
mib
!=
NULL
,
"nr_ue_decode_mib() mac->mib == NULL
\n
"
);
mac
->
ssb_measurements
.
consecutive_bch_failures
=
0
;
// resetting decoding failures
uint16_t
frame
=
(
mac
->
mib
->
systemFrameNumber
.
buf
[
0
]
>>
mac
->
mib
->
systemFrameNumber
.
bits_unused
);
uint16_t
frame_number_4lsb
=
0
;
...
...
@@ -1571,7 +1573,7 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
return
(
PUCCH_POWER_DEFAULT
);
}
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
phy
_measurements
.
ssb_rsrp_dBm
);
int16_t
pathloss
=
compute_nr_SSB_PL
(
mac
,
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
);
int
M_pucch_component
=
(
10
*
log10
((
double
)(
pow
(
2
,
scs
)
*
nb_of_prbs
)));
int16_t
pucch_power
=
P_O_PUCCH
+
M_pucch_component
+
pathloss
+
delta_F_PUCCH
+
DELTA_TF
+
G_b_f_c
;
...
...
@@ -2188,7 +2190,7 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
}
}
AssertFatal
(
*
SSB_resource
.
list
.
array
[
ssb_rsrp
[
0
][
0
]]
==
mac
->
mib_ssb
,
"Couldn't find corresponding SSB in csi_SSB_ResourceList
\n
"
);
ssb_rsrp
[
1
][
0
]
=
mac
->
phy
_measurements
.
ssb_rsrp_dBm
;
ssb_rsrp
[
1
][
0
]
=
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
;
uint8_t
ssbi
;
...
...
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
View file @
ebd70a39
...
...
@@ -305,25 +305,24 @@ static void fill_dl_info_with_pdcch(fapi_nr_dci_indication_t *dci, nfapi_nr_dl_d
static
void
fill_mib_in_rx_ind
(
nfapi_nr_dl_tti_request_pdu_t
*
pdu_list
,
fapi_nr_rx_indication_t
*
rx_ind
,
int
pdu_idx
,
int
pdu_type
)
{
AssertFatal
(
pdu_idx
<
sizeof
(
rx_ind
->
rx_indication_body
)
/
sizeof
(
rx_ind
->
rx_indication_body
[
0
]),
"pdu_index (%d) is greater than rx_indication_body size!
\n
"
,
pdu_idx
);
AssertFatal
(
pdu_idx
==
rx_ind
->
number_pdus
,
"Invalid pdu_idx %d!
\n
"
,
pdu_idx
);
LOG_T
(
NR_MAC
,
"Recevied an SSB and are filling rx_ind with the MIB!
\n
"
);
nfapi_nr_dl_tti_ssb_pdu_rel15_t
*
ssb_pdu
=
&
pdu_list
->
ssb_pdu
.
ssb_pdu_rel15
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
cell_id
=
ssb_pdu
->
PhysCellId
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
=
MALLOC
(
3
*
sizeof
(
*
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
));
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
0
]
=
(
ssb_pdu
->
bchPayload
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
1
]
=
(
ssb_pdu
->
bchPayload
>>
8
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
2
]
=
(
ssb_pdu
->
bchPayload
>>
16
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
rsrp_dBm
=
ssb_pdu
->
ssbRsrp
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_index
=
ssb_pdu
->
SsbBlockIndex
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_length
=
pdu_list
->
PDUSize
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_start_subcarrier
=
ssb_pdu
->
SsbSubcarrierOffset
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
pdu_type
=
pdu_type
;
rx_ind
->
number_pdus
=
pdu_idx
+
1
;
AssertFatal
(
pdu_idx
<
sizeof
(
rx_ind
->
rx_indication_body
)
/
sizeof
(
rx_ind
->
rx_indication_body
[
0
]),
"pdu_index (%d) is greater than rx_indication_body size!
\n
"
,
pdu_idx
);
AssertFatal
(
pdu_idx
==
rx_ind
->
number_pdus
,
"Invalid pdu_idx %d!
\n
"
,
pdu_idx
);
LOG_T
(
NR_MAC
,
"Recevied an SSB and are filling rx_ind with the MIB!
\n
"
);
nfapi_nr_dl_tti_ssb_pdu_rel15_t
*
ssb_pdu
=
&
pdu_list
->
ssb_pdu
.
ssb_pdu_rel15
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
cell_id
=
ssb_pdu
->
PhysCellId
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
0
]
=
(
ssb_pdu
->
bchPayload
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
1
]
=
(
ssb_pdu
->
bchPayload
>>
8
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
pdu
[
2
]
=
(
ssb_pdu
->
bchPayload
>>
16
)
&
0xff
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
rsrp_dBm
=
ssb_pdu
->
ssbRsrp
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_index
=
ssb_pdu
->
SsbBlockIndex
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_length
=
pdu_list
->
PDUSize
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
ssb_start_subcarrier
=
ssb_pdu
->
SsbSubcarrierOffset
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
ssb_pdu
.
decoded_pdu
=
true
;
rx_ind
->
rx_indication_body
[
pdu_idx
].
pdu_type
=
pdu_type
;
rx_ind
->
number_pdus
=
pdu_idx
+
1
;
}
static
bool
is_my_dci
(
NR_UE_MAC_INST_t
*
mac
,
nfapi_nr_dl_dci_pdu_t
*
received_pdu
)
...
...
@@ -1046,16 +1045,24 @@ int handle_bcch_bch(module_id_t module_id, int cc_id,
uint16_t
ssb_start_subcarrier
,
uint16_t
cell_id
){
return
nr_ue_decode_mib
(
module_id
,
cc_id
,
gNB_index
,
phy_data
,
additional_bits
,
ssb_length
,
// Lssb = 64 is not support
ssb_index
,
pduP
,
ssb_start_subcarrier
,
cell_id
);
cc_id
,
gNB_index
,
phy_data
,
additional_bits
,
ssb_length
,
// Lssb = 64 is not support
ssb_index
,
pduP
,
ssb_start_subcarrier
,
cell_id
);
}
void
handle_bch_failure
(
NR_UE_MAC_INST_t
*
mac
)
{
mac
->
ssb_measurements
.
consecutive_bch_failures
++
;
//TODO handle this properly by scheduling re-synchronization
AssertFatal
(
mac
->
ssb_measurements
.
consecutive_bch_failures
<
100
,
"Radio link failure caused by 100 consecutive PBCH detection failures.
\n
"
);
}
// L2 Abstraction Layer
...
...
@@ -1070,10 +1077,10 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
}
void
handle_ssb_meas
(
NR_UE_MAC_INST_t
*
mac
,
uint8_t
ssb_index
,
int16_t
rsrp_dbm
)
void
handle_ssb_meas
(
NR_UE_MAC_INST_t
*
mac
,
uint8_t
ssb_index
,
int16_t
rsrp_dbm
)
{
mac
->
phy
_measurements
.
ssb_index
=
ssb_index
;
mac
->
phy
_measurements
.
ssb_rsrp_dBm
=
rsrp_dbm
;
mac
->
ssb
_measurements
.
ssb_index
=
ssb_index
;
mac
->
ssb
_measurements
.
ssb_rsrp_dBm
=
rsrp_dbm
;
}
// L2 Abstraction Layer
...
...
@@ -1188,31 +1195,35 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
for
(
int
i
=
0
;
i
<
dl_info
->
rx_ind
->
number_pdus
;
++
i
)
{
fapi_nr_rx_indication_body_t
rx_indication_body
=
dl_info
->
rx_ind
->
rx_indication_body
[
i
];
LOG_D
(
NR_MAC
,
"In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs
\n
"
,
__FUNCTION__
,
dl_info
->
rx_ind
->
rx_indication_body
[
i
]
.
pdu_type
,
rx_indication_body
.
pdu_type
,
dl_info
->
rx_ind
->
number_pdus
);
switch
(
dl_info
->
rx_ind
->
rx_indication_body
[
i
]
.
pdu_type
){
switch
(
rx_indication_body
.
pdu_type
){
case
FAPI_NR_RX_PDU_TYPE_SSB
:
handle_ssb_meas
(
mac
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
rsrp_dBm
);
ret_mask
|=
(
handle_bcch_bch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
dl_info
->
phy_data
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
pdu
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
additional_bits
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_length
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
ssb_start_subcarrier
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
cell_id
))
<<
FAPI_NR_RX_PDU_TYPE_SSB
;
free
((
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
ssb_pdu
.
pdu
);
if
(
rx_indication_body
.
ssb_pdu
.
decoded_pdu
)
{
handle_ssb_meas
(
mac
,
rx_indication_body
.
ssb_pdu
.
ssb_index
,
rx_indication_body
.
ssb_pdu
.
rsrp_dBm
);
ret_mask
|=
(
handle_bcch_bch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
dl_info
->
phy_data
,
rx_indication_body
.
ssb_pdu
.
pdu
,
rx_indication_body
.
ssb_pdu
.
additional_bits
,
rx_indication_body
.
ssb_pdu
.
ssb_index
,
rx_indication_body
.
ssb_pdu
.
ssb_length
,
rx_indication_body
.
ssb_pdu
.
ssb_start_subcarrier
,
rx_indication_body
.
ssb_pdu
.
cell_id
))
<<
FAPI_NR_RX_PDU_TYPE_SSB
;
}
else
handle_bch_failure
(
mac
);
break
;
case
FAPI_NR_RX_PDU_TYPE_SIB
:
ret_mask
|=
(
handle_bcch_dlsch
(
dl_info
->
module_id
,
dl_info
->
cc_id
,
dl_info
->
gNB_index
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
ack_nack
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
pdu
,
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
pdsch_pdu
.
pdu_length
))
<<
FAPI_NR_RX_PDU_TYPE_SIB
;
rx_indication_body
.
pdsch_pdu
.
ack_nack
,
rx_indication_body
.
pdsch_pdu
.
pdu
,
rx_indication_body
.
pdsch_pdu
.
pdu_length
))
<<
FAPI_NR_RX_PDU_TYPE_SIB
;
break
;
case
FAPI_NR_RX_PDU_TYPE_DLSCH
:
ret_mask
|=
(
handle_dlsch
(
dl_info
,
ul_time_alignment
,
i
))
<<
FAPI_NR_RX_PDU_TYPE_DLSCH
;
...
...
@@ -1224,7 +1235,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
ret_mask
|=
(
handle_csirs_measurements
(
dl_info
->
module_id
,
dl_info
->
frame
,
dl_info
->
slot
,
&
(
dl_info
->
rx_ind
->
rx_indication_body
+
i
)
->
csirs_measurements
))
<<
FAPI_NR_CSIRS_IND
;
&
rx_indication_body
.
csirs_measurements
))
<<
FAPI_NR_CSIRS_IND
;
break
;
default:
break
;
...
...
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