Get cri_bitlen, ri_bitlen, pmi_bitlen and cqi_bitlen at UE
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "NR_SubcarrierSpacing.h"
|
#include "NR_SubcarrierSpacing.h"
|
||||||
|
#include "NR_CSI-ReportConfig.h"
|
||||||
#include "openair1/SCHED_NR_UE/harq_nr.h"
|
#include "openair1/SCHED_NR_UE/harq_nr.h"
|
||||||
|
|
||||||
#define NR_SHORT_BSR_TABLE_SIZE 32
|
#define NR_SHORT_BSR_TABLE_SIZE 32
|
||||||
@@ -63,6 +64,7 @@
|
|||||||
#define CCCH_PAYLOAD_SIZE_MAX 512
|
#define CCCH_PAYLOAD_SIZE_MAX 512
|
||||||
#define RAR_PAYLOAD_SIZE_MAX 128
|
#define RAR_PAYLOAD_SIZE_MAX 128
|
||||||
#define MAX_BWP_SIZE 275
|
#define MAX_BWP_SIZE 275
|
||||||
|
#define MAX_CSI_REPORTCONFIG 48
|
||||||
|
|
||||||
typedef enum frequency_range_e {
|
typedef enum frequency_range_e {
|
||||||
FR1 = 0,
|
FR1 = 0,
|
||||||
@@ -496,5 +498,34 @@ typedef struct Type0_PDCCH_CSS_config_s {
|
|||||||
bool active;
|
bool active;
|
||||||
} NR_Type0_PDCCH_CSS_config_t;
|
} NR_Type0_PDCCH_CSS_config_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t nb_ssbri_cri;
|
||||||
|
uint8_t cri_ssbri_bitlen;
|
||||||
|
uint8_t rsrp_bitlen;
|
||||||
|
uint8_t diff_rsrp_bitlen;
|
||||||
|
} L1_RSRP_bitlen_t;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
uint8_t ri_restriction;
|
||||||
|
uint8_t cri_bitlen;
|
||||||
|
uint8_t ri_bitlen;
|
||||||
|
uint8_t li_bitlen[8];
|
||||||
|
uint8_t pmi_x1_bitlen[8];
|
||||||
|
uint8_t pmi_x2_bitlen[8];
|
||||||
|
uint8_t cqi_bitlen[8];
|
||||||
|
} CSI_Meas_bitlen_t;
|
||||||
|
|
||||||
|
typedef struct nr_csi_report {
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
||||||
|
long periodicity;
|
||||||
|
uint16_t offset;
|
||||||
|
long ** SSB_Index_list;
|
||||||
|
long ** CSI_Index_list;
|
||||||
|
// uint8_t nb_of_nzp_csi_report;
|
||||||
|
uint8_t nb_of_csi_ssb_report;
|
||||||
|
L1_RSRP_bitlen_t CSI_report_bitlen;
|
||||||
|
CSI_Meas_bitlen_t csi_meas_bitlen;
|
||||||
|
} nr_csi_report_t;
|
||||||
|
|
||||||
#endif /*__LAYER2_MAC_H__ */
|
#endif /*__LAYER2_MAC_H__ */
|
||||||
|
|
||||||
|
|||||||
@@ -4161,3 +4161,484 @@ bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
|
|||||||
}
|
}
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Calculating number of bits set
|
||||||
|
uint8_t number_of_bits_set(uint8_t buf) {
|
||||||
|
uint8_t nb_of_bits_set = 0;
|
||||||
|
uint8_t mask = 0xff;
|
||||||
|
uint8_t index = 0;
|
||||||
|
|
||||||
|
for (index=7; (buf & mask) && (index>=0) ; index--){
|
||||||
|
if (buf & (1<<index))
|
||||||
|
nb_of_bits_set++;
|
||||||
|
|
||||||
|
mask>>=1;
|
||||||
|
}
|
||||||
|
return nb_of_bits_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t nb_resources,
|
||||||
|
nr_csi_report_t *csi_report) {
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
|
||||||
|
if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
|
||||||
|
csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
|
||||||
|
else
|
||||||
|
/*! From Spec 38.331
|
||||||
|
* nrofReportedRS
|
||||||
|
* The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
|
||||||
|
* capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
|
||||||
|
* When the field is absent the UE applies the value 1
|
||||||
|
*/
|
||||||
|
csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
|
||||||
|
} else
|
||||||
|
csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
|
||||||
|
|
||||||
|
if (nb_resources) {
|
||||||
|
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources));
|
||||||
|
csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
||||||
|
csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
||||||
|
} else {
|
||||||
|
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
|
||||||
|
csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
|
||||||
|
csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
nr_csi_report_t *csi_report) {
|
||||||
|
|
||||||
|
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
||||||
|
uint8_t nb_allowed_ri, ri_bitlen;
|
||||||
|
uint8_t ri_restriction = 0;
|
||||||
|
|
||||||
|
if (codebookConfig == NULL) {
|
||||||
|
csi_report->csi_meas_bitlen.ri_bitlen=0;
|
||||||
|
return ri_restriction;
|
||||||
|
}
|
||||||
|
|
||||||
|
// codebook type1 single panel
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
|
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
|
||||||
|
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
|
||||||
|
ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
|
||||||
|
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
||||||
|
}
|
||||||
|
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){
|
||||||
|
if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present ==
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
|
||||||
|
// 4 ports
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
|
||||||
|
ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
|
||||||
|
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// more than 4 ports
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
|
||||||
|
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ri_restriction;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Other configurations not yet implemented\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report) {
|
||||||
|
|
||||||
|
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
||||||
|
for(int i=0; i<8; i++) {
|
||||||
|
if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
|
||||||
|
csi_report->csi_meas_bitlen.li_bitlen[i]=0;
|
||||||
|
else {
|
||||||
|
// codebook type1 single panel
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present)
|
||||||
|
csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2;
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Other configurations not yet implemented\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
|
||||||
|
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) {
|
||||||
|
|
||||||
|
// Table 5.2.2.2.1-2 in 38.214 for supported configurations
|
||||||
|
switch(morethantwo->n1_n2.present){
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 2;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 2;
|
||||||
|
*n2 = 2;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 4;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 3;
|
||||||
|
*n2 = 2;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 6;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 4;
|
||||||
|
*n2 = 2;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 8;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 4;
|
||||||
|
*n2 = 3;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 4;
|
||||||
|
*n2 = 2;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 12;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 4;
|
||||||
|
*n2 = 4;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 8;
|
||||||
|
*n2 = 2;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 4;
|
||||||
|
break;
|
||||||
|
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction):
|
||||||
|
*n1 = 16;
|
||||||
|
*n2 = 1;
|
||||||
|
*o1 = 4;
|
||||||
|
*o2 = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
|
||||||
|
int *x1, int *x2, int rank, int codebook_mode) {
|
||||||
|
|
||||||
|
// Table 6.3.1.1.2-1 in 38.212
|
||||||
|
switch(rank){
|
||||||
|
case 1:
|
||||||
|
if(n2>1) {
|
||||||
|
if (codebook_mode == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
|
||||||
|
*x2 = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (codebook_mode == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1/2));
|
||||||
|
*x2 = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if(n1*n2 == 2) {
|
||||||
|
if (codebook_mode == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1/2));
|
||||||
|
*x2 = 3;
|
||||||
|
}
|
||||||
|
*x1 += 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(n2>1) {
|
||||||
|
if (codebook_mode == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 3;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
|
||||||
|
*x2 = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (codebook_mode == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1/2));
|
||||||
|
*x2 = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*x1 += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
if(n1*n2 == 2) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(n1*n2 >= 8) {
|
||||||
|
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2;
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2;
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
if(n1 == 4 && n2 == 1) {
|
||||||
|
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(n1 > 2 && n2 == 2) {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
||||||
|
*x2 = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report) {
|
||||||
|
|
||||||
|
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
||||||
|
for(int i=0; i<8; i++) {
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0;
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0;
|
||||||
|
if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
|
||||||
|
return;
|
||||||
|
else {
|
||||||
|
if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) {
|
||||||
|
if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
|
||||||
|
if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present ==
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
|
||||||
|
if (i==0)
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2;
|
||||||
|
if (i==1)
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1;
|
||||||
|
}
|
||||||
|
else { // more than two
|
||||||
|
int n1,n2,o1,o2,x1,x2;
|
||||||
|
get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo);
|
||||||
|
get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode);
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1;
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report) {
|
||||||
|
|
||||||
|
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
||||||
|
struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration;
|
||||||
|
|
||||||
|
if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) {
|
||||||
|
for(int i=0; i<8; i++) {
|
||||||
|
if ((ri_restriction>>i)&0x01) {
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4;
|
||||||
|
if(codebookConfig != NULL) {
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
|
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
|
||||||
|
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) {
|
||||||
|
if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present >
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
|
||||||
|
// more than 4 antenna ports
|
||||||
|
if (i > 4)
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Sub-band CQI reporting not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
//!TODO : same function can be written to handle csi_resources
|
||||||
|
void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template) {
|
||||||
|
uint8_t csi_report_id = 0;
|
||||||
|
uint8_t nb_resources = 0;
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
||||||
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
|
||||||
|
struct NR_CSI_ResourceConfig *csi_resourceconfig;
|
||||||
|
|
||||||
|
// for each CSI measurement report configuration (list of CSI-ReportConfig)
|
||||||
|
LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count);
|
||||||
|
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
||||||
|
struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
|
||||||
|
// MAC structure for CSI measurement reports (per UE and per report)
|
||||||
|
nr_csi_report_t *csi_report = &csi_report_template[csi_report_id];
|
||||||
|
// csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration
|
||||||
|
// (either CSI-RS or SSB)
|
||||||
|
csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
|
||||||
|
// looking for CSI-ResourceConfig
|
||||||
|
int found_resource = 0;
|
||||||
|
int csi_resourceidx = 0;
|
||||||
|
while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) {
|
||||||
|
csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
|
||||||
|
if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId)
|
||||||
|
found_resource = 1;
|
||||||
|
csi_resourceidx++;
|
||||||
|
}
|
||||||
|
AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n",
|
||||||
|
csi_ResourceConfigId);
|
||||||
|
|
||||||
|
long resourceType = csi_resourceconfig->resourceType;
|
||||||
|
|
||||||
|
reportQuantity_type = csi_reportconfig->reportQuantity.present;
|
||||||
|
csi_report->reportQuantity_type = reportQuantity_type;
|
||||||
|
|
||||||
|
// setting the CSI or SSB index list
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
|
||||||
|
for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) {
|
||||||
|
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId ==
|
||||||
|
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
|
||||||
|
//We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
|
||||||
|
nb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count;
|
||||||
|
csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array;
|
||||||
|
csi_report->CSI_Index_list = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) {
|
||||||
|
AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL,
|
||||||
|
"Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n");
|
||||||
|
for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
|
||||||
|
if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
|
||||||
|
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
|
||||||
|
//For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
|
||||||
|
nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count;
|
||||||
|
csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array;
|
||||||
|
csi_report->SSB_Index_list = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else AssertFatal(1==0,"Only periodic resource configuration currently supported\n");
|
||||||
|
}
|
||||||
|
LOG_D(NR_MAC,"nb_resources %d\n",nb_resources);
|
||||||
|
// computation of bit length depending on the report type
|
||||||
|
switch(reportQuantity_type){
|
||||||
|
case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP):
|
||||||
|
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
|
||||||
|
break;
|
||||||
|
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP):
|
||||||
|
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
|
||||||
|
break;
|
||||||
|
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI):
|
||||||
|
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
||||||
|
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
||||||
|
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
break;
|
||||||
|
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI):
|
||||||
|
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
||||||
|
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
||||||
|
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
break;
|
||||||
|
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI):
|
||||||
|
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
||||||
|
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
||||||
|
compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Not yet supported CSI report quantity type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -102,7 +102,7 @@ uint8_t get_pusch_mcs_table(long *mcs_Table,
|
|||||||
uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
|
uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
|
||||||
uint8_t nb_preambles,
|
uint8_t nb_preambles,
|
||||||
uint8_t unpaired,
|
uint8_t unpaired,
|
||||||
frequency_range_t);
|
frequency_range_t);
|
||||||
|
|
||||||
int ul_ant_bits(NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig,long transformPrecoder);
|
int ul_ant_bits(NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig,long transformPrecoder);
|
||||||
|
|
||||||
@@ -203,4 +203,34 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP,
|
|||||||
const frame_t frameP,
|
const frame_t frameP,
|
||||||
const sub_frame_t subframeP,
|
const sub_frame_t subframeP,
|
||||||
const rnti_t rntiP);
|
const rnti_t rntiP);
|
||||||
|
|
||||||
|
uint8_t number_of_bits_set(uint8_t buf);
|
||||||
|
|
||||||
|
void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t nb_resources,
|
||||||
|
nr_csi_report_t *csi_report);
|
||||||
|
|
||||||
|
uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
nr_csi_report_t *csi_report);
|
||||||
|
|
||||||
|
void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report);
|
||||||
|
|
||||||
|
void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
|
||||||
|
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo);
|
||||||
|
|
||||||
|
void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
|
||||||
|
int *x1, int *x2, int rank, int codebook_mode);
|
||||||
|
|
||||||
|
void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report);
|
||||||
|
|
||||||
|
void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
uint8_t ri_restriction,
|
||||||
|
nr_csi_report_t *csi_report);
|
||||||
|
|
||||||
|
void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -399,6 +399,8 @@ typedef struct {
|
|||||||
/// measured SSB RSRP in dBm
|
/// measured SSB RSRP in dBm
|
||||||
short ssb_rsrp_dBm;
|
short ssb_rsrp_dBm;
|
||||||
|
|
||||||
|
nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
|
||||||
|
|
||||||
/// measurements from CSI-RS
|
/// measurements from CSI-RS
|
||||||
fapi_nr_csirs_measurements_t csirs_measurements;
|
fapi_nr_csirs_measurements_t csirs_measurements;
|
||||||
|
|
||||||
|
|||||||
@@ -213,6 +213,12 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
||||||
NR_CSI_MeasConfig_t *csi_MeasConfig);
|
NR_CSI_MeasConfig_t *csi_MeasConfig);
|
||||||
|
|
||||||
|
uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
|
||||||
|
PUCCH_sched_t *pucch,
|
||||||
|
struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig);
|
||||||
|
|
||||||
uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
|
uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
|
||||||
PUCCH_sched_t *pucch,
|
PUCCH_sched_t *pucch,
|
||||||
int csi_report_id,
|
int csi_report_id,
|
||||||
|
|||||||
@@ -2486,8 +2486,10 @@ uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
|
case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
|
||||||
n_csi_bits = get_ssb_rsrp_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
|
n_csi_bits = get_ssb_rsrp_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
|
||||||
break;
|
break;
|
||||||
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
|
|
||||||
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI:
|
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI:
|
||||||
|
n_csi_bits = get_csirs_RI_PMI_CQI_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
|
||||||
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1:
|
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1:
|
||||||
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI:
|
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI:
|
||||||
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
|
case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
|
||||||
@@ -2580,6 +2582,46 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
return bits;
|
return bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
|
||||||
|
PUCCH_sched_t *pucch,
|
||||||
|
struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig) {
|
||||||
|
|
||||||
|
int bits = 0;
|
||||||
|
uint32_t temp_payload = 0;
|
||||||
|
|
||||||
|
for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
|
||||||
|
|
||||||
|
struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
|
||||||
|
if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) {
|
||||||
|
|
||||||
|
for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
|
||||||
|
if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
|
||||||
|
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
|
||||||
|
|
||||||
|
nr_csi_report_t *csi_report = &mac->csi_report_template[csi_reportconfig->reportConfigId];
|
||||||
|
compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template);
|
||||||
|
|
||||||
|
int cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen;
|
||||||
|
int ri_bitlen = csi_report->csi_meas_bitlen.ri_bitlen;
|
||||||
|
int pmi_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[*mac->csirs_measurements.rank_indicator] +
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen[*mac->csirs_measurements.rank_indicator];
|
||||||
|
int cqi_bitlen = csi_report->csi_meas_bitlen.cqi_bitlen[*mac->csirs_measurements.rank_indicator];
|
||||||
|
|
||||||
|
LOG_I(NR_MAC, "cri_bitlen = %d\n", cri_bitlen);
|
||||||
|
LOG_I(NR_MAC, "ri_bitlen = %d\n", ri_bitlen);
|
||||||
|
LOG_I(NR_MAC, "pmi_bitlen = %d\n", pmi_bitlen);
|
||||||
|
LOG_I(NR_MAC, "cqi_bitlen = %d\n", cqi_bitlen);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pucch->csi_part1_payload = temp_payload;
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
// returns index from RSRP
|
// returns index from RSRP
|
||||||
// according to Table 10.1.6.1-1 in 38.133
|
// according to Table 10.1.6.1-1 in 38.133
|
||||||
|
|||||||
@@ -687,7 +687,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
|||||||
CellGroup->spCellConfig->spCellConfigDedicated &&
|
CellGroup->spCellConfig->spCellConfigDedicated &&
|
||||||
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
|
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
|
||||||
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
|
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
|
||||||
compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, Mod_idP);
|
compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info->csi_report_template[UE_id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2296,7 +2296,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
|
|||||||
CellGroup->spCellConfig->spCellConfigDedicated &&
|
CellGroup->spCellConfig->spCellConfigDedicated &&
|
||||||
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
|
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig &&
|
||||||
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
|
CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
|
||||||
compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
|
compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info->csi_report_template[UE_id]);
|
||||||
}
|
}
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
|
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
|
||||||
|
|||||||
@@ -170,491 +170,6 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Calculating number of bits set
|
|
||||||
uint8_t number_of_bits_set (uint8_t buf){
|
|
||||||
uint8_t nb_of_bits_set = 0;
|
|
||||||
uint8_t mask = 0xff;
|
|
||||||
uint8_t index = 0;
|
|
||||||
|
|
||||||
for (index=7; (buf & mask) && (index>=0) ; index--){
|
|
||||||
if (buf & (1<<index))
|
|
||||||
nb_of_bits_set++;
|
|
||||||
|
|
||||||
mask>>=1;
|
|
||||||
}
|
|
||||||
return nb_of_bits_set;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
|
||||||
uint8_t nb_resources,
|
|
||||||
nr_csi_report_t *csi_report) {
|
|
||||||
|
|
||||||
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
|
|
||||||
if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
|
|
||||||
csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
|
|
||||||
else
|
|
||||||
/*! From Spec 38.331
|
|
||||||
* nrofReportedRS
|
|
||||||
* The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
|
|
||||||
* capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
|
|
||||||
* When the field is absent the UE applies the value 1
|
|
||||||
*/
|
|
||||||
csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
|
|
||||||
} else
|
|
||||||
csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
|
|
||||||
|
|
||||||
if (nb_resources) {
|
|
||||||
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources));
|
|
||||||
csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
|
||||||
csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
|
||||||
} else {
|
|
||||||
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
|
|
||||||
csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
|
|
||||||
csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
|
||||||
nr_csi_report_t *csi_report){
|
|
||||||
|
|
||||||
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
|
||||||
uint8_t nb_allowed_ri, ri_bitlen;
|
|
||||||
uint8_t ri_restriction = 0;
|
|
||||||
|
|
||||||
if (codebookConfig == NULL) {
|
|
||||||
csi_report->csi_meas_bitlen.ri_bitlen=0;
|
|
||||||
return ri_restriction;
|
|
||||||
}
|
|
||||||
|
|
||||||
// codebook type1 single panel
|
|
||||||
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){
|
|
||||||
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
|
|
||||||
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){
|
|
||||||
|
|
||||||
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
|
||||||
|
|
||||||
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
|
||||||
ri_bitlen = ceil(log2(nb_allowed_ri));
|
|
||||||
|
|
||||||
ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
|
|
||||||
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
|
||||||
}
|
|
||||||
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){
|
|
||||||
if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present ==
|
|
||||||
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
|
|
||||||
// 4 ports
|
|
||||||
|
|
||||||
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
|
||||||
|
|
||||||
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
|
||||||
ri_bitlen = ceil(log2(nb_allowed_ri));
|
|
||||||
|
|
||||||
ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
|
|
||||||
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// more than 4 ports
|
|
||||||
|
|
||||||
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
|
||||||
|
|
||||||
nb_allowed_ri = number_of_bits_set(ri_restriction);
|
|
||||||
ri_bitlen = ceil(log2(nb_allowed_ri));
|
|
||||||
|
|
||||||
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ri_restriction;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AssertFatal(1==0,"Other configurations not yet implemented\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
|
||||||
uint8_t ri_restriction,
|
|
||||||
nr_csi_report_t *csi_report){
|
|
||||||
|
|
||||||
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
|
||||||
for(int i=0; i<8; i++) {
|
|
||||||
if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
|
|
||||||
csi_report->csi_meas_bitlen.li_bitlen[i]=0;
|
|
||||||
else {
|
|
||||||
// codebook type1 single panel
|
|
||||||
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present)
|
|
||||||
csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2;
|
|
||||||
else
|
|
||||||
AssertFatal(1==0,"Other configurations not yet implemented\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2,
|
|
||||||
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) {
|
|
||||||
|
|
||||||
// Table 5.2.2.2.1-2 in 38.214 for supported configurations
|
|
||||||
switch(morethantwo->n1_n2.present){
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 2;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 2;
|
|
||||||
*n2 = 2;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 4;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 3;
|
|
||||||
*n2 = 2;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 6;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 4;
|
|
||||||
*n2 = 2;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 8;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 4;
|
|
||||||
*n2 = 3;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 4;
|
|
||||||
*n2 = 2;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 12;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 4;
|
|
||||||
*n2 = 4;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 8;
|
|
||||||
*n2 = 2;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 4;
|
|
||||||
break;
|
|
||||||
case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction):
|
|
||||||
*n1 = 16;
|
|
||||||
*n2 = 1;
|
|
||||||
*o1 = 4;
|
|
||||||
*o2 = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2,
|
|
||||||
int *x1, int *x2, int rank, int codebook_mode) {
|
|
||||||
|
|
||||||
// Table 6.3.1.1.2-1 in 38.212
|
|
||||||
switch(rank){
|
|
||||||
case 1:
|
|
||||||
if(n2>1) {
|
|
||||||
if (codebook_mode == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
|
|
||||||
*x2 = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (codebook_mode == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1/2));
|
|
||||||
*x2 = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if(n1*n2 == 2) {
|
|
||||||
if (codebook_mode == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1/2));
|
|
||||||
*x2 = 3;
|
|
||||||
}
|
|
||||||
*x1 += 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(n2>1) {
|
|
||||||
if (codebook_mode == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 3;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2));
|
|
||||||
*x2 = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (codebook_mode == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1/2));
|
|
||||||
*x2 = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*x1 += 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
if(n1*n2 == 2) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(n1*n2 >= 8) {
|
|
||||||
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2;
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2;
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
if(n1 == 4 && n2 == 1) {
|
|
||||||
*x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(n1 > 2 && n2 == 2) {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2));
|
|
||||||
*x2 = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
|
||||||
uint8_t ri_restriction,
|
|
||||||
nr_csi_report_t *csi_report){
|
|
||||||
|
|
||||||
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
|
||||||
for(int i=0; i<8; i++) {
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0;
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0;
|
|
||||||
if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0)
|
|
||||||
return;
|
|
||||||
else {
|
|
||||||
if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) {
|
|
||||||
if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
|
|
||||||
if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present ==
|
|
||||||
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
|
|
||||||
if (i==0)
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2;
|
|
||||||
if (i==1)
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1;
|
|
||||||
}
|
|
||||||
else { // more than two
|
|
||||||
int n1,n2,o1,o2,x1,x2;
|
|
||||||
get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo);
|
|
||||||
get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode);
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1;
|
|
||||||
csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
|
||||||
uint8_t ri_restriction,
|
|
||||||
nr_csi_report_t *csi_report){
|
|
||||||
|
|
||||||
struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig;
|
|
||||||
struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration;
|
|
||||||
|
|
||||||
if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) {
|
|
||||||
for(int i=0; i<8; i++) {
|
|
||||||
if ((ri_restriction>>i)&0x01) {
|
|
||||||
csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4;
|
|
||||||
if(codebookConfig != NULL) {
|
|
||||||
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){
|
|
||||||
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
|
|
||||||
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) {
|
|
||||||
if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present >
|
|
||||||
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) {
|
|
||||||
// more than 4 antenna ports
|
|
||||||
if (i > 4)
|
|
||||||
csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AssertFatal(1==0,"Sub-band CQI reporting not yet supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
//!TODO : same function can be written to handle csi_resources
|
|
||||||
void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){
|
|
||||||
uint8_t csi_report_id = 0;
|
|
||||||
uint8_t nb_resources = 0;
|
|
||||||
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
|
||||||
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
|
|
||||||
struct NR_CSI_ResourceConfig *csi_resourceconfig;
|
|
||||||
|
|
||||||
// for each CSI measurement report configuration (list of CSI-ReportConfig)
|
|
||||||
LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count);
|
|
||||||
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
|
||||||
struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
|
|
||||||
// MAC structure for CSI measurement reports (per UE and per report)
|
|
||||||
nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
|
|
||||||
// csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration
|
|
||||||
// (either CSI-RS or SSB)
|
|
||||||
csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
|
|
||||||
// looking for CSI-ResourceConfig
|
|
||||||
int found_resource = 0;
|
|
||||||
int csi_resourceidx = 0;
|
|
||||||
while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) {
|
|
||||||
csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
|
|
||||||
if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId)
|
|
||||||
found_resource = 1;
|
|
||||||
csi_resourceidx++;
|
|
||||||
}
|
|
||||||
AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n",
|
|
||||||
csi_ResourceConfigId);
|
|
||||||
|
|
||||||
long resourceType = csi_resourceconfig->resourceType;
|
|
||||||
|
|
||||||
reportQuantity_type = csi_reportconfig->reportQuantity.present;
|
|
||||||
csi_report->reportQuantity_type = reportQuantity_type;
|
|
||||||
|
|
||||||
// setting the CSI or SSB index list
|
|
||||||
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
|
|
||||||
for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) {
|
|
||||||
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId ==
|
|
||||||
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
|
|
||||||
//We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
|
|
||||||
nb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count;
|
|
||||||
csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array;
|
|
||||||
csi_report->CSI_Index_list = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) {
|
|
||||||
AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL,
|
|
||||||
"Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n");
|
|
||||||
for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) {
|
|
||||||
if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId ==
|
|
||||||
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
|
|
||||||
//For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
|
|
||||||
nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count;
|
|
||||||
csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array;
|
|
||||||
csi_report->SSB_Index_list = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else AssertFatal(1==0,"Only periodic resource configuration currently supported\n");
|
|
||||||
}
|
|
||||||
LOG_D(NR_MAC,"nb_resources %d\n",nb_resources);
|
|
||||||
// computation of bit length depending on the report type
|
|
||||||
switch(reportQuantity_type){
|
|
||||||
case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP):
|
|
||||||
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
|
|
||||||
break;
|
|
||||||
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP):
|
|
||||||
compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report);
|
|
||||||
break;
|
|
||||||
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI):
|
|
||||||
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
|
||||||
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
|
||||||
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
break;
|
|
||||||
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI):
|
|
||||||
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
|
||||||
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
|
||||||
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
break;
|
|
||||||
case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI):
|
|
||||||
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources));
|
|
||||||
csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report);
|
|
||||||
compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1==0,"Not yet supported CSI report quantity type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t nr_get_csi_bitlen(int Mod_idP,
|
uint16_t nr_get_csi_bitlen(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
uint8_t csi_report_id) {
|
uint8_t csi_report_id) {
|
||||||
|
|||||||
@@ -416,8 +416,6 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
|
|||||||
|
|
||||||
int nr_get_default_pucch_res(int pucch_ResourceCommon);
|
int nr_get_default_pucch_res(int pucch_ResourceCommon);
|
||||||
|
|
||||||
void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
|
|
||||||
|
|
||||||
int get_dlscs(nfapi_nr_config_request_t *cfg);
|
int get_dlscs(nfapi_nr_config_request_t *cfg);
|
||||||
|
|
||||||
int get_ulscs(nfapi_nr_config_request_t *cfg);
|
int get_ulscs(nfapi_nr_config_request_t *cfg);
|
||||||
|
|||||||
@@ -502,35 +502,6 @@ struct CSI_Report {
|
|||||||
|
|
||||||
#define MAX_SR_BITLEN 8
|
#define MAX_SR_BITLEN 8
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t nb_ssbri_cri;
|
|
||||||
uint8_t cri_ssbri_bitlen;
|
|
||||||
uint8_t rsrp_bitlen;
|
|
||||||
uint8_t diff_rsrp_bitlen;
|
|
||||||
}L1_RSRP_bitlen_t;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
uint8_t ri_restriction;
|
|
||||||
uint8_t cri_bitlen;
|
|
||||||
uint8_t ri_bitlen;
|
|
||||||
uint8_t li_bitlen[8];
|
|
||||||
uint8_t pmi_x1_bitlen[8];
|
|
||||||
uint8_t pmi_x2_bitlen[8];
|
|
||||||
uint8_t cqi_bitlen[8];
|
|
||||||
} CSI_Meas_bitlen_t;
|
|
||||||
|
|
||||||
typedef struct nr_csi_report {
|
|
||||||
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
|
||||||
long periodicity;
|
|
||||||
uint16_t offset;
|
|
||||||
long ** SSB_Index_list;
|
|
||||||
long ** CSI_Index_list;
|
|
||||||
// uint8_t nb_of_nzp_csi_report;
|
|
||||||
uint8_t nb_of_csi_ssb_report;
|
|
||||||
L1_RSRP_bitlen_t CSI_report_bitlen;
|
|
||||||
CSI_Meas_bitlen_t csi_meas_bitlen;
|
|
||||||
} nr_csi_report_t;
|
|
||||||
|
|
||||||
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
|
/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
|
||||||
the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
|
the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
|
||||||
From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
|
From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
|
||||||
@@ -679,7 +650,6 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
||||||
#define MAX_CSI_REPORTCONFIG 48
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// scheduling control info
|
/// scheduling control info
|
||||||
nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
|
nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
|
||||||
|
|||||||
Reference in New Issue
Block a user