From 47d3c9f718c1a19a650e9465f42946acd8549bcd Mon Sep 17 00:00:00 2001 From: yankuo <you@example.com> Date: Thu, 1 Feb 2024 15:09:29 +0800 Subject: [PATCH] add OXGRF support --- CMakeLists.txt | 2 +- cmake_targets/build_oai | 8 +- cmake_targets/tools/build_helper | 28 + executables/lte-softmodem.h | 2 + executables/lte-uesoftmodem.c | 3 + executables/nr-softmodem-common.h | 2 + executables/nr-uesoftmodem.c | 2 + executables/nr-uesoftmodem.h | 1 + openair1/PHY/impl_defs_top.h | 1 + radio/CMakeLists.txt | 5 + radio/COMMON/common_lib.c | 2 +- radio/COMMON/common_lib.h | 2 + radio/OXGRF/CMakeLists.txt | 9 + radio/OXGRF/oxgrf_lib.c | 847 ++++ radio/OXGRF/oxgrf_lib.h | 97 + radio/OXGRF/rf_helper.h | 56 + .../CONF/enb.band7.tm1.100PRB.oxgrf.conf | 223 ++ .../CONF/enb.band7.tm1.50PRB.oxgrf.conf | 309 ++ .../CONF/gnb.band78.tm1.106PRB.oxgrf.conf | 263 ++ .../gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf | 269 ++ .../CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf | 268 ++ .../gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf | 270 ++ .../CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf | 271 ++ xdma.patch | 3500 +++++++++++++++++ 24 files changed, 6436 insertions(+), 4 deletions(-) create mode 100644 radio/OXGRF/CMakeLists.txt create mode 100644 radio/OXGRF/oxgrf_lib.c create mode 100644 radio/OXGRF/oxgrf_lib.h create mode 100644 radio/OXGRF/rf_helper.h create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf create mode 100755 xdma.patch diff --git a/CMakeLists.txt b/CMakeLists.txt index 27a7c471d5..a92869dc32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2359,7 +2359,7 @@ if (${T_TRACER}) nr_ulschsim ldpctest polartest smallblocktest cu_test du_test #all "add_library" definitions ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap - params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer + params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer oai_oxgrfdevif oai_eth_transpro oai_mobipass coding HASHTABLE UTIL OMG_SUMO SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 8de83f473d..9df20b292b 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -93,7 +93,7 @@ Options: --UE-gen-nvram [output path] Specify gen_nvram_path (default \"$gen_nvram_path\") -w | --hardware - USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, None (Default) + USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, OXGRF, None (Default) Adds this RF board support (in external packages installation and in compilation) -t | --transport Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g @@ -272,7 +272,7 @@ function main() { shift;; -w | --hardware) case "$2" in - "USRP" | "BLADERF" | "LMSSDR" | "IRIS") + "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "OXGRF") HW="OAI_"$2 TARGET_LIST="$TARGET_LIST oai_${2,,}devif" # ,, makes lowercase CMAKE_CMD="$CMAKE_CMD -DOAI_$2=ON" @@ -457,6 +457,10 @@ function main() { flash_firmware_bladerf fi fi + if [ "$HW" == "OAI_OXGRF" ] ; then + echo_info "installing packages for OXGRF support" + #check_install_oxgrf_driver + fi if [ "$HW" == "OAI_IRIS" ] ; then echo_info "installing packages for IRIS support" check_install_soapy diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index c0b2fa237b..413d3135c0 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -400,6 +400,34 @@ install_usrp_uhd_driver() { fi } +check_install_oxgrf_driver() { +#if modinfo riffa > /dev/null 2>&1 + if modinfo xdma > /dev/null 2>&1 + then + echo_success "OXGRF driver has loaded." + else + git clone https://github.com/v3best/riffa /tmp/riffa + if [ $? -ne 0 ]; then + echo_fatal "OXGRF driver download failed, please check your net connection." + else + cd /tmp/riffa/driver/linux + make && $SUDO make install + echo_success "OXGRF driver install success, please restart your PC later." + fi + git clone https://github.com/v3best/liboxgrf /tmp/liboxgrf + if [ $? -ne 0 ]; then + echo_fatal "OXGRF API download failed, please check your net connection." + else + cd /tmp/liboxgrf + mkdir build + cd build + cmake ../ + make && $SUDO make install && $SUDO ldconfig + echo_success "OXGRF API install success, please restart your PC later." + fi + fi +} + install_bladerf_driver_from_source(){ bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log " diff --git a/executables/lte-softmodem.h b/executables/lte-softmodem.h index 4143bce3a4..cc44e6a199 100644 --- a/executables/lte-softmodem.h +++ b/executables/lte-softmodem.h @@ -73,6 +73,7 @@ #define CONFIG_HLP_PRB "Set the PRB, valid values: 6, 25, 50, 100 \n" #define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n" #define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n" +#define CONFIG_HLP_OXGRF_ARGS "set the arguments to identify OXGRF\n" #define CONFIG_HLP_DMAMAP "use DMA memory mapping\n" #define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n" #define CONFIG_HLP_TADV "Set timing_advance\n" @@ -104,6 +105,7 @@ {"r" , CONFIG_HLP_PRB, 0, .u8ptr=&(frame_parms[0]->N_RB_DL), .defintval=25, TYPE_UINT8, 0}, \ {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0, TYPE_INT, 0}, \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200",TYPE_STRING, 0}, \ + {"oxgrf-args", CONFIG_HLP_OXGRF_ARGS, 0, .strptr=&oxgrf_args, .defstrval="dev=pciex:0",TYPE_STRING, 0}, \ {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, .uptr=&mmapped_dma, .defintval=0, TYPE_INT, 0}, \ {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, .iptr=&tddflag, .defintval=0, TYPE_INT, 0}, \ {"A", CONFIG_HLP_TADV, 0, .iptr=&(timingadv), .defintval=0, TYPE_INT, 0}, \ diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c index c7e8c9300a..3431645108 100644 --- a/executables/lte-uesoftmodem.c +++ b/executables/lte-uesoftmodem.c @@ -159,6 +159,8 @@ int transmission_mode=1; char *usrp_args=NULL; char *usrp_clksrc=NULL; +char *oxgrf_args=NULL; + THREAD_STRUCT thread_struct; /* struct for ethernet specific parameters given in eNB conf file */ eth_params_t *eth_params; @@ -470,6 +472,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) { } if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; + if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args; } } diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h index 2550001956..4352af4b38 100644 --- a/executables/nr-softmodem-common.h +++ b/executables/nr-softmodem-common.h @@ -103,6 +103,8 @@ #define CONFIG_HLP_TX_SUBDEV "set the arguments to select tx_subdev (same syntax as in UHD)\n" #define CONFIG_HLP_RX_SUBDEV "set the arguments to select rx_subdev (same syntax as in UHD)\n" +#define CONFIG_HLP_OXGRF_ARGS "set the arguments to identify OXGRF\n" + #define CONFIG_HLP_FLOG "Enable online log \n" #define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" #define CONFIG_HLP_LOGV "Set the global log verbosity \n" diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index c970b1d09d..95d8cdbf5a 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -120,6 +120,7 @@ int vcdflag = 0; double rx_gain_off = 0.0; char *usrp_args = NULL; +char *oxgrf_args = NULL; char *tx_subdev = NULL; char *rx_subdev = NULL; char *rrc_config_path = NULL; @@ -363,6 +364,7 @@ void init_openair0(void) { openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file; if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; + if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args; if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev; if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev; diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 3549a7fae1..1e9554113d 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -31,6 +31,7 @@ // clang-format off #define CMDLINE_NRUEPARAMS_DESC { \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200", TYPE_STRING, 0}, \ + {"oxgrf-args", CONFIG_HLP_OXGRF_ARGS, 0, .strptr=&oxgrf_args, .defstrval="dev=pciex:0", TYPE_STRING, 0}, \ {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, .strptr=&tx_subdev, .defstrval=NULL, TYPE_STRING, 0}, \ {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, .strptr=&rx_subdev, .defstrval=NULL, TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, .iptr=&single_thread_flag, .defintval=1, TYPE_INT, 0}, \ diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h index 5c461b27b0..1110242552 100644 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -43,6 +43,7 @@ * @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface * @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface * @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface + * @defgroup _OXGRF_PHY_RF_INTERFACE_ PHY - OXGRF RF Interface * @defgroup _LMSSDR_PHY_RF_INTERFACE_ PHY - LMSSDR RF Interface * @} * @} diff --git a/radio/CMakeLists.txt b/radio/CMakeLists.txt index 937d8039f9..6708ad5511 100644 --- a/radio/CMakeLists.txt +++ b/radio/CMakeLists.txt @@ -32,3 +32,8 @@ add_boolean_option(OAI_USRP OFF "Activate OAI's USRP driver" OFF) if(OAI_USRP) add_subdirectory(USRP) endif() + +add_boolean_option(OAI_OXGRF OFF "Activate OAI's OXGRF driver" OFF) +if(OAI_OXGRF) + add_subdirectory(OXGRF) +endif() diff --git a/radio/COMMON/common_lib.c b/radio/COMMON/common_lib.c index 4d78018d8c..d9bdc31a00 100644 --- a/radio/COMMON/common_lib.c +++ b/radio/COMMON/common_lib.c @@ -44,7 +44,7 @@ #include "executables/softmodem-common.h" const char *const devtype_names[MAX_RF_DEV_TYPE] = - {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"}; + {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "OXGRF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"}; const char *get_devname(int devtype) { if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE ) diff --git a/radio/COMMON/common_lib.h b/radio/COMMON/common_lib.h index d735fab4f0..6d45d730af 100644 --- a/radio/COMMON/common_lib.h +++ b/radio/COMMON/common_lib.h @@ -93,6 +93,8 @@ typedef enum { USRP_X400_DEV, /*!\brief device is BLADE RF*/ BLADERF_DEV, + /*!\brief device is OXGRF pcie*/ + OXGRF_DEV, /*!\brief device is LMSSDR (SoDeRa)*/ LMSSDR_DEV, /*!\brief device is Iris */ diff --git a/radio/OXGRF/CMakeLists.txt b/radio/OXGRF/CMakeLists.txt new file mode 100644 index 0000000000..cec23b9c04 --- /dev/null +++ b/radio/OXGRF/CMakeLists.txt @@ -0,0 +1,9 @@ +find_library(oxgrf_ss NAMES oxgrf_ss) + +add_library(oai_oxgrfdevif MODULE oxgrf_lib.c) +target_link_libraries(oai_oxgrfdevif PRIVATE oxgrf_ss) +target_link_libraries(oai_oxgrfdevif PRIVATE UTIL) +set_target_properties(oai_oxgrfdevif PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +add_custom_command(TARGET oai_oxgrfdevif POST_BUILD + COMMAND ${CMAKE_COMMAND} -E create_symlink liboai_oxgrfdevif.so liboai_device.so + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) diff --git a/radio/OXGRF/oxgrf_lib.c b/radio/OXGRF/oxgrf_lib.c new file mode 100644 index 0000000000..d19d759e84 --- /dev/null +++ b/radio/OXGRF/oxgrf_lib.c @@ -0,0 +1,847 @@ +/* + * 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.0 (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 + */ + +/** oxgrf_lib.c + * + * Author: eric + * base on bladerf_lib.c + */ + +#pragma GCC optimize(3, "Ofast", "inline") +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <unistd.h> +#include <string.h> +#include <inttypes.h> +#include <math.h> +#include "oxgrf_lib.h" +#include "rf_helper.h" +#include "common/utils/LOG/log.h" + +/** @addtogroup _OXGRF_PHY_RF_INTERFACE_ + * @{ + */ +#include "openair1/PHY/sse_intrin.h" + +//! Number of OXGRF devices +int num_devices = 0; +static bool running = false; + +#define BUFFER_SIZE (122880 * 100 * sizeof(int)) +#define NCHAN_PER_DEV 4 +static void *cache_buf[NCHAN_PER_DEV]; +static void *iq_buf[NCHAN_PER_DEV]; +static uint32_t remain = 0; +static uint32_t RX_MTU = 30720; +static uint8_t shift = 2; + +static inline int channel_to_mask(int channel_count) +{ + uint8_t ch_mask; + switch (channel_count) { + case 4: + ch_mask = 0xf;break; + case 3: + ch_mask = 0x7;break; + case 2: + ch_mask = 0x3;break; + case 1: + ch_mask = 0x1;break; + default: + ch_mask = 0x1;break; + } + + return ch_mask; +} + +/*! \brief get current timestamp + *\param device the hardware to use + *\returns timestamp of OXGRF + */ + +openair0_timestamp trx_get_timestamp(openair0_device *device) { + return 0; +} + +/*! \brief Start oxgrf + * \param device the hardware to use + * \returns 0 on success + */ +int trx_oxgrf_start(openair0_device *device) { + + LOG_I(HW, "[oxgrf] Start oxgrf ...\n"); + running = true; + + return 0; +} + +/*! \brief Called to send samples to the oxgrf RF target + \param device pointer to the device structure specific to the RF hardware target + \param timestamp The timestamp at whicch the first sample MUST be sent + \param buff Buffer which holds the samples + \param nsamps number of samples to be sent + \param cc index of the component carrier + \param flags Ignored for the moment + \returns 0 on success + */ +static int trx_oxgrf_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int status; + oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv; + + uint32_t trx_flags = 0; + radio_tx_burst_flag_t flags_burst = (radio_tx_burst_flag_t) (flags & 0xf); + + if (flags_burst == TX_BURST_START) { + trx_flags = 0; + } else if (flags_burst == TX_BURST_END) { + trx_flags = 1; + } else if (flags_burst == TX_BURST_START_AND_END) { + trx_flags = 1; + } else if (flags_burst == TX_BURST_MIDDLE) { + trx_flags = 0; + } + + for(int i = 0; i < cc; i++) { + int len = nsamps * 2; + int16_t *iq = buff[i]; +#if defined(__x86_64) || defined(__i386__) + __m256i a, *b; + + while (len >= 16) { + a = *(__m256i *)&iq[0]; + b = (__m256i *)&iq[0]; + *b = simde_mm256_slli_epi16(a, 4); + iq += 16; + len -= 16; + } +#elif defined(__arm__) || defined(__aarch64__) + int16x8_t a, *b; + + while (len >= 8) { + a = *(int16x8_t *)&iq[0]; + b = (int16x8_t *)&iq[0]; + *b = vshlq_n_s16(a, 4); + iq += 8; + len -= 8; + } +#endif + /* remaining data */ + while (len != 0) { + iq[0] <<= 4; + iq++; + len--; + } + } + + status = oxgrf_write_samples_multiport(oxgrf->dev, (const void **)buff, nsamps, channel_to_mask(cc), timestamp, trx_flags); + if (status < 0) { + oxgrf->num_tx_errors++; + LOG_E(HW, "[oxgrf] Failed to TX samples\n"); + exit(-1); + } + + //LOG_D(HW, "Provided TX timestamp: %u, nsamps: %u\n", ptimestamp, nsamps); + + oxgrf->tx_current_ts = timestamp; + oxgrf->tx_nsamps += nsamps; + oxgrf->tx_count++; + + return nsamps; +} + +/*! \brief Receive samples from hardware. + * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for + * the first channel. *ptimestamp is the time at which the first sample + * was received. + * \param device the hardware to use + * \param[out] ptimestamp the time at which the first sample was received. + * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps. + * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. + * \param cc Index of component carrier + * \returns number of samples read + */ +static int trx_oxgrf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + + int status; + oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; + uint64_t timestamp = 0UL; + +retry: + if(remain == 0) { + int recv = 0; + timestamp = 0UL; + if(nsamps % RX_MTU) { + recv = (nsamps / RX_MTU + 1) * RX_MTU; + status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), ×tamp); + if (status < 0) { + LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); + oxgrf->num_rx_errors++; + exit(-1); + } + for(int i = 0; i < cc; i++) + memcpy(buff[i], iq_buf[i], nsamps * 4); + if(recv > nsamps) { + for(int i = 0; i < cc; i++) + memcpy(cache_buf[i], iq_buf[i] + nsamps * 4, (recv - nsamps) * 4); + remain = recv - nsamps; + } + } else { + recv = nsamps; + status = oxgrf_read_samples_multiport(oxgrf->dev, buff, recv, channel_to_mask(cc), ×tamp); + if (status < 0) { + LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); + oxgrf->num_rx_errors++; + exit(-1); + } + } + + *(uint64_t *)ptimestamp = timestamp; + oxgrf->rx_current_ts = timestamp + nsamps; + //LOG_D(HW, "case 0: Current RX timestamp %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n", *ptimestamp, timestamp, nsamps, remain, recv); + } else if(remain >= nsamps) { + for(int i = 0; i < cc; i++) + memcpy(buff[i], cache_buf[i], nsamps * 4); + remain -= nsamps; + if(remain > 0) { + for(int i = 0; i < cc; i++) + memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4); + } + *(uint64_t *)ptimestamp = oxgrf->rx_current_ts; + oxgrf->rx_current_ts += nsamps; + //LOG_D(HW, "case 1: Current RX timestamp %"PRIu64", nsamps %u, remain %u\n", *ptimestamp, nsamps, remain); + } else { + int recv; + if(remain + RX_MTU >= nsamps) + recv = RX_MTU; + else + recv = (nsamps / RX_MTU + 1) * RX_MTU; + timestamp = 0UL; + status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), ×tamp); + if (status < 0) { + LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); + oxgrf->num_rx_errors++; + exit(-1); + } + if(timestamp != (oxgrf->rx_current_ts + remain)) { + int overflow = timestamp - (oxgrf->rx_current_ts + remain); + LOG_W(HW, "Rx overflow %u samples\n", overflow); + //remain += overflow; + remain = 0; + goto retry; + } + for(int i = 0; i < cc; i++) + memcpy(cache_buf[i] + remain * 4, iq_buf[i], recv * 4); + for(int i = 0; i < cc; i++) + memcpy(buff[i], cache_buf[i], nsamps * 4); + remain = recv + remain - nsamps; + for(int i = 0; i < cc; i++) + memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4); + + *(uint64_t *)ptimestamp = oxgrf->rx_current_ts; + oxgrf->rx_current_ts += nsamps; + //LOG_D(HW, "case 2: Current RX timestamp %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n", *ptimestamp, timestamp, nsamps, remain, recv); + } + + for(int i = 0; i < cc; i++) { + int len = nsamps * 2; + int16_t *iq = buff[i]; +#if defined(__x86_64__) || defined(__i386__) + __m256i a, *b; + + while (len >= 16) { + a = *(__m256i *)&iq[0]; + b = (__m256i *)&iq[0]; + *b = simde_mm256_srai_epi16(a, shift); + iq += 16; + len -= 16; + } +#elif defined(__arm__) || defined(__aarch64__) + int16x8_t a, *b; + + while (len >= 8) { + a = *(int16x8_t *)&iq[0]; + b = (int16x8_t *)&iq[0]; + *b = vshrq_n_s16(a, shift); + iq += 8; + len -= 8; + } +#endif + /* remaining data */ + while (len != 0) { + iq[0] >>= shift; + iq++; + len--; + } + } + //LOG_D(HW, "Current RX timestamp %"PRIu64", nsamps %u\n", *ptimestamp, nsamps); + oxgrf->rx_nsamps += nsamps; + oxgrf->rx_count++; + + return nsamps; + +} + +/*! \brief Terminate operation of the oxgrf transceiver -- free all associated resources + * \param device the hardware to use + */ +void trx_oxgrf_end(openair0_device *device) { + + oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv; + + if(!running) + return; + running = false; + + LOG_I(HW, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + for(int i = 0; i < oxgrf->tx_num_channels; i++) { + uint32_t count = 0; + oxgrf_get_channel_event(oxgrf->dev, TX_CHANNEL_TIMEOUT, i+1, &count); + LOG_I(HW, "[oxgrf] TX%d Channel timeout: %u\n", i+1, count); + } + for(int i = 0; i < oxgrf->rx_num_channels; i++) { + uint32_t count = 0; + oxgrf_get_channel_event(oxgrf->dev, RX_CHANNEL_OVERFLOW, i+1, &count); + LOG_I(HW, "[oxgrf] RX%d Channel overflow: %u\n", i+1, count); + } + LOG_I(HW, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); + + oxgrf_close_device(oxgrf->dev); + + return; +} + +/*! \brief print the oxgrf statistics + * \param device the hardware to use + * \returns 0 on success + */ +int trx_oxgrf_get_stats(openair0_device* device) { + return(0); +} + +/*! \brief Reset the oxgrf statistics + * \param device the hardware to use + * \returns 0 on success + */ +int trx_oxgrf_reset_stats(openair0_device* device) { + return(0); + +} + +/*! \brief Stop oxgrf + * \param card the hardware to use + * \returns 0 in success + */ +int trx_oxgrf_stop(openair0_device* device) { + return(0); +} + +/*! \brief Set frequencies (TX/RX) + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + * \param dummy dummy variable not used + * \returns 0 in success + */ +int trx_oxgrf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg) { + + int status; + oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; + + if(oxgrf->tx_lo_freq != openair0_cfg->tx_freq[0]) { + if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->tx_freq[0]))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX frequency\n"); + } else { + LOG_I(HW, "[oxgrf] set TX frequency to %lu\n",(uint64_t)(openair0_cfg->tx_freq[0])); + oxgrf->tx_lo_freq = openair0_cfg->tx_freq[0]; + } + } + + if(oxgrf->rx_lo_freq != openair0_cfg->rx_freq[0]) { + if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX frequency\n"); + } else { + LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0])); + oxgrf->rx_lo_freq = openair0_cfg->rx_freq[0]; + } + } + + return(0); + +} + +/*! \brief calibration table for OXGRF */ +rx_gain_calib_table_t calib_table_oxgrf[] = { + {3500000000.0, 72.0}, + {2660000000.0, 72.0}, + {2300000000.0, 72.0}, + {1880000000.0, 72.0}, + {816000000.0, 72.0}, + {-1,0} +}; + +/*! \brief set RX gain offset from calibration table + * \param openair0_cfg RF frontend parameters set by application + * \param chain_index RF chain ID + */ +void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { + + int i = 0; + // loop through calibration table to find best adjustment factor for RX frequency + double min_diff = 6e9, diff; + + while (openair0_cfg->rx_gain_calib_table[i].freq > 0) { + diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); + printf("cal %d: freq %f, offset %f, diff %f\n", + i, + openair0_cfg->rx_gain_calib_table[i].freq, + openair0_cfg->rx_gain_calib_table[i].offset, diff); + if (min_diff > diff) { + min_diff = diff; + openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset; + } + i++; + } +} + +/*! \brief Set Gains (TX/RX) + * \param device the hardware to use + * \param openair0_cfg openair0 Config structure + * \returns 0 in success + */ +int trx_oxgrf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + + int ret = 0; + oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; + + if (openair0_cfg->rx_gain[0] > 65+openair0_cfg->rx_gain_offset[0]) { + LOG_E(HW, "[oxgrf] Reduce RX Gain 0 by %f dB\n", openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0] - 65); + return -1; + } + + if ((ret = oxgrf_set_rx1_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]))) < 0) { + LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n"); + } else + LOG_I(HW, "[oxgrf] set RX1 gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[0])); + + if(oxgrf->rx_num_channels > 1) { + if ((ret = oxgrf_set_rx2_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[1] - openair0_cfg->rx_gain_offset[0]))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n"); + } else + LOG_I(HW, "[oxgrf] set RX gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[1])); + } +#if 0 + if ((ret = oxgrf_set_tx1_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[0] * 1000)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n"); + } else + LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]); + + if(oxgrf->tx_num_channels > 1) { + if ((ret = oxgrf_set_tx2_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[1] * 1000)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n"); + } else + LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]); + } +#endif + return(ret); +} + +/*! \brief Initialize Openair oxgrf target. It returns 0 if OK + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + * \returns 0 on success + */ +int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { + + int status; + + oxgrf_state_t *oxgrf = (oxgrf_state_t*)malloc(sizeof(oxgrf_state_t)); + memset(oxgrf, 0, sizeof(oxgrf_state_t)); + + LOG_I(HW, "[oxgrf] openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs); + LOG_I(HW, "[oxgrf] openair0_cfg[0].rx_num_channels == '%d'\n", openair0_cfg[0].rx_num_channels); + LOG_I(HW, "[oxgrf] openair0_cfg[0].tx_num_channels == '%d'\n", openair0_cfg[0].tx_num_channels); + + openair0_cfg[0].rx_gain_calib_table = calib_table_oxgrf; + set_rx_gain_offset(openair0_cfg, 0); + if(oxgrf->rx_num_channels > 1) + set_rx_gain_offset(openair0_cfg, 1); + openair0_cfg->iq_txshift = 0; + openair0_cfg->iq_rxrescale = 15; /*not sure*/ //FIXME: adjust to oxgrf + oxgrf->sample_rate = (unsigned int)openair0_cfg->sample_rate; + LOG_I(HW, "[oxgrf] sampling_rate %d\n", oxgrf->sample_rate); + oxgrf->rx_num_channels = openair0_cfg[0].rx_num_channels; + oxgrf->tx_num_channels = openair0_cfg[0].tx_num_channels; + + RX_MTU = openair0_cfg->sample_rate / 1000 / 2; + if(RX_MTU > 30720) + RX_MTU = 30720; + else if(!(RX_MTU % 5760)) + RX_MTU = 5760; + + bool rx_ant = true; + bool pa_status = false; + int auxdac1 = 0; + char args[64]; + if (openair0_cfg[0].sdr_addrs == NULL) { + strcpy(args, "dev=pciex:0"); + } else { + strcpy(args, openair0_cfg[0].sdr_addrs); + } + + char dev_str[64]; + const char dev_arg[] = "dev="; + char *dev_ptr = strstr(args, dev_arg); + if(dev_ptr) { + copy_subdev_string(dev_str, dev_ptr + strlen(dev_arg)); + remove_substring(args, dev_arg); + remove_substring(args, dev_str); + LOG_I(HW, "[oxgrf] Using %s\n", dev_str); + } + + const char auxdac1_arg[] = "auxdac1="; + char auxdac1_str[64] = {0}; + char *auxdac1_ptr = strstr(args, auxdac1_arg); + if(auxdac1_ptr) { + copy_subdev_string(auxdac1_str, auxdac1_ptr + strlen(auxdac1_arg)); + remove_substring(args, auxdac1_arg); + remove_substring(args, auxdac1_str); + auxdac1 = atoi(auxdac1_str); + LOG_I(HW, "[oxgrf] Setting auxdac1:%u\n", auxdac1); + } + + const char pa_arg[] = "pa="; + char pa_str[64] = {0}; + char *pa_ptr = strstr(args, pa_arg); + if(pa_ptr) { + copy_subdev_string(pa_str, pa_ptr + strlen(pa_arg)); + remove_substring(args, pa_arg); + remove_substring(args, pa_str); + pa_status = !strcmp(pa_str, "enabled"); + LOG_I(HW, "[oxgrf] PA Status:%s\n", pa_status?"Enabled":"Disabled"); + } + + const char ant_arg[] = "rx_ant="; + char ant_str[64] = {0}; + char *ant_ptr = strstr(args, ant_arg); + if(ant_ptr) { + copy_subdev_string(ant_str, ant_ptr + strlen(ant_arg)); + remove_substring(args, ant_arg); + remove_substring(args, ant_str); + rx_ant = strcmp(ant_str, "trx"); + } + + char dstring[128]; + if(RX_MTU < 30720) { + sprintf(dstring, ",nsamples_recv_frame:%u", RX_MTU); + strcat(dev_str, dstring); + } + if ((oxgrf->dev = oxgrf_open_device(dev_str)) == NULL ) { + LOG_E(HW, "[oxgrf] Failed to open oxgrf\n"); + free(oxgrf); + return -1; + } + + uint32_t model = 0; + oxgrf_get_model_version(oxgrf->dev, &model); + model &= 0xffff; + if(model == 550) { + oxgrf->BoardType = Y550; + shift = 4; + LOG_I(HW, "[oxgrf] device type: Y%d\n", model); + } else if(model == 230) { + oxgrf->BoardType = Y230; + shift = 4; + LOG_I(HW, "[oxgrf] device type: Y%d\n", model); + } else if(model == 380) { + oxgrf->BoardType = Y380; + shift = 4; + LOG_I(HW, "[oxgrf] device type: Y%d\n", model); + } else if(model == 590) { + oxgrf->BoardType = Y590; + shift = 2; + LOG_I(HW, "[oxgrf] device type: Y%d\n", model); + } else if(model == 7400) { + oxgrf->BoardType = IQX7400; + shift = 2; + LOG_I(HW, "[oxgrf] device type: IQX%d\n", model); + } else if(model == 7402) { + oxgrf->BoardType = IQX7402; + shift = 2; + LOG_I(HW, "[oxgrf] device type: IQX%d(Split Mode)\n", model - 2); + } else if(model == 6000 || model == 7000 || model == 7100) { + oxgrf->BoardType = IQX7000; + shift = 4; + LOG_I(HW, "[oxgrf] device type: IQX%d\n", model); + } else { + oxgrf->BoardType = UNKNOWN; + LOG_I(HW, "[oxgrf] device type: unknown\n"); + } + + if(oxgrf->BoardType == Y230) { + switch ((int)openair0_cfg->sample_rate) { +#if 0 + case 61440000: + openair0_cfg->samples_per_packet = 30720; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + case 46080000: + openair0_cfg->samples_per_packet = 23040; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; +#endif + case 30720000: + openair0_cfg->samples_per_packet = 15360; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 23040000: + openair0_cfg->samples_per_packet = 11520; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 15360000: + openair0_cfg->samples_per_packet = 7680; + openair0_cfg->tx_sample_advance = 52; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + break; + case 7680000: + openair0_cfg->samples_per_packet = 7680; + openair0_cfg->tx_sample_advance = 34; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + break; + case 1920000: + openair0_cfg->samples_per_packet = 1920; + openair0_cfg->tx_sample_advance = 9; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + break; + default: + LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate); + free(oxgrf); + exit(-1); + break; + } + } + if(oxgrf->BoardType == Y380 + || oxgrf->BoardType == Y550 + || oxgrf->BoardType == Y590 + || oxgrf->BoardType == IQX7000 + || oxgrf->BoardType == IQX7402 + || oxgrf->BoardType == IQX7400) { + switch ((int)openair0_cfg->sample_rate) { + case 122880000: + openair0_cfg->samples_per_packet = 30720; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 100e6; + openair0_cfg[0].rx_bw = 100e6; + break; + case 61440000: + openair0_cfg->samples_per_packet = 30720; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 40e6; + openair0_cfg[0].rx_bw = 40e6; + break; + case 30720000: + openair0_cfg->samples_per_packet = 15360; + openair0_cfg->tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 15360000: + openair0_cfg->samples_per_packet = 15360; + openair0_cfg->tx_sample_advance = 52; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + break; + case 7680000: + openair0_cfg->samples_per_packet = 7680; + openair0_cfg->tx_sample_advance = 34; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + break; + case 1920000: + openair0_cfg->samples_per_packet = 1920; + openair0_cfg->tx_sample_advance = 9; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + break; + default: + LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate); + free(oxgrf); + exit(-1); + break; + } + + } + + LOG_I(HW, "[oxgrf] Initializing openair0_device\n"); + switch (openair0_cfg[0].clock_source) { + case external: + LOG_I(HW, "[oxgrf] clock_source: external\n"); + oxgrf_set_ref_clock (oxgrf->dev, 0, EXTERNAL_REFERENCE); + oxgrf_set_pps_select (oxgrf->dev, 0, PPS_EXTERNAL_EN); + break; + case gpsdo: + LOG_I(HW, "[oxgrf] clock_source: gpsdo\n"); + break; + case internal: + default: + oxgrf_set_ref_clock (oxgrf->dev, 0, INTERNAL_REFERENCE); + oxgrf_set_pps_select (oxgrf->dev, 0, PPS_INTERNAL_EN); + //oxgrf_set_vco_select (oxgrf->dev, 0, AUXDAC1); + LOG_I(HW, "[oxgrf] clock_source: internal\n"); + break; + } + oxgrf_set_auxdac1 (oxgrf->dev, 0, auxdac1); + if (pa_status) { + oxgrf_set_duplex_select (oxgrf->dev, 0, FDD); + oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1); + oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0); + } else if (openair0_cfg->duplex_mode == duplex_mode_TDD && !rx_ant) { + oxgrf_set_duplex_select (oxgrf->dev, 0, TDD); + oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1); + oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0); + } else { + oxgrf_set_duplex_select (oxgrf->dev, 0, FDD); + oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 0); + oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 1); + } + LOG_I(HW, "[oxgrf] RX Ant:%s\n", rx_ant?"Enabled":"Disabled"); + oxgrf_set_tx_fir_en_dis (oxgrf->dev, 0, 0); + oxgrf_set_rx_fir_en_dis (oxgrf->dev, 0, 0); + + int max_idx = ((oxgrf->rx_num_channels > 2 || oxgrf->tx_num_channels > 2)? 1 : 0); + + for(int chip_idx = 0; chip_idx <= max_idx; chip_idx++) { + // RX port Initialize + if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX frequency\n"); + } else + LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0])); + if ((status = oxgrf_set_rx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->sample_rate))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX sample rate\n"); + } else + LOG_I(HW, "[oxgrf] set RX sample rate to %u\n", (uint32_t)(openair0_cfg->sample_rate)); + if ((status = oxgrf_set_rx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->rx_bw))) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX bandwidth\n"); + } else + LOG_I(HW, "[oxgrf] set RX bandwidth to %u\n",(uint32_t)(openair0_cfg->rx_bw)); + + if ((status = oxgrf_set_rx1_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){ + LOG_E(HW, "[oxgrf] Failed to set RX1 Gain Control Mode\n"); + } else + LOG_I(HW, "[oxgrf] set RX1 Gain Control Mode MGC\n"); + + uint32_t rxgain = openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]; + if (rxgain > 30) + rxgain = 60; + else + rxgain *= 2; + if ((status = oxgrf_set_rx1_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) { + LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n"); + } else + LOG_I(HW, "[oxgrf] set RX1 gain to %u\n", rxgain); + + if ((status = oxgrf_set_rx2_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){ + LOG_E(HW, "[oxgrf] Failed to set RX2 Gain Control Mode\n"); + } else + LOG_I(HW, "[oxgrf] set RX2 Gain Control Mode MGC\n"); + + if ((status = oxgrf_set_rx2_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n"); + } else + LOG_I(HW, "[oxgrf] set RX2 gain to %u\n", rxgain); + + // TX port Initialize + if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)openair0_cfg->tx_freq[0])) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX frequency\n"); + } else + LOG_I(HW, "[oxgrf] set TX Frequency to %lu\n", (uint64_t)openair0_cfg->tx_freq[0]); + + if ((status = oxgrf_set_tx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->sample_rate)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX sample rate\n"); + } else + LOG_I(HW, "[oxgrf] set TX sampling rate to %u\n", (uint32_t)openair0_cfg->sample_rate); + + if ((status = oxgrf_set_tx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->tx_bw)) <0) { + LOG_E(HW, "[oxgrf] Failed to set TX bandwidth\n"); + } else + LOG_I(HW, "[oxgrf] set TX bandwidth to %u\n", (uint32_t)openair0_cfg->tx_bw); + + if ((status = oxgrf_set_tx1_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[0] * 1000)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n"); + } else + LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]); + + if ((status = oxgrf_set_tx2_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[1] * 1000)) < 0) { + LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n"); + } else + LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]); + } + + uint32_t depth = oxgrf->sample_rate / 10 * sizeof(int) * oxgrf->tx_num_channels; + oxgrf_set_hwbuf_depth(oxgrf->dev, 0, depth); + + oxgrf_enable_timestamp(oxgrf->dev, 0, 0); + sleep(2); + oxgrf_enable_timestamp(oxgrf->dev, 0, 1); + sleep(2); + + for(int i = 0; i < NCHAN_PER_DEV; i++) { + int ret = posix_memalign((void **)&cache_buf[i], 4096, BUFFER_SIZE); + if(ret) { + LOG_I(HW, "Failed to alloc memory\n"); + return -1; + } + ret = posix_memalign((void **)&iq_buf[i], 4096, BUFFER_SIZE); + if(ret) { + LOG_I(HW, "Failed to alloc memory\n"); + return -1; + } + } + + device->Mod_id = num_devices++; + device->type = OXGRF_DEV; + device->trx_start_func = trx_oxgrf_start; + device->trx_end_func = trx_oxgrf_end; + device->trx_read_func = trx_oxgrf_read; + device->trx_write_func = trx_oxgrf_write; + device->trx_get_stats_func = trx_oxgrf_get_stats; + device->trx_reset_stats_func = trx_oxgrf_reset_stats; + device->trx_stop_func = trx_oxgrf_stop; + device->trx_set_freq_func = trx_oxgrf_set_freq; + device->trx_set_gains_func = trx_oxgrf_set_gains; + device->openair0_cfg = openair0_cfg; + device->priv = (void *)oxgrf; + + return 0; +} + +/*@}*/ diff --git a/radio/OXGRF/oxgrf_lib.h b/radio/OXGRF/oxgrf_lib.h new file mode 100644 index 0000000000..6a9328cd81 --- /dev/null +++ b/radio/OXGRF/oxgrf_lib.h @@ -0,0 +1,97 @@ +/* + * 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.0 (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 + */ + +/** oxgrf_lib.h + * + * Author: eric + * base on bladerf_lib.h + */ + +#include "oxgrf_api_ss.h" +#include "common_lib.h" + +/** @addtogroup _OXGRF_PHY_RF_INTERFACE_ + * @{ + */ + +typedef enum { + Y230, + Y380, + Y550, + Y590, + IQX6000, + IQX7000, + IQX7100, + IQX7400, + IQX7402, //split + UNKNOWN = -1, +} OXGRFBoardType; + +/*! \brief OXGRF specific data structure */ +typedef struct { + + //! opaque OXGRF device struct. An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend) + OXGRF_DESCRIPTOR *dev; + int16_t *rx_buffer; + int16_t *tx_buffer; + //! Sample rate + unsigned int sample_rate; + + int rx_num_channels; + int tx_num_channels; + uint64_t tx_lo_freq; + uint64_t rx_lo_freq; + + // -------------------------------- + // Debug and output control + // -------------------------------- + //! Number of underflows + int num_underflows; + //! Number of overflows + int num_overflows; + //! number of RX errors + int num_rx_errors; + //! Number of TX errors + int num_tx_errors; + + //! timestamp of current TX + uint64_t tx_current_ts; + //! timestamp of current RX + uint64_t rx_current_ts; + //! number of TX samples + uint64_t tx_nsamps; + //! number of RX samples + uint64_t rx_nsamps; + //! number of TX count + uint64_t tx_count; + //! number of RX count + uint64_t rx_count; + //! timestamp of RX packet + openair0_timestamp rx_timestamp; + OXGRFBoardType BoardType; +} oxgrf_state_t; + +/*! \brief get current timestamp + *\param device the hardware to use + */ +openair0_timestamp trx_get_timestamp(openair0_device *device); + +/*@}*/ diff --git a/radio/OXGRF/rf_helper.h b/radio/OXGRF/rf_helper.h new file mode 100644 index 0000000000..10c650a76a --- /dev/null +++ b/radio/OXGRF/rf_helper.h @@ -0,0 +1,56 @@ +/* + * Copyright 2013-2020 Software Radio Systems Limited + * + * This file is part of srsLTE. + * + * srsLTE is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * srsLTE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * A copy of the GNU Affero General Public License can be found in + * the LICENSE file in the top-level directory of this distribution + * and at http://www.gnu.org/licenses/. + * + */ +#ifndef OXGRF_RF_HELPER_H_ +#define OXGRF_RF_HELPER_H_ + +// A bunch of helper functions to process device arguments + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define REMOVE_SUBSTRING_WITHCOMAS(S, TOREMOVE) \ + remove_substring(S, TOREMOVE ","); \ + remove_substring(S, TOREMOVE ", "); \ + remove_substring(S, "," TOREMOVE); \ + remove_substring(S, ", " TOREMOVE); \ + remove_substring(S, TOREMOVE) + +static inline void remove_substring(char* s, const char* toremove) +{ + while ((s = strstr(s, toremove))) { + memmove(s, s + strlen(toremove), 1 + strlen(s + strlen(toremove))); + } +} + +static inline void copy_subdev_string(char* dst, char* src) +{ + int n = 0; + int len = (int)strlen(src); + /* Copy until end of string or comma */ + while (n < len && src[n] != '\0' && src[n] != ',') { + dst[n] = src[n]; + n++; + } + dst[n] = '\0'; +} + +#endif /* OXGRF_RF_HELPER_H_ */ diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf new file mode 100644 index 0000000000..bed89a7119 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf @@ -0,0 +1,223 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } ); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2680000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 102; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 1; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower = 0; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.0.80"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + enable_measurement_reports = "no"; + + ///X2 + enable_x2 = "no"; + t_reloc_prep = 1000; /* unit: millisecond */ + tx2_reloc_overall = 2000; /* unit: millisecond */ + t_dc_prep = 1000; /* unit: millisecond */ + t_dc_overall = 2000; /* unit: millisecond */ + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "eno2"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.0.202/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eno2"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.0.202/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "192.168.0.202/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 3; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + sdr_addrs = "dev=pciex:0,auxdac1=1620"; + clock_src = "internal"; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + }; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf new file mode 100644 index 0000000000..62f4bd0135 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf @@ -0,0 +1,309 @@ +Active_eNBs = ( "eNB-Eurecom-LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB-Eurecom-LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } ); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "3GPP_eNODEB"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 89; + rx_gain = 102; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 0; + pdsch_referenceSignalPower = -27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + + //Parameters for SIB18 + rxPool_sc_CP_Len = "normal"; + rxPool_sc_Period = "sf40"; + rxPool_data_CP_Len = "normal"; + rxPool_ResourceConfig_prb_Num = 20; + rxPool_ResourceConfig_prb_Start = 5; + rxPool_ResourceConfig_prb_End = 44; + rxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + rxPool_ResourceConfig_offsetIndicator_choice = 0; + rxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000"; + rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; +/* rxPool_dataHoppingConfig_hoppingParameter = 0; + rxPool_dataHoppingConfig_numSubbands = "ns1"; + rxPool_dataHoppingConfig_rbOffset = 0; + rxPool_commTxResourceUC-ReqAllowed = "TRUE"; +*/ + // Parameters for SIB19 + discRxPool_cp_Len = "normal" + discRxPool_discPeriod = "rf32" + discRxPool_numRetx = 1; + discRxPool_numRepetition = 2; + discRxPool_ResourceConfig_prb_Num = 5; + discRxPool_ResourceConfig_prb_Start = 3; + discRxPool_ResourceConfig_prb_End = 21; + discRxPool_ResourceConfig_offsetIndicator_present = "prSmall"; + discRxPool_ResourceConfig_offsetIndicator_choice = 0; + discRxPool_ResourceConfig_subframeBitmap_present = "prBs40"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff"; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; + discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.1.100"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + enable_measurement_reports = "no"; + + ///X2 + enable_x2 = "yes"; + t_reloc_prep = 1000; /* unit: millisecond */ + tx2_reloc_overall = 2000; /* unit: millisecond */ + t_dc_prep = 1000; /* unit: millisecond */ + t_dc_overall = 2000; /* unit: millisecond */ + + NETWORK_INTERFACES : + { + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.1.1/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.1.1/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + + ENB_IPV4_ADDRESS_FOR_X2C = "127.0.1.1/24"; + ENB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + } +); + +DU = ( + { + DU_INTERFACE_NAME_FOR_F1U = "lo"; + DU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1/16"; + DU_PORT_FOR_F1U = 22100; + F1_U_DU_TRANSPORT_TYPE = "TCP"; + } + ); + +CU = ( + { + CU_INTERFACE_NAME_FOR_F1U = "lo"; + CU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1"; //Address to search the DU + CU_PORT_FOR_F1U = 22100; + F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP + DU_TYPE = "LTE"; + }//, +// { +// CU_INTERFACE_NAME_FOR_F1U = "eth0"; +// CU_IPV4_ADDRESS_FOR_F1U = "10.64.93.142"; //Address to search the DU +// CU_PORT_FOR_F1U = 2211; +// F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP +// DU_TYPE = "WiFi"; +// } + ); + + CU_BALANCING = "ALL"; + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + phy_test_mode = 0; + puSch10xSnr = 200; + puCch10xSnr = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 5 + att_rx = 10; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + sdr_addrs = "dev=pciex:0,auxdac1=1620"; + clock_src = "internal"; + + } +); + +NETWORK_CONTROLLER : +{ + FLEXRAN_ENABLED = "no"; + FLEXRAN_INTERFACE_NAME = "lo"; + FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; + FLEXRAN_PORT = 2210; + FLEXRAN_CACHE = "/mnt/oai_agent_cache"; + FLEXRAN_AWAIT_RECONF = "no"; +}; + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +/* +#example config for rfsimulator +rfsimulator : +{ + serveraddr = "enb"; + serverport = "4043"; + options = ("saviq"); + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; +*/ + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + }; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf new file mode 100644 index 0000000000..2884cfd68c --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf @@ -0,0 +1,263 @@ +Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe01; + + cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-Eurecom-5GNRBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({mcc = 001; mnc = 01; mnc_length = 2;}); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 641272; //641032; #641968; 641968=start of ssb at 3600MHz + 82 RBs 641032=center of SSB at center of cell + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 640000; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=84,L=13 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 6368; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 0; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 6368; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -100; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 5; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, + +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; #0x80; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; //8; //7; + nrofDownlinkSymbols = 6; //0; //6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; //0; //4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + amf_ip_address = ( { ipv4 = "127.0.1.100"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + ///X2 + enable_x2 = "yes"; + t_reloc_prep = 1000; /* unit: millisecond */ + tx2_reloc_overall = 2000; /* unit: millisecond */ + t_dc_prep = 1000; /* unit: millisecond */ + t_dc_overall = 2000; /* unit: millisecond */ + target_enb_x2_ip_address = ( + { ipv4 = "127.0.1.1"; + ipv6 = "192:168:30::17"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "lo"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "127.0.1.2/24"; + GNB_INTERFACE_NAME_FOR_NGU = "lo"; + GNB_IPV4_ADDRESS_FOR_NGU = "127.0.1.2/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + GNB_IPV4_ADDRESS_FOR_X2C = "127.0.1.2/24"; + GNB_PORT_FOR_X2C = 36422; # Spec 36422 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 5 + att_rx = 10; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + sdr_addrs = "dev=pciex:0,auxdac1=1620"; + clock_src = "internal"; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0", "nea2" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia0" ); +}; + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + }; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf new file mode 100644 index 0000000000..41bdf7f7e5 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf @@ -0,0 +1,269 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 1; + ul_prbblacklist = "51,52,53,54" + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; # 641280 + dl_frequencyBand = 78; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; # 640008 + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.0.80"; #"192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.202"; #"192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.202"; #"192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 300; + pucch_TargetSNRx10 = 300; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + #pucch0_dtx_threshold = 120; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "dev=pciex:0,auxdac1=1630"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf new file mode 100644 index 0000000000..7894f28380 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf @@ -0,0 +1,268 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + do_CSIRS = 1; + do_SRS = 1; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 641280; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 640008; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "eno2"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.202/24"; + GNB_INTERFACE_NAME_FOR_NGU = "eno2"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.202/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 100; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0; + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + sdr_addrs = "dev=pciex:0,auxdac1=1660"; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf new file mode 100644 index 0000000000..b6347edc28 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf @@ -0,0 +1,270 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 1; + ul_prbblacklist = "135,136,137,138" + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) + absoluteFrequencySSB = 623232; + dl_frequencyBand = 78; + # this is 3300.24 MHz + dl_absoluteFrequencyPointA = 620016; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + initialDLBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -90; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -5; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.0.80"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.201/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.201/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 300; + pucch_TargetSNRx10 = 300; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; + ul_max_mcs = 28; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 80; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "dev=pciex:0,auxdac1=1630"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf new file mode 100644 index 0000000000..48a0b68bef --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf @@ -0,0 +1,271 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts_XP = 1; + pusch_AntennaPorts = 1; + do_CSIRS = 1; + ul_prbblacklist = "135,136,137,138" + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) + absoluteFrequencySSB = 623232; + dl_frequencyBand = 78; + # this is 3300.24 MHz + dl_absoluteFrequencyPointA = 620016; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + initialDLBWPlocationAndBandwidth = 1099; + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 10; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -90; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -5; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.0.80"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.201/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.201/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 300; + pucch_TargetSNRx10 = 300; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; +# ul_max_mcs = 28; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 80; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1; + nb_rx = 1; + att_tx = 0; + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 102; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "dev=pciex:0,auxdac1=1630"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/xdma.patch b/xdma.patch new file mode 100755 index 0000000000..12ee6d176f --- /dev/null +++ b/xdma.patch @@ -0,0 +1,3500 @@ +From 1447e9734d0a4bceb43343b0323b3396229a0f81 Mon Sep 17 00:00:00 2001 +From: Eric <eric@v3best.com> +Date: Wed, 20 Sep 2023 13:31:18 +0800 +Subject: [PATCH] v3tech: add OXGRF device support + +--- + CMakeLists.txt | 2 +- + cmake_targets/build_oai | 8 +- + cmake_targets/tools/build_helper | 28 + + executables/lte-softmodem.h | 2 + + executables/lte-uesoftmodem.c | 3 + + executables/nr-softmodem-common.h | 2 + + executables/nr-uesoftmodem.c | 2 + + executables/nr-uesoftmodem.h | 1 + + openair1/PHY/impl_defs_top.h | 1 + + radio/CMakeLists.txt | 5 + + radio/COMMON/common_lib.c | 2 +- + radio/COMMON/common_lib.h | 2 + + radio/OXGRF/CMakeLists.txt | 9 + + radio/OXGRF/rf_helper.h | 56 ++ + radio/OXGRF/oxgrf_lib.c | 847 ++++++++++++++++++ + radio/OXGRF/oxgrf_lib.h | 97 ++ + .../CONF/enb.band7.tm1.100PRB.oxgrf.conf | 223 +++++ + .../CONF/enb.band7.tm1.50PRB.oxgrf.conf | 309 +++++++ + .../CONF/gnb.band78.tm1.106PRB.oxgrf.conf | 263 ++++++ + .../gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf | 277 ++++++ + .../gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf | 269 ++++++ + .../CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf | 268 ++++++ + .../gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf | 270 ++++++ + .../CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf | 271 ++++++ + 24 files changed, 3213 insertions(+), 4 deletions(-) + create mode 100644 radio/OXGRF/CMakeLists.txt + create mode 100644 radio/OXGRF/rf_helper.h + create mode 100644 radio/OXGRF/oxgrf_lib.c + create mode 100644 radio/OXGRF/oxgrf_lib.h + create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf + create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf + create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 27a7c471d5..2abab44768 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -2359,7 +2359,7 @@ if (${T_TRACER}) + nr_ulschsim ldpctest polartest smallblocktest cu_test du_test + #all "add_library" definitions + ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap +- params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer ++ params_libconfig oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer oai_oxgrfdevif + oai_eth_transpro oai_mobipass coding HASHTABLE UTIL OMG_SUMO + SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL + NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB +diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai +index 8de83f473d..5168ef9e9a 100755 +--- a/cmake_targets/build_oai ++++ b/cmake_targets/build_oai +@@ -93,7 +93,7 @@ Options: + --UE-gen-nvram [output path] + Specify gen_nvram_path (default \"$gen_nvram_path\") + -w | --hardware +- USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, None (Default) ++ USRP, BLADERF, LMSSDR, IRIS, SIMU, AW2SORI, OXGRF, None (Default) + Adds this RF board support (in external packages installation and in compilation) + -t | --transport + Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g +@@ -272,7 +272,7 @@ function main() { + shift;; + -w | --hardware) + case "$2" in +- "USRP" | "BLADERF" | "LMSSDR" | "IRIS") ++ "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "OXGRF") + HW="OAI_"$2 + TARGET_LIST="$TARGET_LIST oai_${2,,}devif" # ,, makes lowercase + CMAKE_CMD="$CMAKE_CMD -DOAI_$2=ON" +@@ -457,6 +457,10 @@ function main() { + flash_firmware_bladerf + fi + fi ++ if [ "$HW" == "OAI_OXGRF" ] ; then ++ echo_info "installing packages for OXGRF support" ++ #check_install_oxgrf_driver ++ fi + if [ "$HW" == "OAI_IRIS" ] ; then + echo_info "installing packages for IRIS support" + check_install_soapy +diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper +index c0b2fa237b..8f9df0e752 100755 +--- a/cmake_targets/tools/build_helper ++++ b/cmake_targets/tools/build_helper +@@ -400,6 +400,34 @@ install_usrp_uhd_driver() { + fi + } + ++check_install_oxgrf_driver() { ++#if modinfo riffa > /dev/null 2>&1 ++ if modinfo xdma > /dev/null 2>&1 ++ then ++ echo_success "OXGRF driver has loaded." ++ else ++ git clone https://github.com/v3best/riffa /tmp/riffa ++ if [ $? -ne 0 ]; then ++ echo_fatal "OXGRF driver download failed, please check your net connection." ++ else ++ cd /tmp/riffa/driver/linux ++ make && $SUDO make install ++ echo_success "OXGRF driver install success, please restart your PC later." ++ fi ++ git clone https://github.com/v3best/liboxgrf /tmp/liboxgrf ++ if [ $? -ne 0 ]; then ++ echo_fatal "OXGRF API download failed, please check your net connection." ++ else ++ cd /tmp/liboxgrf ++ mkdir build ++ cd build ++ cmake ../ ++ make && $SUDO make install && $SUDO ldconfig ++ echo_success "OXGRF API install success, please restart your PC later." ++ fi ++ fi ++} ++ + install_bladerf_driver_from_source(){ + bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt + echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log " +diff --git a/executables/lte-softmodem.h b/executables/lte-softmodem.h +index 4143bce3a4..617dafbb7e 100644 +--- a/executables/lte-softmodem.h ++++ b/executables/lte-softmodem.h +@@ -73,6 +73,7 @@ + #define CONFIG_HLP_PRB "Set the PRB, valid values: 6, 25, 50, 100 \n" + #define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n" + #define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n" ++#define CONFIG_HLP_OXGRF_ARGS "set the arguments to identify OXGRF\n" + #define CONFIG_HLP_DMAMAP "use DMA memory mapping\n" + #define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n" + #define CONFIG_HLP_TADV "Set timing_advance\n" +@@ -104,6 +105,7 @@ + {"r" , CONFIG_HLP_PRB, 0, .u8ptr=&(frame_parms[0]->N_RB_DL), .defintval=25, TYPE_UINT8, 0}, \ + {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0, TYPE_INT, 0}, \ + {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200",TYPE_STRING, 0}, \ ++ {"oxgrf-args", CONFIG_HLP_OXGRF_ARGS, 0, .strptr=&oxgrf_args, .defstrval="dev=pciex:0",TYPE_STRING, 0}, \ + {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, .uptr=&mmapped_dma, .defintval=0, TYPE_INT, 0}, \ + {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, .iptr=&tddflag, .defintval=0, TYPE_INT, 0}, \ + {"A", CONFIG_HLP_TADV, 0, .iptr=&(timingadv), .defintval=0, TYPE_INT, 0}, \ +diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c +index c7e8c9300a..5e7a1dacf4 100644 +--- a/executables/lte-uesoftmodem.c ++++ b/executables/lte-uesoftmodem.c +@@ -159,6 +159,8 @@ int transmission_mode=1; + char *usrp_args=NULL; + char *usrp_clksrc=NULL; + ++char *oxgrf_args=NULL; ++ + THREAD_STRUCT thread_struct; + /* struct for ethernet specific parameters given in eNB conf file */ + eth_params_t *eth_params; +@@ -470,6 +472,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) { + } + + if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; ++ if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args; + } + } + +diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h +index 2550001956..d1ffc171f0 100644 +--- a/executables/nr-softmodem-common.h ++++ b/executables/nr-softmodem-common.h +@@ -103,6 +103,8 @@ + #define CONFIG_HLP_TX_SUBDEV "set the arguments to select tx_subdev (same syntax as in UHD)\n" + #define CONFIG_HLP_RX_SUBDEV "set the arguments to select rx_subdev (same syntax as in UHD)\n" + ++#define CONFIG_HLP_OXGRF_ARGS "set the arguments to identify OXGRF\n" ++ + #define CONFIG_HLP_FLOG "Enable online log \n" + #define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" + #define CONFIG_HLP_LOGV "Set the global log verbosity \n" +diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c +index c970b1d09d..4a5a3b4025 100644 +--- a/executables/nr-uesoftmodem.c ++++ b/executables/nr-uesoftmodem.c +@@ -120,6 +120,7 @@ int vcdflag = 0; + + double rx_gain_off = 0.0; + char *usrp_args = NULL; ++char *oxgrf_args = NULL; + char *tx_subdev = NULL; + char *rx_subdev = NULL; + char *rrc_config_path = NULL; +@@ -363,6 +364,7 @@ void init_openair0(void) { + openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file; + + if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; ++ if (oxgrf_args) openair0_cfg[card].sdr_addrs = oxgrf_args; + if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev; + if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev; + +diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h +index 3549a7fae1..1ba69e3aa6 100644 +--- a/executables/nr-uesoftmodem.h ++++ b/executables/nr-uesoftmodem.h +@@ -31,6 +31,7 @@ + // clang-format off + #define CMDLINE_NRUEPARAMS_DESC { \ + {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200", TYPE_STRING, 0}, \ ++ {"oxgrf-args", CONFIG_HLP_OXGRF_ARGS, 0, .strptr=&oxgrf_args, .defstrval="dev=pciex:0", TYPE_STRING, 0}, \ + {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, .strptr=&tx_subdev, .defstrval=NULL, TYPE_STRING, 0}, \ + {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, .strptr=&rx_subdev, .defstrval=NULL, TYPE_STRING, 0}, \ + {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, .iptr=&single_thread_flag, .defintval=1, TYPE_INT, 0}, \ +diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h +index 5c461b27b0..6a525fefdd 100644 +--- a/openair1/PHY/impl_defs_top.h ++++ b/openair1/PHY/impl_defs_top.h +@@ -43,6 +43,7 @@ + * @defgroup _GENERIC_PHY_RF_INTERFACE_ Generic PHY - RF Interface + * @defgroup _USRP_PHY_RF_INTERFACE_ PHY - USRP RF Interface + * @defgroup _BLADERF_PHY_RF_INTERFACE_ PHY - BLADERF RF Interface ++ * @defgroup _OXGRF_PHY_RF_INTERFACE_ PHY - OXGRF RF Interface + * @defgroup _LMSSDR_PHY_RF_INTERFACE_ PHY - LMSSDR RF Interface + * @} + * @} +diff --git a/radio/CMakeLists.txt b/radio/CMakeLists.txt +index 937d8039f9..1dbaaa0c56 100644 +--- a/radio/CMakeLists.txt ++++ b/radio/CMakeLists.txt +@@ -32,3 +32,8 @@ add_boolean_option(OAI_USRP OFF "Activate OAI's USRP driver" OFF) + if(OAI_USRP) + add_subdirectory(USRP) + endif() ++ ++add_boolean_option(OAI_OXGRF OFF "Activate OAI's OXGRF driver" OFF) ++if(OAI_OXGRF) ++ add_subdirectory(OXGRF) ++endif() +diff --git a/radio/COMMON/common_lib.c b/radio/COMMON/common_lib.c +index 4d78018d8c..ce804b21f5 100644 +--- a/radio/COMMON/common_lib.c ++++ b/radio/COMMON/common_lib.c +@@ -44,7 +44,7 @@ + #include "executables/softmodem-common.h" + + const char *const devtype_names[MAX_RF_DEV_TYPE] = +- {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"}; ++ {"", "USRP B200", "USRP X300", "USRP N300", "USRP X400", "BLADERF", "OXGRF", "LMSSDR", "IRIS", "No HW", "UEDv2", "RFSIMULATOR"}; + + const char *get_devname(int devtype) { + if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE ) +diff --git a/radio/COMMON/common_lib.h b/radio/COMMON/common_lib.h +index d735fab4f0..d53f9bf02d 100644 +--- a/radio/COMMON/common_lib.h ++++ b/radio/COMMON/common_lib.h +@@ -93,6 +93,8 @@ typedef enum { + USRP_X400_DEV, + /*!\brief device is BLADE RF*/ + BLADERF_DEV, ++ /*!\brief device is OXGRF pcie*/ ++ OXGRF_DEV, + /*!\brief device is LMSSDR (SoDeRa)*/ + LMSSDR_DEV, + /*!\brief device is Iris */ +diff --git a/radio/OXGRF/CMakeLists.txt b/radio/OXGRF/CMakeLists.txt +new file mode 100644 +index 0000000000..93ff573534 +--- /dev/null ++++ b/radio/OXGRF/CMakeLists.txt +@@ -0,0 +1,9 @@ ++find_library(oxgrf_ss NAMES oxgrf_ss) ++ ++add_library(oai_oxgrfdevif MODULE oxgrf_lib.c) ++target_link_libraries(oai_oxgrfdevif PRIVATE oxgrf_ss) ++target_link_libraries(oai_oxgrfdevif PRIVATE UTIL) ++set_target_properties(oai_oxgrfdevif PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) ++add_custom_command(TARGET oai_oxgrfdevif POST_BUILD ++ COMMAND ${CMAKE_COMMAND} -E create_symlink liboai_oxgrfdevif.so liboai_device.so ++ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +diff --git a/radio/OXGRF/rf_helper.h b/radio/OXGRF/rf_helper.h +new file mode 100644 +index 0000000000..ee82d49172 +--- /dev/null ++++ b/radio/OXGRF/rf_helper.h +@@ -0,0 +1,56 @@ ++/* ++ * Copyright 2013-2020 Software Radio Systems Limited ++ * ++ * This file is part of srsLTE. ++ * ++ * srsLTE is free software: you can redistribute it and/or modify ++ * it under the terms of the GNU Affero General Public License as ++ * published by the Free Software Foundation, either version 3 of ++ * the License, or (at your option) any later version. ++ * ++ * srsLTE is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU Affero General Public License for more details. ++ * ++ * A copy of the GNU Affero General Public License can be found in ++ * the LICENSE file in the top-level directory of this distribution ++ * and at http://www.gnu.org/licenses/. ++ * ++ */ ++#ifndef OXGRF_RF_HELPER_H_ ++#define OXGRF_RF_HELPER_H_ ++ ++// A bunch of helper functions to process device arguments ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++#define REMOVE_SUBSTRING_WITHCOMAS(S, TOREMOVE) \ ++ remove_substring(S, TOREMOVE ","); \ ++ remove_substring(S, TOREMOVE ", "); \ ++ remove_substring(S, "," TOREMOVE); \ ++ remove_substring(S, ", " TOREMOVE); \ ++ remove_substring(S, TOREMOVE) ++ ++static inline void remove_substring(char* s, const char* toremove) ++{ ++ while ((s = strstr(s, toremove))) { ++ memmove(s, s + strlen(toremove), 1 + strlen(s + strlen(toremove))); ++ } ++} ++ ++static inline void copy_subdev_string(char* dst, char* src) ++{ ++ int n = 0; ++ int len = (int)strlen(src); ++ /* Copy until end of string or comma */ ++ while (n < len && src[n] != '\0' && src[n] != ',') { ++ dst[n] = src[n]; ++ n++; ++ } ++ dst[n] = '\0'; ++} ++ ++#endif /* OXGRF_RF_HELPER_H_ */ +diff --git a/radio/OXGRF/oxgrf_lib.c b/radio/OXGRF/oxgrf_lib.c +new file mode 100644 +index 0000000000..0661091bf5 +--- /dev/null ++++ b/radio/OXGRF/oxgrf_lib.c +@@ -0,0 +1,847 @@ ++/* ++ * 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.0 (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 ++ */ ++ ++/** oxgrf_lib.c ++ * ++ * Author: eric ++ * base on bladerf_lib.c ++ */ ++ ++#pragma GCC optimize(3, "Ofast", "inline") ++#include <stdio.h> ++#include <stdlib.h> ++#include <stdbool.h> ++#include <unistd.h> ++#include <string.h> ++#include <inttypes.h> ++#include <math.h> ++#include "oxgrf_lib.h" ++#include "rf_helper.h" ++#include "common/utils/LOG/log.h" ++ ++/** @addtogroup _OXGRF_PHY_RF_INTERFACE_ ++ * @{ ++ */ ++#include "openair1/PHY/sse_intrin.h" ++ ++//! Number of OXGRF devices ++int num_devices = 0; ++static bool running = false; ++ ++#define BUFFER_SIZE (122880 * 100 * sizeof(int)) ++#define NCHAN_PER_DEV 4 ++static void *cache_buf[NCHAN_PER_DEV]; ++static void *iq_buf[NCHAN_PER_DEV]; ++static uint32_t remain = 0; ++static uint32_t RX_MTU = 30720; ++static uint8_t shift = 2; ++ ++static inline int channel_to_mask(int channel_count) ++{ ++ uint8_t ch_mask; ++ switch (channel_count) { ++ case 4: ++ ch_mask = 0xf;break; ++ case 3: ++ ch_mask = 0x7;break; ++ case 2: ++ ch_mask = 0x3;break; ++ case 1: ++ ch_mask = 0x1;break; ++ default: ++ ch_mask = 0x1;break; ++ } ++ ++ return ch_mask; ++} ++ ++/*! \brief get current timestamp ++ *\param device the hardware to use ++ *\returns timestamp of OXGRF ++ */ ++ ++openair0_timestamp trx_get_timestamp(openair0_device *device) { ++ return 0; ++} ++ ++/*! \brief Start oxgrf ++ * \param device the hardware to use ++ * \returns 0 on success ++ */ ++int trx_oxgrf_start(openair0_device *device) { ++ ++ LOG_I(HW, "[oxgrf] Start oxgrf ...\n"); ++ running = true; ++ ++ return 0; ++} ++ ++/*! \brief Called to send samples to the oxgrf RF target ++ \param device pointer to the device structure specific to the RF hardware target ++ \param timestamp The timestamp at whicch the first sample MUST be sent ++ \param buff Buffer which holds the samples ++ \param nsamps number of samples to be sent ++ \param cc index of the component carrier ++ \param flags Ignored for the moment ++ \returns 0 on success ++ */ ++static int trx_oxgrf_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { ++ ++ int status; ++ oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv; ++ ++ uint32_t trx_flags = 0; ++ radio_tx_burst_flag_t flags_burst = (radio_tx_burst_flag_t) (flags & 0xf); ++ ++ if (flags_burst == TX_BURST_START) { ++ trx_flags = 0; ++ } else if (flags_burst == TX_BURST_END) { ++ trx_flags = 1; ++ } else if (flags_burst == TX_BURST_START_AND_END) { ++ trx_flags = 1; ++ } else if (flags_burst == TX_BURST_MIDDLE) { ++ trx_flags = 0; ++ } ++ ++ for(int i = 0; i < cc; i++) { ++ int len = nsamps * 2; ++ int16_t *iq = buff[i]; ++#if defined(__x86_64) || defined(__i386__) ++ __m256i a, *b; ++ ++ while (len >= 16) { ++ a = *(__m256i *)&iq[0]; ++ b = (__m256i *)&iq[0]; ++ *b = simde_mm256_slli_epi16(a, 4); ++ iq += 16; ++ len -= 16; ++ } ++#elif defined(__arm__) || defined(__aarch64__) ++ int16x8_t a, *b; ++ ++ while (len >= 8) { ++ a = *(int16x8_t *)&iq[0]; ++ b = (int16x8_t *)&iq[0]; ++ *b = vshlq_n_s16(a, 4); ++ iq += 8; ++ len -= 8; ++ } ++#endif ++ /* remaining data */ ++ while (len != 0) { ++ iq[0] <<= 4; ++ iq++; ++ len--; ++ } ++ } ++ ++ status = oxgrf_write_samples_multiport(oxgrf->dev, (const void **)buff, nsamps, channel_to_mask(cc), timestamp, trx_flags); ++ if (status < 0) { ++ oxgrf->num_tx_errors++; ++ LOG_E(HW, "[oxgrf] Failed to TX samples\n"); ++ exit(-1); ++ } ++ ++ //LOG_D(HW, "Provided TX timestamp: %u, nsamps: %u\n", ptimestamp, nsamps); ++ ++ oxgrf->tx_current_ts = timestamp; ++ oxgrf->tx_nsamps += nsamps; ++ oxgrf->tx_count++; ++ ++ return nsamps; ++} ++ ++/*! \brief Receive samples from hardware. ++ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for ++ * the first channel. *ptimestamp is the time at which the first sample ++ * was received. ++ * \param device the hardware to use ++ * \param[out] ptimestamp the time at which the first sample was received. ++ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps. ++ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte. ++ * \param cc Index of component carrier ++ * \returns number of samples read ++ */ ++static int trx_oxgrf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { ++ ++ int status; ++ oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; ++ uint64_t timestamp = 0UL; ++ ++retry: ++ if(remain == 0) { ++ int recv = 0; ++ timestamp = 0UL; ++ if(nsamps % RX_MTU) { ++ recv = (nsamps / RX_MTU + 1) * RX_MTU; ++ status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), ×tamp); ++ if (status < 0) { ++ LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); ++ oxgrf->num_rx_errors++; ++ exit(-1); ++ } ++ for(int i = 0; i < cc; i++) ++ memcpy(buff[i], iq_buf[i], nsamps * 4); ++ if(recv > nsamps) { ++ for(int i = 0; i < cc; i++) ++ memcpy(cache_buf[i], iq_buf[i] + nsamps * 4, (recv - nsamps) * 4); ++ remain = recv - nsamps; ++ } ++ } else { ++ recv = nsamps; ++ status = oxgrf_read_samples_multiport(oxgrf->dev, buff, recv, channel_to_mask(cc), ×tamp); ++ if (status < 0) { ++ LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); ++ oxgrf->num_rx_errors++; ++ exit(-1); ++ } ++ } ++ ++ *(uint64_t *)ptimestamp = timestamp; ++ oxgrf->rx_current_ts = timestamp + nsamps; ++ //LOG_D(HW, "case 0: Current RX timestamp %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n", *ptimestamp, timestamp, nsamps, remain, recv); ++ } else if(remain >= nsamps) { ++ for(int i = 0; i < cc; i++) ++ memcpy(buff[i], cache_buf[i], nsamps * 4); ++ remain -= nsamps; ++ if(remain > 0) { ++ for(int i = 0; i < cc; i++) ++ memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4); ++ } ++ *(uint64_t *)ptimestamp = oxgrf->rx_current_ts; ++ oxgrf->rx_current_ts += nsamps; ++ //LOG_D(HW, "case 1: Current RX timestamp %"PRIu64", nsamps %u, remain %u\n", *ptimestamp, nsamps, remain); ++ } else { ++ int recv; ++ if(remain + RX_MTU >= nsamps) ++ recv = RX_MTU; ++ else ++ recv = (nsamps / RX_MTU + 1) * RX_MTU; ++ timestamp = 0UL; ++ status = oxgrf_read_samples_multiport(oxgrf->dev, iq_buf, recv, channel_to_mask(cc), ×tamp); ++ if (status < 0) { ++ LOG_E(HW, "[oxgrf] Failed to read samples %d\n", nsamps); ++ oxgrf->num_rx_errors++; ++ exit(-1); ++ } ++ if(timestamp != (oxgrf->rx_current_ts + remain)) { ++ int overflow = timestamp - (oxgrf->rx_current_ts + remain); ++ LOG_W(HW, "Rx overflow %u samples\n", overflow); ++ //remain += overflow; ++ remain = 0; ++ goto retry; ++ } ++ for(int i = 0; i < cc; i++) ++ memcpy(cache_buf[i] + remain * 4, iq_buf[i], recv * 4); ++ for(int i = 0; i < cc; i++) ++ memcpy(buff[i], cache_buf[i], nsamps * 4); ++ remain = recv + remain - nsamps; ++ for(int i = 0; i < cc; i++) ++ memmove(cache_buf[i], cache_buf[i] + nsamps * 4, remain * 4); ++ ++ *(uint64_t *)ptimestamp = oxgrf->rx_current_ts; ++ oxgrf->rx_current_ts += nsamps; ++ //LOG_D(HW, "case 2: Current RX timestamp %"PRIu64", hw ts %"PRIu64", nsamps %u, remain %u, recv: %u\n", *ptimestamp, timestamp, nsamps, remain, recv); ++ } ++ ++ for(int i = 0; i < cc; i++) { ++ int len = nsamps * 2; ++ int16_t *iq = buff[i]; ++#if defined(__x86_64__) || defined(__i386__) ++ __m256i a, *b; ++ ++ while (len >= 16) { ++ a = *(__m256i *)&iq[0]; ++ b = (__m256i *)&iq[0]; ++ *b = simde_mm256_srai_epi16(a, shift); ++ iq += 16; ++ len -= 16; ++ } ++#elif defined(__arm__) || defined(__aarch64__) ++ int16x8_t a, *b; ++ ++ while (len >= 8) { ++ a = *(int16x8_t *)&iq[0]; ++ b = (int16x8_t *)&iq[0]; ++ *b = vshrq_n_s16(a, shift); ++ iq += 8; ++ len -= 8; ++ } ++#endif ++ /* remaining data */ ++ while (len != 0) { ++ iq[0] >>= shift; ++ iq++; ++ len--; ++ } ++ } ++ //LOG_D(HW, "Current RX timestamp %"PRIu64", nsamps %u\n", *ptimestamp, nsamps); ++ oxgrf->rx_nsamps += nsamps; ++ oxgrf->rx_count++; ++ ++ return nsamps; ++ ++} ++ ++/*! \brief Terminate operation of the oxgrf transceiver -- free all associated resources ++ * \param device the hardware to use ++ */ ++void trx_oxgrf_end(openair0_device *device) { ++ ++ oxgrf_state_t *oxgrf = (oxgrf_state_t*)device->priv; ++ ++ if(!running) ++ return; ++ running = false; ++ ++ LOG_I(HW, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); ++ for(int i = 0; i < oxgrf->tx_num_channels; i++) { ++ uint32_t count = 0; ++ oxgrf_get_channel_event(oxgrf->dev, TX_CHANNEL_TIMEOUT, i+1, &count); ++ LOG_I(HW, "[oxgrf] TX%d Channel timeout: %u\n", i+1, count); ++ } ++ for(int i = 0; i < oxgrf->rx_num_channels; i++) { ++ uint32_t count = 0; ++ oxgrf_get_channel_event(oxgrf->dev, RX_CHANNEL_OVERFLOW, i+1, &count); ++ LOG_I(HW, "[oxgrf] RX%d Channel overflow: %u\n", i+1, count); ++ } ++ LOG_I(HW, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); ++ ++ oxgrf_close_device(oxgrf->dev); ++ ++ return; ++} ++ ++/*! \brief print the oxgrf statistics ++ * \param device the hardware to use ++ * \returns 0 on success ++ */ ++int trx_oxgrf_get_stats(openair0_device* device) { ++ return(0); ++} ++ ++/*! \brief Reset the oxgrf statistics ++ * \param device the hardware to use ++ * \returns 0 on success ++ */ ++int trx_oxgrf_reset_stats(openair0_device* device) { ++ return(0); ++ ++} ++ ++/*! \brief Stop oxgrf ++ * \param card the hardware to use ++ * \returns 0 in success ++ */ ++int trx_oxgrf_stop(openair0_device* device) { ++ return(0); ++} ++ ++/*! \brief Set frequencies (TX/RX) ++ * \param device the hardware to use ++ * \param openair0_cfg RF frontend parameters set by application ++ * \param dummy dummy variable not used ++ * \returns 0 in success ++ */ ++int trx_oxgrf_set_freq(openair0_device* device, openair0_config_t *openair0_cfg) { ++ ++ int status; ++ oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; ++ ++ if(oxgrf->tx_lo_freq != openair0_cfg->tx_freq[0]) { ++ if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->tx_freq[0]))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX frequency\n"); ++ } else { ++ LOG_I(HW, "[oxgrf] set TX frequency to %lu\n",(uint64_t)(openair0_cfg->tx_freq[0])); ++ oxgrf->tx_lo_freq = openair0_cfg->tx_freq[0]; ++ } ++ } ++ ++ if(oxgrf->rx_lo_freq != openair0_cfg->rx_freq[0]) { ++ if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, 0, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX frequency\n"); ++ } else { ++ LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0])); ++ oxgrf->rx_lo_freq = openair0_cfg->rx_freq[0]; ++ } ++ } ++ ++ return(0); ++ ++} ++ ++/*! \brief calibration table for OXGRF */ ++rx_gain_calib_table_t calib_table_oxgrf[] = { ++ {3500000000.0, 72.0}, ++ {2660000000.0, 72.0}, ++ {2300000000.0, 72.0}, ++ {1880000000.0, 72.0}, ++ {816000000.0, 72.0}, ++ {-1,0} ++}; ++ ++/*! \brief set RX gain offset from calibration table ++ * \param openair0_cfg RF frontend parameters set by application ++ * \param chain_index RF chain ID ++ */ ++void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { ++ ++ int i = 0; ++ // loop through calibration table to find best adjustment factor for RX frequency ++ double min_diff = 6e9, diff; ++ ++ while (openair0_cfg->rx_gain_calib_table[i].freq > 0) { ++ diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); ++ printf("cal %d: freq %f, offset %f, diff %f\n", ++ i, ++ openair0_cfg->rx_gain_calib_table[i].freq, ++ openair0_cfg->rx_gain_calib_table[i].offset, diff); ++ if (min_diff > diff) { ++ min_diff = diff; ++ openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset; ++ } ++ i++; ++ } ++} ++ ++/*! \brief Set Gains (TX/RX) ++ * \param device the hardware to use ++ * \param openair0_cfg openair0 Config structure ++ * \returns 0 in success ++ */ ++int trx_oxgrf_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { ++ ++ int ret = 0; ++ oxgrf_state_t *oxgrf = (oxgrf_state_t *)device->priv; ++ ++ if (openair0_cfg->rx_gain[0] > 65+openair0_cfg->rx_gain_offset[0]) { ++ LOG_E(HW, "[oxgrf] Reduce RX Gain 0 by %f dB\n", openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0] - 65); ++ return -1; ++ } ++ ++ if ((ret = oxgrf_set_rx1_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]))) < 0) { ++ LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX1 gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[0])); ++ ++ if(oxgrf->rx_num_channels > 1) { ++ if ((ret = oxgrf_set_rx2_rf_gain(oxgrf->dev, 0, (uint32_t)(openair0_cfg->rx_gain[1] - openair0_cfg->rx_gain_offset[0]))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX gain to %u\n",(uint32_t)(openair0_cfg->rx_gain[1])); ++ } ++#if 0 ++ if ((ret = oxgrf_set_tx1_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[0] * 1000)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]); ++ ++ if(oxgrf->tx_num_channels > 1) { ++ if ((ret = oxgrf_set_tx2_attenuation(oxgrf->dev, 0, openair0_cfg->tx_gain[1] * 1000)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]); ++ } ++#endif ++ return(ret); ++} ++ ++/*! \brief Initialize Openair oxgrf target. It returns 0 if OK ++ * \param device the hardware to use ++ * \param openair0_cfg RF frontend parameters set by application ++ * \returns 0 on success ++ */ ++int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { ++ ++ int status; ++ ++ oxgrf_state_t *oxgrf = (oxgrf_state_t*)malloc(sizeof(oxgrf_state_t)); ++ memset(oxgrf, 0, sizeof(oxgrf_state_t)); ++ ++ LOG_I(HW, "[oxgrf] openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs); ++ LOG_I(HW, "[oxgrf] openair0_cfg[0].rx_num_channels == '%d'\n", openair0_cfg[0].rx_num_channels); ++ LOG_I(HW, "[oxgrf] openair0_cfg[0].tx_num_channels == '%d'\n", openair0_cfg[0].tx_num_channels); ++ ++ openair0_cfg[0].rx_gain_calib_table = calib_table_oxgrf; ++ set_rx_gain_offset(openair0_cfg, 0); ++ if(oxgrf->rx_num_channels > 1) ++ set_rx_gain_offset(openair0_cfg, 1); ++ openair0_cfg->iq_txshift = 0; ++ openair0_cfg->iq_rxrescale = 15; /*not sure*/ //FIXME: adjust to oxgrf ++ oxgrf->sample_rate = (unsigned int)openair0_cfg->sample_rate; ++ LOG_I(HW, "[oxgrf] sampling_rate %d\n", oxgrf->sample_rate); ++ oxgrf->rx_num_channels = openair0_cfg[0].rx_num_channels; ++ oxgrf->tx_num_channels = openair0_cfg[0].tx_num_channels; ++ ++ RX_MTU = openair0_cfg->sample_rate / 1000 / 2; ++ if(RX_MTU > 30720) ++ RX_MTU = 30720; ++ else if(!(RX_MTU % 5760)) ++ RX_MTU = 5760; ++ ++ bool rx_ant = true; ++ bool pa_status = false; ++ int auxdac1 = 0; ++ char args[64]; ++ if (openair0_cfg[0].sdr_addrs == NULL) { ++ strcpy(args, "dev=pciex:0"); ++ } else { ++ strcpy(args, openair0_cfg[0].sdr_addrs); ++ } ++ ++ char dev_str[64]; ++ const char dev_arg[] = "dev="; ++ char *dev_ptr = strstr(args, dev_arg); ++ if(dev_ptr) { ++ copy_subdev_string(dev_str, dev_ptr + strlen(dev_arg)); ++ remove_substring(args, dev_arg); ++ remove_substring(args, dev_str); ++ LOG_I(HW, "[oxgrf] Using %s\n", dev_str); ++ } ++ ++ const char auxdac1_arg[] = "auxdac1="; ++ char auxdac1_str[64] = {0}; ++ char *auxdac1_ptr = strstr(args, auxdac1_arg); ++ if(auxdac1_ptr) { ++ copy_subdev_string(auxdac1_str, auxdac1_ptr + strlen(auxdac1_arg)); ++ remove_substring(args, auxdac1_arg); ++ remove_substring(args, auxdac1_str); ++ auxdac1 = atoi(auxdac1_str); ++ LOG_I(HW, "[oxgrf] Setting auxdac1:%u\n", auxdac1); ++ } ++ ++ const char pa_arg[] = "pa="; ++ char pa_str[64] = {0}; ++ char *pa_ptr = strstr(args, pa_arg); ++ if(pa_ptr) { ++ copy_subdev_string(pa_str, pa_ptr + strlen(pa_arg)); ++ remove_substring(args, pa_arg); ++ remove_substring(args, pa_str); ++ pa_status = !strcmp(pa_str, "enabled"); ++ LOG_I(HW, "[oxgrf] PA Status:%s\n", pa_status?"Enabled":"Disabled"); ++ } ++ ++ const char ant_arg[] = "rx_ant="; ++ char ant_str[64] = {0}; ++ char *ant_ptr = strstr(args, ant_arg); ++ if(ant_ptr) { ++ copy_subdev_string(ant_str, ant_ptr + strlen(ant_arg)); ++ remove_substring(args, ant_arg); ++ remove_substring(args, ant_str); ++ rx_ant = strcmp(ant_str, "trx"); ++ } ++ ++ char dstring[128]; ++ if(RX_MTU < 30720) { ++ sprintf(dstring, ",nsamples_recv_frame:%u", RX_MTU); ++ strcat(dev_str, dstring); ++ } ++ if ((oxgrf->dev = oxgrf_open_device(dev_str)) == NULL ) { ++ LOG_E(HW, "[oxgrf] Failed to open oxgrf\n"); ++ free(oxgrf); ++ return -1; ++ } ++ ++ uint32_t model = 0; ++ oxgrf_get_model_version(oxgrf->dev, &model); ++ model &= 0xffff; ++ if(model == 550) { ++ oxgrf->BoardType = Y550; ++ shift = 4; ++ LOG_I(HW, "[oxgrf] device type: Y%d\n", model); ++ } else if(model == 230) { ++ oxgrf->BoardType = Y230; ++ shift = 4; ++ LOG_I(HW, "[oxgrf] device type: Y%d\n", model); ++ } else if(model == 380) { ++ oxgrf->BoardType = Y380; ++ shift = 4; ++ LOG_I(HW, "[oxgrf] device type: Y%d\n", model); ++ } else if(model == 590) { ++ oxgrf->BoardType = Y590; ++ shift = 2; ++ LOG_I(HW, "[oxgrf] device type: Y%d\n", model); ++ } else if(model == 7400) { ++ oxgrf->BoardType = IQX7400; ++ shift = 2; ++ LOG_I(HW, "[oxgrf] device type: IQX%d\n", model); ++ } else if(model == 7402) { ++ oxgrf->BoardType = IQX7402; ++ shift = 2; ++ LOG_I(HW, "[oxgrf] device type: IQX%d(Split Mode)\n", model - 2); ++ } else if(model == 6000 || model == 7000 || model == 7100) { ++ oxgrf->BoardType = IQX7000; ++ shift = 4; ++ LOG_I(HW, "[oxgrf] device type: IQX%d\n", model); ++ } else { ++ oxgrf->BoardType = UNKNOWN; ++ LOG_I(HW, "[oxgrf] device type: unknown\n"); ++ } ++ ++ if(oxgrf->BoardType == Y230) { ++ switch ((int)openair0_cfg->sample_rate) { ++#if 0 ++ case 61440000: ++ openair0_cfg->samples_per_packet = 30720; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 40e6; ++ openair0_cfg[0].rx_bw = 40e6; ++ break; ++ case 46080000: ++ openair0_cfg->samples_per_packet = 23040; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 40e6; ++ openair0_cfg[0].rx_bw = 40e6; ++ break; ++#endif ++ case 30720000: ++ openair0_cfg->samples_per_packet = 15360; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 20e6; ++ openair0_cfg[0].rx_bw = 20e6; ++ break; ++ case 23040000: ++ openair0_cfg->samples_per_packet = 11520; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 20e6; ++ openair0_cfg[0].rx_bw = 20e6; ++ break; ++ case 15360000: ++ openair0_cfg->samples_per_packet = 7680; ++ openair0_cfg->tx_sample_advance = 52; ++ openair0_cfg[0].tx_bw = 10e6; ++ openair0_cfg[0].rx_bw = 10e6; ++ break; ++ case 7680000: ++ openair0_cfg->samples_per_packet = 7680; ++ openair0_cfg->tx_sample_advance = 34; ++ openair0_cfg[0].tx_bw = 5e6; ++ openair0_cfg[0].rx_bw = 5e6; ++ break; ++ case 1920000: ++ openair0_cfg->samples_per_packet = 1920; ++ openair0_cfg->tx_sample_advance = 9; ++ openair0_cfg[0].tx_bw = 1.25e6; ++ openair0_cfg[0].rx_bw = 1.25e6; ++ break; ++ default: ++ LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate); ++ free(oxgrf); ++ exit(-1); ++ break; ++ } ++ } ++ if(oxgrf->BoardType == Y380 ++ || oxgrf->BoardType == Y550 ++ || oxgrf->BoardType == Y590 ++ || oxgrf->BoardType == IQX7000 ++ || oxgrf->BoardType == IQX7402 ++ || oxgrf->BoardType == IQX7400) { ++ switch ((int)openair0_cfg->sample_rate) { ++ case 122880000: ++ openair0_cfg->samples_per_packet = 30720; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 100e6; ++ openair0_cfg[0].rx_bw = 100e6; ++ break; ++ case 61440000: ++ openair0_cfg->samples_per_packet = 30720; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 40e6; ++ openair0_cfg[0].rx_bw = 40e6; ++ break; ++ case 30720000: ++ openair0_cfg->samples_per_packet = 15360; ++ openair0_cfg->tx_sample_advance = 80; ++ openair0_cfg[0].tx_bw = 20e6; ++ openair0_cfg[0].rx_bw = 20e6; ++ break; ++ case 15360000: ++ openair0_cfg->samples_per_packet = 15360; ++ openair0_cfg->tx_sample_advance = 52; ++ openair0_cfg[0].tx_bw = 10e6; ++ openair0_cfg[0].rx_bw = 10e6; ++ break; ++ case 7680000: ++ openair0_cfg->samples_per_packet = 7680; ++ openair0_cfg->tx_sample_advance = 34; ++ openair0_cfg[0].tx_bw = 5e6; ++ openair0_cfg[0].rx_bw = 5e6; ++ break; ++ case 1920000: ++ openair0_cfg->samples_per_packet = 1920; ++ openair0_cfg->tx_sample_advance = 9; ++ openair0_cfg[0].tx_bw = 1.25e6; ++ openair0_cfg[0].rx_bw = 1.25e6; ++ break; ++ default: ++ LOG_I(HW, "[oxgrf] Error: unknown sampling rate %f\n", openair0_cfg->sample_rate); ++ free(oxgrf); ++ exit(-1); ++ break; ++ } ++ ++ } ++ ++ LOG_I(HW, "[oxgrf] Initializing openair0_device\n"); ++ switch (openair0_cfg[0].clock_source) { ++ case external: ++ LOG_I(HW, "[oxgrf] clock_source: external\n"); ++ oxgrf_set_ref_clock (oxgrf->dev, 0, EXTERNAL_REFERENCE); ++ oxgrf_set_pps_select (oxgrf->dev, 0, PPS_EXTERNAL_EN); ++ break; ++ case gpsdo: ++ LOG_I(HW, "[oxgrf] clock_source: gpsdo\n"); ++ break; ++ case internal: ++ default: ++ oxgrf_set_ref_clock (oxgrf->dev, 0, INTERNAL_REFERENCE); ++ oxgrf_set_pps_select (oxgrf->dev, 0, PPS_INTERNAL_EN); ++ //oxgrf_set_vco_select (oxgrf->dev, 0, AUXDAC1); ++ LOG_I(HW, "[oxgrf] clock_source: internal\n"); ++ break; ++ } ++ oxgrf_set_auxdac1 (oxgrf->dev, 0, auxdac1); ++ if (pa_status) { ++ oxgrf_set_duplex_select (oxgrf->dev, 0, FDD); ++ oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1); ++ oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0); ++ } else if (openair0_cfg->duplex_mode == duplex_mode_TDD && !rx_ant) { ++ oxgrf_set_duplex_select (oxgrf->dev, 0, TDD); ++ oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 1); ++ oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 0); ++ } else { ++ oxgrf_set_duplex_select (oxgrf->dev, 0, FDD); ++ oxgrf_set_trxsw_fpga_enable(oxgrf->dev, 0, 0); ++ oxgrf_set_rx_ant_enable (oxgrf->dev, 0, 1); ++ } ++ LOG_I(HW, "[oxgrf] RX Ant:%s\n", rx_ant?"Enabled":"Disabled"); ++ oxgrf_set_tx_fir_en_dis (oxgrf->dev, 0, 0); ++ oxgrf_set_rx_fir_en_dis (oxgrf->dev, 0, 0); ++ ++ int max_idx = ((oxgrf->rx_num_channels > 2 || oxgrf->tx_num_channels > 2)? 1 : 0); ++ ++ for(int chip_idx = 0; chip_idx <= max_idx; chip_idx++) { ++ // RX port Initialize ++ if ((status = oxgrf_set_rx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)(openair0_cfg->rx_freq[0]))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX frequency\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX frequency to %lu\n",(uint64_t)(openair0_cfg->rx_freq[0])); ++ if ((status = oxgrf_set_rx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->sample_rate))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX sample rate\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX sample rate to %u\n", (uint32_t)(openair0_cfg->sample_rate)); ++ if ((status = oxgrf_set_rx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)(openair0_cfg->rx_bw))) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX bandwidth\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX bandwidth to %u\n",(uint32_t)(openair0_cfg->rx_bw)); ++ ++ if ((status = oxgrf_set_rx1_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){ ++ LOG_E(HW, "[oxgrf] Failed to set RX1 Gain Control Mode\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX1 Gain Control Mode MGC\n"); ++ ++ uint32_t rxgain = openair0_cfg->rx_gain[0] - openair0_cfg->rx_gain_offset[0]; ++ if (rxgain > 30) ++ rxgain = 60; ++ else ++ rxgain *= 2; ++ if ((status = oxgrf_set_rx1_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) { ++ LOG_I(HW, "[oxgrf] Failed to set RX1 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX1 gain to %u\n", rxgain); ++ ++ if ((status = oxgrf_set_rx2_gain_control_mode(oxgrf->dev, chip_idx, 0)) < 0){ ++ LOG_E(HW, "[oxgrf] Failed to set RX2 Gain Control Mode\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX2 Gain Control Mode MGC\n"); ++ ++ if ((status = oxgrf_set_rx2_rf_gain(oxgrf->dev, chip_idx, rxgain)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set RX2 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set RX2 gain to %u\n", rxgain); ++ ++ // TX port Initialize ++ if ((status = oxgrf_set_tx_lo_freq(oxgrf->dev, chip_idx, (uint64_t)openair0_cfg->tx_freq[0])) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX frequency\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set TX Frequency to %lu\n", (uint64_t)openair0_cfg->tx_freq[0]); ++ ++ if ((status = oxgrf_set_tx_sampling_freq(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->sample_rate)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX sample rate\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set TX sampling rate to %u\n", (uint32_t)openair0_cfg->sample_rate); ++ ++ if ((status = oxgrf_set_tx_rf_bandwidth(oxgrf->dev, chip_idx, (uint32_t)openair0_cfg->tx_bw)) <0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX bandwidth\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set TX bandwidth to %u\n", (uint32_t)openair0_cfg->tx_bw); ++ ++ if ((status = oxgrf_set_tx1_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[0] * 1000)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX1 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set the TX1 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[0]); ++ ++ if ((status = oxgrf_set_tx2_attenuation(oxgrf->dev, chip_idx, openair0_cfg->tx_gain[1] * 1000)) < 0) { ++ LOG_E(HW, "[oxgrf] Failed to set TX2 gain\n"); ++ } else ++ LOG_I(HW, "[oxgrf] set the TX2 gain to %d\n", 90 - (uint32_t)openair0_cfg->tx_gain[1]); ++ } ++ ++ uint32_t depth = oxgrf->sample_rate / 10 * sizeof(int) * oxgrf->tx_num_channels; ++ oxgrf_set_hwbuf_depth(oxgrf->dev, 0, depth); ++ ++ oxgrf_enable_timestamp(oxgrf->dev, 0, 0); ++ sleep(2); ++ oxgrf_enable_timestamp(oxgrf->dev, 0, 1); ++ sleep(2); ++ ++ for(int i = 0; i < NCHAN_PER_DEV; i++) { ++ int ret = posix_memalign((void **)&cache_buf[i], 4096, BUFFER_SIZE); ++ if(ret) { ++ LOG_I(HW, "Failed to alloc memory\n"); ++ return -1; ++ } ++ ret = posix_memalign((void **)&iq_buf[i], 4096, BUFFER_SIZE); ++ if(ret) { ++ LOG_I(HW, "Failed to alloc memory\n"); ++ return -1; ++ } ++ } ++ ++ device->Mod_id = num_devices++; ++ device->type = OXGRF_DEV; ++ device->trx_start_func = trx_oxgrf_start; ++ device->trx_end_func = trx_oxgrf_end; ++ device->trx_read_func = trx_oxgrf_read; ++ device->trx_write_func = trx_oxgrf_write; ++ device->trx_get_stats_func = trx_oxgrf_get_stats; ++ device->trx_reset_stats_func = trx_oxgrf_reset_stats; ++ device->trx_stop_func = trx_oxgrf_stop; ++ device->trx_set_freq_func = trx_oxgrf_set_freq; ++ device->trx_set_gains_func = trx_oxgrf_set_gains; ++ device->openair0_cfg = openair0_cfg; ++ device->priv = (void *)oxgrf; ++ ++ return 0; ++} ++ ++/*@}*/ +diff --git a/radio/OXGRF/oxgrf_lib.h b/radio/OXGRF/oxgrf_lib.h +new file mode 100644 +index 0000000000..877f2fbd6e +--- /dev/null ++++ b/radio/OXGRF/oxgrf_lib.h +@@ -0,0 +1,97 @@ ++/* ++ * 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.0 (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 ++ */ ++ ++/** oxgrf_lib.h ++ * ++ * Author: eric ++ * base on bladerf_lib.h ++ */ ++ ++#include "oxgrf_api_ss.h" ++#include "common_lib.h" ++ ++/** @addtogroup _OXGRF_PHY_RF_INTERFACE_ ++ * @{ ++ */ ++ ++typedef enum { ++ Y230, ++ Y380, ++ Y550, ++ Y590, ++ IQX6000, ++ IQX7000, ++ IQX7100, ++ IQX7400, ++ IQX7402, //split ++ UNKNOWN = -1, ++} OXGRFBoardType; ++ ++/*! \brief OXGRF specific data structure */ ++typedef struct { ++ ++ //! opaque OXGRF device struct. An empty ("") or NULL device identifier will result in the first encountered device being opened (using the first discovered backend) ++ OXGRF_DESCRIPTOR *dev; ++ int16_t *rx_buffer; ++ int16_t *tx_buffer; ++ //! Sample rate ++ unsigned int sample_rate; ++ ++ int rx_num_channels; ++ int tx_num_channels; ++ uint64_t tx_lo_freq; ++ uint64_t rx_lo_freq; ++ ++ // -------------------------------- ++ // Debug and output control ++ // -------------------------------- ++ //! Number of underflows ++ int num_underflows; ++ //! Number of overflows ++ int num_overflows; ++ //! number of RX errors ++ int num_rx_errors; ++ //! Number of TX errors ++ int num_tx_errors; ++ ++ //! timestamp of current TX ++ uint64_t tx_current_ts; ++ //! timestamp of current RX ++ uint64_t rx_current_ts; ++ //! number of TX samples ++ uint64_t tx_nsamps; ++ //! number of RX samples ++ uint64_t rx_nsamps; ++ //! number of TX count ++ uint64_t tx_count; ++ //! number of RX count ++ uint64_t rx_count; ++ //! timestamp of RX packet ++ openair0_timestamp rx_timestamp; ++ OXGRFBoardType BoardType; ++} oxgrf_state_t; ++ ++/*! \brief get current timestamp ++ *\param device the hardware to use ++ */ ++openair0_timestamp trx_get_timestamp(openair0_device *device); ++ ++/*@}*/ +diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf +new file mode 100644 +index 0000000000..bed89a7119 +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.oxgrf.conf +@@ -0,0 +1,223 @@ ++Active_eNBs = ( "eNB_Eurecom_LTEBox"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++eNBs = ++( ++ { ++ ////////// Identification parameters: ++ eNB_ID = 0xe00; ++ ++ cell_type = "CELL_MACRO_ENB"; ++ ++ eNB_name = "eNB_Eurecom_LTEBox"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ ++ plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } ); ++ ++ tr_s_preference = "local_mac" ++ ++ ////////// Physical parameters: ++ ++ component_carriers = ( ++ { ++ node_function = "eNodeB_3GPP"; ++ node_timing = "synch_to_ext_device"; ++ node_synch_ref = 0; ++ frame_type = "FDD"; ++ tdd_config = 3; ++ tdd_config_s = 0; ++ prefix_type = "NORMAL"; ++ eutra_band = 7; ++ downlink_frequency = 2680000000L; ++ uplink_frequency_offset = -120000000; ++ Nid_cell = 0; ++ N_RB_DL = 100; ++ Nid_cell_mbsfn = 0; ++ nb_antenna_ports = 1; ++ nb_antennas_tx = 1; ++ nb_antennas_rx = 1; ++ tx_gain = 90; ++ rx_gain = 102; ++ pbch_repetition = "FALSE"; ++ prach_root = 0; ++ prach_config_index = 0; ++ prach_high_speed = "DISABLE"; ++ prach_zero_correlation = 1; ++ prach_freq_offset = 2; ++ pucch_delta_shift = 1; ++ pucch_nRB_CQI = 1; ++ pucch_nCS_AN = 0; ++ pucch_n1_AN = 0; ++ pdsch_referenceSignalPower = 0; ++ pdsch_p_b = 0; ++ pusch_n_SB = 1; ++ pusch_enable64QAM = "DISABLE"; ++ pusch_hoppingMode = "interSubFrame"; ++ pusch_hoppingOffset = 0; ++ pusch_groupHoppingEnabled = "ENABLE"; ++ pusch_groupAssignment = 0; ++ pusch_sequenceHoppingEnabled = "DISABLE"; ++ pusch_nDMRS1 = 1; ++ phich_duration = "NORMAL"; ++ phich_resource = "ONESIXTH"; ++ srs_enable = "DISABLE"; ++ /* srs_BandwidthConfig =; ++ srs_SubframeConfig =; ++ srs_ackNackST =; ++ srs_MaxUpPts =;*/ ++ ++ pusch_p0_Nominal = -96; ++ pusch_alpha = "AL1"; ++ pucch_p0_Nominal = -104; ++ msg3_delta_Preamble = 6; ++ pucch_deltaF_Format1 = "deltaF2"; ++ pucch_deltaF_Format1b = "deltaF3"; ++ pucch_deltaF_Format2 = "deltaF0"; ++ pucch_deltaF_Format2a = "deltaF0"; ++ pucch_deltaF_Format2b = "deltaF0"; ++ ++ rach_numberOfRA_Preambles = 64; ++ rach_preamblesGroupAConfig = "DISABLE"; ++ /* ++ rach_sizeOfRA_PreamblesGroupA = ; ++ rach_messageSizeGroupA = ; ++ rach_messagePowerOffsetGroupB = ; ++ */ ++ rach_powerRampingStep = 4; ++ rach_preambleInitialReceivedTargetPower = -108; ++ rach_preambleTransMax = 10; ++ rach_raResponseWindowSize = 10; ++ rach_macContentionResolutionTimer = 48; ++ rach_maxHARQ_Msg3Tx = 4; ++ ++ pcch_default_PagingCycle = 128; ++ pcch_nB = "oneT"; ++ bcch_modificationPeriodCoeff = 2; ++ ue_TimersAndConstants_t300 = 1000; ++ ue_TimersAndConstants_t301 = 1000; ++ ue_TimersAndConstants_t310 = 1000; ++ ue_TimersAndConstants_t311 = 10000; ++ ue_TimersAndConstants_n310 = 20; ++ ue_TimersAndConstants_n311 = 1; ++ ue_TransmissionMode = 1; ++ } ++ ); ++ ++ ++ srb1_parameters : ++ { ++ # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] ++ timer_poll_retransmit = 80; ++ ++ # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] ++ timer_reordering = 35; ++ ++ # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] ++ timer_status_prohibit = 0; ++ ++ # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] ++ poll_pdu = 4; ++ ++ # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] ++ poll_byte = 99999; ++ ++ # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] ++ max_retx_threshold = 4; ++ } ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// MME parameters: ++ mme_ip_address = ( { ipv4 = "192.168.0.80"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ enable_measurement_reports = "no"; ++ ++ ///X2 ++ enable_x2 = "no"; ++ t_reloc_prep = 1000; /* unit: millisecond */ ++ tx2_reloc_overall = 2000; /* unit: millisecond */ ++ t_dc_prep = 1000; /* unit: millisecond */ ++ t_dc_overall = 2000; /* unit: millisecond */ ++ ++ NETWORK_INTERFACES : ++ { ++ ENB_INTERFACE_NAME_FOR_S1_MME = "eno2"; ++ ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.0.202/24"; ++ ENB_INTERFACE_NAME_FOR_S1U = "eno2"; ++ ENB_IPV4_ADDRESS_FOR_S1U = "192.168.0.202/24"; ++ ENB_PORT_FOR_S1U = 2152; # Spec 2152 ++ ++ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.0.202/24"; ++ ENB_PORT_FOR_X2C = 36422; # Spec 36422 ++ }; ++ } ++); ++ ++MACRLCs = ( ++ { ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ puSch10xSnr = 200; ++ puCch10xSnr = 200; ++ } ++); ++ ++L1s = ( ++ { ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ } ++); ++ ++RUs = ( ++ { ++ local_rf = "yes" ++ nb_tx = 1 ++ nb_rx = 1 ++ att_tx = 0 ++ att_rx = 3; ++ bands = [7]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ sdr_addrs = "dev=pciex:0,auxdac1=1620"; ++ clock_src = "internal"; ++ } ++); ++ ++THREAD_STRUCT = ( ++ { ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++ } ++); ++ ++ log_config : ++ { ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ }; ++ +diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf +new file mode 100644 +index 0000000000..62f4bd0135 +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.oxgrf.conf +@@ -0,0 +1,309 @@ ++Active_eNBs = ( "eNB-Eurecom-LTEBox"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++eNBs = ++( ++ { ++ ////////// Identification parameters: ++ eNB_ID = 0xe00; ++ ++ cell_type = "CELL_MACRO_ENB"; ++ ++ eNB_name = "eNB-Eurecom-LTEBox"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ ++ plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } ); ++ ++ tr_s_preference = "local_mac" ++ ++ ////////// Physical parameters: ++ ++ component_carriers = ( ++ { ++ node_function = "3GPP_eNODEB"; ++ node_timing = "synch_to_ext_device"; ++ node_synch_ref = 0; ++ frame_type = "FDD"; ++ tdd_config = 3; ++ tdd_config_s = 0; ++ prefix_type = "NORMAL"; ++ eutra_band = 7; ++ downlink_frequency = 2685000000L; ++ uplink_frequency_offset = -120000000; ++ Nid_cell = 0; ++ N_RB_DL = 50; ++ Nid_cell_mbsfn = 0; ++ nb_antenna_ports = 1; ++ nb_antennas_tx = 1; ++ nb_antennas_rx = 1; ++ tx_gain = 89; ++ rx_gain = 102; ++ pbch_repetition = "FALSE"; ++ prach_root = 0; ++ prach_config_index = 0; ++ prach_high_speed = "DISABLE"; ++ prach_zero_correlation = 1; ++ prach_freq_offset = 2; ++ pucch_delta_shift = 1; ++ pucch_nRB_CQI = 0; ++ pucch_nCS_AN = 0; ++ pucch_n1_AN = 0; ++ pdsch_referenceSignalPower = -27; ++ pdsch_p_b = 0; ++ pusch_n_SB = 1; ++ pusch_enable64QAM = "DISABLE"; ++ pusch_hoppingMode = "interSubFrame"; ++ pusch_hoppingOffset = 0; ++ pusch_groupHoppingEnabled = "ENABLE"; ++ pusch_groupAssignment = 0; ++ pusch_sequenceHoppingEnabled = "DISABLE"; ++ pusch_nDMRS1 = 1; ++ phich_duration = "NORMAL"; ++ phich_resource = "ONESIXTH"; ++ srs_enable = "DISABLE"; ++ /* srs_BandwidthConfig =; ++ srs_SubframeConfig =; ++ srs_ackNackST =; ++ srs_MaxUpPts =;*/ ++ ++ pusch_p0_Nominal = -96; ++ pusch_alpha = "AL1"; ++ pucch_p0_Nominal = -104; ++ msg3_delta_Preamble = 6; ++ pucch_deltaF_Format1 = "deltaF2"; ++ pucch_deltaF_Format1b = "deltaF3"; ++ pucch_deltaF_Format2 = "deltaF0"; ++ pucch_deltaF_Format2a = "deltaF0"; ++ pucch_deltaF_Format2b = "deltaF0"; ++ ++ rach_numberOfRA_Preambles = 64; ++ rach_preamblesGroupAConfig = "DISABLE"; ++ /* ++ rach_sizeOfRA_PreamblesGroupA = ; ++ rach_messageSizeGroupA = ; ++ rach_messagePowerOffsetGroupB = ; ++ */ ++ rach_powerRampingStep = 4; ++ rach_preambleInitialReceivedTargetPower = -108; ++ rach_preambleTransMax = 10; ++ rach_raResponseWindowSize = 10; ++ rach_macContentionResolutionTimer = 48; ++ rach_maxHARQ_Msg3Tx = 4; ++ ++ pcch_default_PagingCycle = 128; ++ pcch_nB = "oneT"; ++ bcch_modificationPeriodCoeff = 2; ++ ue_TimersAndConstants_t300 = 1000; ++ ue_TimersAndConstants_t301 = 1000; ++ ue_TimersAndConstants_t310 = 1000; ++ ue_TimersAndConstants_t311 = 10000; ++ ue_TimersAndConstants_n310 = 20; ++ ue_TimersAndConstants_n311 = 1; ++ ue_TransmissionMode = 1; ++ ++ //Parameters for SIB18 ++ rxPool_sc_CP_Len = "normal"; ++ rxPool_sc_Period = "sf40"; ++ rxPool_data_CP_Len = "normal"; ++ rxPool_ResourceConfig_prb_Num = 20; ++ rxPool_ResourceConfig_prb_Start = 5; ++ rxPool_ResourceConfig_prb_End = 44; ++ rxPool_ResourceConfig_offsetIndicator_present = "prSmall"; ++ rxPool_ResourceConfig_offsetIndicator_choice = 0; ++ rxPool_ResourceConfig_subframeBitmap_present = "prBs40"; ++ rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000"; ++ rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; ++ rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; ++/* rxPool_dataHoppingConfig_hoppingParameter = 0; ++ rxPool_dataHoppingConfig_numSubbands = "ns1"; ++ rxPool_dataHoppingConfig_rbOffset = 0; ++ rxPool_commTxResourceUC-ReqAllowed = "TRUE"; ++*/ ++ // Parameters for SIB19 ++ discRxPool_cp_Len = "normal" ++ discRxPool_discPeriod = "rf32" ++ discRxPool_numRetx = 1; ++ discRxPool_numRepetition = 2; ++ discRxPool_ResourceConfig_prb_Num = 5; ++ discRxPool_ResourceConfig_prb_Start = 3; ++ discRxPool_ResourceConfig_prb_End = 21; ++ discRxPool_ResourceConfig_offsetIndicator_present = "prSmall"; ++ discRxPool_ResourceConfig_offsetIndicator_choice = 0; ++ discRxPool_ResourceConfig_subframeBitmap_present = "prBs40"; ++ discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff"; ++ discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5; ++ discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0; ++ ++ } ++ ); ++ ++ ++ srb1_parameters : ++ { ++ # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] ++ timer_poll_retransmit = 80; ++ ++ # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] ++ timer_reordering = 35; ++ ++ # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] ++ timer_status_prohibit = 0; ++ ++ # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] ++ poll_pdu = 4; ++ ++ # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] ++ poll_byte = 99999; ++ ++ # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] ++ max_retx_threshold = 4; ++ } ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// MME parameters: ++ mme_ip_address = ( { ipv4 = "127.0.1.100"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ enable_measurement_reports = "no"; ++ ++ ///X2 ++ enable_x2 = "yes"; ++ t_reloc_prep = 1000; /* unit: millisecond */ ++ tx2_reloc_overall = 2000; /* unit: millisecond */ ++ t_dc_prep = 1000; /* unit: millisecond */ ++ t_dc_overall = 2000; /* unit: millisecond */ ++ ++ NETWORK_INTERFACES : ++ { ++ ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ++ ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.1.1/24"; ++ ENB_INTERFACE_NAME_FOR_S1U = "lo"; ++ ENB_IPV4_ADDRESS_FOR_S1U = "127.0.1.1/24"; ++ ENB_PORT_FOR_S1U = 2152; # Spec 2152 ++ ++ ENB_IPV4_ADDRESS_FOR_X2C = "127.0.1.1/24"; ++ ENB_PORT_FOR_X2C = 36422; # Spec 36422 ++ }; ++ } ++); ++ ++DU = ( ++ { ++ DU_INTERFACE_NAME_FOR_F1U = "lo"; ++ DU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1/16"; ++ DU_PORT_FOR_F1U = 22100; ++ F1_U_DU_TRANSPORT_TYPE = "TCP"; ++ } ++ ); ++ ++CU = ( ++ { ++ CU_INTERFACE_NAME_FOR_F1U = "lo"; ++ CU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1"; //Address to search the DU ++ CU_PORT_FOR_F1U = 22100; ++ F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP ++ DU_TYPE = "LTE"; ++ }//, ++// { ++// CU_INTERFACE_NAME_FOR_F1U = "eth0"; ++// CU_IPV4_ADDRESS_FOR_F1U = "10.64.93.142"; //Address to search the DU ++// CU_PORT_FOR_F1U = 2211; ++// F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP ++// DU_TYPE = "WiFi"; ++// } ++ ); ++ ++ CU_BALANCING = "ALL"; ++ ++MACRLCs = ( ++ { ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ phy_test_mode = 0; ++ puSch10xSnr = 200; ++ puCch10xSnr = 200; ++ } ++); ++ ++L1s = ( ++ { ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ } ++); ++ ++RUs = ( ++ { ++ local_rf = "yes" ++ nb_tx = 1 ++ nb_rx = 1 ++ att_tx = 5 ++ att_rx = 10; ++ bands = [7]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ sdr_addrs = "dev=pciex:0,auxdac1=1620"; ++ clock_src = "internal"; ++ ++ } ++); ++ ++NETWORK_CONTROLLER : ++{ ++ FLEXRAN_ENABLED = "no"; ++ FLEXRAN_INTERFACE_NAME = "lo"; ++ FLEXRAN_IPV4_ADDRESS = "127.0.0.1"; ++ FLEXRAN_PORT = 2210; ++ FLEXRAN_CACHE = "/mnt/oai_agent_cache"; ++ FLEXRAN_AWAIT_RECONF = "no"; ++}; ++ ++THREAD_STRUCT = ( ++ { ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++ } ++); ++ ++/* ++#example config for rfsimulator ++rfsimulator : ++{ ++ serveraddr = "enb"; ++ serverport = "4043"; ++ options = ("saviq"); ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++*/ ++ ++ log_config : ++ { ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ }; ++ +diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf +new file mode 100644 +index 0000000000..2884cfd68c +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.oxgrf.conf +@@ -0,0 +1,263 @@ ++Active_gNBs = ( "gNB-Eurecom-5GNRBox"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe01; ++ ++ cell_type = "CELL_MACRO_GNB"; ++ ++ gNB_name = "gNB-Eurecom-5GNRBox"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ ++ plmn_list = ({mcc = 001; mnc = 01; mnc_length = 2;}); ++ ++ tr_s_preference = "local_mac" ++ ++ ////////// Physical parameters: ++ ++ pusch_TargetSNRx10 = 200; ++ pucch_TargetSNRx10 = 200; ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP) ++ absoluteFrequencySSB = 641272; //641032; #641968; 641968=start of ssb at 3600MHz + 82 RBs 641032=center of SSB at center of cell ++ dl_frequencyBand = 78; ++ # this is 3600 MHz ++ dl_absoluteFrequencyPointA = 640000; ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 1; ++ dl_carrierBandwidth = 106; ++ #initialDownlinkBWP ++ #genericParameters ++ # this is RBstart=84,L=13 (275*(L-1))+RBstart ++ initialDLBWPlocationAndBandwidth = 6368; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 1; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 0; ++ initialDLBWPsearchSpaceZero = 0; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 78; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 1; ++ ul_carrierBandwidth = 106; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 6368; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 1; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 13; ++ preambleReceivedTargetPower = -100; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 5; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //15; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 1, ++ ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -90; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; #0x80; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 1; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 1; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 6; ++ nrofDownlinkSlots = 7; //8; //7; ++ nrofDownlinkSymbols = 6; //0; //6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; //0; //4; ++ ++ ssPBCH_BlockPower = -25; ++ } ++ ++ ); ++ ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// MME parameters: ++ amf_ip_address = ( { ipv4 = "127.0.1.100"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ///X2 ++ enable_x2 = "yes"; ++ t_reloc_prep = 1000; /* unit: millisecond */ ++ tx2_reloc_overall = 2000; /* unit: millisecond */ ++ t_dc_prep = 1000; /* unit: millisecond */ ++ t_dc_overall = 2000; /* unit: millisecond */ ++ target_enb_x2_ip_address = ( ++ { ipv4 = "127.0.1.1"; ++ ipv6 = "192:168:30::17"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ NETWORK_INTERFACES : ++ { ++ ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "lo"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "127.0.1.2/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "lo"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "127.0.1.2/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ GNB_IPV4_ADDRESS_FOR_X2C = "127.0.1.2/24"; ++ GNB_PORT_FOR_X2C = 36422; # Spec 36422 ++ }; ++ } ++); ++ ++MACRLCs = ( ++ { ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ } ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++} ++); ++ ++RUs = ( ++ { ++ local_rf = "yes" ++ nb_tx = 1 ++ nb_rx = 1 ++ att_tx = 5 ++ att_rx = 10; ++ bands = [7]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ sdr_addrs = "dev=pciex:0,auxdac1=1620"; ++ clock_src = "internal"; ++ } ++); ++ ++THREAD_STRUCT = ( ++ { ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++ } ++); ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0", "nea2" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia0" ); ++}; ++ ++ log_config : ++ { ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ }; ++ +diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf +new file mode 100644 +index 0000000000..d524c6699a +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.oxgrf.y230.conf +@@ -0,0 +1,277 @@ ++Active_gNBs = ( "gNB-OAI"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe00; ++ gNB_name = "gNB-OAI"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) }); ++ ++ nr_cellid = 12345678L; ++ ++ ////////// Physical parameters: ++ ++ do_CSIRS = 1; ++ do_SRS = 1; ++ min_rxtxtime = 6; ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 2574.270 MHz + 53 PRBs@30kHz SCS (same as initial BWP) ++ absoluteFrequencySSB = 518670; ++ dl_frequencyBand = 41; ++ # this is 3600 MHz ++ dl_absoluteFrequencyPointA = 517734; ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 0; ++ dl_carrierBandwidth = 52; ++ #initialDownlinkBWP ++ #genericParameters ++ # this is RBstart=0,L=106 (275*(L-1))+RBstart ++ initialDLBWPlocationAndBandwidth = 14025; # 6366 12925 12956 28875 12952 ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 0; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 6; ++ initialDLBWPsearchSpaceZero = 0; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 41; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 0; ++ ul_carrierBandwidth = 52; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 14025; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 0; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 13; ++ preambleReceivedTargetPower = -96; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 4; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 0, ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -90; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 0; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 0; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 7; ++ nrofDownlinkSlots = 7; ++ nrofDownlinkSymbols = 6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; ++ ++ ssPBCH_BlockPower = -25; ++ } ++ ++ ); ++ ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// AMF parameters: ++ amf_ip_address = ( { ipv4 = "192.168.0.80"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ++ NETWORK_INTERFACES : ++ { ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "eno2"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.201/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "eno2"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.201/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ }; ++ ++ } ++); ++ ++MACRLCs = ( ++{ ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ pusch_TargetSNRx10 = 250; ++ pucch_TargetSNRx10 = 300; ++ ulsch_max_frame_inactivity = 1; ++} ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++# pusch_proc_threads = 8; ++ prach_dtx_threshold = 120; ++ pucch0_dtx_threshold = 150; ++ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 ++} ++); ++ ++RUs = ( ++{ ++ local_rf = "yes" ++ nb_tx = 1 ++ nb_rx = 1 ++ att_tx = 0; ++ att_rx = 0; ++ bands = [41]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ #beamforming 1x4 matrix: ++ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; ++ sdr_addrs = "dev=usb3:0,auxdac1=1960"; ++ clock_src = "internal"; ++} ++); ++ ++THREAD_STRUCT = ( ++{ ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++} ++); ++ ++rfsimulator : ++{ ++ serveraddr = "server"; ++ serverport = "4043"; ++ options = (); #("saviq"); or/and "chanmod" ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia2", "nia0" ); ++ ++ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter ++ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' ++ drb_ciphering = "yes"; ++ drb_integrity = "no"; ++}; ++ ++log_config : ++{ ++ global_log_level ="info"; ++ global_log_verbosity ="medium"; ++ hw_log_level ="info"; ++ hw_log_verbosity ="medium"; ++ phy_log_level ="info"; ++ phy_log_verbosity ="medium"; ++ mac_log_level ="info"; ++ mac_log_verbosity ="high"; ++ rlc_log_level ="info"; ++ rlc_log_verbosity ="medium"; ++ pdcp_log_level ="info"; ++ pdcp_log_verbosity ="medium"; ++ rrc_log_level ="info"; ++ rrc_log_verbosity ="medium"; ++ ngap_log_level ="debug"; ++ ngap_log_verbosity ="medium"; ++}; ++ +diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf +new file mode 100644 +index 0000000000..41bdf7f7e5 +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.oxgrf.conf +@@ -0,0 +1,269 @@ ++Active_gNBs = ( "gNB-OAI"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe00; ++ gNB_name = "gNB-OAI"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); ++ ++ nr_cellid = 12345678L; ++ ++ ////////// Physical parameters: ++ ++ pdsch_AntennaPorts_XP = 2; ++ pusch_AntennaPorts = 2; ++ do_CSIRS = 1; ++ do_SRS = 1; ++ ul_prbblacklist = "51,52,53,54" ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 ++ absoluteFrequencySSB = 621312; # 641280 ++ dl_frequencyBand = 78; ++ # this is 3300.60 MHz ++ dl_absoluteFrequencyPointA = 620040; # 640008 ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 1; ++ dl_carrierBandwidth = 106; ++ #initialDownlinkBWP ++ #genericParameters ++ # this is RBstart=27,L=48 (275*(L-1))+RBstart ++ initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 1; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 12; ++ initialDLBWPsearchSpaceZero = 0; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 78; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 1; ++ ul_carrierBandwidth = 106; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 28875; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 1; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 12; ++ preambleReceivedTargetPower = -96; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 4; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 1, ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -70; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 1; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 1; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 6; ++ nrofDownlinkSlots = 7; ++ nrofDownlinkSymbols = 6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; ++ ++ ssPBCH_BlockPower = -25; ++ } ++ ++ ); ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// AMF parameters: ++ amf_ip_address = ( { ipv4 = "192.168.0.80"; #"192.168.70.132"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ++ NETWORK_INTERFACES : ++ { ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.202"; #"192.168.70.129/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.202"; #"192.168.70.129/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ }; ++ ++ } ++); ++ ++MACRLCs = ( ++{ ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ pusch_TargetSNRx10 = 300; ++ pucch_TargetSNRx10 = 300; ++ pusch_FailureThres = 1000; ++ ulsch_max_frame_inactivity = 0; ++} ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ prach_dtx_threshold = 120; ++ #pucch0_dtx_threshold = 120; ++} ++); ++ ++RUs = ( ++{ ++ local_rf = "yes" ++ nb_tx = 2 ++ nb_rx = 2 ++ att_tx = 0 ++ att_rx = 0; ++ bands = [78]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ ##beamforming 1x2 matrix: 1 layer x 2 antennas ++ bf_weights = [0x00007fff, 0x0000]; ++ #clock_src = "internal"; ++ sdr_addrs = "dev=pciex:0,auxdac1=1630"; ++} ++); ++ ++THREAD_STRUCT = ( ++{ ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++} ++); ++ ++rfsimulator : ++{ ++ serveraddr = "server"; ++ serverport = "4043"; ++ options = (); #("saviq"); or/and "chanmod" ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia2", "nia0" ); ++ ++ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter ++ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' ++ drb_ciphering = "yes"; ++ drb_integrity = "no"; ++}; ++ ++log_config : ++{ ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ ngap_log_level ="debug"; ++ f1ap_log_level ="debug"; ++}; +diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf +new file mode 100644 +index 0000000000..7894f28380 +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.oxgrf.conf +@@ -0,0 +1,268 @@ ++Active_gNBs = ( "gNB-OAI"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe00; ++ gNB_name = "gNB-OAI"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) }); ++ ++ nr_cellid = 12345678L; ++ ++ ////////// Physical parameters: ++ ++ do_CSIRS = 1; ++ do_SRS = 1; ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) ++ absoluteFrequencySSB = 641280; ++ dl_frequencyBand = 78; ++ # this is 3600 MHz ++ dl_absoluteFrequencyPointA = 640008; ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 1; ++ dl_carrierBandwidth = 106; ++ #initialDownlinkBWP ++ #genericParameters ++ # this is RBstart=27,L=48 (275*(L-1))+RBstart ++ initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 1; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 12; ++ initialDLBWPsearchSpaceZero = 0; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 78; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 1; ++ ul_carrierBandwidth = 106; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 28875; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 1; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 13; ++ preambleReceivedTargetPower = -96; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 4; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 1, ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -90; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 1; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 1; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 6; ++ nrofDownlinkSlots = 7; ++ nrofDownlinkSymbols = 6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; ++ ++ ssPBCH_BlockPower = -25; ++ } ++ ++ ); ++ ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// AMF parameters: ++ amf_ip_address = ( { ipv4 = "192.168.70.132"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ++ NETWORK_INTERFACES : ++ { ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "eno2"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.202/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "eno2"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.202/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ }; ++ ++ } ++); ++ ++MACRLCs = ( ++{ ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ pusch_TargetSNRx10 = 150; ++ pucch_TargetSNRx10 = 200; ++ ulsch_max_frame_inactivity = 0; ++} ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ prach_dtx_threshold = 120; ++ pucch0_dtx_threshold = 100; ++ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 ++} ++); ++ ++RUs = ( ++{ ++ local_rf = "yes" ++ nb_tx = 1 ++ nb_rx = 1 ++ att_tx = 0; ++ att_rx = 0; ++ bands = [78]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ #beamforming 1x4 matrix: ++ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; ++ sdr_addrs = "dev=pciex:0,auxdac1=1660"; ++ clock_src = "internal"; ++} ++); ++ ++THREAD_STRUCT = ( ++{ ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++} ++); ++ ++rfsimulator : ++{ ++ serveraddr = "server"; ++ serverport = "4043"; ++ options = (); #("saviq"); or/and "chanmod" ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia2", "nia0" ); ++ ++ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter ++ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' ++ drb_ciphering = "yes"; ++ drb_integrity = "no"; ++}; ++ ++log_config : ++{ ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ ngap_log_level ="debug"; ++ f1ap_log_level ="debug"; ++}; ++ +diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf +new file mode 100644 +index 0000000000..b6347edc28 +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.oxgrf.conf +@@ -0,0 +1,270 @@ ++Active_gNBs = ( "gNB-OAI"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe00; ++ gNB_name = "gNB-OAI"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); ++ ++ nr_cellid = 12345678L; ++ ++ ////////// Physical parameters: ++ ++ pdsch_AntennaPorts_XP = 2; ++ pusch_AntennaPorts = 2; ++ do_CSIRS = 1; ++ do_SRS = 1; ++ ul_prbblacklist = "135,136,137,138" ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) ++ absoluteFrequencySSB = 623232; ++ dl_frequencyBand = 78; ++ # this is 3300.24 MHz ++ dl_absoluteFrequencyPointA = 620016; ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 1; ++ dl_carrierBandwidth = 273; ++ #initialDownlinkBWP ++ #genericParameters ++ initialDLBWPlocationAndBandwidth = 1099; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 1; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 12; ++ initialDLBWPsearchSpaceZero = 0; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 78; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 1; ++ ul_carrierBandwidth = 273; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 1099; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 1; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 12; ++ preambleReceivedTargetPower = -90; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 4; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 1, ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -70; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 1; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 1; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 6; ++ nrofDownlinkSlots = 7; ++ nrofDownlinkSymbols = 6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; ++ ++ ssPBCH_BlockPower = -5; ++ } ++ ++ ); ++ ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// AMF parameters: ++ amf_ip_address = ( { ipv4 = "192.168.0.80"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ++ NETWORK_INTERFACES : ++ { ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.201/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.201/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ }; ++ ++ } ++); ++ ++MACRLCs = ( ++{ ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ pusch_TargetSNRx10 = 300; ++ pucch_TargetSNRx10 = 300; ++ pusch_FailureThres = 1000; ++ ulsch_max_frame_inactivity = 0; ++ ul_max_mcs = 28; ++} ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ prach_dtx_threshold = 120; ++ pucch0_dtx_threshold = 80; ++} ++); ++ ++RUs = ( ++{ ++ local_rf = "yes" ++ nb_tx = 2 ++ nb_rx = 2 ++ att_tx = 0 ++ att_rx = 0; ++ bands = [78]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ ##beamforming 1x2 matrix: 1 layer x 2 antennas ++ bf_weights = [0x00007fff, 0x0000]; ++ #clock_src = "internal"; ++ sdr_addrs = "dev=pciex:0,auxdac1=1630"; ++} ++); ++ ++THREAD_STRUCT = ( ++{ ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++} ++); ++ ++rfsimulator : ++{ ++ serveraddr = "server"; ++ serverport = "4043"; ++ options = (); #("saviq"); or/and "chanmod" ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia2", "nia0" ); ++ ++ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter ++ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' ++ drb_ciphering = "yes"; ++ drb_integrity = "no"; ++}; ++ ++log_config : ++{ ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ ngap_log_level ="debug"; ++ f1ap_log_level ="debug"; ++}; +diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf +new file mode 100644 +index 0000000000..48a0b68bef +--- /dev/null ++++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.oxgrf.conf +@@ -0,0 +1,271 @@ ++Active_gNBs = ( "gNB-OAI"); ++# Asn1_verbosity, choice in: none, info, annoying ++Asn1_verbosity = "none"; ++ ++gNBs = ++( ++ { ++ ////////// Identification parameters: ++ gNB_ID = 0xe00; ++ gNB_name = "gNB-OAI"; ++ ++ // Tracking area code, 0x0000 and 0xfffe are reserved values ++ tracking_area_code = 1; ++ plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }); }); ++ ++ nr_cellid = 12345678L; ++ ++ ////////// Physical parameters: ++ ++ ssb_SubcarrierOffset = 0; ++ pdsch_AntennaPorts_XP = 1; ++ pusch_AntennaPorts = 1; ++ do_CSIRS = 1; ++ ul_prbblacklist = "135,136,137,138" ++ ++ servingCellConfigCommon = ( ++ { ++ #spCellConfigCommon ++ ++ physCellId = 0; ++ ++# downlinkConfigCommon ++ #frequencyInfoDL ++ # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) ++ absoluteFrequencySSB = 623232; ++ dl_frequencyBand = 78; ++ # this is 3300.24 MHz ++ dl_absoluteFrequencyPointA = 620016; ++ #scs-SpecificCarrierList ++ dl_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ dl_subcarrierSpacing = 1; ++ dl_carrierBandwidth = 273; ++ #initialDownlinkBWP ++ #genericParameters ++ initialDLBWPlocationAndBandwidth = 1099; ++ # ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialDLBWPsubcarrierSpacing = 1; ++ #pdcch-ConfigCommon ++ initialDLBWPcontrolResourceSetZero = 12; ++ initialDLBWPsearchSpaceZero = 10; ++ ++ #uplinkConfigCommon ++ #frequencyInfoUL ++ ul_frequencyBand = 78; ++ #scs-SpecificCarrierList ++ ul_offstToCarrier = 0; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ ul_subcarrierSpacing = 1; ++ ul_carrierBandwidth = 273; ++ pMax = 20; ++ #initialUplinkBWP ++ #genericParameters ++ initialULBWPlocationAndBandwidth = 1099; ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ initialULBWPsubcarrierSpacing = 1; ++ #rach-ConfigCommon ++ #rach-ConfigGeneric ++ prach_ConfigurationIndex = 98; ++#prach_msg1_FDM ++#0 = one, 1=two, 2=four, 3=eight ++ prach_msg1_FDM = 0; ++ prach_msg1_FrequencyStart = 0; ++ zeroCorrelationZoneConfig = 12; ++ preambleReceivedTargetPower = -90; ++#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) ++ preambleTransMax = 6; ++#powerRampingStep ++# 0=dB0,1=dB2,2=dB4,3=dB6 ++ powerRampingStep = 1; ++#ra_ReponseWindow ++#1,2,4,8,10,20,40,80 ++ ra_ResponseWindow = 4; ++#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ++#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; ++#oneHalf (0..15) 4,8,12,16,...60,64 ++ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; ++#ra_ContentionResolutionTimer ++#(0..7) 8,16,24,32,40,48,56,64 ++ ra_ContentionResolutionTimer = 7; ++ rsrp_ThresholdSSB = 19; ++#prach-RootSequenceIndex_PR ++#1 = 839, 2 = 139 ++ prach_RootSequenceIndex_PR = 2; ++ prach_RootSequenceIndex = 1; ++ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex ++ # ++ msg1_SubcarrierSpacing = 1, ++# restrictedSetConfig ++# 0=unrestricted, 1=restricted type A, 2=restricted type B ++ restrictedSetConfig = 0, ++ ++ msg3_DeltaPreamble = 1; ++ p0_NominalWithGrant =-90; ++ ++# pucch-ConfigCommon setup : ++# pucchGroupHopping ++# 0 = neither, 1= group hopping, 2=sequence hopping ++ pucchGroupHopping = 0; ++ hoppingId = 40; ++ p0_nominal = -70; ++# ssb_PositionsInBurs_BitmapPR ++# 1=short, 2=medium, 3=long ++ ssb_PositionsInBurst_PR = 2; ++ ssb_PositionsInBurst_Bitmap = 1; ++ ++# ssb_periodicityServingCell ++# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 ++ ssb_periodicityServingCell = 2; ++ ++# dmrs_TypeA_position ++# 0 = pos2, 1 = pos3 ++ dmrs_TypeA_Position = 0; ++ ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ subcarrierSpacing = 1; ++ ++ ++ #tdd-UL-DL-ConfigurationCommon ++# subcarrierSpacing ++# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ++ referenceSubcarrierSpacing = 1; ++ # pattern1 ++ # dl_UL_TransmissionPeriodicity ++ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 ++ dl_UL_TransmissionPeriodicity = 6; ++ nrofDownlinkSlots = 7; ++ nrofDownlinkSymbols = 6; ++ nrofUplinkSlots = 2; ++ nrofUplinkSymbols = 4; ++ ++ ssPBCH_BlockPower = -5; ++ } ++ ++ ); ++ ++ ++ # ------- SCTP definitions ++ SCTP : ++ { ++ # Number of streams to use in input/output ++ SCTP_INSTREAMS = 2; ++ SCTP_OUTSTREAMS = 2; ++ }; ++ ++ ++ ////////// AMF parameters: ++ amf_ip_address = ( { ipv4 = "192.168.0.80"; ++ ipv6 = "192:168:30::17"; ++ active = "yes"; ++ preference = "ipv4"; ++ } ++ ); ++ ++ ++ NETWORK_INTERFACES : ++ { ++ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.0.201/24"; ++ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; ++ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.0.201/24"; ++ GNB_PORT_FOR_S1U = 2152; # Spec 2152 ++ }; ++ ++ } ++); ++ ++MACRLCs = ( ++{ ++ num_cc = 1; ++ tr_s_preference = "local_L1"; ++ tr_n_preference = "local_RRC"; ++ pusch_TargetSNRx10 = 300; ++ pucch_TargetSNRx10 = 300; ++ pusch_FailureThres = 1000; ++ ulsch_max_frame_inactivity = 0; ++# ul_max_mcs = 28; ++} ++); ++ ++L1s = ( ++{ ++ num_cc = 1; ++ tr_n_preference = "local_mac"; ++ prach_dtx_threshold = 120; ++ pucch0_dtx_threshold = 80; ++} ++); ++ ++RUs = ( ++{ ++ local_rf = "yes" ++ nb_tx = 1; ++ nb_rx = 1; ++ att_tx = 0; ++ att_rx = 0; ++ bands = [78]; ++ max_pdschReferenceSignalPower = -27; ++ max_rxgain = 102; ++ eNB_instances = [0]; ++ ##beamforming 1x2 matrix: 1 layer x 2 antennas ++ bf_weights = [0x00007fff, 0x0000]; ++ #clock_src = "internal"; ++ sdr_addrs = "dev=pciex:0,auxdac1=1630"; ++} ++); ++ ++THREAD_STRUCT = ( ++{ ++ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" ++ parallel_config = "PARALLEL_SINGLE_THREAD"; ++ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" ++ worker_config = "WORKER_ENABLE"; ++} ++); ++ ++rfsimulator : ++{ ++ serveraddr = "server"; ++ serverport = "4043"; ++ options = (); #("saviq"); or/and "chanmod" ++ modelname = "AWGN"; ++ IQfile = "/tmp/rfsimulator.iqs"; ++}; ++ ++security = { ++ # preferred ciphering algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nea0, nea1, nea2, nea3 ++ ciphering_algorithms = ( "nea0" ); ++ ++ # preferred integrity algorithms ++ # the first one of the list that an UE supports in chosen ++ # valid values: nia0, nia1, nia2, nia3 ++ integrity_algorithms = ( "nia2", "nia0" ); ++ ++ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter ++ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' ++ drb_ciphering = "yes"; ++ drb_integrity = "no"; ++}; ++ ++log_config : ++{ ++ global_log_level ="info"; ++ hw_log_level ="info"; ++ phy_log_level ="info"; ++ mac_log_level ="info"; ++ rlc_log_level ="info"; ++ pdcp_log_level ="info"; ++ rrc_log_level ="info"; ++ ngap_log_level ="debug"; ++ f1ap_log_level ="debug"; ++}; +-- +2.25.1 + -- 2.26.2