Merge remote-tracking branch 'origin/develop' into NR_MAC_SSB_RO_GlobalEdge
This commit is contained in:
@@ -20,12 +20,12 @@
|
||||
*/
|
||||
|
||||
/*! \file phy_procedures_lte_eNB.c
|
||||
* \brief Implementation of eNB procedures from 36.213 LTE specifications
|
||||
* \author R. Knopp, F. Kaltenberger, N. Nikaein, X. Foukas
|
||||
* \brief Implementation of eNB procedures from 36.213 LTE specifications / FeMBMS 36.231 LTE procedures v14.2
|
||||
* \author R. Knopp, F. Kaltenberger, N. Nikaein, X. Foukas, J. Morgade
|
||||
* \date 2011
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr, x.foukas@sms.ed.ac.uk
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr, x.foukas@sms.ed.ac.uk, javier.morgade@ieee.org
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
@@ -122,12 +122,32 @@ lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subfr
|
||||
}
|
||||
|
||||
#ifdef MBMS_NFAPI_SCHEDULER
|
||||
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, int fembms_flag) {
|
||||
int subframe = proc->subframe_tx;
|
||||
// This is DL-Cell spec pilots in Control region
|
||||
generate_pilots_slot (eNB, eNB->common_vars.txdataF, AMP, subframe << 1, 1);
|
||||
if(eNB->dlsch_MCH->active==1)
|
||||
generate_mch (eNB, proc,NULL/*, eNB->dlsch_MCH->harq_processes[0]->pdu*/);
|
||||
if(!fembms_flag){
|
||||
generate_pilots_slot (eNB, eNB->common_vars.txdataF, AMP, subframe << 1, 1);
|
||||
generate_mbsfn_pilot(eNB,proc,
|
||||
eNB->common_vars.txdataF,
|
||||
AMP);
|
||||
}else
|
||||
generate_mbsfn_pilot_khz_1dot25(eNB,proc,
|
||||
eNB->common_vars.txdataF,
|
||||
AMP);
|
||||
|
||||
if(eNB->dlsch_MCH->active==1){
|
||||
if(!fembms_flag){
|
||||
generate_mch (eNB, proc,NULL/*, eNB->dlsch_MCH->harq_processes[0]->pdu*/);
|
||||
}
|
||||
else{
|
||||
generate_mch_khz_1dot25 (eNB, proc,NULL/*, eNB->dlsch_MCH->harq_processes[0]->pdu*/);
|
||||
}
|
||||
|
||||
LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (TBS %d) fembms %d \n",
|
||||
eNB->Mod_id,proc->frame_tx,subframe,
|
||||
eNB->dlsch_MCH->harq_processes[0]->TBS>>3,fembms_flag);
|
||||
|
||||
}
|
||||
eNB->dlsch_MCH->active = 0;
|
||||
}
|
||||
#else
|
||||
@@ -171,6 +191,80 @@ void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void common_signal_procedures_fembms (PHY_VARS_eNB *eNB,int frame, int subframe) {
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
int **txdataF = eNB->common_vars.txdataF;
|
||||
uint8_t *pbch_pdu=&eNB->pbch_pdu[0];
|
||||
|
||||
if((frame&3)!=0 /*&& subframe != 0*/)
|
||||
return;
|
||||
|
||||
LOG_I(PHY,"common_signal_procedures: frame %d, subframe %d fdd:%s dir:%s index:%d\n",frame,subframe,fp->frame_type == FDD?"FDD":"TDD", subframe_select(fp,subframe) == SF_DL?"DL":"UL?",(frame&15)/4);
|
||||
// generate Cell-Specific Reference Signals for both slots
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
|
||||
|
||||
|
||||
if(subframe_select(fp,subframe) == SF_S)
|
||||
generate_pilots_slot(eNB,
|
||||
txdataF,
|
||||
AMP,
|
||||
subframe<<1,1);
|
||||
else
|
||||
generate_pilots_slot(eNB,
|
||||
txdataF,
|
||||
AMP,
|
||||
subframe<<1,0);
|
||||
|
||||
// check that 2nd slot is for DL
|
||||
if (subframe_select (fp, subframe) == SF_DL)
|
||||
generate_pilots_slot (eNB, txdataF, AMP, (subframe << 1) + 1, 0);
|
||||
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME (VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX, 0);
|
||||
|
||||
// First half of PSS/SSS (FDD, slot 0)
|
||||
if (subframe == 0) {
|
||||
//if (fp->frame_type == FDD) {
|
||||
generate_pss (txdataF, AMP, fp, (fp->Ncp == NORMAL) ? 6 : 5, 0);
|
||||
generate_sss (txdataF, AMP, fp, (fp->Ncp == NORMAL) ? 5 : 4, 0);
|
||||
//}
|
||||
|
||||
/// First half of SSS (TDD, slot 1)
|
||||
|
||||
//if (fp->frame_type == TDD) {
|
||||
generate_sss (txdataF, AMP, fp, (fp->Ncp == NORMAL) ? 6 : 5, 1);
|
||||
//}
|
||||
|
||||
// generate PBCH (Physical Broadcast CHannel) info
|
||||
|
||||
/// generate PBCH
|
||||
if ((frame&15)==0) {
|
||||
//AssertFatal(eNB->pbch_configured==1,"PBCH was not configured by MAC\n");
|
||||
if (eNB->pbch_configured!=1) return;
|
||||
|
||||
eNB->pbch_configured=0;
|
||||
}
|
||||
|
||||
T(T_ENB_PHY_MIB, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
|
||||
T_BUFFER(pbch_pdu, 3));
|
||||
generate_pbch_fembms (&eNB->pbch, txdataF, AMP, fp, pbch_pdu, (frame & 15)/4);
|
||||
} //else if ((subframe == 1) && (fp->frame_type == TDD)) {
|
||||
//generate_pss (txdataF, AMP, fp, 2, 2);
|
||||
// }
|
||||
// Second half of PSS/SSS (FDD, slot 10)
|
||||
else if ((subframe == 5) && (fp->frame_type == FDD) && is_fembms_nonMBSFN_subframe(frame,subframe,fp)) {
|
||||
generate_pss (txdataF, AMP, &eNB->frame_parms, (fp->Ncp == NORMAL) ? 6 : 5, 10);
|
||||
generate_sss (txdataF, AMP, &eNB->frame_parms, (fp->Ncp == NORMAL) ? 5 : 4, 10);
|
||||
}
|
||||
// Second-half of SSS (TDD, slot 11)
|
||||
// else if ((subframe == 5) && (fp->frame_type == TDD)) {
|
||||
// generate_sss (txdataF, AMP, fp, (fp->Ncp == NORMAL) ? 6 : 5, 11);
|
||||
// }
|
||||
// Second half of PSS (TDD, slot 12)
|
||||
// else if ((subframe == 6) && (fp->frame_type == TDD)) {
|
||||
// generate_pss (txdataF, AMP, fp, 2, 12);
|
||||
// }
|
||||
}
|
||||
|
||||
void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) {
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
int **txdataF = eNB->common_vars.txdataF;
|
||||
@@ -417,12 +511,30 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
}
|
||||
|
||||
if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||
if (is_fembms_pmch_subframe(frame,subframe,fp)) {
|
||||
#ifdef MBMS_NFAPI_SCHEDULER
|
||||
pmch_procedures(eNB,proc,1);
|
||||
LOG_D(MAC,"frame %d, subframe %d -> PMCH\n",frame,subframe);
|
||||
return;
|
||||
#endif
|
||||
}else if(is_fembms_cas_subframe(frame,subframe,fp) || is_fembms_nonMBSFN_subframe(frame,subframe,fp)){
|
||||
LOG_D(MAC,"frame %d, subframe %d -> CAS\n",frame,subframe);
|
||||
common_signal_procedures_fembms(eNB,proc->frame_tx, proc->subframe_tx);
|
||||
//return;
|
||||
}
|
||||
|
||||
if((!is_fembms_cas_subframe(frame,subframe,fp)) && (!is_fembms_nonMBSFN_subframe(frame,subframe,fp))){
|
||||
if (is_pmch_subframe(frame,subframe,fp)) {
|
||||
#ifdef MBMS_NFAPI_SCHEDULER
|
||||
pmch_procedures(eNB,proc,0);
|
||||
#else
|
||||
pmch_procedures(eNB,proc);
|
||||
#endif
|
||||
} else {
|
||||
// this is not a pmch subframe, so generate PSS/SSS/PBCH
|
||||
common_signal_procedures(eNB,proc->frame_tx, proc->subframe_tx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clear existing ulsch dci allocations before applying info from MAC (this is table
|
||||
@@ -508,6 +620,18 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
|
||||
if (do_meas==1) start_meas(&eNB->dlsch_ue_specific);
|
||||
|
||||
if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||
if (is_fembms_pmch_subframe(frame,subframe,fp)) {
|
||||
#ifdef MBMS_NFAPI_SCHEDULER
|
||||
pmch_procedures(eNB,proc,1);
|
||||
return;
|
||||
#endif
|
||||
}else if(is_fembms_cas_subframe(frame,subframe,fp)){
|
||||
common_signal_procedures_fembms(eNB,proc->frame_tx, proc->subframe_tx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1);
|
||||
// Now scan UE specific DLSCH
|
||||
|
||||
@@ -41,6 +41,17 @@
|
||||
* \warning
|
||||
*/
|
||||
|
||||
/*! \function feptx0
|
||||
* \brief Implementation of ofdm encoding for FeMBMS profile in one eNB
|
||||
* \author J. Morgade
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
* \email: javier.morgade@ieee.org
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "PHY/defs_eNB.h"
|
||||
#include "PHY/phy_extern.h"
|
||||
@@ -76,7 +87,7 @@ void feptx0(RU_t *ru,
|
||||
int slot_sizeF = (fp->ofdm_symbol_size) * ((fp->Ncp==1) ? 6 : 7);
|
||||
int subframe = ru->proc.tti_tx;
|
||||
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+(slot&1) , 1 );
|
||||
|
||||
slot_offset = slot*(fp->samples_per_tti>>1); //slot_offset = subframe*fp->samples_per_tti + (slot*(fp->samples_per_tti>>1));
|
||||
|
||||
@@ -91,7 +102,17 @@ void feptx0(RU_t *ru,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
if(is_pmch_subframe(ru->proc.frame_tx,subframe,fp)){
|
||||
if(is_fembms_pmch_subframe(ru->proc.frame_tx,subframe,fp)){
|
||||
if((slot&1)==0){//just use one slot chance
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][(slot&1)*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size_khz_1dot25,
|
||||
1,
|
||||
fp->ofdm_symbol_size_khz_1dot25>>2,
|
||||
CYCLIC_PREFIX);
|
||||
LOG_D(HW,"Generating PMCH FeMBMS TX subframe %d %d\n",subframe,fp->ofdm_symbol_size_khz_1dot25);
|
||||
}
|
||||
} else if(is_pmch_subframe(ru->proc.frame_tx,subframe,fp)){
|
||||
if ((slot&1) == 0) {//just use one slot chance
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][(slot&1)*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
|
||||
Reference in New Issue
Block a user