Fix REG to CCE mapping at UE
This commit is contained in:
@@ -81,12 +81,14 @@
|
|||||||
|
|
||||||
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
||||||
uint32_t *z,
|
uint32_t *z,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
|
||||||
uint8_t coreset_time_dur,
|
uint8_t coreset_time_dur,
|
||||||
uint32_t coreset_nbr_rb,
|
uint32_t coreset_nbr_rb,
|
||||||
uint8_t reg_bundle_size_L,
|
uint8_t reg_bundle_size_L,
|
||||||
uint8_t coreset_interleaver_size_R,
|
uint8_t coreset_interleaver_size_R,
|
||||||
uint8_t n_shift) {
|
uint8_t n_shift,
|
||||||
|
uint8_t number_of_candidates,
|
||||||
|
uint16_t *CCE,
|
||||||
|
uint8_t *L) {
|
||||||
/*
|
/*
|
||||||
* This function will do demapping and deinterleaving from llr containing demodulated symbols
|
* This function will do demapping and deinterleaving from llr containing demodulated symbols
|
||||||
* Demapping will regroup in REG and bundles
|
* Demapping will regroup in REG and bundles
|
||||||
@@ -122,35 +124,61 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
|||||||
| REG 0 (bundle 0) bundle 0 bundle 0
|
| REG 0 (bundle 0) bundle 0 bundle 0
|
||||||
|
|
||||||
*/
|
*/
|
||||||
int c=0,r=0;
|
int c = 0, r = 0;
|
||||||
uint16_t bundle_j=0, f_bundle_j=0,f_reg=0;
|
uint16_t bundle_j = 0, f_bundle_j = 0, f_reg = 0;
|
||||||
uint32_t coreset_C=0;
|
uint32_t coreset_C = 0;
|
||||||
uint16_t index_z, index_llr;
|
uint16_t index_z, index_llr;
|
||||||
int coreset_interleaved = 0;
|
int coreset_interleaved = 0;
|
||||||
|
|
||||||
if (reg_bundle_size_L!=0) { // interleaving will be done only if reg_bundle_size_L != 0
|
if (reg_bundle_size_L != 0) { // interleaving will be done only if reg_bundle_size_L != 0
|
||||||
coreset_interleaved=1;
|
coreset_interleaved = 1;
|
||||||
coreset_C = (uint32_t)((coreset_nbr_rb * coreset_time_dur)/ (coreset_interleaver_size_R*reg_bundle_size_L));
|
coreset_C = (uint32_t) ((coreset_nbr_rb * coreset_time_dur) / (coreset_interleaver_size_R * reg_bundle_size_L));
|
||||||
} else {
|
} else {
|
||||||
reg_bundle_size_L=6;
|
reg_bundle_size_L = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int reg=0; reg<((coreset_nbr_rb*coreset_time_dur)); reg++) {
|
|
||||||
if ((reg%reg_bundle_size_L) == 0) {
|
int f_bundle_j_list[MAX_DCI_CORESET] = {};
|
||||||
|
|
||||||
|
for (int reg = 0; reg < ((coreset_nbr_rb * coreset_time_dur)); reg++) {
|
||||||
|
if ((reg % reg_bundle_size_L) == 0) {
|
||||||
if (r == coreset_interleaver_size_R) {
|
if (r == coreset_interleaver_size_R) {
|
||||||
r=0;
|
r = 0;
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
|
||||||
bundle_j = (c*coreset_interleaver_size_R)+r;
|
bundle_j = (c * coreset_interleaver_size_R) + r;
|
||||||
f_bundle_j = ((r*coreset_C)+c+n_shift)%((coreset_nbr_rb*coreset_time_dur)/reg_bundle_size_L);
|
f_bundle_j = ((r * coreset_C) + c + n_shift) % ((coreset_nbr_rb * coreset_time_dur) / reg_bundle_size_L);
|
||||||
|
|
||||||
if (coreset_interleaved==0) f_bundle_j=bundle_j;
|
if (coreset_interleaved == 0) f_bundle_j = bundle_j;
|
||||||
|
|
||||||
|
f_bundle_j_list[reg / 6] = f_bundle_j;
|
||||||
|
|
||||||
LOG_DNL("[r=%d,c=%d] bundle_j(%d) interleaved at f_bundle_j(%d)\n",r,c,bundle_j,f_bundle_j);
|
|
||||||
}
|
}
|
||||||
|
if ((reg % reg_bundle_size_L) == 0) r++;
|
||||||
|
}
|
||||||
|
|
||||||
f_reg = (f_bundle_j*reg_bundle_size_L)+(reg%reg_bundle_size_L);
|
|
||||||
|
// Get cce_list indices by reg_idx in ascending order
|
||||||
|
int f_bundle_j_list_id = 0;
|
||||||
|
int f_bundle_j_list_ord[MAX_DCI_CORESET] = {};
|
||||||
|
for (int c_id = 0; c_id < number_of_candidates; c_id++ ) {
|
||||||
|
f_bundle_j_list_id = CCE[c_id];
|
||||||
|
for (int p = 0; p < MAX_DCI_CORESET; p++) {
|
||||||
|
for (int p2 = CCE[c_id]; p2 < CCE[c_id] + L[c_id]; p2++) {
|
||||||
|
if (f_bundle_j_list[p2] == p) {
|
||||||
|
f_bundle_j_list_ord[f_bundle_j_list_id] = p;
|
||||||
|
f_bundle_j_list_id++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(int reg=0; reg<((coreset_nbr_rb*coreset_time_dur)); reg++) {
|
||||||
|
|
||||||
|
f_reg = (f_bundle_j_list_ord[reg/6]*reg_bundle_size_L)+(reg%reg_bundle_size_L);
|
||||||
index_z = 9*reg;
|
index_z = 9*reg;
|
||||||
index_llr = 9*((uint16_t)floor(f_reg/coreset_time_dur)+((f_reg%coreset_time_dur)*(coreset_nbr_rb)));
|
index_llr = 9*((uint16_t)floor(f_reg/coreset_time_dur)+((f_reg%coreset_time_dur)*(coreset_nbr_rb)));
|
||||||
|
|
||||||
@@ -760,12 +788,14 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving()\n");
|
LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving()\n");
|
||||||
nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
|
nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
|
||||||
(uint32_t *) pdcch_vars->e_rx,
|
(uint32_t *) pdcch_vars->e_rx,
|
||||||
frame_parms,
|
|
||||||
rel15->coreset.duration,
|
rel15->coreset.duration,
|
||||||
n_rb,
|
n_rb,
|
||||||
rel15->coreset.RegBundleSize,
|
rel15->coreset.RegBundleSize,
|
||||||
rel15->coreset.InterleaverSize,
|
rel15->coreset.InterleaverSize,
|
||||||
rel15->coreset.ShiftIndex);
|
rel15->coreset.ShiftIndex,
|
||||||
|
rel15->number_of_candidates,
|
||||||
|
rel15->CCE,
|
||||||
|
rel15->L);
|
||||||
/*
|
/*
|
||||||
nr_pdcch_unscrambling(rel15->rnti,
|
nr_pdcch_unscrambling(rel15->rnti,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
|
|||||||
@@ -421,8 +421,8 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
// FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
|
// FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
|
||||||
mac->search_space_zero->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
|
mac->search_space_zero->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
|
||||||
mac->search_space_zero->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
|
mac->search_space_zero->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
|
||||||
mac->search_space_zero->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
|
mac->search_space_zero->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
|
||||||
mac->search_space_zero->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n1;
|
mac->search_space_zero->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
|
||||||
mac->search_space_zero->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
|
mac->search_space_zero->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
|
||||||
mac->search_space_zero->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
|
mac->search_space_zero->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
|
||||||
|
|
||||||
@@ -440,7 +440,9 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
|||||||
mac->coreset0->frequencyDomainResources.size = 6;
|
mac->coreset0->frequencyDomainResources.size = 6;
|
||||||
mac->coreset0->frequencyDomainResources.bits_unused = 3;
|
mac->coreset0->frequencyDomainResources.bits_unused = 3;
|
||||||
mac->coreset0->duration = 1;
|
mac->coreset0->duration = 1;
|
||||||
|
mac->coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
|
||||||
mac->coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*mac->coreset0->cce_REG_MappingType.choice.interleaved));
|
mac->coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*mac->coreset0->cce_REG_MappingType.choice.interleaved));
|
||||||
|
mac->coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
|
||||||
mac->coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
|
mac->coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
|
||||||
mac->coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = NULL;
|
mac->coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = NULL;
|
||||||
mac->coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
|
mac->coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
|
||||||
|
|||||||
@@ -55,23 +55,6 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
|
|||||||
|
|
||||||
LOG_D(MAC,"Filling search candidates for DCI\n");
|
LOG_D(MAC,"Filling search candidates for DCI\n");
|
||||||
|
|
||||||
if(ss->searchSpaceId == 0) {
|
|
||||||
// TODO: Update the maximum number of PDCCH candidates accordingly with Aggregation Level
|
|
||||||
rel15->number_of_candidates=1;
|
|
||||||
rel15->CCE[0]=0;
|
|
||||||
rel15->L[0]=6;
|
|
||||||
} else {
|
|
||||||
rel15->number_of_candidates=4;
|
|
||||||
rel15->CCE[0]=0;
|
|
||||||
rel15->L[0]=4;
|
|
||||||
rel15->CCE[1]=4;
|
|
||||||
rel15->L[1]=4;
|
|
||||||
rel15->CCE[2]=8;
|
|
||||||
rel15->L[2]=4;
|
|
||||||
rel15->CCE[3]=12;
|
|
||||||
rel15->L[3]=4;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t aggregation;
|
uint8_t aggregation;
|
||||||
find_aggregation_candidates(&aggregation,
|
find_aggregation_candidates(&aggregation,
|
||||||
&rel15->number_of_candidates,
|
&rel15->number_of_candidates,
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0) {
|
|||||||
// FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
|
// FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
|
||||||
ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
|
ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
|
||||||
ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
|
ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
|
||||||
ss0->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
|
ss0->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1;
|
||||||
ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n1;
|
ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
|
||||||
ss0->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
|
ss0->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
|
||||||
|
|
||||||
ss0->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
|
ss0->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
|
||||||
|
|||||||
@@ -1500,8 +1500,9 @@ int8_t nr_rrc_ue_decode_NR_SIB1_Message(module_id_t module_id, uint8_t gNB_index
|
|||||||
}
|
}
|
||||||
sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
|
sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1;
|
||||||
if (*(int64_t*)sib1 != 1) {
|
if (*(int64_t*)sib1 != 1) {
|
||||||
LOG_D(RRC, "SIB1 address: %lx\n", *(int64_t*)sib1);
|
LOG_I(RRC, "SIB1 decoded\n");
|
||||||
xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void*)sib1);
|
if( g_log->log_component[RRC].level >= OAILOG_DEBUG )
|
||||||
|
xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void*)sib1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LOG_E(PHY, "sib1 is starting by 8 times 0\n");
|
LOG_E(PHY, "sib1 is starting by 8 times 0\n");
|
||||||
|
|||||||
@@ -38,10 +38,10 @@ gNBs =
|
|||||||
# downlinkConfigCommon
|
# downlinkConfigCommon
|
||||||
#frequencyInfoDL
|
#frequencyInfoDL
|
||||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||||
absoluteFrequencySSB = 641272;
|
absoluteFrequencySSB = 641280;
|
||||||
dl_frequencyBand = 78;
|
dl_frequencyBand = 78;
|
||||||
# this is 3600 MHz
|
# this is 3600 MHz
|
||||||
dl_absoluteFrequencyPointA = 640000;
|
dl_absoluteFrequencyPointA = 640008;
|
||||||
#scs-SpecificCarrierList
|
#scs-SpecificCarrierList
|
||||||
dl_offstToCarrier = 0;
|
dl_offstToCarrier = 0;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
|
|||||||
Reference in New Issue
Block a user