Merge remote-tracking branch 'origin/NR_MAC_TCI_UCI_GlobalEdge' into integration_2021_wk11
This commit is contained in:
@@ -1604,7 +1604,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
|
re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
|
||||||
// estimate CQI for MAC (from antenna port 0 only)
|
// estimate CQI for MAC (from antenna port 0 only)
|
||||||
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
|
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
|
||||||
int cqi;
|
int cqi,bit_left;
|
||||||
if (SNRtimes10 < -640) cqi=0;
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
else if (SNRtimes10 > 635) cqi=255;
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
else cqi=(640+SNRtimes10)/5;
|
else cqi=(640+SNRtimes10)/5;
|
||||||
@@ -1628,7 +1628,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
|
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
|
||||||
decodedPayload[0]>>=8;
|
decodedPayload[0]>>=8;
|
||||||
}
|
}
|
||||||
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_harq&7))-1);
|
bit_left = pucch_pdu->bit_len_harq-((harq_bytes-1)<<3);
|
||||||
|
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<<bit_left)-1);
|
||||||
decodedPayload[0] >>= pucch_pdu->bit_len_harq;
|
decodedPayload[0] >>= pucch_pdu->bit_len_harq;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1642,6 +1643,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
// csi
|
// csi
|
||||||
if (pucch_pdu->bit_len_csi_part1>0) {
|
if (pucch_pdu->bit_len_csi_part1>0) {
|
||||||
uci_pdu->pduBitmap|=4;
|
uci_pdu->pduBitmap|=4;
|
||||||
|
uci_pdu->csi_part1.csi_part1_bit_len=pucch_pdu->bit_len_csi_part1;
|
||||||
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
|
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
|
||||||
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
||||||
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
|
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
|
||||||
@@ -1651,7 +1653,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
|
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
|
||||||
decodedPayload[0]>>=8;
|
decodedPayload[0]>>=8;
|
||||||
}
|
}
|
||||||
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
|
bit_left = pucch_pdu->bit_len_csi_part1-((csi_part1_bytes-1)<<3);
|
||||||
|
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<bit_left)-1);
|
||||||
decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;
|
decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1402,19 +1402,17 @@ int get_nr_prach_info_from_index(uint8_t index,
|
|||||||
if (table_6_3_3_2_3_prachConfig_Index[index][1] != -1)
|
if (table_6_3_3_2_3_prachConfig_Index[index][1] != -1)
|
||||||
format2 = (uint8_t) table_6_3_3_2_3_prachConfig_Index[index][1];
|
format2 = (uint8_t) table_6_3_3_2_3_prachConfig_Index[index][1];
|
||||||
*format = ((uint8_t) table_6_3_3_2_3_prachConfig_Index[index][0]) | (format2<<8);
|
*format = ((uint8_t) table_6_3_3_2_3_prachConfig_Index[index][0]) | (format2<<8);
|
||||||
LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n",
|
LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n", frame,
|
||||||
frame,
|
slot,
|
||||||
slot,
|
index, table_6_3_3_2_3_prachConfig_Index[index][6],
|
||||||
index,
|
pointa,
|
||||||
table_6_3_3_2_3_prachConfig_Index[index][6],
|
mu,
|
||||||
pointa,
|
unpaired,
|
||||||
mu,
|
*start_symbol,
|
||||||
unpaired,
|
*N_t_slot,
|
||||||
*start_symbol,
|
*N_dur,
|
||||||
*N_t_slot,
|
*N_RA_slot,
|
||||||
*N_dur,
|
*RA_sfn_index);
|
||||||
*N_RA_slot,
|
|
||||||
*RA_sfn_index);
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ int get_nr_prach_info_from_index(uint8_t index,
|
|||||||
uint8_t *N_dur,
|
uint8_t *N_dur,
|
||||||
uint16_t *RA_sfn_index,
|
uint16_t *RA_sfn_index,
|
||||||
uint8_t *N_RA_slot,
|
uint8_t *N_RA_slot,
|
||||||
uint8_t *config_period);
|
uint8_t *config_period);
|
||||||
|
|
||||||
int get_nr_prach_occasion_info_from_index(uint8_t index,
|
int get_nr_prach_occasion_info_from_index(uint8_t index,
|
||||||
uint32_t pointa,
|
uint32_t pointa,
|
||||||
|
|||||||
@@ -310,8 +310,6 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern uint16_t sl_ahead;
|
extern uint16_t sl_ahead;
|
||||||
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
||||||
int ssb_SubcarrierOffset,
|
int ssb_SubcarrierOffset,
|
||||||
|
|||||||
@@ -66,11 +66,15 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
|
|||||||
int num = 1;
|
int num = 1;
|
||||||
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
|
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
|
||||||
LOG_I(MAC, "UE ID %d RNTI %04x (%d/%d)\n", UE_id, UE_info->rnti[UE_id], num++, UE_info->num_UEs);
|
LOG_I(MAC, "UE ID %d RNTI %04x (%d/%d)\n", UE_id, UE_info->rnti[UE_id], num++, UE_info->num_UEs);
|
||||||
const NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
|
NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
|
||||||
LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d\n",
|
const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
|
||||||
|
LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d, average RSRP %d (%d meas)\n",
|
||||||
UE_id,
|
UE_id,
|
||||||
stats->dlsch_rounds[0], stats->dlsch_rounds[1],
|
stats->dlsch_rounds[0], stats->dlsch_rounds[1],
|
||||||
stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors);
|
stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors,
|
||||||
|
avg_rsrp, stats->num_rsrp_meas);
|
||||||
|
stats->num_rsrp_meas = 0;
|
||||||
|
stats->cumul_rsrp = 0 ;
|
||||||
LOG_I(MAC, "UE %d: dlsch_total_bytes %d\n", UE_id, stats->dlsch_total_bytes);
|
LOG_I(MAC, "UE %d: dlsch_total_bytes %d\n", UE_id, stats->dlsch_total_bytes);
|
||||||
LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",
|
LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",
|
||||||
UE_id,
|
UE_id,
|
||||||
|
|||||||
@@ -646,6 +646,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
int res_found = 0;
|
int res_found = 0;
|
||||||
|
|
||||||
pucch_pdu->bit_len_harq = O_ack;
|
pucch_pdu->bit_len_harq = O_ack;
|
||||||
|
pucch_pdu->bit_len_csi_part1 = O_csi;
|
||||||
|
|
||||||
uint16_t O_uci = O_csi + O_ack;
|
uint16_t O_uci = O_csi + O_ack;
|
||||||
|
|
||||||
@@ -698,6 +699,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
n_set = pucch_Config->resourceSetToAddModList->list.count;
|
n_set = pucch_Config->resourceSetToAddModList->list.count;
|
||||||
AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
|
AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
|
||||||
|
|
||||||
|
LOG_D(MAC, "UCI n_set= %d\n", n_set);
|
||||||
|
|
||||||
N2 = 2;
|
N2 = 2;
|
||||||
// procedure to select pucch resource id from resource sets according to
|
// procedure to select pucch resource id from resource sets according to
|
||||||
// number of uci bits and pucch resource indicator pucch_resource
|
// number of uci bits and pucch resource indicator pucch_resource
|
||||||
@@ -1635,7 +1638,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon
|
|||||||
add_nr_list(&UE_info->list, UE_id);
|
add_nr_list(&UE_info->list, UE_id);
|
||||||
memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
|
memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
|
||||||
set_Y(UE_info->Y[UE_id], rntiP);
|
set_Y(UE_info->Y[UE_id], rntiP);
|
||||||
compute_csi_bitlen(secondaryCellGroup, UE_info, UE_id);
|
compute_csi_bitlen (secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
|
||||||
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));
|
||||||
sched_ctrl->ta_frame = 0;
|
sched_ctrl->ta_frame = 0;
|
||||||
|
|||||||
@@ -80,6 +80,42 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
|
|||||||
pucch->sr_flag);
|
pucch->sr_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MIN_RSRP_VALUE -141
|
||||||
|
#define MAX_NUM_SSB 128
|
||||||
|
#define MAX_SSB_SCHED 8
|
||||||
|
#define L1_RSRP_HYSTERIS 10 //considering 10 dBm as hysterisis for avoiding frequent SSB Beam Switching. !Fixme provide exact value if any
|
||||||
|
//#define L1_DIFF_RSRP_STEP_SIZE 2
|
||||||
|
|
||||||
|
int ssb_index_sorted[MAX_NUM_SSB] = {0};
|
||||||
|
int ssb_rsrp_sorted[MAX_NUM_SSB] = {0};
|
||||||
|
|
||||||
|
//Measured RSRP Values Table 10.1.16.1-1 from 36.133
|
||||||
|
//Stored all the upper limits[Max RSRP Value of corresponding index]
|
||||||
|
//stored -1 for invalid values
|
||||||
|
int L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[128] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //0 - 9
|
||||||
|
-1, -1, -1, -1, -1, -1, -140, -139, -138, -137, //10 - 19
|
||||||
|
-136, -135, -134, -133, -132, -131, -130, -129, -128, -127, //20 - 29
|
||||||
|
-126, -125, -124, -123, -122, -121, -120, -119, -118, -117, //30 - 39
|
||||||
|
-116, -115, -114, -113, -112, -111, -110, -109, -108, -107, //40 - 49
|
||||||
|
-106, -105, -104, -103, -102, -101, -100, -99, -98, -97, //50 - 59
|
||||||
|
-96, -95, -94, -93, -92, -91, -90, -89, -88, -87, //60 - 69
|
||||||
|
-86, -85, -84, -83, -82, -81, -80, -79, -78, -77, //70 - 79
|
||||||
|
-76, -75, -74, -73, -72, -71, -70, -69, -68, -67, //80 - 89
|
||||||
|
-66, -65, -64, -63, -62, -61, -60, -59, -58, -57, //90 - 99
|
||||||
|
-56, -55, -54, -53, -52, -51, -50, -49, -48, -47, //100 - 109
|
||||||
|
-46, -45, -44, -44, -1, -1, -1, -1, -1, -1, //110 - 119
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1//120 - 127
|
||||||
|
};
|
||||||
|
|
||||||
|
//Differential RSRP values Table 10.1.6.1-2 from 36.133
|
||||||
|
//Stored the upper limits[MAX RSRP Value]
|
||||||
|
int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
|
||||||
|
0, -2, -4, -6, -8, -10, -12, -14, -16, -18, //0 - 9
|
||||||
|
-20, -22, -24, -26, -28, -30 //10 - 15
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
void nr_schedule_pucch(int Mod_idP,
|
void nr_schedule_pucch(int Mod_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP) {
|
sub_frame_t slotP) {
|
||||||
@@ -106,74 +142,293 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Calculating number of bits set
|
||||||
|
uint8_t number_of_bits_set (uint8_t buf,uint8_t * max_ri){
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
*max_ri = 8-index;
|
||||||
|
return nb_of_bits_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//!TODO : same function can be written to handle csi_resources
|
//!TODO : same function can be written to handle csi_resources
|
||||||
void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
|
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 csi_report_id = 0;
|
||||||
uint8_t csi_resourceidx =0;
|
uint8_t csi_resourceidx =0;
|
||||||
uint8_t csi_ssb_idx =0;
|
uint8_t csi_ssb_idx =0;
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
||||||
NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
|
||||||
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
|
||||||
|
|
||||||
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
||||||
csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
|
struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
|
nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
|
||||||
|
csi_ResourceConfigId=csi_reportconfig->resourcesForChannelMeasurement;
|
||||||
|
reportQuantity_type = csi_reportconfig->reportQuantity.present;
|
||||||
|
csi_report->reportQuantity_type = reportQuantity_type;
|
||||||
|
|
||||||
for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
|
for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
|
||||||
if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
|
struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
|
||||||
continue;
|
if ( csi_resourceconfig->csi_ResourceConfigId != csi_ResourceConfigId)
|
||||||
|
continue;
|
||||||
else {
|
else {
|
||||||
//Finding the CSI_RS or SSB Resources
|
uint8_t nb_ssb_resources =0;
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
|
//Finding the CSI_RS or SSB Resources
|
||||||
if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
|
if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type ||
|
||||||
struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
|
NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type) {
|
||||||
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
|
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
|
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 (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
|
||||||
|
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
|
||||||
|
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_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_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
|
||||||
|
csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.array;
|
||||||
|
csi_report->CSI_Index_list = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else /*if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type)*/{
|
||||||
|
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
|
||||||
|
if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_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_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
|
||||||
|
csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
|
||||||
|
csi_report->SSB_Index_list = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nb_ssb_resources) {
|
||||||
|
csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_ssb_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
|
||||||
|
csi_report->CSI_report_bitlen.cri_ssbri_bitlen,
|
||||||
|
csi_report->CSI_report_bitlen.rsrp_bitlen,
|
||||||
|
csi_report->CSI_report_bitlen.diff_rsrp_bitlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
|
uint8_t ri_restriction;
|
||||||
uint8_t nb_ssb_resources =0;
|
uint8_t ri_bitlen;
|
||||||
|
uint8_t nb_allowed_ri;
|
||||||
|
uint8_t max_ri;
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1==reportQuantity_type){
|
||||||
|
|
||||||
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
|
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
|
||||||
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
|
if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_ResourceSetId ==
|
||||||
*(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) {
|
*(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
|
||||||
///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
|
///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
|
||||||
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
|
nb_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
|
||||||
csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
|
csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
|
||||||
if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
|
csi_report->SSB_Index_list = NULL;
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
|
}
|
||||||
else
|
break;
|
||||||
/*! From Spec 38.331
|
}
|
||||||
* nrofReportedRS
|
csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2 (nb_ssb_resources));
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
|
|
||||||
} else
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
|
|
||||||
|
|
||||||
nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
if (nb_ssb_resources){
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
|
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
|
switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
|
case 1:;
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
|
csi_report->csi_meas_bitlen.ri_bitlen=0;
|
||||||
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
|
break;
|
||||||
break ;
|
case 2:
|
||||||
|
/* From Spec 38.212
|
||||||
|
* If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
|
||||||
|
* values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
|
||||||
|
* TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
|
||||||
|
* 5.2.2.2.1 [6, TS 38.214].
|
||||||
|
*
|
||||||
|
* But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
|
||||||
|
* calculate RI for antennas equal or more than two.
|
||||||
|
* */
|
||||||
|
AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
/* Replace dummy with the nrofCQIsPerReport from the CSIreport
|
||||||
|
config when equalent ASN structure present */
|
||||||
|
if (0==*(csi_reportconfig->dummy)){
|
||||||
|
nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
/* Replace dummy with the nrofCQIsPerReport from the CSIreport
|
||||||
|
config when equalent ASN structure present */
|
||||||
|
if (0==*(csi_reportconfig->dummy)){
|
||||||
|
nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction,&max_ri);
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
|
||||||
|
|
||||||
|
ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
|
||||||
|
|
||||||
|
/* Replace dummy with the nrofCQIsPerReport from the CSIreport
|
||||||
|
config when equalent ASN structure present */
|
||||||
|
if (0==*(csi_reportconfig->dummy)){
|
||||||
|
nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0),&max_ri);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
|
||||||
|
ri_bitlen = ceil(log2(nb_allowed_ri));
|
||||||
|
}
|
||||||
|
csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
csi_report->csi_meas_bitlen.li_bitlen=0;
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen=0;
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x1_bitlen=0;
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x2_bitlen=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ){
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
|
|
||||||
|
switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
|
||||||
|
case 1:;
|
||||||
|
csi_report->csi_meas_bitlen.li_bitlen=0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
/* From Spec 38.212
|
||||||
|
* If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
|
||||||
|
* values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
|
||||||
|
* TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
|
||||||
|
* 5.2.2.2.1 [6, TS 38.214].
|
||||||
|
*
|
||||||
|
* But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
|
||||||
|
* calculate RI for antennas equal or more than two.
|
||||||
|
* */
|
||||||
|
//! TODO: The bit length of LI is as follows LI = log2(RI), Need to confirm wheather we should consider maximum RI can be reported from ri_restricted
|
||||||
|
// or we should consider reported RI. If we need to consider reported RI for calculating LI bit length then we need to modify the code.
|
||||||
|
csi_report->csi_meas_bitlen.li_bitlen=ceil(log2(max_ri))<2?ceil(log2(max_ri)):2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type){
|
||||||
|
|
||||||
|
switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value){
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 4:
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
/* From Spec 38.212
|
||||||
|
* If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
|
||||||
|
* values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
|
||||||
|
* TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
|
||||||
|
* 5.2.2.2.1 [6, TS 38.214].
|
||||||
|
*
|
||||||
|
* But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
|
||||||
|
* calculate RI for antennas equal or more than two.
|
||||||
|
* */
|
||||||
|
|
||||||
|
if (max_ri > 4 && max_ri < 8){
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
|
if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen = 8;
|
||||||
|
else
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen = 4;
|
||||||
|
}
|
||||||
|
}else{ //This condition will work even for type1-multipanel.
|
||||||
|
if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen = 4;
|
||||||
|
else
|
||||||
|
csi_report->csi_meas_bitlen.cqi_bitlen = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type){
|
||||||
|
if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
|
||||||
|
switch (csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present){
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two:
|
||||||
|
if (max_ri ==1)
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x1_bitlen = 2;
|
||||||
|
else if (max_ri ==2)
|
||||||
|
csi_report->csi_meas_bitlen.pmi_x1_bitlen = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present!=
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two,
|
||||||
|
"Not handled Yet %d", csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report)
|
|
||||||
AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,12 +436,27 @@ void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t nr_get_csi_bitlen(const nr_csi_report_t *csi_report)
|
uint16_t nr_get_csi_bitlen(int Mod_idP,
|
||||||
{
|
int UE_id,
|
||||||
const CRI_SSBRI_RSRP_bitlen_t *bitlen = &csi_report->CSI_report_bitlen[0];
|
uint8_t csi_report_id) {
|
||||||
return bitlen->cri_ssbri_bitlen * bitlen->nb_ssbri_cri
|
|
||||||
+ bitlen->rsrp_bitlen
|
uint16_t csi_bitlen =0;
|
||||||
+ bitlen->diff_rsrp_bitlen * (bitlen->nb_ssbri_cri - 1) * csi_report->nb_of_csi_ssb_report;
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
L1_RSRP_bitlen_t * CSI_report_bitlen = NULL;
|
||||||
|
CSI_Meas_bitlen_t * csi_meas_bitlen = NULL;
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){
|
||||||
|
CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
|
||||||
|
csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
|
||||||
|
CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
|
||||||
|
(CSI_report_bitlen->nb_ssbri_cri -1 )));
|
||||||
|
} else{
|
||||||
|
csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
|
||||||
|
csi_bitlen+= (csi_meas_bitlen->cri_bitlen +csi_meas_bitlen->ri_bitlen+csi_meas_bitlen->li_bitlen+csi_meas_bitlen->cqi_bitlen+csi_meas_bitlen->pmi_x1_bitlen+csi_meas_bitlen->pmi_x2_bitlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return csi_bitlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -244,7 +514,7 @@ void nr_csi_meas_reporting(int Mod_idP,
|
|||||||
curr_pucch->ul_slot = sched_slot;
|
curr_pucch->ul_slot = sched_slot;
|
||||||
curr_pucch->resource_indicator = res_index;
|
curr_pucch->resource_indicator = res_index;
|
||||||
curr_pucch->csi_bits +=
|
curr_pucch->csi_bits +=
|
||||||
nr_get_csi_bitlen(&UE_info->csi_report_template[UE_id][csi_report_id]);
|
nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
|
||||||
|
|
||||||
// going through the list of PUCCH resources to find the one indexed by resource_id
|
// going through the list of PUCCH resources to find the one indexed by resource_id
|
||||||
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
|
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
|
||||||
@@ -312,6 +582,375 @@ static void handle_dl_harq(module_id_t mod_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) {
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
|
||||||
|
int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
|
||||||
|
NR_TCI_State_t *tci =NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<nb_tci_states && i<64; i++) {
|
||||||
|
tci = (NR_TCI_State_t *)secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
|
||||||
|
|
||||||
|
if(tci != NULL) {
|
||||||
|
if(tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
|
||||||
|
if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t)
|
||||||
|
return tci->tci_StateId; // returned TCI state ID
|
||||||
|
}
|
||||||
|
// if type2 is configured
|
||||||
|
else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
|
||||||
|
if(tci->qcl_Type2->referenceSignal.choice.ssb == ssb_index_t)
|
||||||
|
return tci->tci_StateId; // returned TCI state ID
|
||||||
|
} else LOG_I(MAC,"SSB index is not found in first 64 TCI states of TCI_statestoAddModList[%d]", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// tci state not identified in first 64 TCI States of PDSCH Config
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) {
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
|
||||||
|
int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
|
||||||
|
NR_TCI_State_t *tci =NULL;
|
||||||
|
NR_TCI_StateId_t *tci_id = NULL;
|
||||||
|
int bwp_id = 1;
|
||||||
|
NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
|
||||||
|
NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1];
|
||||||
|
int i;
|
||||||
|
int flag = 0;
|
||||||
|
int tci_stateID = -1;
|
||||||
|
|
||||||
|
for(i=0; i<nb_tci_states && i<128; i++) {
|
||||||
|
tci = (NR_TCI_State_t *)secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
|
||||||
|
|
||||||
|
if(tci != NULL && tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
|
||||||
|
if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t) {
|
||||||
|
flag = 1;
|
||||||
|
tci_stateID = tci->tci_StateId;
|
||||||
|
break;
|
||||||
|
} else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
|
||||||
|
flag = 1;
|
||||||
|
tci_stateID = tci->tci_StateId;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flag != 0 && tci_stateID != -1 && coreset != NULL) {
|
||||||
|
for(i=0; i<64 && i<coreset->tci_StatesPDCCH_ToAddList->list.count; i++) {
|
||||||
|
tci_id = coreset->tci_StatesPDCCH_ToAddList->list.array[i];
|
||||||
|
|
||||||
|
if(tci_id != NULL && *tci_id == tci_stateID)
|
||||||
|
return tci_stateID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Need to implement once configuration is received
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//returns the measured RSRP value (upper limit)
|
||||||
|
int get_measured_rsrp(uint8_t index) {
|
||||||
|
//if index is invalid returning minimum rsrp -140
|
||||||
|
if((index >= 0 && index <= 15) || index >= 114)
|
||||||
|
return MIN_RSRP_VALUE;
|
||||||
|
|
||||||
|
return L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
//returns the differential RSRP value (upper limit)
|
||||||
|
int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
|
||||||
|
if(strongest_rsrp != -1) {
|
||||||
|
return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index];
|
||||||
|
} else
|
||||||
|
return MIN_RSRP_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//identifies the target SSB Beam index
|
||||||
|
//keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
|
||||||
|
//handles triggering of PDCCH and PDSCH MAC CEs
|
||||||
|
void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
|
||||||
|
|
||||||
|
int strongest_ssb_rsrp = 0;
|
||||||
|
int cqi_idx = 0;
|
||||||
|
int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index
|
||||||
|
uint8_t target_ssb_beam_index = curr_ssb_beam_index;
|
||||||
|
uint8_t is_triggering_ssb_beam_switch =0;
|
||||||
|
uint8_t ssb_idx = 0;
|
||||||
|
int pdsch_bwp_id =0;
|
||||||
|
int ssb_index[MAX_NUM_SSB] = {0};
|
||||||
|
int ssb_rsrp[MAX_NUM_SSB] = {0};
|
||||||
|
uint8_t idx = 0;
|
||||||
|
int bwp_id = 1;
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
|
||||||
|
NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
|
||||||
|
//bwp indicator
|
||||||
|
int n_dl_bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
|
||||||
|
uint8_t nr_ssbri_cri = 0;
|
||||||
|
uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report;
|
||||||
|
int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
|
||||||
|
uint8_t diff_rsrp_idx = 0;
|
||||||
|
uint8_t i, j;
|
||||||
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
|
NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
|
||||||
|
|
||||||
|
if (n_dl_bwp < 4)
|
||||||
|
pdsch_bwp_id = bwp_id;
|
||||||
|
else
|
||||||
|
pdsch_bwp_id = bwp_id - 1; // as per table 7.3.1.1.2-1 in 38.212
|
||||||
|
|
||||||
|
/*Example:
|
||||||
|
CRI_SSBRI: 1 2 3 4| 5 6 7 8| 9 10 1 2|
|
||||||
|
nb_of_csi_ssb_report = 3 //3 sets as above
|
||||||
|
nr_ssbri_cri = 4 //each set has 4 elements
|
||||||
|
storing ssb indexes in ssb_index array as ssb_index[0] = 1 .. ssb_index[4] = 5
|
||||||
|
ssb_rsrp[0] = strongest rsrp in first set, ssb_rsrp[4] = strongest rsrp in second set, ..
|
||||||
|
idx: resource set index
|
||||||
|
*/
|
||||||
|
|
||||||
|
//for all reported SSB
|
||||||
|
for (idx = 0; idx < nb_of_csi_ssb_report; idx++) {
|
||||||
|
nr_ssbri_cri = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri;
|
||||||
|
//extracting the ssb indexes
|
||||||
|
for (ssb_idx = 0; ssb_idx < nr_ssbri_cri; ssb_idx++) {
|
||||||
|
ssb_index[idx * nb_of_csi_ssb_report + ssb_idx] = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[ssb_idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
//if strongest measured RSRP is configured
|
||||||
|
strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
|
||||||
|
// including ssb rsrp in mac stats
|
||||||
|
stats->cumul_rsrp += strongest_ssb_rsrp;
|
||||||
|
stats->num_rsrp_meas++;
|
||||||
|
ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp;
|
||||||
|
LOG_D(MAC,"ssb_rsrp = %d\n",strongest_ssb_rsrp);
|
||||||
|
|
||||||
|
//if current ssb rsrp is greater than better rsrp
|
||||||
|
if(ssb_rsrp[idx * nb_of_csi_ssb_report] > better_rsrp_reported) {
|
||||||
|
better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report];
|
||||||
|
target_ssb_beam_index = idx * nb_of_csi_ssb_report;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(diff_rsrp_idx =1; diff_rsrp_idx < nr_ssbri_cri; diff_rsrp_idx++) {
|
||||||
|
ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] = get_diff_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx-1], strongest_ssb_rsrp);
|
||||||
|
|
||||||
|
//if current reported rsrp is greater than better rsrp
|
||||||
|
if(ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] > better_rsrp_reported) {
|
||||||
|
better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx];
|
||||||
|
target_ssb_beam_index = idx * nb_of_csi_ssb_report + diff_rsrp_idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(ssb_index[target_ssb_beam_index] != ssb_index[curr_ssb_beam_index] && ssb_rsrp[target_ssb_beam_index] > ssb_rsrp[curr_ssb_beam_index]) {
|
||||||
|
if( ssb_rsrp[target_ssb_beam_index] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
|
||||||
|
is_triggering_ssb_beam_switch = 1;
|
||||||
|
LOG_D(MAC, "Triggering ssb beam switching using tci\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_triggering_ssb_beam_switch) {
|
||||||
|
//filling pdcch tci state activativation mac ce structure fields
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 1;
|
||||||
|
//OAI currently focusing on Non CA usecase hence 0 is considered as serving
|
||||||
|
//cell id
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.servingCellId = 0; //0 for PCell as 38.331 v15.9.0 page 353 //serving cell id for which this MAC CE applies
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId = 0; //coreset id for which the TCI State id is being indicated
|
||||||
|
|
||||||
|
/* 38.321 v15.8.0 page 66
|
||||||
|
TCI State ID: This field indicates the TCI state identified by TCI-StateId as specified in TS 38.331 [5] applicable
|
||||||
|
to the Control Resource Set identified by CORESET ID field.
|
||||||
|
If the field of CORESET ID is set to 0,
|
||||||
|
this field indicates a TCI-StateId for a TCI state of the first 64 TCI-states configured by tci-States-ToAddModList and tciStates-ToReleaseList in the PDSCH-Config in the active BWP.
|
||||||
|
If the field of CORESET ID is set to the other value than 0,
|
||||||
|
this field indicates a TCI-StateId configured by tci-StatesPDCCH-ToAddList and tciStatesPDCCH-ToReleaseList in the controlResourceSet identified by the indicated CORESET ID.
|
||||||
|
The length of the field is 7 bits
|
||||||
|
*/
|
||||||
|
if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) {
|
||||||
|
int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
|
||||||
|
|
||||||
|
if( tci_state_id != -1)
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
|
||||||
|
else {
|
||||||
|
//identify the best beam within first 64 TCI States of PDSCH
|
||||||
|
//Config TCI-states-to-addModList
|
||||||
|
int flag = 0;
|
||||||
|
|
||||||
|
for(i =0; ssb_index_sorted[i]!=0; i++) {
|
||||||
|
tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ;
|
||||||
|
|
||||||
|
if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
|
||||||
|
flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
|
||||||
|
|
||||||
|
if (tci_state_id !=-1)
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
|
||||||
|
else {
|
||||||
|
//identify the best beam within CORESET/PDCCH
|
||||||
|
////Config TCI-states-to-addModList
|
||||||
|
int flag = 0;
|
||||||
|
|
||||||
|
for(i =0; ssb_index_sorted[i]!=0; i++) {
|
||||||
|
tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id);
|
||||||
|
|
||||||
|
if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
|
||||||
|
flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI;
|
||||||
|
|
||||||
|
//filling pdsch tci state activation deactivation mac ce structure fields
|
||||||
|
if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.is_scheduled = 1;
|
||||||
|
/*
|
||||||
|
Serving Cell ID: This field indicates the identity of the Serving Cell for which the MAC CE applies
|
||||||
|
Considering only PCell exists. Serving cell index of PCell is always 0, hence configuring 0
|
||||||
|
*/
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.servingCellId = 0;
|
||||||
|
/*
|
||||||
|
BWP ID: This field indicates a DL BWP for which the MAC CE applies as the codepoint of the DCI bandwidth
|
||||||
|
part indicator field as specified in TS 38.212
|
||||||
|
*/
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.bwpId = pdsch_bwp_id;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO ssb_rsrp_sort() API yet to code to find 8 best beams, rrc configuration
|
||||||
|
* is required
|
||||||
|
*/
|
||||||
|
for(i = 0; i<8; i++) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.highestTciStateActivated = 8;
|
||||||
|
|
||||||
|
for(i = 0, j =0; i<MAX_TCI_STATES; i++) {
|
||||||
|
if(sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i]) {
|
||||||
|
sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.codepoint[j] = i;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//tci_presentInDCI
|
||||||
|
}//is-triggering_beam_switch
|
||||||
|
}//tci handling
|
||||||
|
|
||||||
|
void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
|
||||||
|
uint16_t j;
|
||||||
|
uint8_t i;
|
||||||
|
for(j = bitlen - 1,i = 0; j > i; j--, i++) {
|
||||||
|
if(((*value>>j)&1) != ((*value>>i)&1)) {
|
||||||
|
*value ^= (1<<j);
|
||||||
|
*value ^= (1<<i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void extract_pucch_csi_report (NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||||
|
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu,
|
||||||
|
frame_t frame,
|
||||||
|
slot_t slot,
|
||||||
|
int UE_id,
|
||||||
|
module_id_t Mod_idP) {
|
||||||
|
|
||||||
|
/** From Table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel */
|
||||||
|
uint8_t idx = 0;
|
||||||
|
uint8_t payload_size = ceil(((double)uci_pdu->csi_part1.csi_part1_bit_len)/8);
|
||||||
|
uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload;
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING;
|
||||||
|
NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info);
|
||||||
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||||
|
uint8_t csi_report_id = 0;
|
||||||
|
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = 0;
|
||||||
|
for ( csi_report_id =0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) {
|
||||||
|
//Has to implement according to reportSlotConfig type
|
||||||
|
/*reportQuantity must be considered according to the current scheduled
|
||||||
|
CSI-ReportConfig if multiple CSI-ReportConfigs present*/
|
||||||
|
reportQuantity_type = UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type;
|
||||||
|
LOG_D(PHY,"SFN/SF:%d%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type ||
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type) {
|
||||||
|
uint8_t csi_ssb_idx = 0;
|
||||||
|
uint8_t diff_rsrp_idx = 0;
|
||||||
|
uint8_t cri_ssbri_bitlen = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.cri_ssbri_bitlen;
|
||||||
|
|
||||||
|
/*! 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
|
||||||
|
* From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
|
||||||
|
* From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** from 38.214 sec 5.2.1.4.2
|
||||||
|
- if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE is
|
||||||
|
not required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in
|
||||||
|
a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting
|
||||||
|
|
||||||
|
- if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE is not
|
||||||
|
required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in a
|
||||||
|
single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
|
||||||
|
resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
|
||||||
|
multiple simultaneous spatial domain receive filter
|
||||||
|
*/
|
||||||
|
|
||||||
|
idx = 0; //Since for SSB RSRP reporting in RRC can configure only one ssb resource set per one report config
|
||||||
|
sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.nb_ssbri_cri;
|
||||||
|
|
||||||
|
for (csi_ssb_idx = 0; csi_ssb_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri ; csi_ssb_idx++) {
|
||||||
|
if(cri_ssbri_bitlen > 1)
|
||||||
|
reverse_n_bits(payload, cri_ssbri_bitlen);
|
||||||
|
|
||||||
|
if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type)
|
||||||
|
sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
|
||||||
|
*(UE_info->csi_report_template[UE_id][csi_report_id].SSB_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
|
||||||
|
else
|
||||||
|
sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
|
||||||
|
*(UE_info->csi_report_template[UE_id][csi_report_id].CSI_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
|
||||||
|
|
||||||
|
*payload >>= cri_ssbri_bitlen;
|
||||||
|
LOG_D(PHY,"SSB_index = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
reverse_n_bits(payload, 7);
|
||||||
|
sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP = (*payload) & 0x7f;
|
||||||
|
*payload >>= 7;
|
||||||
|
|
||||||
|
for ( diff_rsrp_idx =0; diff_rsrp_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri - 1; diff_rsrp_idx++ ) {
|
||||||
|
reverse_n_bits(payload,4);
|
||||||
|
sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx] = (*payload) & 0x0f;
|
||||||
|
*payload >>= 4;
|
||||||
|
}
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report++;
|
||||||
|
LOG_D(MAC,"csi_payload size = %d, rsrp_id = %d\n",payload_size, sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !(reportQuantity_type))
|
||||||
|
AssertFatal(reportQuantity_type, "reportQuantity is not configured");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void handle_nr_uci_pucch_0_1(module_id_t mod_id,
|
void handle_nr_uci_pucch_0_1(module_id_t mod_id,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
sub_frame_t slot,
|
sub_frame_t slot,
|
||||||
@@ -374,6 +1013,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
|
|||||||
LOG_E(MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
|
LOG_E(MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.secondaryCellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
|
||||||
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];
|
||||||
|
|
||||||
@@ -413,6 +1053,15 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
|
|||||||
handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack);
|
handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((uci_234->pduBitmap >> 2) & 0x01) {
|
||||||
|
//API to parse the csi report and store it into sched_ctrl
|
||||||
|
extract_pucch_csi_report (csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
|
||||||
|
//TCI handling function
|
||||||
|
tci_handling(mod_id, UE_id,frame, slot);
|
||||||
|
}
|
||||||
|
if ((uci_234->pduBitmap >> 3) & 0x01) {
|
||||||
|
//@TODO:Handle CSI Report 2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -743,5 +1392,4 @@ uint16_t compute_pucch_prb_size(uint8_t format,
|
|||||||
else{
|
else{
|
||||||
AssertFatal(1==0,"Not yet implemented");
|
AssertFatal(1==0,"Not yet implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1139,4 +1139,4 @@ void nr_schedule_ulsch(module_id_t module_id,
|
|||||||
|
|
||||||
memset(sched_pusch, 0, sizeof(*sched_pusch));
|
memset(sched_pusch, 0, sizeof(*sched_pusch));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ uint16_t compute_pucch_prb_size(uint8_t format,
|
|||||||
uint8_t n_symb,
|
uint8_t n_symb,
|
||||||
uint8_t n_re_ctrl);
|
uint8_t n_re_ctrl);
|
||||||
|
|
||||||
void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id);
|
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);
|
||||||
|
|
||||||
|
|||||||
@@ -246,8 +246,17 @@ typedef struct pdcchStateInd {
|
|||||||
uint8_t servingCellId;
|
uint8_t servingCellId;
|
||||||
uint8_t coresetId;
|
uint8_t coresetId;
|
||||||
uint8_t tciStateId;
|
uint8_t tciStateId;
|
||||||
|
bool tci_present_inDCI;
|
||||||
} pdcchStateInd_t;
|
} pdcchStateInd_t;
|
||||||
|
|
||||||
|
typedef struct pucchSpatialRelation {
|
||||||
|
bool is_scheduled;
|
||||||
|
uint8_t servingCellId;
|
||||||
|
uint8_t bwpId;
|
||||||
|
uint8_t pucchResourceId;
|
||||||
|
bool s0tos7_actDeact[8];
|
||||||
|
} pucchSpatialRelation_t;
|
||||||
|
|
||||||
typedef struct SPCSIReportingpucch {
|
typedef struct SPCSIReportingpucch {
|
||||||
bool is_scheduled;
|
bool is_scheduled;
|
||||||
uint8_t servingCellId;
|
uint8_t servingCellId;
|
||||||
@@ -271,12 +280,14 @@ typedef struct pdschTciStatesActDeact {
|
|||||||
uint8_t bwpId;
|
uint8_t bwpId;
|
||||||
uint8_t highestTciStateActivated;
|
uint8_t highestTciStateActivated;
|
||||||
bool tciStateActDeact[MAX_TCI_STATES];
|
bool tciStateActDeact[MAX_TCI_STATES];
|
||||||
|
uint8_t codepoint[8];
|
||||||
} pdschTciStatesActDeact_t;
|
} pdschTciStatesActDeact_t;
|
||||||
|
|
||||||
typedef struct UE_info {
|
typedef struct UE_info {
|
||||||
sp_zp_csirs_t sp_zp_csi_rs;
|
sp_zp_csirs_t sp_zp_csi_rs;
|
||||||
csi_rs_im_t csi_im;
|
csi_rs_im_t csi_im;
|
||||||
pdcchStateInd_t pdcch_state_ind;
|
pdcchStateInd_t pdcch_state_ind;
|
||||||
|
pucchSpatialRelation_t pucch_spatial_relation;
|
||||||
SPCSIReportingpucch_t SP_CSI_reporting_pucch;
|
SPCSIReportingpucch_t SP_CSI_reporting_pucch;
|
||||||
aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
|
aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
|
||||||
pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
|
pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
|
||||||
@@ -352,6 +363,84 @@ typedef struct NR_UE_harq {
|
|||||||
uint32_t tb_size;
|
uint32_t tb_size;
|
||||||
} NR_UE_harq_t;
|
} NR_UE_harq_t;
|
||||||
|
|
||||||
|
//! fixme : need to enhace for the multiple TB CQI report
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
/*! As per spec 38.214 section 5.2.1.4.2
|
||||||
|
* - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in
|
||||||
|
a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting.
|
||||||
|
* - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a
|
||||||
|
single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
|
||||||
|
resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
|
||||||
|
multiple simultaneous spatial domain receive filter
|
||||||
|
*/
|
||||||
|
#define MAX_NR_OF_REPORTED_RS 4
|
||||||
|
|
||||||
|
typedef enum NR_CSI_Report_Config {
|
||||||
|
CSI_Report_PR_cri_ri_li_pmi_cqi_report,
|
||||||
|
CSI_Report_PR_ssb_cri_report
|
||||||
|
} NR_CSI_Report_Config_PR;
|
||||||
|
struct CRI_RI_LI_PMI_CQI {
|
||||||
|
uint8_t cri;
|
||||||
|
uint8_t ri;
|
||||||
|
uint8_t li;
|
||||||
|
uint8_t pmi_x1;
|
||||||
|
uint8_t pmi_x2;
|
||||||
|
uint8_t cqi;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CRI_SSB_RSRP {
|
||||||
|
uint8_t nr_ssbri_cri;
|
||||||
|
uint8_t CRI_SSBRI[MAX_NR_OF_REPORTED_RS];
|
||||||
|
uint8_t RSRP;
|
||||||
|
uint8_t diff_RSRP[MAX_NR_OF_REPORTED_RS - 1];
|
||||||
|
} CRI_SSB_RSRP_t;
|
||||||
|
|
||||||
|
struct CSI_Report {
|
||||||
|
NR_CSI_Report_Config_PR present;
|
||||||
|
union Config_CSI_Report {
|
||||||
|
struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report;
|
||||||
|
struct CRI_SSB_RSRP ssb_cri_report;
|
||||||
|
} choice;
|
||||||
|
};
|
||||||
|
|
||||||
|
#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 cri_bitlen;
|
||||||
|
uint8_t ri_bitlen;
|
||||||
|
uint8_t li_bitlen;
|
||||||
|
uint8_t pmi_x1_bitlen;
|
||||||
|
uint8_t pmi_x2_bitlen;
|
||||||
|
uint8_t cqi_bitlen;
|
||||||
|
} 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
|
||||||
|
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.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
|
||||||
|
*/
|
||||||
|
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
|
||||||
typedef struct NR_UE_old_sched {
|
typedef struct NR_UE_old_sched {
|
||||||
uint16_t rbSize;
|
uint16_t rbSize;
|
||||||
int time_domain_allocation;
|
int time_domain_allocation;
|
||||||
@@ -376,26 +465,8 @@ typedef struct NR_UE_ul_harq {
|
|||||||
NR_sched_pusch_t sched_pusch;
|
NR_sched_pusch_t sched_pusch;
|
||||||
} NR_UE_ul_harq_t;
|
} NR_UE_ul_harq_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t nb_ssbri_cri;
|
|
||||||
uint8_t cri_ssbri_bitlen;
|
|
||||||
uint8_t rsrp_bitlen;
|
|
||||||
uint8_t diff_rsrp_bitlen;
|
|
||||||
}CRI_SSBRI_RSRP_bitlen_t;
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
|
|
||||||
typedef struct nr_csi_report {
|
|
||||||
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
|
||||||
NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
|
|
||||||
uint8_t nb_of_nzp_csi_report;
|
|
||||||
uint8_t nb_of_csi_ssb_report;
|
|
||||||
CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
|
|
||||||
} nr_csi_report_t;
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief scheduling control information set through an API */
|
/*! \brief scheduling control information set through an API */
|
||||||
|
#define MAX_CSI_REPORTS 48
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// total amount of data awaiting for this UE
|
/// total amount of data awaiting for this UE
|
||||||
uint32_t num_total_bytes;
|
uint32_t num_total_bytes;
|
||||||
@@ -450,6 +521,8 @@ typedef struct {
|
|||||||
uint8_t tpc0;
|
uint8_t tpc0;
|
||||||
uint8_t tpc1;
|
uint8_t tpc1;
|
||||||
uint16_t ul_rssi;
|
uint16_t ul_rssi;
|
||||||
|
uint8_t current_harq_pid;
|
||||||
|
struct CSI_Report CSI_report[MAX_CSI_REPORTS];
|
||||||
/// information about every HARQ process
|
/// information about every HARQ process
|
||||||
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
||||||
/// HARQ processes that are free
|
/// HARQ processes that are free
|
||||||
@@ -487,6 +560,8 @@ typedef struct {
|
|||||||
int ulsch_total_bytes_scheduled;
|
int ulsch_total_bytes_scheduled;
|
||||||
int ulsch_total_bytes_rx;
|
int ulsch_total_bytes_rx;
|
||||||
int ulsch_current_bytes;
|
int ulsch_current_bytes;
|
||||||
|
int cumul_rsrp;
|
||||||
|
uint8_t num_rsrp_meas;
|
||||||
} NR_mac_stats_t;
|
} NR_mac_stats_t;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,6 @@
|
|||||||
|
|
||||||
NR_IF_Module_t *if_inst[MAX_IF_MODULES];
|
NR_IF_Module_t *if_inst[MAX_IF_MODULES];
|
||||||
NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
|
NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
|
||||||
|
|
||||||
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
|
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
|
||||||
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
|
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
|
||||||
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
|
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
|
||||||
@@ -96,6 +95,7 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
|
|||||||
handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
|
handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
|
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
|
||||||
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
|
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
|
||||||
handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
|
handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
|
||||||
|
|||||||
@@ -645,94 +645,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
|
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
|
||||||
*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
|
*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
|
||||||
|
|
||||||
//bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=NULL;
|
|
||||||
bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
|
bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
|
||||||
|
|
||||||
#if 0
|
|
||||||
bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid0=calloc(1,sizeof(*tcid0));
|
|
||||||
tcid0->tci_StateId=0;
|
|
||||||
tcid0->qcl_Type1.cell=NULL;
|
|
||||||
tcid0->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid0->qcl_Type1.bwp_Id));
|
|
||||||
*tcid0->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid0->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid0->qcl_Type1.referenceSignal.choice.csi_rs = 2;
|
|
||||||
tcid0->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid0);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid1=calloc(1,sizeof(*tcid1));
|
|
||||||
tcid1->tci_StateId=0;
|
|
||||||
tcid1->qcl_Type1.cell=NULL;
|
|
||||||
tcid1->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid1->qcl_Type1.bwp_Id));
|
|
||||||
*tcid1->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid1->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid1->qcl_Type1.referenceSignal.choice.csi_rs = 6;
|
|
||||||
tcid1->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid1);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid2=calloc(1,sizeof(*tcid2));
|
|
||||||
tcid2->tci_StateId=2;
|
|
||||||
tcid2->qcl_Type1.cell=NULL;
|
|
||||||
tcid2->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid2->qcl_Type1.bwp_Id));
|
|
||||||
*tcid2->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid2->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid2->qcl_Type1.referenceSignal.choice.csi_rs = 10;
|
|
||||||
tcid2->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid2);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid3=calloc(1,sizeof(*tcid3));
|
|
||||||
tcid3->tci_StateId=3;
|
|
||||||
tcid3->qcl_Type1.cell=NULL;
|
|
||||||
tcid3->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid3->qcl_Type1.bwp_Id));
|
|
||||||
*tcid3->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid3->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid3->qcl_Type1.referenceSignal.choice.csi_rs = 14;
|
|
||||||
tcid3->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid3);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid4=calloc(1,sizeof(*tcid4));
|
|
||||||
tcid4->tci_StateId=4;
|
|
||||||
tcid4->qcl_Type1.cell=NULL;
|
|
||||||
tcid4->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid4->qcl_Type1.bwp_Id));
|
|
||||||
*tcid4->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid4->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid4->qcl_Type1.referenceSignal.choice.csi_rs = 18;
|
|
||||||
tcid4->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid4);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid5=calloc(1,sizeof(*tcid5));
|
|
||||||
tcid5->tci_StateId=5;
|
|
||||||
tcid5->qcl_Type1.cell=NULL;
|
|
||||||
tcid5->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid5->qcl_Type1.bwp_Id));
|
|
||||||
*tcid5->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid5->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid5->qcl_Type1.referenceSignal.choice.csi_rs = 22;
|
|
||||||
tcid5->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid5);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid6=calloc(1,sizeof(*tcid6));
|
|
||||||
tcid6->tci_StateId=6;
|
|
||||||
tcid6->qcl_Type1.cell=NULL;
|
|
||||||
tcid6->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid6->qcl_Type1.bwp_Id));
|
|
||||||
*tcid6->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid6->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid6->qcl_Type1.referenceSignal.choice.csi_rs = 26;
|
|
||||||
tcid6->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid6);
|
|
||||||
|
|
||||||
NR_TCI_State_t*tcid7=calloc(1,sizeof(*tcid7));
|
|
||||||
tcid7->tci_StateId=7;
|
|
||||||
tcid7->qcl_Type1.cell=NULL;
|
|
||||||
tcid7->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid7->qcl_Type1.bwp_Id));
|
|
||||||
*tcid7->qcl_Type1.bwp_Id=1;
|
|
||||||
tcid7->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
|
|
||||||
tcid7->qcl_Type1.referenceSignal.choice.csi_rs = 30;
|
|
||||||
tcid7->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
|
|
||||||
ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid7);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
n_ssb = 0;
|
n_ssb = 0;
|
||||||
NR_TCI_State_t *tcid[64];
|
NR_TCI_State_t *tcid[64];
|
||||||
for (int i=0;i<64;i++) {
|
for (int i=0;i<64;i++) {
|
||||||
@@ -903,7 +817,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
pusch_Config->tp_pi2BPSK=NULL;
|
pusch_Config->tp_pi2BPSK=NULL;
|
||||||
|
|
||||||
/*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
|
/*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
|
||||||
|
|
||||||
uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
|
uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
|
||||||
|
|
||||||
// TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
|
// TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
|
||||||
@@ -918,20 +832,20 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
|
if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
|
||||||
transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
|
transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
transform_precoding = *pusch_Config->transformPrecoder;
|
transform_precoding = *pusch_Config->transformPrecoder;
|
||||||
|
|
||||||
|
|
||||||
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
|
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
|
||||||
/* Enable DMRS uplink config for transform precoding enabled */
|
/* Enable DMRS uplink config for transform precoding enabled */
|
||||||
NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
|
NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
|
||||||
NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
|
NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
|
||||||
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
|
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
|
||||||
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
|
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
|
||||||
NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
|
NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
|
||||||
|
|
||||||
LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
|
LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
/*----------------------------------------------------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
@@ -1300,6 +1214,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||||
NR_RRCReconfiguration_IEs_t *reconfig,
|
NR_RRCReconfiguration_IEs_t *reconfig,
|
||||||
NR_CellGroupConfig_t *secondaryCellGroup,
|
NR_CellGroupConfig_t *secondaryCellGroup,
|
||||||
|
|||||||
Reference in New Issue
Block a user