phy_procedures_nr_gNB.c 6.63 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 23
#include "PHY/phy_extern.h"
#include "PHY/defs_gNB.h"
Guy De Souza's avatar
Guy De Souza committed
24
#include "sched_nr.h"
Guy De Souza's avatar
Guy De Souza committed
25
#include "PHY/NR_TRANSPORT/nr_transport.h"
Guy De Souza's avatar
Guy De Souza committed
26
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
27 28
#include "SCHED/sched_eNB.h"
#include "SCHED/sched_common_extern.h"
29
#include "nfapi_interface.h"
Guy De Souza's avatar
Guy De Souza committed
30
#include "SCHED/fapi_l1.h"
31 32
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
Guy De Souza's avatar
Guy De Souza committed
33 34 35 36 37 38 39 40 41

#include "T.h"

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

#include <time.h>

#if defined(ENABLE_ITTI)
42
  #include "intertask_interface.h"
Guy De Souza's avatar
Guy De Souza committed
43 44
#endif

Guy De Souza's avatar
Guy De Souza committed
45
extern uint8_t nfapi_mode;
46 47 48 49
/*
int return_ssb_type(nfapi_config_request_t *cfg)
{
  int mu = cfg->subframe_config.numerology_index_mu.value;
50
  nr_ssb_type_e ssb_type;
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

  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
80
int nr_get_ssb_start_symbol(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) {
81 82 83 84
  int mu = cfg->subframe_config.numerology_index_mu.value;
  int symbol = 0;

  switch(mu) {
85 86 87
    case NR_MU_0:
      symbol = 2;
      break;
88

89 90 91
    case NR_MU_1: // case B
      symbol = 4;
      break;
92

93 94 95
    case NR_MU_3:
      symbol = 4;
      break;
96

97 98 99
    case NR_MU_4:
      symbol = 8;
      break;
100

101 102
    default:
      AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
103 104 105 106 107 108 109 110
  }

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

  return symbol;
}

111
void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) {
112 113
  fp->ssb_start_subcarrier = (12 * cfg->sch_config.n_ssb_crb.value + cfg->sch_config.ssb_subcarrier_offset.value)/(1<<cfg->subframe_config.numerology_index_mu.value);
  LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->sch_config.n_ssb_crb.value,cfg->sch_config.ssb_subcarrier_offset.value);
114
}
Guy De Souza's avatar
Guy De Souza committed
115

116
void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
Guy De Souza's avatar
Guy De Souza committed
117
  NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
ChenWeiTai's avatar
ChenWeiTai committed
118
  nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
119 120
  int **txdataF = gNB->common_vars.txdataF;
  uint8_t *pbch_pdu=&gNB->pbch_pdu[0];
121
  int ss_slot = (cfg->sch_config.half_frame_index.value)? 10 : 0;
Guy De Souza's avatar
Guy De Souza committed
122
  uint8_t Lmax, ssb_index=0, n_hf=0;
123
  LOG_D(PHY,"common_signal_procedures: frame %d, slot %d\n",frame,slot);
124
  int ssb_start_symbol = nr_get_ssb_start_symbol(cfg, fp);
Guy De Souza's avatar
Guy De Souza committed
125
  nr_set_ssb_first_subcarrier(cfg, fp);
Guy De Souza's avatar
Guy De Souza committed
126
  Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8;
127

128
  if (slot == ss_slot) {
Guy De Souza's avatar
Guy De Souza committed
129
    // Current implementation is based on SSB in first half frame, first candidate
130
    LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
131
    nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp);
132
    nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp);
133

134
    if (!(frame&7)) {
135
      LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured);
136

137
      if (gNB->pbch_configured != 1)return;
138

139
      gNB->pbch_configured = 0;
Guy De Souza's avatar
Guy De Souza committed
140
    }
141 142

    nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP, ssb_start_symbol, cfg, fp);
143
    nr_generate_pbch(&gNB->pbch,
144 145 146 147 148 149 150
                     pbch_pdu,
                     gNB->nr_pbch_interleaver,
                     txdataF[0],
                     AMP,
                     ssb_start_symbol,
                     n_hf,Lmax,ssb_index,
                     frame, cfg, fp);
151
  }
Guy De Souza's avatar
Guy De Souza committed
152 153 154
}

void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
155 156
                           gNB_L1_rxtx_proc_t *proc,
                           int do_meas) {
Guy De Souza's avatar
Guy De Souza committed
157 158
  int aa;
  int frame=proc->frame_tx;
159
  int slot=proc->slot_tx;
160
  uint8_t num_dci=0,num_pdsch_rnti;
Guy De Souza's avatar
Guy De Souza committed
161
  NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
ChenWeiTai's avatar
ChenWeiTai committed
162
  nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
Guy De Souza's avatar
Guy De Souza committed
163 164
  int offset = gNB->CC_id;

165
  if ((cfg->subframe_config.duplex_mode.value == TDD) && (nr_slot_select(cfg,slot)==SF_UL)) return;
Guy De Souza's avatar
Guy De Souza committed
166

167
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
168

169
  if (do_meas==1) start_meas(&gNB->phy_proc_tx);
Guy De Souza's avatar
Guy De Souza committed
170 171

  // clear the transmit data array for the current subframe
172
  for (aa=0; aa<1/*15*/; aa++) {
173
    memset(gNB->common_vars.txdataF[aa],0,fp->samples_per_slot_wCP*sizeof(int32_t));
Guy De Souza's avatar
Guy De Souza committed
174 175 176
  }

  if (nfapi_mode == 0 || nfapi_mode == 1) {
177
    nr_common_signal_procedures(gNB,frame, slot);
Guy De Souza's avatar
Guy De Souza committed
178
    //if (frame == 9)
179
    //write_output("txdataF.m","txdataF",gNB->common_vars.txdataF[aa],fp->samples_per_frame_wCP, 1, 1);
180 181 182
  }

  num_dci = gNB->pdcch_vars.num_dci;
183
  num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti;
184

185
  if (num_dci) {
186 187
    LOG_I(PHY, "[gNB %d] Frame %d slot %d \
    Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, slot, num_dci);
Guy De Souza's avatar
Guy De Souza committed
188

189
    if (nfapi_mode == 0 || nfapi_mode == 1) {
190
      nr_generate_dci_top(gNB->pdcch_vars,
191
                          gNB->nr_gold_pdcch_dmrs[slot],
192
                          gNB->common_vars.txdataF[0],
193
                          AMP, *fp, *cfg);
194

Guy De Souza's avatar
Guy De Souza committed
195 196
      if (num_pdsch_rnti) {
        LOG_I(PHY, "PDSCH generation started (%d)\n", num_pdsch_rnti);
Guy De Souza's avatar
Guy De Souza committed
197
        nr_generate_pdsch(*gNB->dlsch[0][0],
Guy De Souza's avatar
Guy De Souza committed
198
                          gNB->pdcch_vars.dci_alloc[0],
199
                          gNB->nr_gold_pdsch_dmrs[slot],
Guy De Souza's avatar
Guy De Souza committed
200
                          gNB->common_vars.txdataF,
201
                          AMP, slot, *fp, *cfg);
Guy De Souza's avatar
Guy De Souza committed
202 203
      }
    }
Guy De Souza's avatar
Guy De Souza committed
204
  }
205

206
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0);
Guy De Souza's avatar
Guy De Souza committed
207
}