better handling of PRACH TX power to improve separation between PHY and MAC
This commit is contained in:
@@ -2021,7 +2021,6 @@ set (MAC_NR_SRC_UE
|
|||||||
${NR_UE_MAC_DIR}/nr_ue_procedures.c
|
${NR_UE_MAC_DIR}/nr_ue_procedures.c
|
||||||
${NR_UE_MAC_DIR}/nr_ue_scheduler.c
|
${NR_UE_MAC_DIR}/nr_ue_scheduler.c
|
||||||
${NR_UE_MAC_DIR}/nr_ue_dci_configuration.c
|
${NR_UE_MAC_DIR}/nr_ue_dci_configuration.c
|
||||||
${NR_UE_MAC_DIR}/nr_l1_helpers.c
|
|
||||||
${NR_UE_MAC_DIR}/nr_ra_procedures.c
|
${NR_UE_MAC_DIR}/nr_ra_procedures.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ typedef struct {
|
|||||||
uint16_t cell_id;
|
uint16_t cell_id;
|
||||||
uint16_t ssb_start_subcarrier;
|
uint16_t ssb_start_subcarrier;
|
||||||
short rsrp_dBm;
|
short rsrp_dBm;
|
||||||
|
int16_t pathloss;
|
||||||
} fapi_nr_ssb_pdu_t;
|
} fapi_nr_ssb_pdu_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -193,8 +194,8 @@ typedef struct {
|
|||||||
uint8_t ssb_nb_in_ro;
|
uint8_t ssb_nb_in_ro;
|
||||||
/// Preamble index for PRACH (0-63)
|
/// Preamble index for PRACH (0-63)
|
||||||
uint8_t ra_PreambleIndex;
|
uint8_t ra_PreambleIndex;
|
||||||
/// Target received power at gNB (TODO possibly modify to uint)
|
/// PRACH TX power (TODO possibly modify to uint)
|
||||||
int preamble_target_power;
|
int16_t prach_tx_power;
|
||||||
} fapi_nr_ul_config_prach_pdu;
|
} fapi_nr_ul_config_prach_pdu;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
|||||||
uint32_t rx_power_fil_dB,
|
uint32_t rx_power_fil_dB,
|
||||||
uint8_t gNB_id);
|
uint8_t gNB_id);
|
||||||
|
|
||||||
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index);
|
void compute_nr_PL(PHY_VARS_NR_UE *ue, int ssb_index);
|
||||||
|
|
||||||
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||||
NR_UE_PDSCH **pdsch_vars,
|
NR_UE_PDSCH **pdsch_vars,
|
||||||
|
|||||||
@@ -52,34 +52,23 @@
|
|||||||
// - PRACH transmission from a UE is not in response to a detection of a PDCCH order by the UE
|
// - PRACH transmission from a UE is not in response to a detection of a PDCCH order by the UE
|
||||||
// Measurement units:
|
// Measurement units:
|
||||||
// - referenceSignalPower: dBm/RE (average EPRE of the resources elements that carry secondary synchronization signals in dBm)
|
// - referenceSignalPower: dBm/RE (average EPRE of the resources elements that carry secondary synchronization signals in dBm)
|
||||||
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
|
void compute_nr_PL(PHY_VARS_NR_UE *ue, int ssb_index){
|
||||||
|
|
||||||
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
//TODO improve PL measurements. Probably not correct as it is.
|
||||||
int16_t pathloss;
|
|
||||||
|
|
||||||
if (get_softmodem_params()->do_ra){
|
|
||||||
|
|
||||||
long referenceSignalPower = ue->nrUE_config.ssb_config.ss_pbch_power;
|
long referenceSignalPower = ue->nrUE_config.ssb_config.ss_pbch_power;
|
||||||
|
int16_t pathloss = (int16_t)(referenceSignalPower - ue->measurements.ssb_rsrp_dBm[ssb_index]);
|
||||||
|
|
||||||
pathloss = (int16_t)(referenceSignalPower - ue->measurements.rsrp_dBm[gNB_index]);
|
LOG_D(PHY, "In %s: pathloss %d dB, UE RX total gain %d dB, referenceSignalPower %ld dBm/RE (%f mW), RSRP %d dBm (%f mW)\n",
|
||||||
|
|
||||||
LOG_D(MAC, "In %s: pathloss %d dB, UE RX total gain %d dB, referenceSignalPower %ld dBm/RE (%f mW), RSRP %d dBm (%f mW)\n",
|
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
pathloss,
|
pathloss,
|
||||||
ue->rx_total_gain_dB,
|
ue->rx_total_gain_dB,
|
||||||
referenceSignalPower,
|
referenceSignalPower,
|
||||||
pow(10, referenceSignalPower/10),
|
pow(10, referenceSignalPower/10),
|
||||||
ue->measurements.rsrp_dBm[gNB_index],
|
ue->measurements.ssb_rsrp_dBm[ssb_index],
|
||||||
pow(10, ue->measurements.rsrp_dBm[gNB_index]/10));
|
pow(10, ue->measurements.ssb_rsrp_dBm[ssb_index]/10));
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pathloss = ((int16_t)(((10*ue->rx_total_gain_dB) - dB_fixed_times10(ue->measurements.rsrp[gNB_index]))/10));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return pathloss;
|
|
||||||
|
|
||||||
|
ue->measurements.pathloss = pathloss;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_nr_rx_total_gain_dB (module_id_t Mod_id,uint8_t CC_id)
|
uint32_t get_nr_rx_total_gain_dB (module_id_t Mod_id,uint8_t CC_id)
|
||||||
|
|||||||
@@ -147,6 +147,8 @@ typedef struct {
|
|||||||
//! total estimated noise power (dBm)
|
//! total estimated noise power (dBm)
|
||||||
short n0_power_tot_dBm;
|
short n0_power_tot_dBm;
|
||||||
|
|
||||||
|
int16_t pathloss;
|
||||||
|
|
||||||
// UE measurements
|
// UE measurements
|
||||||
//! estimated received spatial signal power (linear)
|
//! estimated received spatial signal power (linear)
|
||||||
int rx_spatial_power[NUMBER_OF_CONNECTED_gNB_MAX][2][2];
|
int rx_spatial_power[NUMBER_OF_CONNECTED_gNB_MAX][2][2];
|
||||||
|
|||||||
@@ -93,7 +93,6 @@
|
|||||||
#define NR_MAX_NB_HARQ_PROCESSES 16
|
#define NR_MAX_NB_HARQ_PROCESSES 16
|
||||||
|
|
||||||
#define NR_MAX_PDSCH_TBS 3824
|
#define NR_MAX_PDSCH_TBS 3824
|
||||||
#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.
|
|
||||||
|
|
||||||
#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36
|
#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,6 @@
|
|||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
#include "executables/nr-uesoftmodem.h"
|
#include "executables/nr-uesoftmodem.h"
|
||||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h"
|
|
||||||
|
|
||||||
//#define DEBUG_PHY_PROC
|
//#define DEBUG_PHY_PROC
|
||||||
#define NR_PDCCH_SCHED
|
#define NR_PDCCH_SCHED
|
||||||
@@ -174,6 +173,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
|
|||||||
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.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.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];
|
rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.rsrp_dBm = ue->measurements.ssb_rsrp_dBm[frame_parms->ssb_index];
|
||||||
|
rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pathloss = ue->measurements.pathloss;
|
||||||
break;
|
break;
|
||||||
case FAPI_NR_CSIRS_IND:
|
case FAPI_NR_CSIRS_IND:
|
||||||
memcpy(&rx_ind->rx_indication_body[n_pdus - 1].csirs_measurements,
|
memcpy(&rx_ind->rx_indication_body[n_pdus - 1].csirs_measurements,
|
||||||
@@ -1100,6 +1100,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
|
LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
|
||||||
nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates, phy_pdcch_config);
|
nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates, phy_pdcch_config);
|
||||||
|
compute_nr_PL(ue, ssb_index);
|
||||||
|
|
||||||
if (ue->no_timing_correction==0) {
|
if (ue->no_timing_correction==0) {
|
||||||
LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction);
|
LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction);
|
||||||
@@ -1460,19 +1461,15 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
|
|||||||
if (nr_prach == GENERATE_PREAMBLE) {
|
if (nr_prach == GENERATE_PREAMBLE) {
|
||||||
|
|
||||||
fapi_nr_ul_config_prach_pdu *prach_pdu = &ue->prach_vars[gNB_id]->prach_pdu;
|
fapi_nr_ul_config_prach_pdu *prach_pdu = &ue->prach_vars[gNB_id]->prach_pdu;
|
||||||
int16_t pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id);
|
ue->tx_power_dBm[nr_slot_tx] = prach_pdu->prach_tx_power;
|
||||||
int16_t ra_preamble_rx_power = (int16_t)(prach_pdu->preamble_target_power - pathloss + 30);
|
|
||||||
ue->tx_power_dBm[nr_slot_tx] = min(nr_get_Pcmax(mod_id), ra_preamble_rx_power);
|
|
||||||
|
|
||||||
LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm)\n",
|
LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, P0_PRACH %d)\n",
|
||||||
__FUNCTION__,
|
__FUNCTION__,
|
||||||
mod_id,
|
mod_id,
|
||||||
frame_tx,
|
frame_tx,
|
||||||
nr_slot_tx,
|
nr_slot_tx,
|
||||||
prach_pdu->ra_PreambleIndex,
|
prach_pdu->ra_PreambleIndex,
|
||||||
pathloss,
|
ue->tx_power_dBm[nr_slot_tx]);
|
||||||
ue->tx_power_dBm[nr_slot_tx],
|
|
||||||
prach_pdu->preamble_target_power);
|
|
||||||
|
|
||||||
ue->prach_vars[gNB_id]->amp = AMP;
|
ue->prach_vars[gNB_id]->amp = AMP;
|
||||||
|
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ void pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue,
|
|||||||
/* Generate PUCCH signal according to its format and parameters */
|
/* Generate PUCCH signal according to its format and parameters */
|
||||||
ue->generate_ul_signal[gNB_id] = 1;
|
ue->generate_ul_signal[gNB_id] = 1;
|
||||||
|
|
||||||
int16_t PL = get_nr_PL(ue->Mod_id, ue->CC_id, gNB_id); /* LTE function because NR path loss not yet implemented FFS TODO NR */
|
int16_t PL = ue->measurements.pathloss; /* LTE function because NR path loss not yet implemented FFS TODO NR */
|
||||||
int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs)));
|
int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs)));
|
||||||
|
|
||||||
int16_t pucch_tx_power = pucch_pdu->pucch_tx_power + contributor + PL;
|
int16_t pucch_tx_power = pucch_pdu->pucch_tx_power + contributor + PL;
|
||||||
|
|||||||
@@ -264,7 +264,6 @@ int main(int argc, char **argv){
|
|||||||
int n_bytes=0;
|
int n_bytes=0;
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
NR_PRACH_RESOURCES_t prach_resources;
|
|
||||||
nfapi_nr_prach_config_t *prach_config;
|
nfapi_nr_prach_config_t *prach_config;
|
||||||
nfapi_nr_prach_pdu_t *prach_pdu;
|
nfapi_nr_prach_pdu_t *prach_pdu;
|
||||||
fapi_nr_prach_config_t *ue_prach_config;
|
fapi_nr_prach_config_t *ue_prach_config;
|
||||||
@@ -694,7 +693,6 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
ue_prach_pdu = &UE->prach_vars[0]->prach_pdu;
|
ue_prach_pdu = &UE->prach_vars[0]->prach_pdu;
|
||||||
ue_prach_config = &UE->nrUE_config.prach_config;
|
ue_prach_config = &UE->nrUE_config.prach_config;
|
||||||
UE->prach_resources[0] = &prach_resources;
|
|
||||||
txdata = UE->common_vars.txdata;
|
txdata = UE->common_vars.txdata;
|
||||||
|
|
||||||
UE->prach_vars[0]->amp = AMP;
|
UE->prach_vars[0]->amp = AMP;
|
||||||
@@ -717,7 +715,7 @@ int main(int argc, char **argv){
|
|||||||
if (n_frames == 1)
|
if (n_frames == 1)
|
||||||
printf("raPreamble %d\n",preamble_tx);
|
printf("raPreamble %d\n",preamble_tx);
|
||||||
|
|
||||||
UE->prach_resources[0]->ra_PreambleIndex = preamble_tx;
|
ue_prach_pdu->ra_PreambleIndex = preamble_tx;
|
||||||
|
|
||||||
// Configure channel
|
// Configure channel
|
||||||
bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index);
|
bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index);
|
||||||
@@ -768,14 +766,7 @@ int main(int argc, char **argv){
|
|||||||
ue_prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
ue_prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
||||||
UE->X_u);
|
UE->X_u);
|
||||||
|
|
||||||
/*tx_lev = generate_nr_prach(UE,
|
tx_lev = generate_nr_prach(UE, 0, frame, slot);
|
||||||
0, //gNB_id,
|
|
||||||
subframe); */ //commented for testing purpose
|
|
||||||
|
|
||||||
UE_nr_rxtx_proc_t proc={0};
|
|
||||||
proc.frame_tx = frame;
|
|
||||||
proc.nr_slot_tx = slot;
|
|
||||||
nr_ue_prach_procedures(UE, &proc, 0);
|
|
||||||
|
|
||||||
/* tx_lev_dB not used later, no need to set */
|
/* tx_lev_dB not used later, no need to set */
|
||||||
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
#include "NR_EUTRA-MBSFN-SubframeConfig.h"
|
#include "NR_EUTRA-MBSFN-SubframeConfig.h"
|
||||||
|
|
||||||
#include "RRC/NR/MESSAGES/asn1_msg.h"
|
#include "RRC/NR/MESSAGES/asn1_msg.h"
|
||||||
|
#include "RRC/NR/nr_rrc_extern.h"
|
||||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp.h"
|
#include "openair2/LAYER2/nr_pdcp/nr_pdcp.h"
|
||||||
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "PHY/defs_nr_common.h"
|
|
||||||
|
|
||||||
//Table 5.1.2.2-2
|
//Table 5.1.2.2-2
|
||||||
uint16_t Tbstable_nr[INDEX_MAX_TBS_TABLE] = {24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,208,224,240,256,272,288,304,320,336,352,368,384,408,432,456,480,504,528,552,576,608,640,672,704,736,768,808,848,888,928,984,1032,1064,1128,1160,1192,1224,1256,1288,1320,1352,1416,1480,1544,1608,1672,1736,1800,1864,1928,2024,2088,2152,2216,2280,2408,2472,2536,2600,2664,2728,2792,2856,2976,3104,3240,3368,3496,3624,3752,3824};
|
uint16_t Tbstable_nr[INDEX_MAX_TBS_TABLE] = {24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,208,224,240,256,272,288,304,320,336,352,368,384,408,432,456,480,504,528,552,576,608,640,672,704,736,768,808,848,888,928,984,1032,1064,1128,1160,1192,1224,1256,1288,1320,1352,1416,1480,1544,1608,1672,1736,1800,1864,1928,2024,2088,2152,2216,2280,2408,2472,2536,2600,2664,2728,2792,2856,2976,3104,3240,3368,3496,3624,3752,3824};
|
||||||
@@ -48,7 +47,8 @@ uint32_t nr_compute_tbs(uint16_t Qm,
|
|||||||
|
|
||||||
LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl);
|
LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl);
|
||||||
|
|
||||||
const uint32_t nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
|
const int nb_subcarrier_per_rb = 12;
|
||||||
|
const uint32_t nbp_re = nb_subcarrier_per_rb * nb_symb_sch - nb_dmrs_prb - nb_rb_oh;
|
||||||
const uint32_t nb_re = min(156, nbp_re) * nb_rb;
|
const uint32_t nb_re = min(156, nbp_re) * nb_rb;
|
||||||
// Intermediate number of information bits
|
// Intermediate number of information bits
|
||||||
// Rx1024 is tabulated as 10 times the actual code rate
|
// Rx1024 is tabulated as 10 times the actual code rate
|
||||||
|
|||||||
@@ -38,9 +38,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "platform_types.h"
|
#include "platform_types.h"
|
||||||
|
|
||||||
/* PHY */
|
|
||||||
#include "PHY/defs_nr_common.h"
|
|
||||||
|
|
||||||
/* IF */
|
/* IF */
|
||||||
#include "NR_IF_Module.h"
|
#include "NR_IF_Module.h"
|
||||||
#include "fapi_nr_ue_interface.h"
|
#include "fapi_nr_ue_interface.h"
|
||||||
@@ -64,10 +61,7 @@
|
|||||||
#include "NR_CellGroupConfig.h"
|
#include "NR_CellGroupConfig.h"
|
||||||
#include "NR_ServingCellConfig.h"
|
#include "NR_ServingCellConfig.h"
|
||||||
#include "NR_MeasConfig.h"
|
#include "NR_MeasConfig.h"
|
||||||
#include "fapi_nr_ue_interface.h"
|
|
||||||
#include "NR_IF_Module.h"
|
|
||||||
#include "PHY/defs_nr_common.h"
|
|
||||||
#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
|
|
||||||
|
|
||||||
// ==========
|
// ==========
|
||||||
// NR UE defs
|
// NR UE defs
|
||||||
@@ -371,6 +365,16 @@ typedef struct {
|
|||||||
int8_t delta_pucch;
|
int8_t delta_pucch;
|
||||||
} PUCCH_sched_t;
|
} PUCCH_sched_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
uint32_t ssb_index;
|
||||||
|
/// SSB RSRP in dBm
|
||||||
|
short ssb_rsrp_dBm;
|
||||||
|
/// SSB pathloss
|
||||||
|
int16_t pathloss;
|
||||||
|
|
||||||
|
} NR_PHY_meas_t;
|
||||||
|
|
||||||
|
|
||||||
/*!\brief Top level UE MAC structure */
|
/*!\brief Top level UE MAC structure */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -423,8 +427,6 @@ typedef struct {
|
|||||||
RA_config_t ra;
|
RA_config_t ra;
|
||||||
/// SSB index from MIB decoding
|
/// SSB index from MIB decoding
|
||||||
uint8_t mib_ssb;
|
uint8_t mib_ssb;
|
||||||
/// measured SSB RSRP in dBm
|
|
||||||
short ssb_rsrp_dBm;
|
|
||||||
|
|
||||||
nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
|
nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
|
||||||
|
|
||||||
@@ -460,6 +462,8 @@ typedef struct {
|
|||||||
uint16_t nr_band;
|
uint16_t nr_band;
|
||||||
uint8_t ssb_subcarrier_offset;
|
uint8_t ssb_subcarrier_offset;
|
||||||
|
|
||||||
|
NR_PHY_meas_t phy_measurements;
|
||||||
|
|
||||||
dci_pdu_rel15_t def_dci_pdu_rel15[8];
|
dci_pdu_rel15_t def_dci_pdu_rel15[8];
|
||||||
|
|
||||||
// Defined for abstracted mode
|
// Defined for abstracted mode
|
||||||
|
|||||||
@@ -431,6 +431,8 @@ void init_RA(module_id_t mod_id,
|
|||||||
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric,
|
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric,
|
||||||
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated);
|
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated);
|
||||||
|
|
||||||
|
int16_t get_prach_tx_power(module_id_t mod_id);
|
||||||
|
|
||||||
void set_ra_rnti(NR_UE_MAC_INST_t *mac, fapi_nr_ul_config_prach_pdu *prach_pdu);
|
void set_ra_rnti(NR_UE_MAC_INST_t *mac, fapi_nr_ul_config_prach_pdu *prach_pdu);
|
||||||
|
|
||||||
void nr_Msg1_transmitted(module_id_t mod_id);
|
void nr_Msg1_transmitted(module_id_t mod_id);
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
#include "radio/COMMON/common_lib.h"
|
#include "radio/COMMON/common_lib.h"
|
||||||
//#undef MALLOC
|
//#undef MALLOC
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "PHY/types.h"
|
|
||||||
#include "PHY/defs_UE.h"
|
|
||||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
|
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
|
||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp.h"
|
#include "openair2/LAYER2/nr_pdcp/nr_pdcp.h"
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.openairinterface.org/?page_id=698
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*-------------------------------------------------------------------------------
|
|
||||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
* contact@openairinterface.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*! \file nr_l1_helper.c
|
|
||||||
* \brief PHY/MAC helper functions
|
|
||||||
* \author Guido Casati
|
|
||||||
* \date 2019
|
|
||||||
* \version 2.0
|
|
||||||
* \email guido.casati@iis.fraunhofer.de
|
|
||||||
* @ingroup _mac
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "PHY/defs_nr_common.h"
|
|
||||||
//#include "PHY/impl_defs_top.h"
|
|
||||||
|
|
||||||
#include "mac_defs.h"
|
|
||||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
|
||||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
|
||||||
#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h"
|
|
||||||
#include "NR_P-Max.h"
|
|
||||||
|
|
||||||
// Implementation of 6.2.4 Configured ransmitted power
|
|
||||||
// 3GPP TS 38.101-1 version 16.5.0 Release 16
|
|
||||||
// -
|
|
||||||
// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot.
|
|
||||||
// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c
|
|
||||||
// -
|
|
||||||
// Measurement units:
|
|
||||||
// - p_max: dBm
|
|
||||||
// - delta_TC_c: dB
|
|
||||||
// - P_powerclass: dBm
|
|
||||||
// - delta_P_powerclass: dB
|
|
||||||
// - MPR_c: dB
|
|
||||||
// - delta_MPR_c: dB
|
|
||||||
// - delta_T_IB_c dB
|
|
||||||
// - delta_rx_SRS dB
|
|
||||||
// note:
|
|
||||||
// - Assuming:
|
|
||||||
// -- Powerclass 3 capable UE (which is default power class unless otherwise stated)
|
|
||||||
// -- Maximum power reduction (MPR_c) for power class 3, QPSK, inner RB allocations
|
|
||||||
// -- no additional MPR (A_MPR_c)
|
|
||||||
// todo:
|
|
||||||
// - in current implementation delta_P_powerclass is not handling power classes different from 3
|
|
||||||
long nr_get_Pcmax(module_id_t mod_id){
|
|
||||||
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
|
||||||
uint32_t band = (mac->scc!=NULL) ? *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] :
|
|
||||||
*mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR;
|
|
||||||
NR_P_Max_t p_max = 0;
|
|
||||||
uint8_t P_powerclass = 23;
|
|
||||||
uint8_t delta_P_powerclass = 0;
|
|
||||||
uint8_t MPR_c = 1.5;
|
|
||||||
uint8_t delta_MPR_c = 0;
|
|
||||||
uint8_t A_MPR_c = 0;
|
|
||||||
uint8_t delta_T_IB_c = 0;
|
|
||||||
uint8_t delta_TC_c = 0;
|
|
||||||
uint8_t delta_rx_SRS = 0;
|
|
||||||
uint8_t P_MPR_c = 0;
|
|
||||||
long P_cmax_l = 0;
|
|
||||||
long P_cmax_h = 0;
|
|
||||||
long P_cmax = 0;
|
|
||||||
|
|
||||||
if (band == 28 && mac->phy_config.config_req.carrier_config.uplink_bandwidth == 30){
|
|
||||||
delta_MPR_c = 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mac->cg && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1){
|
|
||||||
if (*mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1->powerBoostPi2BPSK == 1){
|
|
||||||
// TbD: assuming power class 3 capable UE operating in TDD bands n40, n41, n77, n78, and n79 with Pi/2 BPSK modulation
|
|
||||||
delta_P_powerclass = -3;
|
|
||||||
p_max += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NR_P_Max_t *p_Max = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max;
|
|
||||||
if (p_Max){
|
|
||||||
|
|
||||||
p_max += *p_Max;
|
|
||||||
|
|
||||||
LOG_D(MAC, "In %s maximum UL transmission power p_max is %ld dBm \n", __FUNCTION__, p_max);
|
|
||||||
|
|
||||||
P_cmax_l = min(p_max - delta_TC_c, (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c));
|
|
||||||
|
|
||||||
P_cmax_h = min(p_max, P_powerclass - delta_P_powerclass);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
P_cmax_l = (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c);
|
|
||||||
|
|
||||||
P_cmax_h = P_powerclass - delta_P_powerclass;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
P_cmax = (P_cmax_h + P_cmax_l) / 2;
|
|
||||||
|
|
||||||
LOG_D(MAC, "In %s configured maximum output power: %ld dBm <= PCMAX %ld dBm <= %ld dBm \n", __FUNCTION__, P_cmax_l, P_cmax, P_cmax_h);
|
|
||||||
|
|
||||||
return P_cmax;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.openairinterface.org/?page_id=698
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*-------------------------------------------------------------------------------
|
|
||||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
* contact@openairinterface.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Function to compute configured maximum output power according to clause 6.2.4 of 3GPP TS 38.101-1 version 16.5.0 Release 16
|
|
||||||
@param Mod_id Module id of UE
|
|
||||||
*/
|
|
||||||
long nr_get_Pcmax(module_id_t mod_id);
|
|
||||||
/** @}*/
|
|
||||||
|
|
||||||
@@ -34,18 +34,102 @@
|
|||||||
#include "NR_RACH-ConfigCommon.h"
|
#include "NR_RACH-ConfigCommon.h"
|
||||||
#include "RRC/NR_UE/rrc_proto.h"
|
#include "RRC/NR_UE/rrc_proto.h"
|
||||||
|
|
||||||
/* PHY */
|
|
||||||
#include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
|
|
||||||
|
|
||||||
/* MAC */
|
/* MAC */
|
||||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||||
#include "NR_MAC_COMMON/nr_mac.h"
|
#include "NR_MAC_COMMON/nr_mac.h"
|
||||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
#include "LAYER2/NR_MAC_UE/nr_l1_helpers.h"
|
|
||||||
|
|
||||||
#include <executables/softmodem-common.h>
|
#include <executables/softmodem-common.h>
|
||||||
|
|
||||||
void nr_get_RA_window(NR_UE_MAC_INST_t *mac);
|
// Implementation of 6.2.4 Configured ransmitted power
|
||||||
|
// 3GPP TS 38.101-1 version 16.5.0 Release 16
|
||||||
|
// -
|
||||||
|
// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot.
|
||||||
|
// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c
|
||||||
|
// -
|
||||||
|
// Measurement units:
|
||||||
|
// - p_max: dBm
|
||||||
|
// - delta_TC_c: dB
|
||||||
|
// - P_powerclass: dBm
|
||||||
|
// - delta_P_powerclass: dB
|
||||||
|
// - MPR_c: dB
|
||||||
|
// - delta_MPR_c: dB
|
||||||
|
// - delta_T_IB_c dB
|
||||||
|
// - delta_rx_SRS dB
|
||||||
|
// note:
|
||||||
|
// - Assuming:
|
||||||
|
// -- Powerclass 3 capable UE (which is default power class unless otherwise stated)
|
||||||
|
// -- Maximum power reduction (MPR_c) for power class 3, QPSK, inner RB allocations
|
||||||
|
// -- no additional MPR (A_MPR_c)
|
||||||
|
// todo:
|
||||||
|
// - in current implementation delta_P_powerclass is not handling power classes different from 3
|
||||||
|
long nr_get_Pcmax(module_id_t mod_id){
|
||||||
|
|
||||||
|
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||||
|
uint32_t band = (mac->scc!=NULL) ? *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] :
|
||||||
|
*mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR;
|
||||||
|
NR_P_Max_t p_max = 0;
|
||||||
|
uint8_t P_powerclass = 23;
|
||||||
|
uint8_t delta_P_powerclass = 0;
|
||||||
|
uint8_t MPR_c = 1.5;
|
||||||
|
uint8_t delta_MPR_c = 0;
|
||||||
|
uint8_t A_MPR_c = 0;
|
||||||
|
uint8_t delta_T_IB_c = 0;
|
||||||
|
uint8_t delta_TC_c = 0;
|
||||||
|
uint8_t delta_rx_SRS = 0;
|
||||||
|
uint8_t P_MPR_c = 0;
|
||||||
|
long P_cmax_l = 0;
|
||||||
|
long P_cmax_h = 0;
|
||||||
|
long P_cmax = 0;
|
||||||
|
|
||||||
|
if (band == 28 && mac->phy_config.config_req.carrier_config.uplink_bandwidth == 30){
|
||||||
|
delta_MPR_c = 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mac->cg && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1){
|
||||||
|
if (*mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1->powerBoostPi2BPSK == 1){
|
||||||
|
// TbD: assuming power class 3 capable UE operating in TDD bands n40, n41, n77, n78, and n79 with Pi/2 BPSK modulation
|
||||||
|
delta_P_powerclass = -3;
|
||||||
|
p_max += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NR_P_Max_t *p_Max = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max;
|
||||||
|
if (p_Max){
|
||||||
|
|
||||||
|
p_max += *p_Max;
|
||||||
|
|
||||||
|
LOG_D(MAC, "In %s maximum UL transmission power p_max is %ld dBm \n", __FUNCTION__, p_max);
|
||||||
|
|
||||||
|
P_cmax_l = min(p_max - delta_TC_c, (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c));
|
||||||
|
|
||||||
|
P_cmax_h = min(p_max, P_powerclass - delta_P_powerclass);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
P_cmax_l = (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c);
|
||||||
|
|
||||||
|
P_cmax_h = P_powerclass - delta_P_powerclass;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
P_cmax = (P_cmax_h + P_cmax_l) / 2;
|
||||||
|
|
||||||
|
LOG_D(MAC, "In %s configured maximum output power: %ld dBm <= PCMAX %ld dBm <= %ld dBm \n", __FUNCTION__, P_cmax_l, P_cmax, P_cmax_h);
|
||||||
|
|
||||||
|
return P_cmax;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = mac->phy_measurements.pathloss;
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Random Access procedure initialization as per 5.1.1 and initialization of variables specific
|
// Random Access procedure initialization as per 5.1.1 and initialization of variables specific
|
||||||
// to Random Access type as specified in clause 5.1.1a (3GPP TS 38.321 version 16.2.1 Release 16)
|
// to Random Access type as specified in clause 5.1.1a (3GPP TS 38.321 version 16.2.1 Release 16)
|
||||||
@@ -594,7 +678,7 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
} else {
|
} else {
|
||||||
/* TODO: This controls the tx_power of UE and the ramping procedure of RA of UE. Later we
|
/* 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. */
|
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 ? get_nr_PL(mod_id, CC_id, gNB_id) : 0;
|
int16_t dl_pathloss = !get_softmodem_params()->emulate_l1 ? mac->phy_measurements.pathloss : 0;
|
||||||
ssb_rach_config(ra, prach_resources, nr_rach_ConfigCommon, prach_pdu);
|
ssb_rach_config(ra, prach_resources, nr_rach_ConfigCommon, prach_pdu);
|
||||||
ra_preambles_config(prach_resources, mac, dl_pathloss);
|
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);
|
LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-based random access procedure... \n", ra->ra_PreambleIndex);
|
||||||
|
|||||||
@@ -2637,7 +2637,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");
|
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->ssb_rsrp_dBm;
|
ssb_rsrp[1][0] = mac->phy_measurements.ssb_rsrp_dBm;
|
||||||
|
|
||||||
uint8_t ssbi;
|
uint8_t ssbi;
|
||||||
|
|
||||||
|
|||||||
@@ -2802,7 +2802,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
|||||||
|
|
||||||
nr_get_prach_resources(module_idP, 0, 0, &ra->prach_resources, prach_config_pdu, ra->rach_ConfigDedicated);
|
nr_get_prach_resources(module_idP, 0, 0, &ra->prach_resources, prach_config_pdu, ra->rach_ConfigDedicated);
|
||||||
prach_config_pdu->ra_PreambleIndex = ra->ra_PreambleIndex;
|
prach_config_pdu->ra_PreambleIndex = ra->ra_PreambleIndex;
|
||||||
prach_config_pdu->preamble_target_power = ra->prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER;
|
prach_config_pdu->prach_tx_power = get_prach_tx_power(module_idP);
|
||||||
set_ra_rnti(mac, prach_config_pdu);
|
set_ra_rnti(mac, prach_config_pdu);
|
||||||
|
|
||||||
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, NULL);
|
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, NULL);
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include <openair2/UTIL/OPT/opt.h>
|
#include <openair2/UTIL/OPT/opt.h>
|
||||||
|
|
||||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||||
|
|
||||||
//#define SRS_IND_DEBUG
|
//#define SRS_IND_DEBUG
|
||||||
|
|||||||
@@ -1085,6 +1085,14 @@ 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, int16_t pathloss) {
|
||||||
|
|
||||||
|
mac->phy_measurements.ssb_index = ssb_index;
|
||||||
|
mac->phy_measurements.ssb_rsrp_dBm = rsrp_dbm;
|
||||||
|
mac->phy_measurements.pathloss = pathloss;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// L2 Abstraction Layer
|
// L2 Abstraction Layer
|
||||||
// Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
|
// Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
|
||||||
int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
|
int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
|
||||||
@@ -1225,7 +1233,10 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
|
|||||||
|
|
||||||
switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){
|
switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){
|
||||||
case FAPI_NR_RX_PDU_TYPE_SSB:
|
case FAPI_NR_RX_PDU_TYPE_SSB:
|
||||||
mac->ssb_rsrp_dBm = (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.rsrp_dBm;
|
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,
|
||||||
|
(dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pathloss);
|
||||||
ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index, dl_info->phy_data,
|
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.pdu,
|
||||||
(dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.additional_bits,
|
(dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.additional_bits,
|
||||||
|
|||||||
@@ -75,7 +75,6 @@
|
|||||||
#include "NR_DLInformationTransfer.h"
|
#include "NR_DLInformationTransfer.h"
|
||||||
#include "NR_RRCReestablishmentRequest.h"
|
#include "NR_RRCReestablishmentRequest.h"
|
||||||
#include "NR_UE-CapabilityRequestFilterNR.h"
|
#include "NR_UE-CapabilityRequestFilterNR.h"
|
||||||
#include "PHY/defs_nr_common.h"
|
|
||||||
#include "common/utils/nr/nr_common.h"
|
#include "common/utils/nr/nr_common.h"
|
||||||
#if defined(NR_Rel16)
|
#if defined(NR_Rel16)
|
||||||
#include "NR_SCS-SpecificCarrier.h"
|
#include "NR_SCS-SpecificCarrier.h"
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
#include "LAYER2/MAC/mac.h"
|
#include "LAYER2/MAC/mac.h"
|
||||||
#include "LAYER2/RLC/rlc.h"
|
#include "LAYER2/RLC/rlc.h"
|
||||||
|
|
||||||
|
#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.
|
||||||
|
|
||||||
extern UE_RRC_INST *UE_rrc_inst;
|
extern UE_RRC_INST *UE_rrc_inst;
|
||||||
|
|
||||||
extern uint8_t DRB2LCHAN[8];
|
extern uint8_t DRB2LCHAN[8];
|
||||||
|
|||||||
Reference in New Issue
Block a user