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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
4896e80e
Commit
4896e80e
authored
Mar 31, 2021
by
hardy
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_MAC_SSB' into integration_2021_wk13_d
parents
1f3513b1
579f0290
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
568 additions
and
474 deletions
+568
-474
openair1/PHY/INIT/nr_parms.c
openair1/PHY/INIT/nr_parms.c
+1
-7
openair1/PHY/INIT/phy_init.h
openair1/PHY/INIT/phy_init.h
+1
-1
openair1/PHY/NR_TRANSPORT/nr_dci.c
openair1/PHY/NR_TRANSPORT/nr_dci.c
+2
-5
openair1/PHY/NR_TRANSPORT/nr_pbch.c
openair1/PHY/NR_TRANSPORT/nr_pbch.c
+1
-1
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+3
-1
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+6
-3
openair1/SCHED_NR/fapi_nr_l1.c
openair1/SCHED_NR/fapi_nr_l1.c
+10
-6
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+50
-72
openair1/SCHED_NR/sched_nr.h
openair1/SCHED_NR/sched_nr.h
+1
-1
openair1/SIMULATION/NR_PHY/dlsim.c
openair1/SIMULATION/NR_PHY/dlsim.c
+5
-3
openair1/SIMULATION/NR_PHY/pbchsim.c
openair1/SIMULATION/NR_PHY/pbchsim.c
+87
-81
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+2
-8
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+69
-61
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+12
-6
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+1
-1
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+34
-7
openair2/LAYER2/NR_MAC_gNB/config.c
openair2/LAYER2/NR_MAC_gNB/config.c
+7
-6
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+270
-202
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+3
-1
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+3
-1
No files found.
openair1/PHY/INIT/nr_parms.c
View file @
4896e80e
...
...
@@ -27,12 +27,9 @@
uint32_t
nr_subcarrier_spacing
[
MAX_NUM_SUBCARRIER_SPACING
]
=
{
15e3
,
30e3
,
60e3
,
120e3
,
240e3
};
uint16_t
nr_slots_per_subframe
[
MAX_NUM_SUBCARRIER_SPACING
]
=
{
1
,
2
,
4
,
8
,
16
};
int
nr_get_ssb_start_symbol
(
NR_DL_FRAME_PARMS
*
fp
)
{
int
nr_get_ssb_start_symbol
(
NR_DL_FRAME_PARMS
*
fp
,
uint8_t
i_ssb
)
{
int
mu
=
fp
->
numerology_index
;
uint8_t
half_frame_index
=
fp
->
half_frame_bit
;
uint8_t
i_ssb
=
fp
->
ssb_index
;
int
symbol
=
0
;
uint8_t
n
,
n_temp
;
nr_ssb_type_e
type
=
fp
->
ssb_type
;
...
...
@@ -69,9 +66,6 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp)
AssertFatal
(
0
==
1
,
"Invalid numerology index %d for the synchronization block
\n
"
,
mu
);
}
if
(
half_frame_index
)
symbol
+=
(
5
*
fp
->
symbols_per_slot
*
fp
->
slots_per_subframe
);
return
symbol
;
}
...
...
openair1/PHY/INIT/phy_init.h
View file @
4896e80e
...
...
@@ -392,7 +392,7 @@ void phy_config_update_sib13_request(PHY_Config_t *phy_config);
int
init_frame_parms
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
osf
);
void
dump_frame_parms
(
LTE_DL_FRAME_PARMS
*
frame_parms
);
int
nr_get_ssb_start_symbol
(
NR_DL_FRAME_PARMS
*
fp
);
int
nr_get_ssb_start_symbol
(
NR_DL_FRAME_PARMS
*
fp
,
uint8_t
i_ssb
);
int
nr_init_frame_parms
(
nfapi_nr_config_request_scf_t
*
config
,
NR_DL_FRAME_PARMS
*
frame_parms
);
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
frame_parms
,
fapi_nr_config_request_t
*
config
,
uint16_t
nr_band
);
int
init_nr_ue_signal
(
PHY_VARS_NR_UE
*
ue
,
int
nb_connected_eNB
,
uint8_t
abstraction_flag
);
...
...
openair1/PHY/NR_TRANSPORT/nr_dci.c
View file @
4896e80e
...
...
@@ -30,7 +30,7 @@
* \warning
*/
#include <LAYER2/NR_MAC_gNB/nr_mac_gNB.h>
#include "nr_dci.h"
#include "nr_dlsch.h"
#include "nr_sch_dmrs.h"
...
...
@@ -85,10 +85,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
// compute rb_offset and n_prb based on frequency allocation
nr_fill_cce_list
(
gNB
,
0
,
pdcch_pdu_rel15
);
get_coreset_rballoc
(
pdcch_pdu_rel15
->
FreqDomainResource
,
&
n_rb
,
&
rb_offset
);
cset_start_sc
=
frame_parms
.
first_carrier_offset
+
rb_offset
*
NR_NB_SC_PER_RB
;
if
(
pdcch_pdu_rel15
->
CoreSetType
==
NFAPI_NR_CSET_CONFIG_MIB_SIB1
)
{
cset_start_sc
=
cset_start_sc
+
RC
.
nrmac
[
gNB
->
Mod_id
]
->
type0_PDCCH_CSS_config
.
cset_start_rb
*
NR_NB_SC_PER_RB
;
}
cset_start_sc
=
frame_parms
.
first_carrier_offset
+
(
pdcch_pdu_rel15
->
BWPStart
+
rb_offset
)
*
NR_NB_SC_PER_RB
;
for
(
int
d
=
0
;
d
<
pdcch_pdu_rel15
->
numDlDci
;
d
++
)
{
/*The coreset is initialised
...
...
openair1/PHY/NR_TRANSPORT/nr_pbch.c
View file @
4896e80e
...
...
@@ -241,7 +241,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
///Payload generation
memset
((
void
*
)
pbch
,
0
,
sizeof
(
NR_gNB_PBCH
));
pbch
->
pbch_a
=
0
;
uint8_t
ssb_index
=
frame_parms
->
ssb_i
ndex
;
uint8_t
ssb_index
=
ssb_pdu
->
ssb_pdu_rel15
.
SsbBlockI
ndex
;
uint8_t
*
pbch_pdu
=
(
uint8_t
*
)
&
ssb_pdu
->
ssb_pdu_rel15
.
bchPayload
;
uint8_t
Lmax
=
frame_parms
->
Lmax
;
for
(
int
i
=
0
;
i
<
NR_PBCH_PDU_BITS
;
i
++
)
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
View file @
4896e80e
...
...
@@ -589,7 +589,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
frame_parms
->
ssb_index
+=
(((
nr_ue_pbch_vars
->
xtra_byte
>>
(
7
-
i
))
&
0x01
)
<<
(
3
+
i
));
}
ue
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
);
ue
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
,
i_ssb
);
if
(
frame_parms
->
half_frame_bit
)
ue
->
symbol_offset
+=
(
frame_parms
->
slots_per_frame
>>
1
)
*
frame_parms
->
symbols_per_slot
;
uint8_t
frame_number_4lsb
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++
)
...
...
openair1/PHY/defs_gNB.h
View file @
4896e80e
...
...
@@ -182,7 +182,10 @@ typedef struct {
int16_t
sqrt_rho_b
;
}
NR_gNB_DLSCH_t
;
typedef
struct
{
bool
active
;
nfapi_nr_dl_tti_ssb_pdu
ssb_pdu
;
}
NR_gNB_SSB_t
;
typedef
struct
{
int
frame
;
...
...
@@ -711,10 +714,10 @@ typedef struct PHY_VARS_gNB_s {
// nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu;
// nfapi_nr_ul_dci_request_pdus_t *ul_dci_pdu;
nfapi_nr_dl_tti_ssb_pdu
ssb_pdu
;
uint16_t
num_pdsch_rnti
[
80
];
NR_gNB_PBCH
pbch
;
NR_gNB_SSB_t
ssb
[
64
];
NR_gNB_PBCH
pbch
;
nr_cce_t
cce_list
[
MAX_DCI_CORESET
][
NR_MAX_PDCCH_AGG_LEVEL
];
NR_gNB_COMMON
common_vars
;
NR_gNB_PRACH
prach_vars
;
...
...
openair1/SCHED_NR/fapi_nr_l1.c
View file @
4896e80e
...
...
@@ -50,8 +50,15 @@ void handle_nr_nfapi_ssb_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
AssertFatal
(
dl_tti_pdu
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayloadFlag
==
1
,
"bchPayloadFlat %d != 1
\n
"
,
dl_tti_pdu
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayloadFlag
);
LOG_D
(
PHY
,
"%d.%d : pbch_pdu: %x
\n
"
,
frame
,
slot
,
dl_tti_pdu
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
);
memcpy
((
void
*
)
&
gNB
->
ssb_pdu
,
&
dl_tti_pdu
->
ssb_pdu
,
sizeof
(
dl_tti_pdu
->
ssb_pdu
));
uint8_t
i_ssb
=
dl_tti_pdu
->
ssb_pdu
.
ssb_pdu_rel15
.
SsbBlockIndex
;
LOG_D
(
PHY
,
"%d.%d : ssb index %d pbch_pdu: %x
\n
"
,
frame
,
slot
,
i_ssb
,
dl_tti_pdu
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
);
if
(
gNB
->
ssb
[
i_ssb
].
active
)
AssertFatal
(
1
==
0
,
"SSB PDU with index %d already active
\n
"
,
i_ssb
);
else
{
gNB
->
ssb
[
i_ssb
].
active
=
true
;
memcpy
((
void
*
)
&
gNB
->
ssb
[
i_ssb
].
ssb_pdu
,
&
dl_tti_pdu
->
ssb_pdu
,
sizeof
(
dl_tti_pdu
->
ssb_pdu
));
}
}
/*void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int subframe,gNB_L1_rxtx_proc_t *proc,
...
...
@@ -166,14 +173,11 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
gNB
->
dlsch
[
i
][
0
]
->
harq_mask
=
0
;
}
gNB
->
pbch_configured
=
0
;
for
(
int
i
=
0
;
i
<
number_dl_pdu
;
i
++
)
{
nfapi_nr_dl_tti_request_pdu_t
*
dl_tti_pdu
=
&
DL_req
->
dl_tti_request_body
.
dl_tti_pdu_list
[
i
];
LOG_D
(
PHY
,
"NFAPI: dl_pdu %d : type %d
\n
"
,
i
,
dl_tti_pdu
->
PDUType
);
switch
(
dl_tti_pdu
->
PDUType
)
{
case
NFAPI_NR_DL_TTI_SSB_PDU_TYPE
:
gNB
->
pbch_configured
=
1
;
if
(
NFAPI_MODE
!=
NFAPI_MODE_VNF
)
handle_nr_nfapi_ssb_pdu
(
gNB
,
frame
,
slot
,
...
...
@@ -257,4 +261,4 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
}
}
\ No newline at end of file
}
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
4896e80e
...
...
@@ -67,85 +67,63 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME
LOG_D
(
PHY
,
"SSB first subcarrier %d (%d,%d)
\n
"
,
fp
->
ssb_start_subcarrier
,
cfg
->
ssb_table
.
ssb_offset_point_a
.
value
,
sco
);
}
void
nr_common_signal_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
)
{
void
nr_common_signal_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
,
nfapi_nr_dl_tti_ssb_pdu
ssb_pdu
)
{
NR_DL_FRAME_PARMS
*
fp
=&
gNB
->
frame_parms
;
nfapi_nr_config_request_scf_t
*
cfg
=
&
gNB
->
gNB_config
;
int
**
txdataF
=
gNB
->
common_vars
.
txdataF
;
uint8_t
ssb_index
,
ssb_per_slot
=
0
,
n_hf
;
uint16_t
ssb_start_symbol
,
rel_slot
;
uint8_t
ssb_index
,
n_hf
;
uint16_t
ssb_start_symbol
;
int
txdataF_offset
=
(
slot
%
2
)
*
fp
->
samples_per_slot_wCP
;
uint16_t
slots_per_hf
=
(
fp
->
slots_per_frame
)
>>
1
;
n_hf
=
fp
->
half_frame_bit
;
if
(
slot
<
slots_per_hf
)
n_hf
=
0
;
else
n_hf
=
1
;
// if SSB periodicity is 5ms, they are transmitted in both half frames
if
(
cfg
->
ssb_table
.
ssb_period
.
value
==
0
)
{
if
(
slot
<
slots_per_hf
)
n_hf
=
0
;
else
n_hf
=
1
;
}
ssb_index
=
ssb_pdu
.
ssb_pdu_rel15
.
SsbBlockIndex
;
LOG_D
(
PHY
,
"common_signal_procedures: frame %d, slot %d ssb index %d
\n
"
,
frame
,
slot
,
ssb_index
);
// to set a effective slot number in the half frame where the SSB is supposed to be
rel_slot
=
(
n_hf
)
?
(
slot
-
slots_per_hf
)
:
slot
;
LOG_D
(
PHY
,
"common_signal_procedures: frame %d, slot %d
\n
"
,
frame
,
slot
);
if
(
rel_slot
<
38
&&
rel_slot
>=
0
)
{
// there is no SSB beyond slot 37
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
// max two SSB per slot
ssb_index
=
i
+
SSB_Table
[
rel_slot
];
// computing the ssb_index
if
((
ssb_index
<
64
)
&&
((
fp
->
L_ssb
>>
(
63
-
ssb_index
))
&
0x01
))
{
// generating the ssb only if the bit of L_ssb at current ssb index is 1
ssb_per_slot
++
;
fp
->
ssb_index
=
ssb_index
;
int
ssb_start_symbol_abs
=
nr_get_ssb_start_symbol
(
fp
);
// computing the starting symbol for current ssb
ssb_start_symbol
=
ssb_start_symbol_abs
%
fp
->
symbols_per_slot
;
// start symbol wrt slot
nr_set_ssb_first_subcarrier
(
cfg
,
fp
);
// setting the first subcarrier
LOG_D
(
PHY
,
"SS TX: frame %d, slot %d, start_symbol %d
\n
"
,
frame
,
slot
,
ssb_start_symbol
);
nr_generate_pss
(
gNB
->
d_pss
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
nr_generate_sss
(
gNB
->
d_sss
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
if
(
cfg
->
carrier_config
.
num_tx_ant
.
value
<=
4
)
nr_generate_pbch_dmrs
(
gNB
->
nr_gold_pbch_dmrs
[
n_hf
][
ssb_index
&
7
],
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
else
nr_generate_pbch_dmrs
(
gNB
->
nr_gold_pbch_dmrs
[
0
][
ssb_index
&
7
],
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
if
(
T_ACTIVE
(
T_GNB_PHY_MIB
))
{
unsigned
char
bch
[
3
];
bch
[
0
]
=
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
&
0xff
;
bch
[
1
]
=
(
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
8
)
&
0xff
;
bch
[
2
]
=
(
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
16
)
&
0xff
;
T
(
T_GNB_PHY_MIB
,
T_INT
(
0
)
/* module ID */
,
T_INT
(
frame
),
T_INT
(
slot
),
T_BUFFER
(
bch
,
3
));
}
int
ssb_start_symbol_abs
=
nr_get_ssb_start_symbol
(
fp
,
ssb_index
);
// computing the starting symbol for current ssb
ssb_start_symbol
=
ssb_start_symbol_abs
%
fp
->
symbols_per_slot
;
// start symbol wrt slot
nr_generate_pbch
(
&
gNB
->
pbch
,
&
gNB
->
ssb_pdu
,
gNB
->
nr_pbch_interleaver
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
n_hf
,
frame
,
cfg
,
fp
);
// SSB beamforming is handled at PHY
// currently our PHY does not support switching more than once a slot.
if
(
ssb_per_slot
>
1
)
{
LOG_W
(
PHY
,
"beamforming currently not supported for more than one SSB per slot
\n
"
);
}
else
if
(
ssb_per_slot
==
1
)
{
LOG_D
(
PHY
,
"slot %d, ssb_index %d, beam %d
\n
"
,
slot
,
ssb_index
,
cfg
->
ssb_table
.
ssb_beam_id_list
[
ssb_index
].
beam_id
.
value
);
for
(
int
j
=
0
;
j
<
fp
->
symbols_per_slot
;
j
++
)
gNB
->
common_vars
.
beam_id
[
0
][
slot
*
fp
->
symbols_per_slot
+
j
]
=
cfg
->
ssb_table
.
ssb_beam_id_list
[
ssb_index
].
beam_id
.
value
;
}
}
}
nr_set_ssb_first_subcarrier
(
cfg
,
fp
);
// setting the first subcarrier
LOG_D
(
PHY
,
"SS TX: frame %d, slot %d, start_symbol %d
\n
"
,
frame
,
slot
,
ssb_start_symbol
);
nr_generate_pss
(
gNB
->
d_pss
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
nr_generate_sss
(
gNB
->
d_sss
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
if
(
cfg
->
carrier_config
.
num_tx_ant
.
value
<=
4
)
nr_generate_pbch_dmrs
(
gNB
->
nr_gold_pbch_dmrs
[
n_hf
][
ssb_index
&
7
],
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
else
nr_generate_pbch_dmrs
(
gNB
->
nr_gold_pbch_dmrs
[
0
][
ssb_index
&
7
],
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
cfg
,
fp
);
if
(
T_ACTIVE
(
T_GNB_PHY_MIB
))
{
unsigned
char
bch
[
3
];
bch
[
0
]
=
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
&
0xff
;
bch
[
1
]
=
(
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
8
)
&
0xff
;
bch
[
2
]
=
(
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
16
)
&
0xff
;
T
(
T_GNB_PHY_MIB
,
T_INT
(
0
)
/* module ID */
,
T_INT
(
frame
),
T_INT
(
slot
),
T_BUFFER
(
bch
,
3
));
}
// Beam_id is currently used only for FR2
if
(
fp
->
freq_range
==
nr_FR2
){
LOG_D
(
PHY
,
"slot %d, ssb_index %d, beam %d
\n
"
,
slot
,
ssb_index
,
cfg
->
ssb_table
.
ssb_beam_id_list
[
ssb_index
].
beam_id
.
value
);
for
(
int
j
=
0
;
j
<
fp
->
symbols_per_slot
;
j
++
)
gNB
->
common_vars
.
beam_id
[
0
][
slot
*
fp
->
symbols_per_slot
+
j
]
=
cfg
->
ssb_table
.
ssb_beam_id_list
[
ssb_index
].
beam_id
.
value
;
}
nr_generate_pbch
(
&
gNB
->
pbch
,
&
ssb_pdu
,
gNB
->
nr_pbch_interleaver
,
&
txdataF
[
0
][
txdataF_offset
],
AMP
,
ssb_start_symbol
,
n_hf
,
frame
,
cfg
,
fp
);
}
void
phy_procedures_gNB_TX
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
,
int
do_meas
)
{
...
...
@@ -153,11 +131,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
NR_DL_FRAME_PARMS
*
fp
=&
gNB
->
frame_parms
;
nfapi_nr_config_request_scf_t
*
cfg
=
&
gNB
->
gNB_config
;
int
offset
=
gNB
->
CC_id
;
uint8_t
ssb_frame_periodicity
=
1
;
// every how many frames SSB are generated
int
txdataF_offset
=
(
slot
%
2
)
*
fp
->
samples_per_slot_wCP
;
if
(
cfg
->
ssb_table
.
ssb_period
.
value
>
1
)
ssb_frame_periodicity
=
1
<<
(
cfg
->
ssb_table
.
ssb_period
.
value
-
1
)
;
if
((
cfg
->
cell_config
.
frame_duplex_type
.
value
==
TDD
)
&&
(
nr_slot_select
(
cfg
,
frame
,
slot
)
==
NR_UPLINK_SLOT
))
return
;
...
...
@@ -174,8 +148,12 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX
,
1
);
if
(
NFAPI_MODE
==
NFAPI_MONOLITHIC
||
NFAPI_MODE
==
NFAPI_MODE_PNF
)
{
if
((
!
(
frame
%
ssb_frame_periodicity
)))
// generate SSB only for given frames according to SSB periodicity
nr_common_signal_procedures
(
gNB
,
frame
,
slot
);
for
(
int
i
=
0
;
i
<
fp
->
Lmax
;
i
++
)
{
if
(
gNB
->
ssb
[
i
].
active
)
{
nr_common_signal_procedures
(
gNB
,
frame
,
slot
,
gNB
->
ssb
[
i
].
ssb_pdu
);
gNB
->
ssb
[
i
].
active
=
false
;
}
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX
,
0
);
...
...
openair1/SCHED_NR/sched_nr.h
View file @
4896e80e
...
...
@@ -40,7 +40,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_
void
phy_procedures_gNB_common_RX
(
PHY_VARS_gNB
*
gNB
,
int
frame_rx
,
int
slot_rx
);
void
phy_procedures_gNB_uespec_RX
(
PHY_VARS_gNB
*
gNB
,
int
frame_rx
,
int
slot_rx
);
void
L1_nr_prach_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
);
void
nr_common_signal_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
);
void
nr_common_signal_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
slot
,
nfapi_nr_dl_tti_ssb_pdu
ssb_pdu
);
void
nr_feptx_ofdm
(
RU_t
*
ru
,
int
frame_tx
,
int
tti_tx
);
void
nr_feptx_ofdm_2thread
(
RU_t
*
ru
,
int
frame_tx
,
int
tti_tx
);
void
nr_feptx0
(
RU_t
*
ru
,
int
tti_tx
,
int
first_symbol
,
int
num_symbols
,
int
aa
);
...
...
openair1/SIMULATION/NR_PHY/dlsim.c
View file @
4896e80e
...
...
@@ -173,6 +173,7 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
}
void
config_common
(
int
Mod_idP
,
int
ssb_SubcarrierOffset
,
int
pdsch_AntennaPorts
,
int
pusch_AntennaPorts
,
NR_ServingCellConfigCommon_t
*
scc
...
...
@@ -679,7 +680,7 @@ int main(int argc, char **argv)
NR_ServingCellConfig_t
*
scd
=
calloc
(
1
,
sizeof
(
NR_ServingCellConfig_t
));
NR_CellGroupConfig_t
*
secondaryCellGroup
=
calloc
(
1
,
sizeof
(
*
secondaryCellGroup
));
prepare_scc
(
rrc
.
carrier
.
servingcellconfigcommon
);
uint64_t
ssb_bitmap
;
uint64_t
ssb_bitmap
=
1
;
fill_scc
(
rrc
.
carrier
.
servingcellconfigcommon
,
&
ssb_bitmap
,
N_RB_DL
,
N_RB_DL
,
mu
,
mu
);
ssb_bitmap
=
1
;
// Enable only first SSB with index ssb_indx=0
fix_scc
(
scc
,
ssb_bitmap
);
...
...
@@ -858,7 +859,8 @@ int main(int argc, char **argv)
// generate signal
AssertFatal
(
input_fd
==
NULL
,
"Not ready for input signal file
\n
"
);
gNB
->
pbch_configured
=
1
;
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
=
0x001234
;
gNB
->
ssb
[
0
].
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
=
0x001234
;
gNB
->
ssb
[
0
].
ssb_pdu
.
ssb_pdu_rel15
.
SsbBlockIndex
=
0
;
//Configure UE
rrc
.
carrier
.
MIB
=
(
uint8_t
*
)
malloc
(
4
);
...
...
@@ -984,7 +986,7 @@ int main(int argc, char **argv)
printf
(
"[DLSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d
\n
"
,
ptrsSymbPerSlot
,
ptrsRePerSymb
,
ptrsSymbPerSlot
*
ptrsRePerSymb
);
}
if
(
run_initial_sync
)
nr_common_signal_procedures
(
gNB
,
frame
,
slot
);
nr_common_signal_procedures
(
gNB
,
frame
,
slot
,
gNB
->
ssb
[
0
].
ssb_pdu
);
else
phy_procedures_gNB_TX
(
gNB
,
frame
,
slot
,
0
);
...
...
openair1/SIMULATION/NR_PHY/pbchsim.c
View file @
4896e80e
...
...
@@ -119,7 +119,7 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
int
main
(
int
argc
,
char
**
argv
)
{
char
c
;
int
i
,
aa
;
//,
l;
int
i
,
aa
,
start_symbo
l
;
double
sigma2
,
sigma2_dB
=
10
,
SNR
,
snr0
=-
2
.
0
,
snr1
=
2
.
0
;
double
cfo
=
0
;
uint8_t
snr1set
=
0
;
...
...
@@ -426,29 +426,28 @@ int main(int argc, char **argv)
switch
(
mu
)
{
case
1
:
scs
=
30000
;
if
(
N_RB_DL
==
217
)
{
fs
=
122.88e6
;
bw
=
80e6
;
}
else
if
(
N_RB_DL
==
245
)
{
fs
=
122.88e6
;
bw
=
90e6
;
}
else
if
(
N_RB_DL
==
273
)
{
fs
=
122.88e6
;
bw
=
100e6
;
}
else
if
(
N_RB_DL
==
106
)
{
fs
=
61.44e6
;
bw
=
40e6
;
}
else
AssertFatal
(
1
==
0
,
"Unsupported numerology for mu %d, N_RB %d
\n
"
,
mu
,
N_RB_DL
);
break
;
scs
=
30000
;
frame_parms
->
Lmax
=
8
;
if
(
N_RB_DL
==
217
)
{
fs
=
122.88e6
;
bw
=
80e6
;
}
else
if
(
N_RB_DL
==
245
)
{
fs
=
122.88e6
;
bw
=
90e6
;
}
else
if
(
N_RB_DL
==
273
)
{
fs
=
122.88e6
;
bw
=
100e6
;
}
else
if
(
N_RB_DL
==
106
)
{
fs
=
61.44e6
;
bw
=
40e6
;
}
else
AssertFatal
(
1
==
0
,
"Unsupported numerology for mu %d, N_RB %d
\n
"
,
mu
,
N_RB_DL
);
break
;
case
3
:
frame_parms
->
Lmax
=
64
;
scs
=
120000
;
if
(
N_RB_DL
==
66
)
{
fs
=
122.88e6
;
...
...
@@ -457,6 +456,7 @@ int main(int argc, char **argv)
else
AssertFatal
(
1
==
0
,
"Unsupported numerology for mu %d, N_RB %d
\n
"
,
mu
,
N_RB_DL
);
break
;
}
// cfo with respect to sub-carrier spacing
eps
=
cfo
/
scs
;
...
...
@@ -510,7 +510,6 @@ int main(int argc, char **argv)
printf
(
"Allocating %d samples for txdata
\n
"
,
frame_length_complex_samples
);
txdata
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
int
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
int
));
}
if
(
pbch_file_fd
!=
NULL
)
{
...
...
@@ -536,60 +535,68 @@ int main(int argc, char **argv)
}
nr_gold_pbch
(
UE
);
// generate signal
if
(
input_fd
==
NULL
)
{
gNB
->
pbch_configured
=
1
;
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
=
0x55dd33
;
for
(
int
slot
=
0
;
slot
<
frame_parms
->
slots_per_frame
;
slot
++
)
{
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
memset
(
gNB
->
common_vars
.
txdataF
[
aa
],
0
,
frame_parms
->
samples_per_slot_wCP
*
sizeof
(
int32_t
));
nr_common_signal_procedures
(
gNB
,
frame
,
slot
);
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
if
(
cyclic_prefix_type
==
1
)
{
PHY_ofdm_mod
(
gNB
->
common_vars
.
txdataF
[
aa
],
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
frame_parms
->
ofdm_symbol_size
,
12
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
}
else
{
/* nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
14,
frame_parms);*/
PHY_ofdm_mod
(
gNB
->
common_vars
.
txdataF
[
aa
],
(
int
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
frame_parms
->
ofdm_symbol_size
,
1
,
frame_parms
->
nb_prefix_samples0
,
CYCLIC_PREFIX
);
apply_nr_rotation
(
frame_parms
,
(
int16_t
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
slot
,
0
,
1
,
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples0
);
PHY_ofdm_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
],
(
int
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)
+
frame_parms
->
nb_prefix_samples0
+
frame_parms
->
ofdm_symbol_size
],
frame_parms
->
ofdm_symbol_size
,
13
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
apply_nr_rotation
(
frame_parms
,
(
int16_t
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)
+
frame_parms
->
nb_prefix_samples0
+
frame_parms
->
ofdm_symbol_size
],
slot
,
1
,
13
,
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples
);
}
}
for
(
i
=
0
;
i
<
frame_parms
->
Lmax
;
i
++
)
{
if
((
SSB_positions
>>
i
)
&
0x01
)
{
gNB
->
ssb
[
i
].
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
=
0x55dd33
;
gNB
->
ssb
[
i
].
ssb_pdu
.
ssb_pdu_rel15
.
SsbBlockIndex
=
i
;
start_symbol
=
nr_get_ssb_start_symbol
(
frame_parms
,
i
);
int
slot
=
start_symbol
/
14
;
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
memset
(
gNB
->
common_vars
.
txdataF
[
aa
],
0
,
frame_parms
->
samples_per_slot_wCP
*
sizeof
(
int32_t
));
nr_common_signal_procedures
(
gNB
,
frame
,
slot
,
gNB
->
ssb
[
i
].
ssb_pdu
);
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
if
(
cyclic_prefix_type
==
1
)
{
PHY_ofdm_mod
(
gNB
->
common_vars
.
txdataF
[
aa
],
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
frame_parms
->
ofdm_symbol_size
,
12
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
}
else
{
/*nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)],
14,
frame_parms);*/
PHY_ofdm_mod
(
gNB
->
common_vars
.
txdataF
[
aa
],
(
int
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
frame_parms
->
ofdm_symbol_size
,
1
,
frame_parms
->
nb_prefix_samples0
,
CYCLIC_PREFIX
);
apply_nr_rotation
(
frame_parms
,
(
int16_t
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)],
slot
,
0
,
1
,
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples0
);
PHY_ofdm_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
frame_parms
->
ofdm_symbol_size
],
(
int
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)
+
frame_parms
->
nb_prefix_samples0
+
frame_parms
->
ofdm_symbol_size
],
frame_parms
->
ofdm_symbol_size
,
13
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
apply_nr_rotation
(
frame_parms
,
(
int16_t
*
)
&
txdata
[
aa
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)
+
frame_parms
->
nb_prefix_samples0
+
frame_parms
->
ofdm_symbol_size
],
slot
,
1
,
13
,
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples
);
}
}
}
}
LOG_M
(
"txsigF0.m"
,
"txsF0"
,
gNB
->
common_vars
.
txdataF
[
0
],
frame_length_complex_samples_no_prefix
,
1
,
1
);
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"txsigF1.m"
,
"txsF1"
,
gNB
->
common_vars
.
txdataF
[
1
],
frame_length_complex_samples_no_prefix
,
1
,
1
);
...
...
@@ -598,9 +605,9 @@ int main(int argc, char **argv)
printf
(
"Reading %d samples from file to antenna buffer %d
\n
"
,
frame_length_complex_samples
,
0
);
UE
->
UE_fo_compensation
=
1
;
// perform fo compensation when samples from file are used
if
(
fread
(
txdata
[
0
],
sizeof
(
int32_t
),
frame_length_complex_samples
,
input_fd
)
!=
frame_length_complex_samples
)
{
sizeof
(
int32_t
),
frame_length_complex_samples
,
input_fd
)
!=
frame_length_complex_samples
)
{
printf
(
"error reading from file
\n
"
);
//exit(-1);
}
...
...
@@ -684,10 +691,9 @@ int main(int argc, char **argv)
UE
->
rx_offset
=
0
;
uint8_t
ssb_index
=
0
;
while
(
!
((
SSB_positions
>>
ssb_index
)
&
0x01
))
ssb_index
++
;
// to select the first transmitted ssb
frame_parms
->
ssb_index
=
ssb_index
;
UE
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
);
UE
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
,
ssb_index
);
int
ssb_slot
=
(
ssb_index
>>
1
)
+
(
n_hf
*
frame_parms
->
slots_per_frame
);
int
ssb_slot
=
(
UE
->
symbol_offset
/
14
)
+
(
n_hf
*
(
frame_parms
->
slots_per_frame
>>
1
)
);
for
(
int
i
=
UE
->
symbol_offset
+
1
;
i
<
UE
->
symbol_offset
+
4
;
i
++
)
{
nr_slot_fep
(
UE
,
&
proc
,
...
...
@@ -716,7 +722,7 @@ int main(int argc, char **argv)
payload_ret
=
(
UE
->
pbch_vars
[
0
]
->
xtra_byte
==
gNB_xtra_byte
);
for
(
i
=
0
;
i
<
3
;
i
++
){
payload_ret
+=
(
UE
->
pbch_vars
[
0
]
->
decoded_output
[
i
]
==
((
gNB
->
ssb_pdu
.
ssb_pdu_rel15
.
bchPayload
>>
(
8
*
i
))
&
0xff
));
payload_ret
+=
(
UE
->
pbch_vars
[
0
]
->
decoded_output
[
i
]
==
((
gNB
->
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);
...
...
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
View file @
4896e80e
...
...
@@ -36,6 +36,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define TABLE_38213_13_1_NUM_INDEXES 15
#define TABLE_38213_13_2_NUM_INDEXES 14
...
...
@@ -418,14 +419,6 @@ typedef enum {
NR_RNTI_MCS_C
,
}
nr_rnti_type_t
;
typedef
enum
subcarrier_spacing_e
{
scs_15kHz
=
0x1
,
scs_30kHz
=
0x2
,
scs_60kHz
=
0x4
,
scs_120kHz
=
0x8
,
scs_240kHz
=
0x16
}
subcarrier_spacing_t
;
typedef
enum
channel_bandwidth_e
{
bw_5MHz
=
0x1
,
bw_10MHz
=
0x2
,
...
...
@@ -462,6 +455,7 @@ typedef struct Type0_PDCCH_CSS_config_s {
uint32_t
ssb_length
;
uint32_t
ssb_index
;
uint32_t
cset_start_rb
;
bool
active
;
}
NR_Type0_PDCCH_CSS_config_t
;
#endif
/*__LAYER2_MAC_H__ */
...
...
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
View file @
4896e80e
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
View file @
4896e80e
...
...
@@ -126,12 +126,18 @@ int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmr
uint8_t
get_L_ptrs
(
uint8_t
mcs1
,
uint8_t
mcs2
,
uint8_t
mcs3
,
uint8_t
I_mcs
,
uint8_t
mcs_table
);
uint8_t
get_K_ptrs
(
uint16_t
nrb0
,
uint16_t
nrb1
,
uint16_t
N_RB
);
int
get_type0_PDCCH_CSS_config_parameters
(
NR_Type0_PDCCH_CSS_config_t
*
type0_PDCCH_CSS_config
,
NR_MIB_t
*
mib
,
uint8_t
extra_bits
,
uint32_t
ssb_length
,
uint32_t
ssb_index
,
uint32_t
ssb_offset_point_a
);
void
get_type0_PDCCH_CSS_config_parameters
(
NR_Type0_PDCCH_CSS_config_t
*
type0_PDCCH_CSS_config
,
frame_t
frameP
,
NR_MIB_t
*
mib
,
uint8_t
num_slot_per_frame
,
uint8_t
ssb_subcarrier_offset
,
uint16_t
ssb_start_symbol
,
NR_SubcarrierSpacing_t
scs_ssb
,
frequency_range_t
frequency_range
,
uint32_t
ssb_index
,
uint32_t
ssb_offset_point_a
);
uint16_t
get_ssb_start_symbol
(
const
long
band
,
NR_SubcarrierSpacing_t
scs
,
int
i_ssb
);
int16_t
get_N_RA_RB
(
int
delta_f_RA_PRACH
,
int
delta_f_PUSCH
);
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
4896e80e
...
...
@@ -318,7 +318,7 @@ typedef struct {
NR_TAG_Config_t
*
tag_Config
;
NR_PHR_Config_t
*
phr_Config
;
NR_RNTI_Value_t
*
cs_RNTI
;
NR_MIB_t
*
mib
;
NR_MIB_t
*
mib
;
NR_BWP_Downlink_t
*
DLbwp
[
MAX_NUM_BWP
];
NR_BWP_Uplink_t
*
ULbwp
[
MAX_NUM_BWP
];
...
...
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
4896e80e
...
...
@@ -104,7 +104,8 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
LOG_D
(
MAC
,
"[L2][MAC] decode mib
\n
"
);
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
module_id
);
NR_ServingCellConfigCommon_t
*
scc
=
mac
->
scc
;
frequency_range_t
frequency_range
;
nr_mac_rrc_data_ind_ue
(
module_id
,
cc_id
,
gNB_index
,
NR_BCCH_BCH
,
(
uint8_t
*
)
pduP
,
3
);
// fixed 3 bytes MIB PDU
AssertFatal
(
mac
->
mib
!=
NULL
,
"nr_ue_decode_mib() mac->mib == NULL
\n
"
);
...
...
@@ -120,9 +121,11 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
frame
=
frame
<<
4
;
frame
=
frame
|
frame_number_4lsb
;
if
(
ssb_length
==
64
){
frequency_range
=
FR2
;
for
(
int
i
=
0
;
i
<
3
;
i
++
)
ssb_index
+=
(((
extra_bits
>>
(
7
-
i
))
&
0x01
)
<<
(
3
+
i
));
}
else
{
frequency_range
=
FR1
;
if
(
ssb_subcarrier_offset_msb
){
ssb_subcarrier_offset
=
ssb_subcarrier_offset
|
0x10
;
}
...
...
@@ -141,13 +144,37 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
//storing ssb index in the mac structure
mac
->
mib_ssb
=
ssb_index
;
get_type0_PDCCH_CSS_config_parameters
(
&
mac
->
type0_PDCCH_CSS_config
,
mac
->
mib
,
extra_bits
,
ssb_length
,
ssb_index
,
mac
->
phy_config
.
config_req
.
ssb_table
.
ssb_offset_point_a
);
if
(
get_softmodem_params
()
->
sa
==
1
)
{
// TODO these values shouldn't be taken from SCC in SA
uint8_t
scs_ssb
=
*
scc
->
ssbSubcarrierSpacing
;
uint32_t
band
=
*
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
frequencyBandList
.
list
.
array
[
0
];
int
scs_scaling
=
1
<<
scs_ssb
;
if
(
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
absoluteFrequencyPointA
<
600000
)
scs_scaling
=
scs_scaling
*
3
;
if
(
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
absoluteFrequencyPointA
>
2016666
)
scs_scaling
=
scs_scaling
>>
2
;
uint32_t
absolute_diff
=
(
*
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
absoluteFrequencySSB
-
scc
->
downlinkConfigCommon
->
frequencyInfoDL
->
absoluteFrequencyPointA
);
uint16_t
ssb_start_symbol
=
get_ssb_start_symbol
(
band
,
scs_ssb
,
ssb_index
);
get_type0_PDCCH_CSS_config_parameters
(
&
mac
->
type0_PDCCH_CSS_config
,
frame
,
mac
->
mib
,
nr_slots_per_frame
[
scs_ssb
],
ssb_subcarrier_offset
,
ssb_start_symbol
,
scs_ssb
,
frequency_range
,
ssb_index
,
absolute_diff
/
(
12
*
scs_scaling
)
-
10
);
mac
->
type0_pdcch_ss_mux_pattern
=
mac
->
type0_PDCCH_CSS_config
.
type0_pdcch_ss_mux_pattern
;
mac
->
type0_pdcch_ss_sfn_c
=
mac
->
type0_PDCCH_CSS_config
.
sfn_c
;
mac
->
type0_pdcch_ss_n_c
=
mac
->
type0_PDCCH_CSS_config
.
n_c
;
}
ssb_index
=
mac
->
type0_PDCCH_CSS_config
.
ssb_index
;
// TODO: ssb_index should obtain from L1 in case Lssb != 64
mac
->
type0_pdcch_ss_mux_pattern
=
mac
->
type0_PDCCH_CSS_config
.
type0_pdcch_ss_mux_pattern
;
mac
->
type0_pdcch_ss_sfn_c
=
mac
->
type0_PDCCH_CSS_config
.
sfn_c
;
mac
->
type0_pdcch_ss_n_c
=
mac
->
type0_PDCCH_CSS_config
.
n_c
;
mac
->
dl_config_request
.
sfn
=
mac
->
type0_PDCCH_CSS_config
.
frame
;
mac
->
dl_config_request
.
slot
=
(
ssb_index
>>
1
)
+
((
ssb_index
>>
4
)
<<
1
);
// not valid for 240kHz SCS
...
...
openair2/LAYER2/NR_MAC_gNB/config.c
View file @
4896e80e
...
...
@@ -54,7 +54,7 @@ extern RAN_CONTEXT_t RC;
extern
void
mac_top_init_gNB
(
void
);
extern
uint8_t
nfapi_mode
;
void
config_common
(
int
Mod_idP
,
int
pdsch_AntennaPorts
,
int
pusch_AntennaPorts
,
NR_ServingCellConfigCommon_t
*
scc
)
{
void
config_common
(
int
Mod_idP
,
int
ssb_SubcarrierOffset
,
int
pdsch_AntennaPorts
,
int
pusch_AntennaPorts
,
NR_ServingCellConfigCommon_t
*
scc
)
{
nfapi_nr_config_request_scf_t
*
cfg
=
&
RC
.
nrmac
[
Mod_idP
]
->
config
[
0
];
RC
.
nrmac
[
Mod_idP
]
->
common_channels
[
0
].
ServingCellConfigCommon
=
scc
;
...
...
@@ -240,6 +240,9 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
cfg
->
ssb_table
.
ssb_period
.
value
=
*
scc
->
ssb_periodicityServingCell
;
cfg
->
ssb_table
.
ssb_period
.
tl
.
tag
=
NFAPI_NR_CONFIG_SSB_PERIOD_TAG
;
cfg
->
num_tlv
++
;
cfg
->
ssb_table
.
ssb_subcarrier_offset
.
value
=
ssb_SubcarrierOffset
;
cfg
->
ssb_table
.
ssb_subcarrier_offset
.
tl
.
tag
=
NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG
;
cfg
->
num_tlv
++
;
switch
(
scc
->
ssb_PositionsInBurst
->
present
)
{
case
1
:
...
...
@@ -376,6 +379,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
LOG_I
(
MAC
,
"Configuring common parameters from NR ServingCellConfig
\n
"
);
config_common
(
Mod_idP
,
ssb_SubcarrierOffset
,
pdsch_AntennaPorts
,
pusch_AntennaPorts
,
scc
);
...
...
@@ -389,7 +393,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
printf
(
"Waiting for PHY_config_req
\n
"
);
}
}
RC
.
nrmac
[
Mod_idP
]
->
ssb_SubcarrierOffset
=
ssb_SubcarrierOffset
;
RC
.
nrmac
[
Mod_idP
]
->
pusch_target_snrx10
=
pusch_tgt_snrx10
;
RC
.
nrmac
[
Mod_idP
]
->
pucch_target_snrx10
=
pucch_tgt_snrx10
;
NR_PHY_Config_t
phycfg
;
...
...
@@ -397,10 +402,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
phycfg
.
CC_id
=
0
;
phycfg
.
cfg
=
&
RC
.
nrmac
[
Mod_idP
]
->
config
[
0
];
phycfg
.
cfg
->
ssb_table
.
ssb_subcarrier_offset
.
value
=
ssb_SubcarrierOffset
;
phycfg
.
cfg
->
ssb_table
.
ssb_subcarrier_offset
.
tl
.
tag
=
NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG
;
phycfg
.
cfg
->
num_tlv
++
;
if
(
RC
.
nrmac
[
Mod_idP
]
->
if_inst
->
NR_PHY_config_req
)
RC
.
nrmac
[
Mod_idP
]
->
if_inst
->
NR_PHY_config_req
(
&
phycfg
);
find_SSB_and_RO_available
(
Mod_idP
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
View file @
4896e80e
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
View file @
4896e80e
...
...
@@ -41,6 +41,7 @@ void set_cset_offset(uint16_t);
void
mac_top_init_gNB
(
void
);
void
config_common
(
int
Mod_idP
,
int
ssb_SubcarrierOffset
,
int
pdsch_AntennaPorts
,
int
pusch_AntennaPorts
,
NR_ServingCellConfigCommon_t
*
scc
...
...
@@ -72,6 +73,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
void
schedule_control_sib1
(
module_id_t
module_id
,
int
CC_id
,
NR_Type0_PDCCH_CSS_config_t
*
type0_PDCCH_CSS_config
,
int
time_domain_allocation
,
uint8_t
mcsTableIdx
,
uint8_t
mcs
,
...
...
@@ -367,7 +369,7 @@ int binomial(int n, int k);
bool
is_xlsch_in_slot
(
uint64_t
bitmap
,
sub_frame_t
slot
);
void
fill_ssb_vrb_map
(
NR_COMMON_channels_t
*
cc
,
int
rbStart
,
int
CC_id
);
void
fill_ssb_vrb_map
(
NR_COMMON_channels_t
*
cc
,
int
rbStart
,
uint16_t
symStart
,
int
CC_id
);
/* \brief Function to indicate a received SDU on ULSCH.
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
4896e80e
...
...
@@ -611,6 +611,8 @@ typedef struct gNB_MAC_INST_s {
int
pusch_target_snrx10
;
/// Pucch target SNR
int
pucch_target_snrx10
;
/// Subcarrier Offset
int
ssb_SubcarrierOffset
;
/// Common cell resources
NR_COMMON_channels_t
common_channels
[
NFAPI_CC_MAX
];
/// current PDU index (BCH,DLSCH)
...
...
@@ -677,7 +679,7 @@ typedef struct gNB_MAC_INST_s {
NR_UE_sched_ctrl_t
*
sched_ctrlCommon
;
NR_CellGroupConfig_t
*
secondaryCellGroupCommon
;
NR_Type0_PDCCH_CSS_config_t
type0_PDCCH_CSS_config
;
NR_Type0_PDCCH_CSS_config_t
type0_PDCCH_CSS_config
[
64
]
;
}
gNB_MAC_INST
;
...
...
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