diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index 0c41328f32c9aa2fa581563c30621ff11b99978f..d3157d5e822c8141b8ec9d24d26471c88aff3012 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -314,6 +314,8 @@ typedef struct RU_t_s{ int N_TA_offset; /// SF extension used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) int sf_extension; + /// "end of burst delay" used in TDD (unit: number of samples at 30.72MHz) (this is an expert option) + int end_of_burst_delay; /// RF device descriptor openair0_device rfdevice; /// HW configuration diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index edbb34461aae17d2ff48e1b1e93f9bce397b988a..b0fb97dac13a0a338a6a403e5b5938f32c5fa065 100644 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -102,6 +102,7 @@ typedef enum { #define CONFIG_STRING_RU_SDR_ADDRS "sdr_addrs" #define CONFIG_STRING_RU_SDR_CLK_SRC "clock_src" #define CONFIG_STRING_RU_SF_EXTENSION "sf_extension" +#define CONFIG_STRING_RU_END_OF_BURST_DELAY "end_of_burst_delay" #define RU_LOCAL_IF_NAME_IDX 0 #define RU_LOCAL_ADDRESS_IDX 1 @@ -124,6 +125,7 @@ typedef enum { #define RU_SDR_ADDRS 18 #define RU_SDR_CLK_SRC 19 #define RU_SF_EXTENSION_IDX 20 +#define RU_END_OF_BURST_DELAY_IDX 21 @@ -153,6 +155,7 @@ typedef enum { {CONFIG_STRING_RU_SDR_ADDRS, NULL, 0, strptr:NULL, defstrval:"type=b200", TYPE_STRING, 0}, \ {CONFIG_STRING_RU_SDR_CLK_SRC, NULL, 0, strptr:NULL, defstrval:"internal", TYPE_STRING, 0}, \ {CONFIG_STRING_RU_SF_EXTENSION, NULL, 0, uptr:NULL, defuintval:312, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_END_OF_BURST_DELAY, NULL, 0, uptr:NULL, defuintval:400, TYPE_UINT, 0}, \ } /*---------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index cedd0be270035259b9fbb3c8a67edeb2a83ad167..d4c53441d64bf267f303eadf24bff417485abf3c 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -825,8 +825,16 @@ void tx_rf(RU_t *ru) { int siglen=fp->samples_per_tti,flags=1; if (SF_type == SF_S) { + /* end_of_burst_delay is used to stop TX only "after a while". + * If we stop right after effective signal, with USRP B210 and + * B200mini, we observe a high EVM on the S subframe (on the + * PSS). + * A value of 400 (for 30.72MHz) solves this issue. This is + * the default. + */ siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) - + (fp->dl_symbols_in_S_subframe - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + + (fp->dl_symbols_in_S_subframe - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples) + + ru->end_of_burst_delay; flags=3; // end of burst } @@ -1379,12 +1387,20 @@ int setup_RU_buffers(RU_t *ru) { ru->N_TA_offset = 0; if (frame_parms->N_RB_DL == 100) /* no scaling to do */; - else if (frame_parms->N_RB_DL == 50) ru->sf_extension /= 2; - else if (frame_parms->N_RB_DL == 25) ru->sf_extension /= 4; - else { printf("not handled, todo\n"); exit(1); } + else if (frame_parms->N_RB_DL == 50) { + ru->sf_extension /= 2; + ru->end_of_burst_delay /= 2; + } else if (frame_parms->N_RB_DL == 25) { + ru->sf_extension /= 4; + ru->end_of_burst_delay /= 4; + } else { + printf("not handled, todo\n"); + exit(1); + } } else { ru->N_TA_offset = 0; ru->sf_extension = 0; + ru->end_of_burst_delay = 0; } if (ru->openair0_cfg.mmapped_dma == 1) { @@ -2884,6 +2900,7 @@ void RCconfig_RU(void) { RC.ru[j]->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt; /* sf_extension is in unit of samples for 30.72MHz here, has to be scaled later */ RC.ru[j]->sf_extension = *(RUParamList.paramarray[j][RU_SF_EXTENSION_IDX].uptr); + RC.ru[j]->end_of_burst_delay = *(RUParamList.paramarray[j][RU_END_OF_BURST_DELAY_IDX].uptr); for (i=0; i<RC.ru[j]->num_bands; i++) RC.ru[j]->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i]; } //strcmp(local_rf, "yes") == 0