Commit 2646250f authored by Raymond Knopp's avatar Raymond Knopp

Merge branch 'l1-sidelink' of https://gitlab.eurecom.fr/matzakos/LTE-D2D into l1-sidelink

parents a504d7b2 937bf760
......@@ -58,7 +58,7 @@ int initial_syncSL(PHY_VARS_UE *ue) {
rx_slsss(ue,&sss_metric,&phase_max,index);
generate_sl_grouphop(ue);
if (rx_psbch(ue) == -1) {
if (rx_psbch(ue,0,0) == -1) {
ue->slbch_errors++;
LOG_I(PHY,"PBCH not decoded\n");
/*
......@@ -82,6 +82,10 @@ int initial_syncSL(PHY_VARS_UE *ue) {
&frame,
&subframe);
for (int i=0;i<RX_NB_TH;i++){
ue->proc.proc_rxtx[i].frame_rx = frame;
ue->proc.proc_rxtx[i].subframe_rx = subframe;
}
LOG_I(PHY,"RRC returns MIB-SL for frame %d, subframe %d\n",frame,subframe);
return(0);
}
......
......@@ -2356,7 +2356,7 @@ int generate_slbch(int32_t **txdataF,
int subframe,
uint8_t *slmib);
int rx_psbch(PHY_VARS_UE *ue);
int rx_psbch(PHY_VARS_UE *ue,int frame_rx,int subframe_rx);
/**@}*/
#endif
......@@ -19,13 +19,13 @@
* contact@openairinterface.org
*/
/*! \file PHY/LTE_TRANSPORT/pss.c
* \brief Top-level routines for generating primary synchronization signal (PSS) V8.6 2009-03
* \author F. Kaltenberger, O. Tonelli, R. Knopp
/*! \file PHY/LTE_TRANSPORT/slbch.c
* \brief Top-level routines for transmitting and receiving the sidelink broadcast channel
* \author R. Knopp
* \date 2011
* \version 0.1
* \company Eurecom
* \email: florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it,knopp@eurecom.fr
* \email: knopp@eurecom.fr
* \note
* \warning
*/
......@@ -129,7 +129,7 @@ int generate_slbch(int32_t **txdataF,
return(0);
}
int rx_psbch(PHY_VARS_UE *ue) {
int rx_psbch(PHY_VARS_UE *ue,int frame_rx,int subframe_rx) {
int16_t **rxdataF = ue->sl_rxdataF;
......@@ -153,7 +153,22 @@ int rx_psbch(PHY_VARS_UE *ue) {
ru_tmp.common.rxdataF = (int32_t**)rxdataF;
ru_tmp.nb_rx = ue->frame_parms.nb_antennas_rx;
LOG_I(PHY,"Running PBCH detection with Nid_SL %d\n",ue->frame_parms.Nid_SL);
if (ue->is_synchronizedSL == 1) { // Run front-end processing
ru_tmp.common.rxdata = (int32_t**)malloc16(ue->frame_parms.nb_antennas_rx*sizeof(int32_t*));
for (int aa=0;aa<ue->frame_parms.nb_antennas_rx;aa++) {
ru_tmp.common.rxdata[aa] = (int32_t*)&ue->common_vars.rxdata[aa][0];
}
remove_7_5_kHz(&ru_tmp,0);
remove_7_5_kHz(&ru_tmp,1);
free(ru_tmp.common.rxdata);
}
LOG_I(PHY,"Running PBCH detection with Nid_SL %d (is_synchronizedSL %d) rxdata %p\n",ue->frame_parms.Nid_SL,ue->is_synchronizedSL,ue->common_vars.rxdata[0]);
for (int l=0; l<11; l++) {
slot_fep_ul(&ru_tmp,l%7,(l>6)?1:0,0);
......@@ -166,8 +181,10 @@ int rx_psbch(PHY_VARS_UE *ue) {
&ue->frame_parms);
if (l==0) l+=2;
}
free(ru_tmp.common.rxdata_7_5kHz);
#ifdef PSBCH_DEBUG
if (ue->frame_parms.Nid_SL==170) {
if (ue->is_synchronizedSL == 1 && ue->frame_parms.Nid_SL==170) {
write_output("slbch.m","slbchrx",ue->common_vars.rxdata[0],ue->frame_parms.samples_per_tti,1,1);
write_output("slbch_rxF.m",
"slbchrxF",
&rxdataF[0][0],
......@@ -210,7 +227,7 @@ int rx_psbch(PHY_VARS_UE *ue) {
2);
#ifdef PSBCH_DEBUG
if (ue->frame_parms.Nid_SL == 170) write_output("drsbch_est0.m","drsbchest0",drs_ch_estimates[0],ue->frame_parms.N_RB_UL*12*14,1,1);
if (ue->is_synchronizedSL == 1 && ue->frame_parms.Nid_SL == 170) write_output("drsbch_est0.m","drsbchest0",drs_ch_estimates[0],ue->frame_parms.N_RB_UL*12*14,1,1);
#endif
avgs = 0;
......@@ -319,7 +336,7 @@ int rx_psbch(PHY_VARS_UE *ue) {
for (int i=0; i<(PSBCH_A>>3); i++)
decoded_output[(PSBCH_A>>3)-i-1] = slbch_a[i];
LOG_I(PHY,"SLBCH : %x.%x.%x.%x.%x\n",decoded_output[0],decoded_output[1],decoded_output[2],decoded_output[3],decoded_output[4]);
LOG_I(PHY,"SFN.SF %d.%d SLBCH : %x.%x.%x.%x.%x\n",frame_rx,subframe_rx,decoded_output[0],decoded_output[1],decoded_output[2],decoded_output[3],decoded_output[4]);
#ifdef DEBUG_PSBCH
LOG_I(PHY,"PSBCH CRC %x : %x\n",
......@@ -330,7 +347,26 @@ int rx_psbch(PHY_VARS_UE *ue) {
uint16_t crc = (crc16(slbch_a,PSBCH_A)>>16) ^
(((uint16_t)slbch_a[PSBCH_A>>3]<<8)+slbch_a[(PSBCH_A>>3)+1]);
if (crc>0) return(-1);
else return(0);
if (crc>0) {
LOG_I(PHY,"SLBCH not received in %d.%d\n", frame_rx,subframe_rx);
return(-1);
}
else {
SLSS_t dummy_slss;
int testframe;
int testsubframe;
ue_decode_si(ue->Mod_id,
0, // CC_id
0, // frame
0, // eNB_index
NULL, // pdu, NULL for MIB-SL
0, // len, 0 for MIB-SL
&ue->slss_rx,
&testframe,
&testsubframe);
AssertFatal(testframe!=frame_rx || testsubframe!=subframe_rx,
"SFN.SF %d.%d != %d.%d\n",testframe,testsubframe,frame_rx,subframe_rx);
return(0);
}
}
......@@ -19,7 +19,7 @@
* contact@openairinterface.org
*/
/*! \file PHY/LTE_TRANSPORT/slss.c
/*! \file PHY/LTE_TRANSPORT/sldch.c
* \brief Functions to Generate and Receive PSDCH
* \author R. Knopp
* \date 2017
......@@ -37,13 +37,13 @@
void sldch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subframe_rx,int npsdch,int nprb,int rvidx) {
int Nsymb = 7;
SLDCH_t *sldch = &ue->sldch;
int16_t **rxdataF_ext = ue->pusch_sldch->rxdataF_ext;
int16_t **drs_ch_estimates = ue->pusch_sldch->drs_ch_estimates;
int16_t **rxdataF_comp = ue->pusch_sldch->rxdataF_comp;
int16_t **ul_ch_mag = ue->pusch_sldch->ul_ch_mag;
int16_t **rxdata_7_5kHz = ue->sl_rxdata_7_5kHz;
int16_t **rxdataF = ue->sl_rxdataF;
SLDCH_t *sldch = ue->sldch;
int16_t **rxdataF_ext = (int16_t**)ue->pusch_sldch->rxdataF_ext;
int16_t **drs_ch_estimates = (int16_t**)ue->pusch_sldch->drs_ch_estimates;
int16_t **rxdataF_comp = (int16_t**)ue->pusch_sldch->rxdataF_comp;
int16_t **ul_ch_mag = (int16_t**)ue->pusch_sldch->ul_ch_mag;
int16_t **rxdata_7_5kHz = (int16_t**)ue->sl_rxdata_7_5kHz;
int16_t **rxdataF = (int16_t**)ue->sl_rxdataF;
int32_t avgs;
uint8_t log2_maxh=0;
int32_t avgU[2];
......@@ -484,16 +484,12 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
AssertFatal(sldch!=NULL,"ue->sldch is null\n");
AssertFatal(ue->sldch_sdu_active > 0,"ue->sldch_sdu_active isn't active\n");
int mcs = 8;
LOG_I(PHY,"Generating SLDCH for rvidx %d, npsdch %d, first rb %d\n",
rvidx,sldch->n_psdch,nprb);
ue->sldch_sdu_active = 1;
dlsch->harq_processes[0]->nb_rb = 2;
dlsch->harq_processes[0]->TBS = 256;
......@@ -507,6 +503,7 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
dlsch->harq_processes[0]->round = sldch->j;
dlsch->harq_processes[0]->rvidx = rvidx;
LOG_I(PHY,"SLDCH dlsch encoding\n");
dlsch_encoding0(&ue->frame_parms,
sldch->payload,
0, // means SL
......@@ -517,6 +514,7 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
&ue->ulsch_turbo_encoding_stats,
&ue->ulsch_interleaving_stats);
LOG_I(PHY,"SLDCH interleaving\n");
int Cmux = (Nsymb-1)<<1;
uint8_t *eptr;
for (int i=0,j=0; i<Cmux; i++)
......@@ -539,7 +537,7 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
}
}
LOG_I(PHY,"SLDCH scrambling\n");
// scrambling
uint32_t cinit=510;
......@@ -567,7 +565,8 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
0,
ue->frame_parms.ofdm_symbol_size*ue->frame_parms.symbols_per_tti*sizeof(int32_t));
}
LOG_I(PHY,"SLDCH Modulation\n");
ulsch_modulation(ue->common_vars.txdataF,
tx_amp,
frame_tx,
......@@ -576,6 +575,8 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
ulsch,
1,
cinit);
LOG_I(PHY,"SLDCH DMRS\n");
generate_drs_pusch(ue,
NULL,
0,
......@@ -587,9 +588,9 @@ void sldch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,int npr
NULL,
0);
ue->generate_ul_signal[subframe_tx][0] = 0;
ue->generate_ul_signal[subframe_tx][0] = 1;
LOG_I(PHY,"SLDCH generated\n");
}
void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
......@@ -604,6 +605,7 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
uint32_t absSF = (frame_tx*10)+subframe_tx;
uint32_t absSF_offset,absSF_modP;
absSF_offset = absSF-O;
if (absSF_offset < O) return;
......@@ -613,6 +615,8 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
absSF_modP = absSF_offset%P;
uint64_t SFpos = ((uint64_t)1) << absSF_modP;
LOG_D(PHY,"SLDCH: SFN.SF %d.%d : absSF_modP %d, bitmap1 %x\n",frame_tx,subframe_tx,absSF_modP,sldch->bitmap1);
if ((SFpos & sldch->bitmap1) == 0) return;
// if we get here, then this is a potential PSDCH subframe
......@@ -638,11 +642,13 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
int N_TX_SLD = 1+sldch->numRepetitions;
uint32_t M_RB_PSDCH_RP = sldch->N_SL_RB;
unsigned int Ni,Nf;
if (sldch->type == disc_type1) {
int Ni = LPSDCH/N_TX_SLD;
int Nf = M_RB_PSDCH_RP>>1;
Ni = LPSDCH/N_TX_SLD;
Nf = M_RB_PSDCH_RP>>1;
sldch->n_psdch = taus()%(Ni*Nf);
int a_ji = (((sldch->j-1)*(Nf/N_TX_SLD)) + (sldch->n_psdch/Ni))%Nf;
int b_1i = sldch->n_psdch%Ni;
if (absSF_modP != ((b_1i*N_TX_SLD)+sldch->j-1)) return;
......@@ -657,6 +663,7 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
if (nprb < sldch->N_SL_RB) nprb+=sldch->prb_Start;
else nprb+=(sldch->prb_End-(sldch->N_SL_RB>>1));
LOG_I(PHY,"Generating SLDCH in SFN.SF %d.%d (O %d, P %d, n_psdch %d, Nf %d, Ni %d) \n",frame_tx,subframe_tx,O,P,sldch->n_psdch,Nf,Ni);
sldch_codingmodulation(ue,frame_tx,subframe_tx,nprb,rvidx);
ue->psdch_generated=1;
}
......@@ -47,7 +47,9 @@ void check_and_generate_slss(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
LOG_D(PHY,"check_and_generate_slss: frame_tx %d, subframe_tx %d : slss->SL_offsetIndicator %d, slss->slmib_length %d\n",
frame_tx,subframe_tx,slss->SL_OffsetIndicator, slss->slmib_length);
if (ue->is_SynchRef == 0) return;
if ((((10*frame_tx) + subframe_tx)%40) != slss->SL_OffsetIndicator) return;
if (slss->slmib_length == 0) return;
......
......@@ -1412,6 +1412,7 @@ typedef struct {
unsigned char first_run_timing_advance[NUMBER_OF_CONNECTED_eNB_MAX];
uint8_t sidelink_active;
uint8_t SLonly;
uint8_t SLsynconly;
uint8_t destination_id;
// DMRS group-hopping sequences for PSBCH (index 0) and 256 possible PSSCH (indices 1...256)
uint32_t gh[257][20];
......
......@@ -2373,22 +2373,25 @@ void phy_procedures_UE_SL_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc) {
// check for SLBCH/SLSS
AssertFatal(0==pthread_mutex_lock(&ue->slss_mutex),"");
if ((ue->slss = ue_get_slss(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) check_and_generate_slss(ue,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->slss_mutex),"");
if (ue->is_SynchRef) {
AssertFatal(0==pthread_mutex_lock(&ue->slss_mutex),"");
if ((ue->slss = ue_get_slss(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) check_and_generate_slss(ue,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->slss_mutex),"");
}
// check for SLDCH
/*
AssertFatal(0==pthread_mutex_lock(&ue->sldch_mutex),"");
if ((ue->sldch = ue_get_sldch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_sldch(ue,ue->sldch,frame_tx,subframe_tx);
if ((ue->sldch = ue_get_sldch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) check_and_generate_psdch(ue,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->sldch_mutex),"");
LOG_D(PHY,"ULSCH (after sldch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
*/
//LOG_D(PHY,"ULSCH (after sldch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
// check for SLSCH
AssertFatal(0==pthread_mutex_lock(&ue->slsch_mutex),"");
if ((ue->slsch = ue_get_slsch(ue->Mod_id,ue->CC_id,frame_tx,subframe_tx)) != NULL) generate_slsch(ue,proc,ue->slsch,frame_tx,subframe_tx);
AssertFatal(0==pthread_mutex_unlock(&ue->slsch_mutex),"");
LOG_D(PHY,"ULSCH (after slsch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
//LOG_D(PHY,"ULSCH (after slsch) : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
LOG_D(PHY,"****** end Sidelink TX-Chain for AbsSubframe %d.%d (ul %d) ******\n", frame_tx, subframe_tx,
ue->generate_ul_signal[subframe_tx][0]);
......@@ -2396,7 +2399,7 @@ void phy_procedures_UE_SL_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc) {
LOG_D(PHY,"ULSCH : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
// LOG_D(PHY,"ULSCH : signal F energy %d dB (txdataF %p)\n",dB_fixed(signal_energy(&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size],14*ue->frame_parms.ofdm_symbol_size)),&ue->common_vars.txdataF[0][subframe_tx*14*ue->frame_parms.ofdm_symbol_size]);
ulsch_common_procedures(ue,frame_tx,subframe_tx, (ue->generate_ul_signal[subframe_tx][0] == 0));
......@@ -4785,6 +4788,13 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr
void phy_procedures_UE_SL_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc) {
int frame_rx = proc->frame_rx;
int subframe_rx = proc->subframe_rx;
LOG_D(PHY,"SFN.SF %d.%d Running Steady-state SL UE procedures\n",frame_rx,subframe_rx);
if ((frame_rx&3) == 0 && subframe_rx == 0) rx_psbch(ue,frame_rx,subframe_rx);
}
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
......@@ -668,9 +667,82 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
"PSCCH bitmap limited to 42 bits\n");
UE_mac_inst[Mod_idP].slsch.SubframeBitmapSL_length = SubframeBitmapSL[preconfigpool->sc_TF_ResourceConfig_r12.subframeBitmap_r12.present];
UE_mac_inst[Mod_idP].slsch.bitmap1 = *((uint64_t*)preconfigpool->sc_TF_ResourceConfig_r12.subframeBitmap_r12.choice.bs40_r12.buf);
AssertFatal(SL_Preconfiguration_r12->ext1!=NULL,"there is no Rel13 extension in SL preconfiguration\n");
AssertFatal(SL_Preconfiguration_r12->ext1->preconfigDisc_r13!=NULL,"there is no SL discovery configuration\n");
AssertFatal(SL_Preconfiguration_r12->ext1->preconfigDisc_r13->discRxPoolList_r13.list.count==1,"Discover RX pool list count %d != 1\n",
SL_Preconfiguration_r12->ext1->preconfigDisc_r13->discRxPoolList_r13.list.count);
SL_PreconfigDiscPool_r13_t *discrxpool=SL_Preconfiguration_r12->ext1->preconfigDisc_r13->discRxPoolList_r13.list.array[0];
/// Discovery Type
UE_mac_inst[Mod_idP].sldch.type = disc_type1;
/// Number of SL resource blocks (1-100)
UE_mac_inst[Mod_idP].sldch.N_SL_RB = discrxpool->tf_ResourceConfig_r13.prb_Num_r12;
/// prb-start (0-99)
UE_mac_inst[Mod_idP].sldch.prb_Start= discrxpool->tf_ResourceConfig_r13.prb_Start_r12;
/// prb-End (0-99)
UE_mac_inst[Mod_idP].sldch.prb_End = discrxpool->tf_ResourceConfig_r13.prb_End_r12;
/// SL-OffsetIndicator (0-10239)
AssertFatal(discrxpool->tf_ResourceConfig_r13.offsetIndicator_r12.present == SL_OffsetIndicator_r12_PR_small_r12,
"offsetIndicator_r12 is not PR_small_r12\n");
UE_mac_inst[Mod_idP].sldch.offsetIndicator = discrxpool->tf_ResourceConfig_r13.offsetIndicator_r12.choice.small_r12 ;
AssertFatal(discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.present > SubframeBitmapSL_r12_PR_NOTHING &&
discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.present <= SubframeBitmapSL_r12_PR_bs42_r12,
"illegal subframeBitmap %d\n",discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.present);
/// PSDCH subframe bitmap (up to 100 bits, first 64)
switch (discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.present) {
case SubframeBitmapSL_r12_PR_NOTHING:
AssertFatal(1==0,"Should never get here\n");
break;
case SubframeBitmapSL_r12_PR_bs4_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs4_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 4;
break;
case SubframeBitmapSL_r12_PR_bs8_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs8_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 9;
break;
case SubframeBitmapSL_r12_PR_bs12_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs12_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 12;
break;
case SubframeBitmapSL_r12_PR_bs16_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs16_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 16;
break;
case SubframeBitmapSL_r12_PR_bs30_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs30_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 30;
break;
case SubframeBitmapSL_r12_PR_bs40_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs40_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 40;
break;
case SubframeBitmapSL_r12_PR_bs42_r12:
UE_mac_inst[Mod_idP].sldch.bitmap1 = *(uint64_t*)discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs42_r12.buf;
UE_mac_inst[Mod_idP].sldch.bitmap_length = 42;
break;
}
/// PSDCH subframe bitmap (up to 100 bits, second 36)
UE_mac_inst[Mod_idP].sldch.bitmap2 = 0;
/// SL-Discovery Period
AssertFatal(SL_PreconfigDiscPool_r13__discPeriod_r13_spare == 15, "specifications have changed, update table\n");
int sldisc_period[SL_PreconfigDiscPool_r13__discPeriod_r13_spare] = {4,6,7,8,12,14,16,24,28,32,64,128,256,512,1024};
UE_mac_inst[Mod_idP].sldch.discPeriod = sldisc_period[discrxpool->discPeriod_r13];
/// Number of Repetitions (N_R)
UE_mac_inst[Mod_idP].sldch.numRepetitions = discrxpool->numRepetition_r13;
/// Number of retransmissions (numRetx-r12)
UE_mac_inst[Mod_idP].sldch.numRetx = discrxpool->numRetx_r13;
}
if (directFrameNumber_r12<1025) UE_mac_inst[Mod_idP].directFrameNumber_r12 = directFrameNumber_r12;
if (directSubframeNumber_r12<11) UE_mac_inst[Mod_idP].directSubframeNumber_r12 = directSubframeNumber_r12;
if (sl_Bandwidth_r12) UE_mac_inst[Mod_idP].sl_Bandwidth_r12 = *sl_Bandwidth_r12;
#endif
......@@ -679,3 +751,4 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
return (0);
}
......@@ -3192,12 +3192,11 @@ SLDCH_t *ue_get_sldch(module_id_t Mod_id,int CC_id,frame_t frame_tx,sub_frame_t
0, //eNB_indexP
0);
if (sldch->payload_length >0 ) {
LOG_I(MAC,"Got %d bytes from RRC for SLDCH @ %p\n",sldch->payload_length,sldch);
LOG_D(MAC,"Got %d bytes from RRC for SLDCH @ %p\n",sldch->payload_length,sldch);
return (sldch);
}
else
return((SLDCH_t*)NULL);
}
......
......@@ -135,6 +135,13 @@ mac_rrc_data_req_ue(
UE_rrc_inst[Mod_idP].SL_Discovery[eNB_indexP].Tx_buffer.payload_size = 0;
return(Ret_size);
}
else if (Srb_idP == SL_DISCOVERY) {
LOG_D(RRC,"[UE %d] Frame %d Filling DUMMY SL DISCOVERY SRB_ID %d\n",Mod_idP,frameP,Srb_idP);
for (int i=0;i<29;i++) buffer_pP[i] = i;
LOG_D(RRC,"[UE %d] Sending SL_Discovery, size %d bytes\n",Mod_idP,29);
return(29);
}
#endif
return(0);
......
......@@ -376,7 +376,7 @@ void init_SL_preconfig(UE_RRC_INST *UE, const uint8_t eNB_index )
discrxpool->tf_ResourceConfig_r13.prb_Start_r12 = 15;
discrxpool->tf_ResourceConfig_r13.prb_End_r12 = 34;
discrxpool->tf_ResourceConfig_r13.offsetIndicator_r12.present = SL_OffsetIndicator_r12_PR_small_r12;
discrxpool->tf_ResourceConfig_r13.offsetIndicator_r12.choice.small_r12 = 0;
discrxpool->tf_ResourceConfig_r13.offsetIndicator_r12.choice.small_r12 = 1;
discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.present = SubframeBitmapSL_r12_PR_bs16_r12;
discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs16_r12.buf = CALLOC(1,2);
discrxpool->tf_ResourceConfig_r13.subframeBitmap_r12.choice.bs16_r12.buf[0] = 0xFF;
......
......@@ -79,6 +79,7 @@
#define CONFIG_HLP_ENABLESL "Enable SL functionality"
#define CONFIG_HLP_SLONLY "Use SL only (i.e. wire UE to off-network state)"
#define CONFIG_HLP_SYNCHREF "Hard-wire UE as SynchRef UE for SL"
#define CONFIG_HLP_SLSYNCONLY "Run UE with only searching procedure for SynchREF"
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
#define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n"
#define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
......@@ -139,6 +140,7 @@
{"ue-enable-sl", CONFIG_HLP_ENABLESL, PARAMFLAG_BOOL, iptr:&sidelink_active, defintval:0, TYPE_INT, 0}, \
{"ue-sl-only", CONFIG_HLP_SLONLY, PARAMFLAG_BOOL, iptr:&SLonly, defintval:0, TYPE_INT, 0}, \
{"ue-synchref", CONFIG_HLP_SYNCHREF, PARAMFLAG_BOOL, iptr:&synchRef, defintval:0, TYPE_INT, 0}, \
{"ue-slsync-only", CONFIG_HLP_SLSYNCONLY, PARAMFLAG_BOOL, iptr:&slsynconly, defintval:0, TYPE_INT, 0}, \
{"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \
}
......@@ -265,7 +267,7 @@ extern void set_function_spec_param(RU_t *ru);
extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
extern void fill_ue_band_info(void);
extern void init_UE(int,int,int,int,int,int,int);
extern void init_UE(int,int,int,int,int,int,int,int);
extern void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name);
extern void reset_opp_meas(void);
......
......@@ -80,7 +80,7 @@ void *UE_thread(void *arg);
void *UE_threadSL(void *arg);
void init_UE_stub(int nb_inst,int,int,char*,int);
void ue_stub_rx_handler(unsigned int, char *);
void init_UE(int,int,int,int,int,int,int);
void init_UE(int,int,int,int,int,int,int,int);
int32_t **rxdata;
int32_t **txdata;
......@@ -223,7 +223,7 @@ void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_
}
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction,int sidelink_active,int SLonly,int isSynchRef) {
void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correction,int sidelink_active,int SLonly,int isSynchRef,int slsynconly) {
PHY_VARS_UE *UE;
int inst;
......@@ -245,6 +245,7 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
PHY_vars_UE_g[inst][0]->SLonly = SLonly;
PHY_vars_UE_g[inst][0]->is_SynchRef = isSynchRef;
PHY_vars_UE_g[inst][0]->SLsynconly;
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
init_UE_threads(inst);
......@@ -721,10 +722,10 @@ static void *UE_thread_synchSL(void *arg)
freq_offset=0;
}
}
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
//UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
//UE->rfdevice.trx_stop_func(&UE->rfdevice);
sleep(1);
//sleep(1);
if (UE->UE_scan_carrier == 1) {
UE->UE_scan_carrier = 0;
......@@ -759,12 +760,12 @@ static void *UE_thread_synchSL(void *arg)
openair0_cfg[UE->rf_map.card].autocal[UE->rf_map.chain+i] = 1;
}
LOG_I(PHY,"Setting USRP freq to %f\n",openair0_cfg[UE->rf_map.card].rx_freq[0]);
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
//UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
}
AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synchSL), "");
UE->proc.instance_cnt_synchSL--;
// Remove this to go to steady-state mode
UE->is_synchronizedSL=0;
if (UE->SLsynconly==1) UE->is_synchronizedSL=0;
AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synchSL), "");
}
}
......@@ -1569,11 +1570,13 @@ void init_UE_threads(int inst) {
pthread_mutex_init(&UE->proc.mutex_synch,NULL);
pthread_cond_init(&UE->proc.cond_synch,NULL);
pthread_attr_init (&UE->proc.attr_ueSL);
pthread_attr_setstacksize(&UE->proc.attr_ueSL,8192);//5*PTHREAD_STACK_MIN);
if (UE->sidelink_active == 1) {
pthread_attr_init (&UE->proc.attr_ueSL);
pthread_attr_setstacksize(&UE->proc.attr_ueSL,8192);//5*PTHREAD_STACK_MIN);
pthread_mutex_init(&UE->proc.mutex_synchSL,NULL);
pthread_cond_init(&UE->proc.cond_synchSL,NULL);
pthread_mutex_init(&UE->proc.mutex_synchSL,NULL);
pthread_cond_init(&UE->proc.cond_synchSL,NULL);
}
// the threads are not yet active, therefore access is allowed without locking
int nb_threads=RX_NB_TH;
......@@ -1720,7 +1723,7 @@ void *UE_threadSL(void *arg) {
AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0,"Could not start the device");
int subframe_delay=0;
while (!oai_exit) {
AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), "");
int instance_cnt_synch = UE->proc.instance_cnt_synchSL;
......@@ -1730,13 +1733,13 @@ void *UE_threadSL(void *arg) {
LOG_D(PHY,"UHD Thread SL (is_synchronized %d, is_SynchRef %d\n",
is_synchronized,UE->is_SynchRef);
if (is_synchronized == 0 && UE->is_SynchRef == 0) {
if (instance_cnt_synch < 0) { // we can invoke the synch
subframe_delay=0;
// grab 40 ms of signal and wakeup synch thread
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
rxp[i] = (void*)&UE->common_vars.rxdata_syncSL[i][0];
LOG_I(PHY,"Reading 40ms frame for initial synch\n");
AssertFatal( UE->frame_parms.samples_per_tti*40 ==
UE->rfdevice.trx_read_func(&UE->rfdevice,
&timestamp,
......@@ -1757,13 +1760,13 @@ void *UE_threadSL(void *arg) {
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
rxp[i] = (void*)&dummy_rx[i][0];
for (int sf=0; sf<40; sf++)
// printf("Reading dummy sf %d\n",sf);
for (int sf=0; sf<40; sf++,subframe_delay++) {
UE->rfdevice.trx_read_func(&UE->rfdevice,
&timestamp,
rxp,
UE->frame_parms.samples_per_tti,
UE->frame_parms.nb_antennas_rx);
}
}
......@@ -1772,21 +1775,26 @@ void *UE_threadSL(void *arg) {
if (start_rx_stream==0 && UE->is_SynchRef == 0) {
start_rx_stream=1;
if (UE->no_timing_correction==0) {
LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offsetSL,UE->mode);
AssertFatal(UE->rx_offset ==
LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d), subframe_delay %d\n",UE->rx_offsetSL,UE->mode,subframe_delay);
AssertFatal(UE->rx_offsetSL ==
UE->rfdevice.trx_read_func(&UE->rfdevice,
&timestamp,
(void**)UE->common_vars.rxdata,
UE->rx_offset,
UE->rx_offsetSL,
UE->frame_parms.nb_antennas_rx),"");
/*
AssertFatal(UE->frame_parms.samples_per_tti*40 ==
UE->rfdevice.trx_read_func(&UE->rfdevice,
&timestamp,
(void**)UE->common_vars.rxdata_syncSL,
UE->frame_parms.samples_per_tti*40,
UE->frame_parms.nb_antennas_rx),"");
write_output("fourframes.m","frames4",UE->common_vars.rxdata_syncSL[0],UE->frame_parms.samples_per_tti*10,1,1);
exit(-1);*/
}
UE->rx_offsetSL=0;
UE->time_sync_cell=0;
//UE->proc.proc_rxtx[0].frame_rx++;
//UE->proc.proc_rxtx[1].frame_rx++;
for (th_id=0; th_id < RX_NB_TH; th_id++) {
UE->proc.proc_rxtx[th_id].frame_rx++;
}
for (int i=0;i<RX_NB_TH;i++) UE->proc.proc_rxtx[i].frame_rx=(UE->proc.proc_rxtx[i].frame_rx-1+(subframe_delay/10))&1023; // -1 because we increment frame_rx below in subframe=0
} else { // This is steady-state mode
sub_frame++;
sub_frame%=10;
......@@ -1802,9 +1810,7 @@ void *UE_threadSL(void *arg) {
for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+
UE->frame_parms.nb_prefix_samples0+
sub_frame*UE->frame_parms.samples_per_tti];
rxp[i] = (void*)&UE->common_vars.rxdata[i][sub_frame*UE->frame_parms.samples_per_tti];
for (i=0; i<UE->frame_parms.nb_antennas_tx; i++)
txp[i] = (void*)&UE->common_vars.txdata[i][((sub_frame+2)%10)*UE->frame_parms.samples_per_tti];
......@@ -1841,8 +1847,9 @@ void *UE_threadSL(void *arg) {
writeBlockSize=UE->frame_parms.samples_per_tti -UE->rx_offset_diff;
}
LOG_D(PHY,"reading rxp[0] %p (%p)\n",
rxp[0],UE->common_vars.rxdata[0]);
LOG_D(PHY,"reading rxp[0] %p (%p) : %d samples\n",
rxp[0],UE->common_vars.rxdata[0],
readBlockSize);
AssertFatal(readBlockSize ==
UE->rfdevice.trx_read_func(&UE->rfdevice,
&timestamp,
......@@ -1871,6 +1878,7 @@ void *UE_threadSL(void *arg) {
//UE->proc.proc_rxtx[1].frame_rx++;
for (th_id=0; th_id < RX_NB_TH; th_id++) {
UE->proc.proc_rxtx[th_id].frame_rx++;
UE->proc.proc_rxtx[th_id].frame_rx&=1023;
}
}
//UE->proc.proc_rxtx[0].gotIQs=readTime(gotIQs);
......
......@@ -160,6 +160,7 @@ char emul_iface[100];
int sidelink_active=0;
int SLonly=0;
int synchRef=0;
int slsynconly=0;
#if MAX_NUM_CCs == 1
rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
......@@ -1040,7 +1041,7 @@ int main( int argc, char **argv )
// start the main threads
int eMBMS_active = 0;
init_UE(1,eMBMS_active,uecap_xer_in,0,sidelink_active,SLonly,synchRef);
init_UE(1,eMBMS_active,uecap_xer_in,0,sidelink_active,SLonly,synchRef,slsynconly);
if (phy_test==0) {
printf("Filling UE band info\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment