fix LimeSDR board API, merge develop
This commit is contained in:
@@ -139,6 +139,54 @@ void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||
// adjust transmit amplitude here based on NFAPI info
|
||||
}
|
||||
|
||||
|
||||
void handle_nfapi_mch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||
uint8_t *sdu){
|
||||
|
||||
nfapi_dl_config_mch_pdu_rel8_t *rel8 = &dl_config_pdu->mch_pdu.mch_pdu_rel8;
|
||||
|
||||
LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH;
|
||||
LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
|
||||
|
||||
// dlsch->rnti = M_RNTI;
|
||||
dlsch->harq_processes[0]->mcs = rel8->modulation;
|
||||
// dlsch->harq_processes[0]->Ndi = ndi;
|
||||
dlsch->harq_processes[0]->rvidx = 0;//rvidx;
|
||||
dlsch->harq_processes[0]->Nl = 1;
|
||||
dlsch->harq_processes[0]->TBS = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1];
|
||||
// dlsch->harq_ids[subframe] = 0;
|
||||
dlsch->harq_processes[0]->nb_rb = frame_parms->N_RB_DL;
|
||||
|
||||
switch(frame_parms->N_RB_DL) {
|
||||
case 6:
|
||||
dlsch->harq_processes[0]->rb_alloc[0] = 0x3f;
|
||||
break;
|
||||
|
||||
case 25:
|
||||
dlsch->harq_processes[0]->rb_alloc[0] = 0x1ffffff;
|
||||
break;
|
||||
|
||||
case 50:
|
||||
dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff;
|
||||
dlsch->harq_processes[0]->rb_alloc[1] = 0x3ffff;
|
||||
break;
|
||||
|
||||
case 100:
|
||||
dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff;
|
||||
dlsch->harq_processes[0]->rb_alloc[1] = 0xffffffff;
|
||||
dlsch->harq_processes[0]->rb_alloc[2] = 0xffffffff;
|
||||
dlsch->harq_processes[0]->rb_alloc[3] = 0xf;
|
||||
break;
|
||||
}
|
||||
|
||||
dlsch->harq_ids[proc->frame_tx%2][proc->subframe_tx] = 0;
|
||||
|
||||
dlsch->harq_processes[0]->pdu = sdu;
|
||||
|
||||
dlsch->active = 1;
|
||||
}
|
||||
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
extern uint32_t localRIV2alloc_LUT6[32];
|
||||
extern uint32_t localRIV2alloc_LUT25[512];
|
||||
@@ -837,8 +885,30 @@ void schedule_response(Sched_Rsp_t *Sched_INFO, L1_rxtx_proc_t *proc) {
|
||||
|
||||
break;
|
||||
|
||||
case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
|
||||
case NFAPI_DL_CONFIG_MCH_PDU_TYPE:{
|
||||
// handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
|
||||
//AssertFatal(1==0,"OK\n");
|
||||
nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = &dl_config_pdu->mch_pdu.mch_pdu_rel8;
|
||||
uint16_t pdu_index = mch_pdu_rel8->pdu_index;
|
||||
uint16_t tx_pdus = TX_req->tx_request_body.number_of_pdus;
|
||||
uint16_t invalid_pdu = pdu_index == -1;
|
||||
uint8_t *sdu = invalid_pdu ? NULL : pdu_index >= tx_pdus ? NULL : TX_req->tx_request_body.tx_pdu_list[pdu_index].segments[0].segment_data;
|
||||
LOG_D(PHY,"%s() [PDU:%d] NFAPI_DL_CONFIG_MCH_PDU_TYPE SFN/SF:%04d%d TX:%d/%d RX:%d/%d pdu_index:%d sdu:%p\n",
|
||||
__FUNCTION__, i,
|
||||
NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),
|
||||
proc->frame_tx, proc->subframe_tx,
|
||||
proc->frame_rx, proc->subframe_rx,
|
||||
pdu_index, sdu);
|
||||
if (sdu) { //sdu != NULL)
|
||||
if (NFAPI_MODE!=NFAPI_MODE_VNF)
|
||||
handle_nfapi_mch_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu, sdu);
|
||||
} else {
|
||||
dont_send=1;
|
||||
LOG_E(MAC,"%s() NFAPI_DL_CONFIG_MCH_PDU_TYPE sdu is NULL DL_CFG:SFN/SF:%d:pdu_index:%d TX_REQ:SFN/SF:%d:pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(DL_req->sfn_sf), pdu_index,
|
||||
NFAPI_SFNSF2DEC(TX_req->sfn_sf), tx_pdus);
|
||||
}
|
||||
do_oai=1;
|
||||
}
|
||||
break;
|
||||
|
||||
case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
|
||||
|
||||
@@ -53,6 +53,11 @@ void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_pro
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||
uint8_t codeword_index,
|
||||
uint8_t *sdu);
|
||||
|
||||
void handle_nfapi_mch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
|
||||
nfapi_dl_config_request_pdu_t *dl_config_pdu,
|
||||
uint8_t *sdu);
|
||||
|
||||
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
|
||||
nfapi_ul_config_request_pdu_t *ul_config_pdu,
|
||||
uint16_t frame,uint8_t subframe,uint8_t srs_present);
|
||||
|
||||
@@ -48,6 +48,8 @@
|
||||
#include "intertask_interface.h"
|
||||
#include <executables/split_headers.h>
|
||||
|
||||
#define MBMS_NFAPI_SCHEDULER
|
||||
|
||||
nfapi_ue_release_request_body_t release_rntis;
|
||||
|
||||
int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint16_t UE_id,uint8_t harq_pid, uint8_t bw_factor) {
|
||||
@@ -118,13 +120,23 @@ lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subfr
|
||||
return(subframe_select(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe));
|
||||
}
|
||||
|
||||
#ifdef MBMS_NFAPI_SCHEDULER
|
||||
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
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*/);
|
||||
eNB->dlsch_MCH->active = 0;
|
||||
}
|
||||
#else
|
||||
void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
MCH_PDU *mch_pduP=NULL;
|
||||
// uint8_t sync_area=255;
|
||||
#endif
|
||||
int subframe = proc->subframe_tx;
|
||||
AssertFatal (1 == 0, "pmch not tested for the moment, exiting\n");
|
||||
AssertFatal (1 == 1, "pmch not tested for the moment, exiting\n");
|
||||
// This is DL-Cell spec pilots in Control region
|
||||
generate_pilots_slot (eNB, eNB->common_vars.txdataF, AMP, subframe << 1, 1);
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
|
||||
@@ -137,6 +149,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
proc->frame_tx,
|
||||
subframe);
|
||||
*/
|
||||
mch_pduP= &RC.mac[eNB->Mod_id]->common_channels[eNB->CC_id].MCH_pdu;
|
||||
if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
|
||||
LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
|
||||
eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs,
|
||||
@@ -150,14 +163,17 @@ void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
|
||||
|
||||
if (mch_pduP) {
|
||||
fill_eNB_dlsch_MCH (eNB, mch_pduP->mcs, 1, 0);
|
||||
eNB->dlsch_MCH->harq_ids[proc->frame_tx%2][subframe] = 0;
|
||||
eNB->dlsch_MCH->harq_processes[0]->pdu=(uint8_t *) mch_pduP->payload;
|
||||
// Generate PMCH
|
||||
generate_mch (eNB, proc, (uint8_t *) mch_pduP->payload);
|
||||
generate_mch (eNB, proc, NULL/*(uint8_t *) mch_pduP->payload*/);
|
||||
} else {
|
||||
LOG_D (PHY, "[eNB/RN] Frame %d subframe %d: MCH not generated \n", proc->frame_tx, subframe);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) {
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
|
||||
@@ -168,7 +168,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,
|
||||
{
|
||||
if ((eNB->prach_energy_counter == 100) &&
|
||||
(max_preamble_energy[0] > eNB->measurements.prach_I0+eNB->prach_DTX_threshold)) {
|
||||
LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
||||
LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
|
||||
eNB->Mod_id,
|
||||
eNB->CC_id,
|
||||
frame,
|
||||
|
||||
@@ -94,35 +94,49 @@ void feptx0(RU_t *ru, L1_rxtx_proc_t *proc, int slot) {
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
else {
|
||||
/* AssertFatal(ru->generate_dmrs_sync==1 && (fp->frame_type != TDD || ru->is_slave == 1),
|
||||
"ru->generate_dmrs_sync should not be set, frame_type %d, is_slave %d\n",
|
||||
fp->frame_type,ru->is_slave);
|
||||
*/
|
||||
int num_symb = 7;
|
||||
if(is_pmch_subframe(ru->proc.frame_tx,subframe,fp)){
|
||||
if(slot==0){//just use one slot chance
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
2,
|
||||
fp);
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF+fp->ofdm_symbol_size*2],
|
||||
(int*)&ru->common.txdata[aa][slot_offset+((fp->ofdm_symbol_size>>2)*2+fp->ofdm_symbol_size*2)],
|
||||
fp->ofdm_symbol_size,
|
||||
10,
|
||||
fp->ofdm_symbol_size>>2,
|
||||
CYCLIC_PREFIX);
|
||||
LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d F(%d) t(%d) IS PMCH(%d)\n",ru->proc.frame_tx, ru->proc.subframe_tx,slot,slot*slot_sizeF+fp->ofdm_symbol_size*2,slot_offset+((fp->ofdm_symbol_size>>2)*2+fp->ofdm_symbol_size*2),is_pmch_subframe(ru->proc.frame_tx,subframe,fp));
|
||||
}
|
||||
}else{
|
||||
/* AssertFatal(ru->generate_dmrs_sync==1 && (fp->frame_type != TDD || ru->is_slave == 1),
|
||||
"ru->generate_dmrs_sync should not be set, frame_type %d, is_slave %d\n",
|
||||
fp->frame_type,ru->is_slave);
|
||||
*/
|
||||
int num_symb = 7;
|
||||
|
||||
if (subframe_select(fp,subframe) == SF_S) num_symb=fp->dl_symbols_in_S_subframe+1;
|
||||
|
||||
if (ru->generate_dmrs_sync == 1 && slot == 0 && subframe == 1 && aa==0) {
|
||||
//int32_t dmrs[ru->frame_parms.ofdm_symbol_size*14] __attribute__((aligned(32)));
|
||||
//int32_t *dmrsp[2] ={dmrs,NULL}; //{&dmrs[(3-ru->frame_parms.Ncp)*ru->frame_parms.ofdm_symbol_size],NULL};
|
||||
|
||||
generate_drs_pusch((PHY_VARS_UE *)NULL,
|
||||
(UE_rxtx_proc_t*)NULL,
|
||||
fp,
|
||||
ru->common.txdataF_BF,
|
||||
0,
|
||||
AMP,
|
||||
0,
|
||||
0,
|
||||
fp->N_RB_DL,
|
||||
aa);
|
||||
}
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
num_symb,
|
||||
fp);
|
||||
|
||||
|
||||
if (subframe_select(fp,subframe) == SF_S) num_symb=fp->dl_symbols_in_S_subframe+1;
|
||||
|
||||
if (ru->generate_dmrs_sync == 1 && slot == 0 && subframe == 1 && aa==0) {
|
||||
//int32_t dmrs[ru->frame_parms.ofdm_symbol_size*14] __attribute__((aligned(32)));
|
||||
//int32_t *dmrsp[2] ={dmrs,NULL}; //{&dmrs[(3-ru->frame_parms.Ncp)*ru->frame_parms.ofdm_symbol_size],NULL};
|
||||
|
||||
generate_drs_pusch((PHY_VARS_UE *)NULL,
|
||||
(UE_rxtx_proc_t*)NULL,
|
||||
fp,
|
||||
ru->common.txdataF_BF,
|
||||
0,
|
||||
AMP,
|
||||
0,
|
||||
0,
|
||||
fp->N_RB_DL,
|
||||
aa);
|
||||
}
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
num_symb,
|
||||
fp);
|
||||
}
|
||||
}
|
||||
/*
|
||||
len = fp->samples_per_tti>>1;
|
||||
@@ -210,6 +224,18 @@ void feptx_ofdm(RU_t *ru, L1_rxtx_proc_t* proc) {
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
if(is_pmch_subframe(ru->proc.frame_tx,subframe,fp)/*subframe==1*/){
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][0],
|
||||
dummy_tx_b,
|
||||
2,
|
||||
fp);
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][fp->ofdm_symbol_size*2],
|
||||
dummy_tx_b+((fp->ofdm_symbol_size>>2)*2+fp->ofdm_symbol_size*2),
|
||||
fp->ofdm_symbol_size,
|
||||
10,
|
||||
fp->ofdm_symbol_size>>2,
|
||||
CYCLIC_PREFIX);
|
||||
}else{
|
||||
normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F],
|
||||
dummy_tx_b,
|
||||
7,
|
||||
@@ -220,6 +246,7 @@ void feptx_ofdm(RU_t *ru, L1_rxtx_proc_t* proc) {
|
||||
dummy_tx_b+(fp->samples_per_tti>>1),
|
||||
7,
|
||||
fp);
|
||||
}
|
||||
}
|
||||
|
||||
// if S-subframe generate first slot only
|
||||
|
||||
Reference in New Issue
Block a user