nr_init_ru.c 8.31 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 24
#include "phy_init.h"
#include "SCHED/sched_common.h"
#include "PHY/phy_extern.h"
cig's avatar
cig committed
25
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
26
#include "SIMULATION/TOOLS/sim.h"
27
/*#include "RadioResourceConfigCommonSIB.h"
Guy De Souza's avatar
Guy De Souza committed
28 29
#include "RadioResourceConfigDedicated.h"
#include "TDD-Config.h"
30
#include "MBSFN-SubframeConfigList.h"*/
31
#include "common/utils/LOG/vcd_signal_dumper.h"
Guy De Souza's avatar
Guy De Souza committed
32 33
#include "assertions.h"
#include <math.h>
34
#include "openair1/PHY/defs_RU.h"
Guy De Souza's avatar
Guy De Souza committed
35 36 37

int nr_phy_init_RU(RU_t *ru) {

38
  NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
Guy De Souza's avatar
Guy De Souza committed
39 40 41 42 43 44
  int i,j;
  int p;
  int re;

  LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d\n",ru_if_types[ru->if_south],ru->nb_tx);

Raymond Knopp's avatar
Raymond Knopp committed
45 46
  nfapi_nr_config_request_scf_t *cfg;
  ru->nb_log_antennas=0;
47
  for (int n=0;n<RC.nb_nr_L1_inst;n++) {
48
    cfg = &ru->config;
Raymond Knopp's avatar
Raymond Knopp committed
49 50
    if (cfg->carrier_config.num_tx_ant.value > ru->nb_log_antennas) ru->nb_log_antennas = cfg->carrier_config.num_tx_ant.value;   
  }
51 52
  // copy configuration from gNB[0] in to RU, assume that all gNB instances sharing RU use the same configuration (at least the parts that are needed by the RU, numerology and PRACH)

53
  AssertFatal(ru->nb_log_antennas > 0 && ru->nb_log_antennas < 13, "ru->nb_log_antennas %d ! \n",ru->nb_log_antennas);
Guy De Souza's avatar
Guy De Souza committed
54 55 56 57 58 59 60 61
  if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so allocate memory for time-domain signals 
    // Time-domain signals
    ru->common.txdata        = (int32_t**)malloc16(ru->nb_tx*sizeof(int32_t*));
    ru->common.rxdata        = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) );


    for (i=0; i<ru->nb_tx; i++) {
      // Allocate 10 subframes of I/Q TX signal data (time) if not
Guy De Souza's avatar
Guy De Souza committed
62
      ru->common.txdata[i]  = (int32_t*)malloc16_clear( fp->samples_per_frame*sizeof(int32_t) );
Guy De Souza's avatar
Guy De Souza committed
63 64

      LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes)\n",i,ru->common.txdata[i],
Guy De Souza's avatar
Guy De Souza committed
65
	     fp->samples_per_frame*sizeof(int32_t));
Guy De Souza's avatar
Guy De Souza committed
66 67 68

    }
    for (i=0;i<ru->nb_rx;i++) {
Guy De Souza's avatar
Guy De Souza committed
69
      ru->common.rxdata[i] = (int32_t*)malloc16_clear( fp->samples_per_frame*sizeof(int32_t) );
Guy De Souza's avatar
Guy De Souza committed
70 71 72 73 74 75 76 77 78 79 80 81
    }
  } // IF5 or local RF
  else {
    //    LOG_I(PHY,"No rxdata/txdata for RU\n");
    ru->common.txdata        = (int32_t**)NULL;
    ru->common.rxdata        = (int32_t**)NULL;

  }
  if (ru->function != NGFI_RRU_IF5) { // we need to do RX/TX RU processing
    LOG_I(PHY,"nb_tx %d\n",ru->nb_tx);
    ru->common.rxdata_7_5kHz = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) );
    for (i=0;i<ru->nb_rx;i++) {
Guy De Souza's avatar
Guy De Souza committed
82
      ru->common.rxdata_7_5kHz[i] = (int32_t*)malloc16_clear( 2*fp->samples_per_subframe*2*sizeof(int32_t) );
Guy De Souza's avatar
Guy De Souza committed
83 84 85 86
      LOG_I(PHY,"rxdata_7_5kHz[%d] %p for RU %d\n",i,ru->common.rxdata_7_5kHz[i],ru->idx);
    }
  

87
    // allocate precoding input buffers (TX)
88
    ru->common.txdataF = (int32_t **)malloc16(ru->nb_tx*sizeof(int32_t*));
Raymond Knopp's avatar
Raymond Knopp committed
89
    for(i=0; i< ru->nb_tx; ++i)  ru->common.txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); // [hna] samples_per_frame without CP
90

Guy De Souza's avatar
Guy De Souza committed
91 92 93 94 95
    // allocate IFFT input buffers (TX)
    ru->common.txdataF_BF = (int32_t **)malloc16(ru->nb_tx*sizeof(int32_t*));
    LOG_I(PHY,"[INIT] common.txdata_BF= %p (%lu bytes)\n",ru->common.txdataF_BF,
	  ru->nb_tx*sizeof(int32_t*));
    for (i=0; i<ru->nb_tx; i++) {
Guy De Souza's avatar
Guy De Souza committed
96
      ru->common.txdataF_BF[i] = (int32_t*)malloc16_clear(fp->samples_per_subframe_wCP*sizeof(int32_t) );
Guy De Souza's avatar
Guy De Souza committed
97 98 99 100 101 102
      LOG_I(PHY,"txdataF_BF[%d] %p for RU %d\n",i,ru->common.txdataF_BF[i],ru->idx);
    }
    // allocate FFT output buffers (RX)
    ru->common.rxdataF     = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) );
    for (i=0; i<ru->nb_rx; i++) {    
      // allocate 2 subframes of I/Q signal data (frequency)
Guy De Souza's avatar
Guy De Souza committed
103
      ru->common.rxdataF[i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->samples_per_subframe_wCP) ); 
Guy De Souza's avatar
Guy De Souza committed
104 105 106 107 108 109 110 111 112
      LOG_I(PHY,"rxdataF[%d] %p for RU %d\n",i,ru->common.rxdataF[i],ru->idx);
    }

    /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */
    //    AssertFatal(ru->nb_rx <= sizeof(ru->prach_rxsigF) / sizeof(ru->prach_rxsigF[0]),
    //		"nb_antennas_rx too large");
    ru->prach_rxsigF = (int16_t**)malloc(ru->nb_rx * sizeof(int16_t*));

    for (i=0; i<ru->nb_rx; i++) {
113 114
      // largest size for PRACH FFT is 4x98304 (16*24576)
      ru->prach_rxsigF[i] = (int16_t*)malloc16_clear( 4*98304*2*sizeof(int16_t) );
Guy De Souza's avatar
Guy De Souza committed
115 116 117
      LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,ru->prach_rxsigF[i]);
    }
    
WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
118 119
    AssertFatal(RC.nb_nr_L1_inst <= NUMBER_OF_eNB_MAX,"gNB instances %d > %d\n",
		RC.nb_nr_L1_inst,NUMBER_OF_gNB_MAX);
Guy De Souza's avatar
Guy De Souza committed
120

WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
121
    LOG_E(PHY,"[INIT] %s() RC.nb_nr_L1_inst:%d \n", __FUNCTION__, RC.nb_nr_L1_inst);
122 123
    
    int beam_count = 0;
124
    if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1
Raymond Knopp's avatar
Raymond Knopp committed
125
      for (p=0;p<ru->nb_log_antennas;p++) {
126
        if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
127
          beam_count++;
128
      }
129 130
      AssertFatal(ru->nb_bfw==(beam_count*ru->nb_tx),"Number of beam weights from config file is %d while the expected number is %d",ru->nb_bfw,(beam_count*ru->nb_tx));
    
Francesco Mani's avatar
Francesco Mani committed
131 132
      int l_ind = 0;
      for (i=0; i<RC.nb_nr_L1_inst; i++) {
133
        for (p=0;p<ru->nb_log_antennas;p++) {
134
          if ((fp->L_ssb >> (63-p)) & 0x01)  {
Francesco Mani's avatar
Francesco Mani committed
135 136 137 138
	    ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
	    for (j=0; j<ru->nb_tx; j++) {
	      ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
              for (re=0; re<fp->ofdm_symbol_size; re++) 
139
		ru->beam_weights[i][p][j][re] = ru->bw_list[i][l_ind];
Francesco Mani's avatar
Francesco Mani committed
140 141 142 143 144 145 146
              //printf("Beam Weight %08x for beam %d and tx %d\n",ru->bw_list[i][l_ind],p,j);
              l_ind++; 
  	    } // for j
	  } // for p
        }
      } //for i
    }
Guy De Souza's avatar
Guy De Souza committed
147
  } // !=IF5
148

Guy De Souza's avatar
Guy De Souza committed
149 150
  ru->common.sync_corr = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_subframe_wCP );

151 152
  init_prach_ru_list(ru);

Guy De Souza's avatar
Guy De Souza committed
153 154 155 156 157 158 159 160 161 162
  return(0);
}

void nr_phy_free_RU(RU_t *ru)
{
  int i,j;
  int p;

  LOG_I(PHY, "Feeing RU signal buffers (if_south %s) nb_tx %d\n", ru_if_types[ru->if_south], ru->nb_tx);

163 164 165
  free_and_zero(ru->nr_frame_parms);
  free_and_zero(ru->frame_parms);

Guy De Souza's avatar
Guy De Souza committed
166 167 168 169 170 171 172 173 174 175 176
  if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so free memory for time-domain signals
    for (i = 0; i < ru->nb_tx; i++) free_and_zero(ru->common.txdata[i]);
    for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdata[i]);
    free_and_zero(ru->common.txdata);
    free_and_zero(ru->common.rxdata);
  } // else: IF5 or local RF -> nothing to free()

  if (ru->function != NGFI_RRU_IF5) { // we need to do RX/TX RU processing
    for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdata_7_5kHz[i]);
    free_and_zero(ru->common.rxdata_7_5kHz);

177 178 179 180
    // free beamforming input buffers (TX)
    for (i = 0; i < 15; i++) free_and_zero(ru->common.txdataF[i]);
    free_and_zero(ru->common.txdataF);

Guy De Souza's avatar
Guy De Souza committed
181 182 183 184 185 186 187 188 189 190 191 192
    // free IFFT input buffers (TX)
    for (i = 0; i < ru->nb_tx; i++) free_and_zero(ru->common.txdataF_BF[i]);
    free_and_zero(ru->common.txdataF_BF);

    // free FFT output buffers (RX)
    for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]);
    free_and_zero(ru->common.rxdataF);

    for (i = 0; i < ru->nb_rx; i++) {
      free_and_zero(ru->prach_rxsigF[i]);
    }

WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
193
    for (i = 0; i < RC.nb_nr_L1_inst; i++) {
Guy De Souza's avatar
Guy De Souza committed
194 195 196 197 198 199 200 201
      for (p = 0; p < 15; p++) {
	  for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
	  free_and_zero(ru->beam_weights[i][p]);
      }
    }
  }
  free_and_zero(ru->common.sync_corr);
}