phy_procedures_nr_gNB.c 4.77 KB
Newer Older
Guy De Souza's avatar
Guy De Souza committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

22
#include "PHY/extern.h"
Guy De Souza's avatar
Guy De Souza committed
23 24
#include "SCHED/defs.h"
#include "SCHED/extern.h"
25
#include "nfapi_interface.h"
Guy De Souza's avatar
Guy De Souza committed
26
#include "SCHED/fapi_l1.h"
Guy De Souza's avatar
Guy De Souza committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"

#include "T.h"

#include "assertions.h"
#include "msc.h"

#include <time.h>

#if defined(ENABLE_ITTI)
#   include "intertask_interface.h"
#endif

Guy De Souza's avatar
Guy De Souza committed
41
extern uint8_t nfapi_mode;
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
/*
int return_ssb_type(nfapi_config_request_t *cfg)
{
  int mu = cfg->subframe_config.numerology_index_mu.value;
  nr_numerology_index_e ssb_type;

  switch(mu) {

  case NR_MU_0:
    ssb_type = nr_ssb_type_A;
    break;

  case NR_MU_1:
    ssb_type = nr_ssb_type_B;
    break;

  case NR_MU_3:
    ssb_type = nr_ssb_type_D;
    break;

  case NR_MU_4:
    ssb_type = nr_ssb_type_E;
    break;

  default:
    AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
  }

  LOG_D(PHY, "SSB type %d\n", ssb_type);
  return ssb_type;

}*/

// First SSB starting symbol candidate is used and type B is chosen for 30kHz SCS
int nr_get_ssb_start_symbol(nfapi_config_request_t *cfg, NR_DL_FRAME_PARMS *fp)
{
  int mu = cfg->subframe_config.numerology_index_mu.value;
  int symbol = 0;

  switch(mu) {

  case NR_MU_0:
    symbol = 2;
    break;

  case NR_MU_1: // case B
    symbol = 4;
    break;

  case NR_MU_3:
    symbol = 4;
    break;

  case NR_MU_4:
    symbol = 8;
    break;

  default:
    AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
  }

  if (cfg->sch_config.half_frame_index.value)
    symbol += (5 * fp->symbols_per_slot * fp->slots_per_subframe);

  return symbol;
}

void nr_set_ssb_first_subcarrier(nfapi_config_request_t *cfg, NR_DL_FRAME_PARMS *fp)
{
  int start_rb = cfg->sch_config.n_ssb_crb.value / pow(2,cfg->subframe_config.numerology_index_mu.value);
  fp->ssb_start_subcarrier = 12 * start_rb + cfg->sch_config.ssb_subcarrier_offset.value;
  LOG_D(PHY, "SSB first subcarrier %d\n", fp->ssb_start_subcarrier);
}
Guy De Souza's avatar
Guy De Souza committed
115 116 117

void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) {

Guy De Souza's avatar
Guy De Souza committed
118
  NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
Guy De Souza's avatar
Guy De Souza committed
119
  nfapi_config_request_t *cfg = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
120 121
  int **txdataF = gNB->common_vars.txdataF;
  uint8_t *pbch_pdu=&gNB->pbch_pdu[0];
Guy De Souza's avatar
Guy De Souza committed
122
  int ss_subframe = (cfg->sch_config.half_frame_index.value)? 5 : 0;
Guy De Souza's avatar
Guy De Souza committed
123

Guy De Souza's avatar
Guy De Souza committed
124
  LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe);
125 126

  int ssb_start_symbol = nr_get_ssb_start_symbol(cfg, fp);
Guy De Souza's avatar
Guy De Souza committed
127
  nr_set_ssb_first_subcarrier(cfg, fp);
128

Guy De Souza's avatar
Guy De Souza committed
129
  if (subframe == ss_subframe)
130
  {
Guy De Souza's avatar
Guy De Souza committed
131
    LOG_I(PHY,"SS TX: frame %d, subframe %d, start_symbol %d\n",frame,subframe, ssb_start_symbol);
132 133 134
    nr_generate_pss(gNB->d_pss, txdataF, AMP, ssb_start_symbol, cfg, fp);
    nr_generate_sss(gNB->d_sss, txdataF, AMP_OVER_2, ssb_start_symbol, cfg, fp);
  }
Guy De Souza's avatar
Guy De Souza committed
135 136 137 138 139 140 141 142 143 144 145 146

}

void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
			   gNB_rxtx_proc_t *proc,
			   int do_meas)
{
  int aa;
  int frame=proc->frame_tx;
  int subframe=proc->subframe_tx;

  NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
Guy De Souza's avatar
Guy De Souza committed
147
  nfapi_config_request_t *cfg = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
148 149 150 151 152

  int offset = gNB->CC_id;

  if ((cfg->subframe_config.duplex_mode.value == TDD) && (nr_subframe_select(cfg,subframe)==SF_UL)) return;

153 154
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
  if (do_meas==1) start_meas(&gNB->phy_proc_tx);
Guy De Souza's avatar
Guy De Souza committed
155 156 157 158 159 160 161 162

  // clear the transmit data array for the current subframe
  for (aa=0; aa<cfg->rf_config.tx_antenna_ports.value; aa++) {      
    memset(&gNB->common_vars.txdataF[aa][subframe*fp->samples_per_subframe_wCP],
	   0,fp->samples_per_subframe_wCP*sizeof(int32_t));
  }

  if (nfapi_mode == 0 || nfapi_mode == 1) {
Guy De Souza's avatar
Guy De Souza committed
163
    nr_common_signal_procedures(gNB,frame, subframe);
Guy De Souza's avatar
Guy De Souza committed
164 165
    //if (frame == 9)
      //write_output("txdataF.m","txdataF",gNB->common_vars.txdataF[aa],fp->samples_per_frame_wCP, 1, 1);
Guy De Souza's avatar
Guy De Souza committed
166
  }
Guy De Souza's avatar
Guy De Souza committed
167
}