Merge remote-tracking branch 'origin/RA_common_dl_pdus' into integration_2025_w10
This commit is contained in:
@@ -2084,59 +2084,6 @@ static const uint16_t table_7_3_1_1_2_32[3][15] = {
|
|||||||
{0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
{0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
|
|
||||||
int x_overhead,
|
|
||||||
uint8_t numdmrscdmgroupnodata,
|
|
||||||
uint8_t tb_scaling) {
|
|
||||||
|
|
||||||
LOG_D(MAC, "TBS calculation\n");
|
|
||||||
|
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_rel15 = &pdsch_pdu->pdsch_pdu_rel15;
|
|
||||||
uint16_t N_PRB_oh = x_overhead;
|
|
||||||
uint8_t N_PRB_DMRS;
|
|
||||||
if (pdsch_rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) {
|
|
||||||
// if no data in dmrs cdm group is 1 only even REs have no data
|
|
||||||
// if no data in dmrs cdm group is 2 both odd and even REs have no data
|
|
||||||
N_PRB_DMRS = numdmrscdmgroupnodata*6;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
N_PRB_DMRS = numdmrscdmgroupnodata*4;
|
|
||||||
}
|
|
||||||
uint8_t N_sh_symb = pdsch_rel15->NrOfSymbols;
|
|
||||||
uint8_t Imcs = pdsch_rel15->mcsIndex[0];
|
|
||||||
uint16_t dmrs_length = get_num_dmrs(pdsch_rel15->dlDmrsSymbPos);
|
|
||||||
uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS*dmrs_length - N_PRB_oh;
|
|
||||||
LOG_D(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh);
|
|
||||||
|
|
||||||
uint32_t TBS=0;
|
|
||||||
|
|
||||||
/*uint8_t mcs_table = config.pdsch_config.mcs_table.value;
|
|
||||||
uint8_t ss_type = params_rel15.search_space_type;
|
|
||||||
uint8_t dci_format = params_rel15.dci_format;
|
|
||||||
get_table_idx(mcs_table, dci_format, rnti_type, ss_type);*/
|
|
||||||
uint8_t table_idx = 0;
|
|
||||||
uint16_t R = nr_get_code_rate_dl(Imcs, table_idx);
|
|
||||||
uint8_t Qm = nr_get_Qm_dl(Imcs, table_idx);
|
|
||||||
|
|
||||||
TBS = nr_compute_tbs(Qm,
|
|
||||||
R,
|
|
||||||
pdsch_rel15->rbSize,
|
|
||||||
N_sh_symb,
|
|
||||||
N_PRB_DMRS*dmrs_length,
|
|
||||||
N_PRB_oh,
|
|
||||||
tb_scaling,
|
|
||||||
pdsch_rel15->nrOfLayers)>>3;
|
|
||||||
|
|
||||||
pdsch_rel15->targetCodeRate[0] = R;
|
|
||||||
pdsch_rel15->qamModOrder[0] = Qm;
|
|
||||||
pdsch_rel15->TBSize[0] = TBS;
|
|
||||||
// pdsch_rel15->nb_mod_symbols = N_RE_prime*pdsch_rel15->n_prb*pdsch_rel15->nb_codewords;
|
|
||||||
pdsch_rel15->mcsTable[0] = table_idx;
|
|
||||||
|
|
||||||
LOG_D(MAC, "TBS %d bytes: N_PRB_DMRS %d N_sh_symb %d N_PRB_oh %d R %d Qm %d table %d nb_symbols %d\n",
|
|
||||||
TBS, N_PRB_DMRS, N_sh_symb, N_PRB_oh, R, Qm, table_idx,N_RE_prime*pdsch_rel15->rbSize*pdsch_rel15->NrOfCodewords );
|
|
||||||
}
|
|
||||||
|
|
||||||
// the following tables contain 10 times the value reported in 214 (in line with SCF specification and to avoid fractional values)
|
// the following tables contain 10 times the value reported in 214 (in line with SCF specification and to avoid fractional values)
|
||||||
//Table 5.1.3.1-1 of 38.214
|
//Table 5.1.3.1-1 of 38.214
|
||||||
static const uint16_t Table_51311[32][2] = {{2, 1200}, {2, 1570}, {2, 1930}, {2, 2510}, {2, 3080}, {2, 3790}, {2, 4490}, {2, 5260},
|
static const uint16_t Table_51311[32][2] = {{2, 1200}, {2, 1570}, {2, 1930}, {2, 2510}, {2, 3080}, {2, 3790}, {2, 4490}, {2, 5260},
|
||||||
|
|||||||
@@ -1432,6 +1432,193 @@ static bool msg2_in_response_window(int rach_frame,
|
|||||||
return in_window;
|
return in_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
||||||
|
NR_RA_t *ra,
|
||||||
|
NR_UE_DL_BWP_t *dl_bwp,
|
||||||
|
nfapi_nr_dl_tti_request_body_t *dl_req,
|
||||||
|
NR_sched_pucch_t *pucch,
|
||||||
|
NR_pdsch_dmrs_t dmrs_info,
|
||||||
|
NR_tda_info_t tda,
|
||||||
|
nr_rnti_type_t rnti_type,
|
||||||
|
int aggregation_level,
|
||||||
|
int CCEIndex,
|
||||||
|
int tb_size,
|
||||||
|
int ndi,
|
||||||
|
int tpc,
|
||||||
|
int delta_PRI,
|
||||||
|
int current_harq_pid,
|
||||||
|
int time_domain_assignment,
|
||||||
|
int CC_id,
|
||||||
|
int rnti,
|
||||||
|
int round,
|
||||||
|
int mcsIndex,
|
||||||
|
int tb_scaling,
|
||||||
|
int pduindex,
|
||||||
|
long BWPStart,
|
||||||
|
long BWPSize,
|
||||||
|
int rbStart,
|
||||||
|
int rbSize)
|
||||||
|
{
|
||||||
|
// look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially
|
||||||
|
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
|
||||||
|
NR_ControlResourceSet_t *coreset = ra->coreset;
|
||||||
|
const int coresetid = coreset->controlResourceSetId;
|
||||||
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][coresetid];
|
||||||
|
if (!pdcch_pdu_rel15) {
|
||||||
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
||||||
|
memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
||||||
|
dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
|
||||||
|
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||||
|
dl_req->nPDUs += 1;
|
||||||
|
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||||
|
nr_configure_pdcch(pdcch_pdu_rel15, coreset, &ra->sched_pdcch, false);
|
||||||
|
nr_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu_rel15;
|
||||||
|
}
|
||||||
|
|
||||||
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
||||||
|
memset((void *)dl_tti_pdsch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
||||||
|
dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE;
|
||||||
|
dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
||||||
|
dl_req->nPDUs += 1;
|
||||||
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
|
|
||||||
|
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
|
||||||
|
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
||||||
|
|
||||||
|
int mcsTableIdx = dl_bwp->mcsTableIdx;
|
||||||
|
|
||||||
|
pdsch_pdu_rel15->pduBitmap = 0;
|
||||||
|
pdsch_pdu_rel15->rnti = rnti;
|
||||||
|
pdsch_pdu_rel15->pduIndex = pduindex;
|
||||||
|
pdsch_pdu_rel15->BWPSize = BWPSize;
|
||||||
|
pdsch_pdu_rel15->BWPStart = BWPStart;
|
||||||
|
pdsch_pdu_rel15->SubcarrierSpacing = dl_bwp->scs;
|
||||||
|
pdsch_pdu_rel15->CyclicPrefix = 0;
|
||||||
|
pdsch_pdu_rel15->NrOfCodewords = 1;
|
||||||
|
int R = nr_get_code_rate_dl(mcsIndex, mcsTableIdx);
|
||||||
|
pdsch_pdu_rel15->targetCodeRate[0] = R;
|
||||||
|
int Qm = nr_get_Qm_dl(mcsIndex, mcsTableIdx);
|
||||||
|
pdsch_pdu_rel15->qamModOrder[0] = Qm;
|
||||||
|
pdsch_pdu_rel15->TBSize[0] = tb_size;
|
||||||
|
pdsch_pdu_rel15->mcsIndex[0] = mcsIndex;
|
||||||
|
pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx;
|
||||||
|
pdsch_pdu_rel15->rvIndex[0] = nr_get_rv(round % 4);
|
||||||
|
pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
|
||||||
|
pdsch_pdu_rel15->nrOfLayers = 1;
|
||||||
|
pdsch_pdu_rel15->transmissionScheme = 0;
|
||||||
|
pdsch_pdu_rel15->refPoint = 0;
|
||||||
|
pdsch_pdu_rel15->dmrsConfigType = dmrs_info.dmrsConfigType;
|
||||||
|
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
||||||
|
pdsch_pdu_rel15->SCID = 0;
|
||||||
|
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = dmrs_info.numDmrsCdmGrpsNoData;
|
||||||
|
pdsch_pdu_rel15->dmrsPorts = 1;
|
||||||
|
pdsch_pdu_rel15->resourceAlloc = 1;
|
||||||
|
pdsch_pdu_rel15->rbStart = rbStart;
|
||||||
|
pdsch_pdu_rel15->rbSize = rbSize;
|
||||||
|
pdsch_pdu_rel15->VRBtoPRBMapping = 0;
|
||||||
|
pdsch_pdu_rel15->StartSymbolIndex = tda.startSymbolIndex;
|
||||||
|
pdsch_pdu_rel15->NrOfSymbols = tda.nrOfSymbols;
|
||||||
|
pdsch_pdu_rel15->dlDmrsSymbPos = dmrs_info.dl_dmrs_symb_pos;
|
||||||
|
pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, ra->sc_info.dl_bw_tbslbrm, 1);
|
||||||
|
pdsch_pdu_rel15->maintenance_parms_v3.ldpcBaseGraph = get_BG(tb_size << 3, R);
|
||||||
|
|
||||||
|
pdsch_pdu_rel15->precodingAndBeamforming.num_prgs = 1;
|
||||||
|
pdsch_pdu_rel15->precodingAndBeamforming.prg_size = 275;
|
||||||
|
pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces = 1;
|
||||||
|
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
||||||
|
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
||||||
|
|
||||||
|
/* Fill PDCCH DL DCI PDU */
|
||||||
|
nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
|
||||||
|
pdcch_pdu_rel15->numDlDci++;
|
||||||
|
dci_pdu->RNTI = rnti;
|
||||||
|
dci_pdu->ScramblingId = *scc->physCellId;
|
||||||
|
dci_pdu->ScramblingRNTI = 0;
|
||||||
|
dci_pdu->AggregationLevel = aggregation_level;
|
||||||
|
dci_pdu->CceIndex = CCEIndex;
|
||||||
|
dci_pdu->beta_PDCCH_1_0 = 0;
|
||||||
|
dci_pdu->powerControlOffsetSS = 1;
|
||||||
|
|
||||||
|
dci_pdu->precodingAndBeamforming.num_prgs = 0;
|
||||||
|
dci_pdu->precodingAndBeamforming.prg_size = 0;
|
||||||
|
dci_pdu->precodingAndBeamforming.dig_bf_interfaces = 1;
|
||||||
|
dci_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
||||||
|
dci_pdu->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
||||||
|
|
||||||
|
dci_pdu_rel15_t dci_payload;
|
||||||
|
dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize,
|
||||||
|
pdsch_pdu_rel15->rbStart,
|
||||||
|
BWPSize);
|
||||||
|
|
||||||
|
dci_payload.time_domain_assignment.val = time_domain_assignment;
|
||||||
|
dci_payload.vrb_to_prb_mapping.val = 0;
|
||||||
|
dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0];
|
||||||
|
dci_payload.tb_scaling = tb_scaling;
|
||||||
|
if (rnti_type == TYPE_TC_RNTI_) {
|
||||||
|
dci_payload.format_indicator = 1;
|
||||||
|
dci_payload.rv = pdsch_pdu_rel15->rvIndex[0];
|
||||||
|
dci_payload.harq_pid.val = current_harq_pid;
|
||||||
|
dci_payload.ndi = ndi;
|
||||||
|
dci_payload.dai[0].val = pucch ? (pucch->dai_c-1) & 3 : 0;
|
||||||
|
dci_payload.tpc = tpc; // TPC for PUCCH: table 7.2.1-1 in 38.213
|
||||||
|
dci_payload.pucch_resource_indicator = delta_PRI; // This is delta_PRI from 9.2.1 in 38.213
|
||||||
|
dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch ? pucch->timing_indicator : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_D(NR_MAC,
|
||||||
|
"DCI 1_0 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d pucchres %d harqtiming %d\n",
|
||||||
|
dci_payload.frequency_domain_assignment.val,
|
||||||
|
pdsch_pdu_rel15->rbStart,
|
||||||
|
pdsch_pdu_rel15->rbSize,
|
||||||
|
pdsch_pdu_rel15->BWPSize,
|
||||||
|
dci_payload.time_domain_assignment.val,
|
||||||
|
dci_payload.vrb_to_prb_mapping.val,
|
||||||
|
dci_payload.mcs,
|
||||||
|
dci_payload.tb_scaling,
|
||||||
|
dci_payload.pucch_resource_indicator,
|
||||||
|
dci_payload.pdsch_to_harq_feedback_timing_indicator.val);
|
||||||
|
|
||||||
|
LOG_D(NR_MAC,
|
||||||
|
"DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d "
|
||||||
|
"n_symb %d, BWPsize %d\n",
|
||||||
|
pdcch_pdu_rel15->dci_pdu[0].RNTI,
|
||||||
|
rnti_type,
|
||||||
|
NR_DL_DCI_FORMAT_1_0,
|
||||||
|
(unsigned long long)pdcch_pdu_rel15->FreqDomainResource,
|
||||||
|
pdcch_pdu_rel15->StartSymbolIndex,
|
||||||
|
pdcch_pdu_rel15->DurationSymbols,
|
||||||
|
pdsch_pdu_rel15->BWPSize);
|
||||||
|
|
||||||
|
fill_dci_pdu_rel15(&ra->sc_info,
|
||||||
|
dl_bwp,
|
||||||
|
&ra->UL_BWP,
|
||||||
|
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
||||||
|
&dci_payload,
|
||||||
|
NR_DL_DCI_FORMAT_1_0,
|
||||||
|
rnti_type,
|
||||||
|
dl_bwp->bwp_id,
|
||||||
|
ra->ra_ss,
|
||||||
|
coreset,
|
||||||
|
0, // parameter not needed for DCI 1_0
|
||||||
|
nr_mac->cset0_bwp_size);
|
||||||
|
|
||||||
|
LOG_D(NR_MAC, "BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
|
||||||
|
LOG_D(NR_MAC, "BWPStart: %i\n", pdcch_pdu_rel15->BWPStart);
|
||||||
|
LOG_D(NR_MAC, "SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing);
|
||||||
|
LOG_D(NR_MAC, "CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix);
|
||||||
|
LOG_D(NR_MAC, "StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex);
|
||||||
|
LOG_D(NR_MAC, "DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols);
|
||||||
|
for (int n = 0; n < 6; n++)
|
||||||
|
LOG_D(NR_MAC, "FreqDomainResource[%i]: %x\n", n, pdcch_pdu_rel15->FreqDomainResource[n]);
|
||||||
|
LOG_D(NR_MAC, "CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType);
|
||||||
|
LOG_D(NR_MAC, "RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize);
|
||||||
|
LOG_D(NR_MAC, "InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize);
|
||||||
|
LOG_D(NR_MAC, "CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType);
|
||||||
|
LOG_D(NR_MAC, "ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex);
|
||||||
|
LOG_D(NR_MAC, "precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity);
|
||||||
|
LOG_D(NR_MAC, "numDlDci: %i\n", pdcch_pdu_rel15->numDlDci);
|
||||||
|
}
|
||||||
|
|
||||||
static void nr_generate_Msg2(module_id_t module_idP,
|
static void nr_generate_Msg2(module_id_t module_idP,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
@@ -1562,33 +1749,6 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
|
|
||||||
LOG_D(NR_MAC, "Msg2 startSymbolIndex.nrOfSymbols %d.%d\n", tda_info.startSymbolIndex, tda_info.nrOfSymbols);
|
LOG_D(NR_MAC, "Msg2 startSymbolIndex.nrOfSymbols %d.%d\n", tda_info.startSymbolIndex, tda_info.nrOfSymbols);
|
||||||
|
|
||||||
// look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially
|
|
||||||
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
|
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][coresetid];
|
|
||||||
if (!pdcch_pdu_rel15) {
|
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
|
||||||
memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
||||||
dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
|
|
||||||
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
|
||||||
dl_req->nPDUs += 1;
|
|
||||||
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
|
||||||
nr_configure_pdcch(pdcch_pdu_rel15, coreset, &ra->sched_pdcch, false);
|
|
||||||
nr_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu_rel15;
|
|
||||||
}
|
|
||||||
|
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
|
||||||
memset((void *)dl_tti_pdsch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
||||||
dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE;
|
|
||||||
dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
|
||||||
dl_req->nPDUs += 1;
|
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
|
||||||
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.num_prgs = 0;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prg_size = 0;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces = 0;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
|
||||||
|
|
||||||
// Distance calculation according to SCF222.10.02 RACH.indication (table 3-74) and 38.213 4.2/38.211 4.3.1
|
// Distance calculation according to SCF222.10.02 RACH.indication (table 3-74) and 38.213 4.2/38.211 4.3.1
|
||||||
// T_c according to 38.211 4.1
|
// T_c according to 38.211 4.1
|
||||||
float T_c_ns = 0.509;
|
float T_c_ns = 0.509;
|
||||||
@@ -1597,14 +1757,13 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
float speed_of_light_in_meters_per_second = 299792458.0f;
|
float speed_of_light_in_meters_per_second = 299792458.0f;
|
||||||
float distance_in_meters = speed_of_light_in_meters_per_second * rtt_ns / 1000 / 1000 / 1000 / 2;
|
float distance_in_meters = speed_of_light_in_meters_per_second * rtt_ns / 1000 / 1000 / 1000 / 2;
|
||||||
LOG_A(NR_MAC,
|
LOG_A(NR_MAC,
|
||||||
"UE %04x: %d.%d Generating RA-Msg2 DCI, RA RNTI 0x%x, state %d, CoreSetType %d, preamble_index(RAPID) %d, "
|
"UE %04x: %d.%d Generating RA-Msg2 DCI, RA RNTI 0x%x, state %d, preamble_index(RAPID) %d, "
|
||||||
"timing_offset = %d (estimated distance %.1f [m])\n",
|
"timing_offset = %d (estimated distance %.1f [m])\n",
|
||||||
ra->rnti,
|
ra->rnti,
|
||||||
frameP,
|
frameP,
|
||||||
slotP,
|
slotP,
|
||||||
ra->RA_rnti,
|
ra->RA_rnti,
|
||||||
ra->ra_state,
|
ra->ra_state,
|
||||||
pdcch_pdu_rel15->CoreSetType,
|
|
||||||
ra->preamble_index,
|
ra->preamble_index,
|
||||||
ra->timing_offset,
|
ra->timing_offset,
|
||||||
distance_in_meters);
|
distance_in_meters);
|
||||||
@@ -1616,32 +1775,6 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
|
|
||||||
NR_pdsch_dmrs_t dmrs_parms = get_dl_dmrs_params(scc, dl_bwp, &tda_info, 1);
|
NR_pdsch_dmrs_t dmrs_parms = get_dl_dmrs_params(scc, dl_bwp, &tda_info, 1);
|
||||||
|
|
||||||
pdsch_pdu_rel15->pduBitmap = 0;
|
|
||||||
pdsch_pdu_rel15->rnti = ra->RA_rnti;
|
|
||||||
pdsch_pdu_rel15->pduIndex = pduindex;
|
|
||||||
pdsch_pdu_rel15->BWPSize = BWPSize;
|
|
||||||
pdsch_pdu_rel15->BWPStart = BWPStart;
|
|
||||||
pdsch_pdu_rel15->SubcarrierSpacing = dl_bwp->scs;
|
|
||||||
pdsch_pdu_rel15->CyclicPrefix = 0;
|
|
||||||
pdsch_pdu_rel15->NrOfCodewords = 1;
|
|
||||||
pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx;
|
|
||||||
pdsch_pdu_rel15->rvIndex[0] = 0;
|
|
||||||
pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
|
|
||||||
pdsch_pdu_rel15->nrOfLayers = 1;
|
|
||||||
pdsch_pdu_rel15->transmissionScheme = 0;
|
|
||||||
pdsch_pdu_rel15->refPoint = 0;
|
|
||||||
pdsch_pdu_rel15->dmrsConfigType = dmrs_parms.dmrsConfigType;
|
|
||||||
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
|
||||||
pdsch_pdu_rel15->SCID = 0;
|
|
||||||
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = dmrs_parms.numDmrsCdmGrpsNoData;
|
|
||||||
pdsch_pdu_rel15->dmrsPorts = 1;
|
|
||||||
pdsch_pdu_rel15->resourceAlloc = 1;
|
|
||||||
pdsch_pdu_rel15->rbStart = rbStart;
|
|
||||||
pdsch_pdu_rel15->rbSize = rbSize;
|
|
||||||
pdsch_pdu_rel15->VRBtoPRBMapping = 0;
|
|
||||||
pdsch_pdu_rel15->StartSymbolIndex = tda_info.startSymbolIndex;
|
|
||||||
pdsch_pdu_rel15->NrOfSymbols = tda_info.nrOfSymbols;
|
|
||||||
pdsch_pdu_rel15->dlDmrsSymbPos = dmrs_parms.dl_dmrs_symb_pos;
|
|
||||||
|
|
||||||
uint8_t tb_scaling = 0;
|
uint8_t tb_scaling = 0;
|
||||||
int R, Qm;
|
int R, Qm;
|
||||||
@@ -1660,77 +1793,34 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
tb_scaling, // tb scaling
|
tb_scaling, // tb scaling
|
||||||
1)
|
1)
|
||||||
>> 3; // layers
|
>> 3; // layers
|
||||||
|
|
||||||
pdsch_pdu_rel15->targetCodeRate[0] = R;
|
|
||||||
pdsch_pdu_rel15->qamModOrder[0] = Qm;
|
|
||||||
pdsch_pdu_rel15->mcsIndex[0] = mcsIndex;
|
|
||||||
pdsch_pdu_rel15->TBSize[0] = TBS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, sc_info->dl_bw_tbslbrm, 1);
|
prepare_dl_pdus(nr_mac,
|
||||||
pdsch_pdu_rel15->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS << 3, R);
|
ra,
|
||||||
|
dl_bwp,
|
||||||
// Fill PDCCH DL DCI PDU
|
dl_req,
|
||||||
nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
|
NULL,
|
||||||
pdcch_pdu_rel15->numDlDci++;
|
dmrs_parms,
|
||||||
dci_pdu->RNTI = ra->RA_rnti;
|
tda_info,
|
||||||
dci_pdu->ScramblingId = *scc->physCellId;
|
TYPE_RA_RNTI_,
|
||||||
dci_pdu->ScramblingRNTI = 0;
|
aggregation_level,
|
||||||
dci_pdu->AggregationLevel = aggregation_level;
|
CCEIndex,
|
||||||
dci_pdu->CceIndex = CCEIndex;
|
TBS,
|
||||||
dci_pdu->beta_PDCCH_1_0 = 0;
|
0,
|
||||||
dci_pdu->powerControlOffsetSS = 1;
|
0,
|
||||||
|
0,
|
||||||
dci_pdu->precodingAndBeamforming.num_prgs = 0;
|
0,
|
||||||
dci_pdu->precodingAndBeamforming.prg_size = 0;
|
time_domain_assignment,
|
||||||
dci_pdu->precodingAndBeamforming.dig_bf_interfaces = 1;
|
CC_id,
|
||||||
dci_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
ra->RA_rnti,
|
||||||
dci_pdu->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
0,
|
||||||
|
mcsIndex,
|
||||||
dci_pdu_rel15_t dci_payload;
|
tb_scaling,
|
||||||
dci_payload.frequency_domain_assignment.val =
|
pduindex,
|
||||||
PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->rbStart, BWPSize);
|
BWPStart,
|
||||||
|
BWPSize,
|
||||||
LOG_D(NR_MAC, "Msg2 rbSize.rbStart.BWPsize %d.%d.%ld\n", pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->rbStart, BWPSize);
|
rbStart,
|
||||||
|
rbSize);
|
||||||
dci_payload.time_domain_assignment.val = time_domain_assignment;
|
|
||||||
dci_payload.vrb_to_prb_mapping.val = 0;
|
|
||||||
dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0];
|
|
||||||
dci_payload.tb_scaling = tb_scaling;
|
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"DCI type 1 payload: freq_alloc %d (%d,%d,%ld), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d \n",
|
|
||||||
dci_payload.frequency_domain_assignment.val,
|
|
||||||
pdsch_pdu_rel15->rbStart,
|
|
||||||
pdsch_pdu_rel15->rbSize,
|
|
||||||
BWPSize,
|
|
||||||
dci_payload.time_domain_assignment.val,
|
|
||||||
dci_payload.vrb_to_prb_mapping.val,
|
|
||||||
dci_payload.mcs,
|
|
||||||
dci_payload.tb_scaling);
|
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d "
|
|
||||||
"n_symb %d\n",
|
|
||||||
pdcch_pdu_rel15->dci_pdu[0].RNTI,
|
|
||||||
TYPE_RA_RNTI_,
|
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
|
||||||
*(unsigned long long *)pdcch_pdu_rel15->FreqDomainResource,
|
|
||||||
pdcch_pdu_rel15->StartSymbolIndex,
|
|
||||||
pdcch_pdu_rel15->DurationSymbols);
|
|
||||||
|
|
||||||
fill_dci_pdu_rel15(sc_info,
|
|
||||||
dl_bwp,
|
|
||||||
&ra->UL_BWP,
|
|
||||||
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
|
||||||
&dci_payload,
|
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
|
||||||
TYPE_RA_RNTI_,
|
|
||||||
dl_bwp->bwp_id,
|
|
||||||
ss,
|
|
||||||
coreset,
|
|
||||||
0, // parameter not needed for DCI 1_0
|
|
||||||
nr_mac->cset0_bwp_size);
|
|
||||||
|
|
||||||
// DL TX request
|
// DL TX request
|
||||||
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[TX_req->Number_of_PDUs];
|
nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[TX_req->Number_of_PDUs];
|
||||||
@@ -1768,8 +1858,8 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
|
|
||||||
tx_req->PDU_index = pduindex;
|
tx_req->PDU_index = pduindex;
|
||||||
tx_req->num_TLV = 1;
|
tx_req->num_TLV = 1;
|
||||||
tx_req->TLVs[0].length = pdsch_pdu_rel15->TBSize[0];
|
tx_req->TLVs[0].length = TBS;
|
||||||
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, pdsch_pdu_rel15->TBSize[0]);
|
tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, TBS);
|
||||||
TX_req->SFN = frameP;
|
TX_req->SFN = frameP;
|
||||||
TX_req->Number_of_PDUs++;
|
TX_req->Number_of_PDUs++;
|
||||||
TX_req->Slot = slotP;
|
TX_req->Slot = slotP;
|
||||||
@@ -1792,204 +1882,6 @@ static void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
ra->ra_state = nrRA_WAIT_Msg3;
|
ra->ra_state = nrRA_WAIT_Msg3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prepare_dl_pdus(gNB_MAC_INST *nr_mac,
|
|
||||||
NR_RA_t *ra,
|
|
||||||
NR_UE_DL_BWP_t *dl_bwp,
|
|
||||||
nfapi_nr_dl_tti_request_body_t *dl_req,
|
|
||||||
NR_sched_pucch_t *pucch,
|
|
||||||
NR_pdsch_dmrs_t dmrs_info,
|
|
||||||
NR_tda_info_t tda,
|
|
||||||
int aggregation_level,
|
|
||||||
int CCEIndex,
|
|
||||||
int tb_size,
|
|
||||||
int ndi,
|
|
||||||
int tpc,
|
|
||||||
int delta_PRI,
|
|
||||||
int current_harq_pid,
|
|
||||||
int time_domain_assignment,
|
|
||||||
int CC_id,
|
|
||||||
int rnti,
|
|
||||||
int round,
|
|
||||||
int mcsIndex,
|
|
||||||
int tb_scaling,
|
|
||||||
int pduindex,
|
|
||||||
int rbStart,
|
|
||||||
int rbSize)
|
|
||||||
{
|
|
||||||
// look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially
|
|
||||||
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
|
|
||||||
NR_ControlResourceSet_t *coreset = ra->coreset;
|
|
||||||
const int coresetid = coreset->controlResourceSetId;
|
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][coresetid];
|
|
||||||
if (!pdcch_pdu_rel15) {
|
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
|
||||||
memset(dl_tti_pdcch_pdu, 0, sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
||||||
dl_tti_pdcch_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
|
|
||||||
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
|
||||||
dl_req->nPDUs += 1;
|
|
||||||
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
|
||||||
nr_configure_pdcch(pdcch_pdu_rel15, coreset, &ra->sched_pdcch, false);
|
|
||||||
nr_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu_rel15;
|
|
||||||
}
|
|
||||||
|
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
|
|
||||||
memset((void *)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
|
|
||||||
dl_tti_pdsch_pdu->PDUType = NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE;
|
|
||||||
dl_tti_pdsch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdsch_pdu));
|
|
||||||
dl_req->nPDUs+=1;
|
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
|
||||||
|
|
||||||
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
|
|
||||||
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
|
|
||||||
|
|
||||||
long BWPStart = 0;
|
|
||||||
long BWPSize = 0;
|
|
||||||
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config = NULL;
|
|
||||||
NR_SearchSpace_t *ss = ra->ra_ss;
|
|
||||||
if(*ss->controlResourceSetId!=0) {
|
|
||||||
BWPStart = dl_bwp->BWPStart;
|
|
||||||
BWPSize = dl_bwp->BWPSize;
|
|
||||||
} else {
|
|
||||||
type0_PDCCH_CSS_config = &nr_mac->type0_PDCCH_CSS_config[cc->ssb_index[ra->beam_id]];
|
|
||||||
BWPStart = type0_PDCCH_CSS_config->cset_start_rb;
|
|
||||||
BWPSize = type0_PDCCH_CSS_config->num_rbs;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mcsTableIdx = dl_bwp->mcsTableIdx;
|
|
||||||
|
|
||||||
pdsch_pdu_rel15->pduBitmap = 0;
|
|
||||||
pdsch_pdu_rel15->rnti = rnti;
|
|
||||||
pdsch_pdu_rel15->pduIndex = pduindex;
|
|
||||||
pdsch_pdu_rel15->BWPSize = BWPSize;
|
|
||||||
pdsch_pdu_rel15->BWPStart = BWPStart;
|
|
||||||
pdsch_pdu_rel15->SubcarrierSpacing = dl_bwp->scs;
|
|
||||||
pdsch_pdu_rel15->CyclicPrefix = 0;
|
|
||||||
pdsch_pdu_rel15->NrOfCodewords = 1;
|
|
||||||
int R = nr_get_code_rate_dl(mcsIndex,mcsTableIdx);
|
|
||||||
pdsch_pdu_rel15->targetCodeRate[0] = R;
|
|
||||||
int Qm = nr_get_Qm_dl(mcsIndex, mcsTableIdx);
|
|
||||||
pdsch_pdu_rel15->qamModOrder[0] = Qm;
|
|
||||||
pdsch_pdu_rel15->mcsIndex[0] = mcsIndex;
|
|
||||||
pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx;
|
|
||||||
pdsch_pdu_rel15->rvIndex[0] = nr_get_rv(round % 4);
|
|
||||||
pdsch_pdu_rel15->dataScramblingId = *scc->physCellId;
|
|
||||||
pdsch_pdu_rel15->nrOfLayers = 1;
|
|
||||||
pdsch_pdu_rel15->transmissionScheme = 0;
|
|
||||||
pdsch_pdu_rel15->refPoint = 0;
|
|
||||||
pdsch_pdu_rel15->dmrsConfigType = dmrs_info.dmrsConfigType;
|
|
||||||
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
|
|
||||||
pdsch_pdu_rel15->SCID = 0;
|
|
||||||
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = dmrs_info.numDmrsCdmGrpsNoData;
|
|
||||||
pdsch_pdu_rel15->dmrsPorts = 1;
|
|
||||||
pdsch_pdu_rel15->resourceAlloc = 1;
|
|
||||||
pdsch_pdu_rel15->rbStart = rbStart;
|
|
||||||
pdsch_pdu_rel15->rbSize = rbSize;
|
|
||||||
pdsch_pdu_rel15->VRBtoPRBMapping = 0;
|
|
||||||
pdsch_pdu_rel15->StartSymbolIndex = tda.startSymbolIndex;
|
|
||||||
pdsch_pdu_rel15->NrOfSymbols = tda.nrOfSymbols;
|
|
||||||
pdsch_pdu_rel15->dlDmrsSymbPos = dmrs_info.dl_dmrs_symb_pos;
|
|
||||||
|
|
||||||
int x_Overhead = 0;
|
|
||||||
nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling);
|
|
||||||
|
|
||||||
pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, ra->sc_info.dl_bw_tbslbrm, 1);
|
|
||||||
pdsch_pdu_rel15->maintenance_parms_v3.ldpcBaseGraph = get_BG(tb_size<<3,R);
|
|
||||||
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.num_prgs=1;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prg_size=275;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces=1;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
|
||||||
pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
|
||||||
|
|
||||||
/* Fill PDCCH DL DCI PDU */
|
|
||||||
nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
|
|
||||||
pdcch_pdu_rel15->numDlDci++;
|
|
||||||
dci_pdu->RNTI = rnti;
|
|
||||||
dci_pdu->ScramblingId = *scc->physCellId;
|
|
||||||
dci_pdu->ScramblingRNTI = 0;
|
|
||||||
dci_pdu->AggregationLevel = aggregation_level;
|
|
||||||
dci_pdu->CceIndex = CCEIndex;
|
|
||||||
dci_pdu->beta_PDCCH_1_0 = 0;
|
|
||||||
dci_pdu->powerControlOffsetSS = 1;
|
|
||||||
|
|
||||||
dci_pdu->precodingAndBeamforming.num_prgs = 0;
|
|
||||||
dci_pdu->precodingAndBeamforming.prg_size = 0;
|
|
||||||
dci_pdu->precodingAndBeamforming.dig_bf_interfaces = 1;
|
|
||||||
dci_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
|
|
||||||
dci_pdu->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
|
|
||||||
|
|
||||||
dci_pdu_rel15_t dci_payload;
|
|
||||||
dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize,
|
|
||||||
pdsch_pdu_rel15->rbStart,
|
|
||||||
BWPSize);
|
|
||||||
|
|
||||||
dci_payload.format_indicator = 1;
|
|
||||||
dci_payload.time_domain_assignment.val = time_domain_assignment;
|
|
||||||
dci_payload.vrb_to_prb_mapping.val = 0;
|
|
||||||
dci_payload.mcs = pdsch_pdu_rel15->mcsIndex[0];
|
|
||||||
dci_payload.tb_scaling = tb_scaling;
|
|
||||||
dci_payload.rv = pdsch_pdu_rel15->rvIndex[0];
|
|
||||||
dci_payload.harq_pid.val = current_harq_pid;
|
|
||||||
dci_payload.ndi = ndi;
|
|
||||||
dci_payload.dai[0].val = pucch ? (pucch->dai_c-1) & 3 : 0;
|
|
||||||
dci_payload.tpc = tpc; // TPC for PUCCH: table 7.2.1-1 in 38.213
|
|
||||||
dci_payload.pucch_resource_indicator = delta_PRI; // This is delta_PRI from 9.2.1 in 38.213
|
|
||||||
dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch ? pucch->timing_indicator : 0;
|
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"DCI 1_0 payload: freq_alloc %d (%d,%d,%d), time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d pucchres %d harqtiming %d\n",
|
|
||||||
dci_payload.frequency_domain_assignment.val,
|
|
||||||
pdsch_pdu_rel15->rbStart,
|
|
||||||
pdsch_pdu_rel15->rbSize,
|
|
||||||
pdsch_pdu_rel15->BWPSize,
|
|
||||||
dci_payload.time_domain_assignment.val,
|
|
||||||
dci_payload.vrb_to_prb_mapping.val,
|
|
||||||
dci_payload.mcs,
|
|
||||||
dci_payload.tb_scaling,
|
|
||||||
dci_payload.pucch_resource_indicator,
|
|
||||||
dci_payload.pdsch_to_harq_feedback_timing_indicator.val);
|
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
|
||||||
"DCI params: rnti 0x%x, rnti_type %d, dci_format %d coreset params: FreqDomainResource %llx, start_symbol %d "
|
|
||||||
"n_symb %d, BWPsize %d\n",
|
|
||||||
pdcch_pdu_rel15->dci_pdu[0].RNTI,
|
|
||||||
TYPE_TC_RNTI_,
|
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
|
||||||
(unsigned long long)pdcch_pdu_rel15->FreqDomainResource,
|
|
||||||
pdcch_pdu_rel15->StartSymbolIndex,
|
|
||||||
pdcch_pdu_rel15->DurationSymbols,
|
|
||||||
pdsch_pdu_rel15->BWPSize);
|
|
||||||
|
|
||||||
fill_dci_pdu_rel15(&ra->sc_info,
|
|
||||||
dl_bwp,
|
|
||||||
&ra->UL_BWP,
|
|
||||||
&pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci - 1],
|
|
||||||
&dci_payload,
|
|
||||||
NR_DL_DCI_FORMAT_1_0,
|
|
||||||
TYPE_TC_RNTI_,
|
|
||||||
dl_bwp->bwp_id,
|
|
||||||
ss,
|
|
||||||
coreset,
|
|
||||||
0, // parameter not needed for DCI 1_0
|
|
||||||
nr_mac->cset0_bwp_size);
|
|
||||||
|
|
||||||
LOG_D(NR_MAC, "BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
|
|
||||||
LOG_D(NR_MAC, "BWPStart: %i\n", pdcch_pdu_rel15->BWPStart);
|
|
||||||
LOG_D(NR_MAC, "SubcarrierSpacing: %i\n", pdcch_pdu_rel15->SubcarrierSpacing);
|
|
||||||
LOG_D(NR_MAC, "CyclicPrefix: %i\n", pdcch_pdu_rel15->CyclicPrefix);
|
|
||||||
LOG_D(NR_MAC, "StartSymbolIndex: %i\n", pdcch_pdu_rel15->StartSymbolIndex);
|
|
||||||
LOG_D(NR_MAC, "DurationSymbols: %i\n", pdcch_pdu_rel15->DurationSymbols);
|
|
||||||
for (int n = 0; n < 6; n++)
|
|
||||||
LOG_D(NR_MAC, "FreqDomainResource[%i]: %x\n", n, pdcch_pdu_rel15->FreqDomainResource[n]);
|
|
||||||
LOG_D(NR_MAC, "CceRegMappingType: %i\n", pdcch_pdu_rel15->CceRegMappingType);
|
|
||||||
LOG_D(NR_MAC, "RegBundleSize: %i\n", pdcch_pdu_rel15->RegBundleSize);
|
|
||||||
LOG_D(NR_MAC, "InterleaverSize: %i\n", pdcch_pdu_rel15->InterleaverSize);
|
|
||||||
LOG_D(NR_MAC, "CoreSetType: %i\n", pdcch_pdu_rel15->CoreSetType);
|
|
||||||
LOG_D(NR_MAC, "ShiftIndex: %i\n", pdcch_pdu_rel15->ShiftIndex);
|
|
||||||
LOG_D(NR_MAC, "precoderGranularity: %i\n", pdcch_pdu_rel15->precoderGranularity);
|
|
||||||
LOG_D(NR_MAC, "numDlDci: %i\n", pdcch_pdu_rel15->numDlDci);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
@@ -2229,7 +2121,20 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
|||||||
rnti_t rnti = ra->ra_type == RA_4_STEP ? ra->rnti : ra->MsgB_rnti;
|
rnti_t rnti = ra->ra_type == RA_4_STEP ? ra->rnti : ra->MsgB_rnti;
|
||||||
|
|
||||||
const int pduindex = nr_mac->pdu_index[CC_id]++;
|
const int pduindex = nr_mac->pdu_index[CC_id]++;
|
||||||
prepare_dl_pdus(nr_mac, ra, dl_bwp, dl_req, pucch, dmrs_info, msg4_tda, aggregation_level, CCEIndex, tb_size, harq->ndi, sched_ctrl->tpc1, delta_PRI,
|
prepare_dl_pdus(nr_mac,
|
||||||
|
ra,
|
||||||
|
dl_bwp,
|
||||||
|
dl_req,
|
||||||
|
pucch,
|
||||||
|
dmrs_info,
|
||||||
|
msg4_tda,
|
||||||
|
TYPE_TC_RNTI_,
|
||||||
|
aggregation_level,
|
||||||
|
CCEIndex,
|
||||||
|
tb_size,
|
||||||
|
harq->ndi,
|
||||||
|
sched_ctrl->tpc1,
|
||||||
|
delta_PRI,
|
||||||
current_harq_pid,
|
current_harq_pid,
|
||||||
time_domain_assignment,
|
time_domain_assignment,
|
||||||
CC_id,
|
CC_id,
|
||||||
@@ -2238,6 +2143,8 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
|
|||||||
mcsIndex,
|
mcsIndex,
|
||||||
tb_scaling,
|
tb_scaling,
|
||||||
pduindex,
|
pduindex,
|
||||||
|
BWPStart,
|
||||||
|
BWPSize,
|
||||||
rbStart,
|
rbStart,
|
||||||
rbSize);
|
rbSize);
|
||||||
|
|
||||||
|
|||||||
@@ -305,11 +305,6 @@ int get_spf(nfapi_nr_config_request_scf_t *cfg);
|
|||||||
|
|
||||||
int to_absslot(nfapi_nr_config_request_scf_t *cfg,int frame,int slot);
|
int to_absslot(nfapi_nr_config_request_scf_t *cfg,int frame,int slot);
|
||||||
|
|
||||||
void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
|
|
||||||
int x_overhead,
|
|
||||||
uint8_t numdmrscdmgroupnodata,
|
|
||||||
uint8_t tb_scaling);
|
|
||||||
|
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
||||||
|
|
||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
|
|||||||
Reference in New Issue
Block a user