Front Haul Interface Library update to third seed code contribution
[o-du/phy.git] / fhi_lib / app / src / common.c
index 6f2c413..3bf22b6 100644 (file)
-/******************************************************************************\r
-*\r
-*   Copyright (c) 2019 Intel.\r
-*\r
-*   Licensed under the Apache License, Version 2.0 (the "License");\r
-*   you may not use this file except in compliance with the License.\r
-*   You may obtain a copy of the License at\r
-*\r
-*       http://www.apache.org/licenses/LICENSE-2.0\r
-*\r
-*   Unless required by applicable law or agreed to in writing, software\r
-*   distributed under the License is distributed on an "AS IS" BASIS,\r
-*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-*   See the License for the specific language governing permissions and\r
-*   limitations under the License.\r
-*\r
-*******************************************************************************/\r
-\r
-#include <assert.h>\r
-#include <err.h>\r
-#include <arpa/inet.h>\r
-#include <sys/time.h>\r
-#include <time.h>\r
-\r
-#include "common.h"\r
-#include "xran_fh_o_du.h"\r
-#include "xran_pkt.h"\r
-#include "xran_pkt_up.h"\r
-#include "xran_cp_api.h"\r
-#include "xran_up_api.h"\r
-\r
-#include "xran_mlog_lnx.h"\r
-\r
-extern enum app_state state;\r
-\r
-int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;\r
-int iq_playback_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;\r
-\r
-int iq_bfw_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;\r
-int iq_bfw_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;\r
-\r
-int iq_srs_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;\r
-\r
-uint8_t numCCPorts = 1;\r
-/* Number of antennas supported by front-end */\r
-\r
-uint8_t num_eAxc = 4;\r
-/* Number of CPRI ports supported by front-end */\r
-\r
-int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-int16_t *p_tx_prach_play_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_prach_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_prach_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-int16_t *p_tx_srs_play_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-int32_t tx_srs_play_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-int32_t tx_srs_play_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-\r
-int16_t *p_rx_log_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-int16_t *p_prach_log_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t prach_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t prach_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-int16_t *p_srs_log_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-int32_t srs_log_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-int32_t srs_log_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];\r
-\r
-int16_t *p_tx_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-int16_t *p_rx_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-/* beamforming weights for UL (O-DU) */\r
-int16_t *p_tx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-/* beamforming weights for UL (O-DU) */\r
-int16_t *p_tx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t tx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-/* beamforming weights for UL (O-RU) */\r
-int16_t *p_rx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-/* beamforming weights for UL (O-RU) */\r
-int16_t *p_rx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];\r
-int32_t rx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];\r
-\r
-// F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB\r
-uint16_t nNumRbsPerSymF1[3][13] =\r
-{\r
-    //  5MHz    10MHz   15MHz   20 MHz  25 MHz  30 MHz  40 MHz  50MHz   60 MHz  70 MHz  80 MHz   90 MHz  100 MHz\r
-        {25,    52,     79,     106,    133,    160,    216,    270,    0,         0,      0,      0,      0},         // Numerology 0 (15KHz)\r
-        {11,    24,     38,     51,     65,     78,     106,    133,    162,       0,    217,    245,    273},         // Numerology 1 (30KHz)\r
-        {0,     11,     18,     24,     31,     38,     51,     65,     79,        0,    107,    121,    135}          // Numerology 2 (60KHz)\r
-};\r
-\r
-// F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB\r
-uint16_t nNumRbsPerSymF2[2][4] =\r
-{\r
-    //  50Mhz  100MHz  200MHz   400MHz\r
-        {66,    132,    264,     0},        // Numerology 2 (60KHz)\r
-        {32,    66,     132,     264}       // Numerology 3 (120KHz)\r
-};\r
-\r
-// 38.211 - Table 4.2.1\r
-uint16_t nSubCarrierSpacing[5] =\r
-{\r
-    15,     // mu = 0\r
-    30,     // mu = 1\r
-    60,     // mu = 2\r
-    120,    // mu = 3\r
-    240     // mu = 4\r
-};\r
-\r
-// TTI interval in us (slot duration)\r
-uint16_t nTtiInterval[4] =\r
-{\r
-    1000,     // mu = 0\r
-    500,     // mu = 1\r
-    250,     // mu = 2\r
-    125,     // mu = 3\r
-};\r
-\r
-\r
-// F1 Tables 38.101-1 Table F.5.3. Window length for normal CP\r
-uint16_t nCpSizeF1[3][13][2] =\r
-{\r
-    //    5MHz      10MHz      15MHz       20 MHz      25 MHz     30 MHz      40 MHz       50MHz       60 MHz      70 MHz     80 MHz     90 MHz     100 MHz\r
-        {{40, 36}, {80, 72}, {120, 108}, {160, 144}, {160, 144}, {240, 216}, {320, 288}, {320, 288},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0}},        // Numerology 0 (15KHz)\r
-        {{22, 18}, {44, 36},   {66, 54},   {88, 72},   {88, 72}, {132, 108}, {176, 144}, {176, 144}, {264, 216}, {264, 216}, {352, 288}, {352, 288}, {352, 288}},       // Numerology 1 (30KHz)\r
-        {  {0, 0}, {26, 18},   {39, 27},   {52, 36},   {52, 36},   {78, 54},  {104, 72},  {104, 72}, {156, 108}, {156, 108}, {208, 144}, {208, 144}, {208, 144}},       // Numerology 2 (60KHz)\r
-};\r
-\r
-// F2 Tables 38.101-2 Table F.5.3. Window length for normal CP\r
-int16_t nCpSizeF2[2][4][2] =\r
-{\r
-    //    50Mhz    100MHz      200MHz     400MHz\r
-        {  {0, 0}, {104, 72}, {208, 144}, {416, 288}}, // Numerology 2 (60KHz)\r
-        {{68, 36}, {136, 72}, {272, 144}, {544, 288}}, // Numerology 3 (120KHz)\r
-};\r
-\r
-uint32_t gMaxSlotNum;\r
-uint32_t gNumDLCtx;\r
-uint32_t gNumULCtx;\r
-uint32_t gDLResetAdvance;\r
-uint32_t gDLProcAdvance;\r
-uint32_t gULProcAdvance;\r
-\r
-static uint16_t g_NumSlotTDDLoop[XRAN_MAX_SECTOR_NR] = { XRAN_NUM_OF_SLOT_IN_TDD_LOOP };\r
-static uint16_t g_NumDLSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};\r
-static uint16_t g_NumULSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};\r
-static uint8_t g_SlotType[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {{XRAN_SLOT_TYPE_INVALID}};\r
-float g_UlRate[XRAN_MAX_SECTOR_NR] = {0.0};\r
-float g_DlRate[XRAN_MAX_SECTOR_NR] = {0.0};\r
-\r
-uint32_t app_xran_get_tti_interval(uint8_t nMu)\r
-{\r
-    if (nMu < 4)\r
-    {\r
-        return nTtiInterval[nMu];\r
-    }\r
-    else\r
-    {\r
-        printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-uint32_t app_xran_get_scs(uint8_t nMu)\r
-{\r
-    if (nMu <= 3)\r
-    {\r
-        return nSubCarrierSpacing[nMu];\r
-    }\r
-    else\r
-    {\r
-        printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-\r
-\r
-\r
-//-------------------------------------------------------------------------------------------\r
-/** @ingroup group_nr5g_source_phy_common\r
- *\r
- *  @param[in]   nNumerology - Numerology determine sub carrier spacing, Value: 0->4 0: 15khz,  1: 30khz,  2: 60khz 3: 120khz, 4: 240khz\r
- *  @param[in]   nBandwidth - Carrier bandwidth for in MHz. Value: 5->400\r
- *  @param[in]   nAbsFrePointA - Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000\r
- *\r
- *  @return  Number of RBs in cell\r
- *\r
- *  @description\r
- *  Returns number of RBs based on 38.101-1 and 38.101-2 for the cell\r
- *\r
-**/\r
-//-------------------------------------------------------------------------------------------\r
-uint16_t app_xran_get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA)\r
-{\r
-    uint32_t error = 1;\r
-    uint16_t numRBs = 0;\r
-\r
-    if (nAbsFrePointA <= 6000000)\r
-    {\r
-        // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB\r
-        if (nNumerology < 3)\r
-        {\r
-            switch(nBandwidth)\r
-            {\r
-                case PHY_BW_5_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][0];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_10_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][1];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_15_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][2];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_20_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][3];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_25_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][4];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_30_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][5];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_40_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][6];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_50_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][7];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_60_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][8];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_70_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][9];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_80_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][10];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_90_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][11];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_100_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF1[nNumerology][12];\r
-                    error = 0;\r
-                break;\r
-                default:\r
-                    error = 1;\r
-                break;\r
-            }\r
-        }\r
-    }\r
-    else\r
-    {\r
-        if ((nNumerology >= 2) && (nNumerology <= 3))\r
-        {\r
-            // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB\r
-            switch(nBandwidth)\r
-            {\r
-                case PHY_BW_50_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF2[nNumerology-2][0];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_100_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF2[nNumerology-2][1];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_200_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF2[nNumerology-2][2];\r
-                    error = 0;\r
-                break;\r
-                case PHY_BW_400_0_MHZ:\r
-                    numRBs = nNumRbsPerSymF2[nNumerology-2][3];\r
-                    error = 0;\r
-                break;\r
-                default:\r
-                    error = 1;\r
-                break;\r
-            }\r
-        }\r
-    }\r
-\r
-\r
-    if (error)\r
-    {\r
-        printf("ERROR: %s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA);\r
-    }\r
-    else\r
-    {\r
-        printf("%s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d] numRBs[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA, numRBs);\r
-    }\r
-\r
-    return numRBs;\r
-}\r
-\r
-//-------------------------------------------------------------------------------------------\r
-/** @ingroup phy_cal_nrarfcn\r
- *\r
- *  @param[in]   center frequency\r
- *\r
- *  @return  NR-ARFCN\r
- *\r
- *  @description\r
- *  This calculates NR-ARFCN value according to center frequency\r
- *\r
-**/\r
-//-------------------------------------------------------------------------------------------\r
-uint32_t app_xran_cal_nrarfcn(uint32_t nCenterFreq)\r
-{\r
-    uint32_t nDeltaFglobal,nFoffs,nNoffs;\r
-    uint32_t nNRARFCN = 0;\r
-\r
-    if(nCenterFreq > 0 && nCenterFreq < 3000*1000)\r
-    {\r
-        nDeltaFglobal = 5;\r
-        nFoffs = 0;\r
-        nNoffs = 0;\r
-    }\r
-    else if(nCenterFreq >= 3000*1000 && nCenterFreq < 24250*1000)\r
-    {\r
-        nDeltaFglobal = 15;\r
-        nFoffs = 3000*1000;\r
-        nNoffs = 600000;\r
-    }\r
-    else if(nCenterFreq >= 24250*1000 && nCenterFreq <= 100000*1000)\r
-    {\r
-        nDeltaFglobal = 60;\r
-        nFoffs = 24250080;\r
-        nNoffs = 2016667;\r
-    }\r
-    else\r
-    {\r
-         printf("@@@@ incorrect center frerquency %d\n",nCenterFreq);\r
-         return (0);\r
-    }\r
-\r
-    nNRARFCN = ((nCenterFreq - nFoffs)/nDeltaFglobal) + nNoffs;\r
-\r
-    printf("%s: nCenterFreq[%d] nDeltaFglobal[%d] nFoffs[%d] nNoffs[%d] nNRARFCN[%d]\n", __FUNCTION__, nCenterFreq, nDeltaFglobal, nFoffs, nNoffs, nNRARFCN);\r
-    return (nNRARFCN);\r
-}\r
-\r
-int32_t app_xran_slot_limit(int32_t nSfIdx)\r
-{\r
-    while (nSfIdx < 0) {\r
-        nSfIdx += gMaxSlotNum;\r
-    }\r
-\r
-    while (nSfIdx >= gMaxSlotNum) {\r
-        nSfIdx -= gMaxSlotNum;\r
-    }\r
-\r
-    return nSfIdx;\r
-}\r
-\r
-void app_xran_clear_slot_type(uint32_t nPhyInstanceId)\r
-{\r
-    g_UlRate[nPhyInstanceId] = 0.0;\r
-    g_DlRate[nPhyInstanceId] = 0.0;\r
-    g_NumSlotTDDLoop[nPhyInstanceId] = 1;\r
-}\r
-\r
-int32_t app_xran_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config *psSlotConfig)\r
-{\r
-    uint32_t nSlotNum, nSymNum, nVal, i;\r
-    uint32_t numDlSym, numUlSym, numGuardSym;\r
-    uint32_t numDlSlots = 0, numUlSlots = 0, numSpDlSlots = 0, numSpUlSlots = 0, numSpSlots = 0;\r
-    char sSlotPattern[XRAN_SLOT_TYPE_LAST][10] = {"IN\0", "DL\0", "UL\0", "SP\0", "FD\0"};\r
-\r
-    // nPhyInstanceId    Carrier ID\r
-    // nFrameDuplexType  0 = FDD 1 = TDD\r
-    // nTddPeriod        Tdd Periodicity\r
-    // psSlotConfig[80]  Slot Config Structure for nTddPeriod Slots\r
-\r
-    g_UlRate[nPhyInstanceId] = 0.0;\r
-    g_DlRate[nPhyInstanceId] = 0.0;\r
-    g_NumSlotTDDLoop[nPhyInstanceId] = nTddPeriod;\r
-\r
-    for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)\r
-    {\r
-        g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_INVALID;\r
-        g_NumDLSymSp[nPhyInstanceId][i] = 0;\r
-        g_NumULSymSp[nPhyInstanceId][i] = 0;\r
-    }\r
-\r
-    if (nFrameDuplexType == XRAN_FDD)\r
-    {\r
-        for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)\r
-        {\r
-            g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_FDD;\r
-        }\r
-        g_NumSlotTDDLoop[nPhyInstanceId] = 1;\r
-        g_DlRate[nPhyInstanceId] = 1.0;\r
-        g_UlRate[nPhyInstanceId] = 1.0;\r
-    }\r
-    else\r
-    {\r
-        for (nSlotNum = 0; nSlotNum < nTddPeriod; nSlotNum++)\r
-        {\r
-            numDlSym = 0;\r
-            numUlSym = 0;\r
-            numGuardSym = 0;\r
-            for (nSymNum = 0; nSymNum < XRAN_NUM_OF_SYMBOL_PER_SLOT; nSymNum++)\r
-            {\r
-                switch(psSlotConfig[nSlotNum].nSymbolType[nSymNum])\r
-                {\r
-                    case XRAN_SYMBOL_TYPE_DL:\r
-                        numDlSym++;\r
-                    break;\r
-                    case XRAN_SYMBOL_TYPE_GUARD:\r
-                        numGuardSym++;\r
-                    break;\r
-                    default:\r
-                        numUlSym++;\r
-                    break;\r
-                }\r
-            }\r
-\r
-            // printf("nSlotNum[%d] : numDlSym[%d] numGuardSym[%d] numUlSym[%d]\n", nSlotNum, numDlSym, numGuardSym, numUlSym);\r
-\r
-            if ((numUlSym == 0) && (numGuardSym == 0))\r
-            {\r
-                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_DL;\r
-                numDlSlots++;\r
-            }\r
-            else if ((numDlSym == 0) && (numGuardSym == 0))\r
-            {\r
-                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_UL;\r
-                numUlSlots++;\r
-            }\r
-            else\r
-            {\r
-                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_SP;\r
-                numSpSlots++;\r
-\r
-                if (numDlSym)\r
-                {\r
-                    numSpDlSlots++;\r
-                    g_NumDLSymSp[nPhyInstanceId][nSlotNum] = numDlSym;\r
-                }\r
-                if (numUlSym)\r
-                {\r
-                    numSpUlSlots++;\r
-                    g_NumULSymSp[nPhyInstanceId][nSlotNum] = numUlSym;\r
-                }\r
-            }\r
-\r
-            // printf("            numDlSlots[%d] numUlSlots[%d] numSpSlots[%d] numSpDlSlots[%d] numSpUlSlots[%d]\n", numDlSlots, numUlSlots, numSpSlots, numSpDlSlots, numSpUlSlots);\r
-        }\r
-\r
-        g_DlRate[nPhyInstanceId] = (float)(numDlSlots + numSpDlSlots) / (float)nTddPeriod;\r
-        g_UlRate[nPhyInstanceId] = (float)(numUlSlots + numSpUlSlots) / (float)nTddPeriod;\r
-    }\r
-\r
-    printf("set_slot_type: nPhyInstanceId[%d] nFrameDuplexType[%d], nTddPeriod[%d]\n",\r
-        nPhyInstanceId, nFrameDuplexType, nTddPeriod);\r
-\r
-    printf("DLRate[%f] ULRate[%f]\n", g_DlRate[nPhyInstanceId], g_UlRate[nPhyInstanceId]);\r
-\r
-    nVal = (g_NumSlotTDDLoop[nPhyInstanceId] < 10) ? g_NumSlotTDDLoop[nPhyInstanceId] : 10;\r
-\r
-    printf("SlotPattern:\n");\r
-    printf("Slot:   ");\r
-    for (nSlotNum = 0; nSlotNum < nVal; nSlotNum++)\r
-    {\r
-        printf("%d    ", nSlotNum);\r
-    }\r
-    printf("\n");\r
-\r
-    printf("  %3d   ", 0);\r
-    for (nSlotNum = 0, i = 0; nSlotNum < g_NumSlotTDDLoop[nPhyInstanceId]; nSlotNum++)\r
-    {\r
-        printf("%s   ", sSlotPattern[g_SlotType[nPhyInstanceId][nSlotNum]]);\r
-        i++;\r
-        if ((i == 10) && ((nSlotNum+1) < g_NumSlotTDDLoop[nPhyInstanceId]))\r
-        {\r
-            printf("\n");\r
-            printf("  %3d   ", nSlotNum);\r
-            i = 0;\r
-        }\r
-    }\r
-    printf("\n\n");\r
-\r
-    return 0;\r
-}\r
-\r
-int32_t app_xran_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)\r
-{\r
-    int32_t nSfIdxMod, nSfType, ret = 0;\r
-\r
-    nSfIdxMod = app_xran_slot_limit(nSlotdx) % ((g_NumSlotTDDLoop[nCellIdx] > 0) ? g_NumSlotTDDLoop[nCellIdx]: 1);\r
-    nSfType = g_SlotType[nCellIdx][nSfIdxMod];\r
-\r
-    if (nSfType == nType)\r
-    {\r
-        ret = 1;\r
-    }\r
-    else if (nSfType == XRAN_SLOT_TYPE_SP)\r
-    {\r
-        if ((nType == XRAN_SLOT_TYPE_DL) && g_NumDLSymSp[nCellIdx][nSfIdxMod])\r
-        {\r
-            ret = 1;\r
-        }\r
-\r
-        if ((nType == XRAN_SLOT_TYPE_UL) && g_NumULSymSp[nCellIdx][nSfIdxMod])\r
-        {\r
-            ret = 1;\r
-        }\r
-    }\r
-    else if (nSfType == XRAN_SLOT_TYPE_FDD)\r
-    {\r
-        ret = 1;\r
-    }\r
-\r
-    return ret;\r
-}\r
-\r
-\r
-\r
-void sys_save_buf_to_file(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)\r
-{\r
-    if (size)\r
-    {\r
-        if (filename && bufname)\r
-        {\r
-            FILE           *file;\r
-            printf("Storing %s to file %s: ", bufname, filename);\r
-            file = fopen(filename, "wb");\r
-            if (file == NULL)\r
-            {\r
-                printf("can't open file %s!!!", filename);\r
-            }\r
-            else\r
-            {\r
-                uint32_t             num;\r
-                num = fwrite(pBuffer, buffers_num, size, file);\r
-                fflush(file);\r
-                fclose(file);\r
-                printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, size, num);\r
-            }\r
-            printf(" \n");\r
-        }\r
-        else\r
-        {\r
-            printf(" the file name, buffer name are not set!!!");\r
-        }\r
-    }\r
-    else\r
-    {\r
-        printf(" the %s is free: size = %d bytes!!!", bufname, size);\r
-    }\r
-}\r
-\r
-int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)\r
-{\r
-    unsigned int  file_size = 0;\r
-    int  num= 0;\r
-\r
-    if (size)\r
-    {\r
-        if (filename && bufname)\r
-        {\r
-            FILE           *file;\r
-            printf("Loading file %s to  %s: ", filename, bufname);\r
-            file = fopen(filename, "rb");\r
-\r
-\r
-            if (file == NULL)\r
-            {\r
-                printf("can't open file %s!!!", filename);\r
-                exit(-1);\r
-            }\r
-            else\r
-            {\r
-                fseek(file, 0, SEEK_END);\r
-                file_size = ftell(file);\r
-                fseek(file, 0, SEEK_SET);\r
-\r
-                if ((file_size > size) || (file_size == 0))\r
-                    file_size = size;\r
-\r
-                printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);\r
-\r
-                num = fread(pBuffer, buffers_num, size, file);\r
-                fflush(file);\r
-                fclose(file);\r
-                printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);\r
-            }\r
-            printf(" \n");\r
-\r
-        }\r
-        else\r
-        {\r
-            printf(" the file name, buffer name are not set!!!");\r
-        }\r
-    }\r
-    else\r
-    {\r
-        printf(" the %s is free: size = %d bytes!!!", bufname, size);\r
-    }\r
-    return num;\r
-}\r
-\r
-\r
-void sys_save_buf_to_file_txt(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)\r
-{\r
-    unsigned int i;\r
-    int ret = 0;\r
-    if (pBuffer == NULL)\r
-        return;\r
-\r
-    if (size)\r
-    {\r
-        if (filename && bufname)\r
-        {\r
-            FILE           *file;\r
-            printf("Storing %s to file %s: ", bufname, filename);\r
-            file = fopen(filename, "w");\r
-            if (file == NULL)\r
-            {\r
-                printf("can't open file %s!!!", filename);\r
-                exit(-1);\r
-            }\r
-            else\r
-            {\r
-                uint32_t num = 0;\r
-\r
-                signed short *ptr = (signed short*)pBuffer;\r
-                for (i = 0; i < (size/((unsigned int)sizeof(signed short) /** 2 * 2 * 2*/)); i = i + 2)\r
-                {\r
-#ifndef CSCOPE_DEBUG\r
-                    ret = fprintf(file,"%d %d\n", ptr[i], ptr[i + 1]);\r
-#else\r
-                    ret = fprintf(file,"%d %d ", ptr[i], ptr[i + 1]);\r
-                    /*      I data => Ramp data, from 1 to 792.\r
-                            Q data => Contains time information of the current symbol:\r
-                            Bits [15:14] = Antenna-ID\r
-                            Bits [13:12] = \9300\94\r
-                            Bits [11:8]  = Subframe-ID\r
-                            Bits [7:4]   = Slot-ID\r
-                            Bits [3:0]   = Symbol-ID */\r
-                            fprintf(file, "0x%04x: ant %d Subframe-ID %d Slot-ID %d Symbol-ID %d\n",\r
-                                        ptr[i + 1], (ptr[i + 1]>>14) & 0x3,  (ptr[i + 1]>>8) & 0xF,  (ptr[i + 1]>>4) & 0xF, (ptr[i + 1]>>0) & 0xF);\r
-#endif\r
-                    if (ret < 0)\r
-                    {\r
-                        printf("fprintf %d\n", ret);\r
-                        fclose(file);\r
-                        break;\r
-                    }\r
-                    num++;\r
-                }\r
-                fflush(file);\r
-                fclose(file);\r
-                printf("from addr (0x%lx) size (%d) IQ num (%d)", (uint64_t)pBuffer, size, num);\r
-            }\r
-            printf(" \n");\r
-        }\r
-        else\r
-        {\r
-            printf(" the file name, buffer name are not set!!!");\r
-        }\r
-    }\r
-    else\r
-    {\r
-        printf(" the %s is free: size = %d bytes!!!", bufname, size);\r
-    }\r
-}\r
-\r
+/******************************************************************************
+*
+*   Copyright (c) 2019 Intel.
+*
+*   Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+*
+*   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.
+*
+*******************************************************************************/
+
+#include <assert.h>
+#include <err.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <time.h>
+
+#include "common.h"
+#include "xran_fh_o_du.h"
+#include "xran_pkt.h"
+#include "xran_pkt_up.h"
+#include "xran_cp_api.h"
+#include "xran_up_api.h"
+
+#include "xran_mlog_lnx.h"
+
+extern enum app_state state;
+
+int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
+int iq_playback_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
+
+int iq_bfw_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
+int iq_bfw_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
+
+int iq_srs_buffer_size_ul = IQ_PLAYBACK_BUFFER_BYTES;
+
+uint8_t numCCPorts = 1;
+/* Number of antennas supported by front-end */
+
+uint8_t num_eAxc = 4;
+/* Number of CPRI ports supported by front-end */
+
+int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+int16_t *p_tx_prach_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_prach_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_prach_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+int16_t *p_tx_srs_play_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+int32_t tx_srs_play_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+int32_t tx_srs_play_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+
+int16_t *p_rx_log_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+int16_t *p_prach_log_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t prach_log_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t prach_log_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+int16_t *p_srs_log_buffer[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+int32_t srs_log_buffer_size[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+int32_t srs_log_buffer_position[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR];
+
+int16_t *p_tx_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+
+int16_t *p_rx_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+
+/* beamforming weights for UL (O-DU) */
+int16_t *p_tx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+/* beamforming weights for UL (O-DU) */
+int16_t *p_tx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t tx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+/* beamforming weights for UL (O-RU) */
+int16_t *p_rx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+/* beamforming weights for UL (O-RU) */
+int16_t *p_rx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
+int32_t rx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
+
+// F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
+uint16_t nNumRbsPerSymF1[3][13] =
+{
+    //  5MHz    10MHz   15MHz   20 MHz  25 MHz  30 MHz  40 MHz  50MHz   60 MHz  70 MHz  80 MHz   90 MHz  100 MHz
+        {25,    52,     79,     106,    133,    160,    216,    270,    0,         0,      0,      0,      0},         // Numerology 0 (15KHz)
+        {11,    24,     38,     51,     65,     78,     106,    133,    162,       0,    217,    245,    273},         // Numerology 1 (30KHz)
+        {0,     11,     18,     24,     31,     38,     51,     65,     79,        0,    107,    121,    135}          // Numerology 2 (60KHz)
+};
+
+// F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
+uint16_t nNumRbsPerSymF2[2][4] =
+{
+    //  50Mhz  100MHz  200MHz   400MHz
+        {66,    132,    264,     0},        // Numerology 2 (60KHz)
+        {32,    66,     132,     264}       // Numerology 3 (120KHz)
+};
+
+// 38.211 - Table 4.2.1
+uint16_t nSubCarrierSpacing[5] =
+{
+    15,     // mu = 0
+    30,     // mu = 1
+    60,     // mu = 2
+    120,    // mu = 3
+    240     // mu = 4
+};
+
+// TTI interval in us (slot duration)
+uint16_t nTtiInterval[4] =
+{
+    1000,     // mu = 0
+    500,     // mu = 1
+    250,     // mu = 2
+    125,     // mu = 3
+};
+
+
+// F1 Tables 38.101-1 Table F.5.3. Window length for normal CP
+uint16_t nCpSizeF1[3][13][2] =
+{
+    //    5MHz      10MHz      15MHz       20 MHz      25 MHz     30 MHz      40 MHz       50MHz       60 MHz      70 MHz     80 MHz     90 MHz     100 MHz
+        {{40, 36}, {80, 72}, {120, 108}, {160, 144}, {160, 144}, {240, 216}, {320, 288}, {320, 288},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0}},        // Numerology 0 (15KHz)
+        {{22, 18}, {44, 36},   {66, 54},   {88, 72},   {88, 72}, {132, 108}, {176, 144}, {176, 144}, {264, 216}, {264, 216}, {352, 288}, {352, 288}, {352, 288}},       // Numerology 1 (30KHz)
+        {  {0, 0}, {26, 18},   {39, 27},   {52, 36},   {52, 36},   {78, 54},  {104, 72},  {104, 72}, {156, 108}, {156, 108}, {208, 144}, {208, 144}, {208, 144}},       // Numerology 2 (60KHz)
+};
+
+// F2 Tables 38.101-2 Table F.5.3. Window length for normal CP
+int16_t nCpSizeF2[2][4][2] =
+{
+    //    50Mhz    100MHz      200MHz     400MHz
+        {  {0, 0}, {104, 72}, {208, 144}, {416, 288}}, // Numerology 2 (60KHz)
+        {{68, 36}, {136, 72}, {272, 144}, {544, 288}}, // Numerology 3 (120KHz)
+};
+
+uint32_t gMaxSlotNum;
+uint32_t gNumDLCtx;
+uint32_t gNumULCtx;
+uint32_t gDLResetAdvance;
+uint32_t gDLProcAdvance;
+uint32_t gULProcAdvance;
+
+static uint16_t g_NumSlotTDDLoop[XRAN_MAX_SECTOR_NR] = { XRAN_NUM_OF_SLOT_IN_TDD_LOOP };
+static uint16_t g_NumDLSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
+static uint16_t g_NumULSymSp[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {0};
+static uint8_t g_SlotType[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SLOT_IN_TDD_LOOP] = {{XRAN_SLOT_TYPE_INVALID}};
+float g_UlRate[XRAN_MAX_SECTOR_NR] = {0.0};
+float g_DlRate[XRAN_MAX_SECTOR_NR] = {0.0};
+
+uint32_t app_xran_get_tti_interval(uint8_t nMu)
+{
+    if (nMu < 4)
+    {
+        return nTtiInterval[nMu];
+    }
+    else
+    {
+        printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);
+    }
+
+    return 0;
+}
+
+uint32_t app_xran_get_scs(uint8_t nMu)
+{
+    if (nMu <= 3)
+    {
+        return nSubCarrierSpacing[nMu];
+    }
+    else
+    {
+        printf("ERROR: %s Mu[%d] is not valid\n",__FUNCTION__, nMu);
+    }
+
+    return 0;
+}
+
+
+
+
+//-------------------------------------------------------------------------------------------
+/** @ingroup group_nr5g_source_phy_common
+ *
+ *  @param[in]   nNumerology - Numerology determine sub carrier spacing, Value: 0->4 0: 15khz,  1: 30khz,  2: 60khz 3: 120khz, 4: 240khz
+ *  @param[in]   nBandwidth - Carrier bandwidth for in MHz. Value: 5->400
+ *  @param[in]   nAbsFrePointA - Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000
+ *
+ *  @return  Number of RBs in cell
+ *
+ *  @description
+ *  Returns number of RBs based on 38.101-1 and 38.101-2 for the cell
+ *
+**/
+//-------------------------------------------------------------------------------------------
+uint16_t app_xran_get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA)
+{
+    uint32_t error = 1;
+    uint16_t numRBs = 0;
+
+    if (nAbsFrePointA <= 6000000)
+    {
+        // F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
+        if (nNumerology < 3)
+        {
+            switch(nBandwidth)
+            {
+                case PHY_BW_5_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][0];
+                    error = 0;
+                break;
+                case PHY_BW_10_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][1];
+                    error = 0;
+                break;
+                case PHY_BW_15_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][2];
+                    error = 0;
+                break;
+                case PHY_BW_20_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][3];
+                    error = 0;
+                break;
+                case PHY_BW_25_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][4];
+                    error = 0;
+                break;
+                case PHY_BW_30_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][5];
+                    error = 0;
+                break;
+                case PHY_BW_40_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][6];
+                    error = 0;
+                break;
+                case PHY_BW_50_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][7];
+                    error = 0;
+                break;
+                case PHY_BW_60_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][8];
+                    error = 0;
+                break;
+                case PHY_BW_70_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][9];
+                    error = 0;
+                break;
+                case PHY_BW_80_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][10];
+                    error = 0;
+                break;
+                case PHY_BW_90_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][11];
+                    error = 0;
+                break;
+                case PHY_BW_100_0_MHZ:
+                    numRBs = nNumRbsPerSymF1[nNumerology][12];
+                    error = 0;
+                break;
+                default:
+                    error = 1;
+                break;
+            }
+        }
+    }
+    else
+    {
+        if ((nNumerology >= 2) && (nNumerology <= 3))
+        {
+            // F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
+            switch(nBandwidth)
+            {
+                case PHY_BW_50_0_MHZ:
+                    numRBs = nNumRbsPerSymF2[nNumerology-2][0];
+                    error = 0;
+                break;
+                case PHY_BW_100_0_MHZ:
+                    numRBs = nNumRbsPerSymF2[nNumerology-2][1];
+                    error = 0;
+                break;
+                case PHY_BW_200_0_MHZ:
+                    numRBs = nNumRbsPerSymF2[nNumerology-2][2];
+                    error = 0;
+                break;
+                case PHY_BW_400_0_MHZ:
+                    numRBs = nNumRbsPerSymF2[nNumerology-2][3];
+                    error = 0;
+                break;
+                default:
+                    error = 1;
+                break;
+            }
+        }
+    }
+
+
+    if (error)
+    {
+        printf("ERROR: %s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA);
+    }
+    else
+    {
+        printf("%s: nNumerology[%d] nBandwidth[%d] nAbsFrePointA[%d] numRBs[%d]\n",__FUNCTION__, nNumerology, nBandwidth, nAbsFrePointA, numRBs);
+    }
+
+    return numRBs;
+}
+
+//-------------------------------------------------------------------------------------------
+/** @ingroup phy_cal_nrarfcn
+ *
+ *  @param[in]   center frequency
+ *
+ *  @return  NR-ARFCN
+ *
+ *  @description
+ *  This calculates NR-ARFCN value according to center frequency
+ *
+**/
+//-------------------------------------------------------------------------------------------
+uint32_t app_xran_cal_nrarfcn(uint32_t nCenterFreq)
+{
+    uint32_t nDeltaFglobal,nFoffs,nNoffs;
+    uint32_t nNRARFCN = 0;
+
+    if(nCenterFreq > 0 && nCenterFreq < 3000*1000)
+    {
+        nDeltaFglobal = 5;
+        nFoffs = 0;
+        nNoffs = 0;
+    }
+    else if(nCenterFreq >= 3000*1000 && nCenterFreq < 24250*1000)
+    {
+        nDeltaFglobal = 15;
+        nFoffs = 3000*1000;
+        nNoffs = 600000;
+    }
+    else if(nCenterFreq >= 24250*1000 && nCenterFreq <= 100000*1000)
+    {
+        nDeltaFglobal = 60;
+        nFoffs = 24250080;
+        nNoffs = 2016667;
+    }
+    else
+    {
+         printf("@@@@ incorrect center frerquency %d\n",nCenterFreq);
+         return (0);
+    }
+
+    nNRARFCN = ((nCenterFreq - nFoffs)/nDeltaFglobal) + nNoffs;
+
+    printf("%s: nCenterFreq[%d] nDeltaFglobal[%d] nFoffs[%d] nNoffs[%d] nNRARFCN[%d]\n", __FUNCTION__, nCenterFreq, nDeltaFglobal, nFoffs, nNoffs, nNRARFCN);
+    return (nNRARFCN);
+}
+
+int32_t app_xran_slot_limit(int32_t nSfIdx)
+{
+    while (nSfIdx < 0) {
+        nSfIdx += gMaxSlotNum;
+    }
+
+    while (nSfIdx >= gMaxSlotNum) {
+        nSfIdx -= gMaxSlotNum;
+    }
+
+    return nSfIdx;
+}
+
+void app_xran_clear_slot_type(uint32_t nPhyInstanceId)
+{
+    g_UlRate[nPhyInstanceId] = 0.0;
+    g_DlRate[nPhyInstanceId] = 0.0;
+    g_NumSlotTDDLoop[nPhyInstanceId] = 1;
+}
+
+int32_t app_xran_set_slot_type(uint32_t nPhyInstanceId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config *psSlotConfig)
+{
+    uint32_t nSlotNum, nSymNum, nVal, i;
+    uint32_t numDlSym, numUlSym, numGuardSym;
+    uint32_t numDlSlots = 0, numUlSlots = 0, numSpDlSlots = 0, numSpUlSlots = 0, numSpSlots = 0;
+    char sSlotPattern[XRAN_SLOT_TYPE_LAST][10] = {"IN\0", "DL\0", "UL\0", "SP\0", "FD\0"};
+
+    // nPhyInstanceId    Carrier ID
+    // nFrameDuplexType  0 = FDD 1 = TDD
+    // nTddPeriod        Tdd Periodicity
+    // psSlotConfig[80]  Slot Config Structure for nTddPeriod Slots
+
+    g_UlRate[nPhyInstanceId] = 0.0;
+    g_DlRate[nPhyInstanceId] = 0.0;
+    g_NumSlotTDDLoop[nPhyInstanceId] = nTddPeriod;
+
+    for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
+    {
+        g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_INVALID;
+        g_NumDLSymSp[nPhyInstanceId][i] = 0;
+        g_NumULSymSp[nPhyInstanceId][i] = 0;
+    }
+
+    if (nFrameDuplexType == XRAN_FDD)
+    {
+        for (i = 0; i < XRAN_NUM_OF_SLOT_IN_TDD_LOOP; i++)
+        {
+            g_SlotType[nPhyInstanceId][i] = XRAN_SLOT_TYPE_FDD;
+        }
+        g_NumSlotTDDLoop[nPhyInstanceId] = 1;
+        g_DlRate[nPhyInstanceId] = 1.0;
+        g_UlRate[nPhyInstanceId] = 1.0;
+    }
+    else
+    {
+        for (nSlotNum = 0; nSlotNum < nTddPeriod; nSlotNum++)
+        {
+            numDlSym = 0;
+            numUlSym = 0;
+            numGuardSym = 0;
+            for (nSymNum = 0; nSymNum < XRAN_NUM_OF_SYMBOL_PER_SLOT; nSymNum++)
+            {
+                switch(psSlotConfig[nSlotNum].nSymbolType[nSymNum])
+                {
+                    case XRAN_SYMBOL_TYPE_DL:
+                        numDlSym++;
+                    break;
+                    case XRAN_SYMBOL_TYPE_GUARD:
+                        numGuardSym++;
+                    break;
+                    default:
+                        numUlSym++;
+                    break;
+                }
+            }
+
+            // printf("nSlotNum[%d] : numDlSym[%d] numGuardSym[%d] numUlSym[%d]\n", nSlotNum, numDlSym, numGuardSym, numUlSym);
+
+            if ((numUlSym == 0) && (numGuardSym == 0))
+            {
+                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_DL;
+                numDlSlots++;
+            }
+            else if ((numDlSym == 0) && (numGuardSym == 0))
+            {
+                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_UL;
+                numUlSlots++;
+            }
+            else
+            {
+                g_SlotType[nPhyInstanceId][nSlotNum] = XRAN_SLOT_TYPE_SP;
+                numSpSlots++;
+
+                if (numDlSym)
+                {
+                    numSpDlSlots++;
+                    g_NumDLSymSp[nPhyInstanceId][nSlotNum] = numDlSym;
+                }
+                if (numUlSym)
+                {
+                    numSpUlSlots++;
+                    g_NumULSymSp[nPhyInstanceId][nSlotNum] = numUlSym;
+                }
+            }
+
+            // printf("            numDlSlots[%d] numUlSlots[%d] numSpSlots[%d] numSpDlSlots[%d] numSpUlSlots[%d]\n", numDlSlots, numUlSlots, numSpSlots, numSpDlSlots, numSpUlSlots);
+        }
+
+        g_DlRate[nPhyInstanceId] = (float)(numDlSlots + numSpDlSlots) / (float)nTddPeriod;
+        g_UlRate[nPhyInstanceId] = (float)(numUlSlots + numSpUlSlots) / (float)nTddPeriod;
+    }
+
+    printf("set_slot_type: nPhyInstanceId[%d] nFrameDuplexType[%d], nTddPeriod[%d]\n",
+        nPhyInstanceId, nFrameDuplexType, nTddPeriod);
+
+    printf("DLRate[%f] ULRate[%f]\n", g_DlRate[nPhyInstanceId], g_UlRate[nPhyInstanceId]);
+
+    nVal = (g_NumSlotTDDLoop[nPhyInstanceId] < 10) ? g_NumSlotTDDLoop[nPhyInstanceId] : 10;
+
+    printf("SlotPattern:\n");
+    printf("Slot:   ");
+    for (nSlotNum = 0; nSlotNum < nVal; nSlotNum++)
+    {
+        printf("%d    ", nSlotNum);
+    }
+    printf("\n");
+
+    printf("  %3d   ", 0);
+    for (nSlotNum = 0, i = 0; nSlotNum < g_NumSlotTDDLoop[nPhyInstanceId]; nSlotNum++)
+    {
+        printf("%s   ", sSlotPattern[g_SlotType[nPhyInstanceId][nSlotNum]]);
+        i++;
+        if ((i == 10) && ((nSlotNum+1) < g_NumSlotTDDLoop[nPhyInstanceId]))
+        {
+            printf("\n");
+            printf("  %3d   ", nSlotNum);
+            i = 0;
+        }
+    }
+    printf("\n\n");
+
+    return 0;
+}
+
+int32_t app_xran_get_slot_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nType)
+{
+    int32_t nSfIdxMod, nSfType, ret = 0;
+
+    nSfIdxMod = app_xran_slot_limit(nSlotdx) % ((g_NumSlotTDDLoop[nCellIdx] > 0) ? g_NumSlotTDDLoop[nCellIdx]: 1);
+    nSfType = g_SlotType[nCellIdx][nSfIdxMod];
+
+    if (nSfType == nType)
+    {
+        ret = 1;
+    }
+    else if (nSfType == XRAN_SLOT_TYPE_SP)
+    {
+        if ((nType == XRAN_SLOT_TYPE_DL) && g_NumDLSymSp[nCellIdx][nSfIdxMod])
+        {
+            ret = 1;
+        }
+
+        if ((nType == XRAN_SLOT_TYPE_UL) && g_NumULSymSp[nCellIdx][nSfIdxMod])
+        {
+            ret = 1;
+        }
+    }
+    else if (nSfType == XRAN_SLOT_TYPE_FDD)
+    {
+        ret = 1;
+    }
+
+    return ret;
+}
+
+
+
+void sys_save_buf_to_file(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
+{
+    if (size)
+    {
+        if (filename && bufname)
+        {
+            FILE           *file;
+            printf("Storing %s to file %s: ", bufname, filename);
+            file = fopen(filename, "wb");
+            if (file == NULL)
+            {
+                printf("can't open file %s!!!", filename);
+            }
+            else
+            {
+                uint32_t             num;
+                num = fwrite(pBuffer, buffers_num, size, file);
+                fflush(file);
+                fclose(file);
+                printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, size, num);
+            }
+            printf(" \n");
+        }
+        else
+        {
+            printf(" the file name, buffer name are not set!!!");
+        }
+    }
+    else
+    {
+        printf(" the %s is free: size = %d bytes!!!", bufname, size);
+    }
+}
+
+int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
+{
+    unsigned int  file_size = 0;
+    int  num= 0;
+
+    if (size)
+    {
+        if (filename && bufname)
+        {
+            FILE           *file;
+            printf("Loading file %s to  %s: ", filename, bufname);
+            file = fopen(filename, "rb");
+
+
+            if (file == NULL)
+            {
+                printf("can't open file %s!!!", filename);
+                exit(-1);
+            }
+            else
+            {
+                fseek(file, 0, SEEK_END);
+                file_size = ftell(file);
+                fseek(file, 0, SEEK_SET);
+
+                if ((file_size > size) || (file_size == 0))
+                    file_size = size;
+
+                printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
+
+                num = fread(pBuffer, buffers_num, size, file);
+                fflush(file);
+                fclose(file);
+                printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
+            }
+            printf(" \n");
+
+        }
+        else
+        {
+            printf(" the file name, buffer name are not set!!!");
+        }
+    }
+    else
+    {
+        printf(" the %s is free: size = %d bytes!!!", bufname, size);
+    }
+    return num;
+}
+
+
+void sys_save_buf_to_file_txt(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
+{
+    unsigned int i;
+    int ret = 0;
+    if (pBuffer == NULL)
+        return;
+
+    if (size)
+    {
+        if (filename && bufname)
+        {
+            FILE           *file;
+            printf("Storing %s to file %s: ", bufname, filename);
+            file = fopen(filename, "w");
+            if (file == NULL)
+            {
+                printf("can't open file %s!!!", filename);
+                exit(-1);
+            }
+            else
+            {
+                uint32_t num = 0;
+
+                signed short *ptr = (signed short*)pBuffer;
+                for (i = 0; i < (size/((unsigned int)sizeof(signed short) /** 2 * 2 * 2*/)); i = i + 2)
+                {
+#ifndef CSCOPE_DEBUG
+                    ret = fprintf(file,"%d %d\n", ptr[i], ptr[i + 1]);
+#else
+                    ret = fprintf(file,"%d %d ", ptr[i], ptr[i + 1]);
+                    /*      I data => Ramp data, from 1 to 792.
+                            Q data => Contains time information of the current symbol:
+                            Bits [15:14] = Antenna-ID
+                            Bits [13:12] = \9300\94
+                            Bits [11:8]  = Subframe-ID
+                            Bits [7:4]   = Slot-ID
+                            Bits [3:0]   = Symbol-ID */
+                            fprintf(file, "0x%04x: ant %d Subframe-ID %d Slot-ID %d Symbol-ID %d\n",
+                                        ptr[i + 1], (ptr[i + 1]>>14) & 0x3,  (ptr[i + 1]>>8) & 0xF,  (ptr[i + 1]>>4) & 0xF, (ptr[i + 1]>>0) & 0xF);
+#endif
+                    if (ret < 0)
+                    {
+                        printf("fprintf %d\n", ret);
+                        fclose(file);
+                        break;
+                    }
+                    num++;
+                }
+                fflush(file);
+                fclose(file);
+                printf("from addr (0x%lx) size (%d) IQ num (%d)", (uint64_t)pBuffer, size, num);
+            }
+            printf(" \n");
+        }
+        else
+        {
+            printf(" the file name, buffer name are not set!!!");
+        }
+    }
+    else
+    {
+        printf(" the %s is free: size = %d bytes!!!", bufname, size);
+    }
+}
+