fix beam allocation for multiple TD prach occasions in a slot
This commit is contained in:
+2
-1
@@ -1319,11 +1319,12 @@ void *ru_thread(void *param)
|
|||||||
|
|
||||||
for (int prach_oc = 0; prach_oc < p->num_prach_ocas; prach_oc++) {
|
for (int prach_oc = 0; prach_oc < p->num_prach_ocas; prach_oc++) {
|
||||||
int prachStartSymbol = p->prachStartSymbol + prach_oc * N_dur;
|
int prachStartSymbol = p->prachStartSymbol + prach_oc * N_dur;
|
||||||
|
int beam_id = ru->prach_list[prach_id].beam ? ru->prach_list[prach_id].beam[prach_oc] : 0;
|
||||||
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
||||||
rx_nr_prach_ru(ru,
|
rx_nr_prach_ru(ru,
|
||||||
p->fmt, // could also use format
|
p->fmt, // could also use format
|
||||||
p->numRA,
|
p->numRA,
|
||||||
p->beam,
|
beam_id,
|
||||||
prachStartSymbol,
|
prachStartSymbol,
|
||||||
p->slot,
|
p->slot,
|
||||||
prach_oc,
|
prach_oc,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#define NFAPI_MAX_NUM_GROUPS 8
|
#define NFAPI_MAX_NUM_GROUPS 8
|
||||||
#define NFAPI_MAX_NUM_CB 8
|
#define NFAPI_MAX_NUM_CB 8
|
||||||
#define NFAPI_MAX_NUM_PRGS 1
|
#define NFAPI_MAX_NUM_PRGS 1
|
||||||
#define NFAPI_MAX_NUM_BG_IF 1
|
#define NFAPI_MAX_NUM_BG_IF 6
|
||||||
#define NFAPI_MAX_NUM_PERIODS 8
|
#define NFAPI_MAX_NUM_PERIODS 8
|
||||||
|
|
||||||
// Extension to the generic structures for single tlv values
|
// Extension to the generic structures for single tlv values
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ void init_prach_list(PHY_VARS_gNB *gNB)
|
|||||||
for (int i = 0; i < NUMBER_OF_NR_PRACH_MAX; i++){
|
for (int i = 0; i < NUMBER_OF_NR_PRACH_MAX; i++){
|
||||||
gNB->prach_vars.list[i].frame = -1;
|
gNB->prach_vars.list[i].frame = -1;
|
||||||
gNB->prach_vars.list[i].slot = -1;
|
gNB->prach_vars.list[i].slot = -1;
|
||||||
gNB->prach_vars.list[i].beam_nb = -1;
|
|
||||||
gNB->prach_vars.list[i].num_slots = -1;
|
gNB->prach_vars.list[i].num_slots = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,8 +50,8 @@ void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id)
|
|||||||
{
|
{
|
||||||
gNB->prach_vars.list[prach_id].frame = -1;
|
gNB->prach_vars.list[prach_id].frame = -1;
|
||||||
gNB->prach_vars.list[prach_id].slot = -1;
|
gNB->prach_vars.list[prach_id].slot = -1;
|
||||||
gNB->prach_vars.list[prach_id].beam_nb = -1;
|
|
||||||
gNB->prach_vars.list[prach_id].num_slots = -1;
|
gNB->prach_vars.list[prach_id].num_slots = -1;
|
||||||
|
free_and_zero(gNB->prach_vars.list[prach_id].beam_nb);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t find_nr_prach(PHY_VARS_gNB *gNB,int frame, int slot, find_type_t type) {
|
int16_t find_nr_prach(PHY_VARS_gNB *gNB,int frame, int slot, find_type_t type) {
|
||||||
@@ -79,18 +78,20 @@ int nr_fill_prach(PHY_VARS_gNB *gNB, int SFN, int Slot, nfapi_nr_prach_pdu_t *pr
|
|||||||
prach->slot = Slot;
|
prach->slot = Slot;
|
||||||
const int format = prach_pdu->prach_format;
|
const int format = prach_pdu->prach_format;
|
||||||
prach->num_slots = (format < 4) ? get_long_prach_dur(format, gNB->frame_parms.numerology_index) : 1;
|
prach->num_slots = (format < 4) ? get_long_prach_dur(format, gNB->frame_parms.numerology_index) : 1;
|
||||||
prach->beam_nb = 0;
|
|
||||||
if (gNB->common_vars.beam_id) {
|
if (gNB->common_vars.beam_id) {
|
||||||
int fapi_beam_idx = prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx;
|
int n_symb = get_nr_prach_duration(prach_pdu->prach_format);
|
||||||
// TODO no idea how to compute final prach symbol here so for now we go til the end of the slot
|
prach->beam_nb = calloc(prach_pdu->beamforming.dig_bf_interface, sizeof(*prach->beam_nb));
|
||||||
int temp_nb_symbols = NR_NUMBER_OF_SYMBOLS_PER_SLOT - prach_pdu->prach_start_symbol;
|
for (int i = 0; i < prach_pdu->beamforming.dig_bf_interface; i++) {
|
||||||
int bitmap = SL_to_bitmap(prach_pdu->prach_start_symbol, temp_nb_symbols);
|
int fapi_beam_idx = prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[i].beam_idx;
|
||||||
prach->beam_nb = beam_index_allocation(fapi_beam_idx,
|
int start_symb = prach_pdu->prach_start_symbol + i * n_symb;
|
||||||
&gNB->gNB_config.analog_beamforming_ve,
|
int bitmap = SL_to_bitmap(start_symb, n_symb);
|
||||||
&gNB->common_vars,
|
prach->beam_nb[i] = beam_index_allocation(fapi_beam_idx,
|
||||||
Slot,
|
&gNB->gNB_config.analog_beamforming_ve,
|
||||||
NR_NUMBER_OF_SYMBOLS_PER_SLOT,
|
&gNB->common_vars,
|
||||||
bitmap);
|
Slot,
|
||||||
|
NR_NUMBER_OF_SYMBOLS_PER_SLOT,
|
||||||
|
bitmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LOG_D(NR_PHY,"Copying prach pdu %d bytes to index %d\n", (int)sizeof(*prach_pdu), prach_id);
|
LOG_D(NR_PHY,"Copying prach pdu %d bytes to index %d\n", (int)sizeof(*prach_pdu), prach_id);
|
||||||
memcpy(&prach->pdu, prach_pdu, sizeof(*prach_pdu));
|
memcpy(&prach->pdu, prach_pdu, sizeof(*prach_pdu));
|
||||||
@@ -127,7 +128,7 @@ int16_t find_nr_prach_ru(RU_t *ru,int frame,int slot, find_type_t type)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_fill_prach_ru(RU_t *ru, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu, int beam_id)
|
void nr_fill_prach_ru(RU_t *ru, int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu, int *beam_id)
|
||||||
{
|
{
|
||||||
int prach_id = find_nr_prach_ru(ru, SFN, Slot, SEARCH_EXIST_OR_FREE);
|
int prach_id = find_nr_prach_ru(ru, SFN, Slot, SEARCH_EXIST_OR_FREE);
|
||||||
AssertFatal(((prach_id >= 0) && (prach_id < NUMBER_OF_NR_PRACH_MAX)) || (prach_id < 0),
|
AssertFatal(((prach_id >= 0) && (prach_id < NUMBER_OF_NR_PRACH_MAX)) || (prach_id < 0),
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ void rx_nr_prach_ru(RU_t *ru,
|
|||||||
int frame,
|
int frame,
|
||||||
int subframe);
|
int subframe);
|
||||||
|
|
||||||
void nr_fill_prach_ru(RU_t *ru,int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdum, int beam_id);
|
void nr_fill_prach_ru(RU_t *ru,int SFN, int Slot, nfapi_nr_prach_pdu_t *prach_pdu, int *beam_nb);
|
||||||
|
|
||||||
int16_t find_nr_prach(PHY_VARS_gNB *gNB,int frame,int slot, find_type_t type);
|
int16_t find_nr_prach(PHY_VARS_gNB *gNB,int frame,int slot, find_type_t type);
|
||||||
int16_t find_nr_prach_ru(RU_t *ru,int frame,int slot, find_type_t type);
|
int16_t find_nr_prach_ru(RU_t *ru,int frame,int slot, find_type_t type);
|
||||||
@@ -304,7 +304,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
void init_prach_list(PHY_VARS_gNB *gNB);
|
void init_prach_list(PHY_VARS_gNB *gNB);
|
||||||
void init_prach_ru_list(RU_t *ru);
|
void init_prach_ru_list(RU_t *ru);
|
||||||
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
||||||
uint8_t get_nr_prach_duration(uint8_t prach_format);
|
int get_nr_prach_duration(uint8_t prach_format);
|
||||||
|
|
||||||
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
||||||
|
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ typedef struct {
|
|||||||
int prachStartSymbol;
|
int prachStartSymbol;
|
||||||
int num_prach_ocas;
|
int num_prach_ocas;
|
||||||
int num_slots;
|
int num_slots;
|
||||||
int beam;
|
int *beam;
|
||||||
} RU_PRACH_list_t;
|
} RU_PRACH_list_t;
|
||||||
|
|
||||||
#define NUMBER_OF_NR_RU_PRACH_MAX 8
|
#define NUMBER_OF_NR_RU_PRACH_MAX 8
|
||||||
|
|||||||
@@ -138,9 +138,9 @@ typedef struct {
|
|||||||
int frame;
|
int frame;
|
||||||
int slot;
|
int slot;
|
||||||
// identifier for concurrent beams
|
// identifier for concurrent beams
|
||||||
int beam_nb;
|
|
||||||
// prach duration in slots
|
// prach duration in slots
|
||||||
int num_slots;
|
int num_slots;
|
||||||
|
int *beam_nb;
|
||||||
nfapi_nr_prach_pdu_t pdu;
|
nfapi_nr_prach_pdu_t pdu;
|
||||||
} gNB_PRACH_list_t;
|
} gNB_PRACH_list_t;
|
||||||
|
|
||||||
|
|||||||
@@ -42,8 +42,9 @@
|
|||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
uint8_t get_nr_prach_duration(uint8_t prach_format){
|
|
||||||
|
|
||||||
|
int get_nr_prach_duration(uint8_t prach_format)
|
||||||
|
{
|
||||||
switch(prach_format){
|
switch(prach_format){
|
||||||
|
|
||||||
case 0: // format 0
|
case 0: // format 0
|
||||||
@@ -117,14 +118,14 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB, int frame, int slot, nfapi_nr_rac
|
|||||||
nfapi_nr_prach_pdu_t *prach_pdu = &gNB->prach_vars.list[prach_id].pdu;
|
nfapi_nr_prach_pdu_t *prach_pdu = &gNB->prach_vars.list[prach_id].pdu;
|
||||||
const int prach_start_slot = gNB->prach_vars.list[prach_id].slot;
|
const int prach_start_slot = gNB->prach_vars.list[prach_id].slot;
|
||||||
uint8_t prachStartSymbol;
|
uint8_t prachStartSymbol;
|
||||||
uint8_t N_dur = get_nr_prach_duration(prach_pdu->prach_format);
|
int N_dur = get_nr_prach_duration(prach_pdu->prach_format);
|
||||||
|
|
||||||
for(int prach_oc = 0; prach_oc < prach_pdu->num_prach_ocas; prach_oc++) {
|
for(int prach_oc = 0; prach_oc < prach_pdu->num_prach_ocas; prach_oc++) {
|
||||||
for (ru_aa=0,aa=0;ru_aa<ru->nb_rx;ru_aa++,aa++) {
|
for (ru_aa=0,aa=0;ru_aa<ru->nb_rx;ru_aa++,aa++) {
|
||||||
gNB->prach_vars.rxsigF[aa] = ru->prach_rxsigF[prach_oc][ru_aa];
|
gNB->prach_vars.rxsigF[aa] = ru->prach_rxsigF[prach_oc][ru_aa];
|
||||||
}
|
}
|
||||||
|
|
||||||
prachStartSymbol = prach_pdu->prach_start_symbol+prach_oc*N_dur;
|
prachStartSymbol = prach_pdu->prach_start_symbol + prach_oc * N_dur;
|
||||||
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
||||||
|
|
||||||
rx_nr_prach(gNB,
|
rx_nr_prach(gNB,
|
||||||
|
|||||||
@@ -356,10 +356,11 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
|
|
||||||
NR_COMMON_channels_t *cc = gNB->common_channels;
|
NR_COMMON_channels_t *cc = gNB->common_channels;
|
||||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||||
NR_RACH_ConfigCommon_t *rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
|
NR_BWP_UplinkCommon_t *initialUplinkBWP = scc->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
NR_RACH_ConfigCommon_t *rach_ConfigCommon = initialUplinkBWP->rach_ConfigCommon->choice.setup;
|
||||||
NR_MsgA_ConfigCommon_r16_t *msgacc = NULL;
|
NR_MsgA_ConfigCommon_r16_t *msgacc = NULL;
|
||||||
if (scc->uplinkConfigCommon->initialUplinkBWP->ext1 && scc->uplinkConfigCommon->initialUplinkBWP->ext1->msgA_ConfigCommon_r16)
|
if (initialUplinkBWP->ext1 && initialUplinkBWP->ext1->msgA_ConfigCommon_r16)
|
||||||
msgacc = scc->uplinkConfigCommon->initialUplinkBWP->ext1->msgA_ConfigCommon_r16->choice.setup;
|
msgacc = initialUplinkBWP->ext1->msgA_ConfigCommon_r16->choice.setup;
|
||||||
int slots_frame = gNB->frame_structure.numb_slots_frame;
|
int slots_frame = gNB->frame_structure.numb_slots_frame;
|
||||||
int index = ul_buffer_index(frameP, slotP, slots_frame, gNB->UL_tti_req_ahead_size);
|
int index = ul_buffer_index(frameP, slotP, slots_frame, gNB->UL_tti_req_ahead_size);
|
||||||
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][index];
|
nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][index];
|
||||||
@@ -371,7 +372,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
int slot_index = 0;
|
int slot_index = 0;
|
||||||
uint16_t prach_occasion_id = -1;
|
uint16_t prach_occasion_id = -1;
|
||||||
|
|
||||||
int bwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
int bwp_start = NRRIV2PRBOFFSET(initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||||
|
|
||||||
uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value;
|
uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value;
|
||||||
const int ul_mu = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
const int ul_mu = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
||||||
@@ -399,6 +400,16 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
uint32_t N_t_slot = cc->prach_info.N_t_slot;
|
uint32_t N_t_slot = cc->prach_info.N_t_slot;
|
||||||
uint32_t start_symb = cc->prach_info.start_symbol;
|
uint32_t start_symb = cc->prach_info.start_symbol;
|
||||||
for (int fdm_index = 0; fdm_index < fdm; fdm_index++) { // one structure per frequency domain occasion
|
for (int fdm_index = 0; fdm_index < fdm; fdm_index++) { // one structure per frequency domain occasion
|
||||||
|
AssertFatal(UL_tti_req->n_pdus < sizeof(UL_tti_req->pdus_list) / sizeof(UL_tti_req->pdus_list[0]),
|
||||||
|
"Invalid UL_tti_req->n_pdus %d\n",
|
||||||
|
UL_tti_req->n_pdus);
|
||||||
|
|
||||||
|
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE;
|
||||||
|
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t);
|
||||||
|
nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].prach_pdu;
|
||||||
|
memset(prach_pdu, 0, sizeof(nfapi_nr_prach_pdu_t));
|
||||||
|
UL_tti_req->n_pdus += 1;
|
||||||
|
int num_td_occ = 0;
|
||||||
for (int td_index = 0; td_index < N_t_slot; td_index++) {
|
for (int td_index = 0; td_index < N_t_slot; td_index++) {
|
||||||
uint32_t config_period = cc->prach_info.x;
|
uint32_t config_period = cc->prach_info.x;
|
||||||
prach_occasion_id = (((frameP % (cc->max_association_period * config_period))/config_period) * cc->total_prach_occasions_per_config_period) +
|
prach_occasion_id = (((frameP % (cc->max_association_period * config_period))/config_period) * cc->total_prach_occasions_per_config_period) +
|
||||||
@@ -407,6 +418,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
if (prach_occasion_id >= cc->total_prach_occasions) // to be confirmed: unused occasion?
|
if (prach_occasion_id >= cc->total_prach_occasions) // to be confirmed: unused occasion?
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
num_td_occ++;
|
||||||
float num_ssb_per_RO = ssb_per_rach_occasion[cfg->prach_config.ssb_per_rach.value];
|
float num_ssb_per_RO = ssb_per_rach_occasion[cfg->prach_config.ssb_per_rach.value];
|
||||||
int beam_index = 0;
|
int beam_index = 0;
|
||||||
if(num_ssb_per_RO <= 1) {
|
if(num_ssb_per_RO <= 1) {
|
||||||
@@ -417,8 +429,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
// multi-beam allocation structure
|
// multi-beam allocation structure
|
||||||
beam = beam_allocation_procedure(&gNB->beam_info, frameP, slotP, beam_index, slots_frame);
|
beam = beam_allocation_procedure(&gNB->beam_info, frameP, slotP, beam_index, slots_frame);
|
||||||
AssertFatal(beam.idx >= 0, "Cannot allocate PRACH corresponding to %d SSB transmitted in any available beam\n", n_ssb + 1);
|
AssertFatal(beam.idx >= 0, "Cannot allocate PRACH corresponding to %d SSB transmitted in any available beam\n", n_ssb + 1);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
int first_ssb_index = (prach_occasion_id * (int)num_ssb_per_RO) % cc->num_active_ssb;
|
int first_ssb_index = (prach_occasion_id * (int)num_ssb_per_RO) % cc->num_active_ssb;
|
||||||
for(int j = first_ssb_index; j < first_ssb_index + num_ssb_per_RO; j++) {
|
for(int j = first_ssb_index; j < first_ssb_index + num_ssb_per_RO; j++) {
|
||||||
// fapi beam index
|
// fapi beam index
|
||||||
@@ -428,40 +439,15 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
AssertFatal(beam.idx >= 0, "Cannot allocate PRACH corresponding to SSB %d in any available beam\n", j);
|
AssertFatal(beam.idx >= 0, "Cannot allocate PRACH corresponding to SSB %d in any available beam\n", j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(td_index == 0) {
|
if(num_td_occ == 1) {
|
||||||
AssertFatal(UL_tti_req->n_pdus < sizeof(UL_tti_req->pdus_list) / sizeof(UL_tti_req->pdus_list[0]),
|
|
||||||
"Invalid UL_tti_req->n_pdus %d\n", UL_tti_req->n_pdus);
|
|
||||||
|
|
||||||
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE;
|
|
||||||
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t);
|
|
||||||
nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].prach_pdu;
|
|
||||||
memset(prach_pdu,0,sizeof(nfapi_nr_prach_pdu_t));
|
|
||||||
UL_tti_req->n_pdus+=1;
|
|
||||||
|
|
||||||
// filling the prach fapi structure
|
// filling the prach fapi structure
|
||||||
prach_pdu->phys_cell_id = *scc->physCellId;
|
prach_pdu->phys_cell_id = *scc->physCellId;
|
||||||
prach_pdu->num_prach_ocas = N_t_slot;
|
|
||||||
gNB->num_scheduled_prach_rx += N_t_slot;
|
|
||||||
prach_pdu->prach_start_symbol = start_symb;
|
prach_pdu->prach_start_symbol = start_symb;
|
||||||
prach_pdu->num_ra = fdm_index;
|
prach_pdu->num_ra = fdm_index;
|
||||||
prach_pdu->num_cs = get_NCS(rach_ConfigGeneric->zeroCorrelationZoneConfig,
|
prach_pdu->num_cs = get_NCS(rach_ConfigGeneric->zeroCorrelationZoneConfig,
|
||||||
format0,
|
format0,
|
||||||
rach_ConfigCommon->restrictedSetConfig);
|
rach_ConfigCommon->restrictedSetConfig);
|
||||||
|
|
||||||
prach_pdu->beamforming.num_prgs = 0;
|
|
||||||
prach_pdu->beamforming.prg_size = 0;
|
|
||||||
prach_pdu->beamforming.dig_bf_interface = 1;
|
|
||||||
prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = beam_index;
|
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"Frame %d, Slot %d: Prach Occasion id = %u fdm index = %u start symbol = %u slot index = %u subframe index = %u \n",
|
|
||||||
frameP,
|
|
||||||
slotP,
|
|
||||||
prach_occasion_id,
|
|
||||||
prach_pdu->num_ra,
|
|
||||||
start_symb,
|
|
||||||
slot_index,
|
|
||||||
RA_sfn_index);
|
|
||||||
// SCF PRACH PDU format field does not consider A1/B1 etc. possibilities
|
// SCF PRACH PDU format field does not consider A1/B1 etc. possibilities
|
||||||
// We added 9 = A1/B1 10 = A2/B2 11 A3/B3
|
// We added 9 = A1/B1 10 = A2/B2 11 A3/B3
|
||||||
if (format1!=0xff) {
|
if (format1!=0xff) {
|
||||||
@@ -518,8 +504,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
AssertFatal(1==0,"Invalid PRACH format");
|
AssertFatal(1==0,"Invalid PRACH format");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (scc->uplinkConfigCommon->initialUplinkBWP->ext1
|
if (initialUplinkBWP->ext1 && initialUplinkBWP->ext1->msgA_ConfigCommon_r16) {
|
||||||
&& scc->uplinkConfigCommon->initialUplinkBWP->ext1->msgA_ConfigCommon_r16) {
|
|
||||||
if (gNB->UE_info.connected_ue_list[0] == NULL)
|
if (gNB->UE_info.connected_ue_list[0] == NULL)
|
||||||
schedule_nr_MsgA_pusch(scc->uplinkConfigCommon,
|
schedule_nr_MsgA_pusch(scc->uplinkConfigCommon,
|
||||||
gNB,
|
gNB,
|
||||||
@@ -531,7 +516,26 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
|||||||
*scc->physCellId);
|
*scc->physCellId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prach_pdu->num_prach_ocas = num_td_occ;
|
||||||
|
prach_pdu->beamforming.num_prgs = 0;
|
||||||
|
prach_pdu->beamforming.prg_size = 0;
|
||||||
|
prach_pdu->beamforming.dig_bf_interface = num_td_occ;
|
||||||
|
prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[num_td_occ - 1].beam_idx = beam_index;
|
||||||
|
|
||||||
|
LOG_D(NR_MAC,
|
||||||
|
"Frame %d, Slot %d: Prach Occasion id = %u fdm index = %u start symbol = %u slot index = %u subframe index = %u \n",
|
||||||
|
frameP,
|
||||||
|
slotP,
|
||||||
|
prach_occasion_id,
|
||||||
|
prach_pdu->num_ra,
|
||||||
|
prach_pdu->prach_start_symbol,
|
||||||
|
slot_index,
|
||||||
|
RA_sfn_index);
|
||||||
}
|
}
|
||||||
|
if (num_td_occ == 0) // no TD PRACH occasion -> no PRACH PDU
|
||||||
|
UL_tti_req->n_pdus -= 1;
|
||||||
|
else
|
||||||
|
gNB->num_scheduled_prach_rx += num_td_occ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// block resources in vrb_map_UL
|
// block resources in vrb_map_UL
|
||||||
|
|||||||
Reference in New Issue
Block a user